gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r5155 - GNUnet/src/applications/sqstore_mysql


From: gnunet
Subject: [GNUnet-SVN] r5155 - GNUnet/src/applications/sqstore_mysql
Date: Wed, 27 Jun 2007 23:30:07 -0600 (MDT)

Author: grothoff
Date: 2007-06-27 23:30:07 -0600 (Wed, 27 Jun 2007)
New Revision: 5155

Modified:
   GNUnet/src/applications/sqstore_mysql/mysql.c
Log:
trying to fix 1239:


Modified: GNUnet/src/applications/sqstore_mysql/mysql.c
===================================================================
--- GNUnet/src/applications/sqstore_mysql/mysql.c       2007-06-28 05:23:52 UTC 
(rev 5154)
+++ GNUnet/src/applications/sqstore_mysql/mysql.c       2007-06-28 05:30:07 UTC 
(rev 5155)
@@ -173,6 +173,8 @@
 
   int prepare;
 
+  int valid;
+
   MYSQL_STMT * insert;
 
   MYSQL_BIND bind[7];
@@ -197,8 +199,6 @@
 
   MYSQL_BIND ubind[5];
 
-  struct MUTEX * DATABASE_Lock_;
-
 } mysqlHandle;
 
 #define SELECT_SIZE "SELECT sum(size) FROM gn070"
@@ -224,6 +224,7 @@
 
 static mysqlHandle * dbh;
 
