[prev in list] [next in list] [prev in thread] [next in thread] 

List:       exim-users
Subject:    Berkeley DB patch for exim 0.50
From:       Nigel Metheringham <Nigel.Metheringham () ThePLAnet ! net>
Date:       1996-05-23 16:10:15
[Download RAW message or body]

Philip,

Here's a patch for direct support of Berkeley db in exim (rather than 
using the dbm emulation, which may or not be compiled in depending 
how you build berkeley).

Its a touch of a mess because I didn't change any of your 
organisation - so everywhere where dbm functions were there is now an 
ifdef with dbm and db functions.

One thing to watch is that there is a difference between db using dbm 
emulation and db direct - basically in direct mode it does *not* add 
a .db extension to the filename.  Hence I have added a check in 
exim_dbmbuild to prevent you overwriting the source file!

Its only lightly tested, I'll hit it better soon.
To use it, define USE_DB in a config file along with setting DBMLIB 
to the right thing.

Patch is an encoded MIME enclosure - some people have been unable to 
use unencoded ones from me presumably due to white space mangling.

	Nigel.


[Attachment #3 (unknown)]

Index: exim/scripts/os-type
diff -u exim/scripts/os-type:1.1.1.4 exim/scripts/os-type:1.2
--- exim/scripts/os-type:1.1.1.4	Thu May 23 10:28:48 1996
+++ exim/scripts/os-type	Thu May 23 16:48:18 1996
@@ -33,7 +33,8 @@
 Ultrix)  os=ULTRIX;;
 BSD/OS)  os=BSDI;;
 # Convert what tcsh sets OSTYPE to
-solaris) os=SunOS;;
+solaris) os=SunOS5;;
+sunos4)  os=SunOS4;;
 # Convert what some Linuxes set in OSTYPE
 linux)   os=Linux;;
 esac
Index: exim/src/config.h.defaults
diff -u exim/src/config.h.defaults:1.1.1.5 exim/src/config.h.defaults:1.2
--- exim/src/config.h.defaults:1.1.1.5	Thu May 23 10:28:53 1996
+++ exim/src/config.h.defaults	Thu May 23 16:48:21 1996
@@ -61,4 +61,7 @@
 #define EXPAND_MAXN           9
 #define ROOT_UID              0
 
+/* And build variations... */
+#define USE_DB
+
 /* End of config.h.defaults */
Index: exim/src/db.c
diff -u exim/src/db.c:1.1.1.3 exim/src/db.c:1.4
--- exim/src/db.c:1.1.1.3	Thu May 23 10:28:55 1996
+++ exim/src/db.c	Thu May 23 16:48:22 1996
@@ -31,20 +31,28 @@
 *          Open and lock a database file         *
 *************************************************/
 
