Skip to Main Content

Berkeley DB Family

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

BerkeleyDB secondary index subject!

758075Mar 4 2010 — edited Mar 22 2010
Hi EveryOne,

The first of all ,thanks to read my Emial!
I have some questions about the secondary indexes of berkeleyDB:
1. Is there any requires in secondary indexes such as type and count in berkeleyDB.
2. Why does my secondary index for "stime" show the wrong sort?
3. Why the record num is less than Normal when I retrive all records use "itface" secondary
4. I confirmed Every operation is successful!( the return value is 0)!


#include "db.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct __INDEX
{
__int64 Index;
int stime;
char itface;
}INDEX;
int ExtTime(DB* dbp, const DBT* pkey, const DBT pdata, DBT skey)
{
skey ->data = &(((INDEX*)(pkey ->data)) ->stime);
skey ->size = sizeof(int);
return 0;
};
int ExtItface(DB* dbp, const DBT* pkey, const DBT pdata, DBT skey)
{
skey ->data = &(((INDEX*)(pkey ->data))->itface);
skey ->size = sizeof(char);
return 0;
};
int SetCompare(DB* db, const DBT* key1, const DBT *key2)
{
__int64 a = ((INDEX*)(key1->data)) ->Index;
__int64 b = ((INDEX*)(key2->data)) ->Index;
return ( a > b ? 1 : ( a == b ? 0 : -1));
};
int setTimeCompare(DB* db, const DBT* key1, const DBT *key2)
{
int a = *((int*)key1->data);
int b = *((int*)key2 ->data);
return ( a > b ? 1 : ( a == b ? 0 : -1));
};
int setItfaceCompare(DB* db, const DBT* key1, const DBT *key2)
{
int a = *((char*)key1->data);
int b = *((char*)key2 ->data);
return ( a > b ? 1 : ( a == b ? 0 : -1));
};
int main()
{
DB_ENV* env;
DB* pDB;
DB* timeDB;
DB* itfaceDB;
//---------------------- Init and open the Environment!--------------------
int ret = db_env_create(&env, 0);
if( ret != 0)
{
printf("%s\n", db_strerror(ret));
return ret;
}
ret = env ->set_cachesize(env, 1, 0, 0);
if(ret != 0)
{
printf("%s\n", db_strerror(ret));
return ret;
}
ret = env ->open(env, NULL, DB_CREATE | DB_INIT_MPOOL, 0);
if( ret != 0)
{
printf("%s\n", db_strerror(ret));
return ret;
}
//--------------------Open the primary database--------------------------------------
ret = db_create(&pDB, env, 0);
if( ret != 0)
{
printf("%s\n", db_strerror(ret));
return ret;
}
ret = pDB ->set_bt_compare(pDB, SetCompare);
if( ret != 0)
{
printf("%s\n", db_strerror(ret));
return ret;
}
ret = pDB ->open(pDB, NULL, "db1.db", NULL, DB_BTREE, DB_CREATE, 0);
if( ret != 0)
{
printf("%s\n", db_strerror(ret));
return ret;
}
//-------------------------Init and open the secondary index "stime" database---------------------------
ret = db_create(&timeDB, env, 0);
if( ret != 0)
{
printf("%s\n", db_strerror(ret));
return ret;
}
ret = timeDB ->set_flags(timeDB, DB_DUPSORT);
if( ret != 0)
{
printf("%s\n", db_strerror(ret));
return ret;
}
ret = timeDB ->set_dup_compare(timeDB, setTimeCompare);
if( ret != 0)
{
printf("%s\n", db_strerror(ret));
return ret;
}
ret = timeDB ->open(timeDB, NULL, "db1_time.db", NULL, DB_BTREE, DB_CREATE, 0);
if( ret != 0)
{
printf("%s\n", db_strerror(ret));
return ret;
}
//-------------------- Init and open the secondary index "itface" database-----------------------------
ret = db_create(&itfaceDB, env, 0);
if( ret != 0)
{
printf("%s\n", db_strerror(ret));
return ret;
}
ret = itfaceDB ->set_flags(itfaceDB, DB_DUPSORT);
if( ret != 0)
{
printf("%s\n", db_strerror(ret));
return ret;
}
ret = itfaceDB ->set_dup_compare(itfaceDB, setItfaceCompare);
if( ret != 0)
{
printf("%s\n", db_strerror(ret));
return ret;
}
ret = itfaceDB ->open(itfaceDB, NULL, "db1_itface.db", NULL, DB_BTREE, DB_CREATE, 0);
if( ret != 0)
{
printf("%s\n", db_strerror(ret));
return ret;
}
//--------------------Associate--------------------------------------
ret = pDB ->associate(pDB, NULL, timeDB, ExtTime, 0);
if( ret != 0)
{
printf("%s\n", db_strerror(ret));
return ret;
}
ret = pDB ->associate(pDB, NULL, itfaceDB, ExtItface, 0);
if( ret != 0)
{
printf("%s\n", db_strerror(ret));
return ret;
}

////////////////////
bool FLAG = 1;/// the switch for Put or Get! Put: 1 , Get: 0
////////////////////////////////////////////////////////////////////////
const char* p = "hello";
INDEX pindex;
memset(&pindex, 0, sizeof(INDEX));
DBT pkey, pdata;
memset(&pkey, 0, sizeof(DBT));
memset(&pdata, 0, sizeof(DBT));
//----------------------Store the data--------------------
if( FLAG == 1)
{
for(int i = 1; i <= 25000; i++)
{
pdata.data = (char*)p;
pdata.size = strlen(p) + 1;
pindex.itface = i % 256 + 1;
pindex.Index = i;
pindex.stime = i % 5000;
pkey.data = &pindex;
pkey.size = sizeof(INDEX);
pDB ->put(pDB, NULL, &pkey, &pdata, 0);
}
}
//-----------------------Retrive the data-----------------------
if(FLAG == 0)
{
int stime = 0;
int tmpTime = 0;
DBT skey;
memset(&skey, 0, sizeof(DBT));
memset(&pkey, 0, sizeof(DBT));
memset(&pdata, 0, sizeof(DBT));
skey.data = &stime;
skey.size = sizeof(int);
skey.ulen = sizeof(int);
skey.flags = DB_DBT_USERMEM;
DBC* timeCur;
/*timeDB*/itfaceDB ->cursor(itfaceDB, NULL, &timeCur, 0);
FILE* pTimeFile = fopen("time.txt", "w");
fprintf(pTimeFile, "Index\tTime\tItface\n");
for(ret = timeCur ->pget(timeCur, &skey, &pkey, &pdata, DB_NEXT);//_RANGE
ret == 0;
ret = timeCur ->pget(timeCur, &skey, &pkey, &pdata, DB_NEXT))
{
memcpy(&pindex, pkey.data, sizeof(INDEX));
fprintf(pTimeFile, "%lld\t%d\t%d\n", pindex.Index, pindex.stime, pindex.itface);
}
fclose(pTimeFile);
}
//////////////////////////////////////////////////////////////////////////////
ret = timeDB ->close(timeDB, 0);
ret = itfaceDB ->close(itfaceDB, 0);
ret = pDB ->close(pDB, 0);
ret = env ->close(env, 0);
db_env_create(&env, 0);
env ->remove(env, NULL, DB_FORCE);
printf("end......\n");
getchar();
return 0;
}

The berkeley DB version number is 4.8.24!
The test environmet is visual Studio 2008!
The OS is win xp, memory is 1 GB!
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Apr 19 2010
Added on Mar 4 2010
2 comments
1,762 views