// TODO return promises instead of inner await import { IndexInterface, DocumentInterface } from "./type.js"; import { create_object, is_string } from "./common.js"; function async(callback, self, field, key, index_doc, index, data, on_done){ setTimeout(function(){ const res = callback(field ? field + "." + key : key, JSON.stringify(data)); // await isn't supported by ES5 if(res && res["then"]){ res["then"](function(){ self.export(callback, self, field, index_doc, index + 1, on_done); }) } else{ self.export(callback, self, field, index_doc, index + 1, on_done); } }); } /** * @this IndexInterface */ export function exportIndex(callback, self, field, index_doc, index, on_done){ let return_value = true if (typeof on_done === 'undefined') { return_value = new Promise((resolve) => { on_done = resolve }) } let key, data; switch(index || (index = 0)){ case 0: key = "reg"; // fastupdate isn't supported by export if(this.fastupdate){ data = create_object(); for(let key in this.register){ data[key] = 1; } } else{ data = this.register; } break; case 1: key = "cfg"; data = { "doc": 0, "opt": this.optimize ? 1 : 0 }; break; case 2: key = "map"; data = this.map; break; case 3: key = "ctx"; data = this.ctx; break; default: if (typeof field === 'undefined' && on_done) { on_done(); } return; } async(callback, self || this, field, key, index_doc, index, data, on_done); return return_value; } /** * @this IndexInterface */ export function importIndex(key, data){ if(!data){ return; } if(is_string(data)){ data = JSON.parse(data); } switch(key){ case "cfg": this.optimize = !!data["opt"]; break; case "reg": // fastupdate isn't supported by import this.fastupdate = false; this.register = data; break; case "map": this.map = data; break; case "ctx": this.ctx = data; break; } } /** * @this DocumentInterface */ export function exportDocument(callback, self, field, index_doc, index, on_done){ let return_value if (typeof on_done === 'undefined') { return_value = new Promise((resolve) => { on_done = resolve }) } index || (index = 0); index_doc || (index_doc = 0); if(index_doc < this.field.length){ const field = this.field[index_doc]; const idx = this.index[field]; self = this; setTimeout(function(){ if(!idx.export(callback, self, index ? field/*.replace(":", "-")*/ : "", index_doc, index++, on_done)){ index_doc++; index = 1; self.export(callback, self, field, index_doc, index, on_done); } }); } else{ let key, data; switch(index){ case 1: key = "tag"; data = this.tagindex; field = null; break; case 2: key = "store"; data = this.store; field = null; break; // case 3: // // key = "reg"; // data = this.register; // break; default: on_done(); return; } async(callback, this, field, key, index_doc, index, data, on_done); } return return_value } /** * @this DocumentInterface */ export function importDocument(key, data){ if(!data){ return; } if(is_string(data)){ data = JSON.parse(data); } switch(key){ case "tag": this.tagindex = data; break; case "reg": // fastupdate isn't supported by import this.fastupdate = false; this.register = data; for(let i = 0, index; i < this.field.length; i++){ index = this.index[this.field[i]]; index.register = data; index.fastupdate = false; } break; case "store": this.store = data; break; default: key = key.split("."); const field = key[0]; key = key[1]; if(field && key){ this.index[field].import(key, data); } } }