-DBM *db_open(char *name, int flags)
+EXIM_DB *db_open(char *name, int flags)
 {
-DBM *dbm;
+EXIM_DB *dbm;
 flock_t lock_data;
 int lock_count = 0;
 char buffer[256];
 
 sprintf(buffer, "%s/db/%s", spool_directory, name);
+#ifdef USE_DB
+dbm = dbopen(buffer, flags, DB_MODE, DB_HASH, NULL);
+#else
 dbm = dbm_open(buffer, flags, DB_MODE);
+#endif
 
 if (dbm == NULL)
   {
   directory_make(spool_directory, "db", DB_DIRECTORY_MODE);
+#ifdef USE_DB
+  dbm = dbopen(buffer, flags, DB_MODE, DB_HASH, NULL);
+#else
   dbm = dbm_open(buffer, flags, DB_MODE);
+#endif
   }
   
 if (dbm == NULL) 
@@ -63,13 +71,21 @@
 the BSDI os.h file defines USE_DBM_DIRFNO, which causes dbhdr.h to define a 
 macro that turns dbm_pagfno() into dbm_dirfno(). */
 
+#ifdef USE_DB
+while (fcntl(dbm->fd(dbm), F_SETLK, &lock_data) < 0)
+#else
 while (fcntl(dbm_pagfno(dbm), F_SETLK, &lock_data) < 0)
+#endif
   {
   if (lock_count++ > DB_LOCK_RETRIES)
     {
     log_write(LOG_MAIN, "Failed to get %s lock for %s\n", 
       ((flags & O_RDONLY) != 0)? "read" : "write", buffer);
+#ifdef USE_DB
+    dbm->close(dbm);
+#else
     dbm_close(dbm);
+#endif
     return NULL;      
     }
     
@@ -91,17 +107,25 @@
 /* There isn't much one can do if unlocking fails, and there's
 no error return given by dbm_close(). */
 
-void db_close(DBM *dbm)
+void db_close(EXIM_DB *dbm)
 {
 flock_t lock_data;
 lock_data.l_type = F_UNLCK;
 lock_data.l_whence = lock_data.l_start = lock_data.l_len = 0;
 
+#ifdef USE_DB
+if (fcntl(dbm->fd(dbm), F_SETLK, &lock_data) < 0)
+  {
+  log_write(LOG_MAIN, "Unlock failed for dbm file: %s", strerror(errno));
+  }  
+dbm->close(dbm);
+#else
 if (fcntl(dbm_pagfno(dbm), F_SETLK, &lock_data) < 0)
   {
   log_write(LOG_MAIN, "Unlock failed for dbm file: %s", strerror(errno));
   }  
 dbm_close(dbm);
+#endif
 }
 
 
@@ -116,8 +140,18 @@
 to be properly aligned to pick out the timestamps, etc., we might as
 well do the copying centrally here. */
 
-void *db_read(DBM *dbm, char *key)
+void *db_read(EXIM_DB *dbm, char *key)
 {
+#ifdef USE_DB
+void *yield;
+DBT key_datum, result_datum;
+key_datum.data = key;
+key_datum.size = (int)strlen(key) + 1;
+if (dbm->get(dbm, &key_datum, &result_datum, 0)) return NULL;
+yield = (void *)store_malloc(result_datum.size);
+memcpy(yield, result_datum.data, result_datum.size);
+#else
+
 void *yield;
 datum key_datum, result_datum;
 key_datum.dptr = key;
@@ -126,6 +160,8 @@
 if (result_datum.dptr == NULL) return NULL;
 yield = (void *)store_malloc(result_datum.dsize);
 memcpy(yield, result_datum.dptr, result_datum.dsize);
+#endif
+
 return yield;
 }
 
@@ -137,8 +173,18 @@
 
 /* The yield is the result of dbm_store, that is, zero for OK. */
 
-int db_write(DBM *dbm, char *key, void *ptr, int length)
+int db_write(EXIM_DB *dbm, char *key, void *ptr, int length)
 {                    
+#ifdef USE_DB
+DBT key_datum, value_datum;
+db_generic *gptr = (db_generic *)ptr;
+gptr->time_stamp = time(NULL);
+key_datum.data = key;
+key_datum.size = (int)strlen(key) + 1;
+value_datum.data = (char *)ptr;
+value_datum.size = length;
+return dbm->put(dbm, &key_datum, &value_datum, 0);
+#else
 datum key_datum, value_datum;
 db_generic *gptr = (db_generic *)ptr;
 gptr->time_stamp = time(NULL);
@@ -147,6 +193,7 @@
 value_datum.dptr = (char *)ptr;
 value_datum.dsize = length;
 return dbm_store(dbm, key_datum, value_datum, DBM_REPLACE);
+#endif
 }
 
 
@@ -155,12 +202,19 @@
 *           Delete record from database file     *
 *************************************************/
 
-int db_delete(DBM *dbm, char *key)
+int db_delete(EXIM_DB *dbm, char *key)
 {
+#ifdef USE_DB
+DBT key_datum;
+key_datum.data = key;
+key_datum.size = (int)strlen(key) + 1;
+return dbm->del(dbm, &key_datum, 0);
+#else
 datum key_datum;
 key_datum.dptr = key;
 key_datum.dsize = (int)strlen(key) + 1;
 return dbm_delete(dbm, key_datum);
+#endif
 }
 
 
@@ -169,10 +223,17 @@
 *         Scan the keys of a database file       *
 *************************************************/
 
-char *db_scan(DBM *dbm, BOOL start)
+char *db_scan(EXIM_DB *dbm, BOOL start)
 {
+#ifdef USE_DB
+DBT result_datum, key_datum;
+if (dbm->seq(dbm, &key_datum, &result_datum, start ? R_FIRST : R_NEXT))
+    return NULL;
+return key_datum.data;
+#else
 datum result_datum = start? dbm_firstkey(dbm) : dbm_nextkey(dbm);
 return result_datum.dptr;
+#endif
 }
 
 /* End of db.c */
Index: exim/src/dbhdr.h
diff -u exim/src/dbhdr.h:1.1.1.2 exim/src/dbhdr.h:1.3
--- exim/src/dbhdr.h:1.1.1.2	Thu May 23 10:28:56 1996
+++ exim/src/dbhdr.h	Thu May 23 10:34:49 1996
@@ -9,9 +9,12 @@
 BSDI has file in /usr/include called db.h which gets called from inside
 /usr/include/ndbm.h. */
 
-
-#include <ndbm.h>
-
+#ifdef USE_DB
+#  include <db.h>
+#  define EXIM_DB DB
+#else
+#  include <ndbm.h>
+#  define EXIM_DB DBM
 
 /* Most Unix systems have the function (usually a macro) dbm_pagfno(), and Exim 
 started life using that for getting a file descriptor in order to lock an open 
@@ -23,10 +26,12 @@
 to turn one into the other, first undefining any previous macro - BSDI defines
 one that causes a compilation error. */
 
-#ifdef USE_DBM_DIRFNO
-#undef dbm_pagfno
-#define dbm_pagfno(a) dbm_dirfno(a)
-#endif
+#  ifdef USE_DBM_DIRFNO
+#    undef dbm_pagfno
+#    define dbm_pagfno(a) dbm_dirfno(a)
+#  endif
+
+#endif /* !defined(USE_DB) */
 
 
 /* Structures for records stored in exim database dbm files. They all
@@ -75,11 +80,11 @@
 
 /* Functions for reading/writing exim database files */
 
-void  db_close(DBM *);
-int   db_delete(DBM *, char *);
-DBM  *db_open(char *, int);
-void *db_read(DBM *, char *);
-char *db_scan(DBM *, BOOL);
-int   db_write(DBM *, char *, void *, int);
+void  db_close(EXIM_DB *);
+int   db_delete(EXIM_DB *, char *);
+EXIM_DB  *db_open(char *, int);
+void *db_read(EXIM_DB *, char *);
+char *db_scan(EXIM_DB *, BOOL);
+int   db_write(EXIM_DB *, char *, void *, int);
 
 /* End of dbhdr.h */
Index: exim/src/deliver.c
diff -u exim/src/deliver.c:1.1.1.6 exim/src/deliver.c:1.5
--- exim/src/deliver.c:1.1.1.6	Thu May 23 10:28:58 1996
+++ exim/src/deliver.c	Thu May 23 16:48:25 1996
@@ -963,7 +963,7 @@
 int i, fd;
 time_t now = time(NULL);
 address_item *addr_last;
-DBM *dbm_file;
+EXIM_DB *dbm_file;
 char spoolname[256];
 
 DEBUG(1) debug_printf("delivering message %s\n", id);
Index: exim/src/exim_dbmbuild.c
diff -u exim/src/exim_dbmbuild.c:1.1.1.4 exim/src/exim_dbmbuild.c:1.2
--- exim/src/exim_dbmbuild.c:1.1.1.4	Thu May 23 10:29:04 1996
+++ exim/src/exim_dbmbuild.c	Thu May 23 16:48:27 1996
@@ -12,7 +12,7 @@
 by writing a new file or files, and then renaming; otherwise old entries can 
 never get flushed out.
 
-This program is clever enough to copy with ndbm, which creates two files called 
+This program is clever enough to cope with ndbm, which creates two files called 
 <name>.dir and <name>.pag, or with db, which creates a single file called 
 <name>.db. If there are any other variants, it won't copy.
 
@@ -45,8 +45,12 @@
 int yield = 0;
 int is_db = 0;
 FILE *f;
-DBM *d;
+EXIM_DB *d;
+#ifdef USE_DB
+DBT key, content;
+#else
 datum key, content;
+#endif
 char *bptr;
 char  keybuffer[256];
 char  temp_dbmname[256];
@@ -71,13 +75,27 @@
     }
   }   
 
