![]() ![]() | ![]() |
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | PHP Version 5 |
4: +----------------------------------------------------------------------+
1.1.1.3 ! misho 5: | Copyright (c) 1997-2013 The PHP Group |
1.1 misho 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:
1.1.1.2 misho 19: /* $Id$ */
1.1 misho 20:
21: #ifdef HAVE_CONFIG_H
22: #include "config.h"
23: #endif
24:
25: #include "php.h"
26:
27: #if DBA_NDBM
28: #include "php_ndbm.h"
29:
30: #include <fcntl.h>
31: #ifdef NDBM_INCLUDE_FILE
32: #include NDBM_INCLUDE_FILE
33: #endif
34:
35: #define NDBM_GKEY datum gkey; gkey.dptr = (char *) key; gkey.dsize = keylen
36:
37: DBA_OPEN_FUNC(ndbm)
38: {
39: DBM *dbf;
40: int gmode = 0;
41: int filemode = 0644;
42: dba_info *pinfo = (dba_info *) info;
43:
44: switch(info->mode) {
45: case DBA_READER:
46: gmode = O_RDONLY;
47: break;
48: case DBA_WRITER:
49: gmode = O_RDWR;
50: break;
51: case DBA_CREAT:
52: gmode = O_RDWR | O_CREAT;
53: break;
54: case DBA_TRUNC:
55: gmode = O_RDWR | O_CREAT | O_TRUNC;
56: break;
57: default:
58: return FAILURE; /* not possible */
59: }
60:
61: if(info->argc > 0) {
62: convert_to_long_ex(info->argv[0]);
63: filemode = Z_LVAL_PP(info->argv[0]);
64: }
65:
66: dbf = dbm_open(info->path, gmode, filemode);
67:
68: pinfo->dbf = dbf;
69: return SUCCESS;
70: }
71:
72: DBA_CLOSE_FUNC(ndbm)
73: {
74: dbm_close(info->dbf);
75: }
76:
77: DBA_FETCH_FUNC(ndbm)
78: {
79: datum gval;
80: char *new = NULL;
81:
82: NDBM_GKEY;
83: gval = dbm_fetch(info->dbf, gkey);
84: if(gval.dptr) {
85: if(newlen) *newlen = gval.dsize;
86: new = estrndup(gval.dptr, gval.dsize);
87: }
88: return new;
89: }
90:
91: DBA_UPDATE_FUNC(ndbm)
92: {
93: datum gval;
94:
95: NDBM_GKEY;
96: gval.dptr = (char *) val;
97: gval.dsize = vallen;
98:
99: if(!dbm_store(info->dbf, gkey, gval, mode == 1 ? DBM_INSERT : DBM_REPLACE))
100: return SUCCESS;
101: return FAILURE;
102: }
103:
104: DBA_EXISTS_FUNC(ndbm)
105: {
106: datum gval;
107: NDBM_GKEY;
108: gval = dbm_fetch(info->dbf, gkey);
109: if(gval.dptr) {
110: return SUCCESS;
111: }
112: return FAILURE;
113: }
114:
115: DBA_DELETE_FUNC(ndbm)
116: {
117: NDBM_GKEY;
118: return(dbm_delete(info->dbf, gkey) == -1 ? FAILURE : SUCCESS);
119: }
120:
121: DBA_FIRSTKEY_FUNC(ndbm)
122: {
123: datum gkey;
124: char *key = NULL;
125:
126: gkey = dbm_firstkey(info->dbf);
127: if(gkey.dptr) {
128: if(newlen) *newlen = gkey.dsize;
129: key = estrndup(gkey.dptr, gkey.dsize);
130: }
131: return key;
132: }
133:
134: DBA_NEXTKEY_FUNC(ndbm)
135: {
136: datum gkey;
137: char *nkey = NULL;
138:
139: gkey = dbm_nextkey(info->dbf);
140: if(gkey.dptr) {
141: if(newlen) *newlen = gkey.dsize;
142: nkey = estrndup(gkey.dptr, gkey.dsize);
143: }
144: return nkey;
145: }
146:
147: DBA_OPTIMIZE_FUNC(ndbm)
148: {
149: return SUCCESS;
150: }
151:
152: DBA_SYNC_FUNC(ndbm)
153: {
154: return SUCCESS;
155: }
156:
157: DBA_INFO_FUNC(ndbm)
158: {
159: return estrdup("NDBM");
160: }
161:
162: #endif
163:
164: /*
165: * Local variables:
166: * tab-width: 4
167: * c-basic-offset: 4
168: * End:
169: * vim600: sw=4 ts=4 fdm=marker
170: * vim<600: sw=4 ts=4
171: */