copySchema function

Future<Database> copySchema(
  1. Database srcDatabase,
  2. IdbFactory dstFactory,
  3. String dstDbName
)

Copy a database to another return the opened database

Implementation

Future<Database> copySchema(
  Database srcDatabase,
  IdbFactory dstFactory,
  String dstDbName,
) async {
  // Delete the existing
  await dstFactory.deleteDatabase(dstDbName);
  final version = srcDatabase.version;

  final schemaMeta = _SchemaMeta();
  // Get schema
  final storeNames = List<String>.from(srcDatabase.objectStoreNames);
  if (storeNames.isNotEmpty) {
    final txn = srcDatabase.transactionList(storeNames, idbModeReadOnly);
    for (final storeName in storeNames) {
      final store = txn.objectStore(storeName);
      final storeMeta = IdbObjectStoreMeta.fromObjectStore(store);
      for (final indexName in store.indexNames) {
        final index = store.index(indexName);
        final indexMeta = IdbIndexMeta.fromIndex(index);
        storeMeta.putIndex(indexMeta);
      }
      schemaMeta.stores.add(storeMeta);
    }
    await txn.completed;
  }

  void openOnUpgradeNeeded(VersionChangeEvent event) {
    final db = event.database;
    for (final storeMeta in schemaMeta.stores) {
      final store = db.createObjectStore(
        storeMeta.name,
        keyPath: storeMeta.keyPath,
        autoIncrement: storeMeta.autoIncrement,
      );
      for (final indexMeta in storeMeta.indecies) {
        var keyPath = indexMeta.keyPath;

        store.createIndex(
          indexMeta.name!,
          keyPath,
          unique: indexMeta.unique,
          multiEntry: indexMeta.multiEntry,
        );
      }
    }
  }

  // devPrint('Open $dstDbName version $version');
  // Open and copy scheme
  final dstDatabase = await dstFactory.open(
    dstDbName,
    version: version,
    onUpgradeNeeded: openOnUpgradeNeeded,
  );
  return dstDatabase;
}