+#ifdef USE_DB
+/* By default Berkeley db does not put extensions on... which
+   can be painful! */
+if (!strcmp(argv[1], argv[2]))
+  {
+  printf("exim_dbmbuild: input and output filenames are the same\n");
+  exit(1);
+  }
+#endif
+
 strcpy(temp_dbmname, argv[2]);
 strcat(temp_dbmname, ".dbmbuild_temp");
 
 /* It is apparently necessary to open with O_RDWR for this to work
 with gdbm-1.7.3, though no reading is actually going to be done. */
 
+#ifdef USE_DB
+d = dbopen(temp_dbmname, O_RDWR|O_CREAT|O_EXCL, 0444, DB_HASH, NULL);   
+#else
 d = dbm_open(temp_dbmname, O_RDWR|O_CREAT|O_EXCL, 0444);   
+#endif
 
 if (d == NULL)
   {
@@ -87,7 +105,8 @@
   exit(1);
   }
   
-/* See if we have created <name>.db; if not, assume .dir & .pag */
+/* See if we have created <name>.db; if not, assume .dir & .pag
+   If we are using Berkeley db then there are no extensions! */
 
 sprintf(real_dbmname, "%s.db", temp_dbmname);
 is_db = stat(real_dbmname, &statbuf) == 0;
