diff src/database.c @ 771:943eaba38521

[xemacs-hg @ 2002-03-13 08:51:24 by ben] The big ben-mule-21-5 check-in! Various files were added and deleted. See CHANGES-ben-mule. There are still some test suite failures. No crashes, though. Many of the failures have to do with problems in the test suite itself rather than in the actual code. I'll be addressing these in the next day or so -- none of the test suite failures are at all critical. Meanwhile I'll be trying to address the biggest issues -- i.e. build or run failures, which will almost certainly happen on various platforms. All comments should be sent to ben@xemacs.org -- use a Cc: if necessary when sending to mailing lists. There will be pre- and post- tags, something like pre-ben-mule-21-5-merge-in, and post-ben-mule-21-5-merge-in.
author ben
date Wed, 13 Mar 2002 08:54:06 +0000
parents fdefd0186b75
children e38acbeb1cae
line wrap: on
line diff
--- a/src/database.c	Fri Mar 08 13:33:14 2002 +0000
+++ b/src/database.c	Wed Mar 13 08:54:06 2002 +0000
@@ -1,5 +1,6 @@
 /* Database access routines
    Copyright (C) 1996, William M. Perry
+   Copyright (C) 2001 Ben Wing.
 
 This file is part of XEmacs.
 
@@ -23,9 +24,11 @@
 /* Written by Bill Perry */
 /* Substantially rewritten by Martin Buchholz */
 /* db 2.x support added by Andreas Jaeger */
+/* Mule-ized 6-22-00 Ben Wing */
 
 #include <config.h>
 #include "lisp.h"
+
 #include "sysfile.h"
 #include "buffer.h"
 
@@ -68,12 +71,7 @@
 Lisp_Object Qdbm;
 #endif /* HAVE_DBM */
 
-#ifdef MULE
-/* #### The following should be settable on a per-database level.
-   But the whole coding-system infrastructure should be rewritten someday.
-   We really need coding-system aliases. -- martin */
 Lisp_Object Vdatabase_coding_system;
-#endif
 
 Lisp_Object Qdatabasep;
 
@@ -104,9 +102,7 @@
   DB *db_handle;
 #endif
   DB_FUNCS *funcs;
-#ifdef MULE
   Lisp_Object coding_system;
-#endif
 };
 
 #define XDATABASE(x) XRECORD (x, database, Lisp_Database)
@@ -140,9 +136,7 @@
   db->access_ = 0;
   db->mode = 0;
   db->dberrno = 0;
-#ifdef MULE
-  db->coding_system = Fget_coding_system (Qbinary);
-#endif
+  db->coding_system = Qnil;
   return db;
 }
 
@@ -267,8 +261,10 @@
        keydatum = dbm_nextkey (db->dbm_handle))
     {
       valdatum = dbm_fetch (db->dbm_handle, keydatum);
-      key = make_string ((unsigned char *) keydatum.dptr, keydatum.dsize);
-      val = make_string ((unsigned char *) valdatum.dptr, valdatum.dsize);
+      key = make_ext_string (keydatum.dptr, keydatum.dsize,
+			     db->coding_system);
+      val = make_ext_string (valdatum.dptr, valdatum.dsize,
+			     db->coding_system);
       call2 (func, key, val);
     }
 }
@@ -278,12 +274,14 @@
 {
   datum keydatum, valdatum;
 
-  keydatum.dptr = (char *) XSTRING_DATA (key);
-  keydatum.dsize = XSTRING_LENGTH (key);
+  TO_EXTERNAL_FORMAT (LISP_STRING, key,
+		      ALLOCA, (keydatum.dptr, keydatum.dsize),
+		      db->coding_system);
   valdatum = dbm_fetch (db->dbm_handle, keydatum);
 
   return (valdatum.dptr
-	  ? make_string ((unsigned char *) valdatum.dptr, valdatum.dsize)
+	  ? make_ext_string (valdatum.dptr, valdatum.dsize,
+			     db->coding_system)
 	  : Qnil);
 }
 
