helly           Sun Nov 10 11:03:18 2002 EDT

  Modified files:              
    /php4/ext/dba       dba.c 
  Log:
  finish work on locking
  -all but gdbm do internal locking now since only gdbm has internal locking
  -you can force locking on database or lck file (with gdbm this makes no
   sense so a notice is generated)
  
  
Index: php4/ext/dba/dba.c
diff -u php4/ext/dba/dba.c:1.56 php4/ext/dba/dba.c:1.57
--- php4/ext/dba/dba.c:1.56     Thu Nov  7 20:03:53 2002
+++ php4/ext/dba/dba.c  Sun Nov 10 11:03:17 2002
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: dba.c,v 1.56 2002/11/08 01:03:53 helly Exp $ */
+/* $Id: dba.c,v 1.57 2002/11/10 16:03:17 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -174,28 +174,28 @@
 
 static dba_handler handler[] = {
 #if DBA_GDBM
-       DBA_HND(gdbm, DBA_LOCK_EXT)
+       DBA_HND(gdbm, DBA_LOCK_EXT) /* Locking done in library if set */
 #endif
 #if DBA_DBM
-       DBA_HND(dbm, DBA_LOCK_EXT)
+       DBA_HND(dbm, DBA_LOCK_ALL) /* No lock in lib */
 #endif
 #if DBA_NDBM
-       DBA_HND(ndbm, DBA_LOCK_EXT)
+       DBA_HND(ndbm, DBA_LOCK_ALL) /* Could be done in library: filemode = 0644 + 
+S_ENFMT */
 #endif
 #if DBA_CDB
-       DBA_HND(cdb, DBA_LOCK_ALL)
+       DBA_HND(cdb, DBA_LOCK_ALL) /* No lock in lib */
 #endif
 #if DBA_CDB_BUILTIN
-    DBA_NAMED_HND(cdb_make, cdb, DBA_LOCK_ALL)
+    DBA_NAMED_HND(cdb_make, cdb, DBA_LOCK_ALL) /* No lock in lib */
 #endif
 #if DBA_DB2
-       DBA_HND(db2, DBA_LOCK_EXT)
+       DBA_HND(db2, DBA_LOCK_ALL) /* No lock in lib */
 #endif
 #if DBA_DB3
-       DBA_HND(db3, DBA_LOCK_EXT)
+       DBA_HND(db3, DBA_LOCK_ALL) /* No lock in lib */
 #endif
 #if DBA_FLATFILE
-       DBA_HND(flatfile, DBA_LOCK_ALL)
+       DBA_HND(flatfile, DBA_LOCK_ALL) /* No lock in lib */
 #endif
        { NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
 };
@@ -312,7 +312,7 @@
        char *key = NULL, *error = NULL;
        int keylen = 0;
        int i;
-       int lock;
+       int lock, lock_flag, lock_dbf = 0;
        char mode[4], *pmode;
        
        if(ac < 3) {
@@ -367,34 +367,57 @@
                RETURN_FALSE;
        }
 
+       /* Check mode: [rwnc][fl]?t?
+        * r: Read
+        * w: Write
+        * n: Create/Truncate
+        * c: Create
+        *
+        * d: force lock on database file
+        * l: force lock on lck file
+        *
+        * t: test open database, warning if locked
+        */
        strlcpy(mode, Z_STRVAL_PP(args[1]), sizeof(mode));
        pmode = &mode[0];
+       if (pmode[0] && (pmode[1]=='d' || pmode[1]=='l')) { /* force lock on db file 
+or lck file */
+               if (pmode[1]=='d') {
+                       if ((hptr->lock & DBA_LOCK_ALL) == 0) {
+                               php_error_docref2(NULL TSRMLS_CC, 
+Z_STRVAL_PP(args[0]), Z_STRVAL_PP(args[1]), E_NOTICE, "Handler %s does locking 
+internally", hptr->name);
+                       }
+                       lock_dbf = 1;
+               }
+               lock_flag = DBA_LOCK_ALL;
+       } else {
+               lock_flag = hptr->lock;
+       }
        switch (*pmode++) {
                case 'r': 
                        modenr = DBA_READER; 
-                       lock = (hptr->lock & DBA_LOCK_READER) ? LOCK_SH : 0;
+                       lock = (lock_flag & DBA_LOCK_READER) ? LOCK_SH : 0;
                        break;
                case 'w': 
                        modenr = DBA_WRITER; 
-                       lock = (hptr->lock & DBA_LOCK_WRITER) ? LOCK_EX : 0;
+                       lock = (lock_flag & DBA_LOCK_WRITER) ? LOCK_EX : 0;
                        break;
                case 'n':
                        modenr = DBA_TRUNC;
-                       lock = (hptr->lock & DBA_LOCK_TRUNC) ? LOCK_EX : 0;
+                       lock = (lock_flag & DBA_LOCK_TRUNC) ? LOCK_EX : 0;
                        break;
                case 'c': 
                        modenr = DBA_CREAT; 
-                       lock = (hptr->lock & DBA_LOCK_CREAT) ? LOCK_EX : 0;
+                       lock = (lock_flag & DBA_LOCK_CREAT) ? LOCK_EX : 0;
                        break;
                default:
                        lock = 0;
                        modenr = 0;
        }
+       if (*pmode=='d' || *pmode=='l') {
+               pmode++; /* done already - skip here */
+       }
        if (*pmode=='t') {
                pmode++;
                lock |= LOCK_NB; /* test =: non blocking */
-       } else if (*pmode=='b') {
-               pmode++; /* default is blocking */
        }
        if (*pmode || !modenr) {
                php_error_docref2(NULL TSRMLS_CC, Z_STRVAL_PP(args[0]), 
Z_STRVAL_PP(args[1]), E_WARNING, "Illegal DBA mode");
@@ -410,7 +433,10 @@
        info->argv = args + 3;
 
        if (lock) {
-               spprintf(&info->lock.name, 0, "%s.lck", info->path);
+               if (lock_dbf)
+                       info->lock.name = estrdup(info->path);
+               else
+                       spprintf(&info->lock.name, 0, "%s.lck", info->path);
                info->lock.fp = php_stream_open_wrapper(info->lock.name, "a+b", 
STREAM_MUST_SEEK|IGNORE_PATH|ENFORCE_SAFE_MODE, NULL);
                if (info->lock.fp && php_stream_cast(info->lock.fp, PHP_STREAM_AS_FD, 
(void*)&info->lock.fd, 1) == FAILURE)     {
                        dba_close(info TSRMLS_CC);



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to