gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r2377 - in GNUnet/src/applications: sqstore_mysql sqstore_s


From: grothoff
Subject: [GNUnet-SVN] r2377 - in GNUnet/src/applications: sqstore_mysql sqstore_sqlite
Date: Fri, 23 Dec 2005 11:32:22 -0800 (PST)

Author: grothoff
Date: 2005-12-23 11:32:20 -0800 (Fri, 23 Dec 2005)
New Revision: 2377

Modified:
   GNUnet/src/applications/sqstore_mysql/mysql.c
   GNUnet/src/applications/sqstore_sqlite/sqlite.c
Log:
trying to make DBs self-repair

Modified: GNUnet/src/applications/sqstore_mysql/mysql.c
===================================================================
--- GNUnet/src/applications/sqstore_mysql/mysql.c       2005-12-22 20:09:50 UTC 
(rev 2376)
+++ GNUnet/src/applications/sqstore_mysql/mysql.c       2005-12-23 19:32:20 UTC 
(rev 2377)
@@ -208,7 +208,8 @@
  *
  */
 static Datastore_Datum * assembleDatum(MYSQL_RES * res,
-                                      MYSQL_ROW sql_row) {
+                                      MYSQL_ROW sql_row,
+                                      mysqlHandle * dbhI) {
   Datastore_Datum * datum;
   int contentSize;
   unsigned long * lens;
@@ -228,8 +229,25 @@
        (sscanf(sql_row[2], "%u", &prio) != 1) ||
        (sscanf(sql_row[3], "%u", &level) != 1) ||
        (SSCANF(sql_row[4], "%llu", &exp) != 1) ) {
-    LOG(LOG_WARNING,
-       "SQL Database corrupt, ignoring result.\n");
+    mysql_free_result(res);
+    if ( (lens[5] != sizeof(HashCode512)) ||
+        (lens[6] != contentSize) ) {
+      char scratch[512];
+
+      LOG(LOG_WARNING,
+         _("Invalid data in %s.  Trying to fix (by deletion).\n"),
+         _("mysql datastore"));
+      SNPRINTF(scratch, 
+              512,
+              "DELETE FROM gn070 WHERE NOT ((LENGTH(hash)=%u) AND (size=%u + 
LENGTH(value)))",
+              sizeof(HashCode512),
+              sizeof(Datastore_Value));
+      if (0 != mysql_query(dbhI->dbf, scratch))
+       LOG_MYSQL(LOG_ERROR, "mysql_query", dbhI);
+    } else {
+      BREAK(); /* should really never happen */
+    }
+
     return NULL;
   }
 
@@ -533,11 +551,12 @@
 
   while ((sql_row=mysql_fetch_row(sql_res))) {
     datum = assembleDatum(sql_res,
-                         sql_row);
+                         sql_row,
+                         &dbhI);
     if (datum == NULL) {
-      LOG(LOG_WARNING,
-         _("Invalid data in MySQL database.  Please verify integrity!\n"));
-      continue;
+      MUTEX_UNLOCK(&dbhI.DATABASE_Lock_);
+      iclose(&dbhI);
+      return count;
     }
     if ( (iter != NULL) &&
         (SYSERR == iter(&datum->key, &datum->value, closure) ) ) {
@@ -555,9 +574,7 @@
     MUTEX_UNLOCK(&dbhI.DATABASE_Lock_);
     iclose(&dbhI);
     return SYSERR;
-  }
-
-               
+  }            
   mysql_free_result(sql_res);
   MUTEX_UNLOCK(&dbhI.DATABASE_Lock_);
   iclose(&dbhI);
@@ -630,11 +647,12 @@
 
   while ((sql_row=mysql_fetch_row(sql_res))) {
     datum = assembleDatum(sql_res,
-                         sql_row);
+                         sql_row,
+                         &dbhI);
     if (datum == NULL) {
-      LOG(LOG_WARNING,
-         _("Invalid data in MySQL database.  Please verify integrity!\n"));
-      continue;
+      MUTEX_UNLOCK(&dbhI.DATABASE_Lock_);
+      iclose(&dbhI);
+      return count;
     }
     if ( (iter != NULL) &&
         (SYSERR == iter(&datum->key, &datum->value, closure) ) ) {
@@ -782,10 +800,10 @@
   }
   if (mysql_stmt_store_result(stmt)) {
     LOG(LOG_ERROR,
-               _("`%s' failed at %s:%d with error: %s\n"),
-               "mysql_stmt_store_result",
-               __FILE__, __LINE__,
-               mysql_stmt_error(stmt));
+       _("`%s' failed at %s:%d with error: %s\n"),
+       "mysql_stmt_store_result",
+       __FILE__, __LINE__,
+       mysql_stmt_error(stmt));
     MUTEX_UNLOCK(&dbh->DATABASE_Lock_);
     FREE(datum);
     return SYSERR;
