diff options
author | Ilia Alshanetsky <iliaa@php.net> | 2004-05-19 17:35:39 +0000 |
---|---|---|
committer | Ilia Alshanetsky <iliaa@php.net> | 2004-05-19 17:35:39 +0000 |
commit | 074ba3fbc092a4a379a34471e778897be5bfa268 (patch) | |
tree | f8a9b93fb6c5b784a7fe3f962c462982b3c2637d /ext/pdo_mysql/mysql_driver.c | |
parent | 5a4c3234b9f072bd5ea9029770368372447f422a (diff) | |
download | php-git-074ba3fbc092a4a379a34471e778897be5bfa268.tar.gz |
Added lastInsertId() method for retrieving last insert id.
Made affectedRows() work for MySQL.
Populate error value in MySQL on error.
Diffstat (limited to 'ext/pdo_mysql/mysql_driver.c')
-rwxr-xr-x | ext/pdo_mysql/mysql_driver.c | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/ext/pdo_mysql/mysql_driver.c b/ext/pdo_mysql/mysql_driver.c index 3d8ffc0513..2aed63dd3f 100755 --- a/ext/pdo_mysql/mysql_driver.c +++ b/ext/pdo_mysql/mysql_driver.c @@ -55,6 +55,10 @@ static int mysql_handle_closer(pdo_dbh_t *dbh TSRMLS_DC) /* {{{ */ mysql_close(H->server); H->server = NULL; } + if (H->mysql_error) { + efree(H->mysql_error); + H->mysql_error = NULL; + } return 0; } /* }}} */ @@ -71,11 +75,31 @@ static int mysql_handle_preparer(pdo_dbh_t *dbh, const char *sql, long sql_len, return 1; } -static int mysql_handle_doer(pdo_dbh_t *dbh, const char *sql TSRMLS_DC) +static int mysql_handle_doer(pdo_dbh_t *dbh, const char *sql, long sql_len TSRMLS_DC) { pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data; - return 0; + if (mysql_real_query(H->server, sql, sql_len)) { + pdo_mysql_error(H); + return 0; + } else { + return 1; + } +} + +static long pdo_mysql_affected_rows(pdo_dbh_t *dbh TSRMLS_DC) +{ + pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data; + my_ulonglong afr = mysql_affected_rows(H->server); + + return afr == (my_ulonglong) - 1 ? 0 : (long) afr; +} + +static long pdo_mysql_last_insert_id(pdo_dbh_t *dbh TSRMLS_DC) +{ + pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data; + + return (long) mysql_insert_id(H->server); } static int mysql_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, int unquotedlen, char **quoted, int *quotedlen TSRMLS_DC) @@ -95,7 +119,13 @@ static struct pdo_dbh_methods mysql_methods = { mysql_handle_closer, mysql_handle_preparer, mysql_handle_doer, - mysql_handle_quoter + mysql_handle_quoter, + NULL, + NULL, + NULL, + NULL, + pdo_mysql_affected_rows, + pdo_mysql_last_insert_id }; static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_DC) /* {{{ */ @@ -120,7 +150,8 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ /* allocate an environment */ /* handle for the server */ - dbh->driver_data = H->server = mysql_init(NULL); + H->server = mysql_init(NULL); + dbh->driver_data = H; if(vars[2].optval && strcmp("localhost", vars[2].optval)) { host = vars[2].optval; port = atoi(vars[3].optval); @@ -131,8 +162,7 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ dbname = vars[1].optval; if(mysql_real_connect(H->server, host, dbh->username, dbh->password, dbname, port, unix_socket, 0) == NULL) { - H->last_err = mysql_errno(H->server); - pdo_mysql_error("pdo_mysql_handle_factory", H->last_err); + pdo_mysql_error(H); goto cleanup; } @@ -154,10 +184,6 @@ cleanup: } } - if (!ret) { - mysql_handle_closer(dbh TSRMLS_CC); - } - return ret; } /* }}} */ |