@effect/sql-mysql2 4.0.0-beta.10 → 4.0.0-beta.101
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 +1 -1
- package/dist/MysqlClient.d.ts +51 -15
- package/dist/MysqlClient.d.ts.map +1 -1
- package/dist/MysqlClient.js +142 -30
- package/dist/MysqlClient.js.map +1 -1
- package/dist/MysqlMigrator.d.ts +17 -5
- package/dist/MysqlMigrator.d.ts.map +1 -1
- package/dist/MysqlMigrator.js +8 -4
- package/dist/MysqlMigrator.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/package.json +7 -8
- package/src/MysqlClient.ts +195 -36
- package/src/MysqlMigrator.ts +17 -5
- package/src/index.ts +3 -3
package/README.md
CHANGED
package/dist/MysqlClient.d.ts
CHANGED
|
@@ -1,44 +1,67 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* MySQL adapter for Effect SQL, backed by the `mysql2` driver.
|
|
3
|
+
*
|
|
4
|
+
* This module provides constructors and layers for a {@link MysqlClient} and
|
|
5
|
+
* the generic Effect SQL client service. `make` creates a managed mysql2 pool,
|
|
6
|
+
* checks the connection with `SELECT 1`, maps mysql2 failures to `SqlError`,
|
|
7
|
+
* supports transaction connections, and exposes streaming queries through
|
|
8
|
+
* mysql2 query streams. It also provides direct and config-backed layers plus a
|
|
9
|
+
* MySQL statement compiler.
|
|
10
|
+
*
|
|
11
|
+
* @since 4.0.0
|
|
3
12
|
*/
|
|
4
13
|
import * as Config from "effect/Config";
|
|
14
|
+
import * as Context from "effect/Context";
|
|
5
15
|
import * as Duration from "effect/Duration";
|
|
6
16
|
import * as Effect from "effect/Effect";
|
|
7
17
|
import * as Layer from "effect/Layer";
|
|
8
18
|
import * as Redacted from "effect/Redacted";
|
|
9
19
|
import type { Scope } from "effect/Scope";
|
|
10
|
-
import * as ServiceMap from "effect/ServiceMap";
|
|
11
20
|
import * as Reactivity from "effect/unstable/reactivity/Reactivity";
|
|
12
21
|
import * as Client from "effect/unstable/sql/SqlClient";
|
|
13
22
|
import { SqlError } from "effect/unstable/sql/SqlError";
|
|
14
23
|
import * as Statement from "effect/unstable/sql/Statement";
|
|
15
24
|
import * as Mysql from "mysql2";
|
|
16
25
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
26
|
+
* Runtime type identifier used to mark `MysqlClient` values.
|
|
27
|
+
*
|
|
28
|
+
* @category type IDs
|
|
29
|
+
* @since 4.0.0
|
|
19
30
|
*/
|
|
20
31
|
export declare const TypeId: TypeId;
|
|
21
32
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
33
|
+
* Type-level identifier used to mark `MysqlClient` values.
|
|
34
|
+
*
|
|
35
|
+
* @category type IDs
|
|
36
|
+
* @since 4.0.0
|
|
24
37
|
*/
|
|
25
38
|
export type TypeId = "~@effect/sql-mysql2/MysqlClient";
|
|
26
39
|
/**
|
|
40
|
+
* mysql2-backed SQL client service, extending `SqlClient` with its runtime type marker and client configuration.
|
|
41
|
+
*
|
|
27
42
|
* @category models
|
|
28
|
-
* @since
|
|
43
|
+
* @since 4.0.0
|
|
29
44
|
*/
|
|
30
45
|
export interface MysqlClient extends Client.SqlClient {
|
|
31
46
|
readonly [TypeId]: TypeId;
|
|
32
47
|
readonly config: MysqlClientConfig;
|
|
33
48
|
}
|
|
34
49
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
50
|
+
* Service tag for the mysql2 SQL client service.
|
|
51
|
+
*
|
|
52
|
+
* **When to use**
|
|
53
|
+
*
|
|
54
|
+
* Use to access or provide a mysql2 client through the Effect context.
|
|
55
|
+
*
|
|
56
|
+
* @category services
|
|
57
|
+
* @since 4.0.0
|
|
37
58
|
*/
|
|
38
|
-
export declare const MysqlClient:
|
|
59
|
+
export declare const MysqlClient: Context.Service<MysqlClient, MysqlClient>;
|
|
39
60
|
/**
|
|
61
|
+
* Configuration for a mysql2 client, including connection URI or connection fields, pool options, span attributes, and query/result name transforms.
|
|
62
|
+
*
|
|
40
63
|
* @category models
|
|
41
|
-
* @since
|
|
64
|
+
* @since 4.0.0
|
|
42
65
|
*/
|
|
43
66
|
export interface MysqlClientConfig {
|
|
44
67
|
/**
|
|
@@ -53,28 +76,41 @@ export interface MysqlClientConfig {
|
|
|
53
76
|
readonly maxConnections?: number | undefined;
|
|
54
77
|
readonly connectionTTL?: Duration.Input | undefined;
|
|
55
78
|
readonly poolConfig?: Mysql.PoolOptions | undefined;
|
|
79
|
+
/**
|
|
80
|
+
* Use the text protocol instead of prepared statements, for proxies like
|
|
81
|
+
* Cloudflare Hyperdrive that do not support `COM_STMT_PREPARE`.
|
|
82
|
+
*/
|
|
83
|
+
readonly disablePreparedStatements?: boolean | undefined;
|
|
56
84
|
readonly spanAttributes?: Record<string, unknown> | undefined;
|
|
57
85
|
readonly transformResultNames?: ((str: string) => string) | undefined;
|
|
58
86
|
readonly transformQueryNames?: ((str: string) => string) | undefined;
|
|
59
87
|
}
|
|
60
88
|
/**
|
|
89
|
+
* Creates a scoped MySQL client backed by a managed mysql2 pool, verifying connectivity and supporting streaming queries through mysql2 query streams.
|
|
90
|
+
*
|
|
61
91
|
* @category constructors
|
|
62
|
-
* @since
|
|
92
|
+
* @since 4.0.0
|
|
63
93
|
*/
|
|
64
94
|
export declare const make: (options: MysqlClientConfig) => Effect.Effect<MysqlClient, SqlError, Scope | Reactivity.Reactivity>;
|
|
65
95
|
/**
|
|
96
|
+
* Creates a layer from a `Config`-wrapped MySQL client configuration, providing both `MysqlClient` and `SqlClient`.
|
|
97
|
+
*
|
|
66
98
|
* @category layers
|
|
67
|
-
* @since
|
|
99
|
+
* @since 4.0.0
|
|
68
100
|
*/
|
|
69
101
|
export declare const layerConfig: (config: Config.Wrap<MysqlClientConfig>) => Layer.Layer<MysqlClient | Client.SqlClient, Config.ConfigError | SqlError>;
|
|
70
102
|
/**
|
|
103
|
+
* Creates a layer from a concrete MySQL client configuration, providing both `MysqlClient` and `SqlClient`.
|
|
104
|
+
*
|
|
71
105
|
* @category layers
|
|
72
|
-
* @since
|
|
106
|
+
* @since 4.0.0
|
|
73
107
|
*/
|
|
74
108
|
export declare const layer: (config: MysqlClientConfig) => Layer.Layer<MysqlClient | Client.SqlClient, Config.ConfigError | SqlError>;
|
|
75
109
|
/**
|
|
110
|
+
* Creates the MySQL statement compiler, using `?` placeholders and backtick-escaped identifiers.
|
|
111
|
+
*
|
|
76
112
|
* @category compiler
|
|
77
|
-
* @since
|
|
113
|
+
* @since 4.0.0
|
|
78
114
|
*/
|
|
79
115
|
export declare const makeCompiler: (transform?: (_: string) => string) => Statement.Compiler;
|
|
80
116
|
//# sourceMappingURL=MysqlClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MysqlClient.d.ts","sourceRoot":"","sources":["../src/MysqlClient.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"MysqlClient.d.ts","sourceRoot":"","sources":["../src/MysqlClient.ts"],"names":[],"mappings":"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"}
|
package/dist/MysqlClient.js
CHANGED
|
@@ -1,16 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* MySQL adapter for Effect SQL, backed by the `mysql2` driver.
|
|
3
|
+
*
|
|
4
|
+
* This module provides constructors and layers for a {@link MysqlClient} and
|
|
5
|
+
* the generic Effect SQL client service. `make` creates a managed mysql2 pool,
|
|
6
|
+
* checks the connection with `SELECT 1`, maps mysql2 failures to `SqlError`,
|
|
7
|
+
* supports transaction connections, and exposes streaming queries through
|
|
8
|
+
* mysql2 query streams. It also provides direct and config-backed layers plus a
|
|
9
|
+
* MySQL statement compiler.
|
|
10
|
+
*
|
|
11
|
+
* @since 4.0.0
|
|
3
12
|
*/
|
|
4
13
|
import * as Config from "effect/Config";
|
|
14
|
+
import * as Context from "effect/Context";
|
|
5
15
|
import * as Duration from "effect/Duration";
|
|
6
16
|
import * as Effect from "effect/Effect";
|
|
7
17
|
import * as Layer from "effect/Layer";
|
|
8
18
|
import * as Redacted from "effect/Redacted";
|
|
9
|
-
import * as ServiceMap from "effect/ServiceMap";
|
|
10
19
|
import * as Stream from "effect/Stream";
|
|
11
20
|
import * as Reactivity from "effect/unstable/reactivity/Reactivity";
|
|
12
21
|
import * as Client from "effect/unstable/sql/SqlClient";
|
|
13
|
-
import { SqlError } from "effect/unstable/sql/SqlError";
|
|
22
|
+
import { AuthenticationError, AuthorizationError, ConnectionError, ConstraintError, DeadlockError, LockTimeoutError, SqlError, SqlSyntaxError, StatementTimeoutError, UniqueViolation, UnknownError } from "effect/unstable/sql/SqlError";
|
|
14
23
|
import { asyncPauseResume } from "effect/unstable/sql/SqlStream";
|
|
15
24
|
import * as Statement from "effect/unstable/sql/Statement";
|
|
16
25
|
import * as Mysql from "mysql2";
|
|
@@ -18,31 +27,126 @@ const ATTR_DB_SYSTEM_NAME = "db.system.name";
|
|
|
18
27
|
const ATTR_DB_NAMESPACE = "db.namespace";
|
|
19
28
|
const ATTR_SERVER_ADDRESS = "server.address";
|
|
20
29
|
const ATTR_SERVER_PORT = "server.port";
|
|
30
|
+
const mysqlErrnoFromCause = cause => {
|
|
31
|
+
if (typeof cause !== "object" || cause === null || !("errno" in cause)) {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
const errno = cause.errno;
|
|
35
|
+
return typeof errno === "number" ? errno : undefined;
|
|
36
|
+
};
|
|
37
|
+
const mysqlConnectionErrorCodes = /*#__PURE__*/new Set([1040, 1042, 1043, 1129, 1130, 1203]);
|
|
38
|
+
const mysqlAuthorizationErrorCodes = /*#__PURE__*/new Set([1044, 1142, 1143, 1227]);
|
|
39
|
+
const mysqlSyntaxErrorCodes = /*#__PURE__*/new Set([1054, 1064, 1146]);
|
|
40
|
+
const mysqlConstraintErrorCodes = /*#__PURE__*/new Set([1022, 1048, 1169, 1216, 1217, 1451, 1452, 1557]);
|
|
41
|
+
const UNKNOWN_CONSTRAINT = "unknown";
|
|
42
|
+
const normalizeConstraintIdentifier = identifier => {
|
|
43
|
+
if (typeof identifier !== "string") {
|
|
44
|
+
return UNKNOWN_CONSTRAINT;
|
|
45
|
+
}
|
|
46
|
+
const trimmed = identifier.trim();
|
|
47
|
+
return trimmed.length === 0 ? UNKNOWN_CONSTRAINT : trimmed;
|
|
48
|
+
};
|
|
49
|
+
const mysqlCauseProperty = (cause, property) => {
|
|
50
|
+
if (typeof cause !== "object" || cause === null || !(property in cause)) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
return cause[property];
|
|
54
|
+
};
|
|
55
|
+
const mysqlDuplicateEntryConstraintFromMessage = message => {
|
|
56
|
+
if (typeof message !== "string") {
|
|
57
|
+
return UNKNOWN_CONSTRAINT;
|
|
58
|
+
}
|
|
59
|
+
const match = /\bfor key\s+(?:'([^']*)'|\x60([^\x60]*)\x60|([^\s'\x60]+))/i.exec(message);
|
|
60
|
+
return match === null ? UNKNOWN_CONSTRAINT : normalizeConstraintIdentifier(match[1] ?? match[2] ?? match[3]);
|
|
61
|
+
};
|
|
62
|
+
const mysqlDuplicateEntryConstraintFromCause = cause => {
|
|
63
|
+
const constraint = normalizeConstraintIdentifier(mysqlCauseProperty(cause, "constraint"));
|
|
64
|
+
if (constraint !== UNKNOWN_CONSTRAINT) {
|
|
65
|
+
return constraint;
|
|
66
|
+
}
|
|
67
|
+
const sqlMessageConstraint = mysqlDuplicateEntryConstraintFromMessage(mysqlCauseProperty(cause, "sqlMessage"));
|
|
68
|
+
if (sqlMessageConstraint !== UNKNOWN_CONSTRAINT) {
|
|
69
|
+
return sqlMessageConstraint;
|
|
70
|
+
}
|
|
71
|
+
return mysqlDuplicateEntryConstraintFromMessage(mysqlCauseProperty(cause, "message"));
|
|
72
|
+
};
|
|
73
|
+
const classifyError = (cause, message, operation) => {
|
|
74
|
+
const props = {
|
|
75
|
+
cause,
|
|
76
|
+
message,
|
|
77
|
+
operation
|
|
78
|
+
};
|
|
79
|
+
const errno = mysqlErrnoFromCause(cause);
|
|
80
|
+
if (errno !== undefined) {
|
|
81
|
+
if (mysqlConnectionErrorCodes.has(errno)) {
|
|
82
|
+
return new ConnectionError(props);
|
|
83
|
+
}
|
|
84
|
+
if (errno === 1045) {
|
|
85
|
+
return new AuthenticationError(props);
|
|
86
|
+
}
|
|
87
|
+
if (mysqlAuthorizationErrorCodes.has(errno)) {
|
|
88
|
+
return new AuthorizationError(props);
|
|
89
|
+
}
|
|
90
|
+
if (mysqlSyntaxErrorCodes.has(errno)) {
|
|
91
|
+
return new SqlSyntaxError(props);
|
|
92
|
+
}
|
|
93
|
+
if (errno === 1062) {
|
|
94
|
+
return new UniqueViolation({
|
|
95
|
+
...props,
|
|
96
|
+
constraint: mysqlDuplicateEntryConstraintFromCause(cause)
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
if (mysqlConstraintErrorCodes.has(errno)) {
|
|
100
|
+
return new ConstraintError(props);
|
|
101
|
+
}
|
|
102
|
+
if (errno === 1213) {
|
|
103
|
+
return new DeadlockError(props);
|
|
104
|
+
}
|
|
105
|
+
if (errno === 1205) {
|
|
106
|
+
return new LockTimeoutError(props);
|
|
107
|
+
}
|
|
108
|
+
if (errno === 3024) {
|
|
109
|
+
return new StatementTimeoutError(props);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return new UnknownError(props);
|
|
113
|
+
};
|
|
21
114
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
115
|
+
* Runtime type identifier used to mark `MysqlClient` values.
|
|
116
|
+
*
|
|
117
|
+
* @category type IDs
|
|
118
|
+
* @since 4.0.0
|
|
24
119
|
*/
|
|
25
120
|
export const TypeId = "~@effect/sql-mysql2/MysqlClient";
|
|
26
121
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
122
|
+
* Service tag for the mysql2 SQL client service.
|
|
123
|
+
*
|
|
124
|
+
* **When to use**
|
|
125
|
+
*
|
|
126
|
+
* Use to access or provide a mysql2 client through the Effect context.
|
|
127
|
+
*
|
|
128
|
+
* @category services
|
|
129
|
+
* @since 4.0.0
|
|
29
130
|
*/
|
|
30
|
-
export const MysqlClient = /*#__PURE__*/
|
|
131
|
+
export const MysqlClient = /*#__PURE__*/Context.Service("@effect/sql-mysql2/MysqlClient");
|
|
31
132
|
/**
|
|
133
|
+
* Creates a scoped MySQL client backed by a managed mysql2 pool, verifying connectivity and supporting streaming queries through mysql2 query streams.
|
|
134
|
+
*
|
|
32
135
|
* @category constructors
|
|
33
|
-
* @since
|
|
136
|
+
* @since 4.0.0
|
|
34
137
|
*/
|
|
35
138
|
export const make = options => Effect.gen(function* () {
|
|
36
139
|
const compiler = makeCompiler(options.transformQueryNames);
|
|
37
140
|
const transformRows = options.transformResultNames ? Statement.defaultTransforms(options.transformResultNames).array : undefined;
|
|
141
|
+
const defaultMethod = options.disablePreparedStatements === true ? "query" : "execute";
|
|
38
142
|
class ConnectionImpl {
|
|
39
143
|
conn;
|
|
40
144
|
constructor(conn) {
|
|
41
145
|
this.conn = conn;
|
|
42
146
|
}
|
|
43
|
-
runRaw(sql, values, rowsAsArray = false, method =
|
|
147
|
+
runRaw(sql, values, rowsAsArray = false, method = defaultMethod) {
|
|
44
148
|
return Effect.callback(resume => {
|
|
45
|
-
;
|
|
149
|
+
const operation = method === "query" ? "executeUnprepared" : "execute";
|
|
46
150
|
this.conn[method]({
|
|
47
151
|
sql,
|
|
48
152
|
values,
|
|
@@ -50,8 +154,7 @@ export const make = options => Effect.gen(function* () {
|
|
|
50
154
|
}, (cause, results, _fields) => {
|
|
51
155
|
if (cause) {
|
|
52
156
|
resume(Effect.fail(new SqlError({
|
|
53
|
-
cause,
|
|
54
|
-
message: "Failed to execute statement"
|
|
157
|
+
reason: classifyError(cause, "Failed to execute statement", operation)
|
|
55
158
|
})));
|
|
56
159
|
} else {
|
|
57
160
|
resume(Effect.succeed(results));
|
|
@@ -59,7 +162,7 @@ export const make = options => Effect.gen(function* () {
|
|
|
59
162
|
});
|
|
60
163
|
});
|
|
61
164
|
}
|
|
62
|
-
run(sql, values, rowsAsArray = false, method =
|
|
165
|
+
run(sql, values, rowsAsArray = false, method = defaultMethod) {
|
|
63
166
|
return this.runRaw(sql, values, rowsAsArray, method).pipe(Effect.map(results => Array.isArray(results) ? results : []));
|
|
64
167
|
}
|
|
65
168
|
execute(sql, params, transformRows) {
|
|
@@ -71,6 +174,9 @@ export const make = options => Effect.gen(function* () {
|
|
|
71
174
|
executeValues(sql, params) {
|
|
72
175
|
return this.run(sql, params, true);
|
|
73
176
|
}
|
|
177
|
+
executeValuesUnprepared(sql, params) {
|
|
178
|
+
return this.run(sql, params, true, "query");
|
|
179
|
+
}
|
|
74
180
|
executeUnprepared(sql, params, transformRows) {
|
|
75
181
|
return transformRows ? Effect.map(this.run(sql, params, false, "query"), transformRows) : this.run(sql, params, false, "query");
|
|
76
182
|
}
|
|
@@ -94,16 +200,15 @@ export const make = options => Effect.gen(function* () {
|
|
|
94
200
|
password: options.password ? Redacted.value(options.password) : undefined,
|
|
95
201
|
multipleStatements: true,
|
|
96
202
|
supportBigNumbers: true,
|
|
97
|
-
connectionLimit: options.maxConnections,
|
|
98
|
-
idleTimeout: options.connectionTTL ? Duration.toMillis(Duration.fromInputUnsafe(options.connectionTTL)) :
|
|
203
|
+
connectionLimit: options.maxConnections ?? options.poolConfig?.connectionLimit,
|
|
204
|
+
idleTimeout: options.connectionTTL ? Duration.toMillis(Duration.fromInputUnsafe(options.connectionTTL)) : options.poolConfig?.idleTimeout
|
|
99
205
|
});
|
|
100
206
|
yield* Effect.acquireRelease(Effect.callback(resume => {
|
|
101
207
|
;
|
|
102
208
|
pool.query("SELECT 1", cause => {
|
|
103
209
|
if (cause) {
|
|
104
210
|
resume(Effect.fail(new SqlError({
|
|
105
|
-
cause,
|
|
106
|
-
message: "MysqlClient: Failed to connect"
|
|
211
|
+
reason: classifyError(cause, "MysqlClient: Failed to connect", "connect")
|
|
107
212
|
})));
|
|
108
213
|
} else {
|
|
109
214
|
resume(Effect.void);
|
|
@@ -113,9 +218,12 @@ export const make = options => Effect.gen(function* () {
|
|
|
113
218
|
pool.end(() => resume(Effect.void));
|
|
114
219
|
})).pipe(Effect.timeoutOrElse({
|
|
115
220
|
duration: Duration.seconds(5),
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
221
|
+
orElse: () => Effect.fail(new SqlError({
|
|
222
|
+
reason: new ConnectionError({
|
|
223
|
+
message: "MysqlClient: Connection timeout",
|
|
224
|
+
cause: new Error("connection timeout"),
|
|
225
|
+
operation: "connect"
|
|
226
|
+
})
|
|
119
227
|
}))
|
|
120
228
|
}));
|
|
121
229
|
const poolConnection = new ConnectionImpl(pool);
|
|
@@ -123,8 +231,7 @@ export const make = options => Effect.gen(function* () {
|
|
|
123
231
|
pool.getConnection((cause, conn) => {
|
|
124
232
|
if (cause) {
|
|
125
233
|
resume(Effect.fail(new SqlError({
|
|
126
|
-
cause,
|
|
127
|
-
message: "Failed to acquire connection"
|
|
234
|
+
reason: classifyError(cause, "Failed to acquire connection", "acquireConnection")
|
|
128
235
|
})));
|
|
129
236
|
} else {
|
|
130
237
|
resume(Effect.succeed(conn));
|
|
@@ -148,18 +255,24 @@ export const make = options => Effect.gen(function* () {
|
|
|
148
255
|
});
|
|
149
256
|
});
|
|
150
257
|
/**
|
|
258
|
+
* Creates a layer from a `Config`-wrapped MySQL client configuration, providing both `MysqlClient` and `SqlClient`.
|
|
259
|
+
*
|
|
151
260
|
* @category layers
|
|
152
|
-
* @since
|
|
261
|
+
* @since 4.0.0
|
|
153
262
|
*/
|
|
154
|
-
export const layerConfig = config => Layer.
|
|
263
|
+
export const layerConfig = config => Layer.effectContext(Config.unwrap(config).pipe(Effect.flatMap(make), Effect.map(client => Context.make(MysqlClient, client).pipe(Context.add(Client.SqlClient, client))))).pipe(Layer.provide(Reactivity.layer));
|
|
155
264
|
/**
|
|
265
|
+
* Creates a layer from a concrete MySQL client configuration, providing both `MysqlClient` and `SqlClient`.
|
|
266
|
+
*
|
|
156
267
|
* @category layers
|
|
157
|
-
* @since
|
|
268
|
+
* @since 4.0.0
|
|
158
269
|
*/
|
|
159
|
-
export const layer = config => Layer.
|
|
270
|
+
export const layer = config => Layer.effectContext(Effect.map(make(config), client => Context.make(MysqlClient, client).pipe(Context.add(Client.SqlClient, client)))).pipe(Layer.provide(Reactivity.layer));
|
|
160
271
|
/**
|
|
272
|
+
* Creates the MySQL statement compiler, using `?` placeholders and backtick-escaped identifiers.
|
|
273
|
+
*
|
|
161
274
|
* @category compiler
|
|
162
|
-
* @since
|
|
275
|
+
* @since 4.0.0
|
|
163
276
|
*/
|
|
164
277
|
export const makeCompiler = transform => Statement.makeCompiler({
|
|
165
278
|
dialect: "mysql",
|
|
@@ -184,8 +297,7 @@ function queryStream(conn, sql, params) {
|
|
|
184
297
|
let buffer = [];
|
|
185
298
|
let taskPending = false;
|
|
186
299
|
query.on("error", cause => emit.fail(new SqlError({
|
|
187
|
-
cause,
|
|
188
|
-
message: "Failed to stream statement"
|
|
300
|
+
reason: classifyError(cause, "Failed to stream statement", "stream")
|
|
189
301
|
})));
|
|
190
302
|
query.on("data", row => {
|
|
191
303
|
buffer.push(row);
|
package/dist/MysqlClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MysqlClient.js","names":["Config","Duration","Effect","Layer","Redacted","ServiceMap","Stream","Reactivity","Client","SqlError","asyncPauseResume","Statement","Mysql","ATTR_DB_SYSTEM_NAME","ATTR_DB_NAMESPACE","ATTR_SERVER_ADDRESS","ATTR_SERVER_PORT","TypeId","MysqlClient","Service","make","options","gen","compiler","makeCompiler","transformQueryNames","transformRows","transformResultNames","defaultTransforms","array","undefined","ConnectionImpl","conn","constructor","runRaw","sql","values","rowsAsArray","method","callback","resume","cause","results","_fields","fail","message","succeed","run","pipe","map","Array","isArray","execute","params","executeRaw","executeValues","executeUnprepared","executeStream","stream","queryStream","mapArray","_","pool","url","createPool","uri","value","multipleStatements","supportBigNumbers","connectionLimit","maxConnections","idleTimeout","connectionTTL","toMillis","fromInputUnsafe","poolConfig","host","port","database","user","username","password","acquireRelease","query","void","end","timeoutOrElse","duration","seconds","onTimeout","Error","poolConnection","acquireConn","getConnection","sync","release","transactionAcquirer","spanAttributes","Object","entries","push","assign","acquirer","config","layerConfig","effectServices","unwrap","asEffect","flatMap","client","add","SqlClient","provide","layer","transform","dialect","placeholder","onIdentifier","withoutTransform","escape","onCustom","onRecordUpdate","defaultEscape","fnUntraced","emit","addFinalizer","destroy","buffer","taskPending","on","row","queueMicrotask","items","length","onPause","pause","onResume"],"sources":["../src/MysqlClient.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,QAAQ,MAAM,iBAAiB;AAC3C,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,QAAQ,MAAM,iBAAiB;AAE3C,OAAO,KAAKC,UAAU,MAAM,mBAAmB;AAC/C,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,UAAU,MAAM,uCAAuC;AACnE,OAAO,KAAKC,MAAM,MAAM,+BAA+B;AAEvD,SAASC,QAAQ,QAAQ,8BAA8B;AACvD,SAASC,gBAAgB,QAAQ,+BAA+B;AAChE,OAAO,KAAKC,SAAS,MAAM,+BAA+B;AAC1D,OAAO,KAAKC,KAAK,MAAM,QAAQ;AAE/B,MAAMC,mBAAmB,GAAG,gBAAgB;AAC5C,MAAMC,iBAAiB,GAAG,cAAc;AACxC,MAAMC,mBAAmB,GAAG,gBAAgB;AAC5C,MAAMC,gBAAgB,GAAG,aAAa;AAEtC;;;;AAIA,OAAO,MAAMC,MAAM,GAAW,iCAAiC;AAiB/D;;;;AAIA,OAAO,MAAMC,WAAW,gBAAGb,UAAU,CAACc,OAAO,CAAc,gCAAgC,CAAC;AA6B5F;;;;AAIA,OAAO,MAAMC,IAAI,GACfC,OAA0B,IAE1BnB,MAAM,CAACoB,GAAG,CAAC,aAAS;EAClB,MAAMC,QAAQ,GAAGC,YAAY,CAACH,OAAO,CAACI,mBAAmB,CAAC;EAC1D,MAAMC,aAAa,GAAGL,OAAO,CAACM,oBAAoB,GAChDhB,SAAS,CAACiB,iBAAiB,CACzBP,OAAO,CAACM,oBAAoB,CAC7B,CAACE,KAAK,GACPC,SAAS;EAEX,MAAMC,cAAc;IACTC,IAAI;IACbC,YAAYD,IAAuC;MACjD,IAAI,CAACA,IAAI,GAAGA,IAAI;IAClB;IAEQE,MAAMA,CACZC,GAAW,EACXC,MAA2B,EAC3BC,WAAW,GAAG,KAAK,EACnBC,MAAA,GAA8B,SAAS;MAEvC,OAAOpC,MAAM,CAACqC,QAAQ,CAAqBC,MAAM,IAAI;QACnD;QAAE,IAAI,CAACR,IAAY,CAACM,MAAM,CAAC,CAAC;UAC1BH,GAAG;UACHC,MAAM;UACNC;SACD,EAAE,CAACI,KAAqB,EAAEC,OAAgB,EAAEC,OAAY,KAAI;UAC3D,IAAIF,KAAK,EAAE;YACTD,MAAM,CAACtC,MAAM,CAAC0C,IAAI,CAAC,IAAInC,QAAQ,CAAC;cAAEgC,KAAK;cAAEI,OAAO,EAAE;YAA6B,CAAE,CAAC,CAAC,CAAC;UACtF,CAAC,MAAM;YACLL,MAAM,CAACtC,MAAM,CAAC4C,OAAO,CAACJ,OAAO,CAAC,CAAC;UACjC;QACF,CAAC,CAAC;MACJ,CAAC,CAAC;IACJ;IAEQK,GAAGA,CACTZ,GAAW,EACXC,MAA2B,EAC3BC,WAAW,GAAG,KAAK,EACnBC,MAAA,GAA8B,SAAS;MAEvC,OAAO,IAAI,CAACJ,MAAM,CAACC,GAAG,EAAEC,MAAM,EAAEC,WAAW,EAAEC,MAAM,CAAC,CAACU,IAAI,CACvD9C,MAAM,CAAC+C,GAAG,CAAEP,OAAO,IAAKQ,KAAK,CAACC,OAAO,CAACT,OAAO,CAAC,GAAGA,OAAO,GAAG,EAAE,CAAC,CAC/D;IACH;IAEAU,OAAOA,CACLjB,GAAW,EACXkB,MAA8B,EAC9B3B,aAA0F;MAE1F,OAAOA,aAAa,GAChBxB,MAAM,CAAC+C,GAAG,CAAC,IAAI,CAACF,GAAG,CAACZ,GAAG,EAAEkB,MAAM,CAAC,EAAE3B,aAAa,CAAC,GAChD,IAAI,CAACqB,GAAG,CAACZ,GAAG,EAAEkB,MAAM,CAAC;IAC3B;IACAC,UAAUA,CAACnB,GAAW,EAAEkB,MAA8B;MACpD,OAAO,IAAI,CAACnB,MAAM,CAACC,GAAG,EAAEkB,MAAM,CAAC;IACjC;IACAE,aAAaA,CAACpB,GAAW,EAAEkB,MAA8B;MACvD,OAAO,IAAI,CAACN,GAAG,CAACZ,GAAG,EAAEkB,MAAM,EAAE,IAAI,CAAC;IACpC;IACAG,iBAAiBA,CACfrB,GAAW,EACXkB,MAA8B,EAC9B3B,aAA0F;MAE1F,OAAOA,aAAa,GAChBxB,MAAM,CAAC+C,GAAG,CAAC,IAAI,CAACF,GAAG,CAACZ,GAAG,EAAEkB,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE3B,aAAa,CAAC,GAChE,IAAI,CAACqB,GAAG,CAACZ,GAAG,EAAEkB,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC;IAC3C;IACAI,aAAaA,CACXtB,GAAW,EACXkB,MAA8B,EAC9B3B,aAA0F;MAE1F,MAAMgC,MAAM,GAAGC,WAAW,CAAC,IAAI,CAAC3B,IAAW,EAAEG,GAAG,EAAEkB,MAAM,CAAC;MACzD,OAAO3B,aAAa,GAChBpB,MAAM,CAACsD,QAAQ,CAACF,MAAM,EAAGG,CAAC,IAAKnC,aAAa,CAACmC,CAAC,CAAQ,CAAC,GACvDH,MAAM;IACZ;;EAGF,MAAMI,IAAI,GAAGzC,OAAO,CAAC0C,GAAG,GACpBnD,KAAK,CAACoD,UAAU,CAAC;IACjBC,GAAG,EAAE7D,QAAQ,CAAC8D,KAAK,CAAC7C,OAAO,CAAC0C,GAAG,CAAC;IAChCI,kBAAkB,EAAE,IAAI;IACxBC,iBAAiB,EAAE,IAAI;IACvBC,eAAe,EAAEhD,OAAO,CAACiD,cAAe;IACxCC,WAAW,EAAElD,OAAO,CAACmD,aAAa,GAC9BvE,QAAQ,CAACwE,QAAQ,CAACxE,QAAQ,CAACyE,eAAe,CAACrD,OAAO,CAACmD,aAAa,CAAC,CAAC,GAClE1C;GACL,CAAC,GACAlB,KAAK,CAACoD,UAAU,CAAC;IACjB,GAAG3C,OAAO,CAACsD,UAAU;IACrBC,IAAI,EAAEvD,OAAO,CAACuD,IAAI;IAClBC,IAAI,EAAExD,OAAO,CAACwD,IAAI;IAClBC,QAAQ,EAAEzD,OAAO,CAACyD,QAAQ;IAC1BC,IAAI,EAAE1D,OAAO,CAAC2D,QAAQ;IACtBC,QAAQ,EAAE5D,OAAO,CAAC4D,QAAQ,GACtB7E,QAAQ,CAAC8D,KAAK,CAAC7C,OAAO,CAAC4D,QAAQ,CAAC,GAChCnD,SAAS;IACbqC,kBAAkB,EAAE,IAAI;IACxBC,iBAAiB,EAAE,IAAI;IACvBC,eAAe,EAAEhD,OAAO,CAACiD,cAAc;IACvCC,WAAW,EAAElD,OAAO,CAACmD,aAAa,GAC9BvE,QAAQ,CAACwE,QAAQ,CAACxE,QAAQ,CAACyE,eAAe,CAACrD,OAAO,CAACmD,aAAa,CAAC,CAAC,GAClE1C;GACgB,CAAC;EAEzB,OAAO5B,MAAM,CAACgF,cAAc,CAC1BhF,MAAM,CAACqC,QAAQ,CAAkBC,MAAM,IAAI;IACzC;IAAEsB,IAAY,CAACqB,KAAK,CAAC,UAAU,EAAG1C,KAAY,IAAI;MAChD,IAAIA,KAAK,EAAE;QACTD,MAAM,CAACtC,MAAM,CAAC0C,IAAI,CAChB,IAAInC,QAAQ,CAAC;UACXgC,KAAK;UACLI,OAAO,EAAE;SACV,CAAC,CACH,CAAC;MACJ,CAAC,MAAM;QACLL,MAAM,CAACtC,MAAM,CAACkF,IAAI,CAAC;MACrB;IACF,CAAC,CAAC;EACJ,CAAC,CAAC,EACF,MACElF,MAAM,CAACqC,QAAQ,CAAQC,MAAM,IAAI;IAC/BsB,IAAI,CAACuB,GAAG,CAAC,MAAM7C,MAAM,CAACtC,MAAM,CAACkF,IAAI,CAAC,CAAC;EACrC,CAAC,CAAC,CACL,CAACpC,IAAI,CACJ9C,MAAM,CAACoF,aAAa,CAAC;IACnBC,QAAQ,EAAEtF,QAAQ,CAACuF,OAAO,CAAC,CAAC,CAAC;IAC7BC,SAAS,EAAEA,CAAA,KACTvF,MAAM,CAAC0C,IAAI,CACT,IAAInC,QAAQ,CAAC;MACXoC,OAAO,EAAE,iCAAiC;MAC1CJ,KAAK,EAAE,IAAIiD,KAAK,CAAC,oBAAoB;KACtC,CAAC;GAEP,CAAC,CACH;EAED,MAAMC,cAAc,GAAG,IAAI5D,cAAc,CAAC+B,IAAI,CAAC;EAE/C,MAAM8B,WAAW,GAAG1F,MAAM,CAACgF,cAAc,CACvChF,MAAM,CAACqC,QAAQ,CAAkCC,MAAM,IAAI;IACzDsB,IAAI,CAAC+B,aAAa,CAAC,CAACpD,KAAK,EAAET,IAAI,KAAI;MACjC,IAAIS,KAAK,EAAE;QACTD,MAAM,CAACtC,MAAM,CAAC0C,IAAI,CAAC,IAAInC,QAAQ,CAAC;UAAEgC,KAAK;UAAEI,OAAO,EAAE;QAA8B,CAAE,CAAC,CAAC,CAAC;MACvF,CAAC,MAAM;QACLL,MAAM,CAACtC,MAAM,CAAC4C,OAAO,CAACd,IAAI,CAAC,CAAC;MAC9B;IACF,CAAC,CAAC;EACJ,CAAC,CAAC,EACDA,IAAI,IAAK9B,MAAM,CAAC4F,IAAI,CAAC,MAAM9D,IAAI,CAAC+D,OAAO,EAAE,CAAC,CAC5C;EAED,MAAMC,mBAAmB,GAAG9F,MAAM,CAAC+C,GAAG,CACpC2C,WAAW,EACV5D,IAAI,IAAK,IAAID,cAAc,CAACC,IAAI,CAAC,CACnC;EAED,MAAMiE,cAAc,GAA6B,CAC/C,IAAI5E,OAAO,CAAC4E,cAAc,GAAGC,MAAM,CAACC,OAAO,CAAC9E,OAAO,CAAC4E,cAAc,CAAC,GAAG,EAAE,CAAC,EACzE,CAACpF,mBAAmB,EAAE,OAAO,CAAC,EAC9B,CAACE,mBAAmB,EAAEM,OAAO,CAACuD,IAAI,IAAI,WAAW,CAAC,EAClD,CAAC5D,gBAAgB,EAAEK,OAAO,CAACwD,IAAI,IAAI,IAAI,CAAC,CACzC;EAED,IAAIxD,OAAO,CAACyD,QAAQ,EAAE;IACpBmB,cAAc,CAACG,IAAI,CAAC,CAACtF,iBAAiB,EAAEO,OAAO,CAACyD,QAAQ,CAAC,CAAC;EAC5D;EAEA,OAAOoB,MAAM,CAACG,MAAM,CAClB,OAAO7F,MAAM,CAACY,IAAI,CAAC;IACjBkF,QAAQ,EAAEpG,MAAM,CAAC4C,OAAO,CAAC6C,cAAc,CAAC;IACxCK,mBAAmB;IACnBzE,QAAQ;IACR0E,cAAc;IACdvE;GACD,CAAC,EACF;IAAE,CAACT,MAAM,GAAGA,MAAgB;IAAEsF,MAAM,EAAElF;EAAO,CAAE,CAChD;AACH,CAAC,CAAC;AAEJ;;;;AAIA,OAAO,MAAMmF,WAAW,GACtBD,MAAsC,IAEtCpG,KAAK,CAACsG,cAAc,CAClBzG,MAAM,CAAC0G,MAAM,CAACH,MAAM,CAAC,CAACI,QAAQ,EAAE,CAAC3D,IAAI,CACnC9C,MAAM,CAAC0G,OAAO,CAACxF,IAAI,CAAC,EACpBlB,MAAM,CAAC+C,GAAG,CAAE4D,MAAM,IAChBxG,UAAU,CAACe,IAAI,CAACF,WAAW,EAAE2F,MAAM,CAAC,CAAC7D,IAAI,CACvC3C,UAAU,CAACyG,GAAG,CAACtG,MAAM,CAACuG,SAAS,EAAEF,MAAM,CAAC,CACzC,CACF,CACF,CACF,CAAC7D,IAAI,CAAC7C,KAAK,CAAC6G,OAAO,CAACzG,UAAU,CAAC0G,KAAK,CAAC,CAAC;AAEzC;;;;AAIA,OAAO,MAAMA,KAAK,GAChBV,MAAyB,IAEzBpG,KAAK,CAACsG,cAAc,CAClBvG,MAAM,CAAC+C,GAAG,CAAC7B,IAAI,CAACmF,MAAM,CAAC,EAAGM,MAAM,IAC9BxG,UAAU,CAACe,IAAI,CAACF,WAAW,EAAE2F,MAAM,CAAC,CAAC7D,IAAI,CACvC3C,UAAU,CAACyG,GAAG,CAACtG,MAAM,CAACuG,SAAS,EAAEF,MAAM,CAAC,CACzC,CAAC,CACL,CAAC7D,IAAI,CAAC7C,KAAK,CAAC6G,OAAO,CAACzG,UAAU,CAAC0G,KAAK,CAAC,CAAC;AAEzC;;;;AAIA,OAAO,MAAMzF,YAAY,GAAI0F,SAAiC,IAC5DvG,SAAS,CAACa,YAAY,CAAC;EACrB2F,OAAO,EAAE,OAAO;EAChBC,WAAWA,CAACvD,CAAC;IACX,OAAO,GAAG;EACZ,CAAC;EACDwD,YAAY,EAAEH,SAAS,GACrB,UAAShD,KAAK,EAAEoD,gBAAgB;IAC9B,OAAOA,gBAAgB,GAAGC,MAAM,CAACrD,KAAK,CAAC,GAAGqD,MAAM,CAACL,SAAS,CAAChD,KAAK,CAAC,CAAC;EACpE,CAAC,GACDqD,MAAM;EACRC,QAAQA,CAAA;IACN,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC;EACjB,CAAC;EACDC,cAAcA,CAAA;IACZ,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC;EACjB;CACD,CAAC;AAEJ,MAAMF,MAAM,gBAAG5G,SAAS,CAAC+G,aAAa,CAAC,GAAG,CAAC;AAE3C,SAAS/D,WAAWA,CAClB3B,IAA0B,EAC1BG,GAAW,EACXkB,MAA2B;EAE3B,OAAO3C,gBAAgB,CAAgBR,MAAM,CAACyH,UAAU,CAAC,WAAUC,IAAI;IACrE,MAAMzC,KAAK,GAAInD,IAAY,CAACmD,KAAK,CAAChD,GAAG,EAAEkB,MAAM,CAAC,CAACK,MAAM,EAAE;IACvD,OAAOxD,MAAM,CAAC2H,YAAY,CAAC,MAAM3H,MAAM,CAAC4F,IAAI,CAAC,MAAMX,KAAK,CAAC2C,OAAO,EAAE,CAAC,CAAC;IAEpE,IAAIC,MAAM,GAAe,EAAE;IAC3B,IAAIC,WAAW,GAAG,KAAK;IACvB7C,KAAK,CAAC8C,EAAE,CAAC,OAAO,EAAGxF,KAAc,IAAKmF,IAAI,CAAChF,IAAI,CAAC,IAAInC,QAAQ,CAAC;MAAEgC,KAAK;MAAEI,OAAO,EAAE;IAA4B,CAAE,CAAC,CAAC,CAAC;IAChHsC,KAAK,CAAC8C,EAAE,CAAC,MAAM,EAAGC,GAAQ,IAAI;MAC5BH,MAAM,CAAC3B,IAAI,CAAC8B,GAAG,CAAC;MAChB,IAAI,CAACF,WAAW,EAAE;QAChBA,WAAW,GAAG,IAAI;QAClBG,cAAc,CAAC,MAAK;UAClB,MAAMC,KAAK,GAAGL,MAAM;UACpBA,MAAM,GAAG,EAAE;UACXH,IAAI,CAAC/F,KAAK,CAACuG,KAAK,CAAC;UACjBJ,WAAW,GAAG,KAAK;QACrB,CAAC,CAAC;MACJ;IACF,CAAC,CAAC;IACF7C,KAAK,CAAC8C,EAAE,CAAC,KAAK,EAAE,MAAK;MACnB,IAAIF,MAAM,CAACM,MAAM,GAAG,CAAC,EAAE;QACrBT,IAAI,CAAC/F,KAAK,CAACkG,MAAM,CAAC;QAClBA,MAAM,GAAG,EAAE;MACb;MACAH,IAAI,CAACvC,GAAG,EAAE;IACZ,CAAC,CAAC;IAEF,OAAO;MACLiD,OAAOA,CAAA;QACLnD,KAAK,CAACoD,KAAK,EAAE;MACf,CAAC;MACDC,QAAQA,CAAA;QACNrD,KAAK,CAAC3C,MAAM,EAAE;MAChB;KACD;EACH,CAAC,CAAC,CAAC;AACL","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"MysqlClient.js","names":["Config","Context","Duration","Effect","Layer","Redacted","Stream","Reactivity","Client","AuthenticationError","AuthorizationError","ConnectionError","ConstraintError","DeadlockError","LockTimeoutError","SqlError","SqlSyntaxError","StatementTimeoutError","UniqueViolation","UnknownError","asyncPauseResume","Statement","Mysql","ATTR_DB_SYSTEM_NAME","ATTR_DB_NAMESPACE","ATTR_SERVER_ADDRESS","ATTR_SERVER_PORT","mysqlErrnoFromCause","cause","undefined","errno","mysqlConnectionErrorCodes","Set","mysqlAuthorizationErrorCodes","mysqlSyntaxErrorCodes","mysqlConstraintErrorCodes","UNKNOWN_CONSTRAINT","normalizeConstraintIdentifier","identifier","trimmed","trim","length","mysqlCauseProperty","property","mysqlDuplicateEntryConstraintFromMessage","message","match","exec","mysqlDuplicateEntryConstraintFromCause","constraint","sqlMessageConstraint","classifyError","operation","props","has","TypeId","MysqlClient","Service","make","options","gen","compiler","makeCompiler","transformQueryNames","transformRows","transformResultNames","defaultTransforms","array","defaultMethod","disablePreparedStatements","ConnectionImpl","conn","constructor","runRaw","sql","values","rowsAsArray","method","callback","resume","results","_fields","fail","reason","succeed","run","pipe","map","Array","isArray","execute","params","executeRaw","executeValues","executeValuesUnprepared","executeUnprepared","executeStream","stream","queryStream","mapArray","_","pool","url","createPool","uri","value","multipleStatements","supportBigNumbers","connectionLimit","maxConnections","idleTimeout","connectionTTL","toMillis","fromInputUnsafe","poolConfig","host","port","database","user","username","password","acquireRelease","query","void","end","timeoutOrElse","duration","seconds","orElse","Error","poolConnection","acquireConn","getConnection","sync","release","transactionAcquirer","spanAttributes","Object","entries","push","assign","acquirer","config","layerConfig","effectContext","unwrap","flatMap","client","add","SqlClient","provide","layer","transform","dialect","placeholder","onIdentifier","withoutTransform","escape","onCustom","onRecordUpdate","defaultEscape","fnUntraced","emit","addFinalizer","destroy","buffer","taskPending","on","row","queueMicrotask","items","onPause","pause","onResume"],"sources":["../src/MysqlClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/dist/MysqlMigrator.d.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* MySQL adapter for the shared Effect SQL migration runner.
|
|
3
|
+
*
|
|
4
|
+
* This module re-exports the shared `Migrator` loaders and error types, then
|
|
5
|
+
* provides `run` and `layer` helpers that apply ordered migrations through the
|
|
6
|
+
* current mysql2-backed `SqlClient`. `run` returns the applied migration IDs
|
|
7
|
+
* and names, while `layer` runs migrations during layer construction and
|
|
8
|
+
* provides no services.
|
|
9
|
+
*
|
|
10
|
+
* @since 4.0.0
|
|
3
11
|
*/
|
|
4
12
|
import type * as Effect from "effect/Effect";
|
|
5
13
|
import * as Layer from "effect/Layer";
|
|
@@ -7,17 +15,21 @@ import * as Migrator from "effect/unstable/sql/Migrator";
|
|
|
7
15
|
import type * as Client from "effect/unstable/sql/SqlClient";
|
|
8
16
|
import type { SqlError } from "effect/unstable/sql/SqlError";
|
|
9
17
|
/**
|
|
10
|
-
* @since
|
|
18
|
+
* @since 4.0.0
|
|
11
19
|
*/
|
|
12
20
|
export * from "effect/unstable/sql/Migrator";
|
|
13
21
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
22
|
+
* Runs SQL migrations using the configured `SqlClient`, returning the migrations that were applied.
|
|
23
|
+
*
|
|
24
|
+
* @category constructors
|
|
25
|
+
* @since 4.0.0
|
|
16
26
|
*/
|
|
17
27
|
export declare const run: <R2 = never>({ loader, schemaDirectory, table }: Migrator.MigratorOptions<R2>) => Effect.Effect<ReadonlyArray<readonly [id: number, name: string]>, Migrator.MigrationError | SqlError, Client.SqlClient | R2>;
|
|
18
28
|
/**
|
|
29
|
+
* Creates a layer that runs the configured SQL migrations during layer construction.
|
|
30
|
+
*
|
|
19
31
|
* @category layers
|
|
20
|
-
* @since
|
|
32
|
+
* @since 4.0.0
|
|
21
33
|
*/
|
|
22
34
|
export declare const layer: <R>(options: Migrator.MigratorOptions<R>) => Layer.Layer<never, Migrator.MigrationError | SqlError, Client.SqlClient | R>;
|
|
23
35
|
//# sourceMappingURL=MysqlMigrator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MysqlMigrator.d.ts","sourceRoot":"","sources":["../src/MysqlMigrator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"MysqlMigrator.d.ts","sourceRoot":"","sources":["../src/MysqlMigrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,8BAA8B,CAAA;AACxD,OAAO,KAAK,KAAK,MAAM,MAAM,+BAA+B,CAAA;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAE5D;;GAEG;AACH,cAAc,8BAA8B,CAAA;AAE5C;;;;;GAKG;AACH,eAAO,MAAM,GAAG,EAAE,CAAC,EAAE,GAAG,KAAK,EAC3B,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,KAC7D,MAAM,CAAC,MAAM,CAChB,aAAa,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAClD,QAAQ,CAAC,cAAc,GAAG,QAAQ,EAClC,MAAM,CAAC,SAAS,GAAG,EAAE,CAsDrB,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAAI,CAAC,WACZ,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,KACnC,KAAK,CAAC,KAAK,CACZ,KAAK,EACL,QAAQ,CAAC,cAAc,GAAG,QAAQ,EAClC,MAAM,CAAC,SAAS,GAAG,CAAC,CACgB,CAAA"}
|
package/dist/MysqlMigrator.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import * as Layer from "effect/Layer";
|
|
2
2
|
import * as Migrator from "effect/unstable/sql/Migrator";
|
|
3
3
|
/**
|
|
4
|
-
* @since
|
|
4
|
+
* @since 4.0.0
|
|
5
5
|
*/
|
|
6
6
|
export * from "effect/unstable/sql/Migrator";
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* Runs SQL migrations using the configured `SqlClient`, returning the migrations that were applied.
|
|
9
|
+
*
|
|
10
|
+
* @category constructors
|
|
11
|
+
* @since 4.0.0
|
|
10
12
|
*/
|
|
11
13
|
export const run = /*#__PURE__*/Migrator.make({
|
|
12
14
|
// TODO: re-add when Command module is available
|
|
@@ -63,8 +65,10 @@ export const run = /*#__PURE__*/Migrator.make({
|
|
|
63
65
|
// }
|
|
64
66
|
});
|
|
65
67
|
/**
|
|
68
|
+
* Creates a layer that runs the configured SQL migrations during layer construction.
|
|
69
|
+
*
|
|
66
70
|
* @category layers
|
|
67
|
-
* @since
|
|
71
|
+
* @since 4.0.0
|
|
68
72
|
*/
|
|
69
73
|
export const layer = options => Layer.effectDiscard(run(options));
|
|
70
74
|
//# sourceMappingURL=MysqlMigrator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MysqlMigrator.js","names":["Layer","Migrator","run","make","layer","options","effectDiscard"],"sources":["../src/MysqlMigrator.ts"],"sourcesContent":[null],"mappings":"
|
|
1
|
+
{"version":3,"file":"MysqlMigrator.js","names":["Layer","Migrator","run","make","layer","options","effectDiscard"],"sources":["../src/MysqlMigrator.ts"],"sourcesContent":[null],"mappings":"AAYA,OAAO,KAAKA,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,QAAQ,MAAM,8BAA8B;AAIxD;;;AAGA,cAAc,8BAA8B;AAE5C;;;;;;AAMA,OAAO,MAAMC,GAAG,gBAMZD,QAAQ,CAACE,IAAI,CAAC;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAAA,CACD,CAAC;AAEF;;;;;;AAMA,OAAO,MAAMC,KAAK,GAChBC,OAAoC,IAKjCL,KAAK,CAACM,aAAa,CAACJ,GAAG,CAACG,OAAO,CAAC,CAAC","ignoreList":[]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @since
|
|
2
|
+
* @since 4.0.0
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
|
-
* @since
|
|
5
|
+
* @since 4.0.0
|
|
6
6
|
*/
|
|
7
7
|
export * as MysqlClient from "./MysqlClient.ts";
|
|
8
8
|
/**
|
|
9
|
-
* @since
|
|
9
|
+
* @since 4.0.0
|
|
10
10
|
*/
|
|
11
11
|
export * as MysqlMigrator from "./MysqlMigrator.ts";
|
|
12
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @since
|
|
2
|
+
* @since 4.0.0
|
|
3
3
|
*/
|
|
4
4
|
// @barrel: Auto-generated exports. Do not edit manually.
|
|
5
5
|
/**
|
|
6
|
-
* @since
|
|
6
|
+
* @since 4.0.0
|
|
7
7
|
*/
|
|
8
8
|
export * as MysqlClient from "./MysqlClient.js";
|
|
9
9
|
/**
|
|
10
|
-
* @since
|
|
10
|
+
* @since 4.0.0
|
|
11
11
|
*/
|
|
12
12
|
export * as MysqlMigrator from "./MysqlMigrator.js";
|
|
13
13
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect/sql-mysql2",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.101",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "A MySQL toolkit for Effect",
|
|
7
7
|
"homepage": "https://effect.website",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
|
-
"url": "https://github.com/Effect-TS/effect
|
|
10
|
+
"url": "https://github.com/Effect-TS/effect.git",
|
|
11
11
|
"directory": "packages/sql/mysql2"
|
|
12
12
|
},
|
|
13
13
|
"bugs": {
|
|
14
|
-
"url": "https://github.com/Effect-TS/effect
|
|
14
|
+
"url": "https://github.com/Effect-TS/effect/issues"
|
|
15
15
|
},
|
|
16
16
|
"tags": [
|
|
17
17
|
"typescript",
|
|
@@ -43,19 +43,18 @@
|
|
|
43
43
|
"provenance": true
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@testcontainers/mysql": "^11.
|
|
47
|
-
"effect": "^4.0.0-beta.
|
|
46
|
+
"@testcontainers/mysql": "^11.14.0",
|
|
47
|
+
"effect": "^4.0.0-beta.101"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
|
-
"effect": "^4.0.0-beta.
|
|
50
|
+
"effect": "^4.0.0-beta.101"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"mysql2": "^3.
|
|
53
|
+
"mysql2": "^3.22.6"
|
|
54
54
|
},
|
|
55
55
|
"scripts": {
|
|
56
56
|
"codegen": "effect-utils codegen",
|
|
57
57
|
"build": "tsc -b tsconfig.json && pnpm babel",
|
|
58
|
-
"build:tsgo": "tsgo -b tsconfig.json && pnpm babel",
|
|
59
58
|
"babel": "babel dist --plugins annotate-pure-calls --out-dir dist --source-maps",
|
|
60
59
|
"check": "tsc -b tsconfig.json",
|
|
61
60
|
"test": "vitest",
|
package/src/MysqlClient.ts
CHANGED
|
@@ -1,18 +1,39 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* MySQL adapter for Effect SQL, backed by the `mysql2` driver.
|
|
3
|
+
*
|
|
4
|
+
* This module provides constructors and layers for a {@link MysqlClient} and
|
|
5
|
+
* the generic Effect SQL client service. `make` creates a managed mysql2 pool,
|
|
6
|
+
* checks the connection with `SELECT 1`, maps mysql2 failures to `SqlError`,
|
|
7
|
+
* supports transaction connections, and exposes streaming queries through
|
|
8
|
+
* mysql2 query streams. It also provides direct and config-backed layers plus a
|
|
9
|
+
* MySQL statement compiler.
|
|
10
|
+
*
|
|
11
|
+
* @since 4.0.0
|
|
3
12
|
*/
|
|
4
13
|
import * as Config from "effect/Config"
|
|
14
|
+
import * as Context from "effect/Context"
|
|
5
15
|
import * as Duration from "effect/Duration"
|
|
6
16
|
import * as Effect from "effect/Effect"
|
|
7
17
|
import * as Layer from "effect/Layer"
|
|
8
18
|
import * as Redacted from "effect/Redacted"
|
|
9
19
|
import type { Scope } from "effect/Scope"
|
|
10
|
-
import * as ServiceMap from "effect/ServiceMap"
|
|
11
20
|
import * as Stream from "effect/Stream"
|
|
12
21
|
import * as Reactivity from "effect/unstable/reactivity/Reactivity"
|
|
13
22
|
import * as Client from "effect/unstable/sql/SqlClient"
|
|
14
23
|
import type { Connection } from "effect/unstable/sql/SqlConnection"
|
|
15
|
-
import {
|
|
24
|
+
import {
|
|
25
|
+
AuthenticationError,
|
|
26
|
+
AuthorizationError,
|
|
27
|
+
ConnectionError,
|
|
28
|
+
ConstraintError,
|
|
29
|
+
DeadlockError,
|
|
30
|
+
LockTimeoutError,
|
|
31
|
+
SqlError,
|
|
32
|
+
SqlSyntaxError,
|
|
33
|
+
StatementTimeoutError,
|
|
34
|
+
UniqueViolation,
|
|
35
|
+
UnknownError
|
|
36
|
+
} from "effect/unstable/sql/SqlError"
|
|
16
37
|
import { asyncPauseResume } from "effect/unstable/sql/SqlStream"
|
|
17
38
|
import * as Statement from "effect/unstable/sql/Statement"
|
|
18
39
|
import * as Mysql from "mysql2"
|
|
@@ -22,21 +43,118 @@ const ATTR_DB_NAMESPACE = "db.namespace"
|
|
|
22
43
|
const ATTR_SERVER_ADDRESS = "server.address"
|
|
23
44
|
const ATTR_SERVER_PORT = "server.port"
|
|
24
45
|
|
|
46
|
+
const mysqlErrnoFromCause = (cause: unknown): number | undefined => {
|
|
47
|
+
if (typeof cause !== "object" || cause === null || !("errno" in cause)) {
|
|
48
|
+
return undefined
|
|
49
|
+
}
|
|
50
|
+
const errno = cause.errno
|
|
51
|
+
return typeof errno === "number" ? errno : undefined
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const mysqlConnectionErrorCodes = new Set([1040, 1042, 1043, 1129, 1130, 1203])
|
|
55
|
+
const mysqlAuthorizationErrorCodes = new Set([1044, 1142, 1143, 1227])
|
|
56
|
+
const mysqlSyntaxErrorCodes = new Set([1054, 1064, 1146])
|
|
57
|
+
const mysqlConstraintErrorCodes = new Set([1022, 1048, 1169, 1216, 1217, 1451, 1452, 1557])
|
|
58
|
+
|
|
59
|
+
const UNKNOWN_CONSTRAINT = "unknown"
|
|
60
|
+
|
|
61
|
+
const normalizeConstraintIdentifier = (identifier: unknown): string => {
|
|
62
|
+
if (typeof identifier !== "string") {
|
|
63
|
+
return UNKNOWN_CONSTRAINT
|
|
64
|
+
}
|
|
65
|
+
const trimmed = identifier.trim()
|
|
66
|
+
return trimmed.length === 0 ? UNKNOWN_CONSTRAINT : trimmed
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const mysqlCauseProperty = (cause: unknown, property: "constraint" | "message" | "sqlMessage"): unknown => {
|
|
70
|
+
if (typeof cause !== "object" || cause === null || !(property in cause)) {
|
|
71
|
+
return undefined
|
|
72
|
+
}
|
|
73
|
+
return (cause as Record<string, unknown>)[property]
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const mysqlDuplicateEntryConstraintFromMessage = (message: unknown): string => {
|
|
77
|
+
if (typeof message !== "string") {
|
|
78
|
+
return UNKNOWN_CONSTRAINT
|
|
79
|
+
}
|
|
80
|
+
const match = /\bfor key\s+(?:'([^']*)'|\x60([^\x60]*)\x60|([^\s'\x60]+))/i.exec(message)
|
|
81
|
+
return match === null ?
|
|
82
|
+
UNKNOWN_CONSTRAINT :
|
|
83
|
+
normalizeConstraintIdentifier(match[1] ?? match[2] ?? match[3])
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const mysqlDuplicateEntryConstraintFromCause = (cause: unknown): string => {
|
|
87
|
+
const constraint = normalizeConstraintIdentifier(mysqlCauseProperty(cause, "constraint"))
|
|
88
|
+
if (constraint !== UNKNOWN_CONSTRAINT) {
|
|
89
|
+
return constraint
|
|
90
|
+
}
|
|
91
|
+
const sqlMessageConstraint = mysqlDuplicateEntryConstraintFromMessage(mysqlCauseProperty(cause, "sqlMessage"))
|
|
92
|
+
if (sqlMessageConstraint !== UNKNOWN_CONSTRAINT) {
|
|
93
|
+
return sqlMessageConstraint
|
|
94
|
+
}
|
|
95
|
+
return mysqlDuplicateEntryConstraintFromMessage(mysqlCauseProperty(cause, "message"))
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const classifyError = (
|
|
99
|
+
cause: unknown,
|
|
100
|
+
message: string,
|
|
101
|
+
operation: string
|
|
102
|
+
) => {
|
|
103
|
+
const props = { cause, message, operation }
|
|
104
|
+
const errno = mysqlErrnoFromCause(cause)
|
|
105
|
+
if (errno !== undefined) {
|
|
106
|
+
if (mysqlConnectionErrorCodes.has(errno)) {
|
|
107
|
+
return new ConnectionError(props)
|
|
108
|
+
}
|
|
109
|
+
if (errno === 1045) {
|
|
110
|
+
return new AuthenticationError(props)
|
|
111
|
+
}
|
|
112
|
+
if (mysqlAuthorizationErrorCodes.has(errno)) {
|
|
113
|
+
return new AuthorizationError(props)
|
|
114
|
+
}
|
|
115
|
+
if (mysqlSyntaxErrorCodes.has(errno)) {
|
|
116
|
+
return new SqlSyntaxError(props)
|
|
117
|
+
}
|
|
118
|
+
if (errno === 1062) {
|
|
119
|
+
return new UniqueViolation({ ...props, constraint: mysqlDuplicateEntryConstraintFromCause(cause) })
|
|
120
|
+
}
|
|
121
|
+
if (mysqlConstraintErrorCodes.has(errno)) {
|
|
122
|
+
return new ConstraintError(props)
|
|
123
|
+
}
|
|
124
|
+
if (errno === 1213) {
|
|
125
|
+
return new DeadlockError(props)
|
|
126
|
+
}
|
|
127
|
+
if (errno === 1205) {
|
|
128
|
+
return new LockTimeoutError(props)
|
|
129
|
+
}
|
|
130
|
+
if (errno === 3024) {
|
|
131
|
+
return new StatementTimeoutError(props)
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return new UnknownError(props)
|
|
135
|
+
}
|
|
136
|
+
|
|
25
137
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
138
|
+
* Runtime type identifier used to mark `MysqlClient` values.
|
|
139
|
+
*
|
|
140
|
+
* @category type IDs
|
|
141
|
+
* @since 4.0.0
|
|
28
142
|
*/
|
|
29
143
|
export const TypeId: TypeId = "~@effect/sql-mysql2/MysqlClient"
|
|
30
144
|
|
|
31
145
|
/**
|
|
32
|
-
*
|
|
33
|
-
*
|
|
146
|
+
* Type-level identifier used to mark `MysqlClient` values.
|
|
147
|
+
*
|
|
148
|
+
* @category type IDs
|
|
149
|
+
* @since 4.0.0
|
|
34
150
|
*/
|
|
35
151
|
export type TypeId = "~@effect/sql-mysql2/MysqlClient"
|
|
36
152
|
|
|
37
153
|
/**
|
|
154
|
+
* mysql2-backed SQL client service, extending `SqlClient` with its runtime type marker and client configuration.
|
|
155
|
+
*
|
|
38
156
|
* @category models
|
|
39
|
-
* @since
|
|
157
|
+
* @since 4.0.0
|
|
40
158
|
*/
|
|
41
159
|
export interface MysqlClient extends Client.SqlClient {
|
|
42
160
|
readonly [TypeId]: TypeId
|
|
@@ -44,14 +162,22 @@ export interface MysqlClient extends Client.SqlClient {
|
|
|
44
162
|
}
|
|
45
163
|
|
|
46
164
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
165
|
+
* Service tag for the mysql2 SQL client service.
|
|
166
|
+
*
|
|
167
|
+
* **When to use**
|
|
168
|
+
*
|
|
169
|
+
* Use to access or provide a mysql2 client through the Effect context.
|
|
170
|
+
*
|
|
171
|
+
* @category services
|
|
172
|
+
* @since 4.0.0
|
|
49
173
|
*/
|
|
50
|
-
export const MysqlClient =
|
|
174
|
+
export const MysqlClient = Context.Service<MysqlClient>("@effect/sql-mysql2/MysqlClient")
|
|
51
175
|
|
|
52
176
|
/**
|
|
177
|
+
* Configuration for a mysql2 client, including connection URI or connection fields, pool options, span attributes, and query/result name transforms.
|
|
178
|
+
*
|
|
53
179
|
* @category models
|
|
54
|
-
* @since
|
|
180
|
+
* @since 4.0.0
|
|
55
181
|
*/
|
|
56
182
|
export interface MysqlClientConfig {
|
|
57
183
|
/**
|
|
@@ -70,6 +196,12 @@ export interface MysqlClientConfig {
|
|
|
70
196
|
|
|
71
197
|
readonly poolConfig?: Mysql.PoolOptions | undefined
|
|
72
198
|
|
|
199
|
+
/**
|
|
200
|
+
* Use the text protocol instead of prepared statements, for proxies like
|
|
201
|
+
* Cloudflare Hyperdrive that do not support `COM_STMT_PREPARE`.
|
|
202
|
+
*/
|
|
203
|
+
readonly disablePreparedStatements?: boolean | undefined
|
|
204
|
+
|
|
73
205
|
readonly spanAttributes?: Record<string, unknown> | undefined
|
|
74
206
|
|
|
75
207
|
readonly transformResultNames?: ((str: string) => string) | undefined
|
|
@@ -77,8 +209,10 @@ export interface MysqlClientConfig {
|
|
|
77
209
|
}
|
|
78
210
|
|
|
79
211
|
/**
|
|
212
|
+
* Creates a scoped MySQL client backed by a managed mysql2 pool, verifying connectivity and supporting streaming queries through mysql2 query streams.
|
|
213
|
+
*
|
|
80
214
|
* @category constructors
|
|
81
|
-
* @since
|
|
215
|
+
* @since 4.0.0
|
|
82
216
|
*/
|
|
83
217
|
export const make = (
|
|
84
218
|
options: MysqlClientConfig
|
|
@@ -90,6 +224,7 @@ export const make = (
|
|
|
90
224
|
options.transformResultNames
|
|
91
225
|
).array :
|
|
92
226
|
undefined
|
|
227
|
+
const defaultMethod: "execute" | "query" = options.disablePreparedStatements === true ? "query" : "execute"
|
|
93
228
|
|
|
94
229
|
class ConnectionImpl implements Connection {
|
|
95
230
|
readonly conn: Mysql.PoolConnection | Mysql.Pool
|
|
@@ -101,16 +236,19 @@ export const make = (
|
|
|
101
236
|
sql: string,
|
|
102
237
|
values?: ReadonlyArray<any>,
|
|
103
238
|
rowsAsArray = false,
|
|
104
|
-
method: "execute" | "query" =
|
|
239
|
+
method: "execute" | "query" = defaultMethod
|
|
105
240
|
) {
|
|
106
241
|
return Effect.callback<unknown, SqlError>((resume) => {
|
|
242
|
+
const operation = method === "query" ? "executeUnprepared" : "execute"
|
|
107
243
|
;(this.conn as any)[method]({
|
|
108
244
|
sql,
|
|
109
245
|
values,
|
|
110
246
|
rowsAsArray
|
|
111
247
|
}, (cause: unknown | null, results: unknown, _fields: any) => {
|
|
112
248
|
if (cause) {
|
|
113
|
-
resume(
|
|
249
|
+
resume(
|
|
250
|
+
Effect.fail(new SqlError({ reason: classifyError(cause, "Failed to execute statement", operation) }))
|
|
251
|
+
)
|
|
114
252
|
} else {
|
|
115
253
|
resume(Effect.succeed(results))
|
|
116
254
|
}
|
|
@@ -122,7 +260,7 @@ export const make = (
|
|
|
122
260
|
sql: string,
|
|
123
261
|
values?: ReadonlyArray<any>,
|
|
124
262
|
rowsAsArray = false,
|
|
125
|
-
method: "execute" | "query" =
|
|
263
|
+
method: "execute" | "query" = defaultMethod
|
|
126
264
|
) {
|
|
127
265
|
return this.runRaw(sql, values, rowsAsArray, method).pipe(
|
|
128
266
|
Effect.map((results) => Array.isArray(results) ? results : [])
|
|
@@ -144,6 +282,9 @@ export const make = (
|
|
|
144
282
|
executeValues(sql: string, params: ReadonlyArray<unknown>) {
|
|
145
283
|
return this.run(sql, params, true)
|
|
146
284
|
}
|
|
285
|
+
executeValuesUnprepared(sql: string, params: ReadonlyArray<unknown>) {
|
|
286
|
+
return this.run(sql, params, true, "query")
|
|
287
|
+
}
|
|
147
288
|
executeUnprepared(
|
|
148
289
|
sql: string,
|
|
149
290
|
params: ReadonlyArray<unknown>,
|
|
@@ -186,10 +327,10 @@ export const make = (
|
|
|
186
327
|
: undefined,
|
|
187
328
|
multipleStatements: true,
|
|
188
329
|
supportBigNumbers: true,
|
|
189
|
-
connectionLimit: options.maxConnections,
|
|
330
|
+
connectionLimit: options.maxConnections ?? options.poolConfig?.connectionLimit,
|
|
190
331
|
idleTimeout: options.connectionTTL
|
|
191
332
|
? Duration.toMillis(Duration.fromInputUnsafe(options.connectionTTL))
|
|
192
|
-
:
|
|
333
|
+
: options.poolConfig?.idleTimeout
|
|
193
334
|
} as Mysql.PoolOptions)
|
|
194
335
|
|
|
195
336
|
yield* Effect.acquireRelease(
|
|
@@ -198,8 +339,7 @@ export const make = (
|
|
|
198
339
|
if (cause) {
|
|
199
340
|
resume(Effect.fail(
|
|
200
341
|
new SqlError({
|
|
201
|
-
cause,
|
|
202
|
-
message: "MysqlClient: Failed to connect"
|
|
342
|
+
reason: classifyError(cause, "MysqlClient: Failed to connect", "connect")
|
|
203
343
|
})
|
|
204
344
|
))
|
|
205
345
|
} else {
|
|
@@ -214,11 +354,14 @@ export const make = (
|
|
|
214
354
|
).pipe(
|
|
215
355
|
Effect.timeoutOrElse({
|
|
216
356
|
duration: Duration.seconds(5),
|
|
217
|
-
|
|
357
|
+
orElse: () =>
|
|
218
358
|
Effect.fail(
|
|
219
359
|
new SqlError({
|
|
220
|
-
|
|
221
|
-
|
|
360
|
+
reason: new ConnectionError({
|
|
361
|
+
message: "MysqlClient: Connection timeout",
|
|
362
|
+
cause: new Error("connection timeout"),
|
|
363
|
+
operation: "connect"
|
|
364
|
+
})
|
|
222
365
|
})
|
|
223
366
|
)
|
|
224
367
|
})
|
|
@@ -230,7 +373,13 @@ export const make = (
|
|
|
230
373
|
Effect.callback<Mysql.PoolConnection, SqlError>((resume) => {
|
|
231
374
|
pool.getConnection((cause, conn) => {
|
|
232
375
|
if (cause) {
|
|
233
|
-
resume(
|
|
376
|
+
resume(
|
|
377
|
+
Effect.fail(
|
|
378
|
+
new SqlError({
|
|
379
|
+
reason: classifyError(cause, "Failed to acquire connection", "acquireConnection")
|
|
380
|
+
})
|
|
381
|
+
)
|
|
382
|
+
)
|
|
234
383
|
} else {
|
|
235
384
|
resume(Effect.succeed(conn))
|
|
236
385
|
}
|
|
@@ -268,40 +417,46 @@ export const make = (
|
|
|
268
417
|
})
|
|
269
418
|
|
|
270
419
|
/**
|
|
420
|
+
* Creates a layer from a `Config`-wrapped MySQL client configuration, providing both `MysqlClient` and `SqlClient`.
|
|
421
|
+
*
|
|
271
422
|
* @category layers
|
|
272
|
-
* @since
|
|
423
|
+
* @since 4.0.0
|
|
273
424
|
*/
|
|
274
425
|
export const layerConfig = (
|
|
275
426
|
config: Config.Wrap<MysqlClientConfig>
|
|
276
427
|
): Layer.Layer<MysqlClient | Client.SqlClient, Config.ConfigError | SqlError> =>
|
|
277
|
-
Layer.
|
|
278
|
-
Config.unwrap(config).
|
|
428
|
+
Layer.effectContext(
|
|
429
|
+
Config.unwrap(config).pipe(
|
|
279
430
|
Effect.flatMap(make),
|
|
280
431
|
Effect.map((client) =>
|
|
281
|
-
|
|
282
|
-
|
|
432
|
+
Context.make(MysqlClient, client).pipe(
|
|
433
|
+
Context.add(Client.SqlClient, client)
|
|
283
434
|
)
|
|
284
435
|
)
|
|
285
436
|
)
|
|
286
437
|
).pipe(Layer.provide(Reactivity.layer))
|
|
287
438
|
|
|
288
439
|
/**
|
|
440
|
+
* Creates a layer from a concrete MySQL client configuration, providing both `MysqlClient` and `SqlClient`.
|
|
441
|
+
*
|
|
289
442
|
* @category layers
|
|
290
|
-
* @since
|
|
443
|
+
* @since 4.0.0
|
|
291
444
|
*/
|
|
292
445
|
export const layer = (
|
|
293
446
|
config: MysqlClientConfig
|
|
294
447
|
): Layer.Layer<MysqlClient | Client.SqlClient, Config.ConfigError | SqlError> =>
|
|
295
|
-
Layer.
|
|
448
|
+
Layer.effectContext(
|
|
296
449
|
Effect.map(make(config), (client) =>
|
|
297
|
-
|
|
298
|
-
|
|
450
|
+
Context.make(MysqlClient, client).pipe(
|
|
451
|
+
Context.add(Client.SqlClient, client)
|
|
299
452
|
))
|
|
300
453
|
).pipe(Layer.provide(Reactivity.layer))
|
|
301
454
|
|
|
302
455
|
/**
|
|
456
|
+
* Creates the MySQL statement compiler, using `?` placeholders and backtick-escaped identifiers.
|
|
457
|
+
*
|
|
303
458
|
* @category compiler
|
|
304
|
-
* @since
|
|
459
|
+
* @since 4.0.0
|
|
305
460
|
*/
|
|
306
461
|
export const makeCompiler = (transform?: (_: string) => string) =>
|
|
307
462
|
Statement.makeCompiler({
|
|
@@ -331,11 +486,15 @@ function queryStream(
|
|
|
331
486
|
) {
|
|
332
487
|
return asyncPauseResume<any, SqlError>(Effect.fnUntraced(function*(emit) {
|
|
333
488
|
const query = (conn as any).query(sql, params).stream()
|
|
334
|
-
yield* Effect.addFinalizer(() => Effect.sync(() => query.destroy()))
|
|
489
|
+
yield* Effect.addFinalizer(() => Effect.sync(() => query.destroy() as void))
|
|
335
490
|
|
|
336
491
|
let buffer: Array<any> = []
|
|
337
492
|
let taskPending = false
|
|
338
|
-
query.on(
|
|
493
|
+
query.on(
|
|
494
|
+
"error",
|
|
495
|
+
(cause: unknown) =>
|
|
496
|
+
emit.fail(new SqlError({ reason: classifyError(cause, "Failed to stream statement", "stream") }))
|
|
497
|
+
)
|
|
339
498
|
query.on("data", (row: any) => {
|
|
340
499
|
buffer.push(row)
|
|
341
500
|
if (!taskPending) {
|
package/src/MysqlMigrator.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* MySQL adapter for the shared Effect SQL migration runner.
|
|
3
|
+
*
|
|
4
|
+
* This module re-exports the shared `Migrator` loaders and error types, then
|
|
5
|
+
* provides `run` and `layer` helpers that apply ordered migrations through the
|
|
6
|
+
* current mysql2-backed `SqlClient`. `run` returns the applied migration IDs
|
|
7
|
+
* and names, while `layer` runs migrations during layer construction and
|
|
8
|
+
* provides no services.
|
|
9
|
+
*
|
|
10
|
+
* @since 4.0.0
|
|
3
11
|
*/
|
|
4
12
|
import type * as Effect from "effect/Effect"
|
|
5
13
|
import * as Layer from "effect/Layer"
|
|
@@ -8,13 +16,15 @@ import type * as Client from "effect/unstable/sql/SqlClient"
|
|
|
8
16
|
import type { SqlError } from "effect/unstable/sql/SqlError"
|
|
9
17
|
|
|
10
18
|
/**
|
|
11
|
-
* @since
|
|
19
|
+
* @since 4.0.0
|
|
12
20
|
*/
|
|
13
21
|
export * from "effect/unstable/sql/Migrator"
|
|
14
22
|
|
|
15
23
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
24
|
+
* Runs SQL migrations using the configured `SqlClient`, returning the migrations that were applied.
|
|
25
|
+
*
|
|
26
|
+
* @category constructors
|
|
27
|
+
* @since 4.0.0
|
|
18
28
|
*/
|
|
19
29
|
export const run: <R2 = never>(
|
|
20
30
|
{ loader, schemaDirectory, table }: Migrator.MigratorOptions<R2>
|
|
@@ -78,8 +88,10 @@ export const run: <R2 = never>(
|
|
|
78
88
|
})
|
|
79
89
|
|
|
80
90
|
/**
|
|
91
|
+
* Creates a layer that runs the configured SQL migrations during layer construction.
|
|
92
|
+
*
|
|
81
93
|
* @category layers
|
|
82
|
-
* @since
|
|
94
|
+
* @since 4.0.0
|
|
83
95
|
*/
|
|
84
96
|
export const layer = <R>(
|
|
85
97
|
options: Migrator.MigratorOptions<R>
|
package/src/index.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @since
|
|
2
|
+
* @since 4.0.0
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
// @barrel: Auto-generated exports. Do not edit manually.
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* @since
|
|
8
|
+
* @since 4.0.0
|
|
9
9
|
*/
|
|
10
10
|
export * as MysqlClient from "./MysqlClient.ts"
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
|
-
* @since
|
|
13
|
+
* @since 4.0.0
|
|
14
14
|
*/
|
|
15
15
|
export * as MysqlMigrator from "./MysqlMigrator.ts"
|