Annotation of embedaddon/php/ext/dba/dba_db3.c, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | PHP Version 5 |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 1997-2012 The PHP Group |
! 6: +----------------------------------------------------------------------+
! 7: | This source file is subject to version 3.01 of the PHP license, |
! 8: | that is bundled with this package in the file LICENSE, and is |
! 9: | available through the world-wide-web at the following url: |
! 10: | http://www.php.net/license/3_01.txt |
! 11: | If you did not receive a copy of the PHP license and are unable to |
! 12: | obtain it through the world-wide-web, please send a note to |
! 13: | license@php.net so we can mail you a copy immediately. |
! 14: +----------------------------------------------------------------------+
! 15: | Author: Sascha Schumann <sascha@schumann.cx> |
! 16: +----------------------------------------------------------------------+
! 17: */
! 18:
! 19: /* $Id: dba_db3.c 321634 2012-01-01 13:15:04Z felipe $ */
! 20:
! 21: #ifdef HAVE_CONFIG_H
! 22: #include "config.h"
! 23: #endif
! 24:
! 25: #include "php.h"
! 26:
! 27: #if DBA_DB3
! 28: #include "php_db3.h"
! 29: #include <sys/stat.h>
! 30:
! 31: #include <string.h>
! 32: #ifdef DB3_INCLUDE_FILE
! 33: #include DB3_INCLUDE_FILE
! 34: #else
! 35: #include <db.h>
! 36: #endif
! 37:
! 38: static void php_dba_db3_errcall_fcn(const char *errpfx, char *msg)
! 39: {
! 40: TSRMLS_FETCH();
! 41:
! 42: php_error_docref(NULL TSRMLS_CC, E_NOTICE, "%s%s", errpfx?errpfx:"", msg);
! 43: }
! 44:
! 45: #define DB3_DATA dba_db3_data *dba = info->dbf
! 46: #define DB3_GKEY \
! 47: DBT gkey; \
! 48: memset(&gkey, 0, sizeof(gkey)); \
! 49: gkey.data = (char *) key; gkey.size = keylen
! 50:
! 51: typedef struct {
! 52: DB *dbp;
! 53: DBC *cursor;
! 54: } dba_db3_data;
! 55:
! 56: DBA_OPEN_FUNC(db3)
! 57: {
! 58: DB *dbp = NULL;
! 59: DBTYPE type;
! 60: int gmode = 0, err;
! 61: int filemode = 0644;
! 62: struct stat check_stat;
! 63: int s = VCWD_STAT(info->path, &check_stat);
! 64:
! 65: if (!s && !check_stat.st_size) {
! 66: info->mode = DBA_TRUNC; /* force truncate */
! 67: }
! 68:
! 69: type = info->mode == DBA_READER ? DB_UNKNOWN :
! 70: info->mode == DBA_TRUNC ? DB_BTREE :
! 71: s ? DB_BTREE : DB_UNKNOWN;
! 72:
! 73: gmode = info->mode == DBA_READER ? DB_RDONLY :
! 74: (info->mode == DBA_CREAT && s) ? DB_CREATE :
! 75: (info->mode == DBA_CREAT && !s) ? 0 :
! 76: info->mode == DBA_WRITER ? 0 :
! 77: info->mode == DBA_TRUNC ? DB_CREATE | DB_TRUNCATE : -1;
! 78:
! 79: if (gmode == -1) {
! 80: return FAILURE; /* not possible */
! 81: }
! 82:
! 83: if (info->argc > 0) {
! 84: convert_to_long_ex(info->argv[0]);
! 85: filemode = Z_LVAL_PP(info->argv[0]);
! 86: }
! 87:
! 88: #ifdef DB_FCNTL_LOCKING
! 89: gmode |= DB_FCNTL_LOCKING;
! 90: #endif
! 91:
! 92: if ((err=db_create(&dbp, NULL, 0)) == 0) {
! 93: dbp->set_errcall(dbp, php_dba_db3_errcall_fcn);
! 94: if ((err=dbp->open(dbp, info->path, NULL, type, gmode, filemode)) == 0) {
! 95: dba_db3_data *data;
! 96:
! 97: data = pemalloc(sizeof(*data), info->flags&DBA_PERSISTENT);
! 98: data->dbp = dbp;
! 99: data->cursor = NULL;
! 100: info->dbf = data;
! 101:
! 102: return SUCCESS;
! 103: } else {
! 104: dbp->close(dbp, 0);
! 105: *error = db_strerror(err);
! 106: }
! 107: } else {
! 108: *error = db_strerror(err);
! 109: }
! 110:
! 111: return FAILURE;
! 112: }
! 113:
! 114: DBA_CLOSE_FUNC(db3)
! 115: {
! 116: DB3_DATA;
! 117:
! 118: if (dba->cursor) dba->cursor->c_close(dba->cursor);
! 119: dba->dbp->close(dba->dbp, 0);
! 120: pefree(dba, info->flags&DBA_PERSISTENT);
! 121: }
! 122:
! 123: DBA_FETCH_FUNC(db3)
! 124: {
! 125: DBT gval;
! 126: char *new = NULL;
! 127: DB3_DATA;
! 128: DB3_GKEY;
! 129:
! 130: memset(&gval, 0, sizeof(gval));
! 131: if (!dba->dbp->get(dba->dbp, NULL, &gkey, &gval, 0)) {
! 132: if (newlen) *newlen = gval.size;
! 133: new = estrndup(gval.data, gval.size);
! 134: }
! 135: return new;
! 136: }
! 137:
! 138: DBA_UPDATE_FUNC(db3)
! 139: {
! 140: DBT gval;
! 141: DB3_DATA;
! 142: DB3_GKEY;
! 143:
! 144: memset(&gval, 0, sizeof(gval));
! 145: gval.data = (char *) val;
! 146: gval.size = vallen;
! 147:
! 148: if (!dba->dbp->put(dba->dbp, NULL, &gkey, &gval,
! 149: mode == 1 ? DB_NOOVERWRITE : 0)) {
! 150: return SUCCESS;
! 151: }
! 152: return FAILURE;
! 153: }
! 154:
! 155: DBA_EXISTS_FUNC(db3)
! 156: {
! 157: DBT gval;
! 158: DB3_DATA;
! 159: DB3_GKEY;
! 160:
! 161: memset(&gval, 0, sizeof(gval));
! 162: if (!dba->dbp->get(dba->dbp, NULL, &gkey, &gval, 0)) {
! 163: return SUCCESS;
! 164: }
! 165: return FAILURE;
! 166: }
! 167:
! 168: DBA_DELETE_FUNC(db3)
! 169: {
! 170: DB3_DATA;
! 171: DB3_GKEY;
! 172:
! 173: return dba->dbp->del(dba->dbp, NULL, &gkey, 0) ? FAILURE : SUCCESS;
! 174: }
! 175:
! 176: DBA_FIRSTKEY_FUNC(db3)
! 177: {
! 178: DB3_DATA;
! 179:
! 180: if (dba->cursor) {
! 181: dba->cursor->c_close(dba->cursor);
! 182: }
! 183:
! 184: dba->cursor = NULL;
! 185: if (dba->dbp->cursor(dba->dbp, NULL, &dba->cursor, 0) != 0) {
! 186: return NULL;
! 187: }
! 188:
! 189: /* we should introduce something like PARAM_PASSTHRU... */
! 190: return dba_nextkey_db3(info, newlen TSRMLS_CC);
! 191: }
! 192:
! 193: DBA_NEXTKEY_FUNC(db3)
! 194: {
! 195: DB3_DATA;
! 196: DBT gkey, gval;
! 197: char *nkey = NULL;
! 198:
! 199: memset(&gkey, 0, sizeof(gkey));
! 200: memset(&gval, 0, sizeof(gval));
! 201:
! 202: if (dba->cursor->c_get(dba->cursor, &gkey, &gval, DB_NEXT) == 0) {
! 203: if (gkey.data) {
! 204: nkey = estrndup(gkey.data, gkey.size);
! 205: if (newlen) *newlen = gkey.size;
! 206: }
! 207: }
! 208:
! 209: return nkey;
! 210: }
! 211:
! 212: DBA_OPTIMIZE_FUNC(db3)
! 213: {
! 214: return SUCCESS;
! 215: }
! 216:
! 217: DBA_SYNC_FUNC(db3)
! 218: {
! 219: DB3_DATA;
! 220:
! 221: return dba->dbp->sync(dba->dbp, 0) ? FAILURE : SUCCESS;
! 222: }
! 223:
! 224: DBA_INFO_FUNC(db3)
! 225: {
! 226: return estrdup(DB_VERSION_STRING);
! 227: }
! 228:
! 229: #endif
! 230:
! 231: /*
! 232: * Local variables:
! 233: * tab-width: 4
! 234: * c-basic-offset: 4
! 235: * End:
! 236: * vim600: sw=4 ts=4 fdm=marker
! 237: * vim<600: sw=4 ts=4
! 238: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>