Skip to content

Commit d71d0cf

Browse files
committed
Use zend_string for DBA first/next key handlers
1 parent 96ff88e commit d71d0cf

15 files changed

+88
-122
lines changed

ext/dba/dba.c

+4-12
Original file line numberDiff line numberDiff line change
@@ -1020,8 +1020,6 @@ PHP_FUNCTION(dba_key_split)
10201020
/* {{{ Resets the internal key pointer and returns the first key */
10211021
PHP_FUNCTION(dba_firstkey)
10221022
{
1023-
char *fkey;
1024-
size_t len;
10251023
zval *id;
10261024
dba_info *info = NULL;
10271025

@@ -1031,12 +1029,10 @@ PHP_FUNCTION(dba_firstkey)
10311029

10321030
DBA_FETCH_RESOURCE(info, id);
10331031

1034-
fkey = info->hnd->firstkey(info, &len);
1032+
zend_string *fkey = info->hnd->firstkey(info);
10351033

10361034
if (fkey) {
1037-
RETVAL_STRINGL(fkey, len);
1038-
efree(fkey);
1039-
return;
1035+
RETURN_STR(fkey);
10401036
}
10411037

10421038
RETURN_FALSE;
@@ -1046,8 +1042,6 @@ PHP_FUNCTION(dba_firstkey)
10461042
/* {{{ Returns the next key */
10471043
PHP_FUNCTION(dba_nextkey)
10481044
{
1049-
char *nkey;
1050-
size_t len;
10511045
zval *id;
10521046
dba_info *info = NULL;
10531047

@@ -1057,12 +1051,10 @@ PHP_FUNCTION(dba_nextkey)
10571051

10581052
DBA_FETCH_RESOURCE(info, id);
10591053

1060-
nkey = info->hnd->nextkey(info, &len);
1054+
zend_string *nkey = info->hnd->nextkey(info);
10611055

10621056
if (nkey) {
1063-
RETVAL_STRINGL(nkey, len);
1064-
efree(nkey);
1065-
return;
1057+
RETURN_STR(nkey);
10661058
}
10671059

10681060
RETURN_FALSE;

ext/dba/dba_cdb.c

+10-12
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ DBA_FIRSTKEY_FUNC(cdb)
241241
CDB_INFO;
242242
uint32 klen, dlen;
243243
char buf[8];
244-
char *key;
244+
zend_string *key;
245245

246246
#if DBA_CDB_BUILTIN
247247
if (cdb->make)
@@ -262,13 +262,12 @@ DBA_FIRSTKEY_FUNC(cdb)
262262
uint32_unpack(buf, &klen);
263263
uint32_unpack(buf + 4, &dlen);
264264

265-
key = safe_emalloc(klen, 1, 1);
266-
if (cdb_file_read(cdb->file, key, klen) < klen) {
267-
efree(key);
265+
key = zend_string_alloc(klen, /* persistent */ false);
266+
if (cdb_file_read(cdb->file, ZSTR_VAL(key), klen) < klen) {
267+
zend_string_release_ex(key, /* persistent */ false);
268268
key = NULL;
269269
} else {
270-
key[klen] = '\0';
271-
if (newlen) *newlen = klen;
270+
ZSTR_VAL(key)[klen] = 0;
272271
}
273272

274273
/* header + klenlen + dlenlen + klen + dlen */
@@ -282,7 +281,7 @@ DBA_NEXTKEY_FUNC(cdb)
282281
CDB_INFO;
283282
uint32 klen, dlen;
284283
char buf[8];
285-
char *key;
284+
zend_string *key;
286285

287286
#if DBA_CDB_BUILTIN
288287
if (cdb->make)
@@ -294,13 +293,12 @@ DBA_NEXTKEY_FUNC(cdb)
294293
uint32_unpack(buf, &klen);
295294
uint32_unpack(buf + 4, &dlen);
296295

297-
key = safe_emalloc(klen, 1, 1);
298-
if (cdb_file_read(cdb->file, key, klen) < klen) {
299-
efree(key);
296+
key = zend_string_alloc(klen, /* persistent */ false);
297+
if (cdb_file_read(cdb->file, ZSTR_VAL(key), klen) < klen) {
298+
zend_string_release_ex(key, /* persistent */ false);
300299
key = NULL;
301300
} else {
302-
key[klen] = '\0';
303-
if (newlen) *newlen = klen;
301+
ZSTR_VAL(key)[klen] = 0;
304302
}
305303

306304
cdb->pos += 8 + klen + dlen;

ext/dba/dba_db1.c

+2-4
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,7 @@ DBA_FIRSTKEY_FUNC(db1)
146146
memset(&gval, 0, sizeof(gval));
147147

148148
if (dba->dbp->seq(dba->dbp, &gkey, &gval, R_FIRST) == RET_SUCCESS) {
149-
if (newlen) *newlen = gkey.size;
150-
return estrndup(gkey.data, gkey.size);
149+
return zend_string_init(gkey.data, gkey.size, /* persistent */ false);
151150
}
152151
return NULL;
153152
}
@@ -162,8 +161,7 @@ DBA_NEXTKEY_FUNC(db1)
162161
memset(&gval, 0, sizeof(gval));
163162

164163
if (dba->dbp->seq(dba->dbp, &gkey, &gval, R_NEXT) == RET_SUCCESS) {
165-
if (newlen) *newlen = gkey.size;
166-
return estrndup(gkey.data, gkey.size);
164+
return zend_string_init(gkey.data, gkey.size, /* persistent */ false);
167165
}
168166
return NULL;
169167
}

ext/dba/dba_db2.c

+4-5
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,7 @@ DBA_FIRSTKEY_FUNC(db2)
159159
return NULL;
160160
}
161161

162-
/* we should introduce something like PARAM_PASSTHRU... */
163-
return dba_nextkey_db2(info, newlen);
162+
return dba_nextkey_db2(info);
164163
}
165164

