@effect/sql-sqlite-node 4.0.0-beta.92 → 4.0.0-beta.94

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # `@effect/sql-sqlite-node`
2
2
 
3
- An `@effect/sql` implementation using the `better-sqlite3` library.
3
+ An `@effect/sql` implementation using Node.js' built-in `node:sqlite` module.
4
4
 
5
5
  ## Documentation
6
6
 
@@ -30,7 +30,6 @@ export type TypeId = "~@effect/sql-sqlite-node/SqliteClient";
30
30
  export interface SqliteClient extends Client.SqlClient {
31
31
  readonly [TypeId]: TypeId;
32
32
  readonly config: SqliteClientConfig;
33
- readonly export: Effect.Effect<Uint8Array, SqlError>;
34
33
  readonly backup: (destination: string) => Effect.Effect<BackupMetadata, SqlError>;
35
34
  readonly loadExtension: (path: string) => Effect.Effect<void, SqlError>;
36
35
  /** Not supported in sqlite */
@@ -54,7 +53,7 @@ export interface BackupMetadata {
54
53
  */
55
54
  export declare const SqliteClient: Context.Service<SqliteClient, SqliteClient>;
56
55
  /**
57
- * Configuration for a node SQLite client backed by `better-sqlite3`, including the database filename, read-only mode, statement cache settings, WAL behavior, span attributes, and query/result name transforms.
56
+ * Configuration for a node SQLite client backed by `node:sqlite`, including the database filename, read-only mode, statement cache settings, WAL behavior, span attributes, and query/result name transforms.
58
57
  *
59
58
  * @category models
60
59
  * @since 4.0.0
@@ -1 +1 @@
1
- {"version":3,"file":"SqliteClient.d.ts","sourceRoot":"","sources":["../src/SqliteClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SqliteClient.d.ts","sourceRoot":"","sources":["../src/SqliteClient.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAGrC,OAAO,KAAK,UAAU,MAAM,uCAAuC,CAAA;AACnE,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAA;AAEvD,OAAO,EAAuB,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAO5E;;;;;GAKG;AACH,eAAO,MAAM,MAAM,EAAE,MAAgD,CAAA;AAErE;;;;;GAKG;AACH,MAAM,MAAM,MAAM,GAAG,uCAAuC,CAAA;AAE5D;;;;;GAKG;AACH,MAAM,WAAW,YAAa,SAAQ,MAAM,CAAC,SAAS;IACpD,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAA;IACnC,QAAQ,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAA;IACjF,QAAQ,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAEvE,8BAA8B;IAC9B,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAA;CAC7B;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAChC;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,6CAAwE,CAAA;AAEjG;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9C,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAA;IACrD,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACzC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;IAE7D,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAA;IACrE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAA;CACrE;AAOD;;;;;GAKG;AACH,eAAO,MAAM,IAAI,GACf,SAAS,kBAAkB,KAC1B,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,CA4MrE,CAAA;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GACtB,QAAQ,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,KACtC,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAUzB,CAAA;AAEzC;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAChB,QAAQ,kBAAkB,KACzB,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,CAML,CAAA"}
@@ -1,15 +1,14 @@
1
1
  /**
2
- * Connects Effect SQL to SQLite on Node.js using `better-sqlite3`.
2
+ * Connects Effect SQL to SQLite on Node.js using `node:sqlite`.
3
3
  *
4
4
  * This module opens a SQLite database and exposes it as both `SqliteClient` and
5
5
  * the generic Effect SQL client. It serializes access through one connection,
6
6
  * caches prepared statements, enables WAL mode unless disabled, and supports
7
- * database export, backup, and extension loading. Streaming queries and
7
+ * database backup, and extension loading. Streaming queries and
8
8
  * `updateValues` are not supported by this driver.
9
9
  *
10
10
  * @since 4.0.0
11
11
  */
12
- import Sqlite from "better-sqlite3";
13
12
  import * as Cache from "effect/Cache";
14
13
  import * as Config from "effect/Config";
15
14
  import * as Context from "effect/Context";
@@ -25,11 +24,8 @@ import * as Reactivity from "effect/unstable/reactivity/Reactivity";
25
24
  import * as Client from "effect/unstable/sql/SqlClient";
26
25
  import { classifySqliteError, SqlError } from "effect/unstable/sql/SqlError";
27
26
  import * as Statement from "effect/unstable/sql/Statement";
27
+ import { backup as backupDatabase, DatabaseSync } from "node:sqlite";
28
28
  const ATTR_DB_SYSTEM_NAME = "db.system.name";
29
- const classifyError = (cause, message, operation) => classifySqliteError(cause, {
30
- message,
31
- operation
32
- });
33
29
  /**
34
30
  * Runtime type identifier used to mark Node `SqliteClient` values.
35
31
  *
@@ -55,12 +51,14 @@ export const make = options => Effect.gen(function* () {
55
51
  const transformRows = options.transformResultNames ? Statement.defaultTransforms(options.transformResultNames).array : undefined;
56
52
  const makeConnection = Effect.gen(function* () {
57
53
  const scope = yield* Effect.scope;
58
- const db = new Sqlite(options.filename, {
59
- readonly: options.readonly ?? false
54
+ const db = new DatabaseSync(options.filename, {
55
+ readOnly: options.readonly ?? false,
56
+ allowExtension: true
60
57
  });
61
58
  yield* Scope.addFinalizer(scope, Effect.sync(() => db.close()));
59
+ db.enableLoadExtension(false);
62
60
  if (options.disableWAL !== true) {
63
- db.pragma("journal_mode = WAL");
61
+ db.exec("PRAGMA journal_mode = WAL");
64
62
  }
65
63
  const prepareCache = yield* Cache.make({
66
64
  capacity: options.prepareCacheSize ?? 200,
@@ -73,49 +71,63 @@ export const make = options => Effect.gen(function* () {
73
71
  })
74
72
  });
75
73
  const runStatement = (statement, params, raw) => Effect.withFiber(fiber => {
76
- if (Context.get(fiber.context, Client.SafeIntegers)) {
77
- statement.safeIntegers(true);
78
- }
79
- try {
80
- if (statement.reader) {
81
- return Effect.succeed(statement.all(...params));
82
- }
83
- const result = statement.run(...params);
84
- return Effect.succeed(raw ? result : []);
85
- } catch (cause) {
86
- return Effect.fail(new SqlError({
74
+ const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers);
75
+ return Effect.try({
76
+ try: () => {
77
+ statement.setReadBigInts(useSafeIntegers);
78
+ if (statement.columns().length > 0) {
79
+ return statement.all(...params);
80
+ }
81
+ const result = statement.run(...params);
82
+ return raw ? {
83
+ changes: result.changes,
84
+ lastInsertRowid: result.lastInsertRowid
85
+ } : [];
86
+ },
87
+ catch: cause => new SqlError({
87
88
  reason: classifyError(cause, "Failed to execute statement", "execute")
88
- }));
89
- }
89
+ })
90
+ });
90
91
  });
91
- const run = (sql, params, raw = false) => Effect.flatMap(Cache.get(prepareCache, sql), s => runStatement(s, params, raw));
92
- const runValues = (sql, params) => Effect.acquireUseRelease(Cache.get(prepareCache, sql), statement => Effect.try({
93
- try: () => {
94
- if (statement.reader) {
95
- statement.raw(true);
96
- return statement.all(...params);
97
- }
98
- statement.run(...params);
99
- return [];
100
- },
101
- catch: cause => new SqlError({
102
- reason: classifyError(cause, "Failed to execute statement", "execute")
103
- })
104
- }), statement => Effect.sync(() => statement.reader && statement.raw(false)));
105
- const runValuesUnprepared = (sql, params) => Effect.try({
106
- try: () => {
107
- const statement = db.prepare(sql);
108
- if (statement.reader) {
109
- statement.raw(true);
110
- return statement.all(...params);
111
- }
112
- statement.run(...params);
113
- return [];
114
- },
115
- catch: cause => new SqlError({
116
- reason: classifyError(cause, "Failed to execute statement", "execute")
117
- })
92
+ const runStatementValues = (statement, params) => Effect.withFiber(fiber => {
93
+ const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers);
94
+ return Effect.try({
95
+ try: () => {
96
+ statement.setReadBigInts(useSafeIntegers);
97
+ if (statement.columns().length > 0) {
98
+ return statement.all(...params);
99
+ }
100
+ statement.run(...params);
101
+ return [];
102
+ },
103
+ catch: cause => new SqlError({
104
+ reason: classifyError(cause, "Failed to execute statement", "execute")
105
+ })
106
+ });
118
107
  });
108
+ const runStatementValuesUnprepared = (statement, params) => Effect.withFiber(fiber => {
109
+ const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers);
110
+ return Effect.try({
111
+ try: () => {
112
+ statement.setReadBigInts(useSafeIntegers);
113
+ statement.setReturnArrays(true);
114
+ if (statement.columns().length > 0) {
115
+ return statement.all(...params);
116
+ }
117
+ statement.run(...params);
118
+ return [];
119
+ },
120
+ catch: cause => new SqlError({
121
+ reason: classifyError(cause, "Failed to execute statement", "execute")
122
+ })
123
+ });
124
+ });
125
+ const run = (sql, params, raw = false) => Effect.flatMap(Cache.get(prepareCache, sql), s => runStatement(s, params, raw));
126
+ const runValues = (sql, params) => Effect.acquireUseRelease(Cache.get(prepareCache, sql), statement => {
127
+ statement.setReturnArrays(true);
128
+ return runStatementValues(statement, params);
129
+ }, statement => Effect.sync(() => statement.setReturnArrays(false)));
130
+ const runValuesUnprepared = (sql, params) => runStatementValuesUnprepared(db.prepare(sql), params);
119
131
  return identity({
120
132
  execute(sql, params, transformRows) {
121
133
  return transformRows ? Effect.map(run(sql, params), transformRows) : run(sql, params);
@@ -136,27 +148,31 @@ export const make = options => Effect.gen(function* () {
136
148
  executeStream(_sql, _params) {
137
149
  return Stream.die("executeStream not implemented");
138
150
  },
139
- export: Effect.try({
140
- try: () => db.serialize(),
141
- catch: cause => new SqlError({
142
- reason: classifyError(cause, "Failed to export database", "export")
143
- })
144
- }),
145
151
  backup(destination) {
146
- return Effect.tryPromise({
147
- try: () => db.backup(destination),
148
- catch: cause => new SqlError({
149
- reason: classifyError(cause, "Failed to backup database", "backup")
150
- })
152
+ return Effect.suspend(() => {
153
+ let totalPages = 0;
154
+ return Effect.tryPromise({
155
+ try: () => backupDatabase(db, destination, {
156
+ progress: progress => {
157
+ totalPages = progress.totalPages;
158
+ }
159
+ }).then(pages => ({
160
+ totalPages: totalPages || pages,
161
+ remainingPages: 0
162
+ })),
163
+ catch: cause => new SqlError({
164
+ reason: classifyError(cause, "Failed to backup database", "backup")
165
+ })
166
+ });
151
167
  });
152
168
  },
153
169
  loadExtension(path) {
154
- return Effect.try({
170
+ return Effect.acquireUseRelease(Effect.sync(() => db.enableLoadExtension(true)), () => Effect.try({
155
171
  try: () => db.loadExtension(path),
156
172
  catch: cause => new SqlError({
157
173
  reason: classifyError(cause, "Failed to load extension", "loadExtension")
158
174
  })
159
- });
175
+ }), () => Effect.sync(() => db.enableLoadExtension(false)));
160
176
  }
161
177
  });
162
178
  });
@@ -177,7 +193,6 @@ export const make = options => Effect.gen(function* () {
177
193
  }), {
178
194
  [TypeId]: TypeId,
179
195
  config: options,
180
- export: Effect.flatMap(acquirer, _ => _.export),
181
196
  backup: destination => Effect.flatMap(acquirer, _ => _.backup(destination)),
182
197
  loadExtension: path => Effect.flatMap(acquirer, _ => _.loadExtension(path))
183
198
  });
@@ -196,4 +211,21 @@ export const layerConfig = config => Layer.effectContext(Config.unwrap(config).p
196
211
  * @since 4.0.0
197
212
  */
198
213
  export const layer = config => Layer.effectContext(Effect.map(make(config), client => Context.make(SqliteClient, client).pipe(Context.add(Client.SqlClient, client)))).pipe(Layer.provide(Reactivity.layer));
214
+ // internal
215
+ const classifyError = (cause, message, operation) => classifySqliteError(sqliteCauseWithErrno(cause), {
216
+ message,
217
+ operation
218
+ });
219
+ const sqliteCauseWithErrno = cause => {
220
+ if (typeof cause !== "object" || cause === null || !("errcode" in cause) || "errno" in cause) {
221
+ return cause;
222
+ }
223
+ const errcode = cause.errcode;
224
+ if (typeof errcode !== "number") {
225
+ return cause;
226
+ }
227
+ return Object.assign(cause, {
228
+ errno: errcode
229
+ });
230
+ };
199
231
  //# sourceMappingURL=SqliteClient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SqliteClient.js","names":["Sqlite","Cache","Config","Context","Duration","Effect","Fiber","identity","Layer","Scope","Semaphore","Stream","Reactivity","Client","classifySqliteError","SqlError","Statement","ATTR_DB_SYSTEM_NAME","classifyError","cause","message","operation","TypeId","SqliteClient","Service","make","options","gen","compiler","makeCompilerSqlite","transformQueryNames","transformRows","transformResultNames","defaultTransforms","array","undefined","makeConnection","scope","db","filename","readonly","addFinalizer","sync","close","disableWAL","pragma","prepareCache","capacity","prepareCacheSize","timeToLive","prepareCacheTTL","minutes","lookup","sql","try","prepare","catch","reason","runStatement","statement","params","raw","withFiber","fiber","get","context","SafeIntegers","safeIntegers","reader","succeed","all","result","run","fail","flatMap","s","runValues","acquireUseRelease","runValuesUnprepared","execute","map","executeRaw","executeValues","executeValuesUnprepared","executeUnprepared","effect","executeStream","_sql","_params","die","export","serialize","backup","destination","tryPromise","loadExtension","path","semaphore","connection","acquirer","withPermits","transactionAcquirer","uninterruptibleMask","restore","getCurrent","getUnsafe","as","tap","take","release","Object","assign","spanAttributes","entries","config","_","layerConfig","effectContext","unwrap","pipe","client","add","SqlClient","provide","layer"],"sources":["../src/SqliteClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"SqliteClient.js","names":["Cache","Config","Context","Duration","Effect","Fiber","identity","Layer","Scope","Semaphore","Stream","Reactivity","Client","classifySqliteError","SqlError","Statement","backup","backupDatabase","DatabaseSync","ATTR_DB_SYSTEM_NAME","TypeId","SqliteClient","Service","make","options","gen","compiler","makeCompilerSqlite","transformQueryNames","transformRows","transformResultNames","defaultTransforms","array","undefined","makeConnection","scope","db","filename","readOnly","readonly","allowExtension","addFinalizer","sync","close","enableLoadExtension","disableWAL","exec","prepareCache","capacity","prepareCacheSize","timeToLive","prepareCacheTTL","minutes","lookup","sql","try","prepare","catch","cause","reason","classifyError","runStatement","statement","params","raw","withFiber","fiber","useSafeIntegers","get","context","SafeIntegers","setReadBigInts","columns","length","all","result","run","changes","lastInsertRowid","runStatementValues","runStatementValuesUnprepared","setReturnArrays","flatMap","s","runValues","acquireUseRelease","runValuesUnprepared","execute","map","executeRaw","executeValues","executeValuesUnprepared","executeUnprepared","effect","executeStream","_sql","_params","die","destination","suspend","totalPages","tryPromise","progress","then","pages","remainingPages","loadExtension","path","semaphore","connection","acquirer","withPermits","succeed","transactionAcquirer","uninterruptibleMask","restore","getCurrent","getUnsafe","as","tap","take","release","Object","assign","spanAttributes","entries","config","_","layerConfig","effectContext","unwrap","pipe","client","add","SqlClient","provide","layer","message","operation","sqliteCauseWithErrno","errcode","errno"],"sources":["../src/SqliteClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect/sql-sqlite-node",
3
- "version": "4.0.0-beta.92",
3
+ "version": "4.0.0-beta.94",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "A SQLite toolkit for Effect",
@@ -43,15 +43,12 @@
43
43
  "provenance": true
44
44
  },
45
45
  "devDependencies": {
46
- "@types/better-sqlite3": "^7.6.13",
47
- "effect": "^4.0.0-beta.92",
48
- "@effect/platform-node": "^4.0.0-beta.92"
46
+ "@types/node": "^25.7.0",
47
+ "@effect/platform-node": "^4.0.0-beta.94",
48
+ "effect": "^4.0.0-beta.94"
49
49
  },
50
50
  "peerDependencies": {
51
- "effect": "^4.0.0-beta.92"
52
- },
53
- "dependencies": {
54
- "better-sqlite3": "^12.9.0"
51
+ "effect": "^4.0.0-beta.94"
55
52
  },
56
53
  "scripts": {
57
54
  "codegen": "effect-utils codegen",
@@ -1,15 +1,14 @@
1
1
  /**
2
- * Connects Effect SQL to SQLite on Node.js using `better-sqlite3`.
2
+ * Connects Effect SQL to SQLite on Node.js using `node:sqlite`.
3
3
  *
4
4
  * This module opens a SQLite database and exposes it as both `SqliteClient` and
5
5
  * the generic Effect SQL client. It serializes access through one connection,
6
6
  * caches prepared statements, enables WAL mode unless disabled, and supports
7
- * database export, backup, and extension loading. Streaming queries and
7
+ * database backup, and extension loading. Streaming queries and
8
8
  * `updateValues` are not supported by this driver.
9
9
  *
10
10
  * @since 4.0.0
11
11
  */
12
- import Sqlite from "better-sqlite3"
13
12
  import * as Cache from "effect/Cache"
14
13
  import * as Config from "effect/Config"
15
14
  import * as Context from "effect/Context"
@@ -26,12 +25,11 @@ import * as Client from "effect/unstable/sql/SqlClient"
26
25
  import type { Connection } from "effect/unstable/sql/SqlConnection"
27
26
  import { classifySqliteError, SqlError } from "effect/unstable/sql/SqlError"
28
27
  import * as Statement from "effect/unstable/sql/Statement"
28
+ import { backup as backupDatabase, DatabaseSync } from "node:sqlite"
29
+ import type { StatementSync } from "node:sqlite"
29
30
 
30
31
  const ATTR_DB_SYSTEM_NAME = "db.system.name"
31
32
 
32
- const classifyError = (cause: unknown, message: string, operation: string) =>
33
- classifySqliteError(cause, { message, operation })
34
-
35
33
  /**
36
34
  * Runtime type identifier used to mark Node `SqliteClient` values.
37
35
  *
@@ -57,7 +55,6 @@ export type TypeId = "~@effect/sql-sqlite-node/SqliteClient"
57
55
  export interface SqliteClient extends Client.SqlClient {
58
56
  readonly [TypeId]: TypeId
59
57
  readonly config: SqliteClientConfig
60
- readonly export: Effect.Effect<Uint8Array, SqlError>
61
58
  readonly backup: (destination: string) => Effect.Effect<BackupMetadata, SqlError>
62
59
  readonly loadExtension: (path: string) => Effect.Effect<void, SqlError>
63
60
 
@@ -85,7 +82,7 @@ export interface BackupMetadata {
85
82
  export const SqliteClient = Context.Service<SqliteClient>("@effect/sql-sqlite-node/SqliteClient")
86
83
 
87
84
  /**
88
- * Configuration for a node SQLite client backed by `better-sqlite3`, including the database filename, read-only mode, statement cache settings, WAL behavior, span attributes, and query/result name transforms.
85
+ * Configuration for a node SQLite client backed by `node:sqlite`, including the database filename, read-only mode, statement cache settings, WAL behavior, span attributes, and query/result name transforms.
89
86
  *
90
87
  * @category models
91
88
  * @since 4.0.0
@@ -103,7 +100,6 @@ export interface SqliteClientConfig {
103
100
  }
104
101
 
105
102
  interface SqliteConnection extends Connection {
106
- readonly export: Effect.Effect<Uint8Array, SqlError>
107
103
  readonly backup: (destination: string) => Effect.Effect<BackupMetadata, SqlError>
108
104
  readonly loadExtension: (path: string) => Effect.Effect<void, SqlError>
109
105
  }
@@ -127,13 +123,15 @@ export const make = (
127
123
 
128
124
  const makeConnection = Effect.gen(function*() {
129
125
  const scope = yield* Effect.scope
130
- const db = new Sqlite(options.filename, {
131
- readonly: options.readonly ?? false
126
+ const db = new DatabaseSync(options.filename, {
127
+ readOnly: options.readonly ?? false,
128
+ allowExtension: true
132
129
  })
133
130
  yield* Scope.addFinalizer(scope, Effect.sync(() => db.close()))
131
+ db.enableLoadExtension(false)
134
132
 
135
133
  if (options.disableWAL !== true) {
136
- db.pragma("journal_mode = WAL")
134
+ db.exec("PRAGMA journal_mode = WAL")
137
135
  }
138
136
 
139
137
  const prepareCache = yield* Cache.make({
@@ -147,23 +145,62 @@ export const make = (
147
145
  })
148
146
 
149
147
  const runStatement = (
150
- statement: Sqlite.Statement,
148
+ statement: StatementSync,
151
149
  params: ReadonlyArray<unknown>,
152
150
  raw: boolean
153
151
  ) =>
154
152
  Effect.withFiber<ReadonlyArray<any>, SqlError>((fiber) => {
155
- if (Context.get(fiber.context, Client.SafeIntegers)) {
156
- statement.safeIntegers(true)
157
- }
158
- try {
159
- if (statement.reader) {
160
- return Effect.succeed(statement.all(...params))
161
- }
162
- const result = statement.run(...params)
163
- return Effect.succeed(raw ? result as unknown as ReadonlyArray<any> : [])
164
- } catch (cause) {
165
- return Effect.fail(new SqlError({ reason: classifyError(cause, "Failed to execute statement", "execute") }))
166
- }
153
+ const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers)
154
+ return Effect.try({
155
+ try: () => {
156
+ statement.setReadBigInts(useSafeIntegers)
157
+ if (statement.columns().length > 0) {
158
+ return statement.all(...(params as Array<any>)) as ReadonlyArray<any>
159
+ }
160
+ const result = statement.run(...(params as Array<any>))
161
+ return raw ? { changes: result.changes, lastInsertRowid: result.lastInsertRowid } as any : []
162
+ },
163
+ catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to execute statement", "execute") })
164
+ })
165
+ })
166
+
167
+ const runStatementValues = (
168
+ statement: StatementSync,
169
+ params: ReadonlyArray<unknown>
170
+ ) =>
171
+ Effect.withFiber<ReadonlyArray<ReadonlyArray<unknown>>, SqlError>((fiber) => {
172
+ const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers)
173
+ return Effect.try({
174
+ try: () => {
175
+ statement.setReadBigInts(useSafeIntegers)
176
+ if (statement.columns().length > 0) {
177
+ return statement.all(...(params as Array<any>)) as unknown as ReadonlyArray<ReadonlyArray<unknown>>
178
+ }
179
+ statement.run(...(params as Array<any>))
180
+ return []
181
+ },
182
+ catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to execute statement", "execute") })
183
+ })
184
+ })
185
+
186
+ const runStatementValuesUnprepared = (
187
+ statement: StatementSync,
188
+ params: ReadonlyArray<unknown>
189
+ ) =>
190
+ Effect.withFiber<ReadonlyArray<ReadonlyArray<unknown>>, SqlError>((fiber) => {
191
+ const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers)
192
+ return Effect.try({
193
+ try: () => {
194
+ statement.setReadBigInts(useSafeIntegers)
195
+ statement.setReturnArrays(true)
196
+ if (statement.columns().length > 0) {
197
+ return statement.all(...(params as Array<any>)) as unknown as ReadonlyArray<ReadonlyArray<unknown>>
198
+ }
199
+ statement.run(...(params as Array<any>))
200
+ return []
201
+ },
202
+ catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to execute statement", "execute") })
203
+ })
167
204
  })
168
205
 
169
206
  const run = (
@@ -182,41 +219,17 @@ export const make = (
182
219
  ) =>
183
220
  Effect.acquireUseRelease(
184
221
  Cache.get(prepareCache, sql),
185
- (statement) =>
186
- Effect.try({
187
- try: () => {
188
- if (statement.reader) {
189
- statement.raw(true)
190
- return statement.all(...params) as ReadonlyArray<
191
- ReadonlyArray<unknown>
192
- >
193
- }
194
- statement.run(...params)
195
- return []
196
- },
197
- catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to execute statement", "execute") })
198
- }),
199
- (statement) => Effect.sync(() => statement.reader && statement.raw(false))
222
+ (statement) => {
223
+ statement.setReturnArrays(true)
224
+ return runStatementValues(statement, params)
225
+ },
226
+ (statement) => Effect.sync(() => statement.setReturnArrays(false))
200
227
  )
201
228
 
202
229
  const runValuesUnprepared = (
203
230
  sql: string,
204
231
  params: ReadonlyArray<unknown>
205
- ) =>
206
- Effect.try({
207
- try: () => {
208
- const statement = db.prepare(sql)
209
- if (statement.reader) {
210
- statement.raw(true)
211
- return statement.all(...params) as ReadonlyArray<
212
- ReadonlyArray<unknown>
213
- >
214
- }
215
- statement.run(...params)
216
- return []
217
- },
218
- catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to execute statement", "execute") })
219
- })
232
+ ) => runStatementValuesUnprepared(db.prepare(sql), params)
220
233
 
221
234
  return identity<SqliteConnection>({
222
235
  execute(sql, params, transformRows) {
@@ -240,22 +253,31 @@ export const make = (
240
253
  executeStream(_sql, _params) {
241
254
  return Stream.die("executeStream not implemented")
242
255
  },
243
- export: Effect.try({
244
- try: () => db.serialize(),
245
- catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to export database", "export") })
246
- }),
247
256
  backup(destination) {
248
- return Effect.tryPromise({
249
- try: () => db.backup(destination),
250
- catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to backup database", "backup") })
257
+ return Effect.suspend(() => {
258
+ let totalPages = 0
259
+ return Effect.tryPromise({
260
+ try: () =>
261
+ backupDatabase(db, destination, {
262
+ progress: (progress) => {
263
+ totalPages = progress.totalPages
264
+ }
265
+ }).then((pages): BackupMetadata => ({ totalPages: totalPages || pages, remainingPages: 0 })),
266
+ catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to backup database", "backup") })
267
+ })
251
268
  })
252
269
  },
253
270
  loadExtension(path) {
254
- return Effect.try({
255
- try: () => db.loadExtension(path),
256
- catch: (cause) =>
257
- new SqlError({ reason: classifyError(cause, "Failed to load extension", "loadExtension") })
258
- })
271
+ return Effect.acquireUseRelease(
272
+ Effect.sync(() => db.enableLoadExtension(true)),
273
+ () =>
274
+ Effect.try({
275
+ try: () => db.loadExtension(path),
276
+ catch: (cause) =>
277
+ new SqlError({ reason: classifyError(cause, "Failed to load extension", "loadExtension") })
278
+ }),
279
+ () => Effect.sync(() => db.enableLoadExtension(false))
280
+ )
259
281
  }
260
282
  })
261
283
  })
@@ -290,7 +312,6 @@ export const make = (
290
312
  {
291
313
  [TypeId]: TypeId as TypeId,
292
314
  config: options,
293
- export: Effect.flatMap(acquirer, (_) => _.export),
294
315
  backup: (destination: string) => Effect.flatMap(acquirer, (_) => _.backup(destination)),
295
316
  loadExtension: (path: string) => Effect.flatMap(acquirer, (_) => _.loadExtension(path))
296
317
  }
@@ -332,3 +353,19 @@ export const layer = (
332
353
  Context.add(Client.SqlClient, client)
333
354
  ))
334
355
  ).pipe(Layer.provide(Reactivity.layer))
356
+
357
+ // internal
358
+
359
+ const classifyError = (cause: unknown, message: string, operation: string) =>
360
+ classifySqliteError(sqliteCauseWithErrno(cause), { message, operation })
361
+
362
+ const sqliteCauseWithErrno = (cause: unknown): unknown => {
363
+ if (typeof cause !== "object" || cause === null || !("errcode" in cause) || "errno" in cause) {
364
+ return cause
365
+ }
366
+ const errcode = (cause as { readonly errcode: unknown }).errcode
367
+ if (typeof errcode !== "number") {
368
+ return cause
369
+ }
370
+ return Object.assign(cause, { errno: errcode })
371
+ }