init method
Initializes the data source by registering all entities and establishing the database connection.
Automatically registers this DataSource with ConnectionManager. If this is the first DataSource registered, it becomes the default.
Also automatically configures Carbon date/time library based on the DataSourceOptions.carbonTimezone, DataSourceOptions.carbonLocale, and DataSourceOptions.enableNamedTimezones settings.
Must be called before using query, repo, or other database operations.
final ds = DataSource(options);
await ds.init(); // Auto-registers and sets as default if first
// Static helpers now work
final users = await User.query().get();
Implementation
Future<void> init() async {
if (_initialized) {
return;
}
// Configure Carbon date/time library if not already configured
if (!CarbonConfig.isTimeMachineConfigured && options.enableNamedTimezones) {
await CarbonConfig.configureWithTimeMachine(
defaultTimezone: options.carbonTimezone,
defaultLocale: options.carbonLocale,
);
} else if (CarbonConfig.defaultTimezone == 'UTC' &&
CarbonConfig.defaultLocale == 'en_US') {
// Only configure if still at default values (allow manual pre-configuration)
CarbonConfig.configure(
defaultTimezone: options.carbonTimezone,
defaultLocale: options.carbonLocale,
);
}
// Register all model definitions
_registry.registerAll(options.entities);
if (options.driverExtensions.isNotEmpty) {
final driver = options.driver;
if (driver is DriverExtensionHost) {
(driver as DriverExtensionHost).registerExtensions(
options.driverExtensions,
);
} else {
throw StateError(
'Driver ${driver.metadata.name} does not support driver extensions.',
);
}
}
// Create the connection configuration
final config = ConnectionConfig(
name: options.name,
database: options.database,
tablePrefix: options.tablePrefix,
defaultSchema: options.defaultSchema,
);
// Create the ORM connection
_connection = OrmConnection(
config: config,
driver: options.driver,
registry: _registry,
codecRegistry: _codecRegistry,
scopeRegistry: options.scopeRegistry,
);
// Enable logging if requested
if (options.logging) {
_connection!.enableQueryLog();
_connection!.attachDefaultContextualLogger(
logFilePath: options.logFilePath,
logger: options.logger,
);
}
// Mark as initialized BEFORE registering (registration may access connection)
_initialized = true;
// Auto-register with ConnectionManager
ConnectionManager.instance.registerDataSource(this);
// If this is the first DataSource, set it as default
if (!ConnectionManager.instance.hasDefaultConnection) {
setAsDefault();
}
}