Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 102 additions & 0 deletions examples/ForWorker/README_CN.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
### Worker快速使用 ###
> cdn使用阿里云 https://npmmirror.com/
> IOS版本要求15++
> 如果版本更新修改 SQLite3.js
> 自定义响应方法修改 WorkerAppSQLite.js 中的 `methods = new Map(...);`
> 推荐使用serviceWorker缓存cdn文件,避免长时间加载
> 推荐使用场景如`JQ-easyui`这种仿生App,异步构建页面.如果直接显示则需要在serviceWorker中使用,缺点你也懂得,serviceWorker中不能垃圾回收,必须常驻加载SQLite.
```javascript
import './changeWorker.js';
//创建表结构
const tablelist = {
data: {
id: 'integer primary key autoincrement',
title: 'char',
type: 'char',
url: 'char',
img: 'char',
time:'char',
source: 'char',
},
tag: {
name: 'char',
num: 'int'
}
};
//设置 保存文件名
const sqlfile = 'my.sqlite3';

async openSQL() {
const worker = await (new Worker(self.jspath + 'Worker/WorkerAppSQLite.js', { name: 'SQLite-worker' }).initMessage());
await worker.postMethod('setFile',sqlfile);
if (!(await worker.postMethod('install', true))) {
await worker.postMethod('createList',this.tablelist);
await worker.postMethod('savedata')
}
await worker.publicMethod();
return worker;
}

const worker = await this.openSQL(); // 创建并初始化
console.log(worker.methods.key()); //显示所有公共方法 具体请看SQLite3.js
console.log(await worker.callMethod('selectSQL','data')); //输出所有data数据

await worker.getFeedback({
method:'importFile',
result:file,//导入数据文件 SQLite3文件 或者 json 数据 支持zip压缩文件
password:undefined,//可选 zip解压密码
mode:0,//or 1
tablelist,
});
worker.postMethod('exitworker'); //关闭并退出worker

```

### 关于分享/下载下载 ###
> 因为是以caches方式保存,如果使用了serviceWorker,可以实现虚拟下载

```javascript
//前台

function postdown(action,param){
let elm = document.createElement('form');
elm.hidden = true;
elm.action = action;
elm.name = 'postdown';
elm.method = 'POST';
elm.enctype = 'text/plain';
//elm.target = '_blank';
elm.innerHTML = Object.entries(param).map(entry=>`<input type="hidden" name="${entry[0]}" value="${entry[1]}">`).join('');
document.body.appendChild(elm);
elm.submit();
//elm.remove();
}
postdown(sqlfile,{cache_name:'cache-worker'});

//serviceWorker.js拦截
//self.addEventListener('fetch',function(event){
const request = event.request;
if(request.method=='POST'){
if(request.headers.get('content-type') == 'text/plain'){
return event.respondWith(
new Promise(async back=>{
const response = request.clone();
const text = new URLSearchParams((await response.text()).replace(/[\r\n]+/,'&'));
const cachename = text.get('cache_name');
if(cachename){
if(await caches.has(cachename)){
const cache = await caches.open(cachename);
const response = await cache.match(request.url);
if(response){
back(response);
}
}
back(new Response(undefined,{status:404}));
}
back(return fetch(request));
});
);
}
}
//});
```
165 changes: 165 additions & 0 deletions examples/ForWorker/SQLite3.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@

