ssufficool                               Tue, 22 Jun 2010 02:59:52 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=300647

Log:
Fix bug #52137 - implement lastInsertId

Bug: http://bugs.php.net/52137 (Open) pdo_dblib does not implement lastInsertId
      
Changed paths:
    U   php/php-src/trunk/ext/pdo_dblib/dblib_driver.c

Modified: php/php-src/trunk/ext/pdo_dblib/dblib_driver.c
===================================================================
--- php/php-src/trunk/ext/pdo_dblib/dblib_driver.c      2010-06-22 02:09:57 UTC 
(rev 300646)
+++ php/php-src/trunk/ext/pdo_dblib/dblib_driver.c      2010-06-22 02:59:52 UTC 
(rev 300647)
@@ -197,6 +197,50 @@
        return pdo_dblib_transaction_cmd("ROLLBACK TRANSACTION", dbh TSRMLS_CC);
 }

+char *dblib_handle_last_id(pdo_dbh_t *dbh, const char *name, unsigned int *len 
TSRMLS_DC)
+{
+       pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
+
+       RETCODE ret;
+       char *id = NULL;
+
+       /*
+        * Would use scope_identity() but it's not implemented on Sybase
+        */
+
+       if (FAIL == dbcmd(H->link, "SELECT @@IDENTITY")) {
+               return NULL;
+       }
+
+       if (FAIL == dbsqlexec(H->link)) {
+               return NULL;
+       }
+
+       ret = dbresults(H->link);
+       if (ret == FAIL || ret == NO_MORE_RESULTS) {
+               dbcancel(H->link);
+               return NULL;
+       }
+
+       ret = dbnextrow(H->link);
+
+       if (ret == FAIL || ret == NO_MORE_ROWS) {
+               dbcancel(H->link);
+               return NULL;
+       }
+
+       if (dbdatlen(H->link, 1) == 0) {
+               dbcancel(H->link);
+               return NULL;
+       }
+
+       id = emalloc(32);
+       *len = dbconvert(NULL, (dbcoltype(H->link, 1)) , (dbdata(H->link, 1)) , 
(dbdatlen(H->link, 1)), SQLCHAR, id, (DBINT)-1);
+
+       dbcancel(H->link);
+       return id;
+}
+
 static struct pdo_dbh_methods dblib_methods = {
        dblib_handle_closer,
        dblib_handle_preparer,
@@ -206,7 +250,7 @@
        dblib_handle_commit, /* commit */
        dblib_handle_rollback, /* rollback */
        NULL, /*set attr */
-       NULL, /* last insert id */
+       dblib_handle_last_id, /* last insert id */
        dblib_fetch_error, /* fetch error */
        NULL, /* get attr */
        NULL, /* check liveness */
@@ -303,6 +347,7 @@
 #if PDO_DBLIB_IS_MSSQL
        PDO_DRIVER_HEADER(mssql),
 #elif defined(PHP_WIN32)
+#define PDO_DBLIB_IS_SYBASE
        PDO_DRIVER_HEADER(sybase),
 #else
        PDO_DRIVER_HEADER(dblib),

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to