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}