mirror of
https://github.com/php/php-src.git
synced 2024-09-22 02:17:32 +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;
|
return NULL;
|
||||||
buflen = strlen(strtext); /* will shrink, also we discover if
|
buflen = strlen(strtext); /* will shrink, also we discover if
|
||||||
* strtext */
|
* strtext */
|
||||||
buffer = (unsigned char *) malloc(buflen); /* isn't NULL terminated */
|
buffer = (unsigned char *) emalloc(buflen); /* isn't NULL terminated */
|
||||||
if (buffer == NULL)
|
if (buffer == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
for (bp = buffer, sp = strtext; *sp != '\0'; bp++, sp++)
|
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:
|
case 3:
|
||||||
if (isdigit(*sp)) /* state=4 */
|
if (isdigit(*sp)) /* state=4 */
|
||||||
{
|
{
|
||||||
int v;
|
unsigned int v,i;
|
||||||
|
unsigned char buf[4]; /* 000 + '\0' */
|
||||||
|
|
||||||
bp -= 3;
|
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;
|
*bp = v;
|
||||||
buflen -= 3;
|
buflen -= 3;
|
||||||
state = 0;
|
state = 0;
|
||||||
@ -2726,7 +2730,7 @@ static unsigned char * php_pgsql_unescape_bytea(unsigned char *strtext, size_t *
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
buffer = realloc(buffer, buflen);
|
buffer = erealloc(buffer, buflen);
|
||||||
if (buffer == NULL)
|
if (buffer == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -2749,8 +2753,7 @@ PHP_FUNCTION(pg_unescape_bytea)
|
|||||||
if (!to) {
|
if (!to) {
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
}
|
}
|
||||||
RETVAL_STRINGL(to, to_len, 1);
|
RETVAL_STRINGL(to, to_len, 0);
|
||||||
free(to);
|
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user