int error_handler(DBPROCESS *dbproc, int severity, int dberr, int oserr, char *dberrstr, char *oserrstr) { pdo_dblib_err *einfo; char *state = "HY000"; TSRMLS_FETCH(); if(dbproc) { einfo = (pdo_dblib_err*)dbgetuserdata(dbproc); if (!einfo) einfo = &DBLIB_G(err); } else { einfo = &DBLIB_G(err); } einfo->severity = severity; einfo->oserr = oserr; einfo->dberr = dberr; if (einfo->oserrstr) { efree(einfo->oserrstr); } if (einfo->dberrstr) { efree(einfo->dberrstr); } if (oserrstr) { einfo->oserrstr = estrdup(oserrstr); } else { einfo->oserrstr = NULL; } if (dberrstr) { einfo->dberrstr = estrdup(dberrstr); } else { einfo->dberrstr = NULL; } switch (dberr) { case SYBESEOF: case SYBEFCON: state = "01002"; break; case SYBEMEM: state = "HY001"; break; case SYBEPWD: state = "28000"; break; } 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 severity, char *msgtext, char *srvname, char *procname, DBUSMALLINT line) { pdo_dblib_err *einfo; TSRMLS_FETCH(); if (severity) { einfo = (pdo_dblib_err*)dbgetuserdata(dbproc); if (!einfo) { einfo = &DBLIB_G(err); } if (einfo->lastmsg) { efree(einfo->lastmsg); } einfo->lastmsg = estrdup(msgtext); } #if 0 php_error_docref(NULL TSRMLS_CC, E_WARNING, "dblib message: %s (severity %d)", msgtext, severity); #endif return 0; }
int pdo_dblib_error_handler(DBPROCESS *dbproc, int severity, int dberr, int oserr, char *dberrstr, char *oserrstr) { pdo_dblib_err *einfo; char *state = "HY000"; if(dbproc) { einfo = (pdo_dblib_err*)dbgetuserdata(dbproc); if (!einfo) einfo = &DBLIB_G(err); } else { einfo = &DBLIB_G(err); } einfo->severity = severity; einfo->oserr = oserr; einfo->dberr = dberr; if (einfo->oserrstr) { efree(einfo->oserrstr); } if (einfo->dberrstr) { efree(einfo->dberrstr); } if (oserrstr) { einfo->oserrstr = estrdup(oserrstr); } else { einfo->oserrstr = NULL; } if (dberrstr) { einfo->dberrstr = estrdup(dberrstr); } else { einfo->dberrstr = NULL; } switch (dberr) { case SYBESEOF: case SYBEFCON: state = "01002"; break; case SYBEMEM: state = "HY001"; break; case SYBEPWD: state = "28000"; break; } strcpy(einfo->sqlstate, state); return INT_CANCEL; }
static int dblib_fetch_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info) { pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data; pdo_dblib_err *einfo = &H->err; pdo_dblib_stmt *S = NULL; char *message; char *msg; if (stmt) { S = (pdo_dblib_stmt*)stmt->driver_data; einfo = &S->err; } if (einfo->lastmsg) { msg = einfo->lastmsg; } else if (DBLIB_G(err).lastmsg) { msg = DBLIB_G(err).lastmsg; DBLIB_G(err).lastmsg = NULL; } else { msg = einfo->dberrstr; } /* don't return anything if there's nothing to return */ if (msg == NULL && einfo->dberr == 0 && einfo->oserr == 0 && einfo->severity == 0) { return 0; } spprintf(&message, 0, "%s [%d] (severity %d) [%s]", msg, einfo->dberr, einfo->severity, stmt ? stmt->active_query_string : ""); add_next_index_long(info, einfo->dberr); add_next_index_string(info, message); efree(message); add_next_index_long(info, einfo->oserr); add_next_index_long(info, einfo->severity); if (einfo->oserrstr) { add_next_index_string(info, einfo->oserrstr); } return 1; }
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; if (severity) { einfo = (pdo_dblib_err*)dbgetuserdata(dbproc); if (!einfo) { einfo = &DBLIB_G(err); } if (einfo->lastmsg) { efree(einfo->lastmsg); } einfo->lastmsg = estrdup(msgtext); } return 0; }
static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options) { pdo_dblib_db_handle *H; int i, nvars, nvers, ret = 0; const pdo_dblib_keyval tdsver[] = { {"4.2",DBVERSION_42} ,{"4.6",DBVERSION_46} ,{"5.0",DBVERSION_70} /* FIXME: This does not work with Sybase, but environ will */ ,{"6.0",DBVERSION_70} ,{"7.0",DBVERSION_70} #ifdef DBVERSION_71 ,{"7.1",DBVERSION_71} #endif #ifdef DBVERSION_72 ,{"7.2",DBVERSION_72} ,{"8.0",DBVERSION_72} #endif #ifdef DBVERSION_73 ,{"7.3",DBVERSION_73} #endif #ifdef DBVERSION_74 ,{"7.4",DBVERSION_74} #endif ,{"10.0",DBVERSION_100} ,{"auto",0} /* Only works with FreeTDS. Other drivers will bork */ }; struct pdo_data_src_parser vars[] = { { "charset", NULL, 0 } ,{ "appname", "PHP " PDO_DBLIB_FLAVOUR, 0 } ,{ "host", "127.0.0.1", 0 } ,{ "dbname", NULL, 0 } ,{ "secure", NULL, 0 } /* DBSETLSECURE */ ,{ "version", NULL, 0 } /* DBSETLVERSION */ }; nvars = sizeof(vars)/sizeof(vars[0]); nvers = sizeof(tdsver)/sizeof(tdsver[0]); php_pdo_parse_data_source(dbh->data_source, dbh->data_source_len, vars, nvars); H = pecalloc(1, sizeof(*H), dbh->is_persistent); H->login = dblogin(); H->err.sqlstate = dbh->error_code; H->stringify_uniqueidentifier = 0; if (!H->login) { goto cleanup; } if (driver_options) { int connect_timeout = pdo_attr_lval(driver_options, PDO_DBLIB_ATTR_CONNECTION_TIMEOUT, -1); int query_timeout = pdo_attr_lval(driver_options, PDO_DBLIB_ATTR_QUERY_TIMEOUT, -1); int timeout = pdo_attr_lval(driver_options, PDO_ATTR_TIMEOUT, 30); if (connect_timeout == -1) { connect_timeout = timeout; } if (query_timeout == -1) { query_timeout = timeout; } dbsetlogintime(connect_timeout); /* Connection/Login Timeout */ dbsettime(query_timeout); /* Statement Timeout */ H->stringify_uniqueidentifier = pdo_attr_lval(driver_options, PDO_DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER, 0); } 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++) { if(strcmp(vars[5].optval,tdsver[i].key) == 0) { if(FAIL==dbsetlversion(H->login, tdsver[i].value)) { pdo_raise_impl_error(dbh, NULL, "HY000", "PDO_DBLIB: Failed to set version specified in connection string."); goto cleanup; } break; } } if (i==nvers) { printf("Invalid version '%s'\n", vars[5].optval); pdo_raise_impl_error(dbh, NULL, "HY000", "PDO_DBLIB: Invalid version specified in connection string."); goto cleanup; /* unknown version specified */ } } if (dbh->username) { if(FAIL == DBSETLUSER(H->login, dbh->username)) { goto cleanup; } } if (dbh->password) { if(FAIL == DBSETLPWD(H->login, dbh->password)) { goto cleanup; } } #if !PHP_DBLIB_IS_MSSQL if (vars[0].optval) { DBSETLCHARSET(H->login, vars[0].optval); } #endif DBSETLAPP(H->login, vars[1].optval); /* DBSETLDBNAME is only available in FreeTDS 0.92 or above */ #ifdef DBSETLDBNAME if (vars[3].optval) { if(FAIL == DBSETLDBNAME(H->login, vars[3].optval)) goto cleanup; } #endif H->link = dbopen(H->login, vars[2].optval); if (!H->link) { goto cleanup; } /* * FreeTDS < 0.92 does not support the DBSETLDBNAME option * Send use database here after login (Will not work with SQL Azure) */ #ifndef DBSETLDBNAME if (vars[3].optval) { if(FAIL == dbuse(H->link, vars[3].optval)) goto cleanup; } #endif #if PHP_DBLIB_IS_MSSQL /* dblib do not return more than this length from text/image */ DBSETOPT(H->link, DBTEXTLIMIT, "2147483647"); #endif /* limit text/image from network */ DBSETOPT(H->link, DBTEXTSIZE, "2147483647"); /* allow double quoted indentifiers */ DBSETOPT(H->link, DBQUOTEDIDENT, "1"); ret = 1; dbh->max_escaped_char_length = 2; dbh->alloc_own_columns = 1; cleanup: for (i = 0; i < nvars; i++) { if (vars[i].freeme) { efree(vars[i].optval); } } dbh->methods = &dblib_methods; dbh->driver_data = H; if (!ret) { zend_throw_exception_ex(php_pdo_get_exception(), DBLIB_G(err).dberr, "SQLSTATE[%s] %s (severity %d)", DBLIB_G(err).sqlstate, DBLIB_G(err).dberrstr, DBLIB_G(err).severity); } return ret; }