summaryrefslogtreecommitdiff
path: root/ext/pdo_dblib/dblib_driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/pdo_dblib/dblib_driver.c')
-rw-r--r--ext/pdo_dblib/dblib_driver.c121
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)