xref: /PHP-8.4/ext/dba/dba_flatfile.c (revision 11accb5c)
1 /*
2    +----------------------------------------------------------------------+
3    | Copyright (c) The PHP Group                                          |
4    +----------------------------------------------------------------------+
5    | This source file is subject to version 3.01 of the PHP license,      |
6    | that is bundled with this package in the file LICENSE, and is        |
7    | available through the world-wide-web at the following url:           |
8    | https://www.php.net/license/3_01.txt                                 |
9    | If you did not receive a copy of the PHP license and are unable to   |
10    | obtain it through the world-wide-web, please send a note to          |
11    | license@php.net so we can mail you a copy immediately.               |
12    +----------------------------------------------------------------------+
13    | Author: Marcus Boerger <helly@php.net>                               |
14    +----------------------------------------------------------------------+
15  */
16 
17 #ifdef HAVE_CONFIG_H
18 #include <config.h>
19 #endif
20 
21 #include "php.h"
22 
23 #ifdef DBA_FLATFILE
24 #include "php_flatfile.h"
25 
26 #include "libflatfile/flatfile.h"
27 
28 #ifdef HAVE_UNISTD_H
29 #include <unistd.h>
30 #endif
31 #include <sys/types.h>
32 #include <sys/stat.h>
33 #include <fcntl.h>
34 
DBA_OPEN_FUNC(flatfile)35 DBA_OPEN_FUNC(flatfile)
36 {
37 	info->dbf = pemalloc(sizeof(flatfile), info->flags&DBA_PERSISTENT);
38 	memset(info->dbf, 0, sizeof(flatfile));
39 
40 	((flatfile*)info->dbf)->fp = info->fp;
41 
42 	return SUCCESS;
43 }
44 
DBA_CLOSE_FUNC(flatfile)45 DBA_CLOSE_FUNC(flatfile)
46 {
47 	flatfile *dba = info->dbf;
48 
49 	if (dba->nextkey.dptr) {
50 		efree(dba->nextkey.dptr);
51 	}
52 	pefree(dba, info->flags&DBA_PERSISTENT);
53 }
54 
DBA_FETCH_FUNC(flatfile)55 DBA_FETCH_FUNC(flatfile)
56 {
57 	flatfile *dba = info->dbf;
58 	datum gval;
59 	datum gkey;
60 	zend_string *fetched_val = NULL;
61 
62 	gkey.dptr = ZSTR_VAL(key);
63 	gkey.dsize = ZSTR_LEN(key);
64 
65 	gval = flatfile_fetch(dba, gkey);
66 	if (gval.dptr) {
67 		fetched_val = zend_string_init(gval.dptr, gval.dsize, /* persistent */ false);
68 		efree(gval.dptr);
69 	}
70 	return fetched_val;
71 }
72 
DBA_UPDATE_FUNC(flatfile)73 DBA_UPDATE_FUNC(flatfile)
74 {
75 	flatfile *dba = info->dbf;
76 	datum gval;
77 	datum gkey;
78 
79 	gkey.dptr = ZSTR_VAL(key);
80 	gkey.dsize = ZSTR_LEN(key);
81 	gval.dptr = ZSTR_VAL(val);
82 	gval.dsize = ZSTR_LEN(val);
83 
84 	switch(flatfile_store(dba, gkey, gval, mode==1 ? FLATFILE_INSERT : FLATFILE_REPLACE)) {
85 		case 0:
86 			return SUCCESS;
87 		case 1:
88 			return FAILURE;
89 		case -1:
90 			// TODO Check when this happens and confirm this can even happen
91 			php_error_docref(NULL, E_WARNING, "Operation not possible");
92 			return FAILURE;
93 		default:
94 			// TODO Convert this to an assertion failure
95 			php_error_docref(NULL, E_WARNING, "Unknown return value");
96 			return FAILURE;
97 	}
98 }
99 
DBA_EXISTS_FUNC(flatfile)100 DBA_EXISTS_FUNC(flatfile)
101 {
102 	flatfile *dba = info->dbf;
103 	datum gval;
104 	datum gkey;
105 
106 	gkey.dptr = ZSTR_VAL(key);
107 	gkey.dsize = ZSTR_LEN(key);
108 	gval = flatfile_fetch(dba, gkey);
109 	if (gval.dptr) {
110 		efree(gval.dptr);
111 		return SUCCESS;
112 	}
113 	return FAILURE;
114 }
115 
DBA_DELETE_FUNC(flatfile)116 DBA_DELETE_FUNC(flatfile)
117 {
118 	flatfile *dba = info->dbf;
119 	datum gkey;
120 
121 	gkey.dptr = ZSTR_VAL(key);
122 	gkey.dsize = ZSTR_LEN(key);
123 	return(flatfile_delete(dba, gkey) == -1 ? FAILURE : SUCCESS);
124 }
125 
DBA_FIRSTKEY_FUNC(flatfile)126 DBA_FIRSTKEY_FUNC(flatfile)
127 {
128 	flatfile *dba = info->dbf;
129 
130 	if (dba->nextkey.dptr) {
131 		efree(dba->nextkey.dptr);
132 	}
133 	dba->nextkey = flatfile_firstkey(dba);
134 	if (dba->nextkey.dptr) {
135 		return zend_string_init(dba->nextkey.dptr, dba->nextkey.dsize, /* persistent */ false);
136 	}
137 	return NULL;
138 }
139 
DBA_NEXTKEY_FUNC(flatfile)140 DBA_NEXTKEY_FUNC(flatfile)
141 {
142 	flatfile *dba = info->dbf;
143 
144 	if (!dba->nextkey.dptr) {
145 		return NULL;
146 	}
147 
148 	if (dba->nextkey.dptr) {
149 		efree(dba->nextkey.dptr);
150 	}
151 	dba->nextkey = flatfile_nextkey(dba);
152 	if (dba->nextkey.dptr) {
153 		return zend_string_init(dba->nextkey.dptr, dba->nextkey.dsize, /* persistent */ false);
154 	}
155 	return NULL;
156 }
157 
DBA_OPTIMIZE_FUNC(flatfile)158 DBA_OPTIMIZE_FUNC(flatfile)
159 {
160 	/* dummy */
161 	return SUCCESS;
162 }
163 
DBA_SYNC_FUNC(flatfile)164 DBA_SYNC_FUNC(flatfile)
165 {
166 	/* dummy */
167 	return SUCCESS;
168 }
169 
DBA_INFO_FUNC(flatfile)170 DBA_INFO_FUNC(flatfile)
171 {
172 	return estrdup(flatfile_version());
173 }
174 
175 #endif
176