• 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    request.onsuccess = function (event) {
24      let db = request.result;
25      resolve(db);
26    };
27    request.onupgradeneeded = function (event) {
28      // @ts-ignore
29      let db = event!.target!.result;
30      if (!db.objectStoreNames.contains('connection')) {
31        db.createObjectStore('connection', { autoIncrement: true });
32      }
33    };
34  });
35}
36
37function readConnection(store: IDBObjectStore) {
38  return new Promise((resolve, reject) => {
39    let request = store.get(1);
40    request.onsuccess = function (event) {
41      // @ts-ignore
42      resolve(event.target.result);
43    };
44    request.onerror = function (event) {
45      // @ts-ignore
46      reject(event.target.result);
47    };
48  });
49}
50
51function deleteConnection(store: IDBObjectStore, id: number) {
52  return new Promise((resolve, reject) => {
53    let request = store.delete(id);
54    request.onsuccess = function (event) {
55      // @ts-ignore
56      resolve(event.target.result);
57    };
58    request.onerror = function (event) {
59      // @ts-ignore
60      reject(event.target.result);
61    };
62  });
63}
64
65let mergedUnitArray = (bufferSliceUint8: Array<Uint8Array>) => {
66  let length = 0;
67  bufferSliceUint8.forEach((item) => {
68    length += item.length;
69  });
70  let mergedArray = new Uint8Array(length);
71  let offset = 0;
72  bufferSliceUint8.forEach((item) => {
73    mergedArray.set(item, offset);
74    offset += item.length;
75  });
76  return mergedArray;
77};
78
79self.onerror = function (error) {};
80
81self.onmessage = async (e: any) => {
82  if (e.data.action === 'open') {
83    let array = new Uint8Array(e.data.buffer);
84    // @ts-ignore
85    initSqlJs({ locateFile: (filename) => `${filename}` }).then((SQL: any) => {
86      conn = new SQL.Database(array);
87      // @ts-ignore
88      self.postMessage({ id: e.data.id, ready: true, index: 0 });
89      temp_init_sql_list.forEach((item, index) => {
90        let r = conn.exec(item);
91        // @ts-ignore
92        self.postMessage({
93          id: e.data.id,
94          ready: true,
95          index: index + 1,
96        });
97      });
98      // @ts-ignore
99      self.postMessage({ id: e.data.id, init: true });
100    });
101  } else if (e.data.action === 'close') {
102  } else if (e.data.action === 'exec' || e.data.action === 'exec-buf') {
103    try {
104      let action = e.data.action; //: "exec"
105      let sql = e.data.sql;
106      let params = e.data.params;
107      const stmt = conn.prepare(sql);
108      stmt.bind(params);
109      let res = [];
110      while (stmt.step()) {
111        //
112        res.push(stmt.getAsObject());
113      }
114      stmt.free();
115      // @ts-ignore
116      self.postMessage({ id: e.data.id, results: res });
117    } catch (err: any) {
118      // @ts-ignore
119      self.postMessage({
120        id: e.data.id,
121        results: [],
122        error: err.message,
123      });
124    }
125  }
126};
127