![]() ![]() | ![]() |
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | PHP Version 5 |
4: +----------------------------------------------------------------------+
1.1.1.4 ! misho 5: | Copyright (c) 1997-2014 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: Shen Cheng-Da <cdsheen@gmail.com> |
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_DB1
28: #include "php_db1.h"
29:
30: #ifdef DB1_INCLUDE_FILE
31: #include DB1_INCLUDE_FILE
32: #endif
33:
34: #include <sys/types.h>
35: #include <sys/stat.h>
36: #include <fcntl.h>
37:
38: #define DB1_DATA dba_db1_data *dba = info->dbf
39: #define DB1_GKEY DBT gkey; gkey.data = (char *) key; gkey.size = keylen
40:
41: typedef struct {
42: DB *dbp;
43: } dba_db1_data;
44:
45: DBA_OPEN_FUNC(db1)
46: {
47: dba_db1_data *dba;
48: DB *db;
49:
50: int gmode;
51: int filemode = 0644;
52:
53: if (info->argc > 0) {
54: convert_to_long_ex(info->argv[0]);
55: filemode = Z_LVAL_PP(info->argv[0]);
56: }
57:
58: gmode = 0;
59: switch (info->mode) {
60: case DBA_READER:
61: gmode = O_RDONLY;
62: break;
63: case DBA_WRITER:
64: gmode = O_RDWR;
65: break;
66: case DBA_CREAT:
67: gmode = O_RDWR | O_CREAT;
68: break;
69: case DBA_TRUNC:
70: gmode = O_RDWR | O_CREAT | O_TRUNC;
71: break;
72: default:
73: return FAILURE; /* not possible */
74: }
75:
76: db = dbopen((char *)info->path, gmode, filemode, DB_HASH, NULL);
77:
78: if (db == NULL) {
79: return FAILURE;
80: }
81:
82: dba = pemalloc(sizeof(*dba), info->flags&DBA_PERSISTENT);
83: dba->dbp = db;
84:
85: info->dbf = dba;
86:
87: return SUCCESS;
88: }
89:
90: DBA_CLOSE_FUNC(db1)
91: {
92: DB1_DATA;
93: dba->dbp->close(dba->dbp);
94: pefree(info->dbf, info->flags&DBA_PERSISTENT);
95: }
96:
97: DBA_FETCH_FUNC(db1)
98: {
99: DBT gval;
100: DB1_DATA;
101: DB1_GKEY;
102:
103: memset(&gval, 0, sizeof(gval));
104: if (dba->dbp->get(dba->dbp, &gkey, &gval, 0) == RET_SUCCESS) {
105: if (newlen) *newlen = gval.size;
106: return estrndup(gval.data, gval.size);
107: }
108: return NULL;
109: }
110:
111: DBA_UPDATE_FUNC(db1)
112: {
113: DBT gval;
114: DB1_DATA;
115: DB1_GKEY;
116:
117: gval.data = (char *) val;
118: gval.size = vallen;
119:
120: return dba->dbp->put(dba->dbp, &gkey, &gval, mode == 1 ? R_NOOVERWRITE : 0) != RET_SUCCESS ? FAILURE : SUCCESS;
121: }
122:
123: DBA_EXISTS_FUNC(db1)
124: {
125: DBT gval;
126: DB1_DATA;
127: DB1_GKEY;
128:
129: return dba->dbp->get(dba->dbp, &gkey, &gval, 0) != RET_SUCCESS ? FAILURE : SUCCESS;
130: }
131:
132: DBA_DELETE_FUNC(db1)
133: {
134: DB1_DATA;
135: DB1_GKEY;
136:
137: return dba->dbp->del(dba->dbp, &gkey, 0) != RET_SUCCESS ? FAILURE : SUCCESS;
138: }
139:
140: DBA_FIRSTKEY_FUNC(db1)
141: {
142: DBT gkey;
143: DBT gval;
144: DB1_DATA;
145:
146: memset(&gkey, 0, sizeof(gkey));
147: memset(&gval, 0, sizeof(gval));
148:
149: if (dba->dbp->seq(dba->dbp, &gkey, &gval, R_FIRST) == RET_SUCCESS) {
150: if (newlen) *newlen = gkey.size;
151: return estrndup(gkey.data, gkey.size);
152: }
153: return NULL;
154: }
155:
156: DBA_NEXTKEY_FUNC(db1)
157: {
158: DBT gkey;
159: DBT gval;
160: DB1_DATA;
161:
162: memset(&gkey, 0, sizeof(gkey));
163: memset(&gval, 0, sizeof(gval));
164:
165: if (dba->dbp->seq(dba->dbp, &gkey, &gval, R_NEXT) == RET_SUCCESS) {
166: if (newlen) *newlen = gkey.size;
167: return estrndup(gkey.data, gkey.size);
168: }
169: return NULL;
170: }
171:
172: DBA_OPTIMIZE_FUNC(db1)
173: {
174: /* dummy */
175: return SUCCESS;
176: }
177:
178: DBA_SYNC_FUNC(db1)
179: {
180: return SUCCESS;
181: }
182:
183: DBA_INFO_FUNC(db1)
184: {
185: return estrdup(DB1_VERSION);
186: }
187:
188: #endif
189:
190: /*
191: * Local variables:
192: * tab-width: 4
193: * c-basic-offset: 4
194: * End:
195: * vim600: sw=4 ts=4 fdm=marker
196: * vim<600: sw=4 ts=4
197: */