internals:pdo:brainstorming

This is an old revision of the document!


Thoughts and ideas about improving PDO. Wez's PDOv1 spec could be useful: http://www.php.net/~wez/pdo/pdo-spec.html

Relevant RFC

Questions

  • What have we learned about the PDO architecture in the past years (that needs fixing)?
  • How do we deal with features that only related to one (or few) drivers? What if its impossible to fit a similar feature under a single API? Currently we have a few driver specific attributes (like the unbuffered query attribute for MySQL).
  • How do we deal with different error handling? Like some RDBMS create throw errors during the prepare stage, others at the first execute.
  • How do we deal with different behavior like transaction errors causing a rollback on some RDBMS but not on others.

PDO Bugs / PDO2 Improvements

PDO

Documentation

  • FETCH_SERIALIZE description is wrong, it works like FETCH_CLASS not FETCH_INTO
  • document finally remaining FETCH constants like FETCH_KEY_VALUE, FETCH_FUNC
  • better document fetchAll() constants

Parameter binding & explicit data type set

  • bindValue() & bindParam() should enforce the type giving, currently it uses the current zval type for MySQL Bug #44639 / PDO: Fixing bug #44639 for mysql
    • PARAM_INT with strings => it should try to convert to the type, otherwise throw an Exception or create an error.
    • PARAM_BOOLEAN with strings => Exception or Error.
    • a new PARAM_AUTO could be used to determine the type by zval (old mysql behavior)
  • execute() could use an automatic approach PARAM_AUTO, could be a BC break http://news.php.net/php.pdo/235
    • allows automatic convert to PARAM_INT if zval is integer / float

fetchObject

  • Bug#49521 “PDO fetchObject sets values before calling constructor”
    • add note to FETCH_PROPS_LATE
    • allow setting FETCH_PROPS_LATE or assume it as default?

Unified API meta data access

see http://news.php.net/php.pdo/233

  • PDOStatement::getColumnMeta with a new parameter to get only one meta type back ml#123127892009423 wouldn't break the current api.
    • META_NAME => column name
    • META_TABLENAME => table name
    • ...

Asynchronous requests

see http://news.php.net/php.pdo/268

For features not yet finalized: see http://news.php.net/php.pdo/286

PDO_Driver::getNative()::asyncQuery();

PDO Persistent Connections

see http://news.php.net/php.pdo/318 see http://news.php.net/php.pdo/319

  • Defaults to be portable as much as possible
  • Allow to disable certain connection reset/cleanup features to gain even more speed.

PDO2

fetchAll

  • add fetchAll() FETCH_UNIQUE without FETCH_GROUP (PHP5.3 seems to support it already?)
    • allow the column id to be set
    • allow to receive the key column in the result
    • allow with FETCH_CLASS

XML Support

PDO Binding behaviour (5.3)

MySQL SQLite Firebird ODBC PostgreSQL
PDO_PARAM_STR zval type convert_to_string/null zval type/null convert_to_string/ convert_to_string
PDO_PARAM_INT convert_to_long/null convert_to_string convert_to_string
PDO_PARAM_BOOL convert_to_long/null convert_to_string convert_to_string
PDO_PARAM_NULL always null always null if zval IS_NULL
PDO_PARAM_LOB “ * convert_to_string*/null convert_to_string* convert_to_string *
stream support * Supports streams * Supports streams * Supports streams * Supports streams

mysql:

firebird: Check if field allows null, for empty strings and field type is SQL_SHORT, SQL_LONG, SQL_INT64, SQL_FLOAT, SQL_DOUBLE, SQL_TIMESTAMP, SQL_TYPE_DATE, SQL_TYPE_TIME null is assumed as input

odbc: zval == IS_NULL or PDO_PARAM_NULL => always SQL_NULL_DATA

PostgreSQL: zval == IS_BOOL => always bool except if set to PDO_PARAM_NULL (Does reference check, and zval separation before convert_to_string if it isn't a reference)

PDO Binding behaviour RFC

for all bindValue/bindParam/execute input

zval/PDO PDO_PARAM_NULL PDO_PARAM_BOOL PDO_PARAM_INT PDO_PARAM_STR PDO_PARAM_LOB PDO_PARAM_AUTO (new)
IS_NULL - no convert - SQL_NULL SQL_NULL SQL_NULL SQL_NULL SQL_NULL
IS_LONG SQL_NULL convert_to_boolean - no convert - convert_to_string convert_to_string zval type
IS_DOUBLE SQL_NULL convert_to_boolean - no convert - convert_to_string convert_to_string zval type
IS_BOOL SQL_NULL - no convert - convert_to_long convert_to_string convert_to_string zval type
IS_ARRAY Exception Exception (2) Exception (2) Exception (2) Exception Exception/zval type(2)
IS_OBJECT Exception Exception (1) Exception (1) _toString or Exception _toString or Exception Exception
IS_STRING empty => Null Exception convert_numeric or Exception - no convert - - no convert - zval type
IS_RESSOURCE Exception Exception Exception? convert_to_string(3) convert_to_string(3) convert_to_string(3)

(1) there is no _toType yet

(2) An Array of PDO_PARAM_AUTO could be added for Databases allowing Arrays? PostgreSQL?

(3) Allowing streams

For compatibility the execute() function could be changed to PDO_PARAM_AUTO for less BC breaks.

internals/pdo/brainstorming.1258669256.txt.gz · Last modified: 2017/09/22 13:28 (external edit)