spindb 0.68.8 → 0.68.10
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/dist/config/version.js +1 -1
- package/dist/config/version.js.map +1 -1
- package/dist/core/server-handshake.js +12 -1
- package/dist/core/server-handshake.js.map +1 -1
- package/dist/engines/mysql/dump-normalize.js +90 -7
- package/dist/engines/mysql/dump-normalize.js.map +1 -1
- package/package.json +1 -1
package/dist/config/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../config/version.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,MAAM,CAAC,MAAM,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../config/version.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAA"}
|
|
@@ -77,9 +77,20 @@ export function parseMysqlWireHandshake(buffer) {
|
|
|
77
77
|
'(expected 0x0a). This does not look like a MySQL-protocol server.',
|
|
78
78
|
};
|
|
79
79
|
}
|
|
80
|
+
// The payload is already complete at this point (the header's declared
|
|
81
|
+
// length was satisfied above), so a missing NUL terminator is not "more
|
|
82
|
+
// bytes are coming" - it is a packet that cannot be a greeting. Reporting
|
|
83
|
+
// `incomplete` here stalls the probe for the whole timeout on a server that
|
|
84
|
+
// is never going to send anything else, which is exactly the trap the
|
|
85
|
+
// empty-payload case above exists to avoid.
|
|
80
86
|
const terminator = payload.indexOf(0x00, 1);
|
|
81
87
|
if (terminator === -1) {
|
|
82
|
-
return {
|
|
88
|
+
return {
|
|
89
|
+
kind: 'error',
|
|
90
|
+
errorCode: null,
|
|
91
|
+
message: 'Server sent a greeting with no server version string. ' +
|
|
92
|
+
'This does not look like a MySQL-protocol server.',
|
|
93
|
+
};
|
|
83
94
|
}
|
|
84
95
|
return {
|
|
85
96
|
kind: 'handshake',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-handshake.js","sourceRoot":"","sources":["../../core/server-handshake.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE1C,MAAM,YAAY,GAAG,CAAC,CAAA;AACtB,MAAM,sBAAsB,GAAG,IAAI,CAAA;AACnC,MAAM,iBAAiB,GAAG,IAAI,CAAA;AAC9B,MAAM,eAAe,GAAG,IAAI,CAAA,CAAC,MAAM;AACnC,MAAM,cAAc,GAAG,CAAC,CAAA,CAAC,wBAAwB;AACjD,MAAM,kBAAkB,GAAG,IAAI,CAAA;AAa/B;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAc;IACpD,IAAI,MAAM,CAAC,MAAM,GAAG,YAAY,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAA;IAC/B,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7C,IAAI,MAAM,CAAC,MAAM,GAAG,YAAY,GAAG,aAAa,EAAE,CAAC;QACjD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAA;IAC/B,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY,GAAG,aAAa,CAAC,CAAA;IAE3E,4EAA4E;IAC5E,qEAAqE;IACrE,yEAAyE;IACzE,sCAAsC;IACtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,IAAI,EAAE,OAAO;YACb,SAAS,EAAE,IAAI;YACf,OAAO,EACL,qDAAqD;gBACrD,kDAAkD;SACrD,CAAA;IACH,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,iBAAiB,EAAE,CAAC;QACrC,OAAO,cAAc,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,sBAAsB,EAAE,CAAC;QAC1C,OAAO;YACL,IAAI,EAAE,OAAO;YACb,SAAS,EAAE,IAAI;YACf,OAAO,EACL,2CAA2C,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG;gBACrE,mEAAmE;SACtE,CAAA;IACH,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAC3C,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,OAAO,
|
|
1
|
+
{"version":3,"file":"server-handshake.js","sourceRoot":"","sources":["../../core/server-handshake.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,7 +28,11 @@
|
|
|
28
28
|
* `json_valid()`.
|
|
29
29
|
*
|
|
30
30
|
* Every rule is line-oriented, so a multi-gigabyte dump is rewritten as a
|
|
31
|
-
* stream and never held in memory.
|
|
31
|
+
* stream and never held in memory. The rules are applied through a small
|
|
32
|
+
* statement-aware wrapper (`createMariaDbDumpNormalizer`) rather than to each
|
|
33
|
+
* line in isolation, because `mariadb-dump` writes an extended insert across
|
|
34
|
+
* many lines and only the first of them starts with the `INSERT` keyword the
|
|
35
|
+
* row guard matches on.
|
|
32
36
|
*/
|
|
33
37
|
import { createReadStream, createWriteStream } from 'fs';
|
|
34
38
|
import { createInterface } from 'readline';
|
|
@@ -119,6 +123,20 @@ export function normalizeMariaDbDumpForMysql(line) {
|
|
|
119
123
|
counts.sandboxDirectivesDropped = 1;
|
|
120
124
|
return { line: null, counts };
|
|
121
125
|
}
|
|
126
|
+
// A row is data, never DDL. A collation name is an ordinary string that a
|
|
127
|
+
// user is entitled to store (a migration log, a schema-tracking table, an
|
|
128
|
+
// ORM's own bookkeeping), and rewriting it would put different bytes in the
|
|
129
|
+
// target than the source holds - the exact outcome the sql_mode rule below
|
|
130
|
+
// already refuses. No INSERT or REPLACE in a dump carries a collation that
|
|
131
|
+
// needs converting, so the whole line is left alone.
|
|
132
|
+
//
|
|
133
|
+
// This guard only sees the line that carries the keyword. An extended insert
|
|
134
|
+
// spans many lines and only the first one starts with `INSERT`, so the rest
|
|
135
|
+
// of the statement is protected by `createMariaDbDumpNormalizer`, not here.
|
|
136
|
+
// Call that, not this, to rewrite a real dump.
|
|
137
|
+
if (ROW_STATEMENT.test(line)) {
|
|
138
|
+
return { line, counts };
|
|
139
|
+
}
|
|
122
140
|
let result = line.replace(UTF8MB4_UCA1400, (_match, suffix) => {
|
|
123
141
|
counts.collationsMapped++;
|
|
124
142
|
return mapUca1400Collation(suffix);
|
|
@@ -128,8 +146,7 @@ export function normalizeMariaDbDumpForMysql(line) {
|
|
|
128
146
|
return mapUca1400Utf8mb3Collation(suffix);
|
|
129
147
|
});
|
|
130
148
|
if (result.includes(NO_AUTO_CREATE_USER) &&
|
|
131
|
-
SQL_MODE_ASSIGNMENT.test(result)
|
|
132
|
-
!ROW_STATEMENT.test(result)) {
|
|
149
|
+
SQL_MODE_ASSIGNMENT.test(result)) {
|
|
133
150
|
result = result.replace(/'([^']*)'/g, (match, contents) => {
|
|
134
151
|
if (!contents.includes(NO_AUTO_CREATE_USER))
|
|
135
152
|
return match;
|
|
@@ -146,21 +163,87 @@ export function normalizeMariaDbDumpForMysql(line) {
|
|
|
146
163
|
return { line: result, counts };
|
|
147
164
|
}
|
|
148
165
|
/**
|
|
149
|
-
*
|
|
166
|
+
* A statement-aware normalizer over the pure line rules.
|
|
167
|
+
*
|
|
168
|
+
* `mariadb-dump` 11.x writes an extended insert as one statement spread over
|
|
169
|
+
* many lines, one row per line:
|
|
170
|
+
*
|
|
171
|
+
* ```sql
|
|
172
|
+
* INSERT INTO `t_text` VALUES
|
|
173
|
+
* (1,'moved the table to utf8mb4_uca1400_ai_ci last week'),
|
|
174
|
+
* (2,'sql_mode was STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER before');
|
|
175
|
+
* ```
|
|
176
|
+
*
|
|
177
|
+
* Only the first line starts with `INSERT`, so a per-line row guard protects
|
|
178
|
+
* that line and none of the rows under it: a row whose own text names a
|
|
179
|
+
* uca1400 collation was rewritten and arrived in MySQL saying something the
|
|
180
|
+
* source never said. (The `NO_AUTO_CREATE_USER` rule survived this only
|
|
181
|
+
* because it is anchored to a `SET sql_mode` context, which a row line has
|
|
182
|
+
* no reason to match.)
|
|
183
|
+
*
|
|
184
|
+
* So the row guard is carried across lines: once a row statement opens, every
|
|
185
|
+
* line passes through untouched until the statement terminates.
|
|
186
|
+
*
|
|
187
|
+
* **Termination is "the trimmed line ends with `;`".** That is safe for a
|
|
188
|
+
* dump, and only for a dump: `mariadb-dump` (and `mysqldump`) escape `\n` and
|
|
189
|
+
* `\r` inside string literals, so a value never ends a physical line, and the
|
|
190
|
+
* generator always closes the statement at the end of its own line. A
|
|
191
|
+
* hand-written SQL file could end a line with a `;` inside a string literal
|
|
192
|
+
* and close the guard early; a dump cannot, and a dump is the only input this
|
|
193
|
+
* converts.
|
|
194
|
+
*
|
|
195
|
+
* Deliberately unchanged: `LOAD DATA` and a bare `VALUES` statement are not
|
|
196
|
+
* treated as row statements (`mariadb-dump` emits neither in the output we
|
|
197
|
+
* convert, and the rules do not corrupt them), and `/*!...*\/` versioned
|
|
198
|
+
* comment lines keep taking the ordinary rules, which is what strips
|
|
199
|
+
* `NO_AUTO_CREATE_USER` out of the `/*!50003 SET sql_mode = ... *\/` line
|
|
200
|
+
* around every trigger.
|
|
201
|
+
*/
|
|
202
|
+
export function createMariaDbDumpNormalizer() {
|
|
203
|
+
let inRowStatement = false;
|
|
204
|
+
return {
|
|
205
|
+
next(line) {
|
|
206
|
+
const terminates = line.trim().endsWith(';');
|
|
207
|
+
if (inRowStatement) {
|
|
208
|
+
if (terminates)
|
|
209
|
+
inRowStatement = false;
|
|
210
|
+
return { line, counts: emptyNormalizationCounts() };
|
|
211
|
+
}
|
|
212
|
+
const normalized = normalizeMariaDbDumpForMysql(line);
|
|
213
|
+
if (ROW_STATEMENT.test(line) && !terminates)
|
|
214
|
+
inRowStatement = true;
|
|
215
|
+
return normalized;
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Stream a MariaDB dump through `createMariaDbDumpNormalizer`, writing the
|
|
150
221
|
* MySQL-ready result to a new file.
|
|
151
222
|
*
|
|
152
223
|
* Line by line with explicit backpressure: a dump is routinely larger than the
|
|
153
224
|
* process can hold, so it is never read into a string.
|
|
225
|
+
*
|
|
226
|
+
* **Read and written as `latin1`, never `utf8`.** A dump is not guaranteed to
|
|
227
|
+
* be valid UTF-8: a `latin1` column, or a BLOB that `mariadb-dump` writes as
|
|
228
|
+
* escaped bytes rather than a hex literal, puts arbitrary bytes above 0x7F in
|
|
229
|
+
* the file. Decoding those as UTF-8 replaces every invalid sequence with
|
|
230
|
+
* U+FFFD, so the conversion silently rewrote the user's data (a `0x80 0xFF`
|
|
231
|
+
* BLOB came out as six `EF BF BD` bytes). `latin1` maps bytes 1:1 to code
|
|
232
|
+
* points 0-255 and back, so the file round-trips byte for byte and only the
|
|
233
|
+
* ASCII tokens the rules match are ever changed. Line splitting stays correct
|
|
234
|
+
* because MySQL escapes `\n` and `\r` inside string literals, so a raw
|
|
235
|
+
* newline byte never appears in dump data.
|
|
154
236
|
*/
|
|
155
237
|
export async function normalizeMariaDbDumpFile(options) {
|
|
156
238
|
const { inputPath, outputPath } = options;
|
|
157
239
|
const counts = emptyNormalizationCounts();
|
|
158
|
-
const input = createReadStream(inputPath, { encoding: '
|
|
159
|
-
const output = createWriteStream(outputPath);
|
|
240
|
+
const input = createReadStream(inputPath, { encoding: 'latin1' });
|
|
241
|
+
const output = createWriteStream(outputPath, { encoding: 'latin1' });
|
|
160
242
|
const lines = createInterface({ input, crlfDelay: Infinity });
|
|
243
|
+
const normalizer = createMariaDbDumpNormalizer();
|
|
161
244
|
try {
|
|
162
245
|
for await (const line of lines) {
|
|
163
|
-
const normalized =
|
|
246
|
+
const normalized = normalizer.next(line);
|
|
164
247
|
counts.collationsMapped += normalized.counts.collationsMapped;
|
|
165
248
|
counts.sqlModeFlagsRemoved += normalized.counts.sqlModeFlagsRemoved;
|
|
166
249
|
counts.sandboxDirectivesDropped +=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dump-normalize.js","sourceRoot":"","sources":["../../../engines/mysql/dump-normalize.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dump-normalize.js","sourceRoot":"","sources":["../../../engines/mysql/dump-normalize.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spindb",
|
|
3
|
-
"version": "0.68.
|
|
3
|
+
"version": "0.68.10",
|
|
4
4
|
"author": "Bob Bass <bob@bbass.co>",
|
|
5
5
|
"license": "PolyForm-Noncommercial-1.0.0",
|
|
6
6
|
"description": "Zero-config Docker-free local database containers. Create, backup, and clone a variety of popular databases.",
|