123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- #ifdef HAVE_CONFIG_H
- #include "config.h"
- #endif
- #include "php.h"
- #if DBA_DB3
- #include "php_db3.h"
- #include <sys/stat.h>
- #include <string.h>
- #ifdef DB3_INCLUDE_FILE
- #include DB3_INCLUDE_FILE
- #else
- #include <db.h>
- #endif
- static void php_dba_db3_errcall_fcn(const char *errpfx, char *msg)
- {
- TSRMLS_FETCH();
-
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "%s%s", errpfx?errpfx:"", msg);
- }
- #define DB3_DATA dba_db3_data *dba = info->dbf
- #define DB3_GKEY \
- DBT gkey; \
- memset(&gkey, 0, sizeof(gkey)); \
- gkey.data = (char *) key; gkey.size = keylen
- typedef struct {
- DB *dbp;
- DBC *cursor;
- } dba_db3_data;
- DBA_OPEN_FUNC(db3)
- {
- DB *dbp = NULL;
- DBTYPE type;
- int gmode = 0, err;
- int filemode = 0644;
- struct stat check_stat;
- int s = VCWD_STAT(info->path, &check_stat);
- if (!s && !check_stat.st_size) {
- info->mode = DBA_TRUNC;
- }
- type = info->mode == DBA_READER ? DB_UNKNOWN :
- info->mode == DBA_TRUNC ? DB_BTREE :
- s ? DB_BTREE : DB_UNKNOWN;
-
- gmode = info->mode == DBA_READER ? DB_RDONLY :
- (info->mode == DBA_CREAT && s) ? DB_CREATE :
- (info->mode == DBA_CREAT && !s) ? 0 :
- info->mode == DBA_WRITER ? 0 :
- info->mode == DBA_TRUNC ? DB_CREATE | DB_TRUNCATE : -1;
- if (gmode == -1) {
- return FAILURE;
- }
- if (info->argc > 0) {
- convert_to_long_ex(info->argv[0]);
- filemode = Z_LVAL_PP(info->argv[0]);
- }
- #ifdef DB_FCNTL_LOCKING
- gmode |= DB_FCNTL_LOCKING;
- #endif
- if ((err=db_create(&dbp, NULL, 0)) == 0) {
- dbp->set_errcall(dbp, php_dba_db3_errcall_fcn);
- if ((err=dbp->open(dbp, info->path, NULL, type, gmode, filemode)) == 0) {
- dba_db3_data *data;
- data = pemalloc(sizeof(*data), info->flags&DBA_PERSISTENT);
- data->dbp = dbp;
- data->cursor = NULL;
- info->dbf = data;
-
- return SUCCESS;
- } else {
- dbp->close(dbp, 0);
- *error = db_strerror(err);
- }
- } else {
- *error = db_strerror(err);
- }
- return FAILURE;
- }
- DBA_CLOSE_FUNC(db3)
- {
- DB3_DATA;
-
- if (dba->cursor) dba->cursor->c_close(dba->cursor);
- dba->dbp->close(dba->dbp, 0);
- pefree(dba, info->flags&DBA_PERSISTENT);
- }
- DBA_FETCH_FUNC(db3)
- {
- DBT gval;
- char *new = NULL;
- DB3_DATA;
- DB3_GKEY;
-
- memset(&gval, 0, sizeof(gval));
- if (!dba->dbp->get(dba->dbp, NULL, &gkey, &gval, 0)) {
- if (newlen) *newlen = gval.size;
- new = estrndup(gval.data, gval.size);
- }
- return new;
- }
- DBA_UPDATE_FUNC(db3)
- {
- DBT gval;
- DB3_DATA;
- DB3_GKEY;
-
- memset(&gval, 0, sizeof(gval));
- gval.data = (char *) val;
- gval.size = vallen;
- if (!dba->dbp->put(dba->dbp, NULL, &gkey, &gval,
- mode == 1 ? DB_NOOVERWRITE : 0)) {
- return SUCCESS;
- }
- return FAILURE;
- }
- DBA_EXISTS_FUNC(db3)
- {
- DBT gval;
- DB3_DATA;
- DB3_GKEY;
-
- memset(&gval, 0, sizeof(gval));
- if (!dba->dbp->get(dba->dbp, NULL, &gkey, &gval, 0)) {
- return SUCCESS;
- }
- return FAILURE;
- }
- DBA_DELETE_FUNC(db3)
- {
- DB3_DATA;
- DB3_GKEY;
- return dba->dbp->del(dba->dbp, NULL, &gkey, 0) ? FAILURE : SUCCESS;
- }
- DBA_FIRSTKEY_FUNC(db3)
- {
- DB3_DATA;
- if (dba->cursor) {
- dba->cursor->c_close(dba->cursor);
- }
- dba->cursor = NULL;
- if (dba->dbp->cursor(dba->dbp, NULL, &dba->cursor, 0) != 0) {
- return NULL;
- }
-
- return dba_nextkey_db3(info, newlen TSRMLS_CC);
- }
- DBA_NEXTKEY_FUNC(db3)
- {
- DB3_DATA;
- DBT gkey, gval;
- char *nkey = NULL;
-
- memset(&gkey, 0, sizeof(gkey));
- memset(&gval, 0, sizeof(gval));
- if (dba->cursor->c_get(dba->cursor, &gkey, &gval, DB_NEXT) == 0) {
- if (gkey.data) {
- nkey = estrndup(gkey.data, gkey.size);
- if (newlen) *newlen = gkey.size;
- }
- }
- return nkey;
- }
- DBA_OPTIMIZE_FUNC(db3)
- {
- return SUCCESS;
- }
- DBA_SYNC_FUNC(db3)
- {
- DB3_DATA;
- return dba->dbp->sync(dba->dbp, 0) ? FAILURE : SUCCESS;
- }
- DBA_INFO_FUNC(db3)
- {
- return estrdup(DB_VERSION_STRING);
- }
- #endif
|