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:
Yasuo Ohgaki 2002-11-12 09:07:36 +00:00
parent 28d3be43a3
commit f482ac4011

View File

@ -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