- int ret;
- GNUNET_CronTime now;
-
- if (size > MAX_CONTENT_SIZE)
- return GNUNET_SYSERR;
- GNUNET_hash (data, size, &vhash);
- GNUNET_mutex_lock (lock);
- if ((fn == NULL) || (SQLITE_OK != sqlite3_open (fn_utf8, &dbh)))
- {
- db_reset (dbh);
- GNUNET_mutex_unlock (lock);
- return GNUNET_SYSERR;
- }
- now = GNUNET_get_time ();
-#if DEBUG_DSTORE
- GNUNET_GE_LOG (coreAPI->ectx,
- GNUNET_GE_DEBUG | GNUNET_GE_REQUEST | GNUNET_GE_DEVELOPER,
- "dstore processes put `%.*s' with expiration %llu\n",
- size, data, discard_time);
-#endif
-
- /* first try UPDATE */
- if (sq_prepare (dbh,
- "UPDATE ds080 SET puttime=?, expire=? "
- "WHERE key=? AND vhash=? AND type=? AND size=?",
- &stmt) != SQLITE_OK)
- {
- GNUNET_GE_LOG (coreAPI->ectx,
- GNUNET_GE_ERROR | GNUNET_GE_ADMIN | GNUNET_GE_BULK,
- _("`%s' failed at %s:%d with error: %s\n"),
- "sq_prepare", __FILE__, __LINE__, sqlite3_errmsg (dbh));
- sqlite3_close (dbh);
- GNUNET_mutex_unlock (lock);
- return GNUNET_SYSERR;
- }
- if ((SQLITE_OK !=
- sqlite3_bind_int64 (stmt, 1, now)) ||
- (SQLITE_OK !=
- sqlite3_bind_int64 (stmt, 2, discard_time)) ||
- (SQLITE_OK !=
- sqlite3_bind_blob (stmt, 3, key, sizeof (GNUNET_HashCode),
- SQLITE_TRANSIENT)) ||
- (SQLITE_OK !=
- sqlite3_bind_blob (stmt, 4, &vhash, sizeof (GNUNET_HashCode),
- SQLITE_TRANSIENT)) ||
- (SQLITE_OK != sqlite3_bind_int (stmt, 5, type)) ||
- (SQLITE_OK != sqlite3_bind_int (stmt, 6, size)))
- {
- GNUNET_GE_LOG (coreAPI->ectx,
- GNUNET_GE_ERROR | GNUNET_GE_ADMIN | GNUNET_GE_BULK,
- _("`%s' failed at %s:%d with error: %s\n"),
- "sqlite3_bind_xxx", __FILE__, __LINE__,
- sqlite3_errmsg (dbh));
- sqlite3_finalize (stmt);
- sqlite3_close (dbh);
- GNUNET_mutex_unlock (lock);
- return GNUNET_SYSERR;
- }
- if (SQLITE_DONE != sqlite3_step (stmt))
- {
- GNUNET_GE_LOG (coreAPI->ectx,
- GNUNET_GE_ERROR | GNUNET_GE_ADMIN | GNUNET_GE_BULK,
- _("`%s' failed at %s:%d with error: %s\n"),
- "sqlite3_step", __FILE__, __LINE__,
- sqlite3_errmsg (dbh));
- sqlite3_finalize (stmt);
- sqlite3_close (dbh);
- GNUNET_mutex_unlock (lock);
- return GNUNET_SYSERR;
- }
- ret = sqlite3_changes (dbh);
- sqlite3_finalize (stmt);
- if (ret > 0)
- {
- sqlite3_close (dbh);
- GNUNET_mutex_unlock (lock);
- return GNUNET_OK;
- }
- if (GNUNET_OK != checkQuota (dbh))
- {
- sqlite3_close (dbh);
- GNUNET_mutex_unlock (lock);
- return GNUNET_SYSERR;
- }
- if (sq_prepare (dbh,
- "INSERT INTO ds080 "
- "(size, type, puttime, expire, key, vhash, value) "
- "VALUES (?, ?, ?, ?, ?, ?, ?)", &stmt) != SQLITE_OK)
- {
- GNUNET_GE_LOG (coreAPI->ectx,
- GNUNET_GE_ERROR | GNUNET_GE_ADMIN | GNUNET_GE_BULK,
- _("`%s' failed at %s:%d with error: %s\n"),
- "sq_prepare", __FILE__, __LINE__, sqlite3_errmsg (dbh));
- sqlite3_close (dbh);
- GNUNET_mutex_unlock (lock);
- return GNUNET_SYSERR;
- }
- if ((SQLITE_OK == sqlite3_bind_int (stmt, 1, size)) &&
- (SQLITE_OK == sqlite3_bind_int (stmt, 2, type)) &&
- (SQLITE_OK == sqlite3_bind_int64 (stmt, 3, now)) &&
- (SQLITE_OK == sqlite3_bind_int64 (stmt, 4, discard_time)) &&
- (SQLITE_OK ==
- sqlite3_bind_blob (stmt, 5, key, sizeof (GNUNET_HashCode),
- SQLITE_TRANSIENT)) &&
- (SQLITE_OK ==
- sqlite3_bind_blob (stmt, 6, &vhash, sizeof (GNUNET_HashCode),
- SQLITE_TRANSIENT))
- && (SQLITE_OK ==
- sqlite3_bind_blob (stmt, 7, data, size, SQLITE_TRANSIENT)))
- {
- if (SQLITE_DONE != sqlite3_step (stmt))
- {
- LOG_SQLITE (dbh,
- GNUNET_GE_ERROR | GNUNET_GE_DEVELOPER | GNUNET_GE_ADMIN
- | GNUNET_GE_BULK, "sqlite3_step");
- }
- else
- {
- payload += size + OVERHEAD;
- if (bloom != NULL)
- GNUNET_bloomfilter_add (bloom, key);
- }
- if (SQLITE_OK != sqlite3_finalize (stmt))
- LOG_SQLITE (dbh,
- GNUNET_GE_ERROR | GNUNET_GE_DEVELOPER | GNUNET_GE_ADMIN |
- GNUNET_GE_BULK, "sqlite3_finalize");
- }
+ struct GNUNET_TIME_Absolute exp;
+ unsigned int size;
+ const char *dat;
+ unsigned int off;
+ unsigned int psize;
+ unsigned int type;
+ char scratch[256];
+ int64_t ntime;
+ const struct GNUNET_PeerIdentity *path;
+ const struct GNUNET_HashCode *key;
+
+ if (0 == plugin->num_items)
+ return 0;
+ if (NULL == iter)
+ return 1;
+ off = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE,
+ plugin->num_items);
+ GNUNET_snprintf (scratch,
+ sizeof (scratch),
+ "SELECT value,expire,path,key,type FROM ds090 ORDER BY key LIMIT 1 OFFSET %u",
+ off);
+ if (SQLITE_OK !=
+ sq_prepare (plugin->dbh, scratch, &stmt))
+ {
+ LOG_SQLITE (plugin->dbh,
+ GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
+ "sq_prepare");
+ return 0;
+ }
+ if (SQLITE_ROW != sqlite3_step (stmt))
+ {
+ GNUNET_break (0);
+ sqlite3_finalize (stmt);
+ return 0;
+ }
+ size = sqlite3_column_bytes (stmt, 0);
+ dat = sqlite3_column_blob (stmt, 0);
+ exp.abs_value_us = sqlite3_column_int64 (stmt, 1);
+ psize = sqlite3_column_bytes (stmt, 2);
+ if (0 != psize % sizeof (struct GNUNET_PeerIdentity))
+ {
+ GNUNET_break (0);
+ psize = 0;
+ }
+ psize /= sizeof (struct GNUNET_PeerIdentity);
+ if (0 != psize)
+ path = sqlite3_column_blob (stmt, 2);