discontinuedPackage connect_database has been discontinued.

acquire method

Future<Result<DatabaseDriver>> acquire()

Implementation

Future<Result<DatabaseDriver>> acquire() async {
  if (_config == null) {
    return Failure(
        Exception('Pool não inicializado. Chame init() primeiro.'));
  }

  // Try to get an available connection and validate it
  while (_available.isNotEmpty) {
    final driver = _available.removeFirst();
    final isValid = await driver.validateConnection();

    if (isValid.isSuccess() && isValid.getOrElse((_) => false)) {
      // Connection is valid, reuse it
      _inUse.add(driver);
      return Success(driver);
    } else {
      // Connection is stale, dispose and try next
      await driver.disconnect();
    }
  }

  // No valid available connection, try to create new one
  if (_inUse.length < _maxSize) {
    final newDriver = MyOdbc(
      driverName: _config!.driverName,
      server: _config!.server,
      database: _config!.database,
      username: _config!.username,
      password: _config!.password,
      port: _config!.port,
      databaseType: _config!.databaseType,
    );

    final connectResult = await newDriver.connect();
    if (connectResult.isError()) {
      return Failure(connectResult.exceptionOrNull() ??
          Exception('Failed to create connection in pool'));
    }

    _inUse.add(newDriver);
    return Success(newDriver);
  }

  // Pool is full, enqueue request with timeout
  final completer = Completer<DatabaseDriver>();

  _waitingQueue.add(completer);

  // Wait for either connection to become available or timeout
  try {
    final driver = await Future.any([
      completer.future,
      Future.delayed(_acquireTimeout).then((_) => throw Exception(
          'Pool acquire timeout após $_acquireTimeout. Tente novamente.')),
    ]);
    return Success(driver);
  } catch (e) {
    return Failure(e is Exception ? e : Exception(e.toString()));
  }
}