]> granicus.if.org Git - php/commitdiff
Fixed bug #51086 (DBA DB4 doesn't work with Berkeley DB 4.8)
authorChristopher Jones <sixd@php.net>
Fri, 5 Mar 2010 06:45:28 +0000 (06:45 +0000)
committerChristopher Jones <sixd@php.net>
Fri, 5 Mar 2010 06:45:28 +0000 (06:45 +0000)
ext/dba/dba_db4.c

index 47aa910fa191256ed6e69a7b2f19f2163f4e8537..1b96ec4c287f215128c3fed6425304e0c715865b 100644 (file)
@@ -40,9 +40,30 @@ static void php_dba_db4_errcall_fcn(
 #if (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 3)
        const DB_ENV *dbenv, 
 #endif
-       const char *errpfx, char *msg)
+       const char *errpfx, const char *msg)
 {
        TSRMLS_FETCH();
+
+#if (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR == 8 && DB_VERSION_PATCH <= 26)
+/* Bug 51086, Berkeley DB 4.8.26 */
+/* This code suppresses a BDB 4.8 error message that BDB incorrectly emits */
+       {
+               zstr funcname = get_active_function_name(TSRMLS_C);
+               int s_funcname_len;
+               char *s_funcname;
+               if (funcname.u != NULL) {
+                       zend_unicode_to_string(ZEND_U_CONVERTER(UG(utf8_conv)), &s_funcname, &s_funcname_len, funcname.u, u_strlen(funcname.u) TSRMLS_CC);
+
+                       if (s_funcname != NULL && (!strcmp(s_funcname,"dba_popen") || !strcmp(s_funcname,"dba_open"))
+                               && !strncmp(msg, "fop_read_meta", sizeof("fop_read_meta")-1)) {
+                               efree(s_funcname);
+                               return;
+                       }
+                       if (s_funcname != NULL)
+                               efree(s_funcname);
+               }
+       }
+#endif
        
        php_error_docref(NULL TSRMLS_CC, E_NOTICE, "%s%s", errpfx?errpfx:"", msg);
 }
@@ -67,6 +88,7 @@ DBA_OPEN_FUNC(db4)
        struct stat check_stat;
        int s = VCWD_STAT(info->path, &check_stat);
 
+#if (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR <= 7)  /* Bug 51086 */
        if (!s && !check_stat.st_size) {
                info->mode = DBA_TRUNC; /* force truncate */
        }
@@ -80,6 +102,20 @@ DBA_OPEN_FUNC(db4)
                (info->mode == DBA_CREAT && !s) ? 0 :
                info->mode == DBA_WRITER ? 0         : 
                info->mode == DBA_TRUNC ? DB_CREATE | DB_TRUNCATE : -1;
+#else
+       if (!s && !check_stat.st_size) {
+               info->mode = DBA_CREAT; /* force creation */
+       }
+
+       type = info->mode == DBA_READER ? DB_UNKNOWN :
+               (info->mode == DBA_TRUNC || info->mode == DBA_CREAT) ? DB_BTREE :
+               s ? DB_BTREE : DB_UNKNOWN;
+         
+       gmode = info->mode == DBA_READER ? DB_RDONLY :
+               info->mode == DBA_CREAT ? DB_CREATE : 
+               info->mode == DBA_WRITER ? 0         : 
+               info->mode == DBA_TRUNC ? DB_CREATE | DB_TRUNCATE : -1;
+#endif
 
        if (gmode == -1) {
                return FAILURE; /* not possible */