@coherent.js/database 1.0.0-beta.2
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/LICENSE +21 -0
- package/README.md +74 -0
- package/dist/database/adapters/memory.d.ts +48 -0
- package/dist/database/adapters/memory.d.ts.map +1 -0
- package/dist/database/adapters/memory.js +250 -0
- package/dist/database/adapters/memory.js.map +1 -0
- package/dist/database/adapters/mongodb.d.ts +15 -0
- package/dist/database/adapters/mongodb.d.ts.map +1 -0
- package/dist/database/adapters/mongodb.js +216 -0
- package/dist/database/adapters/mongodb.js.map +1 -0
- package/dist/database/adapters/mysql.d.ts +12 -0
- package/dist/database/adapters/mysql.d.ts.map +1 -0
- package/dist/database/adapters/mysql.js +171 -0
- package/dist/database/adapters/mysql.js.map +1 -0
- package/dist/database/adapters/postgresql.d.ts +12 -0
- package/dist/database/adapters/postgresql.d.ts.map +1 -0
- package/dist/database/adapters/postgresql.js +177 -0
- package/dist/database/adapters/postgresql.js.map +1 -0
- package/dist/database/adapters/sqlite.d.ts +15 -0
- package/dist/database/adapters/sqlite.d.ts.map +1 -0
- package/dist/database/adapters/sqlite.js +241 -0
- package/dist/database/adapters/sqlite.js.map +1 -0
- package/dist/database/connection-manager.d.ts +148 -0
- package/dist/database/connection-manager.d.ts.map +1 -0
- package/dist/database/connection-manager.js +377 -0
- package/dist/database/connection-manager.js.map +1 -0
- package/dist/database/index.d.ts +38 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +63 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/middleware.d.ts +122 -0
- package/dist/database/middleware.d.ts.map +1 -0
- package/dist/database/middleware.js +403 -0
- package/dist/database/middleware.js.map +1 -0
- package/dist/database/migration.d.ts +168 -0
- package/dist/database/migration.d.ts.map +1 -0
- package/dist/database/migration.js +946 -0
- package/dist/database/migration.js.map +1 -0
- package/dist/database/model.d.ts +81 -0
- package/dist/database/model.d.ts.map +1 -0
- package/dist/database/model.js +686 -0
- package/dist/database/model.js.map +1 -0
- package/dist/database/query-builder.d.ts +136 -0
- package/dist/database/query-builder.d.ts.map +1 -0
- package/dist/database/query-builder.js +248 -0
- package/dist/database/query-builder.js.map +1 -0
- package/dist/database/utils.d.ts +196 -0
- package/dist/database/utils.d.ts.map +1 -0
- package/dist/database/utils.js +372 -0
- package/dist/database/utils.js.map +1 -0
- package/dist/index.cjs +2286 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.js +2240 -0
- package/dist/index.js.map +7 -0
- package/package.json +52 -0
- package/types/index.d.ts +732 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MySQL Database Adapter for Coherent.js
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview MySQL adapter implementation with connection pooling and transaction support.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create MySQL adapter instance
|
|
8
|
+
*
|
|
9
|
+
* @returns {Object} MySQL adapter instance
|
|
10
|
+
*/
|
|
11
|
+
export function createMySQLAdapter() {
|
|
12
|
+
let mysql = null;
|
|
13
|
+
async function initializeMySQL() {
|
|
14
|
+
if (!mysql) {
|
|
15
|
+
try {
|
|
16
|
+
const mysqlModule = await import('mysql2/promise');
|
|
17
|
+
mysql = mysqlModule.default || mysqlModule;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
throw new Error('mysql2 package is required for MySQL adapter. Install with: npm install mysql2');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
/**
|
|
26
|
+
* Create connection pool
|
|
27
|
+
*/
|
|
28
|
+
async createPool(config) {
|
|
29
|
+
await initializeMySQL();
|
|
30
|
+
const poolConfig = {
|
|
31
|
+
host: config.host,
|
|
32
|
+
port: config.port,
|
|
33
|
+
database: config.database,
|
|
34
|
+
user: config.username,
|
|
35
|
+
password: config.password,
|
|
36
|
+
connectionLimit: config.pool.max,
|
|
37
|
+
acquireTimeout: config.pool.acquireTimeoutMillis,
|
|
38
|
+
timeout: config.pool.createTimeoutMillis,
|
|
39
|
+
reconnect: true,
|
|
40
|
+
charset: 'utf8mb4',
|
|
41
|
+
timezone: 'Z'
|
|
42
|
+
};
|
|
43
|
+
const pool = mysql.createPool(poolConfig);
|
|
44
|
+
return pool;
|
|
45
|
+
},
|
|
46
|
+
/**
|
|
47
|
+
* Test database connection
|
|
48
|
+
*/
|
|
49
|
+
async testConnection(pool) {
|
|
50
|
+
const connection = await pool.getConnection();
|
|
51
|
+
try {
|
|
52
|
+
await connection.query('SELECT 1');
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
connection.release();
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
/**
|
|
59
|
+
* Execute database query
|
|
60
|
+
*/
|
|
61
|
+
async query(pool, sql, params = [], options = {}) {
|
|
62
|
+
const connection = await pool.getConnection();
|
|
63
|
+
try {
|
|
64
|
+
const [rows] = await connection.execute(sql, params);
|
|
65
|
+
if (options.single) {
|
|
66
|
+
return Array.isArray(rows) ? rows[0] || null : rows;
|
|
67
|
+
}
|
|
68
|
+
if (Array.isArray(rows)) {
|
|
69
|
+
return {
|
|
70
|
+
rows,
|
|
71
|
+
rowCount: rows.length,
|
|
72
|
+
affectedRows: rows.affectedRows || rows.length,
|
|
73
|
+
insertId: rows.insertId || null
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
return {
|
|
78
|
+
rows: [],
|
|
79
|
+
rowCount: rows.affectedRows || 0,
|
|
80
|
+
affectedRows: rows.affectedRows || 0,
|
|
81
|
+
insertId: rows.insertId || null
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
connection.release();
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
/**
|
|
90
|
+
* Start database transaction
|
|
91
|
+
*/
|
|
92
|
+
async transaction(pool) {
|
|
93
|
+
const connection = await pool.getConnection();
|
|
94
|
+
await connection.beginTransaction();
|
|
95
|
+
const transaction = {
|
|
96
|
+
connection,
|
|
97
|
+
pool,
|
|
98
|
+
isCommitted: false,
|
|
99
|
+
isRolledBack: false,
|
|
100
|
+
query: async (sql, params, queryOptions) => {
|
|
101
|
+
if (transaction.isCommitted || transaction.isRolledBack) {
|
|
102
|
+
throw new Error('Cannot execute query on completed transaction');
|
|
103
|
+
}
|
|
104
|
+
const [rows] = await connection.execute(sql, params);
|
|
105
|
+
if (queryOptions && queryOptions.single) {
|
|
106
|
+
return Array.isArray(rows) ? rows[0] || null : rows;
|
|
107
|
+
}
|
|
108
|
+
if (Array.isArray(rows)) {
|
|
109
|
+
return {
|
|
110
|
+
rows,
|
|
111
|
+
rowCount: rows.length,
|
|
112
|
+
affectedRows: rows.affectedRows || rows.length,
|
|
113
|
+
insertId: rows.insertId || null
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
return {
|
|
118
|
+
rows: [],
|
|
119
|
+
rowCount: rows.affectedRows || 0,
|
|
120
|
+
affectedRows: rows.affectedRows || 0,
|
|
121
|
+
insertId: rows.insertId || null
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
commit: async () => {
|
|
126
|
+
if (transaction.isCommitted || transaction.isRolledBack) {
|
|
127
|
+
throw new Error('Transaction already completed');
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
await connection.commit();
|
|
131
|
+
transaction.isCommitted = true;
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
connection.release();
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
rollback: async () => {
|
|
138
|
+
if (transaction.isCommitted || transaction.isRolledBack) {
|
|
139
|
+
throw new Error('Transaction already completed');
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
await connection.rollback();
|
|
143
|
+
transaction.isRolledBack = true;
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
connection.release();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
return transaction;
|
|
151
|
+
},
|
|
152
|
+
/**
|
|
153
|
+
* Get pool statistics
|
|
154
|
+
*/
|
|
155
|
+
getPoolStats(pool) {
|
|
156
|
+
return {
|
|
157
|
+
total: pool.config.connectionLimit,
|
|
158
|
+
available: pool._freeConnections ? pool._freeConnections.length : 0,
|
|
159
|
+
acquired: pool._allConnections ? pool._allConnections.length - (pool._freeConnections ? pool._freeConnections.length : 0) : 0,
|
|
160
|
+
waiting: pool._connectionQueue ? pool._connectionQueue.length : 0
|
|
161
|
+
};
|
|
162
|
+
},
|
|
163
|
+
/**
|
|
164
|
+
* Close connection pool
|
|
165
|
+
*/
|
|
166
|
+
async closePool(pool) {
|
|
167
|
+
await pool.end();
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=mysql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../../../../src/database/adapters/mysql.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL Database Adapter for Coherent.js
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview PostgreSQL adapter implementation with connection pooling and advanced features.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create PostgreSQL adapter instance
|
|
8
|
+
*
|
|
9
|
+
* @returns {Object} PostgreSQL adapter instance
|
|
10
|
+
*/
|
|
11
|
+
export function createPostgreSQLAdapter(): Object;
|
|
12
|
+
//# sourceMappingURL=postgresql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgresql.d.ts","sourceRoot":"","sources":["../../../../../src/database/adapters/postgresql.js"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,2CAFa,MAAM,CAgMlB"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL Database Adapter for Coherent.js
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview PostgreSQL adapter implementation with connection pooling and advanced features.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create PostgreSQL adapter instance
|
|
8
|
+
*
|
|
9
|
+
* @returns {Object} PostgreSQL adapter instance
|
|
10
|
+
*/
|
|
11
|
+
export function createPostgreSQLAdapter() {
|
|
12
|
+
let pg = null;
|
|
13
|
+
async function initializePostgreSQL() {
|
|
14
|
+
if (!pg) {
|
|
15
|
+
try {
|
|
16
|
+
const pgModule = await import('pg');
|
|
17
|
+
pg = pgModule.default || pgModule;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
throw new Error('pg package is required for PostgreSQL adapter. Install with: npm install pg');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function convertPlaceholders(sql) {
|
|
25
|
+
let index = 1;
|
|
26
|
+
return sql.replace(/\?/g, () => `$${index++}`);
|
|
27
|
+
}
|
|
28
|
+
function extractInsertId(result) {
|
|
29
|
+
if (result.rows && result.rows.length > 0) {
|
|
30
|
+
const row = result.rows[0];
|
|
31
|
+
return row.id || row.insertId || row.lastval || null;
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
/**
|
|
37
|
+
* Create connection pool
|
|
38
|
+
*/
|
|
39
|
+
async createPool(config) {
|
|
40
|
+
await initializePostgreSQL();
|
|
41
|
+
const poolConfig = {
|
|
42
|
+
host: config.host,
|
|
43
|
+
port: config.port,
|
|
44
|
+
database: config.database,
|
|
45
|
+
user: config.username,
|
|
46
|
+
password: config.password,
|
|
47
|
+
min: config.pool.min,
|
|
48
|
+
max: config.pool.max,
|
|
49
|
+
acquireTimeoutMillis: config.pool.acquireTimeoutMillis,
|
|
50
|
+
createTimeoutMillis: config.pool.createTimeoutMillis,
|
|
51
|
+
destroyTimeoutMillis: config.pool.destroyTimeoutMillis,
|
|
52
|
+
idleTimeoutMillis: config.pool.idleTimeoutMillis,
|
|
53
|
+
reapIntervalMillis: config.pool.reapIntervalMillis,
|
|
54
|
+
createRetryIntervalMillis: config.pool.createRetryIntervalMillis,
|
|
55
|
+
ssl: config.ssl || false
|
|
56
|
+
};
|
|
57
|
+
const pool = new pg.Pool(poolConfig);
|
|
58
|
+
pool.on('error', (err) => {
|
|
59
|
+
console.error('PostgreSQL pool error:', err);
|
|
60
|
+
});
|
|
61
|
+
return pool;
|
|
62
|
+
},
|
|
63
|
+
/**
|
|
64
|
+
* Test database connection
|
|
65
|
+
*/
|
|
66
|
+
async testConnection(pool) {
|
|
67
|
+
const client = await pool.connect();
|
|
68
|
+
try {
|
|
69
|
+
await client.query('SELECT 1');
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
client.release();
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
/**
|
|
76
|
+
* Execute database query
|
|
77
|
+
*/
|
|
78
|
+
async query(pool, sql, params = [], options = {}) {
|
|
79
|
+
const client = await pool.connect();
|
|
80
|
+
try {
|
|
81
|
+
const pgSql = convertPlaceholders(sql);
|
|
82
|
+
const result = await client.query(pgSql, params);
|
|
83
|
+
if (options.single) {
|
|
84
|
+
return result.rows[0] || null;
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
rows: result.rows,
|
|
88
|
+
rowCount: result.rowCount,
|
|
89
|
+
affectedRows: result.rowCount,
|
|
90
|
+
insertId: extractInsertId(result)
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
client.release();
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
/**
|
|
98
|
+
* Start database transaction
|
|
99
|
+
*/
|
|
100
|
+
async transaction(pool, options = {}) {
|
|
101
|
+
const client = await pool.connect();
|
|
102
|
+
let beginSql = 'BEGIN';
|
|
103
|
+
if (options.isolationLevel) {
|
|
104
|
+
beginSql += ` ISOLATION LEVEL ${options.isolationLevel}`;
|
|
105
|
+
}
|
|
106
|
+
if (options.readOnly) {
|
|
107
|
+
beginSql += ' READ ONLY';
|
|
108
|
+
}
|
|
109
|
+
await client.query(beginSql);
|
|
110
|
+
const transaction = {
|
|
111
|
+
client,
|
|
112
|
+
pool,
|
|
113
|
+
isCommitted: false,
|
|
114
|
+
isRolledBack: false,
|
|
115
|
+
query: async (sql, params, queryOptions) => {
|
|
116
|
+
if (transaction.isCommitted || transaction.isRolledBack) {
|
|
117
|
+
throw new Error('Cannot execute query on completed transaction');
|
|
118
|
+
}
|
|
119
|
+
const pgSql = convertPlaceholders(sql);
|
|
120
|
+
const result = await client.query(pgSql, params);
|
|
121
|
+
if (queryOptions && queryOptions.single) {
|
|
122
|
+
return result.rows[0] || null;
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
rows: result.rows,
|
|
126
|
+
rowCount: result.rowCount,
|
|
127
|
+
affectedRows: result.rowCount,
|
|
128
|
+
insertId: extractInsertId(result)
|
|
129
|
+
};
|
|
130
|
+
},
|
|
131
|
+
commit: async () => {
|
|
132
|
+
if (transaction.isCommitted || transaction.isRolledBack) {
|
|
133
|
+
throw new Error('Transaction already completed');
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
await client.query('COMMIT');
|
|
137
|
+
transaction.isCommitted = true;
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
client.release();
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
rollback: async () => {
|
|
144
|
+
if (transaction.isCommitted || transaction.isRolledBack) {
|
|
145
|
+
throw new Error('Transaction already completed');
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
await client.query('ROLLBACK');
|
|
149
|
+
transaction.isRolledBack = true;
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
client.release();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
return transaction;
|
|
157
|
+
},
|
|
158
|
+
/**
|
|
159
|
+
* Get pool statistics
|
|
160
|
+
*/
|
|
161
|
+
getPoolStats(pool) {
|
|
162
|
+
return {
|
|
163
|
+
total: pool.totalCount,
|
|
164
|
+
available: pool.idleCount,
|
|
165
|
+
acquired: pool.totalCount - pool.idleCount,
|
|
166
|
+
waiting: pool.waitingCount
|
|
167
|
+
};
|
|
168
|
+
},
|
|
169
|
+
/**
|
|
170
|
+
* Close connection pool
|
|
171
|
+
*/
|
|
172
|
+
async closePool(pool) {
|
|
173
|
+
await pool.end();
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=postgresql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgresql.js","sourceRoot":"","sources":["../../../../../src/database/adapters/postgresql.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Database Adapter for Coherent.js
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview SQLite adapter implementation with connection pooling and transaction support.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create a new SQLite adapter instance
|
|
8
|
+
*
|
|
9
|
+
* @returns {Object} SQLite adapter instance with database operations
|
|
10
|
+
*/
|
|
11
|
+
export function createSQLiteAdapter(): Object;
|
|
12
|
+
export namespace SQLiteAdapter {
|
|
13
|
+
export { createSQLiteAdapter as create };
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../../../src/database/adapters/sqlite.js"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,uCAFa,MAAM,CAmQlB"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Database Adapter for Coherent.js
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview SQLite adapter implementation with connection pooling and transaction support.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create a new SQLite adapter instance
|
|
8
|
+
*
|
|
9
|
+
* @returns {Object} SQLite adapter instance with database operations
|
|
10
|
+
*/
|
|
11
|
+
export function createSQLiteAdapter() {
|
|
12
|
+
let sqlite3 = null;
|
|
13
|
+
let db = null;
|
|
14
|
+
/**
|
|
15
|
+
* Initialize SQLite module
|
|
16
|
+
*
|
|
17
|
+
* @private
|
|
18
|
+
* @returns {Promise<void>}
|
|
19
|
+
*/
|
|
20
|
+
async function initializeSQLite() {
|
|
21
|
+
if (!sqlite3) {
|
|
22
|
+
try {
|
|
23
|
+
// Try to import sqlite3 (peer dependency)
|
|
24
|
+
const sqlite3Module = await import('sqlite3');
|
|
25
|
+
sqlite3 = sqlite3Module.default || sqlite3Module;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
throw new Error('Failed to load sqlite3 module. Make sure to install it: npm install sqlite3');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Connect to the database
|
|
34
|
+
*
|
|
35
|
+
* @param {Object} config - Database configuration
|
|
36
|
+
* @param {string} config.database - Path to the SQLite database file
|
|
37
|
+
* @param {boolean} [config.readonly=false] - Open the database in read-only mode
|
|
38
|
+
* @returns {Promise<Object>} The database adapter instance
|
|
39
|
+
*/
|
|
40
|
+
async function connect(config) {
|
|
41
|
+
await initializeSQLite();
|
|
42
|
+
return new Promise((resolve, reject) => {
|
|
43
|
+
try {
|
|
44
|
+
db = new sqlite3.Database(config.database, config.readonly ? sqlite3.OPEN_READONLY : sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, (err) => {
|
|
45
|
+
if (err) {
|
|
46
|
+
return reject(new Error(`Failed to connect to SQLite database: ${err.message}`));
|
|
47
|
+
}
|
|
48
|
+
// Enable foreign keys by default
|
|
49
|
+
db.run('PRAGMA foreign_keys = ON');
|
|
50
|
+
// Enable WAL mode for better concurrency
|
|
51
|
+
db.run('PRAGMA journal_mode = WAL');
|
|
52
|
+
// Set busy timeout to handle concurrent write operations
|
|
53
|
+
db.run('PRAGMA busy_timeout = 5000');
|
|
54
|
+
resolve(instance);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
reject(new Error(`Failed to connect to SQLite database: ${error.message}`));
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Execute a SQL query
|
|
64
|
+
*
|
|
65
|
+
* @param {string} sql - SQL query string
|
|
66
|
+
* @param {Array} [params=[]] - Query parameters
|
|
67
|
+
* @returns {Promise<{rows: Array<Object>}>} Query result
|
|
68
|
+
*/
|
|
69
|
+
function query(sql, params = []) {
|
|
70
|
+
return new Promise((resolve, reject) => {
|
|
71
|
+
if (!db) {
|
|
72
|
+
return reject(new Error('Database connection not established. Call connect() first.'));
|
|
73
|
+
}
|
|
74
|
+
db.all(sql, params, (err, rows) => {
|
|
75
|
+
if (err) {
|
|
76
|
+
return reject(new Error(`SQLite query error: ${err.message}`));
|
|
77
|
+
}
|
|
78
|
+
resolve({ rows });
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Execute a SQL statement
|
|
84
|
+
*
|
|
85
|
+
* @param {string} sql - SQL statement
|
|
86
|
+
* @param {Array} [params=[]] - Statement parameters
|
|
87
|
+
* @returns {Promise<{affectedRows: number, insertId: number}>} Execution result
|
|
88
|
+
*/
|
|
89
|
+
function execute(sql, params = []) {
|
|
90
|
+
return new Promise((resolve, reject) => {
|
|
91
|
+
if (!db) {
|
|
92
|
+
return reject(new Error('Database connection not established. Call connect() first.'));
|
|
93
|
+
}
|
|
94
|
+
db.run(sql, params, function (err) {
|
|
95
|
+
if (err) {
|
|
96
|
+
return reject(new Error(`SQLite execute error: ${err.message}`));
|
|
97
|
+
}
|
|
98
|
+
resolve({
|
|
99
|
+
affectedRows: this.changes,
|
|
100
|
+
insertId: this.lastID
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Begin a transaction
|
|
107
|
+
*
|
|
108
|
+
* @returns {Promise<void>}
|
|
109
|
+
*/
|
|
110
|
+
function beginTransaction() {
|
|
111
|
+
return new Promise((resolve, reject) => {
|
|
112
|
+
if (!db) {
|
|
113
|
+
return reject(new Error('Database connection not established. Call connect() first.'));
|
|
114
|
+
}
|
|
115
|
+
db.run('BEGIN TRANSACTION', (err) => {
|
|
116
|
+
if (err) {
|
|
117
|
+
return reject(new Error(`Failed to begin transaction: ${err.message}`));
|
|
118
|
+
}
|
|
119
|
+
resolve();
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Commit a transaction
|
|
125
|
+
*
|
|
126
|
+
* @returns {Promise<void>}
|
|
127
|
+
*/
|
|
128
|
+
function commit() {
|
|
129
|
+
return new Promise((resolve, reject) => {
|
|
130
|
+
if (!db) {
|
|
131
|
+
return reject(new Error('Database connection not established. Call connect() first.'));
|
|
132
|
+
}
|
|
133
|
+
db.run('COMMIT', (err) => {
|
|
134
|
+
if (err) {
|
|
135
|
+
return reject(new Error(`Failed to commit transaction: ${err.message}`));
|
|
136
|
+
}
|
|
137
|
+
resolve();
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Rollback a transaction
|
|
143
|
+
*
|
|
144
|
+
* @returns {Promise<void>}
|
|
145
|
+
*/
|
|
146
|
+
function rollback() {
|
|
147
|
+
return new Promise((resolve, reject) => {
|
|
148
|
+
if (!db) {
|
|
149
|
+
return reject(new Error('Database connection not established. Call connect() first.'));
|
|
150
|
+
}
|
|
151
|
+
db.run('ROLLBACK', (err) => {
|
|
152
|
+
if (err) {
|
|
153
|
+
return reject(new Error(`Failed to rollback transaction: ${err.message}`));
|
|
154
|
+
}
|
|
155
|
+
resolve();
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Disconnect from the database
|
|
161
|
+
*
|
|
162
|
+
* @returns {Promise<void>}
|
|
163
|
+
*/
|
|
164
|
+
function disconnect() {
|
|
165
|
+
return new Promise((resolve, reject) => {
|
|
166
|
+
if (!db) {
|
|
167
|
+
return resolve();
|
|
168
|
+
}
|
|
169
|
+
db.close((err) => {
|
|
170
|
+
if (err) {
|
|
171
|
+
return reject(new Error(`Failed to close database connection: ${err.message}`));
|
|
172
|
+
}
|
|
173
|
+
db = null;
|
|
174
|
+
resolve();
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get the underlying database connection
|
|
180
|
+
*
|
|
181
|
+
* @returns {Object} The database connection
|
|
182
|
+
*/
|
|
183
|
+
function getConnection() {
|
|
184
|
+
if (!db) {
|
|
185
|
+
throw new Error('Database connection not established. Call connect() first.');
|
|
186
|
+
}
|
|
187
|
+
return db;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Ping the database to check if connection is alive
|
|
191
|
+
*
|
|
192
|
+
* @returns {Promise<boolean>} True if connection is alive
|
|
193
|
+
*/
|
|
194
|
+
async function ping() {
|
|
195
|
+
try {
|
|
196
|
+
await query('SELECT 1');
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Escape a value for SQL queries
|
|
205
|
+
*
|
|
206
|
+
* @param {*} value - Value to escape
|
|
207
|
+
* @returns {string} Escaped value
|
|
208
|
+
*/
|
|
209
|
+
function escape(value) {
|
|
210
|
+
if (value === null || value === undefined) {
|
|
211
|
+
return 'NULL';
|
|
212
|
+
}
|
|
213
|
+
if (typeof value === 'boolean') {
|
|
214
|
+
return value ? '1' : '0';
|
|
215
|
+
}
|
|
216
|
+
if (typeof value === 'number') {
|
|
217
|
+
return String(value);
|
|
218
|
+
}
|
|
219
|
+
// Escape single quotes by doubling them
|
|
220
|
+
return `'${String(value).replace(/'/g, "''")}'`;
|
|
221
|
+
}
|
|
222
|
+
// Public API
|
|
223
|
+
const instance = {
|
|
224
|
+
connect,
|
|
225
|
+
query,
|
|
226
|
+
execute,
|
|
227
|
+
beginTransaction,
|
|
228
|
+
commit,
|
|
229
|
+
rollback,
|
|
230
|
+
disconnect,
|
|
231
|
+
getConnection,
|
|
232
|
+
ping,
|
|
233
|
+
escape,
|
|
234
|
+
// Alias for backward compatibility
|
|
235
|
+
run: execute
|
|
236
|
+
};
|
|
237
|
+
return instance;
|
|
238
|
+
}
|
|
239
|
+
// For backward compatibility
|
|
240
|
+
export const SQLiteAdapter = { create: createSQLiteAdapter };
|
|
241
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../../../src/database/adapters/sqlite.js"],"names":[],"mappings":"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"}
|