#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) |