/// <summary> /// Creates a PDO instance representing a connection to a database /// </summary> /// <param name="dsn">The DSN.</param> /// <param name="username">The username.</param> /// <param name="password">The password.</param> /// <param name="options">The options.</param> public void __construct(string dsn, string username = null, string password = null, PhpArray options = null) { int doublecolon = dsn.IndexOf(':'); if (doublecolon < 0) { // lookup dsn alias var dsn2 = _ctx.Configuration.Get <PDOConfiguration>()?.Dsn[dsn]; if (dsn2 == null) { throw new PDOException("Invalid DSN Alias."); } dsn = dsn2; doublecolon = dsn.IndexOf(':'); if (doublecolon <= 0) { throw new PDOException("Invalid DSN."); } } // var driver = dsn.Remove(doublecolon); var connstring = dsn.AsSpan(doublecolon + 1); // resolve the driver: Driver = PDOEngine.TryGetDriver(driver) ?? throw new PDOException($"could not find driver: '{driver}'"); // TODO: resources if (options != null && options.TryGetValue((int)PDO_ATTR.ATTR_PERSISTENT, out var persistent)) { // TODO: lookup for persistent connection in `ConnectionManager`, mark as persistent } try { // create connection object: _connection = new PdoConnectionResource(this, Driver.OpenConnection(connstring, username, password, options)); } catch (Exception e) { // PDO construct always throws PDOException on error: throw new PDOException(e.Message); } // set attributes if (options != null) { var enumerator = options.GetFastEnumerator(); while (enumerator.MoveNext()) { var key = enumerator.CurrentKey; if (key.IsInteger && key.Integer != ATTR_PERSISTENT) { setAttribute((PDO_ATTR)key.Integer, enumerator.CurrentValue); } } } }
/// <summary> /// 2 phase ctor. /// Prepares the command. /// </summary> /// <param name="pdo"></param> /// <param name="queryString"></param> /// <param name="options">Driver options. Optional.</param> internal void Prepare(PdoConnectionResource pdo, string queryString, PhpArray options) { pdo.ClosePendingReader(); // initialize properties this.Connection = pdo ?? throw new ArgumentNullException(nameof(pdo)); this.queryString = queryString; // var actualQuery = Driver.RewriteCommand(queryString, options, out bound_param_map); _cmd = PDO.CreateCommand(actualQuery); //_cmd.Prepare(); // <-- compiles the query, needs parameters to be bound }
/// <summary> /// Creates a PDO instance representing a connection to a database /// </summary> /// <param name="dsn">The DSN.</param> /// <param name="username">The username.</param> /// <param name="password">The password.</param> /// <param name="options">The options.</param> public void __construct(string dsn, string username = null, string password = null, PhpArray options = null) { int doublecolon = dsn.IndexOf(':'); if (doublecolon < 0) { // lookup dsn alias var dsn2 = _ctx.Configuration.Get <PDOConfiguration>()?.Dsn[dsn]; if (dsn2 == null) { throw new PDOException("Invalid DSN Alias."); } dsn = dsn2; doublecolon = dsn.IndexOf(':'); if (doublecolon <= 0) { throw new PDOException("Invalid DSN."); } } // var driver = dsn.Remove(doublecolon); var connstring = dsn.AsSpan(doublecolon + 1); // resolve the driver: Driver = PDOEngine.TryGetDriver(driver) ?? throw new PDOException($"Driver '{driver}' not found"); // TODO: resources try { // create connection object: _connection = new PdoConnectionResource(this, Driver.OpenConnection(connstring, username, password, options)); } catch (Exception e) { // PDO construct always throws PDOException on error: throw new PDOException(e.Message); } }
public PdoResultResource(PdoConnectionResource connection, IDataReader reader, bool convertTypes) : base(connection, reader, nameof(PdoResultResource), convertTypes) { }
internal PDOStatement(PdoConnectionResource pdo, string queryString, PhpArray options = null) { Prepare(pdo, queryString, options); }