mirror of
https://github.com/php/php-src.git
synced 2024-09-21 18:07:23 +00:00
Speed up pg_escape_bytea, from O(n^2) => O(n). My test script speed up
from 50 sec to 5 sec. (sscanf is too slow at least under my linux, I might write better function that unescape values later) Use emalloc/erealloc for bundled PQescapeBytea(php_pgsql_escape_bytea)
This commit is contained in:
parent
28d3be43a3
commit
f482ac4011
@ -2664,7 +2664,7 @@ static unsigned char * php_pgsql_unescape_bytea(unsigned char *strtext, size_t *
|
||||
return NULL;
|
||||
buflen = strlen(strtext); /* will shrink, also we discover if
|
||||
* strtext */
|
||||
buffer = (unsigned char *) malloc(buflen); /* isn't NULL terminated */
|
||||
buffer = (unsigned char *) emalloc(buflen); /* isn't NULL terminated */
|
||||
if (buffer == NULL)
|
||||
return NULL;
|
||||
for (bp = buffer, sp = strtext; *sp != '\0'; bp++, sp++)
|
||||
@ -2710,10 +2710,14 @@ static unsigned char * php_pgsql_unescape_bytea(unsigned char *strtext, size_t *
|
||||
case 3:
|
||||
if (isdigit(*sp)) /* state=4 */
|
||||
{
|
||||
int v;
|
||||
unsigned int v,i;
|
||||
unsigned char buf[4]; /* 000 + '\0' */
|
||||
|
||||
bp -= 3;
|
||||
sscanf(sp - 2, "%03o", &v);
|
||||
for (i = 0; i < 3; i++)
|
||||
buf[i] = *((sp-2)+i);
|
||||
buf[i] = '\0';
|
||||
sscanf(buf, "%03o", &v);
|
||||
*bp = v;
|
||||
buflen -= 3;
|
||||
state = 0;
|
||||
@ -2726,7 +2730,7 @@ static unsigned char * php_pgsql_unescape_bytea(unsigned char *strtext, size_t *
|
||||
break;
|
||||
}
|
||||
}
|
||||
buffer = realloc(buffer, buflen);
|
||||
buffer = erealloc(buffer, buflen);
|
||||
if (buffer == NULL)
|
||||
return NULL;
|
||||
|
||||
@ -2749,8 +2753,7 @@ PHP_FUNCTION(pg_unescape_bytea)
|
||||
if (!to) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
RETVAL_STRINGL(to, to_len, 1);
|
||||
free(to);
|
||||
RETVAL_STRINGL(to, to_len, 0);
|
||||
}
|
||||
/* }}} */
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user