Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.21 KB | None | 0 0
  1. let st = {};
  2. let n = {};
  3. //-----------------------------------------
  4. //-----------------------------------------
  5. function* new_node() {
  6. let r = yield* st.get_max_node_id()
  7. let id = r.id
  8. var new_id = id + 1
  9. yield* st.insert_node(new_id, id, n.NEWNODE)
  10. return new_id
  11. }
  12. //-----------------------------------------
  13. function* new_name(name) {
  14. var id = yield* new_node()
  15. yield* st.insert_dsc(id, name)
  16. n[name] = id
  17. return id
  18. }
  19. //-----------------------------------------
  20. let initDb = (function() {
  21. let Promise = require("bluebird");
  22. let db = require('sqlite');
  23. //-----------------------------------------
  24. function* create_sts() {
  25. let m = {
  26. get_max_node_id: 'select max(id) id from node',
  27. get_val: 'select v from val where id=? and c=?',
  28. insert_node: 'insert into node(id,a,b) values(?,?,?)',
  29. insert_val: 'insert into val(id,c,v) values(?,?,?)',
  30. insert_dsc: 'insert into dsc(id,name) values(?,?)',
  31. all_dsc: 'select * from dsc',
  32. all_node: 'select * from node',
  33. get_node_a_b: 'select id from node where a=? and b=?',
  34. get_node_id: 'select * from node where id=?',
  35. }
  36.  
  37. function fn_get(a) {
  38. return function*() {
  39. return (yield a.all.apply(a, arguments))[0]
  40. }
  41. }
  42.  
  43. function fn_all(a) {
  44. return function*() {
  45. return (yield a.all.apply(a, arguments))
  46. }
  47. }
  48.  
  49. function fn_run(a) {
  50. return function*() {
  51. return (yield a.run.apply(a, arguments))
  52. }
  53. }
  54. for (var i in m) {
  55. var stm = yield db.prepare(m[i]);
  56. var r = i.match(/^([^_]+)_/)
  57. var p = r ? r[1] : '';
  58. switch (p) {
  59. case 'get':
  60. st[i] = fn_get(stm);
  61. break;
  62. case 'all':
  63. st[i] = fn_all(stm);
  64. break;
  65. default:
  66. st[i] = fn_run(stm);
  67. break;
  68. }
  69. }
  70. st.commit = function*() {
  71. yield db.exec('commit');
  72. yield db.exec('begin');
  73. }
  74. st.rollback = function*() {
  75. yield db.exec('rollback');
  76. yield db.exec('begin');
  77. }
  78. }
  79. //-----------------------------------------
  80. function* get_named_nodes() {
  81. let m = yield* st.all_dsc();
  82. m.map((v) => {
  83. n[v.name] = v.id;
  84. });
  85. if (m.length < 3) {
  86. //-------------------------
  87. yield* new_name('BYTE0')
  88. for (var i = 1; i < 0xFF; i++) {
  89. yield* new_node()
  90. }
  91. yield* new_name('BYTEFF')
  92. //-------------------------
  93. let s = 'NEXT,PROTO,IN,OUT,LIST,CREATE,BEGIN,END,ADD,CURRENT,VAL'.split(',');
  94. for (var i in s) {
  95. yield* new_name(s[i])
  96. }
  97. }
  98. }
  99. //-----------------------------------------
  100. return function*() {
  101. yield db.open('./a.sqlite3', {
  102. Promise
  103. });
  104. yield db.run('PRAGMA foreign_keys = ON')
  105. yield db.migrate({
  106. force: 'last'
  107. });
  108. yield db.run('begin')
  109. yield* create_sts();
  110. yield* get_named_nodes();
  111. }
  112. })();
  113. //-----------------------------------------
  114. function* link1(a, b) {
  115. var r = yield* st.get_node_a_b(a, b)
  116. if (r) return r.id
  117. r = yield* st.get_max_node_id()
  118. var new_id = r.id + 1
  119. yield* st.insert_node(new_id, a, b)
  120. return new_id
  121. }
  122. //-----------------------------------------
  123. function* link(first, ...ns) {
  124. var t = first;
  125. for (var i = 0, l = ns.length; i < l; i++) {
  126. t = yield* link1(t, ns[i]);
  127. }
  128. return t;
  129. }
  130. //-----------------------------------------
  131. function* new_child_ctx(c) {
  132. var id = new_node();
  133. set(id, n.PROTO, id, c)
  134. }
  135. //-----------------------------------------
  136. function* set1(c, v, n) {
  137. yield* st.insert_val(n, c, v)
  138. }
  139. //-----------------------------------------
  140. function* set(c, v, ...ns) {
  141. yield* set1(c, v, yield* link(...ns));
  142. }
  143. //-----------------------------------------
  144. function* get_parent_ctx(c) {
  145. var t = yield* link1(c, n.PROTO)
  146. var r = yield* st.get_val(t, c)
  147. if (r) return r.v
  148. return n.NIL
  149. }
  150. //-----------------------------------------
  151. function* get1(c, n) {
  152. var r = yield* st.get_val(n, c)
  153. if (r) return r.v
  154. if (c === n.NIL) return n.NIL
  155. return yield* get1(n, yield* get_parent_ctx(c));
  156. }
  157. //-----------------------------------------
  158. function* get(c, ...ns) {
  159. return yield* get1(c, yield* link(...ns));
  160. }
  161. //-----------------------------------------
  162. function* from_buffer(buf) {
  163. if (!(buf && buf.length)) return NIL;
  164. var l = buf.length;
  165. if (l == 1) return n.BYTE0 + buf.readUInt8(0);
  166. var s = (l >> 1) + (l & 1);
  167. return yield* link1(yield* from_buffer(buf.slice(0, s)), yield* from_buffer(buf.slice(s)));
  168. }
  169. //-------------------------------
  170. function* to_buffer(node) {
  171. if (node == n.NIL) throw new Error('bad node');
  172. if (node <= n.BYTEFF && node >= n.BYTE0) {
  173. var b = Buffer.alloc(1);
  174. b.writeUInt8(node - n.BYTE0, 0);
  175. return b;
  176. }
  177. var r = yield* st.get_node_id(node)
  178. return Buffer.concat([yield* to_buffer(r.a), yield* to_buffer(r.b)]);
  179. }
  180. //-----------------------------------------
  181. function* from_str(s) {
  182. var b = Buffer.from(s);
  183. return yield* from_buffer(b);
  184. }
  185. //-----------------------------------------
  186. function* to_str(n) {
  187. return (yield* to_buffer(n)).toString();
  188. }
  189. //-----------------------------------------
  190. function* main() {
  191. yield* initDb();
  192. st.commit();
  193. console.time('start');
  194. let r = yield* from_str('testzzzaa')
  195. console.log(r);
  196. let t = yield* to_str(r)
  197. console.log(t);
  198. // var t = yield* new_node();
  199. // for (var i = 0; i < 200; i++) {
  200. // t = yield* link(t, n.NEXT);
  201. // }
  202. console.timeEnd('start')
  203. // yield* st_insert_node.run(1, 1, 1);
  204. // yield* st_insert_node.run(2, 1, 2);
  205. //var r = yield* st.all_node()
  206. //console.log(r);
  207. yield* st.commit()
  208. }
  209. //-----------------------------------------
  210. require('co')(main).catch(function(err) {
  211. console.error(err);
  212. throw err;
  213. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement