xref: /PHP-8.4/ext/dba/dba_inifile.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_INIFILE
24 #include "php_inifile.h"
25 
26 #include "libinifile/inifile.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(inifile)35 DBA_OPEN_FUNC(inifile)
36 {
37 	info->dbf = inifile_alloc(info->fp, info->mode == DBA_READER, info->flags&DBA_PERSISTENT);
38 
39 	return info->dbf ? SUCCESS : FAILURE;
40 }
41 
DBA_CLOSE_FUNC(inifile)42 DBA_CLOSE_FUNC(inifile)
43 {
44 	inifile *dba = info->dbf;
45 
46 	inifile_free(dba, info->flags&DBA_PERSISTENT);
47 }
48 
DBA_FETCH_FUNC(inifile)49 DBA_FETCH_FUNC(inifile)
50 {
51 	inifile *dba = info->dbf;
52 	val_type ini_val;
53 	key_type ini_key;
54 	zend_string *fetched_val = NULL;
55 
56 	if (!key) {
57 		php_error_docref(NULL, E_WARNING, "No key specified");
58 		return 0;
59 	}
60 	ini_key = inifile_key_split(ZSTR_VAL(key)); /* keylen not needed here */
61 
62 	ini_val = inifile_fetch(dba, &ini_key, skip);
63 	inifile_key_free(&ini_key);
64 	if (ini_val.value) {
65 		fetched_val = zend_string_init(ini_val.value, strlen(ini_val.value), /* persistent */ false);
66 		inifile_val_free(&ini_val);
67 	}
68 	return fetched_val;
69 }
70 
DBA_UPDATE_FUNC(inifile)71 DBA_UPDATE_FUNC(inifile)
72 {
73 	inifile *dba = info->dbf;
74 	val_type ini_val;
75 	int res;
76 	key_type ini_key;
77 
78 	if (!key) {
79 		php_error_docref(NULL, E_WARNING, "No key specified");
80 		return 0;
81 	}
82 	ini_key = inifile_key_split(ZSTR_VAL(key)); /* keylen not needed here */
83 
84 	ini_val.value = ZSTR_VAL(val);
85 
86 	if (mode == 1) {
87 		res = inifile_append(dba, &ini_key, &ini_val);
88 	} else {
89 		res = inifile_replace(dba, &ini_key, &ini_val);
90 	}
91 	inifile_key_free(&ini_key);
92 	switch(res) {
93 	case -1:
94 		// TODO Check when this happens and confirm this can even happen
95 		php_error_docref(NULL, E_WARNING, "Operation not possible");
96 		return FAILURE;
97 	default:
98 	case 0:
99 		return SUCCESS;
100 	case 1:
101 		return FAILURE;
102 	}
103 }
104 
DBA_EXISTS_FUNC(inifile)105 DBA_EXISTS_FUNC(inifile)
106 {
107 	inifile *dba = info->dbf;
108 	val_type ini_val;
109 	key_type ini_key;
110 
111 	if (!key) {
112 		php_error_docref(NULL, E_WARNING, "No key specified");
113 		return 0;
114 	}
115 	ini_key = inifile_key_split(ZSTR_VAL(key)); /* keylen not needed here */
116 
117 	ini_val = inifile_fetch(dba, &ini_key, 0);
118 	inifile_key_free(&ini_key);
119 	if (ini_val.value) {
120 		inifile_val_free(&ini_val);
121 		return SUCCESS;
122 	}
123 	return FAILURE;
124 }
125 
DBA_DELETE_FUNC(inifile)126 DBA_DELETE_FUNC(inifile)
127 {
128 	inifile *dba = info->dbf;
129 	int res;
130 	bool found = 0;
131 	key_type ini_key;
132 
133 	if (!key) {
134 		php_error_docref(NULL, E_WARNING, "No key specified");
135 		return 0;
136 	}
137 	ini_key = inifile_key_split(ZSTR_VAL(key)); /* keylen not needed here */
138 
139 	res =  inifile_delete_ex(dba, &ini_key, &found);
140 
141 	inifile_key_free(&ini_key);
142 	return (res == -1 || !found ? FAILURE : SUCCESS);
143 }
144 
DBA_FIRSTKEY_FUNC(inifile)145 DBA_FIRSTKEY_FUNC(inifile)
146 {
147 	inifile *dba = info->dbf;
148 
149 	if (inifile_firstkey(dba)) {
150 		char *result = inifile_key_string(&dba->curr.key);
151 		zend_string *key = zend_string_init(result, strlen(result), /* persistent */ false);
152 		efree(result);
153 		return key;
154 	} else {
155 		return NULL;
156 	}
157 }
158 
DBA_NEXTKEY_FUNC(inifile)159 DBA_NEXTKEY_FUNC(inifile)
160 {
161 	inifile *dba = info->dbf;
162 
163 	if (!dba->curr.key.group && !dba->curr.key.name) {
164 		return NULL;
165 	}
166 
167 	if (inifile_nextkey(dba)) {
168 		char *result = inifile_key_string(&dba->curr.key);
169 		zend_string *key = zend_string_init(result, strlen(result), /* persistent */ false);
170 		efree(result);
171 		return key;
172 	} else {
173 		return NULL;
174 	}
175 }
176 
DBA_OPTIMIZE_FUNC(inifile)177 DBA_OPTIMIZE_FUNC(inifile)
178 {
179 	/* dummy */
180 	return SUCCESS;
181 }
182 
DBA_SYNC_FUNC(inifile)183 DBA_SYNC_FUNC(inifile)
184 {
185 	/* dummy */
186 	return SUCCESS;
187 }
188 
DBA_INFO_FUNC(inifile)189 DBA_INFO_FUNC(inifile)
190 {
191 	return estrdup(inifile_version());
192 }
193 
194 #endif
195