mm_sqlite 1.5.4 → 1.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/example/index.js +51 -0
- package/index.js +24 -670
- package/{pool.js → lib/pool.js} +6 -6
- package/{sql.js → lib/sql.js} +20 -19
- package/lib/sqlite.js +646 -0
- package/package.json +13 -7
- package/test_db/test_basic.db +0 -0
- package/test_db/test_core_methods.db +0 -0
- /package/{db.js → lib/db.js} +0 -0
package/{pool.js → lib/pool.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const
|
|
1
|
+
const { DatabaseSync } = require('node:sqlite');
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* SQLite连接池类
|
|
@@ -33,7 +33,7 @@ class SQLitePool {
|
|
|
33
33
|
return;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
// 创建最小连接数(
|
|
36
|
+
// 创建最小连接数(node:sqlite是同步的,无需await)
|
|
37
37
|
for (let i = 0; i < this.config.pool_min; i++) {
|
|
38
38
|
const conn = this._createConnection();
|
|
39
39
|
this._pool_connections.push(conn);
|
|
@@ -157,7 +157,7 @@ class SQLitePool {
|
|
|
157
157
|
this._pool_reaper = null;
|
|
158
158
|
}
|
|
159
159
|
|
|
160
|
-
// 关闭所有连接(
|
|
160
|
+
// 关闭所有连接(node:sqlite的close是同步的)
|
|
161
161
|
this._pool_connections.forEach(conn => {
|
|
162
162
|
try {
|
|
163
163
|
conn.close();
|
|
@@ -186,16 +186,16 @@ class SQLitePool {
|
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
/**
|
|
189
|
-
* 创建SQLite连接(
|
|
189
|
+
* 创建SQLite连接(node:sqlite DatabaseSync,同步创建)
|
|
190
190
|
* @private
|
|
191
191
|
* @returns {object} 数据库连接对象
|
|
192
192
|
*/
|
|
193
193
|
_createConnection() {
|
|
194
|
-
const db = new
|
|
194
|
+
const db = new DatabaseSync(this._getDbFilename(), {
|
|
195
195
|
timeout: this.config.connect_timeout || 5000
|
|
196
196
|
});
|
|
197
197
|
// 启用WAL模式,提升并发读取性能
|
|
198
|
-
db.
|
|
198
|
+
db.exec('PRAGMA journal_mode = WAL;');
|
|
199
199
|
// 添加release方法,兼容原有API
|
|
200
200
|
db.release = () => this.releaseConn(db);
|
|
201
201
|
db._last_used = Date.now();
|
package/{sql.js → lib/sql.js}
RENAMED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* @version 1.2
|
|
5
5
|
*/
|
|
6
6
|
const SqlString = require('sqlstring');
|
|
7
|
-
const { Base } = require('
|
|
7
|
+
const { Base } = require('mm_mod');
|
|
8
|
+
const { loadText, hasFile } = require('mm_helper');
|
|
8
9
|
|
|
9
10
|
function escape(value, stringifyObjects, timeZone) {
|
|
10
11
|
if (typeof value === 'string') {
|
|
@@ -1307,14 +1308,14 @@ Sql.prototype.tplQuery = function (param_dt, sql_dt) {
|
|
|
1307
1308
|
for (var i = 0; i < len; i++) {
|
|
1308
1309
|
// 使用直接替换方式,避免模板替换错误
|
|
1309
1310
|
let escaped_val = this.escape(arr[i]);
|
|
1310
|
-
sl += '
|
|
1311
|
+
sl += ' OR ' + tpl.replaceAll('{0}', escaped_val.trim("'"));
|
|
1311
1312
|
}
|
|
1312
|
-
sl = sl.replace('
|
|
1313
|
-
sql += '
|
|
1313
|
+
sl = sl.replace(' OR ', '') + ')';
|
|
1314
|
+
sql += ' AND ' + sl;
|
|
1314
1315
|
} else {
|
|
1315
1316
|
// 使用直接替换方式,避免模板替换错误
|
|
1316
1317
|
let escaped_val = this.escape(value);
|
|
1317
|
-
sql += '
|
|
1318
|
+
sql += ' AND ' + tpl.replaceAll('{0}', escaped_val.trim("'"));
|
|
1318
1319
|
}
|
|
1319
1320
|
} else {
|
|
1320
1321
|
if (arr.length > 1) {
|
|
@@ -1322,12 +1323,12 @@ Sql.prototype.tplQuery = function (param_dt, sql_dt) {
|
|
|
1322
1323
|
var sl = '(';
|
|
1323
1324
|
var len = arr.length;
|
|
1324
1325
|
for (var i = 0; i < len; i++) {
|
|
1325
|
-
sl += '
|
|
1326
|
+
sl += ' OR ' + this.escapeId(key) + ' = ' + this.escape(arr[i]);
|
|
1326
1327
|
}
|
|
1327
|
-
sl = sl.replace('
|
|
1328
|
-
sql += '
|
|
1328
|
+
sl = sl.replace(' OR ', '') + ')';
|
|
1329
|
+
sql += ' AND ' + sl;
|
|
1329
1330
|
} else {
|
|
1330
|
-
sql += '
|
|
1331
|
+
sql += ' AND ' + this.escapeId(key) + ' = ' + this.escape(value);
|
|
1331
1332
|
}
|
|
1332
1333
|
}
|
|
1333
1334
|
}
|
|
@@ -1337,9 +1338,9 @@ Sql.prototype.tplQuery = function (param_dt, sql_dt) {
|
|
|
1337
1338
|
let sql = sql_dt[key];
|
|
1338
1339
|
if (sql) {
|
|
1339
1340
|
// 使用直接替换方式,避免模板替换错误
|
|
1340
|
-
sql += '
|
|
1341
|
+
sql += ' AND ' + sql.replaceAll('{0}', value.trim("'"));
|
|
1341
1342
|
} else {
|
|
1342
|
-
sql += '
|
|
1343
|
+
sql += ' AND ' + this.escapeId(key) + ' = ' + value;
|
|
1343
1344
|
}
|
|
1344
1345
|
}
|
|
1345
1346
|
}
|
|
@@ -1356,22 +1357,22 @@ Sql.prototype.tplQuery = function (param_dt, sql_dt) {
|
|
|
1356
1357
|
var sl = '(';
|
|
1357
1358
|
var len = arr.length;
|
|
1358
1359
|
for (var i = 0; i < len; i++) {
|
|
1359
|
-
sl += '
|
|
1360
|
+
sl += ' OR ' + this.escapeId(key) + ' = ' + this.escape(arr[i]);
|
|
1360
1361
|
}
|
|
1361
|
-
sl = sl.replace('
|
|
1362
|
-
sql += '
|
|
1362
|
+
sl = sl.replace(' OR ', '') + ')';
|
|
1363
|
+
sql += ' AND ' + sl;
|
|
1363
1364
|
} else {
|
|
1364
|
-
sql += '
|
|
1365
|
+
sql += ' AND ' + this.escapeId(key) + ' = ' + this.escape(value);
|
|
1365
1366
|
}
|
|
1366
1367
|
}
|
|
1367
1368
|
} else {
|
|
1368
1369
|
// 直接拼接
|
|
1369
1370
|
for (var key in param_dt) {
|
|
1370
|
-
sql += '
|
|
1371
|
+
sql += ' AND ' + this.escapeId(key) + ' = ' + this.escape(param_dt[key]);
|
|
1371
1372
|
}
|
|
1372
1373
|
}
|
|
1373
1374
|
}
|
|
1374
|
-
return sql.replace(/^
|
|
1375
|
+
return sql.replace(/^ AND /, '');
|
|
1375
1376
|
};
|
|
1376
1377
|
|
|
1377
1378
|
/**
|
|
@@ -1488,12 +1489,12 @@ Sql.prototype.load = async function (file) {
|
|
|
1488
1489
|
}
|
|
1489
1490
|
|
|
1490
1491
|
// 检查文件是否存在
|
|
1491
|
-
if (!
|
|
1492
|
+
if (!hasFile(file)) {
|
|
1492
1493
|
throw new Error(`SQL文件不存在: ${file}`);
|
|
1493
1494
|
}
|
|
1494
1495
|
|
|
1495
1496
|
// 读取SQL文件内容
|
|
1496
|
-
let sql_content =
|
|
1497
|
+
let sql_content = loadText(file);
|
|
1497
1498
|
|
|
1498
1499
|
if (!sql_content || sql_content.trim() === '') {
|
|
1499
1500
|
throw new Error(`SQL文件内容为空: ${file}`);
|