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