diff options
Diffstat (limited to 'ext/pdo_dblib/dblib_driver.c')
-rw-r--r-- | ext/pdo_dblib/dblib_driver.c | 121 |
1 files changed, 70 insertions, 51 deletions
diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c index 7f160a402f..712a6e11d0 100644 --- a/ext/pdo_dblib/dblib_driver.c +++ b/ext/pdo_dblib/dblib_driver.c @@ -31,7 +31,7 @@ /* Cache of the server supported datatypes, initialized in handle_factory */ zval* pdo_dblib_datatypes; -static int dblib_fetch_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info) +static void 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; @@ -55,11 +55,11 @@ static int dblib_fetch_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info) /* don't return anything if there's nothing to return */ if (msg == NULL && einfo->dberr == 0 && einfo->oserr == 0 && einfo->severity == 0) { - return 0; + return; } spprintf(&message, 0, "%s [%d] (severity %d) [%s]", - msg, einfo->dberr, einfo->severity, stmt ? stmt->active_query_string : ""); + msg, einfo->dberr, einfo->severity, stmt ? ZSTR_VAL(stmt->active_query_string) : ""); add_next_index_long(info, einfo->dberr); add_next_index_string(info, message); @@ -69,12 +69,10 @@ static int dblib_fetch_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info) if (einfo->oserrstr) { add_next_index_string(info, einfo->oserrstr); } - - return 1; } -static int dblib_handle_closer(pdo_dbh_t *dbh) +static void dblib_handle_closer(pdo_dbh_t *dbh) { pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data; @@ -91,10 +89,9 @@ static int dblib_handle_closer(pdo_dbh_t *dbh) pefree(H, dbh->is_persistent); dbh->driver_data = NULL; } - return 0; } -static int dblib_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, pdo_stmt_t *stmt, zval *driver_options) +static bool dblib_handle_preparer(pdo_dbh_t *dbh, zend_string *sql, pdo_stmt_t *stmt, zval *driver_options) { pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data; pdo_dblib_stmt *S = ecalloc(1, sizeof(*S)); @@ -106,17 +103,17 @@ static int dblib_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len S->computed_column_name_count = 0; S->err.sqlstate = stmt->error_code; - return 1; + return true; } -static zend_long dblib_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_len) +static zend_long dblib_handle_doer(pdo_dbh_t *dbh, const zend_string *sql) { pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data; RETCODE ret, resret; dbsetuserdata(H->link, (BYTE*)&H->err); - if (FAIL == dbcmd(H->link, sql)) { + if (FAIL == dbcmd(H->link, ZSTR_VAL(sql))) { return -1; } @@ -145,14 +142,14 @@ static zend_long dblib_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_l return DBCOUNT(H->link); } -static int dblib_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, size_t unquotedlen, char **quoted, size_t *quotedlen, enum pdo_param_type paramtype) +static zend_string* dblib_handle_quoter(pdo_dbh_t *dbh, const zend_string *unquoted, enum pdo_param_type paramtype) { pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data; - zend_bool use_national_character_set = 0; - + bool use_national_character_set = 0; size_t i; - char * q; - *quotedlen = 0; + char *q; + size_t quotedlen = 0; + zend_string *quoted_str; if (H->assume_national_character_set_strings) { use_national_character_set = 1; @@ -165,72 +162,74 @@ static int dblib_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, size_t unqu } /* Detect quoted length, adding extra char for doubled single quotes */ - for (i = 0; i < unquotedlen; i++) { - if (unquoted[i] == '\'') ++*quotedlen; - ++*quotedlen; + for (i = 0; i < ZSTR_LEN(unquoted); i++) { + if (ZSTR_VAL(unquoted)[i] == '\'') ++quotedlen; + ++quotedlen; } - *quotedlen += 2; /* +2 for opening, closing quotes */ + quotedlen += 2; /* +2 for opening, closing quotes */ if (use_national_character_set) { - ++*quotedlen; /* N prefix */ + ++quotedlen; /* N prefix */ } - q = *quoted = emalloc(*quotedlen + 1); /* Add byte for terminal null */ + quoted_str = zend_string_alloc(quotedlen, 0); + q = ZSTR_VAL(quoted_str); if (use_national_character_set) { *q++ = 'N'; } *q++ = '\''; - for (i = 0; i < unquotedlen; i++) { - if (unquoted[i] == '\'') { + for (i = 0; i < ZSTR_LEN(unquoted); i++) { + if (ZSTR_VAL(unquoted)[i] == '\'') { *q++ = '\''; *q++ = '\''; } else { - *q++ = unquoted[i]; + *q++ = ZSTR_VAL(unquoted)[i]; } } *q++ = '\''; + *q = '\0'; - *q = 0; - - return 1; + return quoted_str; } -static int pdo_dblib_transaction_cmd(const char *cmd, pdo_dbh_t *dbh) +static bool pdo_dblib_transaction_cmd(const char *cmd, pdo_dbh_t *dbh) { pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data; if (FAIL == dbcmd(H->link, cmd)) { - return 0; + return false; } if (FAIL == dbsqlexec(H->link)) { - return 0; + return false; } - return 1; + return true; } -static int dblib_handle_begin(pdo_dbh_t *dbh) +static bool dblib_handle_begin(pdo_dbh_t *dbh) { return pdo_dblib_transaction_cmd("BEGIN TRANSACTION", dbh); } -static int dblib_handle_commit(pdo_dbh_t *dbh) +static bool dblib_handle_commit(pdo_dbh_t *dbh) { return pdo_dblib_transaction_cmd("COMMIT TRANSACTION", dbh); } -static int dblib_handle_rollback(pdo_dbh_t *dbh) +static bool dblib_handle_rollback(pdo_dbh_t *dbh) { return pdo_dblib_transaction_cmd("ROLLBACK TRANSACTION", dbh); } -char *dblib_handle_last_id(pdo_dbh_t *dbh, const char *name, size_t *len) +zend_string *dblib_handle_last_id(pdo_dbh_t *dbh, const zend_string *name) { pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data; RETCODE ret; char *id = NULL; + size_t len; + zend_string *ret_id; /* * Would use scope_identity() but it's not implemented on Sybase @@ -263,34 +262,53 @@ char *dblib_handle_last_id(pdo_dbh_t *dbh, const char *name, size_t *len) } id = emalloc(32); - *len = dbconvert(NULL, (dbcoltype(H->link, 1)) , (dbdata(H->link, 1)) , (dbdatlen(H->link, 1)), SQLCHAR, (BYTE *)id, (DBINT)-1); - + len = dbconvert(NULL, (dbcoltype(H->link, 1)) , (dbdata(H->link, 1)) , (dbdatlen(H->link, 1)), SQLCHAR, (BYTE *)id, (DBINT)-1); dbcancel(H->link); - return id; + + ret_id = zend_string_init(id, len, 0); + efree(id); + return ret_id; } -static int dblib_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val) +static bool dblib_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val) { pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data; + zend_long lval; + bool bval; switch(attr) { case PDO_ATTR_DEFAULT_STR_PARAM: - H->assume_national_character_set_strings = zval_get_long(val) == PDO_PARAM_STR_NATL ? 1 : 0; - return 1; + if (!pdo_get_long_param(&lval, val)) { + return false; + } + H->assume_national_character_set_strings = lval == PDO_PARAM_STR_NATL ? 1 : 0; + return true; case PDO_ATTR_TIMEOUT: case PDO_DBLIB_ATTR_QUERY_TIMEOUT: - return SUCCEED == dbsettime(zval_get_long(val)) ? 1 : 0; + if (!pdo_get_long_param(&lval, val)) { + return false; + } + return SUCCEED == dbsettime(lval); case PDO_DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER: - H->stringify_uniqueidentifier = zval_get_long(val); - return 1; + if (!pdo_get_long_param(&lval, val)) { + return false; + } + H->stringify_uniqueidentifier = lval; + return true; case PDO_DBLIB_ATTR_SKIP_EMPTY_ROWSETS: - H->skip_empty_rowsets = zval_is_true(val); - return 1; + if (!pdo_get_bool_param(&bval, val)) { + return false; + } + H->skip_empty_rowsets = bval; + return true; case PDO_DBLIB_ATTR_DATETIME_CONVERT: - H->datetime_convert = zval_get_long(val); - return 1; + if (!pdo_get_long_param(&lval, val)) { + return false; + } + H->datetime_convert = lval; + return true; default: - return 0; + return false; } } @@ -417,7 +435,8 @@ static const struct pdo_dbh_methods dblib_methods = { NULL, /* check liveness */ NULL, /* get driver methods */ NULL, /* request shutdown */ - NULL /* in transaction */ + NULL, /* in transaction, use PDO's internal tracking mechanism */ + NULL /* get gc */ }; static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options) |