Annotation of embedaddon/php/ext/dba/dba_gdbm.c, revision 1.1.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_gdbm.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_GDBM
28: #include "php_gdbm.h"
29:
30: #ifdef GDBM_INCLUDE_FILE
31: #include GDBM_INCLUDE_FILE
32: #endif
33:
34: #define GDBM_DATA dba_gdbm_data *dba = info->dbf
35: #define GDBM_GKEY datum gkey; gkey.dptr = (char *) key; gkey.dsize = keylen
36:
37: typedef struct {
38: GDBM_FILE dbf;
39: datum nextkey;
40: } dba_gdbm_data;
41:
42: DBA_OPEN_FUNC(gdbm)
43: {
44: GDBM_FILE dbf;
45: int gmode = 0;
46: int filemode = 0644;
47:
48: gmode = info->mode == DBA_READER ? GDBM_READER :
49: info->mode == DBA_WRITER ? GDBM_WRITER :
50: info->mode == DBA_CREAT ? GDBM_WRCREAT :
51: info->mode == DBA_TRUNC ? GDBM_NEWDB : -1;
52:
53: if(gmode == -1)
54: return FAILURE; /* not possible */
55:
56: if(info->argc > 0) {
57: convert_to_long_ex(info->argv[0]);
58: filemode = Z_LVAL_PP(info->argv[0]);
59: }
60:
61: dbf = gdbm_open(info->path, 0, gmode, filemode, NULL);
62:
63: if(dbf) {
64: info->dbf = pemalloc(sizeof(dba_gdbm_data), info->flags&DBA_PERSISTENT);
65: memset(info->dbf, 0, sizeof(dba_gdbm_data));
66: ((dba_gdbm_data *) info->dbf)->dbf = dbf;
67: return SUCCESS;
68: }
69: *error = gdbm_strerror(gdbm_errno);
70: return FAILURE;
71: }
72:
73: DBA_CLOSE_FUNC(gdbm)
74: {
75: GDBM_DATA;
76:
77: if(dba->nextkey.dptr) free(dba->nextkey.dptr);
78: gdbm_close(dba->dbf);
79: pefree(dba, info->flags&DBA_PERSISTENT);
80: }
81:
82: DBA_FETCH_FUNC(gdbm)
83: {
84: GDBM_DATA;
85: datum gval;
86: char *new = NULL;
87:
88: GDBM_GKEY;
89: gval = gdbm_fetch(dba->dbf, gkey);
90: if(gval.dptr) {
91: if(newlen) *newlen = gval.dsize;
92: new = estrndup(gval.dptr, gval.dsize);
93: free(gval.dptr);
94: }
95: return new;
96: }
97:
98: DBA_UPDATE_FUNC(gdbm)
99: {
100: datum gval;
101: GDBM_DATA;
102:
103: GDBM_GKEY;
104: gval.dptr = (char *) val;
105: gval.dsize = vallen;
106:
107: if(gdbm_store(dba->dbf, gkey, gval,
108: mode == 1 ? GDBM_INSERT : GDBM_REPLACE) == 0)
109: return SUCCESS;
110: php_error_docref2(NULL TSRMLS_CC, key, val, E_WARNING, "%s", gdbm_strerror(gdbm_errno));
111: return FAILURE;
112: }
113:
114: DBA_EXISTS_FUNC(gdbm)
115: {
116: GDBM_DATA;
117: GDBM_GKEY;
118:
119: return gdbm_exists(dba->dbf, gkey) ? SUCCESS : FAILURE;
120: }
121:
122: DBA_DELETE_FUNC(gdbm)
123: {
124: GDBM_DATA;
125: GDBM_GKEY;
126:
127: return gdbm_delete(dba->dbf, gkey) == -1 ? FAILURE : SUCCESS;
128: }
129:
130: DBA_FIRSTKEY_FUNC(gdbm)
131: {
132: GDBM_DATA;
133: datum gkey;
134: char *key = NULL;
135:
136: if(dba->nextkey.dptr) {
137: free(dba->nextkey.dptr);
138: }
139:
140: gkey = gdbm_firstkey(dba->dbf);
141: if(gkey.dptr) {
142: key = estrndup(gkey.dptr, gkey.dsize);
143: if(newlen) *newlen = gkey.dsize;
144: dba->nextkey = gkey;
145: } else {
146: dba->nextkey.dptr = NULL;
147: }
148: return key;
149: }
150:
151: DBA_NEXTKEY_FUNC(gdbm)
152: {
153: GDBM_DATA;
154: char *nkey = NULL;
155: datum gkey;
156:
157: if(!dba->nextkey.dptr) return NULL;
158:
159: gkey = gdbm_nextkey(dba->dbf, dba->nextkey);
160: free(dba->nextkey.dptr);
161: if(gkey.dptr) {
162: nkey = estrndup(gkey.dptr, gkey.dsize);
163: if(newlen) *newlen = gkey.dsize;
164: dba->nextkey = gkey;
165: } else {
166: dba->nextkey.dptr = NULL;
167: }
168: return nkey;
169: }
170:
171: DBA_OPTIMIZE_FUNC(gdbm)
172: {
173: GDBM_DATA;
174: gdbm_reorganize(dba->dbf);
175: return SUCCESS;
176: }
177:
178: DBA_SYNC_FUNC(gdbm)
179: {
180: GDBM_DATA;
181:
182: gdbm_sync(dba->dbf);
183: return SUCCESS;
184: }
185:
186: DBA_INFO_FUNC(gdbm)
187: {
188: return estrdup(gdbm_version);
189: }
190:
191: #endif
192:
193: /*
194: * Local variables:
195: * tab-width: 4
196: * c-basic-offset: 4
197: * End:
198: * vim600: sw=4 ts=4 fdm=marker
199: * vim<600: sw=4 ts=4
200: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>