initializeSchema method

  1. @override
Future<void> initializeSchema()
override

Initializes the schema based on entity definitions.

Implementation

@override
Future<void> initializeSchema() async {
  if (_schema == null) return;

  for (final table in _schema!.tables) {
    final columnStrings = table.columns.map((c) {
      String type = _mapType(c);
      final pk = table.primaryKey.contains(c.name) ? ' PRIMARY KEY' : '';
      final autoInc = (c.isAutoIncrement && pk.isNotEmpty)
          ? ' AUTOINCREMENT'
          : '';
      final nullable = c.isNullable ? '' : ' NOT NULL';
      return '${c.name} $type$pk$autoInc$nullable';
    }).toList();

    for (final unique in table.uniqueConstraints) {
      final cols = unique.columns.join(', ');
      columnStrings.add('UNIQUE ($cols)');
    }

    for (final fk in table.foreignKeys) {
      final cols = fk.columns.join(', ');
      final refTable = fk.referencedTable;
      final refCols = fk.referencedColumns.join(', ');
      final onDel = fk.onDelete != null ? ' ON DELETE ${fk.onDelete}' : '';
      columnStrings.add(
        'FOREIGN KEY ($cols) REFERENCES $refTable ($refCols)$onDel',
      );
    }

    final columns = columnStrings.join(', ');
    await _connection.execute(
      'CREATE TABLE IF NOT EXISTS ${table.name} ($columns)',
    );

    // Add indexes
    for (final index in table.indexes) {
      final cols = index.columns.join(', ');
      final unique = index.unique ? 'UNIQUE ' : '';
      await _connection.execute(
        'CREATE ${unique}INDEX IF NOT EXISTS ${index.name} ON ${table.name} ($cols)',
      );
    }
  }
}