Chinaunix首页 | 论坛 | 博客
  • 博客访问: 38804
  • 博文数量: 17
  • 博客积分: 610
  • 博客等级: 上士
  • 技术积分: 175
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-19 20:51
文章分类

全部博文(17)

文章存档

2015年(3)

2010年(11)

2009年(3)

我的朋友
最近访客

分类:

2009-03-11 11:56:44

#include
#include
#include
#include
#include
#include
#include
#include

int cbcomp(DB *db, const DBT *dbt1, const DBT *dbt2)
{
  assert(dbt1 && dbt2);
  unsigned int v1 = *(unsigned *)(dbt1->data),
               v2 = *(unsigned *)(dbt2->data);
  if (dbt1->size != sizeof(unsigned int)) {
    unsigned int *kk  = (unsigned int *)dbt1->data;
    if (kk[1] == 0)
        kk[1] = v2;
    if (abs(v1-kk[1]) > abs(v1 - v2))
      kk[1] = v2;
  }
  return v1 > v2 ? 1: (v1 < v2 ? -1: 0);
}
int main()
{
  int ret;
  unsigned int ip, id, rs[2] = {0x60, 0};
  char buffer[512], *p;
  DB *dbp = 0;
  DBT k, v;
  //Create and open a database.
  if (db_create(&dbp, 0, 0) != 0) {
    printf("error, create a database handle.\n");
    return 0;
  }
  ret = dbp->set_bt_compare(dbp, cbcomp);
  ret = ret || dbp->open(dbp, 0, "findip.db", 0, DB_BTREE, DB_CREATE, 0);
  if (ret) {
    printf("error, %s\n", db_strerror(ret));
    return 0;
  }
  //Load ip file and put the records into the database.
  FILE *f = fopen("./ip.txt", "r");
  if(!f)
    return dbp->close(dbp, 0);
  while (fgets(buffer, sizeof(buffer), f)) {
    p = strchr(buffer, ' ');
    if (!p)
      continue;
    *p++ = '\0';
    ip = (int) inet_network(buffer);
    id = atoi(p);
    memset(&k, 0, sizeof(k));
    memset(&v, 0, sizeof(v));
    k.size = sizeof(unsigned int);
    k.data = &ip;
    v.size = sizeof(unsigned int);
    v.data = &id;
    ret = dbp->put(dbp, 0, &k, &v, DB_NOOVERWRITE);
    if (ret)
      printf("error, %s\n", db_strerror(ret));
  }
  fclose(f);
  //Search for the closest node.
  memset(&k, 0, sizeof(k));
  memset(&v, 0, sizeof(v));
  k.size = sizeof(rs);
  k.data = &rs;
  v.size = sizeof(unsigned int);
  v.data = &id;
  v.ulen = sizeof(unsigned int);
  v.flags = DB_DBT_USERMEM;
  ret = dbp->get(dbp, 0, &k, &v, 0);
  printf("OK, %u\n", rs[1]);
  //Close the database.
  dbp->close(dbp, 0);
  return 0;
}
 
阅读(864) | 评论(0) | 转发(0) |
0

上一篇:笑话

下一篇:Android模拟器介绍和基本使用

给主人留下些什么吧!~~