[Top][All Lists]
[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,
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r2377 - in GNUnet/src/applications: sqstore_mysql sqstore_sqlite,
grothoff <=