Return to dba_db2.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / dba |
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:
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_DB2
28: #include "php_db2.h"
29: #include <sys/stat.h>
30:
31: #include <string.h>
32: #ifdef DB2_INCLUDE_FILE
33: #include DB2_INCLUDE_FILE
34: #endif
35:
36: #define DB2_DATA dba_db2_data *dba = info->dbf
37: #define DB2_GKEY \
38: DBT gkey = {0}; \
39: gkey.data = (char *) key; \
40: gkey.size = keylen
41:
42: typedef struct {
43: DB *dbp;
44: DBC *cursor;
45: } dba_db2_data;
46:
47: DBA_OPEN_FUNC(db2)
48: {
49: DB *dbp;
50: DBTYPE type;
51: int gmode = 0;
52: int filemode = 0644;
53: struct stat check_stat;
54: int s = VCWD_STAT(info->path, &check_stat);
55:
56: if (!s && !check_stat.st_size) {
57: info->mode = DBA_TRUNC; /* force truncate */
58: }
59:
60: type = info->mode == DBA_READER ? DB_UNKNOWN :
61: info->mode == DBA_TRUNC ? DB_BTREE :
62: s ? DB_BTREE : DB_UNKNOWN;
63:
64: gmode = info->mode == DBA_READER ? DB_RDONLY :
65: (info->mode == DBA_CREAT && s) ? DB_CREATE :
66: (info->mode == DBA_CREAT && !s) ? 0 :
67: info->mode == DBA_WRITER ? 0 :
68: info->mode == DBA_TRUNC ? DB_CREATE | DB_TRUNCATE : -1;
69:
70: if (gmode == -1) {
71: return FAILURE;/* not possible */
72: }
73:
74: if (info->argc > 0) {
75: convert_to_long_ex(info->argv[0]);
76: filemode = Z_LVAL_PP(info->argv[0]);
77: }
78:
79: if (db_open(info->path, type, gmode, filemode, NULL, NULL, &dbp)) {
80: return FAILURE;
81: }
82:
83: info->dbf = pemalloc(sizeof(dba_db2_data), info->flags&DBA_PERSISTENT);
84: memset(info->dbf, 0, sizeof(dba_db2_data));
85: ((dba_db2_data *) info->dbf)->dbp = dbp;
86: return SUCCESS;
87: }
88:
89: DBA_CLOSE_FUNC(db2)
90: {
91: DB2_DATA;
92:
93: if (dba->cursor)
94: dba->cursor->c_close(dba->cursor);
95: dba->dbp->close(dba->dbp, 0);
96: pefree(dba, info->flags&DBA_PERSISTENT);
97: }
98:
99: DBA_FETCH_FUNC(db2)
100: {
101: DBT gval = {0};
102: DB2_DATA;
103: DB2_GKEY;
104:
105: if (dba->dbp->get(dba->dbp, NULL, &gkey, &gval, 0)) {
106: return NULL;
107: }
108:
109: if (newlen) *newlen = gval.size;
110: return estrndup(gval.data, gval.size);
111: }
112:
113: DBA_UPDATE_FUNC(db2)
114: {
115: DBT gval = {0};
116: DB2_DATA;
117: DB2_GKEY;
118:
119: gval.data = (char *) val;
120: gval.size = vallen;
121:
122: if (dba->dbp->put(dba->dbp, NULL, &gkey, &gval,
123: mode == 1 ? DB_NOOVERWRITE : 0)) {
124: return FAILURE;
125: }
126: return SUCCESS;
127: }
128:
129: DBA_EXISTS_FUNC(db2)
130: {
131: DBT gval = {0};
132: DB2_DATA;
133: DB2_GKEY;
134:
135: if (dba->dbp->get(dba->dbp, NULL, &gkey, &gval, 0)) {
136: return FAILURE;
137: }
138: return SUCCESS;
139: }
140:
141: DBA_DELETE_FUNC(db2)
142: {
143: DB2_DATA;
144: DB2_GKEY;
145:
146: return dba->dbp->del(dba->dbp, NULL, &gkey, 0) ? FAILURE : SUCCESS;
147: }
148:
149: DBA_FIRSTKEY_FUNC(db2)
150: {
151: DB2_DATA;
152:
153: if (dba->cursor) {
154: dba->cursor->c_close(dba->cursor);
155: dba->cursor = NULL;
156: }
157:
158: #if (DB_VERSION_MAJOR > 2) || (DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR > 6) || (DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR == 6 && DB_VERSION_PATCH >= 4)
159: if (dba->dbp->cursor(dba->dbp, NULL, &dba->cursor, 0)) {
160: #else
161: if (dba->dbp->cursor(dba->dbp, NULL, &dba->cursor)) {
162: #endif
163: return NULL;
164: }
165:
166: /* we should introduce something like PARAM_PASSTHRU... */
167: return dba_nextkey_db2(info, newlen TSRMLS_CC);
168: }
169:
170: DBA_NEXTKEY_FUNC(db2)
171: {
172: DB2_DATA;
173: DBT gkey = {0}, gval = {0};
174:
175: if (dba->cursor->c_get(dba->cursor, &gkey, &gval, DB_NEXT)
176: || !gkey.data)
177: return NULL;
178:
179: if (newlen) *newlen = gkey.size;
180: return estrndup(gkey.data, gkey.size);
181: }
182:
183: DBA_OPTIMIZE_FUNC(db2)
184: {
185: return SUCCESS;
186: }
187:
188: DBA_SYNC_FUNC(db2)
189: {
190: DB2_DATA;
191:
192: return dba->dbp->sync(dba->dbp, 0) ? FAILURE : SUCCESS;
193: }
194:
195: DBA_INFO_FUNC(db2)
196: {
197: return estrdup(DB_VERSION_STRING);
198: }
199:
200: #endif
201:
202: /*
203: * Local variables:
204: * tab-width: 4
205: * c-basic-offset: 4
206: * End:
207: * vim600: sw=4 ts=4 fdm=marker
208: * vim<600: sw=4 ts=4
209: */