summaryrefslogtreecommitdiff
path: root/ext/pdo_pgsql/pgsql_statement.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/pdo_pgsql/pgsql_statement.c')
-rw-r--r--ext/pdo_pgsql/pgsql_statement.c101
1 files changed, 56 insertions, 45 deletions
diff --git a/ext/pdo_pgsql/pgsql_statement.c b/ext/pdo_pgsql/pgsql_statement.c
index 35e69a3c02..eb13548558 100644
--- a/ext/pdo_pgsql/pgsql_statement.c
+++ b/ext/pdo_pgsql/pgsql_statement.c
@@ -230,10 +230,10 @@ stmt_retry:
}
if (status == PGRES_COMMAND_OK) {
- stmt->row_count = (long)atoi(PQcmdTuples(S->result));
+ ZEND_ATOI(stmt->row_count, PQcmdTuples(S->result));
H->pgoid = PQoidValue(S->result);
} else {
- stmt->row_count = (long)PQntuples(S->result);
+ stmt->row_count = (php_int_t)PQntuples(S->result);
}
return 1;
@@ -255,16 +255,18 @@ static int pgsql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *
case PDO_PARAM_EVT_NORMALIZE:
/* decode name from $1, $2 into 0, 1 etc. */
if (param->name) {
- if (param->name[0] == '$') {
- param->paramno = atoi(param->name + 1);
+ if (param->name->val[0] == '$') {
+ ZEND_ATOI(param->paramno, param->name->val + 1);
} else {
/* resolve parameter name to rewritten name */
- char *nameptr;
- if (stmt->bound_param_map && SUCCESS == zend_hash_find(stmt->bound_param_map,
- param->name, param->namelen + 1, (void**)&nameptr)) {
- param->paramno = atoi(nameptr + 1) - 1;
+ char *namevar;
+
+ if (stmt->bound_param_map && (namevar = zend_hash_find_ptr(stmt->bound_param_map,
+ param->name)) != NULL) {
+ ZEND_ATOI(param->paramno, namevar + 1);
+ param->paramno--;
} else {
- pdo_raise_impl_error(stmt->dbh, stmt, "HY093", param->name TSRMLS_CC);
+ pdo_raise_impl_error(stmt->dbh, stmt, "HY093", param->name->val TSRMLS_CC);
return 0;
}
}
@@ -297,15 +299,23 @@ static int pgsql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *
sizeof(Oid));
}
if (param->paramno >= 0) {
+ zval *parameter;
+
if (param->paramno > zend_hash_num_elements(stmt->bound_param_map)) {
pdo_pgsql_error_stmt(stmt, PGRES_FATAL_ERROR, "HY105");
return 0;
}
+ if (Z_ISREF(param->parameter)) {
+ parameter = Z_REFVAL(param->parameter);
+ } else {
+ parameter = &param->parameter;
+ }
+
if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_LOB &&
- Z_TYPE_P(param->parameter) == IS_RESOURCE) {
+ Z_TYPE_P(parameter) == IS_RESOURCE) {
php_stream *stm;
- php_stream_from_zval_no_verify(stm, &param->parameter);
+ php_stream_from_zval_no_verify(stm, parameter);
if (stm) {
if (php_stream_is(stm, &pdo_pgsql_lob_stream_ops)) {
struct pdo_pgsql_lob_self *self = (struct pdo_pgsql_lob_self*)stm->abstract;
@@ -322,15 +332,12 @@ static int pgsql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *
S->param_types[param->paramno] = OIDOID;
return 1;
} else {
- int len;
-
- SEPARATE_ZVAL_IF_NOT_REF(&param->parameter);
- Z_TYPE_P(param->parameter) = IS_STRING;
-
- if ((len = php_stream_copy_to_mem(stm, &Z_STRVAL_P(param->parameter), PHP_STREAM_COPY_ALL, 0)) > 0) {
- Z_STRLEN_P(param->parameter) = len;
+ zend_string *str = php_stream_copy_to_mem(stm, PHP_STREAM_COPY_ALL, 0);
+ if (str != NULL) {
+ //??SEPARATE_ZVAL_IF_NOT_REF(&param->parameter);
+ ZVAL_STR(parameter, str);
} else {
- ZVAL_EMPTY_STRING(param->parameter);
+ ZVAL_EMPTY_STRING(parameter);
}
}
} else {
@@ -341,18 +348,18 @@ static int pgsql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *
}
if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_NULL ||
- Z_TYPE_P(param->parameter) == IS_NULL) {
+ Z_TYPE_P(parameter) == IS_NULL) {
S->param_values[param->paramno] = NULL;
S->param_lengths[param->paramno] = 0;
- } else if (Z_TYPE_P(param->parameter) == IS_BOOL) {
- S->param_values[param->paramno] = Z_BVAL_P(param->parameter) ? "t" : "f";
+ } else if (Z_TYPE_P(parameter) == IS_FALSE || Z_TYPE_P(parameter) == IS_TRUE) {
+ S->param_values[param->paramno] = Z_TYPE_P(parameter) == IS_TRUE ? "t" : "f";
S->param_lengths[param->paramno] = 1;
S->param_formats[param->paramno] = 0;
} else {
- SEPARATE_ZVAL_IF_NOT_REF(&param->parameter);
- convert_to_string(param->parameter);
- S->param_values[param->paramno] = Z_STRVAL_P(param->parameter);
- S->param_lengths[param->paramno] = Z_STRLEN_P(param->parameter);
+ //SEPARATE_ZVAL_IF_NOT_REF(&param->parameter);
+ convert_to_string_ex(parameter);
+ S->param_values[param->paramno] = Z_STRVAL_P(parameter);
+ S->param_lengths[param->paramno] = Z_STRSIZE_P(parameter);
S->param_formats[param->paramno] = 0;
}
@@ -369,16 +376,22 @@ static int pgsql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *
/* We need to manually convert to a pg native boolean value */
if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_BOOL &&
((param->param_type & PDO_PARAM_INPUT_OUTPUT) != PDO_PARAM_INPUT_OUTPUT)) {
+ zval *parameter;
+ if (Z_ISREF(param->parameter)) {
+ parameter = Z_REFVAL(param->parameter);
+ } else {
+ parameter = &param->parameter;
+ }
SEPARATE_ZVAL(&param->parameter);
param->param_type = PDO_PARAM_STR;
- ZVAL_STRINGL(param->parameter, Z_BVAL_P(param->parameter) ? "t" : "f", 1, 1);
+ ZVAL_STRINGL(parameter, Z_TYPE_P(parameter) == IS_TRUE ? "t" : "f", 1);
}
}
return 1;
}
static int pgsql_stmt_fetch(pdo_stmt_t *stmt,
- enum pdo_fetch_orientation ori, long offset TSRMLS_DC)
+ enum pdo_fetch_orientation ori, php_int_t offset TSRMLS_DC)
{
pdo_pgsql_stmt *S = (pdo_pgsql_stmt*)stmt->driver_data;
@@ -392,8 +405,8 @@ static int pgsql_stmt_fetch(pdo_stmt_t *stmt,
case PDO_FETCH_ORI_PRIOR: spprintf(&ori_str, 0, "BACKWARD"); break;
case PDO_FETCH_ORI_FIRST: spprintf(&ori_str, 0, "FIRST"); break;
case PDO_FETCH_ORI_LAST: spprintf(&ori_str, 0, "LAST"); break;
- case PDO_FETCH_ORI_ABS: spprintf(&ori_str, 0, "ABSOLUTE %ld", offset); break;
- case PDO_FETCH_ORI_REL: spprintf(&ori_str, 0, "RELATIVE %ld", offset); break;
+ case PDO_FETCH_ORI_ABS: spprintf(&ori_str, 0, "ABSOLUTE %pd", offset); break;
+ case PDO_FETCH_ORI_REL: spprintf(&ori_str, 0, "RELATIVE %pd", offset); break;
default:
return 0;
}
@@ -441,7 +454,7 @@ static int pgsql_stmt_describe(pdo_stmt_t *stmt, int colno TSRMLS_DC)
cols[colno].precision = PQfmod(S->result, colno);
S->cols[colno].pgsql_type = PQftype(S->result, colno);
- switch(S->cols[colno].pgsql_type) {
+ switch (S->cols[colno].pgsql_type) {
case BOOLOID:
cols[colno].param_type = PDO_PARAM_BOOL;
@@ -450,11 +463,9 @@ static int pgsql_stmt_describe(pdo_stmt_t *stmt, int colno TSRMLS_DC)
case OIDOID:
/* did the user bind the column as a LOB ? */
if (stmt->bound_columns && (
- SUCCESS == zend_hash_index_find(stmt->bound_columns,
- colno, (void**)&param) ||
- SUCCESS == zend_hash_find(stmt->bound_columns,
- cols[colno].name, cols[colno].namelen,
- (void**)&param))) {
+ (param = zend_hash_index_find_ptr(stmt->bound_columns, colno)) != NULL ||
+ (param = zend_hash_str_find_ptr(stmt->bound_columns, cols[colno].name, cols[colno].namelen)) != NULL)) {
+
if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_LOB) {
cols[colno].param_type = PDO_PARAM_LOB;
break;
@@ -469,7 +480,7 @@ static int pgsql_stmt_describe(pdo_stmt_t *stmt, int colno TSRMLS_DC)
break;
case INT8OID:
- if (sizeof(long)>=8) {
+ if (sizeof(php_int_t)>=8) {
cols[colno].param_type = PDO_PARAM_INT;
} else {
cols[colno].param_type = PDO_PARAM_STR;
@@ -487,7 +498,7 @@ static int pgsql_stmt_describe(pdo_stmt_t *stmt, int colno TSRMLS_DC)
return 1;
}
-static int pgsql_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, unsigned long *len, int *caller_frees TSRMLS_DC)
+static int pgsql_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, php_uint_t *len, int *caller_frees TSRMLS_DC)
{
pdo_pgsql_stmt *S = (pdo_pgsql_stmt*)stmt->driver_data;
struct pdo_column_data *cols = stmt->columns;
@@ -505,12 +516,12 @@ static int pgsql_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, unsigned
*ptr = PQgetvalue(S->result, S->current_row - 1, colno);
*len = PQgetlength(S->result, S->current_row - 1, colno);
- switch(cols[colno].param_type) {
+ switch (cols[colno].param_type) {
case PDO_PARAM_INT:
- S->cols[colno].intval = atol(*ptr);
+ ZEND_ATOI(S->cols[colno].intval, *ptr);
*ptr = (char *) &(S->cols[colno].intval);
- *len = sizeof(long);
+ *len = sizeof(php_int_t);
break;
case PDO_PARAM_BOOL:
@@ -526,7 +537,7 @@ static int pgsql_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, unsigned
Oid oid = (Oid)strtoul(*ptr, &end_ptr, 10);
int loid = lo_open(S->H->server, oid, INV_READ);
if (loid >= 0) {
- *ptr = (char*)pdo_pgsql_create_lob_stream(stmt->dbh, loid, oid TSRMLS_CC);
+ *ptr = (char*)pdo_pgsql_create_lob_stream(&stmt->database_object_handle, loid, oid TSRMLS_CC);
*len = 0;
return *ptr ? 1 : 0;
}
@@ -566,7 +577,7 @@ static int pgsql_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, unsigned
return 1;
}
-static int pgsql_stmt_get_column_meta(pdo_stmt_t *stmt, long colno, zval *return_value TSRMLS_DC)
+static int pgsql_stmt_get_column_meta(pdo_stmt_t *stmt, php_int_t colno, zval *return_value TSRMLS_DC)
{
pdo_pgsql_stmt *S = (pdo_pgsql_stmt*)stmt->driver_data;
PGresult *res;
@@ -582,7 +593,7 @@ static int pgsql_stmt_get_column_meta(pdo_stmt_t *stmt, long colno, zval *return
}
array_init(return_value);
- add_assoc_long(return_value, "pgsql:oid", S->cols[colno].pgsql_type);
+ add_assoc_int(return_value, "pgsql:oid", S->cols[colno].pgsql_type);
/* Fetch metadata from Postgres system catalogue */
spprintf(&q, 0, "SELECT TYPNAME FROM PG_TYPE WHERE OID=%u", S->cols[colno].pgsql_type);
@@ -603,7 +614,7 @@ static int pgsql_stmt_get_column_meta(pdo_stmt_t *stmt, long colno, zval *return
goto done;
}
- add_assoc_string(return_value, "native_type", PQgetvalue(res, 0, 0), 1);
+ add_assoc_string(return_value, "native_type", PQgetvalue(res, 0, 0));
done:
PQclear(res);
return 1;