spindb 0.44.1 → 0.45.1
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 +22 -10
- package/dist/cli/commands/create.js +6 -1
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/engines.js +46 -0
- package/dist/cli/commands/engines.js.map +1 -1
- package/dist/cli/commands/menu/backup-handlers.js +5 -0
- package/dist/cli/commands/menu/backup-handlers.js.map +1 -1
- package/dist/cli/commands/menu/settings-handlers.js +3 -0
- package/dist/cli/commands/menu/settings-handlers.js.map +1 -1
- package/dist/cli/commands/menu/shell-handlers.js +31 -1
- package/dist/cli/commands/menu/shell-handlers.js.map +1 -1
- package/dist/cli/constants.js +4 -0
- package/dist/cli/constants.js.map +1 -1
- package/dist/cli/helpers.js +53 -2
- package/dist/cli/helpers.js.map +1 -1
- package/dist/config/backup-formats.js +18 -0
- package/dist/config/backup-formats.js.map +1 -1
- package/dist/config/engine-defaults.js +13 -0
- package/dist/config/engine-defaults.js.map +1 -1
- package/dist/config/engines.json +18 -0
- package/dist/config/version.js +1 -1
- package/dist/core/config-manager.js +4 -1
- package/dist/core/config-manager.js.map +1 -1
- package/dist/core/credential-manager.js +2 -0
- package/dist/core/credential-manager.js.map +1 -1
- package/dist/core/database-capabilities.js +8 -0
- package/dist/core/database-capabilities.js.map +1 -1
- package/dist/core/dependency-manager.js +2 -0
- package/dist/core/dependency-manager.js.map +1 -1
- package/dist/core/docker-exporter.js +12 -0
- package/dist/core/docker-exporter.js.map +1 -1
- package/dist/core/remote-container.js +2 -0
- package/dist/core/remote-container.js.map +1 -1
- package/dist/engines/index.js +5 -1
- package/dist/engines/index.js.map +1 -1
- package/dist/engines/libsql/api-client.js +134 -0
- package/dist/engines/libsql/api-client.js.map +1 -0
- package/dist/engines/libsql/backup.js +151 -0
- package/dist/engines/libsql/backup.js.map +1 -0
- package/dist/engines/libsql/binary-manager.js +31 -0
- package/dist/engines/libsql/binary-manager.js.map +1 -0
- package/dist/engines/libsql/binary-urls.js +50 -0
- package/dist/engines/libsql/binary-urls.js.map +1 -0
- package/dist/engines/libsql/hostdb-releases.js +21 -0
- package/dist/engines/libsql/hostdb-releases.js.map +1 -0
- package/dist/engines/libsql/index.js +578 -0
- package/dist/engines/libsql/index.js.map +1 -0
- package/dist/engines/libsql/restore.js +219 -0
- package/dist/engines/libsql/restore.js.map +1 -0
- package/dist/engines/libsql/version-maps.js +63 -0
- package/dist/engines/libsql/version-maps.js.map +1 -0
- package/dist/engines/libsql/version-validator.js +111 -0
- package/dist/engines/libsql/version-validator.js.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* libSQL restore module
|
|
3
|
+
* Supports binary (file copy) and SQL import restore formats
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync } from 'fs';
|
|
6
|
+
import { readFile, mkdir, cp, rm } from 'fs/promises';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { logDebug } from '../../core/error-handler.js';
|
|
9
|
+
import { paths } from '../../config/paths.js';
|
|
10
|
+
import { loadCredentials, getDefaultUsername, } from '../../core/credential-manager.js';
|
|
11
|
+
import { libsqlQuery } from './api-client.js';
|
|
12
|
+
import { Engine, } from '../../types/index.js';
|
|
13
|
+
/**
|
|
14
|
+
* Split SQL content into individual statements, respecting quoted strings
|
|
15
|
+
* and comments. Avoids breaking on semicolons inside string literals.
|
|
16
|
+
*/
|
|
17
|
+
function splitSqlStatements(content) {
|
|
18
|
+
const statements = [];
|
|
19
|
+
let current = '';
|
|
20
|
+
let inSingleQuote = false;
|
|
21
|
+
let inDoubleQuote = false;
|
|
22
|
+
let inLineComment = false;
|
|
23
|
+
let inBlockComment = false;
|
|
24
|
+
let i = 0;
|
|
25
|
+
while (i < content.length) {
|
|
26
|
+
const ch = content[i];
|
|
27
|
+
const next = content[i + 1];
|
|
28
|
+
if (inLineComment) {
|
|
29
|
+
if (ch === '\n') {
|
|
30
|
+
inLineComment = false;
|
|
31
|
+
}
|
|
32
|
+
i++;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (inBlockComment) {
|
|
36
|
+
if (ch === '*' && next === '/') {
|
|
37
|
+
inBlockComment = false;
|
|
38
|
+
i += 2;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
i++;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (inSingleQuote) {
|
|
45
|
+
current += ch;
|
|
46
|
+
if (ch === "'" && next === "'") {
|
|
47
|
+
current += next;
|
|
48
|
+
i += 2;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (ch === "'") {
|
|
52
|
+
inSingleQuote = false;
|
|
53
|
+
}
|
|
54
|
+
i++;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (inDoubleQuote) {
|
|
58
|
+
current += ch;
|
|
59
|
+
if (ch === '"' && next === '"') {
|
|
60
|
+
current += next;
|
|
61
|
+
i += 2;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (ch === '"') {
|
|
65
|
+
inDoubleQuote = false;
|
|
66
|
+
}
|
|
67
|
+
i++;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
// Not inside any quote or comment
|
|
71
|
+
if (ch === '-' && next === '-') {
|
|
72
|
+
inLineComment = true;
|
|
73
|
+
i += 2;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (ch === '/' && next === '*') {
|
|
77
|
+
inBlockComment = true;
|
|
78
|
+
i += 2;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (ch === "'") {
|
|
82
|
+
inSingleQuote = true;
|
|
83
|
+
current += ch;
|
|
84
|
+
i++;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (ch === '"') {
|
|
88
|
+
inDoubleQuote = true;
|
|
89
|
+
current += ch;
|
|
90
|
+
i++;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (ch === ';') {
|
|
94
|
+
const trimmed = current.trim();
|
|
95
|
+
if (trimmed) {
|
|
96
|
+
statements.push(trimmed);
|
|
97
|
+
}
|
|
98
|
+
current = '';
|
|
99
|
+
i++;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
current += ch;
|
|
103
|
+
i++;
|
|
104
|
+
}
|
|
105
|
+
const trimmed = current.trim();
|
|
106
|
+
if (trimmed) {
|
|
107
|
+
statements.push(trimmed);
|
|
108
|
+
}
|
|
109
|
+
return statements;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Detect the backup format from a file path
|
|
113
|
+
*/
|
|
114
|
+
export function detectBackupFormat(filePath) {
|
|
115
|
+
if (filePath.endsWith('.sql')) {
|
|
116
|
+
return {
|
|
117
|
+
format: 'sql',
|
|
118
|
+
description: 'SQL dump',
|
|
119
|
+
restoreCommand: `spindb restore <container> ${filePath}`,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
if (filePath.endsWith('.db')) {
|
|
123
|
+
return {
|
|
124
|
+
format: 'binary',
|
|
125
|
+
description: 'Binary database copy',
|
|
126
|
+
restoreCommand: `spindb restore <container> ${filePath}`,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// Default to binary format for unknown extensions
|
|
130
|
+
return {
|
|
131
|
+
format: 'binary',
|
|
132
|
+
description: 'Binary database copy (assumed)',
|
|
133
|
+
restoreCommand: `spindb restore <container> ${filePath}`,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Restore a libSQL backup
|
|
138
|
+
*/
|
|
139
|
+
export async function restoreBackup(backupPath, options) {
|
|
140
|
+
if (!existsSync(backupPath)) {
|
|
141
|
+
throw new Error(`Backup file not found: ${backupPath}`);
|
|
142
|
+
}
|
|
143
|
+
const format = options.format || detectBackupFormat(backupPath).format;
|
|
144
|
+
if (format === 'sql') {
|
|
145
|
+
return restoreSqlBackup(backupPath, options);
|
|
146
|
+
}
|
|
147
|
+
return restoreBinaryBackup(backupPath, options);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Restore from a binary backup by copying the database directory.
|
|
151
|
+
* sqld's data.db is a directory tree, not a single file.
|
|
152
|
+
* Requires the server to be stopped.
|
|
153
|
+
*/
|
|
154
|
+
async function restoreBinaryBackup(backupPath, options) {
|
|
155
|
+
const dataDir = options.dataDir ||
|
|
156
|
+
join(paths.getContainerPath(options.containerName, { engine: 'libsql' }), 'data');
|
|
157
|
+
const dbPath = join(dataDir, 'data.db');
|
|
158
|
+
logDebug(`Restoring binary backup to ${dbPath}`);
|
|
159
|
+
// Ensure data directory exists
|
|
160
|
+
if (!existsSync(dataDir)) {
|
|
161
|
+
await mkdir(dataDir, { recursive: true });
|
|
162
|
+
}
|
|
163
|
+
// Remove existing data.db directory/file before restoring
|
|
164
|
+
if (existsSync(dbPath)) {
|
|
165
|
+
await rm(dbPath, { recursive: true, force: true });
|
|
166
|
+
}
|
|
167
|
+
// Copy the backup directory tree
|
|
168
|
+
await cp(backupPath, dbPath, { recursive: true });
|
|
169
|
+
return {
|
|
170
|
+
format: 'binary',
|
|
171
|
+
stdout: `Restored binary backup to ${dbPath}. Start the container to use it.`,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Restore from a SQL dump via the HTTP API
|
|
176
|
+
* Requires the server to be running
|
|
177
|
+
*/
|
|
178
|
+
async function restoreSqlBackup(backupPath, options) {
|
|
179
|
+
const port = options.port;
|
|
180
|
+
if (!port) {
|
|
181
|
+
throw new Error('SQL restore requires a running container. Start the container first, then retry.');
|
|
182
|
+
}
|
|
183
|
+
logDebug(`Restoring SQL backup via HTTP API on port ${port}`);
|
|
184
|
+
// Load auth token if credentials are stored
|
|
185
|
+
const username = getDefaultUsername(Engine.LibSQL);
|
|
186
|
+
const creds = await loadCredentials(options.containerName, Engine.LibSQL, username);
|
|
187
|
+
const authToken = creds?.apiKey ?? undefined;
|
|
188
|
+
const content = await readFile(backupPath, 'utf-8');
|
|
189
|
+
// Split into individual statements using a state machine that respects
|
|
190
|
+
// quoted strings and comments (avoids breaking on semicolons inside literals)
|
|
191
|
+
const statements = splitSqlStatements(content);
|
|
192
|
+
let executed = 0;
|
|
193
|
+
const failures = [];
|
|
194
|
+
for (const stmt of statements) {
|
|
195
|
+
// Skip transaction control statements - sqld handles transactions differently
|
|
196
|
+
if (/^(BEGIN|COMMIT|ROLLBACK)\b/i.test(stmt))
|
|
197
|
+
continue;
|
|
198
|
+
try {
|
|
199
|
+
await libsqlQuery(port, `${stmt};`, { authToken });
|
|
200
|
+
executed++;
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
const message = error.message;
|
|
204
|
+
const preview = stmt.length > 80 ? `${stmt.slice(0, 80)}...` : stmt;
|
|
205
|
+
failures.push({ statement: preview, error: message });
|
|
206
|
+
logDebug(`Warning: statement failed during restore: ${message}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
let summary = `Restored ${executed} SQL statements from backup.`;
|
|
210
|
+
if (failures.length > 0) {
|
|
211
|
+
summary += ` ${failures.length} statement(s) failed.`;
|
|
212
|
+
logDebug(`Restore failures:\n${failures.map((f) => ` ${f.statement}: ${f.error}`).join('\n')}`);
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
format: 'sql',
|
|
216
|
+
stdout: summary,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=restore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore.js","sourceRoot":"","sources":["../../../engines/libsql/restore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* libSQL Version Maps
|
|
3
|
+
*
|
|
4
|
+
* TEMPORARY: This version map will be replaced by the hostdb npm package once published.
|
|
5
|
+
* Until then, manually keep this in sync with robertjbass/hostdb releases.json:
|
|
6
|
+
* https://github.com/robertjbass/hostdb/blob/main/releases.json
|
|
7
|
+
*
|
|
8
|
+
* When updating versions:
|
|
9
|
+
* 1. Check hostdb releases.json for available versions
|
|
10
|
+
* 2. Update LIBSQL_VERSION_MAP to match
|
|
11
|
+
*/
|
|
12
|
+
import { logDebug } from '../../core/error-handler.js';
|
|
13
|
+
/**
|
|
14
|
+
* Map of major libSQL versions to their latest stable patch versions.
|
|
15
|
+
* Must match versions available in hostdb releases.json.
|
|
16
|
+
*/
|
|
17
|
+
export const LIBSQL_VERSION_MAP = {
|
|
18
|
+
// 1-part: major version -> latest
|
|
19
|
+
'0': '0.24.32',
|
|
20
|
+
// 2-part: major.minor -> latest patch
|
|
21
|
+
'0.24': '0.24.32',
|
|
22
|
+
// 3-part: exact version (identity mapping)
|
|
23
|
+
'0.24.32': '0.24.32',
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Supported major libSQL versions (1-part format).
|
|
27
|
+
* Used for grouping and display purposes.
|
|
28
|
+
*/
|
|
29
|
+
export const SUPPORTED_MAJOR_VERSIONS = ['0'];
|
|
30
|
+
/**
|
|
31
|
+
* Get the full version string for a major version.
|
|
32
|
+
*
|
|
33
|
+
* @param majorVersion - Major version (e.g., '0')
|
|
34
|
+
* @returns Full version string (e.g., '0.24.32') or null if not supported
|
|
35
|
+
*/
|
|
36
|
+
export function getFullVersion(majorVersion) {
|
|
37
|
+
return LIBSQL_VERSION_MAP[majorVersion] || null;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Normalize a version string to X.Y.Z format.
|
|
41
|
+
*
|
|
42
|
+
* @param version - Version string (e.g., '0', '0.24', '0.24.32')
|
|
43
|
+
* @returns Normalized version (e.g., '0.24.32')
|
|
44
|
+
*/
|
|
45
|
+
export function normalizeVersion(version) {
|
|
46
|
+
const fullVersion = LIBSQL_VERSION_MAP[version];
|
|
47
|
+
if (fullVersion) {
|
|
48
|
+
return fullVersion;
|
|
49
|
+
}
|
|
50
|
+
// Unknown version - warn and return as-is
|
|
51
|
+
const parts = version.split('.');
|
|
52
|
+
const isValidFormat = parts.length >= 1 &&
|
|
53
|
+
parts.length <= 3 &&
|
|
54
|
+
parts.every((p) => /^\d+$/.test(p));
|
|
55
|
+
if (!isValidFormat) {
|
|
56
|
+
logDebug(`libSQL version '${version}' has invalid format, may not be available in hostdb`);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
logDebug(`libSQL version '${version}' not in version map, may not be available in hostdb`);
|
|
60
|
+
}
|
|
61
|
+
return version;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=version-maps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-maps.js","sourceRoot":"","sources":["../../../engines/libsql/version-maps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEnD;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACxD,kCAAkC;IAClC,GAAG,EAAE,SAAS;IACd,sCAAsC;IACtC,MAAM,EAAE,SAAS;IACjB,2CAA2C;IAC3C,SAAS,EAAE,SAAS;CACrB,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,GAAG,CAAC,CAAA;AAE7C;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,YAAoB;IACjD,OAAO,kBAAkB,CAAC,YAAY,CAAC,IAAI,IAAI,CAAA;AACjD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAC/C,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,0CAA0C;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAEhC,MAAM,aAAa,GACjB,KAAK,CAAC,MAAM,IAAI,CAAC;QACjB,KAAK,CAAC,MAAM,IAAI,CAAC;QACjB,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IAErC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,QAAQ,CACN,mBAAmB,OAAO,sDAAsD,CACjF,CAAA;IACH,CAAC;SAAM,CAAC;QACN,QAAQ,CACN,mBAAmB,OAAO,sDAAsD,CACjF,CAAA;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* libSQL version validation utilities
|
|
3
|
+
* Handles version parsing, comparison, and compatibility checking
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Parse a libSQL version string into components
|
|
7
|
+
* Handles formats like "0.24.32", "0.24", "v0.24.32"
|
|
8
|
+
*/
|
|
9
|
+
export function parseVersion(versionString) {
|
|
10
|
+
const cleaned = versionString.replace(/^v/, '').trim();
|
|
11
|
+
if (!cleaned)
|
|
12
|
+
return null;
|
|
13
|
+
const match = cleaned.match(/^(\d+)(?:\.(\d+))?(?:\.(\d+))?$/);
|
|
14
|
+
if (!match)
|
|
15
|
+
return null;
|
|
16
|
+
const major = Number(match[1]);
|
|
17
|
+
const minor = match[2] ? Number(match[2]) : 0;
|
|
18
|
+
const patch = match[3] ? Number(match[3]) : 0;
|
|
19
|
+
return { major, minor, patch, raw: cleaned };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Check if a libSQL version is supported by SpinDB
|
|
23
|
+
* Minimum supported version: 0.24.0
|
|
24
|
+
*/
|
|
25
|
+
export function isVersionSupported(version) {
|
|
26
|
+
const parsed = parseVersion(version);
|
|
27
|
+
if (!parsed)
|
|
28
|
+
return false;
|
|
29
|
+
// Support 0.24+
|
|
30
|
+
if (parsed.major === 0) {
|
|
31
|
+
return parsed.minor >= 24;
|
|
32
|
+
}
|
|
33
|
+
return parsed.major >= 1;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get major version from full version string
|
|
37
|
+
* e.g., "0.24.32" -> "0"
|
|
38
|
+
*/
|
|
39
|
+
export function getMajorVersion(version) {
|
|
40
|
+
const parsed = parseVersion(version);
|
|
41
|
+
return parsed ? String(parsed.major) : version;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get major.minor version from full version string
|
|
45
|
+
* e.g., "0.24.32" -> "0.24"
|
|
46
|
+
*/
|
|
47
|
+
export function getMajorMinorVersion(version) {
|
|
48
|
+
const parsed = parseVersion(version);
|
|
49
|
+
if (!parsed)
|
|
50
|
+
return version;
|
|
51
|
+
return `${parsed.major}.${parsed.minor}`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Compare two libSQL versions
|
|
55
|
+
* Returns: -1 if a < b, 0 if a == b, 1 if a > b, null if either version cannot be parsed
|
|
56
|
+
*/
|
|
57
|
+
export function compareVersions(a, b) {
|
|
58
|
+
const parsedA = parseVersion(a);
|
|
59
|
+
const parsedB = parseVersion(b);
|
|
60
|
+
if (!parsedA || !parsedB) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
if (parsedA.major !== parsedB.major) {
|
|
64
|
+
return parsedA.major < parsedB.major ? -1 : 1;
|
|
65
|
+
}
|
|
66
|
+
if (parsedA.minor !== parsedB.minor) {
|
|
67
|
+
return parsedA.minor < parsedB.minor ? -1 : 1;
|
|
68
|
+
}
|
|
69
|
+
if (parsedA.patch !== parsedB.patch) {
|
|
70
|
+
return parsedA.patch < parsedB.patch ? -1 : 1;
|
|
71
|
+
}
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Check if a backup version is compatible with the restore version
|
|
76
|
+
* libSQL backups are generally compatible within major versions
|
|
77
|
+
*/
|
|
78
|
+
export function isVersionCompatible(backupVersion, restoreVersion) {
|
|
79
|
+
const backup = parseVersion(backupVersion);
|
|
80
|
+
const restore = parseVersion(restoreVersion);
|
|
81
|
+
if (!backup || !restore) {
|
|
82
|
+
return {
|
|
83
|
+
compatible: true,
|
|
84
|
+
warning: 'Could not parse versions, proceeding with restore',
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// Cannot restore newer backup to older server
|
|
88
|
+
if (backup.major > restore.major) {
|
|
89
|
+
return {
|
|
90
|
+
compatible: false,
|
|
91
|
+
warning: `Cannot restore libSQL ${backupVersion} backup to ${restoreVersion} server. The backup is from a newer major version.`,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Allow same major version
|
|
95
|
+
if (backup.major === restore.major) {
|
|
96
|
+
return { compatible: true };
|
|
97
|
+
}
|
|
98
|
+
// Allow upgrading from older major version (restore.major > backup.major)
|
|
99
|
+
return {
|
|
100
|
+
compatible: true,
|
|
101
|
+
warning: `Restoring libSQL ${backupVersion} backup to ${restoreVersion} server. libSQL will upgrade the data format on next save.`,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Validate that a version string matches supported format
|
|
106
|
+
*/
|
|
107
|
+
export function isValidVersionFormat(version) {
|
|
108
|
+
const parsed = parseVersion(version);
|
|
109
|
+
return parsed !== null;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=version-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-validator.js","sourceRoot":"","sources":["../../../engines/libsql/version-validator.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.js
CHANGED
|
@@ -30,6 +30,7 @@ export var Engine;
|
|
|
30
30
|
Engine["InfluxDB"] = "influxdb";
|
|
31
31
|
Engine["Weaviate"] = "weaviate";
|
|
32
32
|
Engine["TigerBeetle"] = "tigerbeetle";
|
|
33
|
+
Engine["LibSQL"] = "libsql";
|
|
33
34
|
})(Engine || (Engine = {}));
|
|
34
35
|
// Supported operating systems (matches Node.js process.platform)
|
|
35
36
|
export var Platform;
|
|
@@ -69,6 +70,7 @@ export const ALL_ENGINES = [
|
|
|
69
70
|
Engine.InfluxDB,
|
|
70
71
|
Engine.Weaviate,
|
|
71
72
|
Engine.TigerBeetle,
|
|
73
|
+
Engine.LibSQL,
|
|
72
74
|
];
|
|
73
75
|
// File-based engines (no server process, data stored in user project directories)
|
|
74
76
|
export const FILE_BASED_ENGINES = new Set([Engine.SQLite, Engine.DuckDB]);
|
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../types/index.ts"],"names":[],"mappings":"AAoCA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAuB;IACvD,OAAO,MAAM,CAAC,MAAM,KAAK,SAAS,CAAA;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../types/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spindb",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.45.1",
|
|
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.",
|
|
@@ -66,6 +66,7 @@
|
|
|
66
66
|
"influxdb",
|
|
67
67
|
"weaviate",
|
|
68
68
|
"tigerbeetle",
|
|
69
|
+
"libsql",
|
|
69
70
|
"layerbase",
|
|
70
71
|
"docker-free",
|
|
71
72
|
"tui",
|