📄 filepro.c
字号:
} else { for (tmp = FP_GLOBAL(fp_fieldlist); tmp; tmp = tmp->next) { if (!tmp->next) { tmp->next = new_field; tmp = new_field; } } } } fclose(fp); FP_GLOBAL(fp_database) = estrndup(Z_STRVAL_P(dir), Z_STRLEN_P(dir)); RETVAL_TRUE;}/* }}} *//* * LONG filePro_rowcount(void) * * Count the used rows in the database. filePro just marks deleted records * as deleted; they are not removed. Since no counts are maintained we need * to go in and count records ourselves. <sigh> * * Errors return false, success returns the row count. *//* {{{ proto int filepro_rowcount(void) Find out how many rows are in a filePro database */PHP_FUNCTION(filepro_rowcount){ FILE *fp; char workbuf[MAXPATHLEN]; char readbuf[256]; int recsize = 0, records = 0; FP_TLS_VARS; if (ZEND_NUM_ARGS() != 0) { WRONG_PARAM_COUNT; } if (!FP_GLOBAL(fp_database)) { php_error(E_WARNING, "%s(): Must set database directory first!", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } recsize = FP_GLOBAL(fp_keysize) + 19; /* 20 bytes system info -1 to save time later */ /* Now read the records in, moving forward recsize-1 bytes each time */ snprintf(workbuf, sizeof(workbuf), "%s/key", FP_GLOBAL(fp_database)); if (PG(safe_mode) && (!php_checkuid(workbuf, NULL, CHECKUID_CHECK_FILE_AND_DIR))) { RETURN_FALSE; } if (php_check_open_basedir(workbuf TSRMLS_CC)) { RETURN_FALSE; } if (!(fp = VCWD_FOPEN(workbuf, "r"))) { php_error(E_WARNING, "%s(): Cannot open key: [%d] %s", get_active_function_name(TSRMLS_C), errno, strerror(errno)); RETURN_FALSE; } while (!feof(fp)) { if (fread(readbuf, 1, 1, fp) == 1) { if (readbuf[0]) records++; fseek(fp, recsize, SEEK_CUR); } } fclose(fp); RETVAL_LONG(records);}/* }}} *//* * STRING filePro_fieldname(LONG field_number) * * Errors return false, success returns the name of the field. *//* {{{ proto string filepro_fieldname(int fieldnumber) Gets the name of a field */PHP_FUNCTION(filepro_fieldname){ pval *fno; FP_FIELD *lp; int i; FP_TLS_VARS; if (ZEND_NUM_ARGS() != 1 || getParameters(ht, 1, &fno) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_long(fno); if (!FP_GLOBAL(fp_database)) { php_error(E_WARNING, "%s(): Must set database directory first!", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } for (i = 0, lp = FP_GLOBAL(fp_fieldlist); lp; lp = lp->next, i++) { if (i == Z_LVAL_P(fno)) { RETURN_STRING(lp->name, 1); } } php_error(E_WARNING, "%s(): Unable to locate field number %ld.", get_active_function_name(TSRMLS_C), Z_LVAL_P(fno)); RETVAL_FALSE;}/* }}} *//* * STRING filePro_fieldtype(LONG field_number) * * Errors return false, success returns the type (edit) of the field *//* {{{ proto string filepro_fieldtype(int field_number) Gets the type of a field */PHP_FUNCTION(filepro_fieldtype){ pval *fno; FP_FIELD *lp; int i; FP_TLS_VARS; if (ZEND_NUM_ARGS() != 1 || getParameters(ht, 1, &fno) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_long(fno); if (!FP_GLOBAL(fp_database)) { php_error(E_WARNING, "%s(): Must set database directory first!", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } for (i = 0, lp = FP_GLOBAL(fp_fieldlist); lp; lp = lp->next, i++) { if (i == Z_LVAL_P(fno)) { RETURN_STRING(lp->format, 1); } } php_error(E_WARNING, "%s(): Unable to locate field number %ld.", get_active_function_name(TSRMLS_C), Z_LVAL_P(fno)); RETVAL_FALSE;}/* }}} *//* * STRING filePro_fieldwidth(int field_number) * * Errors return false, success returns the character width of the field. *//* {{{ proto int filepro_fieldwidth(int field_number) Gets the width of a field */PHP_FUNCTION(filepro_fieldwidth){ pval *fno; FP_FIELD *lp; int i; FP_TLS_VARS; if (ZEND_NUM_ARGS() != 1 || getParameters(ht, 1, &fno) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_long(fno); if (!FP_GLOBAL(fp_database)) { php_error(E_WARNING, "%s(): Must set database directory first!", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } for (i = 0, lp = FP_GLOBAL(fp_fieldlist); lp; lp = lp->next, i++) { if (i == Z_LVAL_P(fno)) { RETURN_LONG(lp->width); } } php_error(E_WARNING, "%s(): Unable to locate field number %ld.", get_active_function_name(TSRMLS_C), Z_LVAL_P(fno)); RETVAL_FALSE;}/* }}} *//* * LONG filePro_fieldcount(void) * * Errors return false, success returns the field count. *//* {{{ proto int filepro_fieldcount(void) Find out how many fields are in a filePro database */PHP_FUNCTION(filepro_fieldcount){ FP_TLS_VARS; if (ZEND_NUM_ARGS() != 0) { WRONG_PARAM_COUNT; } if (!FP_GLOBAL(fp_database)) { php_error(E_WARNING, "%s(): Must set database directory first!", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } /* Read in the first line from the map file */ RETVAL_LONG(FP_GLOBAL(fp_fcount));}/* }}} *//* * STRING filePro_retrieve(int row_number, int field_number) * * Errors return false, success returns the datum. *//* {{{ proto string filepro_retrieve(int row_number, int field_number) Retrieves data from a filePro database */PHP_FUNCTION(filepro_retrieve){ pval *rno, *fno; FP_FIELD *lp; FILE *fp; char workbuf[MAXPATHLEN]; char *readbuf; int i, fnum, rnum; long offset; FP_TLS_VARS; if (ZEND_NUM_ARGS() != 2 || getParameters(ht, 2, &rno, &fno) == FAILURE) { WRONG_PARAM_COUNT; } if (!FP_GLOBAL(fp_database)) { php_error(E_WARNING, "%s(): Must set database directory first!", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } convert_to_long(rno); convert_to_long(fno); fnum = Z_LVAL_P(fno); rnum = Z_LVAL_P(rno); if (rnum < 0 || fnum < 0 || fnum >= FP_GLOBAL(fp_fcount)) { php_error(E_WARNING, "%s(): Parameters out of range", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } offset = (rnum + 1) * (FP_GLOBAL(fp_keysize) + 20) + 20; /* Record location */ for (i = 0, lp = FP_GLOBAL(fp_fieldlist); lp && i < fnum; lp = lp->next, i++) { offset += lp->width; } if (!lp) { php_error(E_WARNING, "%s(): Cannot locate field", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } /* Now read the record in */ snprintf(workbuf, sizeof(workbuf), "%s/key", FP_GLOBAL(fp_database)); if (PG(safe_mode) && (!php_checkuid(workbuf, NULL, CHECKUID_CHECK_FILE_AND_DIR))) { RETURN_FALSE; } if (php_check_open_basedir(workbuf TSRMLS_CC)) { RETURN_FALSE; } if (!(fp = VCWD_FOPEN(workbuf, "r"))) { php_error(E_WARNING, "%s(): Cannot open key: [%d] %s", get_active_function_name(TSRMLS_C), errno, strerror(errno)); fclose(fp); RETURN_FALSE; } fseek(fp, offset, SEEK_SET); readbuf = emalloc (lp->width+1); if (fread(readbuf, lp->width, 1, fp) != 1) { php_error(E_WARNING, "%s(): Cannot read data: [%d] %s", get_active_function_name(TSRMLS_C), errno, strerror(errno)); efree(readbuf); fclose(fp); RETURN_FALSE; } readbuf[lp->width] = '\0'; fclose(fp); RETURN_STRING(readbuf, 0);}/* }}} */#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 + -