mm_sqlite 1.5.5 → 1.5.7

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.
@@ -1,4 +1,4 @@
1
- const Database = require('better-sqlite3');
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
- // 创建最小连接数(better-sqlite3是同步的,无需await)
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
- // 关闭所有连接(better-sqlite3的close是同步的)
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连接(better-sqlite3,同步创建)
189
+ * 创建SQLite连接(node:sqlite DatabaseSync,同步创建)
190
190
  * @private
191
191
  * @returns {object} 数据库连接对象
192
192
  */
193
193
  _createConnection() {
194
- const db = new Database(this._getDbFilename(), {
194
+ const db = new DatabaseSync(this._getDbFilename(), {
195
195
  timeout: this.config.connect_timeout || 5000
196
196
  });
197
197
  // 启用WAL模式,提升并发读取性能
198
- db.pragma('journal_mode = WAL');
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();
@@ -4,7 +4,8 @@
4
4
  * @version 1.2
5
5
  */
6
6
  const SqlString = require('sqlstring');
7
- const { Base } = require('mm_expand');
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 += ' || ' + tpl.replaceAll('{0}', escaped_val.trim("'"));
1311
+ sl += ' OR ' + tpl.replaceAll('{0}', escaped_val.trim("'"));
1311
1312
  }
1312
- sl = sl.replace(' || ', '') + ')';
1313
- sql += ' && ' + sl;
1313
+ sl = sl.replace(' OR ', '') + ')';
1314
+ sql += ' AND ' + sl;
1314
1315
  } else {
1315
1316
  // 使用直接替换方式,避免模板替换错误
1316
1317
  let escaped_val = this.escape(value);
1317
- sql += ' && ' + tpl.replaceAll('{0}', escaped_val.trim("'"));
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 += ' || ' + this.escapeId(key) + ' = ' + this.escape(arr[i]);
1326
+ sl += ' OR ' + this.escapeId(key) + ' = ' + this.escape(arr[i]);
1326
1327
  }
1327
- sl = sl.replace(' || ', '') + ')';
1328
- sql += ' && ' + sl;
1328
+ sl = sl.replace(' OR ', '') + ')';
1329
+ sql += ' AND ' + sl;
1329
1330
  } else {
1330
- sql += ' && ' + this.escapeId(key) + ' = ' + this.escape(value);
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 += ' && ' + sql.replaceAll('{0}', value.trim("'"));
1341
+ sql += ' AND ' + sql.replaceAll('{0}', value.trim("'"));
1341
1342
  } else {
1342
- sql += ' && ' + this.escapeId(key) + ' = ' + value;
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 += ' || ' + this.escapeId(key) + ' = ' + this.escape(arr[i]);
1360
+ sl += ' OR ' + this.escapeId(key) + ' = ' + this.escape(arr[i]);
1360
1361
  }
1361
- sl = sl.replace(' || ', '') + ')';
1362
- sql += ' && ' + sl;
1362
+ sl = sl.replace(' OR ', '') + ')';
1363
+ sql += ' AND ' + sl;
1363
1364
  } else {
1364
- sql += ' && ' + this.escapeId(key) + ' = ' + this.escape(value);
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 += ' && ' + this.escapeId(key) + ' = ' + this.escape(param_dt[key]);
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
  /**
@@ -1381,25 +1382,29 @@ Sql.prototype.tplQuery = function (param_dt, sql_dt) {
1381
1382
  * @returns {string} 返回拼接的查询参数
1382
1383
  */
1383
1384
  Sql.prototype.tplBody = function (param_dt, sql_dt) {
1384
- var sql = '';
1385
- if (!sql_dt || sql_dt.length === 0) {
1385
+ if (!param_dt) {
1386
+ return '';
1387
+ }
1388
+ var parts = [];
1389
+ if (!sql_dt || Object.keys(sql_dt).length === 0) {
1386
1390
  for (var key in param_dt) {
1387
- sql += ', ' + this.escapeId(key) + ' = ' + this.escape(val[key]);
1391
+ parts.push(this.escapeId(key) + ' = ' + this.escape(param_dt[key]));
1388
1392
  }
1389
1393
  } else {
1390
- for (var key in param_dt) {
1391
- var value = this.escape(param_dt[key]);
1392
- let sql = sql_dt[key];
1393
- if (sql) {
1394
+ for (var k in param_dt) {
1395
+ var value = this.escape(param_dt[k]);
1396
+ // 不能再用 sql 作局部变量名,否则会遮蔽累加结果,SET 子句恒为空
1397
+ var tpl = sql_dt[k];
1398
+ if (tpl) {
1394
1399
  // 使用直接替换方式,避免模板替换错误
1395
- let replaced = sql.replaceAll('{0}', value.trim("'"));
1396
- sql += ', ' + replaced.replace('+ -', '- ').replace('- -', '+ ');
1400
+ var replaced = tpl.replaceAll('{0}', value.trim("'"));
1401
+ parts.push(replaced.replace(/\+ -/g, '- ').replace(/- -/g, '+ '));
1397
1402
  } else {
1398
- sql += ', ' + this.escapeId(key) + ' = ' + value;
1403
+ parts.push(this.escapeId(k) + ' = ' + value);
1399
1404
  }
1400
1405
  }
1401
1406
  }
1402
- return sql.replace(/^, /, '');
1407
+ return parts.join(', ');
1403
1408
  };
1404
1409
 
1405
1410
  /**
@@ -1488,12 +1493,12 @@ Sql.prototype.load = async function (file) {
1488
1493
  }
1489
1494
 
1490
1495
  // 检查文件是否存在
1491
- if (!file.hasFile()) {
1496
+ if (!hasFile(file)) {
1492
1497
  throw new Error(`SQL文件不存在: ${file}`);
1493
1498
  }
1494
1499
 
1495
1500
  // 读取SQL文件内容
1496
- let sql_content = await $.file.readText(file);
1501
+ let sql_content = loadText(file);
1497
1502
 
1498
1503
  if (!sql_content || sql_content.trim() === '') {
1499
1504
  throw new Error(`SQL文件内容为空: ${file}`);