@@ -129,21 +148,33 @@
 
   else
     {
-    int i; 
+    int i, size; 
     char *s = line; 
     if (started)
       {
+#ifdef USE_DB
+      content.data = buffer;
+      content.size = bptr - buffer + 1; 
+      d->put(d, &key, &content, 0);  
+#else
       content.dptr = buffer;
       content.dsize = bptr - buffer + 1; 
       dbm_store(d, key, content, DBM_REPLACE);  
+#endif
       count++; 
       bptr = buffer; 
       }
     while (*s != 0 && *s != ':' && !isspace(*s)) s++;
+    size = s - line + 1;
+#ifdef USE_DB
+    key.data = keybuffer;
+    key.size = size;
+#else
     key.dptr = keybuffer;
-    key.dsize = s - line + 1;   
+    key.dsize = size;
+#endif
     
-    if (key.dsize > 256)
+    if (size > 256)
       {
       printf("Keys longer than 255 characters cannot be handled\n");
       started = 0; 
@@ -151,7 +182,7 @@
       break; 
       }   
     
-    for (i = 0; i < key.dsize - 1; i++) keybuffer[i] = tolower(line[i]); 
+    for (i = 0; i < size - 1; i++) keybuffer[i] = tolower(line[i]); 
     keybuffer[i] = 0;
     started = 1; 
 
@@ -168,13 +199,22 @@
   
 if (started)
   {
+#ifdef USE_DB
+  content.data = buffer;
+  content.size = bptr - buffer + 1; 
+  d->put(d, &key, &content, 0);  
+#else
   content.dptr = buffer;
   content.dsize = bptr - buffer + 1; 
   dbm_store(d, key, content, DBM_REPLACE);  
+#endif
   count++; 
   }
-  
+#ifdef USE_DB
+d->close(d);  
+#else
 dbm_close(d);
+#endif
 fclose(f);
 
 /* If successful, output the number of entries and rename the temporary
@@ -200,6 +240,17 @@
   /* Rename .dir and .pag files */
    
   else
+#ifdef USE_DB
+    {
+    strcpy(real_dbmname, temp_dbmname);
+    strcpy(buffer, argv[2]);
+    if (rename(real_dbmname, buffer) != 0)
+      {
+      printf("Unable to rename %s as %s\n", real_dbmname, buffer);
+      return 1;
+      } 
+    }
+#else
     {     
     sprintf(real_dbmname, "%s.dir", temp_dbmname);
     sprintf(buffer, "%s.dir", argv[2]);
@@ -216,7 +267,8 @@
       printf("Unable to rename %s as %s\n", real_dbmname, buffer);
       return 1;
       } 
-    }   
+    }
+#endif   
   }   
 
 /* Otherwise unlink the temporary files. */
