サブプロジェクトAI004
Revisión | 9e3fa0bd270e6b82544df3e38d7d360f8635ed2c (tree) |
---|---|
Tiempo | 2014-04-28 20:50:51 |
Autor | hikarupsp <hikarupsp@user...> |
Commiter | hikarupsp |
ノードの同期はだいたいできた
@@ -11,7 +11,7 @@ function MemoryDB(syncPHPURL){ | ||
11 | 11 | this.syncPHPURL = syncPHPURL; |
12 | 12 | this.isEnabledNetDB = true; |
13 | 13 | // |
14 | - this.callback_addNode = null; // function(nodeinstance){}; | |
14 | + this.callback_refreshedNode = null; // function(nodeinstance){}; | |
15 | 15 | } |
16 | 16 | MemoryDB.prototype = { |
17 | 17 | UUID_Null: "00000000-0000-0000-0000-000000000000", |
@@ -46,7 +46,6 @@ MemoryDB.prototype = { | ||
46 | 46 | rq.setRequestHeader('Pragma', 'no-cache'); // HTTP/1.0 における汎用のヘッダフィールド |
47 | 47 | rq.setRequestHeader('Cache-Control', 'no-cache'); // HTTP/1.1 におけるキャッシュ制御のヘッダフィールド |
48 | 48 | rq.setRequestHeader('If-Modified-Since', 'Thu, 01 Jun 1970 00:00:00 GMT'); |
49 | - | |
50 | 49 | }, |
51 | 50 | sendRequestSync: function(mode, url, data){ |
52 | 51 | //同期モード |
@@ -74,13 +73,15 @@ MemoryDB.prototype = { | ||
74 | 73 | }, |
75 | 74 | syncDB: function(){ |
76 | 75 | // MySQLと同期 |
77 | - var r, a, d, t; | |
76 | + // 定期的に呼び出されることを想定 | |
77 | + var r, a, d; | |
78 | 78 | if(this.root.length == 0){ |
79 | 79 | // 初回同期時は全て取得 |
80 | 80 | r = this.sendRequestSync("GET", this.syncPHPURL + "?action=getallnode", null); |
81 | 81 | } else{ |
82 | 82 | // 差分のみを取得 |
83 | - | |
83 | + d = this.getNodeFromUUID(this.UUID_Node_MemoryDBNetworkTimestamp).identifier; | |
84 | + r = this.sendRequestSync("GET", this.syncPHPURL + "?action=getnodemod&t=" + d, null); | |
84 | 85 | } |
85 | 86 | a = r.split("\n"); |
86 | 87 | for(var i = 0, iLen = a.length; i < iLen; i++){ |
@@ -93,56 +94,24 @@ MemoryDB.prototype = { | ||
93 | 94 | if(d === undefined){ |
94 | 95 | continue; |
95 | 96 | } |
96 | - t = new MemoryDBNodeTag(d[0], d[1], d[2]); | |
97 | - if(t){ | |
98 | - this.root.push(t); | |
99 | - this.nodeList.push(t); | |
100 | - } | |
97 | + this.refreshNodeInternal(d[2], d[1], d[0]); | |
101 | 98 | } |
102 | 99 | console.log(this.root); |
103 | 100 | }, |
104 | - editNode: function(ident, tid, nid, disableSync){ | |
105 | - // Nodeを追加し、データベースにも反映し、可能ならばネットワークにも反映させる | |
101 | + refreshNode: function(ident, tid, nid){ | |
102 | + // 該当タグのデータを書き換え、もしくは新規作成する。 | |
103 | + // 可能であればネットワークに反映する | |
106 | 104 | // nid(nodeid)は省略可能で、省略時は新たなUUIDが自動的に付与される |
107 | 105 | // tid(typeid)も省略可能で、省略時はNullUUIDが付与される。 |
106 | + // identはnullもしくは空文字でもかまわない。 | |
108 | 107 | // 戻り値はMemoryDBNodeTagインスタンス |
109 | - // すでに同じnodeidのNodeが存在している場合はundefinedを返しデータベースへの変更は行われない。 | |
110 | - var t, s, r; | |
111 | - if(!ident){ | |
112 | - return undefined; | |
113 | - } | |
114 | - if(!tid){ | |
115 | - tid = this.UUID_Null; | |
116 | - } | |
117 | - if(!nid){ | |
118 | - nid = this.createUUID(); | |
119 | - } | |
120 | - // 存在確認 | |
121 | - t = this.getNodeFromUUID(nid); | |
122 | - if(t){ | |
123 | - return undefined; | |
124 | - } | |
125 | - t = new MemoryDBNodeTag(nid, tid, ident); | |
126 | - | |
127 | - if(this.isEnabledNetDB){ | |
128 | - s = this.syncPHPURL + "?action=addnode"; | |
129 | - s += "&nid=" + encodeURIComponent(nid); | |
130 | - s += "&tid=" + encodeURIComponent(tid); | |
131 | - s += "&ident=" + encodeURIComponent(ident); | |
132 | - r = this.sendRequestSync("GET", s, null); | |
133 | - console.log(r); | |
134 | - } | |
108 | + // エラー発生時はundefinedを返す。 | |
109 | + this.refreshNodeInternal(ident, tid, nid, true); | |
135 | 110 | }, |
136 | - addNode: function(ident, tid, nid){ | |
137 | - // Nodeを追加し、データベースにも反映し、可能ならばネットワークにも反映させる | |
138 | - // nid(nodeid)は省略可能で、省略時は新たなUUIDが自動的に付与される | |
139 | - // tid(typeid)も省略可能で、省略時はNullUUIDが付与される。 | |
140 | - // 戻り値はMemoryDBNodeTagインスタンス | |
141 | - // すでに同じnodeidのNodeが存在している場合はundefinedを返しデータベースへの変更は行われない。 | |
111 | + refreshNodeInternal: function(ident, tid, nid, enableSync){ | |
112 | + // 基本的にローカルデータのみ変更 | |
113 | + // enableSync == trueでネットワーク同期する | |
142 | 114 | var t, s, r; |
143 | - if(!ident){ | |
144 | - return undefined; | |
145 | - } | |
146 | 115 | if(!tid){ |
147 | 116 | tid = this.UUID_Null; |
148 | 117 | } |
@@ -152,17 +121,24 @@ MemoryDB.prototype = { | ||
152 | 121 | // 存在確認 |
153 | 122 | t = this.getNodeFromUUID(nid); |
154 | 123 | if(t){ |
124 | + // 変更 | |
155 | 125 | return undefined; |
126 | + } else{ | |
127 | + // 新規作成 | |
128 | + t = new MemoryDBNodeTag(nid, tid, ident); | |
129 | + this.root.push(t); | |
130 | + this.nodeList.push(t); | |
131 | + if(enableSync && this.isEnabledNetDB){ | |
132 | + s = this.syncPHPURL + "?action=addnode"; | |
133 | + s += "&nid=" + encodeURIComponent(nid); | |
134 | + s += "&tid=" + encodeURIComponent(tid); | |
135 | + s += "&ident=" + encodeURIComponent(ident); | |
136 | + r = this.sendRequestSync("GET", s, null); | |
137 | + console.log(r); | |
138 | + } | |
156 | 139 | } |
157 | - t = new MemoryDBNodeTag(nid, tid, ident); | |
158 | - | |
159 | - if(this.isEnabledNetDB){ | |
160 | - s = this.syncPHPURL + "?action=addnode"; | |
161 | - s += "&nid=" + encodeURIComponent(nid); | |
162 | - s += "&tid=" + encodeURIComponent(tid); | |
163 | - s += "&ident=" + encodeURIComponent(ident); | |
164 | - r = this.sendRequestSync("GET", s, null); | |
165 | - console.log(r); | |
140 | + if(this.callback_refreshedNode){ | |
141 | + this.callback_refreshedNode(t); | |
166 | 142 | } |
167 | 143 | }, |
168 | 144 | createUUID: function(){ |
@@ -182,7 +158,6 @@ function MemoryDBNodeTag(nodeid, typeid, identifier){ | ||
182 | 158 | this.typeid = typeid; |
183 | 159 | this.identifier = identifier; |
184 | 160 | // |
185 | - | |
186 | 161 | } |
187 | 162 | MemoryDBNodeTag.prototype = { |
188 | 163 |
@@ -21,7 +21,7 @@ define("QUERY_CREATE_TABLE_Node", " | ||
21 | 21 | create table Node ( |
22 | 22 | nodeid binary(16) primary key, |
23 | 23 | typeid binary(16) not null, |
24 | - identifier text character set utf8 not null, | |
24 | + identifier text character set utf8, | |
25 | 25 | modtimestamp bigint |
26 | 26 | ) |
27 | 27 | "); |
@@ -22,11 +22,8 @@ var memdb; | ||
22 | 22 | |
23 | 23 | onload = function() { |
24 | 24 | memdb = new MemoryDB("./../memdb/memdb.php"); |
25 | - memdb.syncDB(); | |
26 | - | |
27 | - var c = document.getElementById("mainCanvas"); | |
28 | - mgmain = new MGCanvas(c); | |
29 | - mgmain.loadGraphFromMemoryDB(memdb); | |
25 | + mgmain = new MGCanvas(document.getElementById("mainCanvas")); | |
26 | + mgmain.setSourceMemoryDB(memdb); | |
30 | 27 | } |
31 | 28 | </script> |
32 | 29 | </head> |
@@ -46,7 +43,7 @@ onload = function() { | ||
46 | 43 | identifier:<input id="identBox" type="text"></input> |
47 | 44 | <br /> |
48 | 45 | <button onclick="mgmain.setIdentifierForSelectedNode(getElementById('identBox').value);">setNodeIdent</button> |
49 | -<button onclick="memdb.addNode(getElementById('identBox').value);">addNode</button> | |
46 | +<button onclick="memdb.refreshNode(getElementById('identBox').value);">addNode</button> | |
50 | 47 | |
51 | 48 | </body> |
52 | 49 | </html> |
\ No newline at end of file |
@@ -12,6 +12,9 @@ function MGCanvas(canvasDOMObj){ | ||
12 | 12 | this.edgeList = new Array(); |
13 | 13 | this.selectedNode = null; |
14 | 14 | this.selectedEdge = null; |
15 | + this.srcMemoryDB = null; | |
16 | + this.srcMemoryDBSyncPerTick = 60; | |
17 | + this.srcMemoryDBSyncCount = this.srcMemoryDBSyncPerTick; | |
15 | 18 | |
16 | 19 | var that = this; |
17 | 20 | window.addEventListener('keydown', function(event){ |
@@ -79,22 +82,13 @@ MGCanvas.prototype = { | ||
79 | 82 | this.edgeList.push(new MGEdge(this, p[i][2], n(p[i][0]), n(p[i][1]))); |
80 | 83 | } |
81 | 84 | }, |
82 | - loadGraphFromMemoryDB: function(mdb){ | |
83 | - var a, l, t, u, m, e, f; | |
84 | - a = mdb.nodeList; | |
85 | - l = a.length; | |
86 | - //m = 12 * l; | |
87 | - t = new MGNode(this, "Node"); | |
88 | - this.nodeList.push(t); | |
89 | - f = function(){}; | |
90 | - for(var i = 0; i < l; i++){ | |
91 | - u = new MGNode(this, a[i].identifier); | |
92 | - this.nodeList.push(u); | |
93 | - //e = new MGEdge(this, null, t, u); | |
94 | - //this.edgeList.push(e); | |
95 | - //t = u; | |
96 | - //e.freeLength = m; | |
97 | - //e.draw = f; | |
85 | + setSourceMemoryDB: function(mdb){ | |
86 | + var that = this; | |
87 | + this.srcMemoryDB = mdb; | |
88 | + mdb.callback_refreshedNode = function(t){ | |
89 | + var n; | |
90 | + n = new MGNode(that, t.identifier); | |
91 | + that.nodeList.push(n); | |
98 | 92 | } |
99 | 93 | }, |
100 | 94 | bringToCenter: function(){ |
@@ -158,11 +152,19 @@ MGCanvas.prototype = { | ||
158 | 152 | var nTemp; |
159 | 153 | |
160 | 154 | this.tickCount++; |
155 | + this.srcMemoryDBSyncCount++; | |
161 | 156 | |
162 | 157 | // |
163 | - // AutomaticTracking | |
158 | + // Sync | |
164 | 159 | // |
160 | + if(this.srcMemoryDB && this.srcMemoryDBSyncCount > this.srcMemoryDBSyncPerTick){ | |
161 | + this.srcMemoryDB.syncDB(); | |
162 | + this.srcMemoryDBSyncCount = 0; | |
163 | + } | |
165 | 164 | |
165 | + // | |
166 | + // AutomaticTracking | |
167 | + // | |
166 | 168 | if(this.isEnabledAutomaticTracking && (this.tickCount % 30 == 0)){ |
167 | 169 | this.bringInScreen(); |
168 | 170 | } |