generateSchemaScript method

  1. @override
Future<String> generateSchemaScript()
override

Generates the SQL script to initialize the schema without executing it.

Implementation

@override
Future<String> generateSchemaScript() async {
  if (_schema == null) return '';
  final buffer = StringBuffer();

  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(', ');
    buffer.writeln('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 ' : '';
      buffer.writeln(
        'CREATE ${unique}INDEX IF NOT EXISTS ${index.name} ON ${table.name} ($cols);',
      );
    }
  }

  return buffer.toString();
}