![]() System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, Directory : /var/www/html/keeview_app/html/ |
Upload File : |
'use strict' const flexDB = Object.freeze(function () { const dbver = 2; const utf8_supported = true; var retval = {}, core = { connector: {}, queue: [], searchMode: "auto", unfinished: [] }; core.connect = function (core) { return function (params) { params = EncodingClass.string.duplicateObject(params); FormClass.zip_call({ url: params.host + "flexdb.php", params: [ { name: "task", value: "connect" }, { name: "dbname", value: params.dbname }, { name: "tokenmode_stringvalue", value: params.token } ], func: function (params) { return function(success, content) { var accesskey, id, formatver, contentver, name, tables; var start, slen, i, n; if (success) { core.token = params.token; start = 0; slen = EncodingClass.number.fromString("i32", content, start); start += 4; accesskey = content.substr(start, slen); start += slen; tables = []; while (start < content.length) { id = EncodingClass.number.fromString("i32", content, start); start += 4; formatver = EncodingClass.number.fromString("i32", content, start); start += 4; contentver = EncodingClass.number.fromString("i32", content, start); start += 4; slen = EncodingClass.number.fromString("i32", content, start); start += 4; name = content.substr(start, slen); start += slen; tables.push({ id: id, name: name, formatver: formatver, contentver: contentver, refreshQueue: [], queryQueue: [], cachedValues: [], inited: false, loading: false, ready: false }); } core.connector[params.dbname] = { dbname: params.dbname, url: params.host + "flexdb.php", accesskey: accesskey, tables: tables, tableIndex: {}, loader: fcache.open("flexdb_" + params.dbname, params.host + "flexdb.php", function (token, accesskey) { return function (calldata) { calldata.params.push({ name: "tokenmode_stringvalue", value: token }); calldata.params.push({ name: "accesskey", value: accesskey }); } } (params.token, accesskey)) }; for (i = 0; i < tables.length; i++) { core.connector[params.dbname].tableIndex[tables[i].name] = i; } core.connector[params.dbname].loader.load("types", "block", function (host, dbname) { return function (retval) { host.typesConnector = retval; host.typeContents = []; var types = {}; var tcount = 0; var tlength = 0; var t; retval.search(function (record) { tcount++; if (utf8_supported) { t = EncodingClass.utf8.encode(record.svalue); } else { t = record.svalue; } tlength += t.length; return null; }); types.data = new Uint8Array(tlength); types.desc = new Int32Array(tcount * 3); tcount = tlength = 0; retval.search(function (record) { types.desc[tcount * 3] = record.id; types.desc[tcount * 3 + 1] = tlength; if (utf8_supported) { t = EncodingClass.utf8.encode(record.svalue); } else { t = record.svalue; } types.desc[tcount * 3 + 2] = t.length; EncodingClass.number.writeArray("s", t, types.data, tlength); tcount++; tlength += t.length; return null; }); host.types = types; core.connector[params.dbname].connector = core.getConnector(params.dbname); core.unfinished.push(params.dbname); Thread.setTimeout({ func: params.func, args: [true, core.connector[params.dbname].connector] }); } } (core.connector[params.dbname], params.dbname), {fieldList: ["id", "svalue", "uts"]}); } else { params.func(false, { type: "denied", message: content }); } } } (params) }); } } (core); core.getConnector = function (core) { return function (dbname) { var retval = {}; retval.read = function (tablename, id, callbackfunc) { var index = core.connector[dbname].tableIndex[tablename]; if (index === undefined) { Thread.setTimeout({ func: callbackfunc, args: [false, "invalid table"] }) return; } if (core.connector[dbname].tables[index].inited === false) { if (core.connector[dbname].tables[index].loading === false) { core.init(dbname, index, function (me) { return function () { me.read(tablename, id, callbackfunc); } } (retval)); } else { Thread.wait( function () { return core.connector[dbname].tables[index].inited === true; }, function (me) { return function () { me.read(tablename, id, callbackfunc); } } (retval) ); } return; } core.loadRecordsById(dbname, index, id, callbackfunc); } retval.search = function (tablename, pattern, callbackfunc) { var index = core.connector[dbname].tableIndex[tablename]; if ((index === undefined) || (pattern === undefined)) { Thread.setTimeout({ func: callbackfunc, args: [[]] }) return; } if (core.connector[dbname].tables[index].inited === false) { if (core.connector[dbname].tables[index].loading === false) { core.init(dbname, index, function (me) { return function () { me.search(tablename, pattern, callbackfunc); } } (retval)); } else { Thread.wait( function () { return core.connector[dbname].tables[index].inited === true; }, function (me) { return function () { me.search(tablename, pattern, callbackfunc); } } (retval) ); } return; } core.localSearch(dbname, index, pattern, callbackfunc); } retval.refresh = function (tablename, callbackfunc) { var index = core.connector[dbname].tableIndex[tablename]; if (callbackfunc === undefined) callbackfunc = function () {}; if (index === undefined) { Thread.setTimeout({ func: callbackfunc, args: [false, "invalid table"] }) return; } if (core.connector[dbname].tables[index].inited === false) { if (core.connector[dbname].tables[index].loading === false) { core.init(dbname, index, function () { Thread.setTimeout({func: callbackfunc}); }); } else { Thread.wait( function () { return core.connector[dbname].tables[index].inited === true; }, function () { Thread.setTimeout({func: callbackfunc}); } ); } return; } if (core.connector[dbname].tables[index].loading === false) { core.load(dbname, index, function () { Thread.setTimeout({func: callbackfunc}); }); return; } else { Thread.wait( function () { return core.connector[dbname].tables[index].loading === false; }, function () { Thread.setTimeout({func: callbackfunc}); } ); } } retval.setSearchMode = function (mode) { } return retval; } } (core); core.thread = function (core) { return function () { var dbname, tableindex = -1; var i; if (core.unfinished.length > 0) { dbname = core.unfinished.shift(); for (i = 0; i < core.connector[dbname].tables.length; i++) { if ((!core.connector[dbname].tables[i].inited) && (!core.connector[dbname].tables[i].loading)) { tableindex = i; break; } } if (tableindex == -1) { Thread.setTimeout({ func: core.thread, time: 10 }); return; } core.init(dbname, tableindex, function () { core.unfinished.push(dbname); Thread.setTimeout({ func: core.thread, time: 10 }); }); return; } Thread.setTimeout({ func: core.thread, time: 10 }); } } (core); Thread.setTimeout({func: core.thread}); core.load = function (core) { return function (dbname, index, callbackfunc) { core.connector[dbname].tables[index].loading = true; Promise.all([ core.connector[dbname].tables[index].recordsConnector.promiseLoad(), core.connector[dbname].tables[index].valuesConnector.promiseLoad(), core.connector[dbname].tables[index].refsConnector.promiseLoad() ]).then(function () { Thread.setTimeout({ func: core.finalize, args: [dbname, index, callbackfunc] }); }); } } (core); core.init = function (core) { return function (dbname, index, callbackfunc) { core.connector[dbname].tables[index].loading = true; Promise.all([ core.connector[dbname].loader.promiseLoad(core.connector[dbname].tables[index].name + "_records", "block", {fieldList: ["id", "valueid", "uts"]}), core.connector[dbname].loader.promiseLoad(core.connector[dbname].tables[index].name + "_values", "block", {fieldList: ["id", "content", "numbercontent", "typeid", "uts"]}), core.connector[dbname].loader.promiseLoad(core.connector[dbname].tables[index].name + "_refs", "block") ]).then(function (values) { core.connector[dbname].tables[index].recordsConnector = values[0]; core.connector[dbname].tables[index].valuesConnector = values[1]; core.connector[dbname].tables[index].refsConnector = values[2]; Thread.setTimeout({ func: core.finalize, args: [dbname, index, callbackfunc] }); }); } } (core); core.finalize = function (core) { return function (dbname, index, callbackfunc) { var i, j, t; var iarray = []; var nums = []; var s = []; var contents = []; var slen = 0; var id; var idlist, ridlist, xidlist; var idIndex = 0, ilen; var imax = 10; Promise.all([ new Promise(function(resolve, reject) { core.connector[dbname].tables[index].valuesConnector.getIDList(function (r) { idlist = r; resolve(); }); }), new Promise(function(resolve, reject) { core.connector[dbname].tables[index].refsConnector.getIDList(function (r) { ridlist = r; resolve(); }); }), new Promise(function(resolve, reject) { core.connector[dbname].tables[index].recordsConnector.getIDList(function (r) { xidlist = r; resolve(); }); }), ]).then(function () { Thread.setTimeout({func: step1}); }); var failedstep = function () { Promise.all([ core.connector[dbname].tables[index].recordsConnector.promiseReset(), core.connector[dbname].tables[index].valuesConnector.promiseReset(), core.connector[dbname].tables[index].refsConnector.promiseReset() ]).then(function () { Thread.setTimeout({ func: core.finalize, args: [dbname, index, callbackfunc] }); }); /* FormClass.api_call({ url: core.connector[dbname].url, params: [ { name: "task", value: "scan" }, { name: "accesskey", value: core.connector[dbname].accesskey }, { name: "name", value: core.connector[dbname].tables[index].name } ], func: function (success, message) { if (success) { if (message == "ok") { Promise.all([ core.connector[dbname].tables[index].recordsConnector.promiseReset(), core.connector[dbname].tables[index].valuesConnector.promiseReset(), core.connector[dbname].tables[index].refsConnector.promiseReset() ]).then(function () { Thread.setTimeout({ func: core.finalize, args: [dbname, index, callbackfunc] }); }); } else { throw new Error(message); } } else { Thread.setTimeout({ func: failedstep, time: 5000 }); } } }); */ } var step1 = function () { var content, record, t; Thread.exec( function () { if (idIndex >= idlist.length) return true; record = core.connector[dbname].tables[index].valuesConnector.read(idlist[idIndex++]); //"string", "number", "realtime", "date", "datetime", "boolean", "system" switch (record.typeid) { case -1: // string content = slen; if (utf8_supported) { t = EncodingClass.utf8.encode(record.content); } else { t = record.content; } s.push(t); slen += t.length + 4; break; case -4: // date case -5: // datetime case -7: // system content = slen; s.push(record.content); slen += record.content.length + 4; break; case -2: // number case -3: // realtime content = nums.length; nums.push(record.numbercontent); break; case -6: // boolean content = record.numbercontent; break; case 0: // array default: // struct content = 0; /* t = record.content.split("_"); content = iarray.length; iarray.push(t.length); for (i = 0; i < t.length; i++) { iarray.push(parseInt(t[i])); } */ break; } contents[record.id] = [content, record.typeid, [], []]; return false; }, step2 ); } var step2 = function () { var failed = false; idIndex = 0; Thread.exec( function () { var record; if (idIndex >= ridlist.length) return true; record = core.connector[dbname].tables[index].refsConnector.read(ridlist[idIndex++]); if (contents[record.valueid] === undefined) { failed = true; return true; } contents[record.valueid][2].push(iarray.length); iarray.push(record.parent_type_id); iarray.push(record.index); iarray.push(record.nextid); return false; }, function () { if (failed) { Thread.setTimeout({ func: failedstep }); } else { ridlist = null; Thread.setTimeout({ func: step3 }); } } ); } var step3 = function () { var failed = false; idIndex = 0; Thread.exec( function () { var record; if (idIndex >= xidlist.length) return true; record = core.connector[dbname].tables[index].recordsConnector.read(xidlist[idIndex++]); if (record.valueid > 0) { if (contents[record.valueid] === undefined) { failed = true; return true; } contents[record.valueid][3].push(record.id); } return false; }, function () { if (failed) { Thread.setTimeout({ func: failedstep }); } else { xidlist = null; Thread.setTimeout({func: step4}); } } ); } var step4 = function () { var failed = false; idIndex = 0; Thread.exec( function () { var id, j, t; if (idIndex >= idlist.length) return true; id = idlist[idIndex++]; if (contents[id] === undefined) { failed = true; return true; } if (contents[id][2].length > 0) { t = iarray.length; iarray.push(contents[id][2].length); for (j = 0; j < contents[id][2].length; j++) { iarray.push(contents[id][2][j]); } contents[id][2] = t; } else { contents[id][2] = -1; } if (contents[id][3].length > 0) { t = iarray.length; iarray.push(contents[id][3].length); for (j = 0; j < contents[id][3].length; j++) { iarray.push(contents[id][3][j]); } contents[id][3] = t; } else { contents[id][3] = -1; } return false; }, function () { if (failed) { Thread.setTimeout({ func: failedstep }); } else { Thread.setTimeout({ func: step5 }); } } ); } var step5 = function () { core.connector[dbname].tables[index].intValues = new Int32Array(iarray.length); core.connector[dbname].tables[index].doubleValues = new Float64Array(nums.length); Promise.all([ EncodingClass.number.promiseCopyArray(core.connector[dbname].tables[index].intValues, iarray, 0, 0, iarray.length), EncodingClass.number.promiseCopyArray(core.connector[dbname].tables[index].doubleValues, nums, 0, 0, nums.length) ]).then(function () { iarray = null; nums = null; Thread.setTimeout({func: step6}); }); } var step6 = function () { idIndex = 0; core.connector[dbname].tables[index].text = new Uint8Array(slen); slen = 0; Thread.exec( function () { if (idIndex >= s.length) return true; EncodingClass.number.writeArray("i32", s[idIndex].length, core.connector[dbname].tables[index].text, slen); slen += 4; EncodingClass.number.writeArray("s", s[idIndex], core.connector[dbname].tables[index].text, slen); slen += s[idIndex++].length; return false; }, function () { s = null; Thread.setTimeout({func: step7}); } ); } var step7 = function () { var i, id, t = 0; core.connector[dbname].tables[index].contents = new Int32Array(idlist.length * 5); idIndex = 0; Thread.exec( function () { if (idIndex >= idlist.length) return true; id = idlist[idIndex]; core.connector[dbname].tables[index].contents[t++] = id; core.connector[dbname].tables[index].contents[t++] = contents[id][0]; core.connector[dbname].tables[index].contents[t++] = contents[id][1]; core.connector[dbname].tables[index].contents[t++] = contents[id][2]; core.connector[dbname].tables[index].contents[t++] = contents[id][3]; idIndex++; return false; }, function () { contents = null; core.connector[dbname].tables[index].inited = true; core.connector[dbname].tables[index].ready = true; core.connector[dbname].tables[index].loading = false; core.connector[dbname].tables[index].cachedValues = []; Thread.setTimeout({func: callbackfunc}); } ); } } } (core); core.localSearch = function (core) { return function (dbname, index, pattern, callbackfunc) { Promise.all([ EncodingClass.number.promiseDuplicateTypedArray(core.connector[dbname].types.data), EncodingClass.number.promiseDuplicateTypedArray(core.connector[dbname].types.desc), EncodingClass.number.promiseDuplicateTypedArray(core.connector[dbname].tables[index].intValues), EncodingClass.number.promiseDuplicateTypedArray(core.connector[dbname].tables[index].doubleValues), EncodingClass.number.promiseDuplicateTypedArray(core.connector[dbname].tables[index].text), EncodingClass.number.promiseDuplicateTypedArray(core.connector[dbname].tables[index].contents), ]).then(function (values) { var typesData = values[0]; var typesDesc = values[1]; var intValues = values[2]; var doubleValues = values[3]; var text = values[4]; var contents = values[5]; if ((core.debugMode === true) || false) { if (core.debugWorkerFunc === undefined) { var st = "var transferList = [];", keys; var i; keys = Object.keys(searchblobModules); for (i = 0; i < keys.length; i++) { st += "var " + keys[i] + " = " + EncodingClass.string.exportVariable(searchblobModules[keys[i]]) + ";\r\n"; } st += "var mainFunc = " + EncodingClass.string.exportVariable(searchWorkerFunc) + ";\r\n"; st += "return mainFunc(params);"; core.debugWorkerFunc = new Function ("params", st); st = null; } var retval = core.debugWorkerFunc({ typesData: typesData, typesDesc: typesDesc, intValues: intValues, doubleValues: doubleValues, text: text, debugValueID: searchblobModules.debugValueID, contents: contents, pattern: pattern }); retval = Array.from(retval); Thread.setTimeout({ func: callbackfunc, args: [retval] }); } else { core.searchWorkerThread.call({ params: { typesData: typesData, typesDesc: typesDesc, intValues: intValues, doubleValues: doubleValues, text: text, contents: contents, pattern: pattern }, transferList: [typesData.buffer, typesDesc.buffer, intValues.buffer, doubleValues.buffer, text.buffer, contents.buffer], callbackfunc: function (retval) { retval = Array.from(retval); Thread.setTimeout({ func: callbackfunc, args: [retval] }); } }); } }); } } (core); core.loadRecordsByIds = function (core) { return function (dbname, index, ids, callbackfunc) { var i, id, valueid, content, notfound = [], r = []; core.connector[dbname].tables[index].cachedValues = []; if (!EncodingClass.type.isArray(ids)) ids = [ids]; for (i = 0; i < ids.length; i++) { id = ids[i]; if (EncodingClass.type.isString(id)) { id = parseInt(id); ids[i] = id; } if (!core.connector[dbname].tables[index].recordsConnector.exists(id)) { notfound.push(id); } } if (notfound.length > 0) { Thread.setTimeout({ func: callbackfunc, args: [false, { message: "id(s) not found", content: notfound }] }); return; } for (i = 0; i < ids.length; i++) { id = ids[i]; content = core.connector[dbname].tables[index].recordsConnector.read(id); valueid = content.valueid; if (valueid == 0) { notfound.push(id); } else { r.push({ id: id, value: core.getValue(dbname, index, valueid) }); } } if (notfound.length > 0) { Thread.setTimeout({ func: callbackfunc, args: [false, { message: "id(s) not found", content: notfound }] }); return; } core.connector[dbname].tables[index].cachedValues = []; Thread.setTimeout({ func: callbackfunc, args: [true, r] }); } } (core); core.loadRecordsById = function (core) { return function (dbname, index, id, callbackfunc) { if (!EncodingClass.type.isArray(id)) { core.loadRecordsByIds(dbname, index, [id], function (success, values) { if (!success) { callbackfunc(false, values); return; } callbackfunc(true, values[0].value); }); } else { core.loadRecordsByIds(dbname, index, id, callbackfunc); } } } (core); core.getValue = function (core) { return function (dbname, index, valueid) { var content, typeid, typecontent, typeindex, value, rv; var year, month, date, hour, minutes; var mode, slen, xname, xtypeid; var i, c; if (core.connector[dbname].tables[index].cachedValues[valueid] !== undefined) return EncodingClass.string.duplicate(core.connector[dbname].tables[index].cachedValues[valueid]); content = core.connector[dbname].tables[index].valuesConnector.read(valueid); if (content === undefined) return undefined; typeid = content.typeid; switch (typeid) { case 0: value = content.content; rv = []; if (value.length > 0) { value = (value+"").split("_"); for (i = 0; i < value.length; i++) { rv.push(core.getValue(dbname, index, parseInt(value[i]))); } } return core.connector[dbname].tables[index].cachedValues[valueid] = rv; case -1: // string return core.connector[dbname].tables[index].cachedValues[valueid] = content.content; case -2: // number return core.connector[dbname].tables[index].cachedValues[valueid] = content.numbercontent; case -3: // realtime value = new Date(content.numbercontent * 1000); return core.connector[dbname].tables[index].cachedValues[valueid] = value; case -4: // date value = content.content; year = parseInt(value.substr(0, 4)); month = parseInt(value.substr(4, 2)); date = parseInt(value.substr(6, 2)); value = new Date2(); value.mode = "date"; value.setFullYear(year); value.setMonth(month - 1); value.setDate(date); return core.connector[dbname].tables[index].cachedValues[valueid] = value; case -5: // date time value = content.content; year = parseInt(value.substr(0, 4)); month = parseInt(value.substr(4, 2)); date = parseInt(value.substr(6, 2)); hour = parseInt(value.substr(8, 2)); minutes = parseInt(value.substr(10, 2)); value = new Date2(); value.mode = "datetime"; value.setFullYear(year); value.setMonth(month - 1); value.setDate(date); value.setHours(hour); value.setMinutes(minutes); return core.connector[dbname].tables[index].cachedValues[valueid] = value; case -6: // boolean value = (content.numbercontent != 0); return core.connector[dbname].tables[index].cachedValues[valueid] = value; case -7: return core.connector[dbname].tables[index].cachedValues[valueid] = null; default: if (core.connector[dbname].typeContents[typeid] !== undefined) { typecontent = core.connector[dbname].typeContents[typeid]; } else { typecontent = core.connector[dbname].typesConnector.read(typeid); if (typecontent === undefined) return undefined; rv = typecontent.svalue.split("#"); typecontent = []; while (rv.length > 0) { if (rv[0].length == 0) break; slen = parseInt(rv.shift()); xname = rv[0].substr(0, slen); rv.shift(); typecontent.push(xname); } core.connector[dbname].typeContents[typeid] = typecontent; } rv = {}; value = (content.content + "").split("_"); for (i = 0; i < value.length; i++) { rv[typecontent[i]] = core.getValue(dbname, index, parseInt(value[i])); } return core.connector[dbname].tables[index].cachedValues[valueid] = rv; } } } (core); core.loadRecordsByConditions = function (core) { return function (dbname, tablename, pattern, func, me) { switch (core.searchMode) { case "remote": core.remoteSearch(dbname, index, pattern, func); break; case "local": Thread.setTimeout({ func: core.localSearch, args: [dbname, index, pattern, func] }); break; case "auto": default: Thread.setTimeout({ func: core.localSearch, args: [dbname, index, pattern, func] }); break; } } } (core); var searchblobModules = { types: {}, typepath: [], searchResult: [], searchQueue: [], mark: [], debugValueID: 0, privtype: ["string", "number", "realtime", "date", "datetime", "boolean", "system"], utf8_supported: utf8_supported, nodecount: 0, ncount: 0 }; searchblobModules.naturalSort = function (a, b) { var re = /(^([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi, sre = /(^[ ]*|[ ]*$)/g, dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/, hre = /^0x[0-9a-f]+$/i, ore = /^0/, i = function(s) { return naturalSort.insensitive && ('' + s).toLowerCase() || '' + s; }, // convert all to strings strip whitespace x = i(a).replace(sre, '') || '', y = i(b).replace(sre, '') || '', // chunk/tokenize xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'), yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'), // numeric, hex or date detection xD = parseInt(x.match(hre), 16) || (xN.length !== 1 && x.match(dre) && Date.parse(x)), yD = parseInt(y.match(hre), 16) || xD && y.match(dre) && Date.parse(y) || null, oFxNcL, oFyNcL; // first try and sort Hex codes or Dates if (yD) { if ( xD < yD ) { return -1; } else if ( xD > yD ) { return 1; } } // natural sorting through split numeric strings and default strings for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) { // find floats not starting with '0', string or 0 if not defined (Clint Priest) oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0; oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0; // handle numeric vs string comparison - number < string - (Kyle Adams) if (isNaN(oFxNcL) !== isNaN(oFyNcL)) { return (isNaN(oFxNcL)) ? 1 : -1; } // rely on string comparison if different types - i.e. '02' < 2 != '02' < '2' else if (typeof oFxNcL !== typeof oFyNcL) { oFxNcL += ''; oFyNcL += ''; } if (oFxNcL < oFyNcL) { return -1; } if (oFxNcL > oFyNcL) { return 1; } } return 0; }; searchblobModules.filterValue = function (typeid, value) { var r = []; var i, x, m, d, h, mm; if (EncodingClass.type.isArray(value)) { r = []; for (i = 0; i < value.length; i++) { x = EncodingClass.string.duplicateObject(value[i]); x.value = filterValue(typeid, value[i].value); r.push(x); } return r; } switch (typeid) { case -3: return ~~(value.getTime() / 1000); case -4: m = value.getMonth() + 1; if (m.length == 1) m = "0" + m; d = value.getDate(); if (d.length == 1) d = "0" + d; return value.getFullYear() + m + d; case -5: m = value.getMonth() + 1; if (m.length == 1) m = "0" + m; d = value.getDate(); if (d.length == 1) d = "0" + d; h = value.getHours(); if (h.length == 1) h = "0" + h; mm = value.getMinutes(); if (mm.length == 1) mm = "0" + mm; return value.getFullYear() + m + d + h + mm; case -6: return value !== false; default: return value; } } searchblobModules.makeTypeDesc = function (pattern) { var i, n, r, st, children, keys, values; var typeid, rv; n = privtype.length; for (i = 0; i < n; i++) { if (pattern.type == privtype[i]) { r = { type: pattern.type, typeid: -1 - i, cond: pattern.cond, nodeindex: nodecount++ }; if (pattern.value !== undefined) r.value = filterValue(-1 - i, pattern.value); if (pattern.minval !== undefined) r.minval = filterValue(-1 - i, pattern.minval); if (pattern.maxval !== undefined) r.maxval = filterValue(-1 - i, pattern.maxval); if (pattern.children !== undefined) r.children = pattern.children; return r; } } if (pattern.type == "struct") { keys = Object.keys(pattern.children); values = {}; n = keys.length; for (i = 0; i < n; i++) { r = makeTypeDesc(pattern.children[keys[i]]); if (r === null) return null; values[keys[i]] = r; } keys.sort(naturalSort); children = []; st = ""; for (i = 0; i < n; i++) { st += keys[i].length + "#" + keys[i] + values[keys[i]].typeid + "#"; children.push({ name: keys[i], content: values[keys[i]] }); } if (types[st] === undefined) { console.log("type definition string not found", st); return null; } typeid = types[st]; rv = { type: "struct", typeid: typeid, cond: pattern.cond, children: children, nodeindex: nodecount++ }; if (pattern.cond == "or") { for (i = 0; i < n; i++) { if (children[i].content.cond == "true") { rv.cond = "true"; break; } else if (children[i].content.cond !== "false") { } } } if (pattern.cond == "and") { for (i = 0; i < n; i++) { if (children[i].content.cond == "false") { rv.cond = "false"; break; } } } return rv; } if (pattern.type == "array") { if (pattern.children !== undefined) { n = pattern.children.length; } else { n = 0; } rv = { type: "array", typeid: 0, cond: pattern.cond }; children = []; if ((pattern.children !== undefined) && (pattern.cond != "true") && (pattern.cond != "false")) { for (i = 0; i < n; i++) { r = makeTypeDesc(pattern.children[i]); if (r === null) { if (pattern.cond != "or") return null; } else { children.push(r); } } rv.children = children; //if ((pattern.cond == "or") && (children.length == 0)) return null; if (children.length == 0) return null; } rv.nodeindex = nodecount++; return rv; } console.log("invalid pattern type", pattern); return null; }; searchblobModules.getType = function (desc) { return types[desc]; }; searchblobModules.makeTypePath = function (params) { var typeid = params.pattern.typeid; var nodeindex = params.pattern.nodeindex; var parentType; var i, n, r, t; if (params.parentIndex < 0) { parentType = "*"; } else { parentType = params.parent.typeid; } if (params.pattern.cond == "false") { //if (params.parent !== null) params.parent.require--; return; } if (typeid < 0) { if (typepath[typeid] === undefined) typepath[typeid] = []; if (typepath[typeid][parentType] === undefined) typepath[typeid][parentType] = []; if (parentType == "*") { if (typepath[typeid]["*"]["*"] === undefined) typepath[typeid]["*"]["*"] = []; typepath[typeid]["*"]["*"].push({source: params.pattern}); } else { if (typepath[typeid][parentType][params.index] === undefined) typepath[typeid][parentType][params.index] = []; if (typepath[typeid][parentType][params.index]["*"] === undefined) typepath[typeid][parentType][params.index]["*"] = []; typepath[typeid][parentType][params.index]["*"].push({source: params.pattern, dest: params.parent, e: params.eindex}); } } if (params.pattern.type == "struct") { if (typepath[typeid] === undefined) typepath[typeid] = []; if (typepath[typeid][parentType] === undefined) typepath[typeid][parentType] = []; n = params.pattern.children.length; for (i = 0; i < n; i++) { makeTypePath({ pattern: params.pattern.children[i].content, parent: params.pattern, parentIndex: nodeindex, index: i }); } if (typepath[typeid]["x"] === undefined) typepath[typeid]["x"] = []; if (params !== null) { if (typepath[typeid]["x"][nodeindex] === undefined) { typepath[typeid]["x"][nodeindex] = {source: params.pattern}; } else { console.log("fatal error: duplicated nodeindex", nodeindex); } } if (parentType == "*") { if (typepath[typeid]["*"][nodeindex] === undefined) typepath[typeid]["*"][nodeindex] = []; typepath[typeid]["*"][nodeindex].push({source: params.pattern}); } else { if (typepath[typeid][parentType][params.index] === undefined) typepath[typeid][parentType][params.index] = []; if (typepath[typeid][parentType][params.index][nodeindex] === undefined) typepath[typeid][parentType][params.index][nodeindex] = []; typepath[typeid][parentType][params.index][nodeindex].push({source: params.pattern, dest: params.parent, e: params.eindex}); } } if (params.pattern.type == "array") { if (typepath[typeid] === undefined) typepath[typeid] = []; if (typepath[typeid]["x"] === undefined) typepath[typeid]["x"] = []; if (typepath[typeid][parentType] === undefined) typepath[typeid][parentType] = []; if (params.pattern.cond == "true") { if (typepath[typeid]["x"][-1] === undefined) typepath[typeid]["x"][-1] = []; typepath[typeid]["x"][-1].push(nodeindex); } if (params.pattern.children !== undefined) { n = params.pattern.children.length; if (n == 0) { if (typepath[typeid]["x"][-2] === undefined) typepath[typeid]["x"][-2] = []; typepath[typeid]["x"][-2].push(nodeindex); } } if ((params.pattern.cond != "true") && (params.pattern.cond != "false")) { for (i = 0; i < n; i++) { makeTypePath({ pattern: params.pattern.children[i], parent: params.pattern, parentIndex: nodeindex, index: 0, eindex: i }); } } if (typepath[typeid]["x"][nodeindex] === undefined) typepath[typeid]["x"][nodeindex] = {source: params.pattern}; if (parentType == "*") { if (typepath[typeid]["*"][nodeindex] === undefined) typepath[typeid]["*"][nodeindex] = []; typepath[typeid]["*"][nodeindex].push(params.pattern); } else { if (typepath[typeid][parentType][params.index] === undefined) typepath[typeid][parentType][params.index] = []; if (typepath[typeid][parentType][params.index][nodeindex] === undefined) typepath[typeid][parentType][params.index][nodeindex] = []; typepath[typeid][parentType][params.index][nodeindex].push({source: params.pattern, dest: params.parent, e: params.eindex}); } } }; searchblobModules.checkPrivPattern = function (typeid, content, path) { var i, n, ok; if (path.cond == "true") return true; if (path.cond == "false") return false; if (path.cond == "and") { n = path.value.length; for (i = 0; i < n; i++) { ok = checkPrivPattern(typeid, content, path.value[i]); if (!ok) return false; } return true; } if (path.cond == "or") { n = path.value.length; for (i = 0; i < n; i++) { ok = checkPrivPattern(typeid, content, path.value[i]); if (ok) { return true; } } return false; } if (typeid == -6) { switch (path.cond) { case "eq": return equal(content, path.value); case "ne": return content != path.value; } return false; } switch (path.cond) { case "prefix": return content.substr(0, path.value.length) == path.value; case "!prefix": return content.substr(0, path.value.length) != path.value; case "postfix": n = content.length; i = path.value.length; if (n < i) return false; return content.substr(n - i, i) == path.value; case "!postfix": n = content.length; i = path.value.length; if (n < i) return true; return content.substr(n - i, i) != path.value; case "contains": return content.includes(path.value); case "!contains": return !content.includes(path.value); case "eq": if ((typeid == -2) || (typeid == -3)) return equal(content, path.value); return content == path.value; case "ne": return content != path.value; case "ge": return content >= path.value; case "le": return content <= path.value; case "g": return content > path.value; case "l": return content < path.value; case "(range)": return (path.minval < content) && (content < path.maxval); case "(range]": return (path.minval < content) && (content <= path.maxval); case "[range)": return (path.minval <= content) && (content < path.maxval); case "[range]": return (path.minval <= content) && (content <= path.maxval); case ")range(": return (content < path.minval) || (path.maxval < content); case ")range[": return (content < path.minval) || (path.maxval <= content); case "]range(": return (content <= path.minval) || (path.maxval < content); case "]range[": return (content <= path.minval) || (path.maxval <= content); } return false; }; searchblobModules.equal = function (a, b) { var r = a - b; if (r < 0) r = -r; return (r < 0.0000001); }; searchblobModules.checkPattern = function (sq, typeid, content, nodeindex, path) { var v1, v2, r; var i, c; if (path.source.cond == "true") return true; if (path.source.cond == "false") return false; if (typeid < 0) { try { r = checkPrivPattern(typeid, content, path.source); return r; } catch (e) { return false; } } if (sq === null) return false; if (sq[nodeindex] === undefined) return false; if (path.source.cond == "and") { for (i = c = 0; i < path.source.children.length; i++) { if (path.source.children[i].content.cond == "true") { c++; } else if (sq[nodeindex][i] !== undefined) c++; } return (c == path.source.children.length); } if (path.source.cond == "or") return Object.keys(sq[nodeindex]).length > 0; return false; }; searchblobModules.validValue = function (sq, typeid, content, nodeindex) { var i, ok, keys; if (typeid < 0) return true; return checkPattern(sq, typeid, content, nodeindex, typepath[typeid]["x"][nodeindex]); } searchblobModules.rowprocessing = function (host, id, content, typeid, dataref, recordref) { var i, j, k, n, m, r, sq; var parentType, index, nextid, nodeindex, xpath, nList, parentIndex, nodelist; var list; if (id == debugValueID) { id = id; } if (typepath[typeid] === undefined) return; sq = null; if (searchQueue[id] !== undefined) { sq = []; nodelist = Object.keys(searchQueue[id]); for (i = 0; i < nodelist.length; i++) { nodeindex = nodelist[i]; if (validValue(searchQueue[id], typeid, -1, nodeindex)) { sq[nodeindex] = searchQueue[id][nodeindex]; } } if (typeid == 0) { if (typepath[0]["x"][-1] !== undefined) { for (i = 0; i < typepath[0]["x"][-1].length; i++) { if (sq[typepath[0]["x"][-1][i]] === undefined) sq[typepath[0]["x"][-1][i]] = []; } } } if (sq.length == 0) sq = null; } else if (typeid == 0) { sq = []; if (typepath[0]["x"][-1] !== undefined) { for (i = 0; i < typepath[0]["x"][-1].length; i++) { sq[typepath[0]["x"][-1][i]] = []; } } if (!mark[id]) { if (typepath[0]["x"][-2] !== undefined) { for (i = 0; i < typepath[0]["x"][-2].length; i++) { sq[typepath[0]["x"][-2][i]] = []; } } } if (sq.length == 0) sq = null; } else if (typeid < 0) { sq = null; } else { sq = null; } if (mark[id] !== undefined) delete mark[id]; if (dataref >= 0) { n = host.intValues[dataref++]; } else { n = 0; } for (i = 0; i < n; i++) { k = host.intValues[dataref++]; parentType = host.intValues[k++]; index = host.intValues[k++]; nextid = host.intValues[k++]; mark[nextid] = true; if ((sq !== null) || (typeid < 0)) { if (typepath[typeid][parentType] === undefined) continue; if (parentType == 0) { // array if (typepath[typeid][parentType][0] === undefined) continue; nList = Object.keys(typepath[typeid][parentType][0]); r = nList.length; for (k = 0; k < r; k++) { nodeindex = nList[k]; xpath = typepath[typeid][parentType][0][nodeindex]; m = xpath.length; for (j = 0; j < m; j++) { if (checkPattern(sq, typeid, content, nodeindex, xpath[j])) { if (searchQueue[nextid] === undefined) searchQueue[nextid] = []; parentIndex = xpath[j].dest.nodeindex; if (searchQueue[nextid][parentIndex] === undefined) searchQueue[nextid][parentIndex] = []; searchQueue[nextid][parentIndex][xpath[j].e] = true; } } } } else { // struct if (typepath[typeid][parentType][index] === undefined) continue; nList = Object.keys(typepath[typeid][parentType][index]); r = nList.length; for (k = 0; k < r; k++) { nodeindex = nList[k]; xpath = typepath[typeid][parentType][index][nodeindex]; m = xpath.length; for (j = 0; j < m; j++) { parentIndex = xpath[j].dest.nodeindex; if (checkPattern(sq, typeid, content, nodeindex, xpath[j])) { if (searchQueue[nextid] === undefined) searchQueue[nextid] = []; if (searchQueue[nextid][parentIndex] === undefined) searchQueue[nextid][parentIndex] = []; searchQueue[nextid][parentIndex][index] = true; } } } } } } if (recordref >= 0) { n = host.intValues[recordref++]; } else { n = 0; } for (i = 0; i < n; i++) { nextid = host.intValues[recordref++]; if (typepath[typeid]["*"] === undefined) continue; nList = Object.keys(typepath[typeid]["*"]); r = nList.length; for (k = 0; k < r; k++) { nodeindex = nList[k]; xpath = typepath[typeid]["*"][nodeindex]; m = xpath.length; for (j = 0; j < m; j++) { if (checkPattern(sq, typeid, content, nodeindex, xpath[j])) { searchResult.push(nextid); break; } } } } if (searchQueue[id] !== undefined) delete searchQueue[id]; }; var searchWorkerFunc = function (params) { var i, j, n; var keys, values; var id, slength, s, data; var content, dataref, recordref, typeid; types = {}; typepath = []; searchResult = []; searchQueue = []; mark = []; privtype = ["string", "number", "realtime", "date", "datetime", "boolean", "system"]; nodecount = 0; if (params.debugValueID !== undefined) debugValueID = params.debugValueID; n = ~~(params.typesDesc.length / 3); for (i = 0; i < params.typesDesc.length; i++) { s = EncodingClass.string.fromUint8Array(params.typesData, params.typesDesc[i * 3 + 1], params.typesDesc[i * 3 + 2]); //if (utf8_supported) s = EncodingClass.utf8.decode(s); types[s] = params.typesDesc[i * 3]; } params.pattern = makeTypeDesc(params.pattern); if (params.pattern === null) { console.error("Invalid search pattern (null)"); return []; } //try { makeTypePath({ pattern: params.pattern, parent: null, parentIndex: -1, index: 0 }); /* } catch (e) { console.log("Invalid search pattern", params.pattern); console.log(e); return []; } */ n = ~~(params.contents.length / 5); for (i = 0; i < n; i++) { if (params.contents[i * 5] == debugValueID) { i = i; } content = params.contents[i * 5 + 1]; typeid = params.contents[i * 5 + 2]; switch (typeid) { case -1: // string slength = EncodingClass.number.fromArray("i32", params.text, content); content = EncodingClass.string.fromUint8Array(params.text, content + 4, slength); //if (utf8_supported) content = EncodingClass.utf8.decode(content); break; case -4: // date case -5: // datetime case -7: // system slength = EncodingClass.number.fromArray("i32", params.text, content); content = EncodingClass.string.fromUint8Array(params.text, content + 4, slength); break; case -2: // number case -3: // realtime content = params.doubleValues[content]; break; //content = new Date(params.doubleValues[content] * 1000); //break; case -6: // boolean //do nothing //content = (content != 0); break; case 0: // array default: // struct /* s = []; slength = params.intValues[content++]; for (j = 0; j < slength; j++) { s.push(params.intValues[content++]); } content = s; */ break; } dataref = params.contents[i * 5 + 3]; recordref = params.contents[i * 5 + 4]; rowprocessing(params, params.contents[i * 5], content, typeid, dataref, recordref); } searchResult.sort((a, b) => (a - b)); searchResult = new Int32Array(searchResult); transferList = [searchResult.buffer]; return searchResult; }; core.searchWorkerThread = Thread.createWorkerPool({ extcode: EncodingClass.exportCode(), modules: searchblobModules, func: searchWorkerFunc }); retval.connect = function (core) { return function (params) { var host = params.host; var dbname = params.dbname; var callbackfunc = params.func; var progressfunc = params.progress; var token = params.token; if (host === undefined) return; if (dbname === undefined) return; if (callbackfunc === undefined) return; if (token === undefined) token = ""; if (progressfunc === undefined) { progressfunc = function (index, length) { }; } if (!EncodingClass.type.isString(host)) return; if (!EncodingClass.type.isString(dbname)) return; if (!EncodingClass.type.isFunction(callbackfunc)) return; if (!EncodingClass.type.isFunction(progressfunc)) return; if (host.length == 0) return; if (host.substr(host.length - 1, 1) != "/") host = host + "/"; if (core.connector[params.dbname] !== undefined) { Thread.wait( function () { return core.connector[params.dbname].connector !== undefined; }, function () { Thread.setTimeout({ func: params.func, args: [true, core.connector[params.dbname].connector] }); } ); return; } core.connect({ host: host, dbname: dbname, token: token, func: callbackfunc, progressfunc: progressfunc, path: params.path }); } } (core); retval.setWorkMode = function (mode) { } retval.setDebug = function (value, debugid) { core.debugMode = value; if (debugid !== undefined) { if (EncodingClass.type.isNumber(debugid)) { searchblobModules.debugValueID = debugid; } } } return retval; } ());