summaryrefslogtreecommitdiff
path: root/ext/pdo_dblib/dblib_driver.c
diff options
context:
space:
mode:
authorAdam Baratz <adambaratz@php.net>2017-03-20 18:25:50 -0400
committerAdam Baratz <adambaratz@php.net>2017-03-20 18:25:50 -0400
commit4afce8ec8c6660ebd9f9eb174d2614361d1c6129 (patch)
treef2aa7f76460de262f8c93358133d7f4b2e2bf885 /ext/pdo_dblib/dblib_driver.c
parent3817cba7863f1cfa077baa3bb492c4eaf9f95bf3 (diff)
downloadphp-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.c36
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);
}