diff options
author | Adam Baratz <adambaratz@php.net> | 2017-03-20 18:25:50 -0400 |
---|---|---|
committer | Adam Baratz <adambaratz@php.net> | 2017-03-20 18:25:50 -0400 |
commit | 4afce8ec8c6660ebd9f9eb174d2614361d1c6129 (patch) | |
tree | f2aa7f76460de262f8c93358133d7f4b2e2bf885 /ext/pdo_dblib/dblib_driver.c | |
parent | 3817cba7863f1cfa077baa3bb492c4eaf9f95bf3 (diff) | |
download | php-git-4afce8ec8c6660ebd9f9eb174d2614361d1c6129.tar.gz |
Add PDO parameter types for national character set strings
Diffstat (limited to 'ext/pdo_dblib/dblib_driver.c')
-rw-r--r-- | ext/pdo_dblib/dblib_driver.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c index bb37ace47a..efc8dc1197 100644 --- a/ext/pdo_dblib/dblib_driver.c +++ b/ext/pdo_dblib/dblib_driver.c @@ -151,10 +151,23 @@ static zend_long dblib_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_l 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) { + pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data; + zend_bool use_national_character_set = 0; + size_t i; char * q; *quotedlen = 0; + if (H->assume_national_character_set_strings) { + use_national_character_set = 1; + } + if ((paramtype & PDO_PARAM_STR_NATL) == PDO_PARAM_STR_NATL) { + use_national_character_set = 1; + } + if ((paramtype & PDO_PARAM_STR_CHAR) == PDO_PARAM_STR_CHAR) { + use_national_character_set = 0; + } + /* Detect quoted length, adding extra char for doubled single quotes */ for (i = 0; i < unquotedlen; i++) { if (unquoted[i] == '\'') ++*quotedlen; @@ -162,7 +175,13 @@ static int dblib_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, size_t unqu } *quotedlen += 2; /* +2 for opening, closing quotes */ + if (use_national_character_set) { + ++*quotedlen; /* N prefix */ + } q = *quoted = emalloc(*quotedlen + 1); /* Add byte for terminal null */ + if (use_national_character_set) { + *q++ = 'N'; + } *q++ = '\''; for (i = 0; i < unquotedlen; i++) { @@ -256,12 +275,17 @@ char *dblib_handle_last_id(pdo_dbh_t *dbh, const char *name, size_t *len) static int dblib_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val) { + pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data; + 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; case PDO_ATTR_TIMEOUT: case PDO_DBLIB_ATTR_QUERY_TIMEOUT: return SUCCEED == dbsettime(zval_get_long(val)) ? 1 : 0; case PDO_DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER: - ((pdo_dblib_db_handle *)dbh->driver_data)->stringify_uniqueidentifier = zval_get_long(val); + H->stringify_uniqueidentifier = zval_get_long(val); return 1; default: return 0; @@ -270,14 +294,20 @@ static int dblib_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val) static int dblib_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_value) { + pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data; + switch (attr) { + case PDO_ATTR_DEFAULT_STR_PARAM: + ZVAL_LONG(return_value, H->assume_national_character_set_strings ? PDO_PARAM_STR_NATL : PDO_PARAM_STR_CHAR); + break; + case PDO_ATTR_EMULATE_PREPARES: /* this is the only option available, but expose it so common tests and whatever else can introspect */ ZVAL_TRUE(return_value); break; case PDO_DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER: - ZVAL_BOOL(return_value, ((pdo_dblib_db_handle *)dbh->driver_data)->stringify_uniqueidentifier); + ZVAL_BOOL(return_value, H->stringify_uniqueidentifier); break; case PDO_DBLIB_ATTR_VERSION: @@ -355,6 +385,7 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options) H = pecalloc(1, sizeof(*H), dbh->is_persistent); H->login = dblogin(); H->err.sqlstate = dbh->error_code; + H->assume_national_character_set_strings = 0; H->stringify_uniqueidentifier = 0; if (!H->login) { @@ -376,6 +407,7 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options) dbsetlogintime(connect_timeout); /* Connection/Login Timeout */ dbsettime(query_timeout); /* Statement Timeout */ + H->assume_national_character_set_strings = pdo_attr_lval(driver_options, PDO_ATTR_DEFAULT_STR_PARAM, 0) == PDO_PARAM_STR_NATL ? 1 : 0; H->stringify_uniqueidentifier = pdo_attr_lval(driver_options, PDO_DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER, 0); } |