• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16importScripts('sql-wasm.js', "TempSql.js");
17let conn: any = null;
18let encoder = new TextEncoder();
19function initIndexedDB() {
20    return new Promise((resolve, reject) => {
21        let request = indexedDB.open("systrace");
22        request.onerror = function (event) {
23        };
24        request.onsuccess = function (event) {
25            let db = request.result;
26            resolve(db);
27        };
28        request.onupgradeneeded = function (event) {
29            // @ts-ignore
30            let db = event!.target!.result;
31            if (!db.objectStoreNames.contains("connection")) {
32                db.createObjectStore("connection", {autoIncrement: true});
33            }
34        };
35    })
36}
37
38function readConnection(store: IDBObjectStore) {
39    return new Promise((resolve, reject) => {
40        let request = store.get(1);
41        request.onsuccess = function (event) {
42            // @ts-ignore
43            resolve(event.target.result);
44        };
45        request.onerror = function (event) {
46            // @ts-ignore
47            reject(event.target.result);
48        };
49    })
50}
51
52function deleteConnection(store: IDBObjectStore, id: number) {
53    return new Promise((resolve, reject) => {
54        let request = store.delete(id);
55        request.onsuccess = function (event) {
56            // @ts-ignore
57            resolve(event.target.result);
58        };
59        request.onerror = function (event) {
60            // @ts-ignore
61            reject(event.target.result);
62        };
63    })
64}
65
66let mergedUnitArray = (bufferSlice:Array<Uint8Array>)=>{
67    let length = 0;
68    bufferSlice.forEach(item => {
69        length += item.length;
70    });
71    let mergedArray = new Uint8Array(length);
72    let offset = 0;
73    bufferSlice.forEach(item => {
74        mergedArray.set(item, offset);
75        offset += item.length;
76    });
77    return mergedArray;
78}
79
80self.onerror = function (error) {
81}
82
83
84self.onmessage = async (e: any) => {
85    if (e.data.action === "open") {
86        let array = new Uint8Array(e.data.buffer);
87        // @ts-ignore
88        initSqlJs({locateFile: filename => `${filename}`}).then((SQL: any) => {
89            conn = new SQL.Database(array);
90            // @ts-ignore
91            self.postMessage({id: e.data.id, ready: true, index: 0});
92            temp_init_sql_list.forEach((item, index) => {
93                let r = conn.exec(item);
94                // @ts-ignore
95                self.postMessage({id: e.data.id, ready: true, index: index + 1});
96            });
97            // @ts-ignore
98            self.postMessage({id: e.data.id, init: true});
99        });
100    } else if (e.data.action === "close") {
101    } else if (e.data.action === "exec"||e.data.action === "exec-buf") {
102        try {
103            let action = e.data.action; //: "exec"
104            let sql = e.data.sql;
105            let params = e.data.params;
106            const stmt = conn.prepare(sql);
107            stmt.bind(params);
108            let res = [];
109            while (stmt.step()) { //
110                res.push(stmt.getAsObject());
111            }
112            stmt.free();
113            // @ts-ignore
114            self.postMessage({id: e.data.id, results: res});
115        } catch (err: any) {
116            // @ts-ignore
117            self.postMessage({id: e.data.id, results: [], error: err.message});
118        }
119    }
120}