⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbdump.c

📁 基于DHT的对等协议
💻 C
字号:
#include <async.h>#include <aios.h>#include <crypt.h>#include <dbfe.h>#include <adb_prot.h>static const char *usage = "usage: dbdump [-t|-m] dbhome\n";static DB_ENV* dbe = NULL;static DB *metadatadb = NULL;static DB *byexpiredb = NULL;// {{{ getexpire: Secondary key extractor for metadatastatic intgetexpire (DB *sdb, const DBT *pkey, const DBT *pdata, DBT *skey){  u_int32_t *expire = (u_int32_t *) malloc(sizeof(u_int32_t));  // this flag should mean that berkeley db will free this memory when it's  // done with it.  skey->flags = DB_DBT_APPMALLOC;  skey->data = expire;  skey->size = sizeof (*expire);  if (pkey->size != sha1::hashsize)  {    *expire = 0;    return 0;  }  adb_metadata_t md;  if (!buf2xdr (md, pdata->data, pdata->size)) {    hexdump hd (pdata->data, pdata->size);    warn << "getexpire: unable to unmarshal pdata.\n" << hd << "\n";    return -1;  }  // Ensure big-endian for proper BDB sorting.  *expire = htonl (md.expiration);  return 0;}// }}}// {{{ dumpmaster: Dump master metadatastatic intdumpmaster (void){  int r;  adb_master_metadata_t mmd;  bzero (&mmd, sizeof (mmd));  DBT mkey, mdata;  bzero (&mkey, sizeof (mkey));  bzero (&mdata, sizeof (mdata));  mkey.data = (void *) "MASTER_INFO";  mkey.size = strlen ("MASTER_INFO");  r = metadatadb->get (metadatadb, NULL, &mkey, &mdata, 0);  if (r) {    warn << "metadatadb->get " << db_strerror (r) << "\n";    return r;  }  buf2xdr (mmd, mdata.data, mdata.size);  aout << "Master DB info:\n";  aout << "\t" << mmd.size << " bytes\n";  time_t t = mmd.expiration;  aout << "\tNext expiration at " << ctime (&t);  return 0;}// }}}// {{{ dumpall: Dump all db key metadatastatic intdumpall (bool bytime){  adb_master_metadata_t mmd;  bzero (&mmd, sizeof (mmd));  DBT begin_time, key, data;  u_int64_t totalsz = 0;  unsigned keys = 0;  int r = 0;  DBC *cursor;  if (bytime)     r = byexpiredb->cursor (byexpiredb, NULL, &cursor, 0);  else     r = metadatadb->cursor (metadatadb, NULL, &cursor, 0);  if (r) {    warn << "cursor error: " << r << " " << db_strerror (r) << "\n";    return r;  }  for (int i = 0; ; i++) {    bzero (&begin_time, sizeof (begin_time));    bzero (&key, sizeof (key));    bzero (&data, sizeof (data));    if (bytime)      r = cursor->c_pget (cursor, &begin_time, &key, &data, DB_NEXT);    else       r = cursor->c_get (cursor, &key, &data, DB_NEXT);    if (r == DB_NOTFOUND) {      aout << "EOF.\n";      r = 0;      break;    } else if (r) {      warn << "error: " << r << " " << db_strerror (r) << "\n";      break;    }    if (key.size != sha1::hashsize) {      buf2xdr (mmd, data.data, data.size);      continue;    }    chordID k;    mpz_set_rawmag_be (&k, static_cast<char *> (key.data), key.size);    adb_metadata_t md;    buf2xdr (md, data.data, data.size);    aout << "key[" << i << "] " << k << " " << md.size << " " << md.expiration << "\n";    keys++;    totalsz += md.size;        aout->flush ();  }  cursor->c_close (cursor);  aout << "total keys: " << keys << "\n";  aout << "total bytes: " << totalsz << "\n";  if (totalsz != mmd.size)    warn << "Master metadata total bytes error: " << mmd.size << "\n";  return r;}// }}}intmain (int argc, char *argv[]){  if (argc != 2 && argc != 3)    fatal << usage;    int r;  bool bytime = false;  bool masteronly = false;  char *path = argv[1];  if (argv[1][0] == '-') {    if (!strcmp (argv[1], "-t")) {      path = argv[2];      bytime = true;    } else if (!strcmp (argv[1], "-m")) {      path = argv[2];      masteronly = true;    } else {      warn << usage;      fatal << "Unknown option: " << argv[1] << "\n";    }  }  r = dbfe_initialize_dbenv (&dbe, path, /* join = */ true);  if (r)    fatal << "couldn't open dbenv: " << db_strerror (r) << "\n";  r = dbfe_opendb (dbe, &metadatadb, "metadatadb", DB_RDONLY);  if (r)    fatal << "couldn't open db: " << db_strerror (r) << "\n";  r = dbfe_opendb (dbe, &byexpiredb, "byexpiredb", DB_RDONLY, 0, /* dups = */ true);  if (r)    fatal << "couldn't open expiredb: " << db_strerror (r) << "\n";  r = metadatadb->associate (metadatadb, NULL, byexpiredb, getexpire, DB_AUTO_COMMIT);  if (r)    fatal << "couldn't associate expiredb: " << db_strerror (r) << "\n";  if (masteronly)    r = dumpmaster ();  else    r = dumpall (bytime);  byexpiredb->close (byexpiredb, 0);  metadatadb->close (metadatadb, 0);  dbe->close (dbe, 0);  // Shell is backwards.  return (r != 0);}// vim: foldmethod=marker

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -