gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r3339 - in GNUnet: . src/applications/kvstore_sqlite src/ut


From: grothoff
Subject: [GNUnet-SVN] r3339 - in GNUnet: . src/applications/kvstore_sqlite src/util/config_impl
Date: Sun, 27 Aug 2006 15:51:21 -0700 (PDT)

Author: grothoff
Date: 2006-08-27 15:51:18 -0700 (Sun, 27 Aug 2006)
New Revision: 3339

Modified:
   GNUnet/src/applications/kvstore_sqlite/kv_sqlite.c
   GNUnet/src/util/config_impl/impl.c
   GNUnet/todo
Log:
fixing kvstore

Modified: GNUnet/src/applications/kvstore_sqlite/kv_sqlite.c
===================================================================
--- GNUnet/src/applications/kvstore_sqlite/kv_sqlite.c  2006-08-27 22:13:36 UTC 
(rev 3338)
+++ GNUnet/src/applications/kvstore_sqlite/kv_sqlite.c  2006-08-27 22:51:18 UTC 
(rev 3339)
@@ -22,7 +22,7 @@
  * @file applications/kvstore_sqlite/kv_sqlite.c
  * @brief SQLite based implementation of the kvstore service
  * @author Nils Durner
- *
+ * @author Christian Grothoff
  * @todo Indexes, statistics
  * 
  * Database: SQLite
@@ -41,66 +41,75 @@
  * a failure of the command 'cmd' with the message given
  * by strerror(errno).
  */
-#define DIE_SQLITE(cmd) do { GE_LOG(ectx, GE_FATAL | GE_ADMIN | GE_BULK, 
_("`%s' failed at %s:%d with error: %s\n"), cmd, __FILE__, __LINE__, 
sqlite3_errmsg(dbh->dbh)); abort(); } while(0);
+#define DIE_SQLITE(dbh, cmd) do { GE_LOG(ectx, GE_FATAL | GE_ADMIN | GE_BULK, 
_("`%s' failed at %s:%d with error: %s\n"), cmd, __FILE__, __LINE__, 
sqlite3_errmsg(dbh)); abort(); } while(0);
 
 /**
  * Log an error message at log-level 'level' that indicates
  * a failure of the command 'cmd' on file 'filename'
  * with the message given by strerror(errno).
  */
-#define LOG_SQLITE(level, cmd) do { GE_LOG(ectx, GE_ERROR | GE_ADMIN | 
GE_BULK, _("`%s' failed at %s:%d with error: %s\n"), cmd, __FILE__, __LINE__, 
sqlite3_errmsg(dbh->dbh)); } while(0);
+#define LOG_SQLITE(dbh, level, cmd) do { GE_LOG(ectx, GE_ERROR | GE_ADMIN | 
GE_BULK, _("`%s' failed at %s:%d with error: %s\n"), cmd, __FILE__, __LINE__, 
sqlite3_errmsg(dbh)); } while(0);
 
-static CoreAPIForApplication * coreAPI;
-
-static struct GE_Context * ectx;
-
 /**
  * @brief Wrapper for SQLite
  */
 typedef struct {
-  /* Native SQLite database handle - may not be shared between threads! */
-  sqlite3 *dbh;
-  /* Thread ID owning this handle */
+
+  /**
+   * Native SQLite database handle - may not be shared between threads! 
+   */
+  sqlite3 * dbh;
+
+  /**
+   * Thread ID owning this handle 
+   */
   struct PTHREAD * tid;
-  /* Synchronized access to sqlite */
-  struct MUTEX * DATABASE_Lock_;
+
 } sqliteHandle;
 
 /**
  * @brief Information about the database
  */
 typedef struct {
-  struct MUTEX * DATABASE_Lock_;
 
-  /** name of the database */
-  char *name;  
+  /**
+   * bytes used 
+   */
+  double payload;
 
-  /** filename of this database */
-  char *fn;
+  /** 
+   * name of the database 
+   */
+  char * name;  
 
-  /** bytes used */
-  double payload;
+  /**
+   * filename of this database 
+   */
+  char * fn;
 
-  unsigned int lastSync;
-  
-  /* Open handles */
+  /**
+   * List of open handles 
+   */
+  sqliteHandle ** handles;  
+
+  /**
+   * Open handles (one per thread)
+   */
   unsigned int handle_count;
   
-  /* List of open handles */
-  sqliteHandle *handles;  
-
- /* Is database closed? */
- int closed;
+  unsigned int lastSync;
+  
 } sqliteDatabase;
 
