init method

Future<void> init()

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();
  }
}