create static method
Future<OracleConnectionPool>
create({
- required DpiOracle dpiOracle,
- required Pointer<
dpiContext> context, - required OracleConfig config,
- PoolConfig poolConfig = PoolConfig.defaultConfig,
Create a connection pool
Implementation
static Future<OracleConnectionPool> create({
required DpiOracle dpiOracle,
required Pointer<dpiContext> context,
required OracleConfig config,
PoolConfig poolConfig = PoolConfig.defaultConfig,
}) async {
final memoryManager = MemoryManager();
try {
// Allocate memory for pool
final poolPtr = memoryManager.allocate<Pointer<dpiPool>>(sizeOf<Pointer<dpiPool>>());
final errorInfo = memoryManager.allocate<dpiErrorInfo>(sizeOf<dpiErrorInfo>());
// Convert strings to native with byte lengths
final (usernameNative, usernameLen) = StringUtils.toNativeUtf8WithLength(config.username, memoryManager);
final (passwordNative, passwordLen) = StringUtils.toNativeUtf8WithLength(config.password, memoryManager);
final (connStringNative, connStringLen) = StringUtils.toNativeUtf8WithLength(config.connectionString, memoryManager);
// Create pool create params
final createParams = memoryManager.allocate<dpiPoolCreateParams>(sizeOf<dpiPoolCreateParams>());
dpiOracle.dpiContext_initPoolCreateParams(context, createParams);
// Set pool parameters
createParams.ref.minSessions = poolConfig.poolMin;
createParams.ref.maxSessions = poolConfig.poolMax;
createParams.ref.sessionIncrement = poolConfig.poolIncrement;
createParams.ref.pingInterval = poolConfig.poolPingInterval;
createParams.ref.pingTimeout = poolConfig.poolTimeout;
createParams.ref.homogeneous = 1; // All connections use same credentials
// Note: connectionClass is not directly available in this version of ODPI-C
// Future versions may support it through dpiPoolCreateParams
// Create the pool
final result = dpiOracle.dpiPool_create(
context,
usernameNative,
usernameLen,
passwordNative,
passwordLen,
connStringNative,
connStringLen,
nullptr,
createParams,
poolPtr,
);
if (result == DPI_FAILURE) {
dpiOracle.dpiContext_getError(context, errorInfo);
final errorMsg = StringUtils.fromNativeUtf8(errorInfo.ref.message.cast<Char>());
final errorCode = errorInfo.ref.code;
throw OraclePoolException(
'Failed to create connection pool',
errorCode: errorCode,
errorMessage: errorMsg,
);
}
return OracleConnectionPool._(
dpiOracle,
context,
poolPtr,
config,
poolConfig,
memoryManager,
);
} catch (e) {
memoryManager.dispose();
if (e is OracleException) {
rethrow;
}
throw OraclePoolException('Pool creation failed: $e');
}
}