+static CoreAPIForApplication * coreAPI;
 
-static unsigned int databases = 0;
+static struct GE_Context * ectx;
 
-static sqliteDatabase *dbs;
+static unsigned int databases;
 
-static sqliteHandle *getDBHandle(const char *name);
+static sqliteDatabase ** dbs;
 
-static struct MUTEX * databasesLock;
+static struct MUTEX * lock;
 
 /**
  * @brief Encode a binary buffer "in" of size n bytes so that it contains
@@ -129,7 +138,6 @@
     }
     out++;
   }
-
   return (int) (out - start);
 }
 
@@ -162,58 +170,63 @@
  * @brief Prepare a SQL statement
  */
 static int sq_prepare(sqliteHandle *dbh,
-          const char *zSql,       /* SQL statement, UTF-8 encoded */
-          sqlite3_stmt **ppStmt) {  /* OUT: Statement handle */
+                     const char *zSql,       /* SQL statement, UTF-8 encoded */
+                     sqlite3_stmt **ppStmt) {  /* OUT: Statement handle */
   char * dummy;
+
   return sqlite3_prepare(dbh->dbh,
-       zSql,
-       strlen(zSql),
-       ppStmt,
-       (const char**) &dummy);
+                        zSql,
+                        strlen(zSql),
+                        ppStmt,
+                        (const char**) &dummy);
 }
 
 /**
- * @brief Create new database structure
+ * Get path to database file 
  */
