]> granicus.if.org Git - php/commitdiff
Implement Bug #66063 - pdo_dblib enable timeout parameter
authorSTANLEY SUFFICOOL <ssufficool@php.net>
Thu, 23 Oct 2014 06:14:23 +0000 (23:14 -0700)
committerSTANLEY SUFFICOOL <ssufficool@php.net>
Thu, 23 Oct 2014 06:14:23 +0000 (23:14 -0700)
ext/pdo_dblib/dblib_driver.c
ext/pdo_dblib/pdo_dblib.c
ext/pdo_dblib/php_pdo_dblib_int.h

index 40d41148798ca3199dcb5e935fd75e4b4a2f29be..323c805fca7846698511f72b74a39a125bb99705 100644 (file)
@@ -61,7 +61,6 @@ static int dblib_fetch_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info TSRMLS
                msg, einfo->dberr, einfo->severity, stmt ? stmt->active_query_string : "");
 
        add_next_index_long(info, einfo->dberr);
-       // TODO: avoid reallocation ???
        add_next_index_string(info, message);
        efree(message);
        add_next_index_long(info, einfo->oserr);
@@ -145,10 +144,12 @@ static zend_long dblib_handle_doer(pdo_dbh_t *dbh, const char *sql, zend_long sq
 
 static int dblib_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, int unquotedlen, char **quoted, int *quotedlen, enum pdo_param_type paramtype TSRMLS_DC)
 {
-       pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
+       
+       /* pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data; */
+       
        char *q;
        int l = 1;
-
+               
        *quoted = q = safe_emalloc(2, unquotedlen, 3);
        *q++ = '\'';
 
@@ -174,7 +175,6 @@ static int dblib_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, int unquote
 static int pdo_dblib_transaction_cmd(const char *cmd, pdo_dbh_t *dbh TSRMLS_DC)
 {
        pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
-       RETCODE ret;
        
        if (FAIL == dbcmd(H->link, cmd)) {
                return 0;
@@ -246,6 +246,23 @@ char *dblib_handle_last_id(pdo_dbh_t *dbh, const char *name, unsigned int *len T
        return id;
 }
 
+static int dblib_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val TSRMLS_DC)
+{
+       switch(attr) {
+               case PDO_ATTR_TIMEOUT:
+                       return 0;
+               default:
+                       return 1;
+       }
+
+}
+
+static int dblib_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_value TSRMLS_DC)
+{
+       /* dblib_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data; */
+       return 0;
+}
+
 static struct pdo_dbh_methods dblib_methods = {
        dblib_handle_closer,
        dblib_handle_preparer,
@@ -254,10 +271,10 @@ static struct pdo_dbh_methods dblib_methods = {
        dblib_handle_begin, /* begin */
        dblib_handle_commit, /* commit */
        dblib_handle_rollback, /* rollback */
-       NULL, /*set attr */
+       dblib_set_attr, /*set attr */
        dblib_handle_last_id, /* last insert id */
        dblib_fetch_error, /* fetch error */
-       NULL, /* get attr */
+       dblib_get_attribute, /* get attr */
        NULL, /* check liveness */
        NULL, /* get driver methods */
        NULL, /* request shutdown */
@@ -303,6 +320,12 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_
        
        php_pdo_parse_data_source(dbh->data_source, dbh->data_source_len, vars, nvars);
 
+       if (driver_options) {
+               int timeout = pdo_attr_lval(driver_options, PDO_ATTR_TIMEOUT, 30 TSRMLS_CC);
+               dbsetlogintime(timeout); /* Connection/Login Timeout */
+               dbsettime(timeout); /* Statement Timeout */
+       }
+
        H = pecalloc(1, sizeof(*H), dbh->is_persistent);
        H->login = dblogin();
        H->err.sqlstate = dbh->error_code;
@@ -311,8 +334,8 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_
                goto cleanup;
        }
 
-       DBERRHANDLE(H->login, (EHANDLEFUNC) error_handler);
-       DBMSGHANDLE(H->login, (MHANDLEFUNC) msg_handler);
+       DBERRHANDLE(H->login, (EHANDLEFUNC) pdo_dblib_error_handler);
+       DBMSGHANDLE(H->login, (MHANDLEFUNC) pdo_dblib_msg_handler);
        
        if(vars[5].optval) {
                for(i=0;i<nvers;i++) {
index 3afd885df56afa81564da19cbbb747f17518003c..4cd0749cf8d709b6e2493bad6e07079725e324e2 100644 (file)
@@ -86,7 +86,7 @@ ZEND_GET_MODULE(pdo_dblib)
 #endif
 #endif
 
-int error_handler(DBPROCESS *dbproc, int severity, int dberr,
+int pdo_dblib_error_handler(DBPROCESS *dbproc, int severity, int dberr,
        int oserr, char *dberrstr, char *oserrstr)
 {
        pdo_dblib_err *einfo;
@@ -103,6 +103,7 @@ int error_handler(DBPROCESS *dbproc, int severity, int dberr,
        einfo->severity = severity;
        einfo->oserr = oserr;
        einfo->dberr = dberr;
+       
        if (einfo->oserrstr) {
                efree(einfo->oserrstr);
        }
@@ -128,16 +129,10 @@ int error_handler(DBPROCESS *dbproc, int severity, int dberr,
        }
        strcpy(einfo->sqlstate, state);
 
-#if 0
-       php_error_docref(NULL TSRMLS_CC, E_WARNING,
-               "dblib error: %d %s (severity %d)",
-               dberr, dberrstr, severity);     
-#endif
-
        return INT_CANCEL;
 }
 
-int msg_handler(DBPROCESS *dbproc, DBINT msgno, int msgstate,
+int pdo_dblib_msg_handler(DBPROCESS *dbproc, DBINT msgno, int msgstate,
        int severity, char *msgtext, char *srvname, char *procname, DBUSMALLINT line)
 {
        pdo_dblib_err *einfo;
@@ -156,10 +151,6 @@ int msg_handler(DBPROCESS *dbproc, DBINT msgno, int msgstate,
                einfo->lastmsg = estrdup(msgtext);
        }
 
-#if 0
-       php_error_docref(NULL TSRMLS_CC, E_WARNING, "dblib message: %s (severity %d)", msgtext, severity);
-#endif
-
        return 0;
 }
 
@@ -196,18 +187,9 @@ PHP_MINIT_FUNCTION(pdo_dblib)
                return FAILURE;
        }
        
-       /* TODO: 
-       
-       dbsetifile()
-       dbsetmaxprocs()
-       dbsetlogintime()
-       dbsettime()
-       
-        */
-
 #if !PHP_DBLIB_IS_MSSQL
-       dberrhandle(error_handler);
-       dbmsghandle(msg_handler);
+       dberrhandle((EHANDLEFUNC) pdo_dblib_error_handler);
+       dbmsghandle((MHANDLEFUNC) pdo_dblib_msg_handler);
 #endif
 
        return SUCCESS;
index e247b5c19ebd4caa0cd46feb295de3648ba2f7b7..3b341478d76cb934fa596bc34be35282abc76d95 100644 (file)
@@ -37,7 +37,7 @@
 # define DBSETOPT(a, b, c)     dbsetopt(a, b, c)
 # define SYBESMSG              SQLESMSG
 # define SYBESEOF              SQLESEOF
-# define SYBEFCON              SQLECONN                // SQLEFCON does not exist in MS SQL Server.
+# define SYBEFCON              SQLECONN                /* SQLEFCON does not exist in MS SQL Server. */
 # define SYBEMEM               SQLEMEM
 # define SYBEPWD               SQLEPWD
 
@@ -89,10 +89,10 @@ typedef unsigned char *LPBYTE;
 typedef float                  DBFLT4;
 #endif
 
-int error_handler(DBPROCESS *dbproc, int severity, int dberr,
+int pdo_dblib_error_handler(DBPROCESS *dbproc, int severity, int dberr,
        int oserr, char *dberrstr, char *oserrstr);
 
-int msg_handler(DBPROCESS *dbproc, DBINT msgno, int msgstate,
+int pdo_dblib_msg_handler(DBPROCESS *dbproc, DBINT msgno, int msgstate,
        int severity, char *msgtext, char *srvname, char *procname, DBUSMALLINT line);
 
 extern pdo_driver_t pdo_dblib_driver;