create static method

Future<OracleConnectionPool> create({
  1. required DpiOracle dpiOracle,
  2. required Pointer<dpiContext> context,
  3. required OracleConfig config,
  4. 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');
  }
}