diff options
Diffstat (limited to 'ext/dba/libflatfile/flatfile.c')
| -rw-r--r-- | ext/dba/libflatfile/flatfile.c | 185 | 
1 files changed, 85 insertions, 100 deletions
diff --git a/ext/dba/libflatfile/flatfile.c b/ext/dba/libflatfile/flatfile.c index e28cc0a033..44ef3d53a3 100644 --- a/ext/dba/libflatfile/flatfile.c +++ b/ext/dba/libflatfile/flatfile.c @@ -38,6 +38,8 @@  #include "flatfile.h" +#define FLATFILE_BLOCK_SIZE 1024 +  /*   * ret = -1 means that database was opened for read-only   * ret = 0  success @@ -84,25 +86,16 @@ int flatfile_store(flatfile *dba, datum key_datum, datum value_datum, int mode T   */  datum flatfile_fetch(flatfile *dba, datum key_datum TSRMLS_DC) {  	datum value_datum = {NULL, 0}; -	size_t num=0; -	size_t buf_size = 1024; -	char *buf;	 +	char buf[16];  	if (flatfile_findkey(dba, key_datum TSRMLS_CC)) { -		buf = emalloc((buf_size+1) * sizeof(char)); -		if (php_stream_gets(dba->fp, buf, 15)) { -			num = atoi(buf); -			if (num > buf_size) { -				buf_size+=num; -				buf = erealloc(buf, (buf_size+1)*sizeof(char)); -			} -			php_stream_read(dba->fp, buf, num); -			value_datum.dptr = buf; -			value_datum.dsize = num; +		if (php_stream_gets(dba->fp, buf, sizeof(buf))) { +			value_datum.dsize = atoi(buf); +			value_datum.dptr = emalloc(value_datum.dsize+1); +			value_datum.dsize = php_stream_read(dba->fp, value_datum.dptr, value_datum.dsize);  		} else {  			value_datum.dptr = NULL;  			value_datum.dsize = 0; -			efree(buf);  		}  	}  	return value_datum; @@ -114,62 +107,55 @@ datum flatfile_fetch(flatfile *dba, datum key_datum TSRMLS_DC) {  int flatfile_delete(flatfile *dba, datum key_datum TSRMLS_DC) {  	char *key = key_datum.dptr;  	size_t size = key_datum.dsize; - -	char *buf; +	size_t buf_size = FLATFILE_BLOCK_SIZE; +	char *buf = emalloc(buf_size);  	size_t num; -	size_t buf_size = 1024;  	size_t pos;  	php_stream_rewind(dba->fp); - -	buf = emalloc((buf_size + 1)*sizeof(char));  	while(!php_stream_eof(dba->fp)) {  		/* read in the length of the key name */  		if (!php_stream_gets(dba->fp, buf, 15)) {  			break;  		}  		num = atoi(buf); -		if (num > buf_size) { -			buf_size += num; -			buf = erealloc(buf, (buf_size+1)*sizeof(char)); +		if (num >= buf_size) { +			buf_size = num + FLATFILE_BLOCK_SIZE; +			buf = erealloc(buf, buf_size);  		}  		pos = php_stream_tell(dba->fp);  		/* read in the key name */ -		num = php_stream_read(dba->fp, buf, sizeof(char)*num); +		num = php_stream_read(dba->fp, buf, num);  		if (num < 0)  {  			break;  		} -		*(buf+num) = '\0';  		if (size == num && !memcmp(buf, key, size)) {  			php_stream_seek(dba->fp, pos, SEEK_SET);  			php_stream_putc(dba->fp, 0);  			php_stream_flush(dba->fp);  			php_stream_seek(dba->fp, 0L, SEEK_END); -			if (buf)  { -				efree(buf); -			} +			efree(buf);  			return SUCCESS;  		}	  		/* read in the length of the value */ -		if (!php_stream_gets(dba->fp, buf, 15)) +		if (!php_stream_gets(dba->fp, buf, 15)) {  			break; +		}  		num = atoi(buf); -		if (num > buf_size) { -			buf_size+=num; -			buf = erealloc(buf, (buf_size+1)*sizeof(char)); +		if (num >= buf_size) { +			buf_size = num + FLATFILE_BLOCK_SIZE; +			buf = erealloc(buf, buf_size);  		}  		/* read in the value */ -		num = php_stream_read(dba->fp, buf, sizeof(char)*num); +		num = php_stream_read(dba->fp, buf, num);  		if (num < 0) {  			break;  		}  	} -	if (buf) { -		efree(buf); -	} +	efree(buf);  	return FAILURE;  }	  /* }}} */ @@ -177,27 +163,27 @@ int flatfile_delete(flatfile *dba, datum key_datum TSRMLS_DC) {  /* {{{ flatfile_findkey   */  int flatfile_findkey(flatfile *dba, datum key_datum TSRMLS_DC) { -	char *buf = NULL; +	size_t buf_size = FLATFILE_BLOCK_SIZE; +	char *buf = emalloc(buf_size);  	size_t num; -	size_t buf_size = 1024;  	int ret=0;  	void *key = key_datum.dptr;  	size_t size = key_datum.dsize;  	php_stream_rewind(dba->fp); -	buf = emalloc((buf_size+1)*sizeof(char));  	while (!php_stream_eof(dba->fp)) { -		if (!php_stream_gets(dba->fp, buf, 15))  { +		if (!php_stream_gets(dba->fp, buf, 15)) {  			break;  		}  		num = atoi(buf); -		if (num > buf_size) { -			buf_size+=num; -			buf = erealloc(buf, (buf_size+1)*sizeof(char)); +		if (num >= buf_size) { +			buf_size = num + FLATFILE_BLOCK_SIZE; +			buf = erealloc(buf, buf_size); +		} +		num = php_stream_read(dba->fp, buf, num); +		if (num < 0) { +			break;  		} -		num = php_stream_read(dba->fp, buf, sizeof(char)*num); -		if (num<0) break; -		*(buf+num) = '\0';  		if (size == num) {  			if (!memcmp(buf, key, size)) {  				ret = 1; @@ -208,114 +194,113 @@ int flatfile_findkey(flatfile *dba, datum key_datum TSRMLS_DC) {  			break;  		}  		num = atoi(buf); -		if (num > buf_size) { -			buf_size+=num; -			buf = erealloc(buf, (buf_size+1)*sizeof(char)); +		if (num >= buf_size) { +			buf_size = num + FLATFILE_BLOCK_SIZE; +			buf = erealloc(buf, buf_size);  		} -		num = php_stream_read(dba->fp, buf, sizeof(char)*num); +		num = php_stream_read(dba->fp, buf, num);  		if (num < 0) {  			break;  		} -		*(buf+num) = '\0';  	} -	if (buf) { -		efree(buf); -	} -	return(ret); +	efree(buf); +	return ret;  }  /* }}} */  /* {{{ flatfile_firstkey   */  datum flatfile_firstkey(flatfile *dba TSRMLS_DC) { -	datum buf; +	datum res;  	size_t num; -	size_t buf_size = 1024; +	size_t buf_size = FLATFILE_BLOCK_SIZE; +	char *buf = emalloc(buf_size);  	php_stream_rewind(dba->fp); -	buf.dptr = emalloc((buf_size+1)*sizeof(char));  	while(!php_stream_eof(dba->fp)) { -		if (!php_stream_gets(dba->fp, buf.dptr, 15)) { +		if (!php_stream_gets(dba->fp, buf, 15)) {  			break;  		} -		num = atoi(buf.dptr); -		if (num > buf_size) { -			buf_size+=num; -			buf.dptr = erealloc(buf.dptr, (buf_size+1)*sizeof(char)); +		num = atoi(buf); +		if (num >= buf_size) { +			buf_size = num + FLATFILE_BLOCK_SIZE; +			buf = erealloc(buf, buf_size);  		} -		num = php_stream_read(dba->fp, buf.dptr, num); +		num = php_stream_read(dba->fp, buf, num);  		if (num < 0) {  			break;  		} -		buf.dsize = num; -		if (*(buf.dptr)!=0) { +		if (*(buf) != 0) {  			dba->CurrentFlatFilePos = php_stream_tell(dba->fp); -			return(buf); +			res.dptr = buf; +			res.dsize = num; +			return res;  		} -		if (!php_stream_gets(dba->fp, buf.dptr, 15)) break; -		num = atoi(buf.dptr); -		if (num > buf_size) { -			buf_size+=num; -			buf.dptr = erealloc(buf.dptr, (buf_size+1)*sizeof(char)); +		if (!php_stream_gets(dba->fp, buf, 15)) { +			break; +		} +		num = atoi(buf); +		if (num >= buf_size) { +			buf_size = num + FLATFILE_BLOCK_SIZE; +			buf = erealloc(buf, buf_size);  		} -		num = php_stream_read(dba->fp, buf.dptr, num); +		num = php_stream_read(dba->fp, buf, num);  		if (num < 0) {  			break;  		}  	} -	if (buf.dptr)  { -		efree(buf.dptr); -	} -	buf.dptr = NULL; -	return(buf); +	efree(buf); +	res.dptr = NULL; +	res.dsize = 0; +	return res;  }  /* }}} */  /* {{{ flatfile_nextkey   */  datum flatfile_nextkey(flatfile *dba TSRMLS_DC) { -	datum buf; +	datum res;  	size_t num; -	size_t buf_size = 1024; +	size_t buf_size = FLATFILE_BLOCK_SIZE; +	char *buf = emalloc(buf_size);  	php_stream_seek(dba->fp, dba->CurrentFlatFilePos, SEEK_SET); -	buf.dptr = emalloc((buf_size+1)*sizeof(char));  	while(!php_stream_eof(dba->fp)) { -		if (!php_stream_gets(dba->fp, buf.dptr, 15)) { +		if (!php_stream_gets(dba->fp, buf, 15)) {  			break;  		} -		num = atoi(buf.dptr); -		if (num > buf_size) { -			buf_size+=num; -			buf.dptr = erealloc(buf.dptr, (buf_size+1)*sizeof(char)); +		num = atoi(buf); +		if (num >= buf_size) { +			buf_size = num + FLATFILE_BLOCK_SIZE; +			buf = erealloc(buf, buf_size);  		} -		num = php_stream_read(dba->fp, buf.dptr, num); +		num = php_stream_read(dba->fp, buf, num);  		if (num < 0)  {  			break;  		} -		if (!php_stream_gets(dba->fp, buf.dptr, 15)) { +		if (!php_stream_gets(dba->fp, buf, 15)) {  			break;  		} -		num = atoi(buf.dptr); -		if (num > buf_size) { -			buf_size+=num; -			buf.dptr = erealloc(buf.dptr, (buf_size+1)*sizeof(char)); +		num = atoi(buf); +		if (num >= buf_size) { +			buf_size = num + FLATFILE_BLOCK_SIZE; +			buf = erealloc(buf, buf_size);  		} -		num = php_stream_read(dba->fp, buf.dptr, num); +		num = php_stream_read(dba->fp, buf, num);  		if (num < 0) {  			break;  		} -		buf.dsize = num; -		if (*(buf.dptr)!=0) { +		if (*(buf)!=0) {  			dba->CurrentFlatFilePos = php_stream_tell(dba->fp); -			return(buf); +			res.dptr = buf; +			res.dsize = num; +			return res;  		}  	} -	if (buf.dptr) { -		efree(buf.dptr); -	} -	buf.dptr = NULL; -	return(buf); +	efree(buf); +	res.dptr = NULL; +	res.dsize = 0; +	return res;  }	  /* }}} */  | 