-static void new_db(sqliteDatabase *db, 
-                  const char *name) {
-  char *dir;
+static char * getDBFileName(const char * name) {
+  char * dir;
+  char * fn;
   size_t mem;
   
-  memset(db, sizeof(sqliteDatabase), 0);
-  
-  db->DATABASE_Lock_ = MUTEX_CREATE(NO);
-  
-  /* Get path to database file */
   GC_get_configuration_value_filename(coreAPI->cfg,
                                      "KEYVALUE_DATABASE", 
                                      "DIR",
                                      VAR_DAEMON_DIRECTORY "/kvstore/",
                                      &dir);
-  mem = strlen(dir) + strlen(name) + 5;
-  db->fn = (char *) MALLOC(mem);
-  SNPRINTF(db->fn, 
+  disk_directory_create(ectx, dir);
+  mem = strlen(dir) + strlen(name) + 6;
+  fn = MALLOC(mem);
+  SNPRINTF(fn, 
           mem,
           "%s/%s.dat",
           dir, 
           name);
-  FREE(dir);  
-  db->name = STRDUP(name);
+  FREE(dir);
+  return fn;
 }
 
 /**
  * @brief Get information about an open database
  * @param name the name of the database
  */
-static sqliteDatabase *getDB(const char *name)
-{
+static sqliteDatabase * getDB(const char *name) {
   unsigned int idx;
+  sqliteDatabase * db;
   
-  for(idx = 0; idx < databases; idx++)
-    if (!dbs[idx].closed && strcmp(dbs[idx].name, name) == 0)
-      return dbs + idx;
-
-  return NULL;
+  for (idx = 0; idx < databases; idx++)
+    if (0 == strcmp(dbs[idx]->name, name))
+      return dbs[idx];
+  db = MALLOC(sizeof(sqliteDatabase));
+  memset(db,
+        0, 
+        sizeof(sqliteDatabase));
+  db->fn = getDBFileName(name);
+  db->name = STRDUP(name);
+  APPEND(dbs,
+        databases,
+        db);
+  return db;
 }
 
 /**
@@ -223,60 +236,42 @@
  *       We therefore (re)open the database in each thread.
  * @return the native SQLite database handle
  */
-static sqliteHandle *getDBHandle(const char *name) {
+static sqliteHandle * getDBHandle(const char *name) {
   unsigned int idx;
-  sqliteHandle *dbh = NULL;
-  sqliteDatabase *db = NULL;
+  sqliteHandle * dbh;
+  sqliteDatabase * db;
   
-  MUTEX_LOCK(databasesLock);
-  
-  /* Is database already open? */
+  MUTEX_LOCK(lock);  
   db = getDB(name);  
-  if (db == NULL)
-  {
-    GROW(dbs, databases, databases + 1);
-    db = dbs + databases - 1;
-    
-    new_db(db, name);
-  }
-
-  MUTEX_UNLOCK(databasesLock);
-  MUTEX_LOCK(db->DATABASE_Lock_);
-  
-  /* Was it opened by this thread? */
   for (idx = 0; idx < db->handle_count; idx++)
-    if (PTHREAD_TEST_SELF(db->handles[idx].tid)) {
-      dbh = db->handles + idx;
-      break;
+    if (PTHREAD_TEST_SELF(db->handles[idx]->tid)) {
+      sqliteHandle * ret = db->handles[idx]; 
+      MUTEX_UNLOCK(lock);
+      return ret;
     }
-  
-  if (idx == db->handle_count) {
-    /* we haven't opened the DB for this thread yet */
-    GROW(db->handles,
-        db->handle_count,
-        db->handle_count + 1);
-    dbh = db->handles + db->handle_count - 1;
-    dbh->tid = PTHREAD_GET_SELF();
-    dbh->DATABASE_Lock_ = db->DATABASE_Lock_;
-
-    /* Open database */
-    if (sqlite3_open(db->fn, &dbh->dbh) != SQLITE_OK) {
-      GE_LOG(ectx, GE_ERROR | GE_BULK | GE_USER,
-          _("Unable to initialize SQLite KVStore.\n"));
-      
-      FREE(db->fn);
-      FREE(db);
-      return NULL;
-    }
-
-    sqlite3_exec(dbh->dbh, "PRAGMA temp_store=MEMORY", NULL, NULL, NULL);
-    sqlite3_exec(dbh->dbh, "PRAGMA synchronous=OFF", NULL, NULL, NULL);
-    sqlite3_exec(dbh->dbh, "PRAGMA count_changes=OFF", NULL, NULL, NULL);
-    sqlite3_exec(dbh->dbh, "PRAGMA page_size=4096", NULL, NULL, NULL);
+  /* we haven't opened the DB for this thread yet */
+  dbh = MALLOC(sizeof(sqliteHandle));
+  dbh->tid = PTHREAD_GET_SELF();
+  if (sqlite3_open(db->fn, 
+                  &dbh->dbh) != SQLITE_OK) {
+    printf("FN: %s\n", db->fn);
+    LOG_SQLITE(dbh->dbh,              
+              GE_ERROR | GE_BULK | GE_USER,
+              "sqlite3_open");
+    sqlite3_close(dbh->dbh);
+    MUTEX_UNLOCK(lock);
+    PTHREAD_REL_SELF(dbh->tid);
+    FREE(dbh);
+    return NULL;
   }
-
-  MUTEX_UNLOCK(db->DATABASE_Lock_);
-
+  APPEND(db->handles,
+        db->handle_count,
+        dbh);
+  sqlite3_exec(dbh->dbh, "PRAGMA temp_store=MEMORY", NULL, NULL, NULL);
+  sqlite3_exec(dbh->dbh, "PRAGMA synchronous=OFF", NULL, NULL, NULL);
+  sqlite3_exec(dbh->dbh, "PRAGMA count_changes=OFF", NULL, NULL, NULL);
+  sqlite3_exec(dbh->dbh, "PRAGMA page_size=4096", NULL, NULL, NULL);
+  MUTEX_UNLOCK(lock);
   return dbh;
 }
 
@@ -284,55 +279,46 @@
   unsigned int idx;
 
   for (idx = 0; idx < db->handle_count; idx++) {
-    sqliteHandle * dbh = db->handles + idx;
+    sqliteHandle * dbh = db->handles[idx];
     PTHREAD_REL_SELF(dbh->tid);
     if (sqlite3_close(dbh->dbh) != SQLITE_OK)
-      LOG_SQLITE(LOG_ERROR, 
+      LOG_SQLITE(dbh->dbh,
+                LOG_ERROR, 
                 "sqlite_close");
+    FREE(dbh);
   }
-  FREE(db->handles);
-  db->handle_count = 0;
-
-  MUTEX_DESTROY(db->DATABASE_Lock_);
+  GROW(db->handles,
+       db->handle_count,
+       0);
   FREE(db->fn);
   FREE(db->name);
-
-  db->closed = 1;
-}
-
-static void shutdown_database(sqliteDatabase *db)
-{
   FREE(db);
 }
 
-static void sqlite_shutdown() {
-  unsigned int idx;
-  
-#if DEBUG_SQLITE
-  GE_LOG(ectx, GE_DEBUG | GE_REQUEST | GE_USER, "SQLite KVStore: closing 
database\n");
-#endif
-
-  for (idx = 0; idx < databases; idx++)
-    if (!dbs[idx].closed)
-    {
-      close_database(dbs + idx);
-      shutdown_database(dbs + idx);
-    }
-  
-  GROW(dbs, databases, 0);
-}
-
 /**
  * @brief Delete the database.
  */
-static void dropDatabase(const char *name) {
-  sqliteDatabase *db = getDB(name);
-
-  char *fn = STRDUP(db->fn);
-  close_database(db);
+static void dropDatabase(const char * name) { 
+  sqliteDatabase * db; 
+  unsigned int idx;
+  char * fn;
+  
+  MUTEX_LOCK(lock);
+  for (idx = 0; idx < databases; idx++) {
+    if (0 == strcmp(dbs[idx]->name, name)) {
+      db = dbs[idx];
+      close_database(db);
+      dbs[idx] = dbs[databases-1];
+      GROW(dbs,
+          databases,
+          databases - 1);
+      break;
+    }
+  }
+  fn = getDBFileName(name);
   UNLINK(fn);
   FREE(fn);
-  db->closed = 1;
+  MUTEX_UNLOCK(lock);
 }
 
 /**
@@ -340,33 +326,36 @@
  * @param table the name of the Key/Value-Table
  * @return a handle
  */
-static KVHandle *getTable(const char *database, const char *table)
-{
+static KVHandle *getTable(const char *database, 
+                         const char *table) {
   sqlite3_stmt *stmt;
   unsigned int len;
   KVHandle *ret;
   sqliteHandle *dbh;
   char *idx;
   
-  dbh = getDBHandle(database);
-  MUTEX_LOCK(dbh->DATABASE_Lock_);
-  
-  sq_prepare(dbh, "Select 1 from sqlite_master where tbl_name = ?",
-       &stmt);
+  dbh = getDBHandle(database);  
+  if (dbh == NULL)
+    return NULL;
+  sq_prepare(dbh, 
+            "Select 1 from sqlite_master where tbl_name = ?",
+            &stmt);
   len = strlen(table);
   sqlite3_bind_text(stmt, 1, table, len, SQLITE_STATIC);
-  if (sqlite3_step(stmt) == SQLITE_DONE)
-  {
+  if (sqlite3_step(stmt) == SQLITE_DONE) {
     char *create = malloc(len + 58);
     
-    sprintf(create, "CREATE TABLE %s (gn_key BLOB, gn_val BLOB, gn_age 
BIGINT)", table);
+    sprintf(create,
+           "CREATE TABLE %s (gn_key BLOB, gn_val BLOB, gn_age BIGINT)", 
+           table);
     
     if (sqlite3_exec(dbh->dbh, create, NULL, NULL, NULL) != SQLITE_OK)
     {
-      LOG_SQLITE(LOG_ERROR, "sqlite_create");
+      LOG_SQLITE(dbh->dbh,
+                LOG_ERROR, 
+                "sqlite_create");
       sqlite3_finalize(stmt);
       free(create);
-      MUTEX_UNLOCK(dbh->DATABASE_Lock_);
       return NULL;
     }
     
@@ -376,11 +365,11 @@
 
   /* FIXME: more indexes */
   idx = (char *) malloc(len + 34);
-  sprintf(idx, "CREATE INDEX idx_key ON %s (gn_key)", table);
+  sprintf(idx, 
+         "CREATE INDEX idx_key ON %s (gn_key)",
+         table);
   sqlite3_exec(dbh->dbh, idx, NULL, NULL, NULL);
   
-  MUTEX_UNLOCK(dbh->DATABASE_Lock_);
-
   ret = MALLOC(sizeof(KVHandle));
   ret->table = STRDUP(table);
   ret->db = STRDUP(database);
@@ -398,9 +387,13 @@
  * @param handler callback function to be called for every result (may be NULL)
  * @param closure optional parameter for handler
  */
-static void *get(KVHandle *kv, void *key, int keylen, unsigned int sort,
-  unsigned int limit, KVCallback handler, void *closure)
-{
+static void *get(KVHandle *kv,
+                void *key,
+                int keylen, 
+                unsigned int sort,
+                unsigned int limit, 
+                KVCallback handler, 
+                void *closure) {
   unsigned int len, enclen, retlen;
   char *sel, *order, *where, limit_spec[30];
   sqlite3_stmt *stmt;
@@ -409,6 +402,9 @@
   unsigned char *key_enc;
   void *ret_dec;
   
+  dbh = getDBHandle(kv->db);
+  if (dbh == NULL)
+    return NULL;
   ret = NULL;
   ret_dec = NULL;
  
@@ -446,11 +442,13 @@
   else
     *limit_spec = 0;
   
-  sprintf(sel, "SELECT gn_val FROM %s %s %s %s", kv->table, where, order, 
limit_spec);
+  sprintf(sel,
+         "SELECT gn_val FROM %s %s %s %s",
+         kv->table,
+         where, 
+         order,
+         limit_spec);
   
-  dbh = getDBHandle(kv->db);
-  MUTEX_LOCK(dbh->DATABASE_Lock_);
-
   sq_prepare(dbh, sel, &stmt);
   if (key)
     sqlite3_bind_blob(stmt, 1, key_enc, enclen, SQLITE_STATIC);
@@ -472,20 +470,14 @@
         FREE(sel);
        FREENONNULL(key_enc);
         FREE(ret_dec);
-        MUTEX_UNLOCK(dbh->DATABASE_Lock_);
         sqlite3_finalize(stmt);
         
         return ret;      
       }
-  }
-  
+  }  
   sqlite3_finalize(stmt);
-
-  MUTEX_UNLOCK(dbh->DATABASE_Lock_);
-  
   FREE(sel);
-  FREENONNULL(key_enc);
-  
+  FREENONNULL(key_enc);  
   return ret_dec;
 }
 
@@ -509,10 +501,15 @@
   unsigned char *key_enc, *val_enc;
   unsigned int keyenc_len, valenc_len;
  
+  dbh = getDBHandle(kv->db);
+  if (dbh == NULL)
+    return SYSERR;
   len = strlen(kv->table); 
   ins = MALLOC(len + 68);
   
-  sprintf(ins, "INSERT INTO %s(gn_key, gn_val, gn_age) values (?, ?, ?)", 
kv->table);
+  sprintf(ins, 
+         "INSERT INTO %s(gn_key, gn_val, gn_age) values (?, ?, ?)",
+         kv->table);
   
   key_enc = MALLOC(keylen * 2);
   keyenc_len = sqlite_encode_binary(key, keylen, key_enc);
@@ -520,9 +517,6 @@
   val_enc = MALLOC(vallen * 2);
   valenc_len = sqlite_encode_binary(val, vallen, val_enc);
 
-  dbh = getDBHandle(kv->db);
-  MUTEX_LOCK(dbh->DATABASE_Lock_);
-
   sq_prepare(dbh, ins, &stmt);
   sqlite3_bind_blob(stmt, 1, key_enc, keyenc_len, SQLITE_STATIC);
   sqlite3_bind_blob(stmt, 2, val_enc, valenc_len, SQLITE_STATIC);
@@ -532,17 +526,13 @@
     FREE(ins);
     FREE(key_enc);
     FREE(val_enc);
-    LOG_SQLITE(LOG_ERROR, "put");
-    MUTEX_UNLOCK(dbh->DATABASE_Lock_);
-    sqlite3_finalize(stmt);
-    
+    LOG_SQLITE(dbh->dbh,
+              LOG_ERROR,
+              "put");
+    sqlite3_finalize(stmt);    
     return SYSERR;
-  }
-  
+  }  
   sqlite3_finalize(stmt);
-
-  MUTEX_UNLOCK(dbh->DATABASE_Lock_);
-  
   FREE(ins);
   FREE(key_enc);
   FREE(val_enc);
@@ -566,7 +556,11 @@
   sqliteHandle *dbh;
   unsigned char *keyenc;
   unsigned int keyenc_len;
- 
+
+  dbh = getDBHandle(kv->db);
+  if (dbh == NULL)
+    return SYSERR;
+
   len = strlen(kv->table); 
   del = MALLOC(len + 52);
   bind = 1;
@@ -586,12 +580,8 @@
   keyenc = MALLOC(keylen * 2);
   keyenc_len = sqlite_encode_binary(key, keylen, keyenc);
 
-  dbh = getDBHandle(kv->db);
-  MUTEX_LOCK(dbh->DATABASE_Lock_);
-
   sq_prepare(dbh, del, &stmt);
-  if (key)
-  {
+  if (key) {
     sqlite3_bind_blob(stmt, 1, keyenc, keyenc_len, SQLITE_STATIC);
     bind++;
   }
@@ -603,17 +593,13 @@
   {
     FREE(del);
     FREE(keyenc);
-    LOG_SQLITE(LOG_ERROR, "delete");
-    MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+    LOG_SQLITE(dbh->dbh,
+              LOG_ERROR, "delete");
     sqlite3_finalize(stmt);
     
     return SYSERR;      
-  }
-  
+  }  
   sqlite3_finalize(stmt);
-
-  MUTEX_UNLOCK(dbh->DATABASE_Lock_);
-  
   FREE(del);
   FREE(keyenc);
   
@@ -624,8 +610,7 @@
  * @brief Close a handle to a Key/Value-Table
  * @param kv the handle to close
  */
-static void closeTable(KVHandle *kv)
-{
+static void closeTable(KVHandle *kv) {
   FREE(kv->table);
   FREE(kv->db);
 }
@@ -639,33 +624,24 @@
 {
   sqlite3_stmt *stmt;
   sqliteHandle *dbh;
+  char * drop;
 
-  char *drop = (void *) MALLOC(12 + strlen(kv->table));
-  
-  sprintf(drop, "DROP TABLE %s", kv->table);
   dbh = getDBHandle(kv->db);
-  MUTEX_LOCK(dbh->DATABASE_Lock_);
-
+  if (dbh == NULL)
+    return SYSERR;
+  drop = MALLOC(12 + strlen(kv->table));
+  sprintf(drop, "DROP TABLE %s", kv->table);
   sq_prepare(dbh, drop, &stmt);
-
-  if (sqlite3_step(stmt) != SQLITE_DONE)
-  {
+  if (sqlite3_step(stmt) != SQLITE_DONE) {
     FREE(drop);
-    LOG_SQLITE(LOG_ERROR, "drop");
-    MUTEX_UNLOCK(dbh->DATABASE_Lock_);
-    sqlite3_finalize(stmt);
-    
+    LOG_SQLITE(dbh->dbh,
+              LOG_ERROR, "drop");
+    sqlite3_finalize(stmt);    
     return SYSERR;
-  }
-  
+  }  
   sqlite3_finalize(stmt);
-
-  MUTEX_UNLOCK(dbh->DATABASE_Lock_);
-
-  FREE(drop);
-  
+  FREE(drop);  
   closeTable(kv);
-
   return OK;
 }
 
@@ -677,10 +653,10 @@
 #if DEBUG_SQLITE
   GE_LOG(ectx, 
         GE_DEBUG | GE_REQUEST | GE_USER,
-        "SQLite: initializing database\n");
+        "KV-SQLite: initializing database\n");
 #endif
 
-  databasesLock = MUTEX_CREATE(NO);
+  lock = MUTEX_CREATE(NO);
   coreAPI = capi;
   api.closeTable = &closeTable;
   api.del = &del;
@@ -696,14 +672,19 @@
  * Shutdown the module.
  */
 void release_module_kvstore_sqlite() {
-  sqlite_shutdown();
+  unsigned int idx;
+
+  for (idx = 0; idx < databases; idx++) 
+    close_database(dbs[idx]);  
+  GROW(dbs, databases, 0);
+
 #if DEBUG_SQLITE
   GE_LOG(ectx,
         GE_DEBUG | GE_REQUEST | GE_USER,
         "SQLite KVStore: database shutdown\n");
 #endif
 
-  MUTEX_DESTROY(databasesLock);
+  MUTEX_DESTROY(lock);
   coreAPI = NULL;
 }
 

Modified: GNUnet/src/util/config_impl/impl.c
===================================================================
--- GNUnet/src/util/config_impl/impl.c  2006-08-27 22:13:36 UTC (rev 3338)
+++ GNUnet/src/util/config_impl/impl.c  2006-08-27 22:51:18 UTC (rev 3339)
@@ -649,26 +649,29 @@
   if (orig[i] == '\0')
     return orig;
   orig[i] = '\0';
-  _get_configuration_value_string(cfg,
-                                 section,
-                                 &orig[1],
-                                 NULL,
-                                 &prefix);
-  if (prefix == NULL)
-    _get_configuration_value_string(cfg,
-                                   "",
-                                   &orig[1],
-                                   NULL,
-                                   &prefix);
-  if (prefix == NULL) {
-    const char * env = getenv(&orig[1]);
-    if (env != NULL)
-      prefix = STRDUP(env);
+  prefix = NULL;
+  if (0 != _get_configuration_value_string(cfg,
+                                          section,
+                                          &orig[1],
+                                          "",
+                                          &prefix)) {
+    FREE(prefix);
+    if (0 != _get_configuration_value_string(cfg,
+                                            "",
+                                            &orig[1],
+                                            "",
+                                            &prefix)) {
+      const char * env = getenv(&orig[1]);
+
+      FREE(prefix);
+      if (env != NULL) {
+       prefix = STRDUP(env);
+      } else {
+       orig[i] = DIR_SEPARATOR;
+       return orig;
+      }
+    }
   }
-  if (prefix == NULL) {
-    orig[i] = DIR_SEPARATOR;
-    return orig;
-  }
   result = MALLOC(strlen(prefix) +
                   strlen(&orig[i+1]) + 2);
   strcpy(result, prefix);

Modified: GNUnet/todo
===================================================================
--- GNUnet/todo 2006-08-27 22:13:36 UTC (rev 3338)
+++ GNUnet/todo 2006-08-27 22:51:18 UTC (rev 3339)
@@ -21,7 +21,6 @@
     + use new loggers in for CS error reporting
   * make testcases compile & pass again:
     + session -- compiles, but fails (peers do not connect!)
-    + kvstore_sqlite -- compiles, but fails!
     + gap
     + fs/ecrs
     + fs/namespace





reply via email to

[Prev in Thread] Current Thread [Next in Thread]