166165
DBA_NEXTKEY_FUNC(db2)
@@ -169,11 +168,11 @@ DBA_NEXTKEY_FUNC(db2)
169168
DBT gkey = {0}, gval = {0};
170169

171170
if (dba->cursor->c_get(dba->cursor, &gkey, &gval, DB_NEXT)
172-
|| !gkey.data)
171+
|| !gkey.data) {
173172
return NULL;
173+
}
174174

175-
if (newlen) *newlen = gkey.size;
176-
return estrndup(gkey.data, gkey.size);
175+
return zend_string_init(gkey.data, gkey.size, /* persistent */ false);
177176
}
178177

179178
DBA_OPTIMIZE_FUNC(db2)

ext/dba/dba_db3.c

+3-6
Original file line numberDiff line numberDiff line change
@@ -193,27 +193,24 @@ DBA_FIRSTKEY_FUNC(db3)
193193
return NULL;
194194
}
195195

196-
/* we should introduce something like PARAM_PASSTHRU... */
197-
return dba_nextkey_db3(info, newlen);
196+
return dba_nextkey_db3(info);
198197
}
199198

200199
DBA_NEXTKEY_FUNC(db3)
201200
{
202201
dba_db3_data *dba = info->dbf;
203202
DBT gkey, gval;
204-
char *nkey = NULL;
205203

206204
memset(&gkey, 0, sizeof(gkey));
207205
memset(&gval, 0, sizeof(gval));
208206

209207
if (dba->cursor->c_get(dba->cursor, &gkey, &gval, DB_NEXT) == 0) {
210208
if (gkey.data) {
211-
nkey = estrndup(gkey.data, gkey.size);
212-
if (newlen) *newlen = gkey.size;
209+
return zend_string_init(gkey.data, gkey.size, /* persistent */ false);
213210
}
214211
}
215212

216-
return nkey;
213+
return NULL;
217214
}
218215

219216
DBA_OPTIMIZE_FUNC(db3)

ext/dba/dba_db4.c

+4-6
Original file line numberDiff line numberDiff line change
@@ -237,15 +237,14 @@ DBA_FIRSTKEY_FUNC(db4)
237237
return NULL;
238238
}
239239

240-
/* we should introduce something like PARAM_PASSTHRU... */
241-
return dba_nextkey_db4(info, newlen);
240+
return dba_nextkey_db4(info);
242241
}
243242

