From: Yasuo Ohgaki Date: Tue, 12 Nov 2002 09:07:36 +0000 (+0000) Subject: Speed up pg_escape_bytea, from O(n^2) => O(n). My test script speed up X-Git-Tag: php-4.3.0RC1~92 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f482ac4011a60288520141362ccc1c74d6318638;p=php 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) --- diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index f5bf85e7e9..f73bf062d6 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -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