#if HAVE_DBA
-#include "ext/standard/flock_compat.h"
#include "php_ini.h"
#include <stdio.h>
#include <fcntl.h>
#include "php_dba.h"
#include "ext/standard/info.h"
#include "ext/standard/php_string.h"
+#include "ext/standard/flock_compat.h"
#include "php_gdbm.h"
#include "php_ndbm.h"
case 'c':
modenr = DBA_CREAT;
lock_mode = (lock_flag & DBA_LOCK_CREAT) ? LOCK_EX : 0;
+ if (lock_mode) {
+ if (lock_dbf) {
+ /* the create/append check will be done on the lock
+ * when the lib opens the file it is already created
+ */
+ file_mode = "r+b"; /* read & write, seek 0 */
+ lock_file_mode = "a+b"; /* append */
+ } else {
+ file_mode = "a+b"; /* append */
+ lock_file_mode = "w+b"; /* create/truncate */
+ }
+ } else {
file_mode = "a+b";
- if (!lock_mode || !lock_dbf) {
- break;
}
- /* When we lock the db file it will be created before the handler
- * even tries to open it, hence we must change to truncate mode.
+ /* In case of the 'a+b' append mode, the handler is responsible
+ * to handle any rewind problems (see flatfile handler).
*/
+ break;
case 'n':
modenr = DBA_TRUNC;
lock_mode = (lock_flag & DBA_LOCK_TRUNC) ? LOCK_EX : 0;
file_mode = "w+b";
break;
default:
- modenr = 0;
- lock_mode = 0;
- file_mode = "";
+ php_error_docref2(NULL TSRMLS_CC, Z_STRVAL_PP(args[0]), Z_STRVAL_PP(args[1]), E_WARNING, "Illegal DBA mode");
+ FREENOW;
+ RETURN_FALSE;
+ }
+ if (!lock_file_mode) {
+ lock_file_mode = file_mode;
}
if (*pmode=='d' || *pmode=='l' || *pmode=='-') {
pmode++; /* done already - skip here */
lock_mode |= LOCK_NB; /* test =: non blocking */
}
}
- if (*pmode || !modenr) {
+ if (*pmode) {
php_error_docref2(NULL TSRMLS_CC, Z_STRVAL_PP(args[0]), Z_STRVAL_PP(args[1]), E_WARNING, "Illegal DBA mode");
FREENOW;
RETURN_FALSE;
if (!error && lock_mode) {
if (lock_dbf) {
info->lock.name = pestrdup(info->path, persistent);
- lock_file_mode = file_mode;
} else {
spprintf(&info->lock.name, 0, "%s.lck", info->path);
if (!strcmp(file_mode, "r")) {
FREENOW;
RETURN_FALSE;
}
- if (php_stream_cast(info->lock.fp, PHP_STREAM_AS_FD, (void*)&info->lock.fd, 1) == FAILURE) {
- dba_close(info TSRMLS_CC);
- /* stream operation already wrote an error message */
- FREENOW;
- RETURN_FALSE;
- }
if (php_flock(info->lock.fd, lock_mode)) {
error = "Unable to establish lock"; /* force failure exit */
}
DBA_OPEN_FUNC(flatfile)
{
+ int fd, flags;
+
+ if (info->mode != DBA_READER) {
+ if (SUCCESS != php_stream_cast(info->fp, PHP_STREAM_AS_FD, (void*)&fd, 1)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not cast stream");
+ return FAILURE;
+ }
+ flags = fcntl(fd, F_SETFL);
+ fcntl(fd, F_SETFL, flags & ~O_APPEND);
+ }
+
info->dbf = pemalloc(sizeof(flatfile), info->flags&DBA_PERSISTENT);
memset(info->dbf, 0, sizeof(flatfile));
{
FLATFILE_DATA;
- if (dba->nextkey.dptr)
+ if (dba->nextkey.dptr) {
efree(dba->nextkey.dptr);
+ }
pefree(dba, info->flags&DBA_PERSISTENT);
}
FLATFILE_GKEY;
gval = flatfile_fetch(dba, gkey TSRMLS_CC);
- if(gval.dptr) {
- if(newlen) *newlen = gval.dsize;
+ if (gval.dptr) {
+ if (newlen) {
+ *newlen = gval.dsize;
+ }
new = estrndup(gval.dptr, gval.dsize);
efree(gval.dptr);
}
FLATFILE_GKEY;
gval = flatfile_fetch(dba, gkey TSRMLS_CC);
- if(gval.dptr) {
+ if (gval.dptr) {
efree(gval.dptr);
return SUCCESS;
}
{
FLATFILE_DATA;
- if (dba->nextkey.dptr)
+ if (dba->nextkey.dptr) {
efree(dba->nextkey.dptr);
+ }
dba->nextkey = flatfile_firstkey(dba TSRMLS_CC);
- if(dba->nextkey.dptr) {
- if(newlen)
+ if (dba->nextkey.dptr) {
+ if (newlen) {
*newlen = dba->nextkey.dsize;
+ }
return estrndup(dba->nextkey.dptr, dba->nextkey.dsize);
}
return NULL;
{
FLATFILE_DATA;
- if(!dba->nextkey.dptr)
+ if (!dba->nextkey.dptr) {
return NULL;
+ }
- if (dba->nextkey.dptr)
+ if (dba->nextkey.dptr) {
efree(dba->nextkey.dptr);
+ }
dba->nextkey = flatfile_nextkey(dba TSRMLS_CC);
- if(dba->nextkey.dptr) {
- if(newlen)
+ if (dba->nextkey.dptr) {
+ if (newlen) {
*newlen = dba->nextkey.dsize;
+ }
return estrndup(dba->nextkey.dptr, dba->nextkey.dsize);
}
return NULL;