244243
DBA_NEXTKEY_FUNC(db4)
245244
{
246245
dba_db4_data *dba = info->dbf;
247246
DBT gkey, gval;
248-
char *nkey = NULL;
247+
zend_string *key = NULL;
249248

250249
memset(&gkey, 0, sizeof(gkey));
251250
memset(&gval, 0, sizeof(gval));
@@ -256,8 +255,7 @@ DBA_NEXTKEY_FUNC(db4)
256255
}
257256
if (dba->cursor && dba->cursor->c_get(dba->cursor, &gkey, &gval, DB_NEXT) == 0) {
258257
if (gkey.data) {
259-
nkey = estrndup(gkey.data, gkey.size);
260-
if (newlen) *newlen = gkey.size;
258+
key = zend_string_init(gkey.data, gkey.size, /* persistent */ false);
261259
}
262260
if (info->flags & DBA_PERSISTENT) {
263261
if (gkey.data) {
@@ -269,7 +267,7 @@ DBA_NEXTKEY_FUNC(db4)
269267
}
270268
}
271269

272-
return nkey;
270+
return key;
273271
}
274272

275273
DBA_OPTIMIZE_FUNC(db4)

ext/dba/dba_dbm.c

+12-12
Original file line numberDiff line numberDiff line change
@@ -145,34 +145,34 @@ DBA_FIRSTKEY_FUNC(dbm)
145145
{
146146
dba_dbm_data *dba = info->dbf;
147147
datum gkey;
148-
char *key = NULL;
148+
zend_string *key = NULL;
149149

150150
gkey = firstkey();
151-
if(gkey.dptr) {
152-
if(newlen) *newlen = gkey.dsize;
153-
key = estrndup(gkey.dptr, gkey.dsize);
151+
if (gkey.dptr) {
152+
key = zend_string_init(gkey.dptr, gkey.dsize, /* persistent */ false);
154153
dba->nextkey = gkey;
155-
} else
154+
} else {
156155
dba->nextkey.dptr = NULL;
156+
}
157157
return key;
158158
}
159159

160160
DBA_NEXTKEY_FUNC(dbm)
161161
{
162162
dba_dbm_data *dba = info->dbf;
163163
datum gkey;
164-
char *nkey = NULL;
164+
zend_string *key = NULL;
165165

166-
if(!dba->nextkey.dptr) return NULL;
166+
if (!dba->nextkey.dptr) { return NULL; }
167167

168168
gkey = nextkey(dba->nextkey);
169-
if(gkey.dptr) {
170-
if(newlen) *newlen = gkey.dsize;
171-
nkey = estrndup(gkey.dptr, gkey.dsize);
169+
if (gkey.dptr) {
170+
key = zend_string_init(gkey.dptr, gkey.dsize, /* persistent */ false);
172171
dba->nextkey = gkey;
173-
} else
172+
} else {
174173
dba->nextkey.dptr = NULL;
175-
return nkey;
174+
}
175+
return key;
176176
}
177177

178178
DBA_OPTIMIZE_FUNC(dbm)

ext/dba/dba_flatfile.c

+2-8
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,7 @@ DBA_FIRSTKEY_FUNC(flatfile)
132132
}
133133
dba->nextkey = flatfile_firstkey(dba);
134134
if (dba->nextkey.dptr) {
135-
if (newlen) {
136-
*newlen = dba->nextkey.dsize;
137-
}
138-
return estrndup(dba->nextkey.dptr, dba->nextkey.dsize);
135+
return zend_string_init(dba->nextkey.dptr, dba->nextkey.dsize, /* persistent */ false);
139136
}
140137
return NULL;
141138
}
@@ -153,10 +150,7 @@ DBA_NEXTKEY_FUNC(flatfile)
153150
}
154151
dba->nextkey = flatfile_nextkey(dba);
155152
if (dba->nextkey.dptr) {
156-
if (newlen) {
157-
*newlen = dba->nextkey.dsize;
158-
}
159-
return estrndup(dba->nextkey.dptr, dba->nextkey.dsize);
153+
return zend_string_init(dba->nextkey.dptr, dba->nextkey.dsize, /* persistent */ false);
160154
}
161155
return NULL;
162156
}

ext/dba/dba_gdbm.c

