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!

comparison function returns incorrect data

3333809Oct 21 2016 — edited Nov 1 2016

i have modified the examples/c/ex_heap.c to read from one db and insert/delete in another.  For some reason one of the keys that the comparison function receives is either truncated or doesn't match any records in the db.  This is my comparison function

int compare_cmid(dbp, a, b, lob)

        DB *dbp;

        const DBT *a, *b;

        size_t *lob;

{

       //char* temp_a = (char*)a->data;

       //char* temp_b = (char*)b->data;

       //printf("temp_a = %s\n", temp_a);

       //printf("temp_b = %s\n", temp_b);

        char key_a[25];

        char key_b[25];

        memset(key_a,'\0',sizeof(key_a));

        memset(key_b,'\0',sizeof(key_b));

       int ascii_a[256];

       int ascii_b[256];

       int i;

       memset(ascii_a, 0, sizeof(ascii_a));

       memset(ascii_b, 0, sizeof(ascii_b));

       strcpy(key_a, a->data);

       strcpy(key_b, b->data);

       printf("key_a = %s\n", key_a);

       printf("key_b = %s\n", key_b);

       int l_a;

       l_a =  strlen(key_a);

       int l_b;

       l_b = strlen(key_b);

       int value;

       for (i=0; i<l_a; i++) {

         value = key_a[i];

         ascii_a[value]++;

       }

       for(i=0; i<l_b; i++) {

         value = key_b[i];

         ascii_b[value]++;

        }

       for(i=0; i<256; i++) {

         if(ascii_a[i] > ascii_b[i]) {

             return 1;

         } else if (ascii_a[i] < ascii_b[i]) {

             return -1;

         }

       }

       return 0;

}

b is often messed up.  I'm setting the comparison function before opening the db and it gets called fine but just not with the expected keys.  Please assist.

This post has been answered by userBDBDMS-Oracle on Oct 21 2016
Jump to Answer

Comments

Mike Kutz

TAG using JSON value might be more flexible.

This would then allow template based code generators (eg ) to automatically identify which tables need to be combined together to create a specific Transactional API (XAPI).  (eg an API that must work with >1 tables)

MK

Jeffrey Kemp

Tags for table columns, constraints, etc. would also be useful.

Matheus Boesing

TAG using JSON value might be more flexible.

This would then allow template based code generators (eg ) to automatically identify which tables need to be combined together to create a specific Transactional API (XAPI).  (eg an API that must work with >1 tables)

MK

Great Mike!
It really should be done with JSON syntax. It allows to create different kinds of tags in a single 'tag column', like:
[...]TAGS ('{Use:Transactional, SensitiveData:false, Version1.0:MatheusDBA, Version2.0:AnotherDBA}');


Or even tags hierarchies/subtypes... Anyway, it's way more flexible.
Thanks for this insight!

Matheus Boesing

Tags for table columns, constraints, etc. would also be useful.

Exactly... I just used some kind of objects for this example... but I believe it can apply for any king of object, including schemas... like (using Mike's contribution):
CREATE USER USER_EXAMPLE TAGS ('{Use:AdHocReports, Accountable:InternalBusinessTeam}');

Gbenga Ajakaye

This would definitely be useful.

1 - 5
Locked Post
New comments cannot be posted to this locked post.

Post Details

Locked on Nov 29 2016
Added on Oct 21 2016
23 comments
1,135 views