createTable method

Future<Table> createTable(
  1. String name,
  2. Schema schema
)

Implementation

Future<Table> createTable(String name, Schema schema) async {
  if (tables.containsKey(name)) {
    throw Exception('Table "$name" already exists');
  }

  final meta           = TableMeta(name: name, schema: schema);
  final legacyIndexes  = <String, BTree>{};
  final binaryIndexes  = <String, BTreeV2>{};

  for (final col in schema.columns) {
    if (col.isIndexed || col.isPrimaryKey) {
      legacyIndexes[col.name] =
          BTree(path: '$dir/idx_${name}_${col.name}.json');
      binaryIndexes[col.name] = BTreeV2.empty();
    }
  }

  final table = Table(
      meta: meta, cache: cache, indexes: legacyIndexes, indexDir: dir);

  tables[name]         = table;
  pageTables[name]     = PageTable(meta: meta, cache: cache, indexDir: dir);
  mvccTables[name]     = MvccTable(name);
  btreeIndexes[name]   = binaryIndexes;

  // WAL-before-data (INV-1)
  final lsn = await wal.append(WalOp.createTable, name, schema.toJson());
  pager.setWalFlushedLsn(lsn);
  await _saveCatalog();
  await _maybeAutoCheckpoint();
  return table;
}