+9-11
Original file line numberDiff line numberDiff line change
@@ -138,16 +138,15 @@ DBA_FIRSTKEY_FUNC(gdbm)
138138
{
139139
dba_gdbm_data *dba = info->dbf;
140140
datum gkey;
141-
char *key = NULL;
141+
zend_string *key = NULL;
142142

143-
if(dba->nextkey.dptr) {
143+
if (dba->nextkey.dptr) {
144144
free(dba->nextkey.dptr);
145145
}
146146

147147
gkey = gdbm_firstkey(dba->dbf);
148-
if(gkey.dptr) {
149-
key = estrndup(gkey.dptr, gkey.dsize);
150-
if(newlen) *newlen = gkey.dsize;
148+
if (gkey.dptr) {
149+
key = zend_string_init(gkey.dptr, gkey.dsize, /* persistent */ false);
151150
dba->nextkey = gkey;
152151
} else {
153152
dba->nextkey.dptr = NULL;
@@ -158,21 +157,20 @@ DBA_FIRSTKEY_FUNC(gdbm)
158157
DBA_NEXTKEY_FUNC(gdbm)
159158
{
160159
dba_gdbm_data *dba = info->dbf;
161-
char *nkey = NULL;
160+
zend_string *key = NULL;
162161
datum gkey;
163162

164-
if(!dba->nextkey.dptr) return NULL;
163+
if(!dba->nextkey.dptr) { return NULL; }
165164

166165
gkey = gdbm_nextkey(dba->dbf, dba->nextkey);
167166
free(dba->nextkey.dptr);
168-
if(gkey.dptr) {
169-
nkey = estrndup(gkey.dptr, gkey.dsize);
170-
if(newlen) *newlen = gkey.dsize;
167+
if (gkey.dptr) {
168+
key = zend_string_init(gkey.dptr, gkey.dsize, /* persistent */ false);
171169
dba->nextkey = gkey;
172170
} else {
173171
dba->nextkey.dptr = NULL;
174172
}
175-
return nkey;
173+
return key;
176174
}
177175

178176
DBA_OPTIMIZE_FUNC(gdbm)

ext/dba/dba_inifile.c

+6-4
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,9 @@ DBA_FIRSTKEY_FUNC(inifile)
148148

149149
if (inifile_firstkey(dba)) {
150150
char *result = inifile_key_string(&dba->curr.key);
151-
*newlen = strlen(result);
152-
return result;
151+
zend_string *key = zend_string_init(result, strlen(result), /* persistent */ false);
152+
efree(result);
153+
return key;
153154
} else {
154155
return NULL;
155156
}
@@ -165,8 +166,9 @@ DBA_NEXTKEY_FUNC(inifile)
165166

166167
if (inifile_nextkey(dba)) {
167168
char *result = inifile_key_string(&dba->curr.key);
168-
*newlen = strlen(result);
169-
return result;
169+
zend_string *key = zend_string_init(result, strlen(result), /* persistent */ false);
170+
efree(result);
171+
return key;
170172
} else {
171173
return NULL;
172174
}

ext/dba/dba_lmdb.c

+6-8
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ DBA_FIRSTKEY_FUNC(lmdb)
250250
{
251251
int rc;
252252
MDB_val k, v;
253-
char *ret = NULL;
253+
zend_string *ret = NULL;
254254

255255
rc = mdb_txn_begin(LMDB_IT(env), NULL, MDB_RDONLY, &LMDB_IT(txn));
256256
if (rc) {
@@ -276,9 +276,8 @@ DBA_FIRSTKEY_FUNC(lmdb)
276276
return NULL;
277277
}
278278

279-
if(k.mv_data) {
280-
if(newlen) *newlen = k.mv_size;
281-
ret = estrndup(k.mv_data, k.mv_size);
279+
if (k.mv_data) {
280+
ret = zend_string_init(k.mv_data, k.mv_size, /* persistent */ false);
282281
}
283282

284283
mdb_txn_reset(LMDB_IT(txn));
@@ -290,7 +289,7 @@ DBA_NEXTKEY_FUNC(lmdb)
290289
{
291290
int rc;
292291
MDB_val k, v;
293-
char *ret = NULL;
292+
zend_string *ret = NULL;
294293

295294
rc = mdb_txn_renew(LMDB_IT(txn));
296295
if (rc) {
@@ -309,9 +308,8 @@ DBA_NEXTKEY_FUNC(lmdb)
309308
return NULL;
310309
}
311310

312-
if(k.mv_data) {
313-
if(newlen) *newlen = k.mv_size;
314-
ret = estrndup(k.mv_data, k.mv_size);
311+
if (k.mv_data) {
312+
ret = zend_string_init(k.mv_data, k.mv_size, /* persistent */ false);
315313
}
316314

317315
mdb_txn_reset(LMDB_IT(txn));

0 commit comments

Comments
 (0)