importScripts('https://registry.npmmirror.com/sql.js/1.11.0/files/dist/sql-wasm.js');
initSqlJs({
locateFile(){
return 'https://registry.npmmirror.com/sql.js/1.11.0/files/dist/sql-wasm.wasm';
}
});
self.SQLite3Ready = new Promise(async back=>{
const sqlite3 = await initSqlJsPromise;
delete sqlite3.wasmBinary;
class SQLite3 extends sqlite3.Database {
constructor(data) {
super((data instanceof Uint8Array) && data.byteLength > 0 ? data : undefined);
}
All(sql, params, limit) {
return this.fetchAll(sql,params,limit);
}
One(sql, params) {
return this.fetch(sql,params);
}
fetchAll(sql,params,limit){
let result = this.exec(sql, params);
if (result[0]) {
let data = [];
let index = 0;
for (let value of result[0].values) {
data.push(Object.fromEntries(value.map((v, k) => [result[0].columns[k], v])));
index+=1;
if (limit===index) break;
}
if(limit==1) return data[0];
return data;
}
}
fetch(sql,params){
return this.fetchAll(sql, params, 1);
}
fetchColumn(sql,params,index){
let result = Object.values(this.fetch(sql, params) || []);
if (result.length) {
return result[index || 0];
}
}
resultFirst(sql, params) {
return this.fetchColumn(sql, params, 0);
}
str_select(table,column){
column = column?column:'*';
if(column instanceof Array)column = this.str_qoute(column);
return 'SELECT '+column+' FROM `'+table+'` ';
}
str_where(keys) {
return keys.length ? ' WHERE ' +this.str_set(keys,' AND '): '';
}
str_param(keys){
return keys.length?this.str_set(keys,' , '):'';
}
str_qoute(keys){
if(keys instanceof Array){
return Array.from(keys,key=>this.str_qoute(key)).join(' , ');
}
return '`'+keys+'`';
}
str_set(keys,sp){
if(keys instanceof Array&&keys.length){
return Array.from(keys,key=>this.str_set(key)).join(sp||' , ');
}else if(typeof keys === 'string'){
return this.str_qoute(keys)+' = ? ';
}
return '';
}
str_var(size){
return Array.from(''.padEnd(size,'?')).join(',');
}
str_insert(table){
return 'INSERT INTO '+this.str_qoute(table)+' ';
}
str_delete(table){
return 'DELETE FROM '+this.str_qoute(table)+' ';
}
str_update(table){
return 'UPDATE '+this.str_qoute(table)+' SET ';
}
selectAll(table, where,limit,column) {
const keys = where&&Object.keys(where)||[];
const values = where&&Object.values(where)||[];
return this.fetchAll(this.str_select(table,column)+ this.str_where(keys),values,limit);
}
selectOne(table, where,column) {
return this.selectAll(table,where,1,column);
}
selectCount(table, where) {
const result = this.selectOne(table,where,'count(*)');
return result ? Object.values(result)[0]:0;
}
selectSQL(table,sql,param,column){
sql = sql?sql:'';
param = param instanceof Array?param:[];
return this.fetchAll(this.str_select(table,column)+sql,param);
}
fetchSQL(table,sql,param,column){
sql = sql?sql:'';
param = param instanceof Array?param:[];
return this.fetch(this.str_select(table,column)+sql,param);
}
selectColumnSQL(table,sql,param,column,index){
sql = sql?sql:'';
param = param instanceof Array?param:[];
return this.fetchColumn(this.str_select(table,column)+sql,param,index);
}
selectCountSQL(table,sql,param){
sql = sql?sql:'';
param = param instanceof Array?param:[];
return this.fetchColumn(this.str_select(table,'count(*)')+sql,param);
}
deleteSQL(table,sql,param){
sql = sql?sql:'';
param = param instanceof Array?param:[];
return this.exec(this.str_delete(table)+sql,param);
}
insertSQL(table,sql,param){
sql = sql?sql:'';
param = param instanceof Array?param:[];
return this.exec(this.str_insert(table)+sql,param);
}
delete(table, where) {
const keys = where&&Object.keys(where);
const values = where&&Object.values(where)||[];
this.exec(this.str_delete(table) + this.str_where(keys) + ';',values);
}
updateJson(table, data, where) {
const keys = where&&Object.keys(where);
const values = where&&Object.values(where)||[];
const param = Object.values(data);
if(values.length)param.push(...values);
return this.exec(this.str_update(table)+this.str_param(Object.keys(data)) + this.str_where(keys) + ' ;', param);
}
insertJson(table, data, where) {
if(where)this.delete(table,where);
const param = Object.values(data);
return this.exec(this.str_insert(table)+' ( '+this.str_qoute(Object.keys(data))+' ) VALUES ( ' + this.str_var(param.length)+ ' ) ',param);
}
createTable(table,list) {
let keys = typeof list === 'string' ? list : Array.from(Object.entries(list), s => '`' + s[0] + '` ' + s[1]).join(',');
return this.exec(`CREATE TABLE IF NOT EXISTS \`${table}\` (${keys});`);
}
createList(tablelist) {
return Array.from(Object.entries(tablelist) || [], e =>this.createTable(e[0],e[1]));
}
resultTable() {
let result = this.exec(this.str_select('sqlite_master','`name`')+this.str_where(['type']), ['table']);
if (result[0]) {
return Array.from(result[0].values, e => e[0]);
}
}
resultSql() {
let result = this.exec(this.str_select('sqlite_master',['name','sql'])+this.str_where(['type']), ['table']);
if (result[0]) {
return Object.fromEntries(result[0].values)
}
}
}
self.SQLite3 = SQLite3;
back(SQLite3);
});
Loading