@@ -242,4 +294,3 @@
 }
 
 /* End of exim_dbmbuild.c */
-
Index: exim/src/exim_dumpdb.c
diff -u exim/src/exim_dumpdb.c:1.1.1.3 exim/src/exim_dumpdb.c:1.2
--- exim/src/exim_dumpdb.c:1.1.1.3	Thu May 23 10:29:05 1996
+++ exim/src/exim_dumpdb.c	Thu May 23 16:48:29 1996
@@ -54,7 +54,7 @@
 {
 struct stat statbuf;
 int db_type = 0;
-DBM *dbm;
+EXIM_DB *dbm;
 char *key;
 char buffer[256];
 
Index: exim/src/exim_fixdb.c
diff -u exim/src/exim_fixdb.c:1.1.1.3 exim/src/exim_fixdb.c:1.2
--- exim/src/exim_fixdb.c:1.1.1.3	Thu May 23 10:29:06 1996
+++ exim/src/exim_fixdb.c	Thu May 23 16:48:31 1996
@@ -155,7 +155,7 @@
 
 for(;;)
   {
-  DBM *dbm;
+  EXIM_DB *dbm;
   void *record;
   db_retry *retry;
   db_wait *wait;
Index: exim/src/exim_tidydb.c
diff -u exim/src/exim_tidydb.c:1.1.1.3 exim/src/exim_tidydb.c:1.2
--- exim/src/exim_tidydb.c:1.1.1.3	Thu May 23 10:29:07 1996
+++ exim/src/exim_tidydb.c	Thu May 23 16:48:34 1996
@@ -70,7 +70,7 @@
 int  keycount = 0;
 key_item *keychain = NULL;
 BOOL full = FALSE;
-DBM  *dbm;
+EXIM_DB  *dbm;
 char buffer[256];
 char *key;
 
Index: exim/src/retry.c
diff -u exim/src/retry.c:1.1.1.4 exim/src/retry.c:1.2
--- exim/src/retry.c:1.1.1.4	Thu May 23 10:29:23 1996
+++ exim/src/retry.c	Thu May 23 16:48:37 1996
@@ -40,7 +40,7 @@
 char *retry_check_address(host_item *host)
 {
 char *key;
-DBM *dbm_file;
+EXIM_DB *dbm_file;
 tree_node *node;
 db_retry *retry_record;
 
@@ -222,7 +222,7 @@
 void retry_update(address_item **addr_defer, address_item **addr_failed,
   address_item **addr_succeed)
 {
-DBM *dbm_file = NULL;
+EXIM_DB *dbm_file = NULL;
 time_t now = time(NULL);
 int i;
 
Index: exim/src/search.c
diff -u exim/src/search.c:1.1.1.4 exim/src/search.c:1.2
--- exim/src/search.c:1.1.1.4	Thu May 23 10:29:25 1996
+++ exim/src/search.c	Thu May 23 16:48:39 1996
@@ -133,7 +133,7 @@
 {
 int rc;
 FILE *f;
-DBM *d;
+EXIM_DB *d;
 char *nis_domain;
 tree_node *t;
 void *handle;
@@ -179,7 +179,11 @@
   /* DBM search */
 
   case stype_dbm:
+#ifdef USE_DB
+  d = dbopen(filename, O_RDONLY, DB_MODE, DB_HASH, NULL);
+#else
   d = dbm_open(filename, O_RDONLY, 0);
+#endif
   if (d == NULL)
     {
     *message = string_sprintf("failed to open %s.{dir,pag}: %s", filename,
@@ -187,9 +191,13 @@
     return NULL;
     }
 
+#ifdef USE_DB
+  if ((rc = check_file(d->fd(d), modemask, owners, owngroups)) != check_ok)
+#else
   if ((rc = check_file(dbm_pagfno(d), modemask, owners, owngroups)) != check_ok
       &&
       (rc = check_file(dbm_dirfno(d), modemask, owners, owngroups)) != check_ok)
+#endif
     {
     *message = (rc == check_fstat)?
       string_sprintf("%s: failed to fstat open file", filename) :
@@ -260,11 +268,15 @@
 
 char *search_find(void *handle, char *filename, char *keystring, int type)
 {
+#ifdef USE_DB
+DBT key, data;
+#else
 datum key, data;
+#endif
 int length;
 int nis_data_length;
 FILE *f;
-DBM *d;
+EXIM_DB *d;
 BOOL free_orig = FALSE;
 char *subkey;
 char *colon = strchr(keystring, ':');
@@ -352,11 +364,18 @@
     /* DBM search. */
 
     case stype_dbm:
-    d = (DBM *)handle;
+    d = (EXIM_DB *)handle;
+#ifdef USE_DB
+    key.data = keystring;
+    key.size = length + 1;
+    if (!d->get(d, &key, &data, 0))
+	cached_data = string_copy(data.data);
+#else
     key.dptr = keystring;
     key.dsize = length + 1;
     data = dbm_fetch(d, key);
     if (data.dptr != NULL) cached_data = string_copy(data.dptr);
+#endif
     break;
 
     /* NIS search */
@@ -425,7 +444,11 @@
   break;
 
   case stype_dbm:
-  dbm_close((DBM *)handle);
+#ifdef USE_DB
+  ((EXIM_DB *)handle)->close((EXIM_DB *)handle);
+#else
+  dbm_close((EXIM_DB *)handle);
+#endif
   break;
 
   #if HAVE_NIS
Index: exim/src/transport.c
diff -u exim/src/transport.c:1.1.1.4 exim/src/transport.c:1.2
--- exim/src/transport.c:1.1.1.4	Thu May 23 10:29:34 1996
+++ exim/src/transport.c	Thu May 23 16:48:41 1996
@@ -363,7 +363,7 @@
 char buffer[256];
 char *prevname = "";
 host_item *host;
-DBM *dbm_file;
+EXIM_DB *dbm_file;
 
 /* Open the database for this transport */
 
@@ -497,7 +497,7 @@
 {
 db_wait *host_record;
 int host_length, path_len, pid, status;
-DBM *dbm_file;
+EXIM_DB *dbm_file;
 char new_message_id[MESSAGE_ID_LENGTH + 1];
 char buffer[256];
 
@@ -526,7 +526,11 @@
 host_record = db_read(dbm_file, hostname);
 if (host_record == NULL)
   {
+#ifdef USE_DB
+  dbm_file->close(dbm_file);
+#else
   dbm_close(dbm_file);
+#endif
   DEBUG(4) debug_printf("no messages waiting for %s\n", hostname);
   return FALSE;
   }
Index: exim/src/verify.c
diff -u exim/src/verify.c:1.1.1.6 exim/src/verify.c:1.6
--- exim/src/verify.c:1.1.1.6	Thu May 23 10:29:36 1996
+++ exim/src/verify.c	Thu May 23 16:48:43 1996
@@ -649,7 +649,7 @@
 BOOL verify_sender_preliminary(int *errcode, char **errmess)
 {
 char *newaddr;
-DBM  *dbmfile;
+EXIM_DB  *dbmfile;
 db_reject *reject;
 char buffer[SENDER_ADDRESS_MAXLENGTH + 256];
 
@@ -778,7 +778,7 @@
 
 BOOL verify_sender(int *errcode, char **errmess)
 {
-DBM *dbmfile;
+EXIM_DB *dbmfile;
 db_reject reject;
 char buffer[256];
 
Index: exim/src/transports/autoreply.c
diff -u exim/src/transports/autoreply.c:1.1.1.1 exim/src/transports/autoreply.c:1.2
--- exim/src/transports/autoreply.c:1.1.1.1	Thu May 23 10:30:03 1996
+++ exim/src/transports/autoreply.c	Thu May 23 16:48:46 1996
@@ -171,11 +171,16 @@
 char *logfile, *oncelog;
 char *now = NULL;
 header_line *h;
-DBM *dbm_file = NULL;
+EXIM_DB *dbm_file = NULL;
 FILE *f;
 FILE *ff = NULL;
 autoreply_transport_options_block *ob =
   (autoreply_transport_options_block *)(tblock->options_block);
+#ifdef USE_DB
+DBT key_datum, result_datum;
+#else
+datum432_datum, result_datum;
+#endif
 
 DEBUG(2) debug_printf("%s transport entered\n", tblock->name);
 
@@ -262,8 +267,11 @@
 
 if (oncelog != NULL && to != NULL)
   {
-  datum key_datum, result_datum;
+#ifdef EXIM_DB
+  dbm_file = dbopen(oncelog, O_RDWR|O_CREAT, ob->mode, DB_HASH, NULL); 
+#else
   dbm_file = dbm_open(oncelog, O_RDWR|O_CREAT, ob->mode); 
+#endif
   if (dbm_file == NULL) 
     {
     addr->transport_return = DEFER;
@@ -272,12 +280,21 @@
     return;   
     } 
 
+#ifdef USE_DB
+  key_datum.data = to;
+  key_datum.size = (int)strlen(to) + 1;
+  if (dbm_file->get(dbm_file, &key_datum, &result_datum,0) == 0)
+    {
+    dbm_file->close(dbm_file);
+#else
   key_datum.dptr = to;
   key_datum.dsize = (int)strlen(to) + 1;
   result_datum = dbm_fetch(dbm_file, key_datum);
 
   if (result_datum.dptr != NULL)
     {
+    dbm_close(dbm_file);
+#endif
     DEBUG(9) debug_printf("message already sent to %s\n", to); 
     log_fd = open(logfile, O_WRONLY|O_APPEND|O_CREAT, ob->mode);
     if (log_fd >= 0)
@@ -288,7 +305,6 @@
       while(*ptr) ptr++;
       write(log_fd, log_buffer, ptr - log_buffer);   
       }  
-    dbm_close(dbm_file);   
     return;
     }  
   } 
@@ -411,14 +427,18 @@
 
 if (dbm_file != NULL)
   {
-  datum key_datum, value_datum;
   if (now == NULL) now = tod_stamp(tod_log); 
-  key_datum.dptr = to;
-  key_datum.dsize = (int)strlen(to) + 1;
-  value_datum.dptr = now;
-  value_datum.dsize = (int)strlen(now) + 1;
-  dbm_store(dbm_file, key_datum, value_datum, DBM_REPLACE);
+#ifdef USE_DB
+  result_datum.data = now;
+  result_datum.size = (int)strlen(now) + 1;
+  dbm_file->put(dbm_file, &key_datum, &result_datum, 0);
+  dbm_file->close(dbm_file); 
+#else
+  result_datum.dptr = now;
+  result_datum.dsize = (int)strlen(now) + 1;
+  dbm_store(dbm_file, key_datum, result_datum, DBM_REPLACE);
   dbm_close(dbm_file); 
+#endif
   } 
 
 /* If sending failed, defer to try again - but if once is set the next


[ Nigel.Metheringham@theplanet.net   - Unix Applications Engineer ]
[ *Views expressed here are personal and not supported by PLAnet* ]
[ PLAnet Online : The White House     Tel : +44 113 2345566 x 612 ]
[ Melbourne Street, Leeds LS2 7PS UK. Fax : +44 113 2345656       ]


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic