Skip to content

Commit e2396a6

Browse files
committed
pgsql: Simplify pgsql_copy_from_query() by using character buffers
This also avoids some unnecessary zend_string overhead.
1 parent 8e84e9a commit e2396a6

File tree

1 file changed

+12
-13
lines changed

1 file changed

+12
-13
lines changed

ext/pgsql/pgsql.c

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3414,21 +3414,20 @@ static zend_result pgsql_copy_from_query(PGconn *pgsql, PGresult *pgsql_result,
34143414
if (UNEXPECTED(!tmp)) {
34153415
return FAILURE;
34163416
}
3417-
zend_string *zquery = zend_string_alloc(ZSTR_LEN(tmp) + 2, false);
3418-
memcpy(ZSTR_VAL(zquery), ZSTR_VAL(tmp), ZSTR_LEN(tmp) + 1);
3419-
ZSTR_LEN(zquery) = ZSTR_LEN(tmp);
3420-
if (ZSTR_LEN(tmp) > 0 && ZSTR_VAL(zquery)[ZSTR_LEN(tmp) - 1] != '\n') {
3421-
ZSTR_VAL(zquery)[ZSTR_LEN(tmp)] = '\n';
3422-
ZSTR_VAL(zquery)[ZSTR_LEN(tmp) + 1] = '\0';
3423-
ZSTR_LEN(zquery) ++;
3424-
}
3425-
if (PQputCopyData(pgsql, ZSTR_VAL(zquery), ZSTR_LEN(zquery)) != 1) {
3426-
zend_string_release_ex(zquery, false);
3427-
zend_tmp_string_release(tmp_tmp);
3428-
return FAILURE;
3417+
char *zquery = emalloc(ZSTR_LEN(tmp) + 2);
3418+
memcpy(zquery, ZSTR_VAL(tmp), ZSTR_LEN(tmp) + 1);
3419+
size_t zquery_len = ZSTR_LEN(tmp);
3420+
if (ZSTR_LEN(tmp) > 0 && zquery[ZSTR_LEN(tmp) - 1] != '\n') {
3421+
zquery[ZSTR_LEN(tmp)] = '\n';
3422+
zquery[ZSTR_LEN(tmp) + 1] = '\0';
3423+
zquery_len++;
34293424
}
3430-
zend_string_release_ex(zquery, false);
34313425
zend_tmp_string_release(tmp_tmp);
3426+
if (PQputCopyData(pgsql, zquery, zquery_len) != 1) {
3427+
efree(zquery);
3428+
return FAILURE;
3429+
}
3430+
efree(zquery);
34323431
return SUCCESS;
34333432
}
34343433

0 commit comments

Comments
 (0)