xref: /PHP-5.6/ext/dba/dba_tcadb.c (revision 49493a2d)
1 /*
2    +----------------------------------------------------------------------+
3    | PHP Version 5                                                        |
4    +----------------------------------------------------------------------+
5    | Copyright (c) 1997-2016 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:  Michael Maclean <mgdm@php.net>                              |
16    +----------------------------------------------------------------------+
17  */
18 
19 /* $Id$ */
20 
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24 
25 #include "php.h"
26 
27 #if DBA_TCADB
28 #include "php_tcadb.h"
29 
30 #ifdef TCADB_INCLUDE_FILE
31 #include TCADB_INCLUDE_FILE
32 #endif
33 
34 #define TCADB_DATA dba_tcadb_data *dba = info->dbf
35 
36 typedef struct {
37 	TCADB *tcadb;
38 } dba_tcadb_data;
39 
DBA_OPEN_FUNC(tcadb)40 DBA_OPEN_FUNC(tcadb)
41 {
42 	char *path_string;
43 	TCADB *tcadb = tcadbnew();
44 
45 	if (tcadb) {
46 		switch(info->mode) {
47 			case DBA_READER:
48 				spprintf(&path_string, 0, "%s#mode=r", info->path);
49 				break;
50 			case DBA_WRITER:
51 				spprintf(&path_string, 0, "%s#mode=w", info->path);
52 				break;
53 			case DBA_CREAT:
54 				spprintf(&path_string, 0, "%s#mode=wc", info->path);
55 				break;
56 			case DBA_TRUNC:
57 				spprintf(&path_string, 0, "%s#mode=wct", info->path);
58 				break;
59 			default:
60 				tcadbdel(tcadb);
61 				return FAILURE;
62 		}
63 
64 		if (!tcadbopen(tcadb, path_string)) {
65 			efree(path_string);
66 			tcadbdel(tcadb);
67 			return FAILURE;
68 		}
69 
70 		efree(path_string);
71 
72 		info->dbf = pemalloc(sizeof(dba_tcadb_data), info->flags & DBA_PERSISTENT);
73 		memset(info->dbf, 0, sizeof(dba_tcadb_data));
74 		((dba_tcadb_data *) info->dbf)->tcadb = tcadb;
75 		return SUCCESS;
76 	}
77 
78 	return FAILURE;
79 }
80 
DBA_CLOSE_FUNC(tcadb)81 DBA_CLOSE_FUNC(tcadb)
82 {
83 	TCADB_DATA;
84 
85 	tcadbclose(dba->tcadb);
86 	pefree(dba, info->flags & DBA_PERSISTENT);
87 }
88 
DBA_FETCH_FUNC(tcadb)89 DBA_FETCH_FUNC(tcadb)
90 {
91 	TCADB_DATA;
92 	char *value, *new = NULL;
93 	int value_size;
94 
95 	value = tcadbget(dba->tcadb, key, keylen, &value_size);
96 	if (value) {
97 		if (newlen) {
98 			*newlen = value_size;
99 		}
100 		new = estrndup(value, value_size);
101 		tcfree(value);
102 	}
103 
104 	return new;
105 }
106 
DBA_UPDATE_FUNC(tcadb)107 DBA_UPDATE_FUNC(tcadb)
108 {
109 	TCADB_DATA;
110 	int result;
111 
112 	if (mode == 1) {
113 		/* Insert */
114 		if (tcadbvsiz(dba->tcadb, key, keylen) > -1) {
115 			return FAILURE;
116 		}
117 	}
118 
119 	result = tcadbput(dba->tcadb, key, keylen, val, vallen);
120 
121 	if (result) {
122 		return SUCCESS;
123 	}
124 
125 	php_error_docref2(NULL TSRMLS_CC, key, val, E_WARNING, "Error updating data");
126 	return FAILURE;
127 }
128 
DBA_EXISTS_FUNC(tcadb)129 DBA_EXISTS_FUNC(tcadb)
130 {
131 	TCADB_DATA;
132 	char *value;
133 	int value_len;
134 
135 	value = tcadbget(dba->tcadb, key, keylen, &value_len);
136 	if (value) {
137 		tcfree(value);
138 		return SUCCESS;
139 	}
140 
141 	return FAILURE;
142 }
143 
DBA_DELETE_FUNC(tcadb)144 DBA_DELETE_FUNC(tcadb)
145 {
146 	TCADB_DATA;
147 
148 	return tcadbout(dba->tcadb, key, keylen) ? SUCCESS : FAILURE;
149 }
150 
DBA_FIRSTKEY_FUNC(tcadb)151 DBA_FIRSTKEY_FUNC(tcadb)
152 {
153 	TCADB_DATA;
154 	int value_size;
155 	char *value, *new = NULL;
156 
157 	tcadbiterinit(dba->tcadb);
158 
159 	value = tcadbiternext(dba->tcadb, &value_size);
160 	if (value) {
161 		if (newlen) {
162 			*newlen = value_size;
163 		}
164 		new = estrndup(value, value_size);
165 		tcfree(value);
166 	}
167 
168 	return new;
169 }
170 
DBA_NEXTKEY_FUNC(tcadb)171 DBA_NEXTKEY_FUNC(tcadb)
172 {
173 	TCADB_DATA;
174 	int value_size;
175 	char *value, *new = NULL;
176 
177 	value = tcadbiternext(dba->tcadb, &value_size);
178 	if (value) {
179 		if (newlen) {
180 			*newlen = value_size;
181 		}
182 		new = estrndup(value, value_size);
183 		tcfree(value);
184 	}
185 
186 	return new;
187 }
188 
DBA_OPTIMIZE_FUNC(tcadb)189 DBA_OPTIMIZE_FUNC(tcadb)
190 {
191 	TCADB_DATA;
192 
193 #if _TC_LIBVER >= 811
194 	return tcadboptimize(dba->tcadb, NULL) ? SUCCESS : FAILURE;
195 #else
196 	return FAILURE;
197 #endif
198 }
199 
DBA_SYNC_FUNC(tcadb)200 DBA_SYNC_FUNC(tcadb)
201 {
202 	TCADB_DATA;
203 
204 	return tcadbsync(dba->tcadb) ? SUCCESS : FAILURE;
205 }
206 
DBA_INFO_FUNC(tcadb)207 DBA_INFO_FUNC(tcadb)
208 {
209 	return estrdup(tcversion);
210 }
211 
212 #endif
213 
214 /*
215  * Local variables:
216  * tab-width: 4
217  * c-basic-offset: 4
218  * End:
219  * vim600: sw=4 ts=4 fdm=marker
220  * vim<600: sw=4 ts=4
221  */
222