mirror of https://github.com/AMT-Cheif/drift.git
Start migrating from older storage options
This commit is contained in:
parent
0a052ff338
commit
c79f95ac03
|
@ -110,7 +110,7 @@ Future<WasmDatabaseResult> openWasmDatabase({
|
||||||
|
|
||||||
return WasmDatabaseResult(
|
return WasmDatabaseResult(
|
||||||
DatabaseConnection(
|
DatabaseConnection(
|
||||||
WasmDatabase(sqlite3: sqlite3, path: '/app.db'),
|
WasmDatabase(sqlite3: sqlite3, path: '/database'),
|
||||||
),
|
),
|
||||||
WasmStorageImplementation.inMemory,
|
WasmStorageImplementation.inMemory,
|
||||||
missingFeatures,
|
missingFeatures,
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
|
import 'package:sqlite3/wasm.dart';
|
||||||
|
|
||||||
|
import 'shared.dart';
|
||||||
|
|
||||||
|
const paths = {'/database', '/database-journal'};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// Migrates the drift database identified by [databaseName] from the IndexedDB
|
||||||
|
/// storage implementation to the OPFS storage implementation.
|
||||||
|
///
|
||||||
|
/// Must be called in a dedicated worker, as only those have access to OPFS.
|
||||||
|
Future<void> migrateFromIndexedDbToOpfs(String databaseName) async {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Migrates the drift database identified by [databaseName] from the OPFS
|
||||||
|
/// storage implementation back to IndexedDB.
|
||||||
|
///
|
||||||
|
/// Must be called in a dedicated worker, as only those have access to OPFS.
|
||||||
|
Future<void> migrateFromOpfsToIndexedDb(String databaseName) async {
|
||||||
|
final opfs =
|
||||||
|
await SimpleOpfsFileSystem.loadFromStorage(pathForOpfs(databaseName));
|
||||||
|
final indexedDb = await IndexedDbFileSystem.open(dbName: databaseName);
|
||||||
|
|
||||||
|
await _migrate(opfs, indexedDb);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _migrate(
|
||||||
|
VirtualFileSystem source, VirtualFileSystem target) async {
|
||||||
|
for (final path in paths) {
|
||||||
|
if (target.xAccess(path, 0) != 0) {
|
||||||
|
target.xDelete(path, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (source.xAccess(path, 0) != 0) {
|
||||||
|
final (file: sourceFile, outFlags: _) =
|
||||||
|
source.xOpen(Sqlite3Filename(path), SqlFlag.SQLITE_OPEN_CREATE);
|
||||||
|
final (file: targetFile, outFlags: _) =
|
||||||
|
target.xOpen(Sqlite3Filename(path), SqlFlag.SQLITE_OPEN_CREATE);
|
||||||
|
|
||||||
|
final buffer = Uint8List(sourceFile.xFileSize());
|
||||||
|
sourceFile.xRead(buffer, 0);
|
||||||
|
targetFile.xWrite(buffer, 0);
|
||||||
|
|
||||||
|
sourceFile.xClose();
|
||||||
|
targetFile.xClose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -79,6 +79,10 @@ Future<bool> checkIndexedDbSupport() async {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String pathForOpfs(String databaseName) {
|
||||||
|
return '/drift_db/${databaseName}';
|
||||||
|
}
|
||||||
|
|
||||||
class DriftServerController {
|
class DriftServerController {
|
||||||
/// Running drift servers by the name of the database they're serving.
|
/// Running drift servers by the name of the database they're serving.
|
||||||
final Map<String, DriftServer> _servers = {};
|
final Map<String, DriftServer> _servers = {};
|
||||||
|
@ -90,8 +94,7 @@ class DriftServerController {
|
||||||
|
|
||||||
final vfs = await switch (message.storage) {
|
final vfs = await switch (message.storage) {
|
||||||
WasmStorageImplementation.opfsShared =>
|
WasmStorageImplementation.opfsShared =>
|
||||||
SimpleOpfsFileSystem.loadFromStorage(
|
SimpleOpfsFileSystem.loadFromStorage(message.databaseName),
|
||||||
'/drift_db/${message.databaseName}'),
|
|
||||||
WasmStorageImplementation.opfsLocks => _loadLockedWasmVfs(),
|
WasmStorageImplementation.opfsLocks => _loadLockedWasmVfs(),
|
||||||
WasmStorageImplementation.unsafeIndexedDb ||
|
WasmStorageImplementation.unsafeIndexedDb ||
|
||||||
WasmStorageImplementation.sharedIndexedDb =>
|
WasmStorageImplementation.sharedIndexedDb =>
|
||||||
|
|
Loading…
Reference in New Issue