⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 db.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	info = php_find_dbm(id TSRMLS_CC);	if (!info) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid database identifier %ld", Z_LVAL_P(id));		RETURN_FALSE;	}	ret = php_dbm_fetch(info, Z_STRVAL_P(key) TSRMLS_CC);	if (ret) {		RETVAL_STRING(ret, 0);	} else {		RETURN_FALSE;	}}/* }}} *//* {{{ php_dbm_fetch */char *php_dbm_fetch(dbm_info *info, char *key TSRMLS_DC){	datum key_datum, value_datum;	char *ret;	DBM_TYPE dbf;	key_datum.dptr = key;	key_datum.dsize = strlen(key);#if GDBM_FIX	key_datum.dsize++;#endif	value_datum.dptr = NULL;	value_datum.dsize = 0;	dbf = info->dbf;	if (!dbf) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to locate dbm file");		return(NULL);	}	value_datum = DBM_FETCH(dbf, key_datum);	if (value_datum.dptr) {		ret = (char *)emalloc(sizeof(char) * value_datum.dsize + 1);		strncpy(ret, value_datum.dptr, value_datum.dsize);		ret[value_datum.dsize] = '\0';#if GDBM/* all but NDBM use malloc to allocate the content blocks, so we need to free it */		free(value_datum.dptr);#else# if !NDBM		efree(value_datum.dptr);# endif#endif	}	else		ret = NULL;	if (ret && PG(magic_quotes_runtime)) {		ret = php_addslashes(ret, value_datum.dsize, NULL, 1 TSRMLS_CC);	}	return(ret);}/* }}} *//* {{{ proto int dbmexists(int dbm_identifier, string key)   Tells if a value exists for a key in a dbm database */PHP_FUNCTION(dbmexists){	pval *id, *key;	dbm_info *info;	int ret;	if (ZEND_NUM_ARGS()!=2||zend_get_parameters(ht, 2, &id, &key)==FAILURE) {		WRONG_PARAM_COUNT;	}	convert_to_string(key);	info = php_find_dbm(id TSRMLS_CC);	if (!info) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid database identifier %ld", Z_LVAL_P(id));		RETURN_FALSE;	}	ret = php_dbm_exists(info, Z_STRVAL_P(key) TSRMLS_CC);	RETURN_LONG(ret);}/* }}} *//* {{{ php_dbm_exists */int php_dbm_exists(dbm_info *info, char *key TSRMLS_DC) {	datum key_datum;	int ret;	DBM_TYPE dbf;	key_datum.dptr = key;	key_datum.dsize = strlen(key);#if GDBM_FIX	key_datum.dsize++;#endif	dbf = info->dbf;	if (!dbf) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to locate dbm file");		return(0);	}	ret = DBM_EXISTS(dbf, key_datum);	return(ret);}/* }}} *//* {{{ proto int dbmdelete(int dbm_identifier, string key)   Deletes the value for a key from a dbm database */ 		PHP_FUNCTION(dbmdelete){	pval *id, *key;	dbm_info *info;	int ret;	if (ZEND_NUM_ARGS()!=2||zend_get_parameters(ht, 2, &id, &key)==FAILURE) {		WRONG_PARAM_COUNT;	}	convert_to_string(key);	info = php_find_dbm(id TSRMLS_CC);	if (!info) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid database identifier %ld", Z_LVAL_P(id));		RETURN_FALSE;	}	ret = php_dbm_delete(info, Z_STRVAL_P(key) TSRMLS_CC);	RETURN_LONG(ret);}/* }}} *//* {{{ php_dbm_delete */int php_dbm_delete(dbm_info *info, char *key TSRMLS_DC) {	datum key_datum;	int ret;	DBM_TYPE dbf;	key_datum.dptr = key;	key_datum.dsize = strlen(key);#if GDBM_FIX	key_datum.dsize++;#endif	dbf = info->dbf;	if (!dbf) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to locate dbm file");		return(0);	}	ret = DBM_DELETE(dbf, key_datum);	return(ret);}/* }}} *//* {{{ proto string dbmfirstkey(int dbm_identifier)   Retrieves the first key from a dbm database */PHP_FUNCTION(dbmfirstkey){	pval *id;	dbm_info *info;	char *ret;	if (ZEND_NUM_ARGS()!=1||zend_get_parameters(ht, 1, &id)==FAILURE) {		WRONG_PARAM_COUNT;	}	info = php_find_dbm(id TSRMLS_CC);	if (!info) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid database identifier %ld", Z_LVAL_P(id));		RETURN_FALSE;	}	ret = php_dbm_first_key(info TSRMLS_CC);	if (!ret) {		RETURN_FALSE;	} else {		RETVAL_STRING(ret, 0);	}}/* }}} *//* {{{ php_dbm_first_key */char *php_dbm_first_key(dbm_info *info TSRMLS_DC) {	datum ret_datum;	char *ret;	DBM_TYPE dbf;	dbf = info->dbf;	if (!dbf) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to locate dbm file");		return(NULL);	}	/* explicitly zero-out ret_datum */	ret_datum.dptr = NULL;	ret_datum.dsize = 0;	ret_datum = DBM_FIRSTKEY(dbf);		if (!ret_datum.dptr)		return NULL;	ret = (char *)emalloc((ret_datum.dsize + 1) * sizeof(char));	strncpy(ret, ret_datum.dptr, ret_datum.dsize);		ret[ret_datum.dsize] = '\0';#if !NDBM & !GDBM	efree(ret_datum.dptr);#endif	return (ret);}/* }}} *//* {{{ proto string dbmnextkey(int dbm_identifier, string key)   Retrieves the next key from a dbm database */PHP_FUNCTION(dbmnextkey){	pval *id, *key;	dbm_info *info;	char *ret;	if (ZEND_NUM_ARGS()!=2||zend_get_parameters(ht, 2, &id, &key)==FAILURE) {		WRONG_PARAM_COUNT;	}	convert_to_string(key);	info = php_find_dbm(id TSRMLS_CC);	if (!info) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid database identifier %ld", Z_LVAL_P(id));		RETURN_FALSE;	}	ret = php_dbm_nextkey(info, Z_STRVAL_P(key) TSRMLS_CC);	if (!ret) {		RETURN_FALSE;	} else {		RETVAL_STRING(ret, 0);	}}/* }}} *//* {{{ php_dbm_nextkey */char *php_dbm_nextkey(dbm_info *info, char *key TSRMLS_DC){	datum key_datum, ret_datum;	char *ret;	DBM_TYPE dbf;	key_datum.dptr = key;	key_datum.dsize = strlen(key);#if GDBM_FIX	key_datum.dsize++;#endif	dbf = info->dbf;	if (!dbf) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to locate dbm file");		return(NULL);	}	/* explicitly zero-out ret_datum */	ret_datum.dptr = NULL;	ret_datum.dsize = 0;	ret_datum = DBM_NEXTKEY(dbf, key_datum);	if (ret_datum.dptr) {		ret = (char *)emalloc(sizeof(char) * ret_datum.dsize + 1);		strncpy(ret, ret_datum.dptr, ret_datum.dsize);		ret[ret_datum.dsize] = '\0';#if GDBM/* GDBM uses malloc to allocate the value_datum block, so we need to free it */		free(ret_datum.dptr);#else# if !NDBM		efree(ret_datum.dptr);# endif#endif	}	else ret=NULL;	if (ret && PG(magic_quotes_runtime)) {		ret = php_addslashes(ret, ret_datum.dsize, NULL, 1 TSRMLS_CC);	}	return(ret);}/* }}} */#if !GDBM && !NDBMstatic long CurrentFlatFilePos = 0L;/* {{{ flatfile_store */int flatfile_store(FILE *dbf, datum key_datum, datum value_datum, int mode) {	int ret;	if (mode == DBM_INSERT) {		if (flatfile_findkey(dbf, key_datum)) {			return 1;		}		fseek(dbf, 0L, SEEK_END);		fprintf(dbf, "%d\n", key_datum.dsize);		fflush(dbf);		ret = fwrite(key_datum.dptr, sizeof(char), key_datum.dsize, dbf);		fprintf(dbf, "%d\n", value_datum.dsize);		fflush(dbf);		ret = fwrite(value_datum.dptr, sizeof(char), value_datum.dsize, dbf);	} else { /* DBM_REPLACE */		flatfile_delete(dbf, key_datum);		fprintf(dbf, "%d\n", key_datum.dsize);		fflush(dbf);		ret = fwrite(key_datum.dptr, sizeof(char), key_datum.dsize, dbf);		fprintf(dbf, "%d\n", value_datum.dsize);		ret = fwrite(value_datum.dptr, sizeof(char), value_datum.dsize, dbf);	}	if (ret>0)		ret=0;	return ret;}/* }}} *//* {{{ flatfile_fetch */datum flatfile_fetch(FILE *dbf, datum key_datum) {	datum value_datum = {NULL, 0};	int num=0, buf_size=1024;	char *buf;		if (flatfile_findkey(dbf, key_datum)) {		buf = emalloc((buf_size+1) * sizeof(char));		if (fgets(buf, 15, dbf)) {			num = atoi(buf);			if (num > buf_size) {				buf_size+=num;				buf = erealloc(buf, (buf_size+1)*sizeof(char));			}			fread(buf, sizeof(char), num, dbf);			value_datum.dptr = buf;			value_datum.dsize = num;		}	}	return value_datum;}/* }}} *//* {{{ flatfile_delete */int flatfile_delete(FILE *dbf, datum key_datum) {	char *key = key_datum.dptr;	int size = key_datum.dsize;	char *buf;	int num, buf_size = 1024;	long pos;	rewind(dbf);	buf = emalloc((buf_size + 1)*sizeof(char));	while(!feof(dbf)) {		/* read in the length of the key name */		if (!fgets(buf, 15, dbf))			break;		num = atoi(buf);		if (num > buf_size) {			buf_size += num;			buf = erealloc(buf, (buf_size+1)*sizeof(char));		}		pos = ftell(dbf);		/* read in the key name */		num = fread(buf, sizeof(char), num, dbf);		if (num<0) break;		*(buf+num) = '\0';		if (size == num && !memcmp(buf, key, size)) {			fseek(dbf, pos, SEEK_SET);			fputc(0, dbf);			fflush(dbf);			fseek(dbf, 0L, SEEK_END);			if (buf) efree(buf);			return SUCCESS;		}			/* read in the length of the value */		if (!fgets(buf, 15, dbf))			break;		num = atoi(buf);		if (num > buf_size) {			buf_size+=num;			if (buf) efree(buf);			buf = emalloc((buf_size+1)*sizeof(char));		}		/* read in the value */		num = fread(buf, sizeof(char), num, dbf);		if (num<0)			break;	}	if (buf) efree(buf);	return FAILURE;}	/* }}} *//* {{{ flatfile_findkey */int flatfile_findkey(FILE *dbf, datum key_datum) {	char *buf = NULL;	int num;	int buf_size=1024;	int ret=0;	void *key = key_datum.dptr;	int size = key_datum.dsize;	rewind(dbf);	buf = emalloc((buf_size+1)*sizeof(char));	while (!feof(dbf)) {		if (!fgets(buf, 15, dbf)) break;		num = atoi(buf);		if (num > buf_size) {			if (buf) efree(buf);			buf_size+=num;			buf = emalloc((buf_size+1)*sizeof(char));		}		num = fread(buf, sizeof(char), num, dbf);		if (num<0) break;		*(buf+num) = '\0';		if (size == num) {			if (!memcmp(buf, key, size)) {				ret = 1;				break;			}		}			if (!fgets(buf, 15, dbf))			break;		num = atoi(buf);		if (num > buf_size) {			if (buf) efree(buf);			buf_size+=num;			buf = emalloc((buf_size+1)*sizeof(char));		}		num = fread(buf, sizeof(char), num, dbf);		if (num<0) break;		*(buf+num) = '\0';	}	if (buf) efree(buf);	return(ret);}/* }}} *//* {{{ flatfile_firstkey */datum flatfile_firstkey(FILE *dbf) {	datum buf;	int num;	int buf_size=1024;	rewind(dbf);	buf.dptr = emalloc((buf_size+1)*sizeof(char));	while(!feof(dbf)) {		if (!fgets(buf.dptr, 15, dbf)) break;		num = atoi(buf.dptr);		if (num > buf_size) {			buf_size+=num;			if (buf.dptr) efree(buf.dptr);			buf.dptr = emalloc((buf_size+1)*sizeof(char));		}		num = fread(buf.dptr, sizeof(char), num, dbf);		if (num<0) break;		buf.dsize = num;		if (*(buf.dptr)!=0) {			CurrentFlatFilePos = ftell(dbf);			return(buf);		}		if (!fgets(buf.dptr, 15, dbf)) break;		num = atoi(buf.dptr);		if (num > buf_size) {			buf_size+=num;			if (buf.dptr) efree(buf.dptr);			buf.dptr = emalloc((buf_size+1)*sizeof(char));		}		num = fread(buf.dptr, sizeof(char), num, dbf);		if (num<0) break;	}	if (buf.dptr) efree(buf.dptr);	buf.dptr = NULL;	return(buf);}/* }}} *//* {{{ latfile_nextkey */datum flatfile_nextkey(FILE *dbf) {	datum buf;	int num;	int buf_size=1024;	fseek(dbf, CurrentFlatFilePos, SEEK_SET);	buf.dptr = emalloc((buf_size+1)*sizeof(char));	while(!feof(dbf)) {		if (!fgets(buf.dptr, 15, dbf)) break;		num = atoi(buf.dptr);		if (num > buf_size) {			buf_size+=num;			if (buf.dptr) efree(buf.dptr);			buf.dptr = emalloc((buf_size+1)*sizeof(char));		}		num = fread(buf.dptr, sizeof(char), num, dbf);		if (num<0) break;		if (!fgets(buf.dptr, 15, dbf)) break;		num = atoi(buf.dptr);		if (num > buf_size) {			buf_size+=num;			if (buf.dptr) efree(buf.dptr);			buf.dptr = emalloc((buf_size+1)*sizeof(char));		}		num = fread(buf.dptr, sizeof(char), num, dbf);		if (num<0) break;		buf.dsize = num;		if (*(buf.dptr)!=0) {			CurrentFlatFilePos = ftell(dbf);			return(buf);		}	}	if (buf.dptr) efree(buf.dptr);	buf.dptr = NULL;	return(buf);}	/* }}} */#endif/* {{{ PHP_MINIT_FUNCTION */PHP_MINIT_FUNCTION(db){	le_db = zend_register_list_destructors_ex(php_dbm_close, NULL, "dbm", module_number);	return SUCCESS;}/* }}} *//* {{{ PHP_RINIT_FUNCTION */PHP_RINIT_FUNCTION(db){#if !GDBM && !NDBM	CurrentFlatFilePos = 0L;#endif	return SUCCESS;}/* }}} *//* {{{ dbm_functions[] */function_entry dbm_functions[] = {	PHP_FE(dblist,									NULL)	PHP_FE(dbmopen,									NULL)	PHP_FE(dbmclose,								NULL)	PHP_FE(dbminsert,								NULL)	PHP_FE(dbmfetch,								NULL)	PHP_FE(dbmreplace,								NULL)	PHP_FE(dbmexists,								NULL)	PHP_FE(dbmdelete,								NULL)	PHP_FE(dbmfirstkey,								NULL)	PHP_FE(dbmnextkey,								NULL)#if HELLY_0	PHP_FE(db_id_list,                              NULL)#endif	{NULL, NULL, NULL}};/* }}} */zend_module_entry dbm_module_entry = {	STANDARD_MODULE_HEADER,	"db",	dbm_functions,	PHP_MINIT(db),	NULL,	PHP_RINIT(db),	NULL,	PHP_MINFO(db),	NO_VERSION_YET,	STANDARD_MODULE_PROPERTIES};#ifdef COMPILE_DL_DBZEND_GET_MODULE(dbm)#endif/* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: sw=4 ts=4 fdm=marker * vim<600: sw=4 ts=4 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -