discontinuedPackage connect_database has been discontinued.
acquire method
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()));
}
}