+
 /**
  * Given a full (SELECT *) sql_row from gn070 table in database
  * order, assemble it into a Datastore_Datum representation.
@@ -480,7 +481,7 @@
     dbhI->prepare = YES;
   } else
     dbhI->prepare = NO;
-  dbhI->DATABASE_Lock_ = MUTEX_CREATE(NO);
+  dbhI->valid = YES;
   return OK;
 }
 
@@ -508,12 +509,18 @@
     mysql_stmt_close(dbhI->deleteh);
     mysql_stmt_close(dbhI->deleteg);
   }
-  MUTEX_DESTROY(dbhI->DATABASE_Lock_);
   mysql_close(dbhI->dbf);
   dbhI->dbf = NULL;
+  dbhI->valid = NO;
   return OK;
 }
 
+/**
+ * Check if DBH handle is valid, return OK if it is.
+ * Also tries to re-connect to the DB if the connection
+ * is down.
+ */
+#define CHECK_DBH ((dbh->valid == NO) ? iopen(dbh, YES) : OK)
 
 /**
  * Iterate over the items in the datastore
@@ -543,7 +550,6 @@
   if (OK != iopen(&dbhI, NO))
     return SYSERR;
 
-  MUTEX_LOCK(dbhI.DATABASE_Lock_);
   mysql_thread_init();    
   mysql_query(dbhI.dbf,
              "SET AUTOCOMMIT = 0");
@@ -572,12 +578,10 @@
              "mysql_query",
              &dbhI);
     mysql_thread_end();    
-    MUTEX_UNLOCK(dbhI.DATABASE_Lock_);
     iclose(&dbhI);
     return SYSERR;
   }
   if (!(sql_res=mysql_use_result(dbhI.dbf))) {
-    MUTEX_UNLOCK(dbhI.DATABASE_Lock_);
     iclose(&dbhI);
     return SYSERR;
   }
@@ -587,7 +591,6 @@
                          &dbhI);
     if (datum == NULL) {
       mysql_thread_end();    
-      MUTEX_UNLOCK(dbhI.DATABASE_Lock_);
       iclose(&dbhI);
       return count;
     }
@@ -608,13 +611,11 @@
              &dbhI);
     mysql_free_result(sql_res);
     mysql_thread_end();    
-    MUTEX_UNLOCK(dbhI.DATABASE_Lock_);
     iclose(&dbhI);
     return SYSERR;
   }            
   mysql_free_result(sql_res);
   mysql_thread_end();    
-  MUTEX_UNLOCK(dbhI.DATABASE_Lock_);
   iclose(&dbhI);
   return count;
 }
@@ -775,8 +776,13 @@
         &enc,
         type);
 #endif
-  MUTEX_LOCK(dbh->DATABASE_Lock_);
+  MUTEX_LOCK(lock);
   mysql_thread_init();    
+  if (OK != CHECK_DBH) {
+    mysql_thread_end();       
+    MUTEX_UNLOCK(lock);
+    return SYSERR;
+  }
   if (type != 0) {
     if (iter == NULL)
       stmt = dbh->selectsc;
@@ -801,14 +807,16 @@
           "mysql_stmt_result_metadata",
           __FILE__, __LINE__,
           mysql_stmt_error(stmt));
+    iclose(dbh);
     mysql_thread_end();    
-    MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+    MUTEX_UNLOCK(lock);
     return SYSERR;
   }
   if (7 != mysql_num_fields(sql_res)) {
     GE_BREAK(ectx, 0);
+    iclose(dbh);
     mysql_thread_end();       
-    MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+    MUTEX_UNLOCK(lock);
     return SYSERR;
   }
   if (mysql_stmt_bind_param(stmt,
@@ -819,8 +827,9 @@
           "mysql_stmt_bind_param",
           __FILE__, __LINE__,
           mysql_stmt_error(stmt));
+    iclose(dbh);
     mysql_thread_end();    
-    MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+    MUTEX_UNLOCK(lock);
     return SYSERR;
   }
   if (mysql_stmt_execute(stmt)) {
@@ -830,8 +839,9 @@
           "mysql_stmt_execute",
           __FILE__, __LINE__,
           mysql_stmt_error(stmt));
+    iclose(dbh);
     mysql_thread_end();    
-    MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+    MUTEX_UNLOCK(lock);
     return SYSERR;
   }
 
@@ -856,8 +866,9 @@
           "mysql_stmt_bind_result",
           __FILE__, __LINE__,
           mysql_stmt_error(stmt));
+    iclose(dbh);
     mysql_thread_end();    
-    MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+    MUTEX_UNLOCK(lock);
     FREE(datum);
     return SYSERR;
   }
@@ -868,8 +879,9 @@
           "mysql_stmt_store_result",
           __FILE__, __LINE__,
           mysql_stmt_error(stmt));
+    iclose(dbh);
     mysql_thread_end();    
-    MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+    MUTEX_UNLOCK(lock);
     FREE(datum);
     return SYSERR;
   }
@@ -891,11 +903,14 @@
               sizeof(HashCode512),
               sizeof(Datastore_Value));
       if (0 != mysql_query(dbh->dbf, scratch))
-       LOG_MYSQL(GE_ERROR | GE_ADMIN | GE_BULK, "mysql_query", dbh);
+       LOG_MYSQL(GE_ERROR | GE_ADMIN | GE_BULK, 
+                 "mysql_query", 
+                 dbh);
 
       FREE(datum);
+      iclose(dbh);
       mysql_thread_end();    
-      MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+      MUTEX_UNLOCK(lock);
       return count;
     }
     count++;
@@ -927,11 +942,17 @@
           "mysql_stmt_fetch",
           __FILE__, __LINE__,
           mysql_stmt_error(stmt));
+    mysql_free_result(sql_res);
+    FREE(datum);
+    iclose(dbh);
+    mysql_thread_end();    
+    MUTEX_UNLOCK(lock);
+    return SYSERR;
   }
   mysql_free_result(sql_res);
   FREE(datum);
   mysql_thread_end();    
-  MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+  MUTEX_UNLOCK(lock);
 
 #if DEBUG_MYSQL
   IF_GELOG(ectx,
@@ -978,8 +999,13 @@
     GE_BREAK(ectx, 0);
     return SYSERR;
   }
-  MUTEX_LOCK(dbh->DATABASE_Lock_);
+  MUTEX_LOCK(lock);
   mysql_thread_init();    
+  if (OK != CHECK_DBH) {
+    mysql_thread_end();    
+    MUTEX_UNLOCK(lock);
+    return SYSERR;
+  }
   contentSize = ntohl(value->size)-sizeof(Datastore_Value);
   hashSize = sizeof(HashCode512);
   size = ntohl(value->size);
@@ -1016,8 +1042,9 @@
           "mysql_stmt_bind_param",
           __FILE__, __LINE__,
           mysql_stmt_error(dbh->insert));
+    iclose(dbh);
     mysql_thread_end();    
-    MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+    MUTEX_UNLOCK(lock);
     return SYSERR;
   }
 
@@ -1028,13 +1055,12 @@
           "mysql_stmt_execute",
           __FILE__, __LINE__,
           mysql_stmt_error(dbh->insert));
+    iclose(dbh);
     mysql_thread_end();    
-    MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+    MUTEX_UNLOCK(lock);
     return SYSERR;
   }
   mysql_thread_end();    
-  MUTEX_UNLOCK(dbh->DATABASE_Lock_);
-  MUTEX_LOCK(lock);
   content_size += ntohl(value->size);
   MUTEX_UNLOCK(lock);
   return OK;
@@ -1077,10 +1103,15 @@
         &enc,
         value == NULL ? 0 : ntohl(value->type));
 #endif
-  MUTEX_LOCK(dbh->DATABASE_Lock_);
-  mysql_thread_init();
   twenty = sizeof(HashCode512);
   svalue = NULL;
+  MUTEX_LOCK(lock);
+  mysql_thread_init();
+  if (OK != CHECK_DBH) {
+    mysql_thread_end();    
+    MUTEX_UNLOCK(lock);
+    return SYSERR;
+  }
   if (value == NULL) {
     stmt = dbh->deleteh;
     dbh->dbind[0].buffer = (char*) key;
@@ -1095,13 +1126,16 @@
             "mysql_stmt_result_metadata",
             __FILE__, __LINE__,
             mysql_stmt_error(stmt));
+      iclose(dbh);
       mysql_thread_end();    
-      MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+      MUTEX_UNLOCK(lock);
       return SYSERR;
     }
     if (7 != mysql_num_fields(sql_res)) {
       GE_BREAK(ectx, 0);
-      MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+      iclose(dbh);
+      mysql_thread_end();    
+      MUTEX_UNLOCK(lock);
       return SYSERR;
     }
     if (mysql_stmt_bind_param(stmt,
@@ -1112,8 +1146,9 @@
             "mysql_stmt_bind_param",
             __FILE__, __LINE__,
             mysql_stmt_error(stmt));
+      iclose(dbh);
       mysql_thread_end();      
-      MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+      MUTEX_UNLOCK(lock);
       return SYSERR;
     }
     if (mysql_stmt_execute(stmt)) {
@@ -1123,8 +1158,9 @@
             "mysql_stmt_execute",
             __FILE__, __LINE__,
             mysql_stmt_error(stmt));
+      iclose(dbh);
       mysql_thread_end();
-      MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+      MUTEX_UNLOCK(lock);
       return SYSERR;
     }
     svalue = MALLOC(sizeof(Datastore_Value) + MAX_DATUM_SIZE);
@@ -1148,8 +1184,9 @@
             "mysql_stmt_bind_result",
             __FILE__, __LINE__,
             mysql_stmt_error(stmt));
+      iclose(dbh);
       mysql_thread_end();      
-      MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+      MUTEX_UNLOCK(lock);
       FREE(svalue);
       return SYSERR;
     }
@@ -1160,8 +1197,9 @@
             "mysql_stmt_store_result",
             __FILE__, __LINE__,
             mysql_stmt_error(stmt));
+      iclose(dbh);
       mysql_thread_end();        
-      MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+      MUTEX_UNLOCK(lock);
       FREE(svalue);
       return SYSERR;
     }
@@ -1173,8 +1211,9 @@
             "mysql_stmt_fetch",
             __FILE__, __LINE__,
             mysql_stmt_error(stmt));
+      iclose(dbh);
       mysql_thread_end();
-      MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+      MUTEX_UNLOCK(lock);
       FREE(svalue);
       return SYSERR;
     }
@@ -1196,8 +1235,9 @@
        LOG_MYSQL(GE_ERROR | GE_ADMIN | GE_BULK,
                  "mysql_query", dbh);
       FREE(svalue);
+      iclose(dbh);
       mysql_thread_end();
-      MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+      MUTEX_UNLOCK(lock);
       return 1;
     }
     mysql_free_result(sql_res);
@@ -1238,8 +1278,9 @@
           "mysql_stmt_bind_param",
           __FILE__, __LINE__,
           mysql_stmt_error(stmt));
+    iclose(dbh);
     mysql_thread_end();
-    MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+    MUTEX_UNLOCK(lock);
     if (svalue != NULL)
       FREE(svalue);
     return SYSERR;
@@ -1251,22 +1292,22 @@
           "mysql_stmt_execute",
           __FILE__, __LINE__,
           mysql_stmt_error(stmt));
+    iclose(dbh);
     mysql_thread_end();
-    MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+    MUTEX_UNLOCK(lock);
     if (svalue != NULL)
       FREE(svalue);
     return SYSERR;
   }
   count = mysql_stmt_affected_rows(stmt);
   mysql_thread_end();
-  MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+  MUTEX_UNLOCK(lock);
 #if DEBUG_MYSQL
   GE_LOG(ectx,
         GE_DEBUG | GE_REQUEST | GE_USER,
         "MySQL DELETE operation affected %d rows.\n",
         count);
 #endif
-  MUTEX_LOCK(lock);
   content_size -= ntohl(value->size);
   MUTEX_UNLOCK(lock);
   if (svalue != NULL)
@@ -1286,8 +1327,13 @@
   unsigned long twenty;
 
   twenty = sizeof(HashCode512);
-  MUTEX_LOCK(dbh->DATABASE_Lock_);
+  MUTEX_LOCK(lock);
   mysql_thread_init();
+  if (OK != CHECK_DBH) {
+    mysql_thread_end();    
+    MUTEX_UNLOCK(lock);
+    return SYSERR;
+  }
   contentSize = ntohl(value->size)-sizeof(Datastore_Value);
   dbh->ubind[0].buffer = (char*) δ
   dbh->ubind[1].buffer = (char*) &expire;
@@ -1306,8 +1352,9 @@
           "mysql_stmt_bind_param",
           __FILE__, __LINE__,
           mysql_stmt_error(dbh->update));
+    iclose(dbh);
     mysql_thread_end();
-    MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+    MUTEX_UNLOCK(lock);
     return SYSERR;
   }
   /* NOTE: as the table entry for 'prio' is defined as unsigned,
@@ -1322,12 +1369,13 @@
           "mysql_stmt_execute",
           __FILE__, __LINE__,
           mysql_stmt_error(dbh->update));
+    iclose(dbh);
     mysql_thread_end();
-    MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+    MUTEX_UNLOCK(lock);
     return SYSERR;
   }
   mysql_thread_end();
-  MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+  MUTEX_UNLOCK(lock);
   return OK;
 }
 
@@ -1353,14 +1401,25 @@
  * guaranteed to be unloading of the module.
  */
 static void drop() {
+  MUTEX_LOCK(lock);
+  mysql_thread_init();    
+  if (OK != CHECK_DBH) {
+    mysql_thread_end();    
+    MUTEX_UNLOCK(lock);
+    return;
+  }
   mysql_query(dbh->dbf,
              "DROP TABLE gn070");
   if (mysql_error(dbh->dbf)[0]) {
     LOG_MYSQL(GE_ERROR | GE_ADMIN | GE_BULK,
              "mysql_query",
              dbh);
-  } else
+    iclose(dbh);
+  } else {
     content_size = 0;
+  }
+  mysql_thread_end();    
+  MUTEX_UNLOCK(lock);
 }
 
 SQstore_ServiceAPI *





reply via email to

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