generate method
Generates Dart migration files based on schema changes. Returns the highest migration version number generated.
Implementation
Future<int> generate(List<SupabaseTableInfo> currentTables) async {
if (!config.generateSqliteMigrations) {
_logger.info('SQLite migration generation is disabled. Skipping.');
return schemaVersionManager
.currentSchemaVersion; // Return current known version
}
await schemaVersionManager.loadPreviousSchemas();
final previousVersion = schemaVersionManager.currentSchemaVersion;
final List<SupabaseTableInfo>? previousTables =
schemaVersionManager.previousSchemaStates[previousVersion];
int latestVersionGenerated = previousVersion;
if (previousVersion == 1 || previousTables == null) {
_logger.info('No previous schema found. Generating initial schema...');
final sqlStatements = _generateInitialSchemaSql(currentTables); // Changed
await _writeDartMigrationFile(1, sqlStatements); // Changed
await schemaVersionManager.saveSchemaVersion(
1,
currentTables,
); // Save state
latestVersionGenerated = 1;
_logger.info('Initial schema generated as migration_v0001.dart.');
} else {
_logger.info('Comparing current schema with version $previousVersion...');
final diff = _diffSchemas(previousTables, currentTables);
if (!diff.hasChanges) {
_logger.info('No schema changes detected.');
return previousVersion; // No new version generated
}
final nextVersion = previousVersion + 1;
_logger.info(
'Schema changes detected. Generating migration for version $nextVersion...',
);
final sqlStatements = _generateMigrationSql(nextVersion, diff); // Changed
await _writeDartMigrationFile(nextVersion, sqlStatements); // Changed
await schemaVersionManager.saveSchemaVersion(
nextVersion,
currentTables,
); // Save state
latestVersionGenerated = nextVersion;
_logger.info(
'Migration file generated as migration_v${nextVersion.toString().padLeft(4, '0')}.dart.',
);
_logUnsupportedChanges(diff);
}
return latestVersionGenerated;
}