r2032: If you're selecting a hash algorithm for tdb, you need to do it at open time,
authorJeremy Allison <jra@samba.org>
Wed, 25 Aug 2004 01:04:02 +0000 (01:04 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:52:29 +0000 (10:52 -0500)
it doesn't make sense anywhere else.
Jeremy.

source/smbd/statcache.c
source/tdb/tdb.c
source/tdb/tdb.h
source/tdb/tdbutil.c

index 07a9e3ca85887166da3acc93bc45efb1684ad3cd..dfc1a6ed9595f3606bd61a552d27856420bbaebf 100644 (file)
@@ -2,7 +2,7 @@
    Unix SMB/CIFS implementation.
    stat cache code
    Copyright (C) Andrew Tridgell 1992-2000
-   Copyright (C) Jeremy Allison 1999-2000
+   Copyright (C) Jeremy Allison 1999-2004
    Copyright (C) Andrew Bartlett <abartlet@samba.org> 2003
    
    This program is free software; you can redistribute it and/or modify
@@ -280,16 +280,11 @@ BOOL stat_cache_lookup(connection_struct *conn, pstring name, pstring dirpath,
        }
 }
 
-/*
- **************************************************************
- *      Compute a hash value based on a string key value.
- *      Make the string key into an array of int's if possible.
- *      For the last few chars that cannot be int'ed, use char instead.
- *      The function returns the bucket index number for the hashed
- *      key.
- *      JRA. Use a djb-algorithm hash for speed.
- **************************************************************
- */
+/***************************************************************
+ Compute a hash value based on a string key value.
+ The function returns the bucket index number for the hashed key.
+ JRA. Use a djb-algorithm hash for speed.
+***************************************************************/
                                                                                                      
 static u32 string_hash(TDB_DATA *key)
 {
@@ -301,14 +296,10 @@ static u32 string_hash(TDB_DATA *key)
         return n;
 }
 
-/*************************************************************************** **
- * Initializes or clears the stat cache.
- *
- *  Input:  none.
- *  Output: none.
- *
- * ************************************************************************** **
- */
+/***************************************************************************
+ Initializes or clears the stat cache.
+**************************************************************************/
+
 BOOL reset_stat_cache( void )
 {
        if (!lp_stat_cache())
@@ -318,10 +309,11 @@ BOOL reset_stat_cache( void )
                tdb_close(tdb_stat_cache);
        }
 
-       /* Create the in-memory tdb. */
-       tdb_stat_cache = tdb_open_log("statcache", 0, TDB_INTERNAL, (O_RDWR|O_CREAT), 0644);
+       /* Create the in-memory tdb using our custom hash function. */
+       tdb_stat_cache = tdb_open_ex("statcache", 0, TDB_INTERNAL,
+                                    (O_RDWR|O_CREAT), 0644, NULL, string_hash);
+
        if (!tdb_stat_cache)
                return False;
-       tdb_set_hash_function(tdb_stat_cache, string_hash);
        return True;
 }
index 0ebbc8b21ebdeca1eb543928026d5b35356fc88c..9a059d459ef2b7363c19440cb35507e4629115a7 100644 (file)
@@ -1689,11 +1689,6 @@ static u32 default_tdb_hash(TDB_DATA *key)
        return (1103515243 * value + 12345);  
 }
 
-void tdb_set_hash_function(TDB_CONTEXT *tdb, tdb_hash_func fn)
-{
-       tdb->hash_fn = fn;
-}
-
 /* open the database, creating it if necessary 
 
    The open_flags and mode are passed straight to the open call on the
@@ -1707,13 +1702,14 @@ void tdb_set_hash_function(TDB_CONTEXT *tdb, tdb_hash_func fn)
 TDB_CONTEXT *tdb_open(const char *name, int hash_size, int tdb_flags,
                      int open_flags, mode_t mode)
 {
-       return tdb_open_ex(name, hash_size, tdb_flags, open_flags, mode, NULL);
+       return tdb_open_ex(name, hash_size, tdb_flags, open_flags, mode, NULL, NULL);
 }
 
 
 TDB_CONTEXT *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
                         int open_flags, mode_t mode,
-                        tdb_log_func log_fn)
+                        tdb_log_func log_fn,
+                        tdb_hash_func hash_fn)
 {
        TDB_CONTEXT *tdb;
        struct stat st;
@@ -1733,7 +1729,7 @@ TDB_CONTEXT *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
        tdb->flags = tdb_flags;
        tdb->open_flags = open_flags;
        tdb->log_fn = log_fn;
-       tdb->hash_fn = default_tdb_hash;
+       tdb->hash_fn = hash_fn ? hash_fn : default_tdb_hash;
 
        if ((open_flags & O_ACCMODE) == O_WRONLY) {
                TDB_LOG((tdb, 0, "tdb_open_ex: can't open tdb %s write-only\n",
index 8f4421d8faa799fbfe26e2e5c7fcd4d14e49684d..c28e10af693d4ad69d58937446f88aa2742d58db 100644 (file)
@@ -114,12 +114,12 @@ TDB_CONTEXT *tdb_open(const char *name, int hash_size, int tdb_flags,
                      int open_flags, mode_t mode);
 TDB_CONTEXT *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
                         int open_flags, mode_t mode,
-                        tdb_log_func log_fn);
+                        tdb_log_func log_fn,
+                        tdb_hash_func hash_fn);
 
 int tdb_reopen(TDB_CONTEXT *tdb);
 int tdb_reopen_all(void);
 void tdb_logging_function(TDB_CONTEXT *tdb, tdb_log_func);
-void tdb_set_hash_function(TDB_CONTEXT *tdb, tdb_hash_func);
 enum TDB_ERROR tdb_error(TDB_CONTEXT *tdb);
 const char *tdb_errorstr(TDB_CONTEXT *tdb);
 TDB_DATA tdb_fetch(TDB_CONTEXT *tdb, TDB_DATA key);
index 09e55e2e70276a390a79b8439b5961e1c83b618a..e57eccfe59812967da055d931bc5e7fa1bed852e 100644 (file)
@@ -740,7 +740,7 @@ TDB_CONTEXT *tdb_open_log(const char *name, int hash_size, int tdb_flags,
                tdb_flags |= TDB_NOMMAP;
 
        tdb = tdb_open_ex(name, hash_size, tdb_flags, 
-                                   open_flags, mode, tdb_log);
+                                   open_flags, mode, tdb_log, NULL);
        if (!tdb)
                return NULL;