summaryrefslogtreecommitdiffstats
path: root/debian/htdig/htdig-3.2.0b6/htlib/DB2_db.cc
diff options
context:
space:
mode:
Diffstat (limited to 'debian/htdig/htdig-3.2.0b6/htlib/DB2_db.cc')
-rw-r--r--debian/htdig/htdig-3.2.0b6/htlib/DB2_db.cc379
1 files changed, 379 insertions, 0 deletions
diff --git a/debian/htdig/htdig-3.2.0b6/htlib/DB2_db.cc b/debian/htdig/htdig-3.2.0b6/htlib/DB2_db.cc
new file mode 100644
index 00000000..46127056
--- /dev/null
+++ b/debian/htdig/htdig-3.2.0b6/htlib/DB2_db.cc
@@ -0,0 +1,379 @@
+//
+// DB2_db.cc
+//
+// DB2_db: Implements the Berkeley B-Tree database as a Database object
+// (including duplicate values to allow duplicate word entries)
+//
+// Part of the ht://Dig package <http://www.htdig.org/>
+// Copyright (c) 1999-2004 The ht://Dig Group
+// For copyright details, see the file COPYING in your distribution
+// or the GNU Library General Public License (LGPL) version 2 or later
+// <http://www.gnu.org/copyleft/lgpl.html>
+//
+// $Id: DB2_db.cc,v 1.26 2004/05/28 13:15:20 lha Exp $
+//
+
+#ifdef HAVE_CONFIG_H
+#include "htconfig.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <fcntl.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#ifdef HAVE_STD
+#include <fstream>
+#ifdef HAVE_NAMESPACES
+using namespace std;
+#endif
+#else
+#include <fstream.h>
+#endif /* HAVE_STD */
+
+#ifndef _MSC_VER /* _WIN32 */
+#include <unistd.h>
+#endif
+
+#include "DB2_db.h"
+#include "HtConfiguration.h"
+
+// Default cache size in kilobytes.
+// Maybe this should be an config option, just for easy testing and
+// determination for best system performance
+// NOTE: page size is 1KB - do not change!!
+#define CACHE_SIZE_IN_KB 64
+
+//*****************************************************************************
+// DB2_db::DB2_db()
+//
+DB2_db::DB2_db()
+{
+ isOpen = 0;
+ _compare = 0;
+ _prefix = 0;
+}
+
+
+//*****************************************************************************
+// DB2_db::~DB2_db()
+//
+DB2_db::~DB2_db()
+{
+ Close();
+}
+
+
+//*****************************************************************************
+//
+int
+DB2_db::Open(const char *filename, int flags, int mode)
+{
+ //
+ // Initialize the database environment.
+ //
+ if((dbenv = db_init((char *)NULL)) == 0) return NOTOK;
+
+ if(CDB_db_create(&dbp, dbenv, 0) != 0) return NOTOK;
+
+ if(_compare) dbp->set_bt_compare(dbp, _compare);
+ if(_prefix) dbp->set_bt_prefix(dbp, _prefix);
+
+ //
+ // Open the database.
+ //
+ if((errno = dbp->open(dbp, filename, NULL, db_type, flags, mode)) == 0)
+ {
+ //
+ // Acquire a cursor for the database.
+ //
+ if ((seqrc = dbp->cursor(dbp, NULL, &dbcp, 0)) != 0)
+ {
+ seqerr = seqrc;
+ Close();
+ return NOTOK;
+ }
+ isOpen = 1;
+ return OK;
+ }
+ else
+ {
+ return NOTOK;
+ }
+}
+
+
+//*****************************************************************************
+// int DB2_db::Close()
+//
+int
+DB2_db::Close()
+{
+ if(isOpen)
+ {
+ //
+ // Close cursor, database and clean up environment
+ //
+ (void)(dbcp->c_close)(dbcp);
+ (void)(dbp->close)(dbp, 0);
+ (void)(dbenv->close(dbenv, 0));
+ dbenv = 0;
+ }
+ isOpen = 0;
+ return OK;
+}
+
+
+//*****************************************************************************
+// char *DB2_db::Get_Next(String &item, String &key)
+//
+char *
+DB2_db::Get_Next(String &item, String &key)
+{
+ if (isOpen && !seqrc)
+ {
+ //
+ // Return values
+ //
+ key = skey;
+ lkey = skey;
+ item = data;
+
+ //
+ // Search for the next record
+ //
+ DBT local_key;
+ DBT local_data;
+
+ memset(&local_key, 0, sizeof(DBT));
+ memset(&local_data, 0, sizeof(DBT));
+
+ local_key.data = skey.get();
+ local_key.size = skey.length();
+
+ seqrc = dbcp->c_get(dbcp, &local_key, &local_data, DB_NEXT);
+ seqerr = seqrc;
+
+ if(!seqrc) {
+ data = 0;
+ data.append((char*)local_data.data, (int)local_data.size);
+ skey = 0;
+ skey.append((char*)local_key.data, (int)local_key.size);
+ }
+
+ return lkey.get();
+ }
+ else
+ return 0;
+}
+
+//*****************************************************************************
+// void DB2_db::Start_Seq()
+//
+void
+DB2_db::Start_Seq(const String& key)
+{
+ DBT local_key;
+ DBT local_data;
+
+ memset(&local_key, 0, sizeof(DBT));
+ memset(&local_data, 0, sizeof(DBT));
+
+ skey = key;
+
+ local_key.data = skey.get();
+ local_key.size = skey.length();
+
+ if (isOpen && dbp)
+ {
+ //
+ // Okay, get the first key. Use DB_SET_RANGE for finding partial
+ // keys also. If you set it to DB_SET, and the words book, books
+ // and bookstore do exists, it will find them if you specify
+ // book*. However if you specify boo* if will not find
+ // anything. Setting to DB_SET_RANGE will still find the `first'
+ // word after boo* (which is book).
+ //
+ seqrc = dbcp->c_get(dbcp, &local_key, &local_data, DB_SET_RANGE);
+ seqerr = seqrc;
+
+ if(!seqrc) {
+ data = 0;
+ data.append((char*)local_data.data, (int)local_data.size);
+ skey = 0;
+ skey.append((char*)local_key.data, (int)local_key.size);
+ }
+ }
+}
+
+//*****************************************************************************
+// void DB2_db::Start_Get()
+//
+void
+DB2_db::Start_Get()
+{
+ DBT local_key;
+ DBT local_data;
+
+ memset(&local_key, 0, sizeof(DBT));
+ memset(&local_data, 0, sizeof(DBT));
+
+ if (isOpen && dbp)
+ {
+ //
+ // Okay, get the first key. Use DB_SET_RANGE for finding partial
+ // keys also. If you set it to DB_SET, and the words book, books
+ // and bookstore do exists, it will find them if you specify
+ // book*. However if you specify boo* if will not find
+ // anything. Setting to DB_SET_RANGE will still find the `first'
+ // word after boo* (which is book).
+ //
+ seqrc = dbcp->c_get(dbcp, &local_key, &local_data, DB_FIRST);
+ seqerr = seqrc;
+
+ if(!seqrc) {
+ data = 0;
+ data.append((char*)local_data.data, (int)local_data.size);
+ skey = 0;
+ skey.append((char*)local_key.data, (int)local_key.size);
+ }
+ }
+}
+
+//*****************************************************************************
+// int DB2_db::Put(const String &key, const String &data)
+//
+int
+DB2_db::Put(const String &key, const String &data)
+{
+ DBT k, d;
+
+ memset(&k, 0, sizeof(DBT));
+ memset(&d, 0, sizeof(DBT));
+
+ if (!isOpen)
+ return NOTOK;
+
+ k.data = (char*)key.get();
+ k.size = key.length();
+
+ d.data = (char*)data.get();
+ d.size = data.length();
+
+ //
+ // A 0 in the flags in put means replace, if you didn't specify DB_DUP
+ // somewhere else...
+ //
+ return (dbp->put)(dbp, NULL, &k, &d, 0) == 0 ? OK : NOTOK;
+}
+
+
+//*****************************************************************************
+// int DB2_db::Get(const String &key, String &data)
+//
+int
+DB2_db::Get(const String &key, String &data)
+{
+ DBT k, d;
+
+ memset(&k, 0, sizeof(DBT));
+ memset(&d, 0, sizeof(DBT));
+
+ //
+ // k arg of get should be const but is not. Harmless cast.
+ //
+ k.data = (char*)key.get();
+ k.size = key.length();
+
+ int rc = dbp->get(dbp, NULL, &k, &d, 0);
+ if (rc)
+ return NOTOK;
+
+ data = 0;
+ data.append((char *)d.data, d.size);
+ return OK;
+}
+
+
+//*****************************************************************************
+// int DB2_db::Exists(const String &key)
+//
+int
+DB2_db::Exists(const String &key)
+{
+ String data;
+
+ if (!isOpen)
+ return 0;
+
+ return Get(key, data);
+}
+
+
+//*****************************************************************************
+// int DB2_db::Delete(const String &key)
+//
+int
+DB2_db::Delete(const String &key)
+{
+ DBT k;
+
+ memset(&k, 0, sizeof(DBT));
+
+ if (!isOpen)
+ return 0;
+
+ k.data = (char*)key.get();
+ k.size = key.length();
+
+ return (dbp->del)(dbp, NULL, &k, 0);
+}
+
+
+//*****************************************************************************
+// DB2_db *DB2_db::getDatabaseInstance()
+//
+DB2_db *
+DB2_db::getDatabaseInstance(DBTYPE)
+{
+ return new DB2_db();
+}
+
+//*****************************************************************************
+// void Error(const char *error_prefix, char *message);
+//
+void Error(const char *error_prefix, char *message)
+{
+ // We don't do anything here, it's mostly a stub so we can set a breakpoint
+ // for debugging purposes
+ fprintf(stderr, "%s: %s\n", error_prefix, message);
+}
+
+//******************************************************************************
+
+/*
+ * db_init --
+ * Initialize the environment. Only returns a pointer
+ */
+DB_ENV *
+DB2_db::db_init(char *home)
+{
+ DB_ENV *dbenv;
+ char *progname = "DB2 problem...";
+
+ int error;
+ if((error = CDB_db_env_create(&dbenv, 0)) != 0) {
+ fprintf(stderr, "DB2_db: CDB_db_env_create %s\n", CDB_db_strerror(error));
+ return 0;
+ }
+
+ dbenv->set_errpfx(dbenv, progname);
+ dbenv->set_errcall(dbenv, &Error);
+
+ if((error = dbenv->open(dbenv, (const char*)home, NULL, DB_CREATE | DB_PRIVATE | DB_INIT_LOCK | DB_INIT_MPOOL, 0666)) != 0) {
+ dbenv->err(dbenv, error, "open %s", (home ? home : ""));
+ return 0;
+ }
+
+ return (dbenv);
+}
+