Annotation of embedaddon/php/ext/dba/libflatfile/flatfile.c, revision 1.1.1.1
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | PHP Version 5 |
4: +----------------------------------------------------------------------+
5: | Copyright (c) 1997-2010 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: | Authors: Marcus Boerger <helly@php.net> |
16: | based on ext/db/db.c by: |
17: | Rasmus Lerdorf <rasmus@php.net> |
18: | Jim Winstead <jimw@php.net> |
19: +----------------------------------------------------------------------+
20: */
21:
22: /* $Id: flatfile.c 306527 2010-12-20 23:00:11Z iliaa $ */
23:
24: #ifdef HAVE_CONFIG_H
25: #include "config.h"
26: #endif
27:
28: #include "php.h"
29: #include "php_globals.h"
30: #include "safe_mode.h"
31:
32: #include <stdlib.h>
33: #include <string.h>
34: #include <errno.h>
35: #if HAVE_UNISTD_H
36: #include <unistd.h>
37: #endif
38:
39: #include "flatfile.h"
40:
41: #define FLATFILE_BLOCK_SIZE 1024
42:
43: /*
44: * ret = -1 means that database was opened for read-only
45: * ret = 0 success
46: * ret = 1 key already exists - nothing done
47: */
48:
49: /* {{{ flatfile_store
50: */
51: int flatfile_store(flatfile *dba, datum key_datum, datum value_datum, int mode TSRMLS_DC) {
52: if (mode == FLATFILE_INSERT) {
53: if (flatfile_findkey(dba, key_datum TSRMLS_CC)) {
54: return 1;
55: }
56: php_stream_seek(dba->fp, 0L, SEEK_END);
57: php_stream_printf(dba->fp TSRMLS_CC, "%zu\n", key_datum.dsize);
58: php_stream_flush(dba->fp);
59: if (php_stream_write(dba->fp, key_datum.dptr, key_datum.dsize) < key_datum.dsize) {
60: return -1;
61: }
62: php_stream_printf(dba->fp TSRMLS_CC, "%zu\n", value_datum.dsize);
63: php_stream_flush(dba->fp);
64: if (php_stream_write(dba->fp, value_datum.dptr, value_datum.dsize) < value_datum.dsize) {
65: return -1;
66: }
67: } else { /* FLATFILE_REPLACE */
68: flatfile_delete(dba, key_datum TSRMLS_CC);
69: php_stream_printf(dba->fp TSRMLS_CC, "%zu\n", key_datum.dsize);
70: php_stream_flush(dba->fp);
71: if (php_stream_write(dba->fp, key_datum.dptr, key_datum.dsize) < key_datum.dsize) {
72: return -1;
73: }
74: php_stream_printf(dba->fp TSRMLS_CC, "%zu\n", value_datum.dsize);
75: if (php_stream_write(dba->fp, value_datum.dptr, value_datum.dsize) < value_datum.dsize) {
76: return -1;
77: }
78: }
79:
80: php_stream_flush(dba->fp);
81: return 0;
82: }
83: /* }}} */
84:
85: /* {{{ flatfile_fetch
86: */
87: datum flatfile_fetch(flatfile *dba, datum key_datum TSRMLS_DC) {
88: datum value_datum = {NULL, 0};
89: char buf[16];
90:
91: if (flatfile_findkey(dba, key_datum TSRMLS_CC)) {
92: if (php_stream_gets(dba->fp, buf, sizeof(buf))) {
93: value_datum.dsize = atoi(buf);
94: value_datum.dptr = safe_emalloc(value_datum.dsize, 1, 1);
95: value_datum.dsize = php_stream_read(dba->fp, value_datum.dptr, value_datum.dsize);
96: } else {
97: value_datum.dptr = NULL;
98: value_datum.dsize = 0;
99: }
100: }
101: return value_datum;
102: }
103: /* }}} */
104:
105: /* {{{ flatfile_delete
106: */
107: int flatfile_delete(flatfile *dba, datum key_datum TSRMLS_DC) {
108: char *key = key_datum.dptr;
109: size_t size = key_datum.dsize;
110: size_t buf_size = FLATFILE_BLOCK_SIZE;
111: char *buf = emalloc(buf_size);
112: size_t num;
113: size_t pos;
114:
115: php_stream_rewind(dba->fp);
116: while(!php_stream_eof(dba->fp)) {
117: /* read in the length of the key name */
118: if (!php_stream_gets(dba->fp, buf, 15)) {
119: break;
120: }
121: num = atoi(buf);
122: if (num >= buf_size) {
123: buf_size = num + FLATFILE_BLOCK_SIZE;
124: buf = erealloc(buf, buf_size);
125: }
126: pos = php_stream_tell(dba->fp);
127:
128: /* read in the key name */
129: num = php_stream_read(dba->fp, buf, num);
130: if (num < 0) {
131: break;
132: }
133:
134: if (size == num && !memcmp(buf, key, size)) {
135: php_stream_seek(dba->fp, pos, SEEK_SET);
136: php_stream_putc(dba->fp, 0);
137: php_stream_flush(dba->fp);
138: php_stream_seek(dba->fp, 0L, SEEK_END);
139: efree(buf);
140: return SUCCESS;
141: }
142:
143: /* read in the length of the value */
144: if (!php_stream_gets(dba->fp, buf, 15)) {
145: break;
146: }
147: num = atoi(buf);
148: if (num >= buf_size) {
149: buf_size = num + FLATFILE_BLOCK_SIZE;
150: buf = erealloc(buf, buf_size);
151: }
152: /* read in the value */
153: num = php_stream_read(dba->fp, buf, num);
154: if (num < 0) {
155: break;
156: }
157: }
158: efree(buf);
159: return FAILURE;
160: }
161: /* }}} */
162:
163: /* {{{ flatfile_findkey
164: */
165: int flatfile_findkey(flatfile *dba, datum key_datum TSRMLS_DC) {
166: size_t buf_size = FLATFILE_BLOCK_SIZE;
167: char *buf = emalloc(buf_size);
168: size_t num;
169: int ret=0;
170: void *key = key_datum.dptr;
171: size_t size = key_datum.dsize;
172:
173: php_stream_rewind(dba->fp);
174: while (!php_stream_eof(dba->fp)) {
175: if (!php_stream_gets(dba->fp, buf, 15)) {
176: break;
177: }
178: num = atoi(buf);
179: if (num >= buf_size) {
180: buf_size = num + FLATFILE_BLOCK_SIZE;
181: buf = erealloc(buf, buf_size);
182: }
183: num = php_stream_read(dba->fp, buf, num);
184: if (num < 0) {
185: break;
186: }
187: if (size == num) {
188: if (!memcmp(buf, key, size)) {
189: ret = 1;
190: break;
191: }
192: }
193: if (!php_stream_gets(dba->fp, buf, 15)) {
194: break;
195: }
196: num = atoi(buf);
197: if (num >= buf_size) {
198: buf_size = num + FLATFILE_BLOCK_SIZE;
199: buf = erealloc(buf, buf_size);
200: }
201: num = php_stream_read(dba->fp, buf, num);
202: if (num < 0) {
203: break;
204: }
205: }
206: efree(buf);
207: return ret;
208: }
209: /* }}} */
210:
211: /* {{{ flatfile_firstkey
212: */
213: datum flatfile_firstkey(flatfile *dba TSRMLS_DC) {
214: datum res;
215: size_t num;
216: size_t buf_size = FLATFILE_BLOCK_SIZE;
217: char *buf = emalloc(buf_size);
218:
219: php_stream_rewind(dba->fp);
220: while(!php_stream_eof(dba->fp)) {
221: if (!php_stream_gets(dba->fp, buf, 15)) {
222: break;
223: }
224: num = atoi(buf);
225: if (num >= buf_size) {
226: buf_size = num + FLATFILE_BLOCK_SIZE;
227: buf = erealloc(buf, buf_size);
228: }
229: num = php_stream_read(dba->fp, buf, num);
230: if (num < 0) {
231: break;
232: }
233: if (*(buf) != 0) {
234: dba->CurrentFlatFilePos = php_stream_tell(dba->fp);
235: res.dptr = buf;
236: res.dsize = num;
237: return res;
238: }
239: if (!php_stream_gets(dba->fp, buf, 15)) {
240: break;
241: }
242: num = atoi(buf);
243: if (num >= buf_size) {
244: buf_size = num + FLATFILE_BLOCK_SIZE;
245: buf = erealloc(buf, buf_size);
246: }
247: num = php_stream_read(dba->fp, buf, num);
248: if (num < 0) {
249: break;
250: }
251: }
252: efree(buf);
253: res.dptr = NULL;
254: res.dsize = 0;
255: return res;
256: }
257: /* }}} */
258:
259: /* {{{ flatfile_nextkey
260: */
261: datum flatfile_nextkey(flatfile *dba TSRMLS_DC) {
262: datum res;
263: size_t num;
264: size_t buf_size = FLATFILE_BLOCK_SIZE;
265: char *buf = emalloc(buf_size);
266:
267: php_stream_seek(dba->fp, dba->CurrentFlatFilePos, SEEK_SET);
268: while(!php_stream_eof(dba->fp)) {
269: if (!php_stream_gets(dba->fp, buf, 15)) {
270: break;
271: }
272: num = atoi(buf);
273: if (num >= buf_size) {
274: buf_size = num + FLATFILE_BLOCK_SIZE;
275: buf = erealloc(buf, buf_size);
276: }
277: num = php_stream_read(dba->fp, buf, num);
278: if (num < 0) {
279: break;
280: }
281: if (!php_stream_gets(dba->fp, buf, 15)) {
282: break;
283: }
284: num = atoi(buf);
285: if (num >= buf_size) {
286: buf_size = num + FLATFILE_BLOCK_SIZE;
287: buf = erealloc(buf, buf_size);
288: }
289: num = php_stream_read(dba->fp, buf, num);
290: if (num < 0) {
291: break;
292: }
293: if (*(buf)!=0) {
294: dba->CurrentFlatFilePos = php_stream_tell(dba->fp);
295: res.dptr = buf;
296: res.dsize = num;
297: return res;
298: }
299: }
300: efree(buf);
301: res.dptr = NULL;
302: res.dsize = 0;
303: return res;
304: }
305: /* }}} */
306:
307: /* {{{ flatfile_version */
308: char *flatfile_version()
309: {
310: return "1.0, $Revision: 306527 $";
311: }
312: /* }}} */
313:
314: /*
315: * Local variables:
316: * tab-width: 4
317: * c-basic-offset: 4
318: * End:
319: * vim600: sw=4 ts=4 fdm=marker
320: * vim<600: sw=4 ts=4
321: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>