VaKeR CYBER ARMY
Logo of a company Server : Apache/2.4.41 (Ubuntu)
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 :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /var/www/html/keeview_app/html/jsflexdb.js
'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;
} ());

VaKeR 2022