@@ -293,10 +291,12 @@
 {
   datum keydatum, valdatum;
 
-  valdatum.dptr = (char *) XSTRING_DATA (val);
-  valdatum.dsize = XSTRING_LENGTH (val);
-  keydatum.dptr = (char *) XSTRING_DATA (key);
-  keydatum.dsize = XSTRING_LENGTH (key);
+  TO_EXTERNAL_FORMAT (LISP_STRING, val,
+		      ALLOCA, (valdatum.dptr, valdatum.dsize),
+		      db->coding_system);
+  TO_EXTERNAL_FORMAT (LISP_STRING, key,
+		      ALLOCA, (keydatum.dptr, keydatum.dsize),
+		      db->coding_system);
 
   return !dbm_store (db->dbm_handle, keydatum, valdatum,
 		     NILP (replace) ? DBM_INSERT : DBM_REPLACE);
@@ -307,8 +307,9 @@
 {
   datum keydatum;
 
-  keydatum.dptr = (char *) XSTRING_DATA (key);
-  keydatum.dsize = XSTRING_LENGTH (key);
+  TO_EXTERNAL_FORMAT (LISP_STRING, key,
+		      ALLOCA, (keydatum.dptr, keydatum.dsize),
+		      db->coding_system);
 
   return dbm_delete (db->dbm_handle, keydatum);
 }
@@ -395,8 +396,9 @@
   xzero (keydatum);
   xzero (valdatum);
 
-  keydatum.data = XSTRING_DATA (key);
-  keydatum.size = XSTRING_LENGTH (key);
+  TO_EXTERNAL_FORMAT (LISP_STRING, key,
+		      ALLOCA, (keydatum.data, keydatum.size),
+		      db->coding_system);
 
 #if DB_VERSION_MAJOR == 1
   status = db->db_handle->get (db->db_handle, &keydatum, &valdatum, 0);
@@ -405,8 +407,8 @@
 #endif /* DB_VERSION_MAJOR */
 
   if (!status)
-    /* #### Not mule-ized! will crash! */
-    return make_string ((Intbyte *) valdatum.data, valdatum.size);
+    return make_ext_string (valdatum.data, valdatum.size,
+			    db->coding_system);
 
 #if DB_VERSION_MAJOR == 1
   db->dberrno = (status == 1) ? -1 : errno;
@@ -430,10 +432,12 @@
   xzero (keydatum);
   xzero (valdatum);
 
-  keydatum.data = XSTRING_DATA   (key);
-  keydatum.size = XSTRING_LENGTH (key);
-  valdatum.data = XSTRING_DATA   (val);
-  valdatum.size = XSTRING_LENGTH (val);
+  TO_EXTERNAL_FORMAT (LISP_STRING, key,
+		      ALLOCA, (keydatum.data, keydatum.size),
+		      db->coding_system);
+  TO_EXTERNAL_FORMAT (LISP_STRING, val,
+		      ALLOCA, (valdatum.data, valdatum.size),
+		      db->coding_system);
 #if DB_VERSION_MAJOR == 1
   status = db->db_handle->put (db->db_handle, &keydatum, &valdatum,
  			       NILP (replace) ? R_NOOVERWRITE : 0);
@@ -456,8 +460,9 @@
   /* DB Version 2 requires DBT's to be zeroed before use. */
   xzero (keydatum);
 
-  keydatum.data = XSTRING_DATA   (key);
-  keydatum.size = XSTRING_LENGTH (key);
+  TO_EXTERNAL_FORMAT (LISP_STRING, key,
+		      ALLOCA, (keydatum.data, keydatum.size),
+		      db->coding_system);
 
 #if DB_VERSION_MAJOR == 1
   status = db->db_handle->del (db->db_handle, &keydatum, 0);
@@ -493,9 +498,10 @@
        status == 0;
        status = dbp->seq (dbp, &keydatum, &valdatum, R_NEXT))
     {
-      /* #### Needs mule-izing */
-      key = make_string ((Intbyte *) keydatum.data, keydatum.size);
-      val = make_string ((Intbyte *) valdatum.data, valdatum.size);
+      key = make_ext_string (keydatum.data, keydatum.size,
+			     db->coding_system);
+      val = make_ext_string (valdatum.data, valdatum.size,
+			     db->coding_system);
       call2 (func, key, val);
     }
 #else
@@ -511,9 +517,10 @@
 	 status == 0;
 	 status = dbcp->c_get (dbcp, &keydatum, &valdatum, DB_NEXT))
       {
-	/* #### Needs mule-izing */
-	key = make_string ((Intbyte *) keydatum.data, keydatum.size);
-	val = make_string ((Intbyte *) valdatum.data, valdatum.size);
+	key = make_ext_string (keydatum.data, keydatum.size,
+			       db->coding_system);
+	val = make_ext_string (valdatum.data, valdatum.size,
+			       db->coding_system);
 	call2 (func, key, val);
       }
     dbcp->c_close (dbcp);
@@ -563,15 +570,18 @@
   return XDATABASE (database)->funcs->last_error (XDATABASE (database));
 }
 
-DEFUN ("open-database", Fopen_database, 1, 5, 0, /*
+DEFUN ("open-database", Fopen_database, 1, 6, 0, /*
 Return a new database object opened on FILE.
 Optional arguments TYPE and SUBTYPE specify the database type.
 Optional argument ACCESS specifies the access rights, which may be any
 combination of 'r' 'w' and '+', for read, write, and creation flags.
 Optional argument MODE gives the permissions to use when opening FILE,
 and defaults to 0755.
+Optional argument CODESYS specifies the coding system used to encode/decode
+data passed to/from the database, and defaults to the value of the
+variable `database-coding-system'.
 */
-       (file, type, subtype, access_, mode))
+       (file, type, subtype, access_, mode, codesys))
 {
   /* This function can GC */
   int modemask;
@@ -621,6 +631,11 @@
       modemask = XINT (mode);
     }
 
+  if (NILP (codesys))
+    codesys = Vdatabase_coding_system;
+
+  codesys = get_coding_system_for_text_file (Vdatabase_coding_system, 1);
+
 #ifdef HAVE_DBM
   if (NILP (type) || EQ (type, Qdbm))
     {
@@ -631,6 +646,7 @@
       db = allocate_database ();
       db->dbm_handle = dbase;
       db->funcs = &ndbm_func_block;
+      db->coding_system = codesys;
       goto db_done;
     }
 #endif /* HAVE_DBM */
@@ -703,6 +719,7 @@
       db = allocate_database ();
       db->db_handle = dbase;
       db->funcs = &berk_func_block;
+      db->coding_system = codesys;
       goto db_done;
     }
 #endif /* HAVE_BERKELEY_DB */
@@ -826,12 +843,8 @@
   Fprovide (Qberkeley_db);
 #endif
 
-#if 0 /* #### implement me! */
-#ifdef MULE
   DEFVAR_LISP ("database-coding-system", &Vdatabase_coding_system /*
-Coding system used to convert data in database files.
+Default coding system used to convert data in database files.
 */ );
-  Vdatabase_coding_system = Qnil;
-#endif
-#endif /* 0 */
+  Vdatabase_coding_system = Qnative;
 }