1fb726d48Sopenharmony_ci/*
2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd.
3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb726d48Sopenharmony_ci * You may obtain a copy of the License at
6fb726d48Sopenharmony_ci *
7fb726d48Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb726d48Sopenharmony_ci *
9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and
13fb726d48Sopenharmony_ci * limitations under the License.
14fb726d48Sopenharmony_ci */
15fb726d48Sopenharmony_ci
16fb726d48Sopenharmony_ciimportScripts('sql-wasm.js');
17fb726d48Sopenharmony_ci// @ts-ignore
18fb726d48Sopenharmony_ciimport { temp_init_sql_list } from './TempSql';
19fb726d48Sopenharmony_ciimport { execProtoForWorker } from './data-trafic/utils/ExecProtoForWorker';
20fb726d48Sopenharmony_ciimport { TraficEnum } from './data-trafic/utils/QueryEnum';
21fb726d48Sopenharmony_ci
22fb726d48Sopenharmony_cilet conn: unknown = null;
23fb726d48Sopenharmony_ci
24fb726d48Sopenharmony_ciself.onerror = function (error): void { };
25fb726d48Sopenharmony_ci
26fb726d48Sopenharmony_ciself.onmessage = async (e: unknown): Promise<void> => {
27fb726d48Sopenharmony_ci  //@ts-ignore
28fb726d48Sopenharmony_ci  const action = e.data.action;
29fb726d48Sopenharmony_ci  //@ts-ignore
30fb726d48Sopenharmony_ci  const id = e.data.id;
31fb726d48Sopenharmony_ci  if (action === 'open') {
32fb726d48Sopenharmony_ci    //@ts-ignore
33fb726d48Sopenharmony_ci    let array = new Uint8Array(e.data.buffer);
34fb726d48Sopenharmony_ci    // @ts-ignore
35fb726d48Sopenharmony_ci    initSqlJs({ locateFile: (filename) => `${filename}` }).then((SQL: unknown) => {
36fb726d48Sopenharmony_ci      // @ts-ignore
37fb726d48Sopenharmony_ci      conn = new SQL.Database(array);
38fb726d48Sopenharmony_ci      self.postMessage({ id: id, ready: true, index: 0 });
39fb726d48Sopenharmony_ci      // @ts-ignore
40fb726d48Sopenharmony_ci      if (temp_init_sql_list && temp_init_sql_list.length > 0) {
41fb726d48Sopenharmony_ci        // @ts-ignore
42fb726d48Sopenharmony_ci        temp_init_sql_list.forEach((item, index) => {
43fb726d48Sopenharmony_ci          // @ts-ignore
44fb726d48Sopenharmony_ci          let r = conn.exec(item);
45fb726d48Sopenharmony_ci          self.postMessage({
46fb726d48Sopenharmony_ci            id: id,
47fb726d48Sopenharmony_ci            ready: true,
48fb726d48Sopenharmony_ci            index: index + 1,
49fb726d48Sopenharmony_ci          });
50fb726d48Sopenharmony_ci        });
51fb726d48Sopenharmony_ci      }
52fb726d48Sopenharmony_ci      self.postMessage({ id: id, init: true });
53fb726d48Sopenharmony_ci    });
54fb726d48Sopenharmony_ci  } else if (action === 'close') {
55fb726d48Sopenharmony_ci  } else if (action === 'exec' || action === 'exec-buf' || action === 'exec-metric') {
56fb726d48Sopenharmony_ci    try {
57fb726d48Sopenharmony_ci      //@ts-ignore
58fb726d48Sopenharmony_ci      let sql = e.data.sql;
59fb726d48Sopenharmony_ci      //@ts-ignore
60fb726d48Sopenharmony_ci      let params = e.data.params;
61fb726d48Sopenharmony_ci      // @ts-ignore
62fb726d48Sopenharmony_ci      const stmt = conn.prepare(sql);
63fb726d48Sopenharmony_ci      stmt.bind(params);
64fb726d48Sopenharmony_ci      let res = [];
65fb726d48Sopenharmony_ci      while (stmt.step()) {
66fb726d48Sopenharmony_ci        //@ts-ignore
67fb726d48Sopenharmony_ci        res.push(stmt.getAsObject());
68fb726d48Sopenharmony_ci      }
69fb726d48Sopenharmony_ci      stmt.free();
70fb726d48Sopenharmony_ci      // @ts-ignore
71fb726d48Sopenharmony_ci      self.postMessage({ id: id, results: res });
72fb726d48Sopenharmony_ci    } catch (err) {
73fb726d48Sopenharmony_ci      self.postMessage({
74fb726d48Sopenharmony_ci        id: id,
75fb726d48Sopenharmony_ci        results: [],
76fb726d48Sopenharmony_ci        //@ts-ignore
77fb726d48Sopenharmony_ci        error: err.message,
78fb726d48Sopenharmony_ci      });
79fb726d48Sopenharmony_ci    }
80fb726d48Sopenharmony_ci  } else if (action === 'exec-proto') {
81fb726d48Sopenharmony_ci    //@ts-ignore
82fb726d48Sopenharmony_ci    e.data.params.trafic = TraficEnum.Memory;
83fb726d48Sopenharmony_ci    //@ts-ignore
84fb726d48Sopenharmony_ci    execProtoForWorker(e.data, (sql: string) => {
85fb726d48Sopenharmony_ci      try {
86fb726d48Sopenharmony_ci        // @ts-ignore
87fb726d48Sopenharmony_ci        const stmt = conn.prepare(sql);
88fb726d48Sopenharmony_ci        let res = [];
89fb726d48Sopenharmony_ci        while (stmt.step()) {
90fb726d48Sopenharmony_ci          //@ts-ignore
91fb726d48Sopenharmony_ci          res.push(stmt.getAsObject());
92fb726d48Sopenharmony_ci        }
93fb726d48Sopenharmony_ci        stmt.free();
94fb726d48Sopenharmony_ci        return res;
95fb726d48Sopenharmony_ci      } catch (err: unknown) {
96fb726d48Sopenharmony_ci        console.log(err);
97fb726d48Sopenharmony_ci        return [];
98fb726d48Sopenharmony_ci      }
99fb726d48Sopenharmony_ci    });
100fb726d48Sopenharmony_ci  }
101fb726d48Sopenharmony_ci};
102