@@ -793,29 +811,33 @@
   datasize = MAX_DATUM_SIZE;
   count = 0;
   while (0 == mysql_stmt_fetch(stmt)) {
-    count++;
+    if ( (twenty != sizeof(HashCode512)) ||
+        (datasize != size - sizeof(Datastore_Value)) ) {
+      char scratch[512];
 
-    if (twenty != sizeof(HashCode512)) {
-      BREAK();
+      mysql_free_result(sql_res); 
       LOG(LOG_WARNING,
-         _("Invalid data in MySQL database.  Please verify integrity!\n"));
-      twenty = sizeof(HashCode512);
-      datasize = MAX_DATUM_SIZE;
-      continue;
+         _("Invalid data in %s.  Trying to fix (by deletion).\n"),
+         _("mysql datastore"));
+      SNPRINTF(scratch, 
+              512,
+              "DELETE FROM gn070 WHERE NOT ((LENGTH(hash)=%u) AND (size=%u + 
LENGTH(value)))",
+              sizeof(HashCode512),
+              sizeof(Datastore_Value));
+      if (0 != mysql_query(dbh->dbf, scratch))
+       LOG_MYSQL(LOG_ERROR, "mysql_query", dbh);
+      
+      FREE(datum);
+      MUTEX_UNLOCK(&dbh->DATABASE_Lock_);
+      return count;
     }
+    count++;
     if (iter != NULL) {
       datum->size = htonl(size);
       datum->type = htonl(rtype);
       datum->prio = htonl(prio);
       datum->anonymityLevel = htonl(level);
       datum->expirationTime = htonll(expiration);
-      if (datasize != size - sizeof(Datastore_Value)) {
-       BREAK();
-       LOG(LOG_WARNING,
-           _("Invalid data in MySQL database.  Please verify integrity!\n"));
-       datasize = MAX_DATUM_SIZE;
-       continue;
-      }
 #if DEBUG_MYSQL
       LOG(LOG_DEBUG,
          "Found in database block with type %u.\n",

Modified: GNUnet/src/applications/sqstore_sqlite/sqlite.c
===================================================================
--- GNUnet/src/applications/sqstore_sqlite/sqlite.c     2005-12-22 20:09:50 UTC 
(rev 2376)
+++ GNUnet/src/applications/sqstore_sqlite/sqlite.c     2005-12-23 19:32:20 UTC 
(rev 2377)
@@ -265,13 +265,42 @@
   contentSize = sqlite3_column_int(stmt, 0) - sizeof(Datastore_Value);
 
   if (contentSize < 0) {
+    sqlite3_stmt * stmt;
+
+    LOG(LOG_WARNING,
+       _("Invalid data in %s.  Trying to fix (by deletion).\n"),
+       _("sqlite datastore"));
+    if (sq_prepare("DELETE FROM gn070 WHERE size < ?", &stmt) == SQLITE_OK) {
+      sqlite3_bind_int(stmt,
+                      1,
+                      sizeof(Datastore_Value));
+      sqlite3_step(stmt);
+      sqlite3_finalize(stmt);
+    } else
+      LOG_SQLITE(LOG_ERROR, "sq_prepare");
     return NULL; /* error */
   }
 
   if (sqlite3_column_bytes(stmt, 5) != sizeof(HashCode512) ||
       sqlite3_column_bytes(stmt, 6) != contentSize) {
+    sqlite3_stmt * stmt;
+
     LOG(LOG_WARNING,
-       _("SQL Database corrupt, ignoring result.\n"));
+       _("Invalid data in %s.  Trying to fix (by deletion).\n"),
+       _("sqlite datastore"));
+    if (sq_prepare("DELETE FROM gn070 WHERE NOT ((LENGTH(hash) = ?) AND (size 
= LENGTH(value) + ?))", 
+                   &stmt) == SQLITE_OK) {
+      sqlite3_bind_int(stmt,
+                      1,
+                      sizeof(HashCode512));
+      sqlite3_bind_int(stmt,
+                      2,
+                      sizeof(Datastore_Value));
+      sqlite3_step(stmt);
+      sqlite3_finalize(stmt);
+    } else
+      LOG_SQLITE(LOG_ERROR, "sq_prepare");
+
     return NULL;
   }
 
@@ -348,8 +377,8 @@
                      key,
                      strlen(key),
                      SQLITE_STATIC);
-               sqlite3_step(stmt);
-               sqlite3_finalize(stmt);
+    sqlite3_step(stmt);
+    sqlite3_finalize(stmt);
   }
 
   if (sq_prepare("INSERT INTO gn070(hash, anonLevel, type) VALUES (?, ?, ?)",
@@ -490,11 +519,8 @@
       datum = assembleDatum(stmt);
       sqlite3_reset(stmt);
 
-      if (datum == NULL) {
-       LOG(LOG_WARNING,
-           _("Invalid data in database.  Please verify integrity!\n"));
-       continue;
-      }
+      if (datum == NULL) 
+       continue;      
 #if 0
       printf("FOUND %4u prio %4u exp %20llu old: %4u, %20llu\n",
             (ntohl(datum->value.size) - sizeof(Datastore_Value)),
@@ -686,11 +712,8 @@
       if (iter != NULL) {
        datum = assembleDatum(stmt);
        
-       if (datum == NULL) {
-         LOG(LOG_WARNING,
-             _("Invalid data in database.  Please verify integrity!\n"));
+       if (datum == NULL) 
          continue;
-       }
 
 #if DEBUG_SQLITE
        LOG(LOG_DEBUG,





reply via email to

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