X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=isam%2Fisam.c;h=c84e42e3db39f65cf3ff85de233b2edadd157a41;hb=0e643dd5ce707178394c0e9d82ec2eeb80f330ec;hp=5c847cb10d663590ec9ca7305066363d34468b37;hpb=8fa8b7c5d10dd87654e5c219cceebe1a9664544a;p=idzebra-moved-to-github.git diff --git a/isam/isam.c b/isam/isam.c index 5c847cb..c84e42e 100644 --- a/isam/isam.c +++ b/isam/isam.c @@ -4,7 +4,19 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: isam.c,v $ - * Revision 1.3 1994-09-26 17:06:35 quinn + * Revision 1.7 1994-09-28 11:56:25 quinn + * Added sort of input to is_merge + * + * Revision 1.6 1994/09/28 11:29:33 quinn + * Added cmp parameter. + * + * Revision 1.5 1994/09/27 20:03:50 quinn + * Seems relatively bug-free. + * + * Revision 1.4 1994/09/26 17:11:29 quinn + * Trivial + * + * Revision 1.3 1994/09/26 17:06:35 quinn * Back again... * * Revision 1.1 1994/09/12 08:02:13 quinn @@ -22,10 +34,10 @@ #include #include "isutil.h" #include "rootblk.h" -#include -#include "physical.h" #include "keyops.h" +static int (*extcmp)(const void *p1, const void *p2); + static int splitargs(const char *s, char *bf[], int max) { int ct = 0; @@ -52,7 +64,8 @@ static int splitargs(const char *s, char *bf[], int max) * Open isam file. * Process resources. */ -ISAM is_open(const char *name, int writeflag) +ISAM is_open(const char *name, int (*cmp)(const void *p1, const void *p2), + int writeflag) { ISAM new; char *nm, *r, *pp[IS_MAX_BLOCKTYPES+1], m[2]; @@ -213,7 +226,7 @@ ISAM is_open(const char *name, int writeflag) new->types[i].nice_keys_block = 1; } - new->cmp = is_default_cmp; + new->cmp = cmp ? cmp : is_default_cmp; return new; } @@ -258,14 +271,25 @@ static ISAM_P is_address(int type, int pos) return r; } -ISAM_P is_merge(ISAM is, ISAM_P pos, int num, const char *data) +int sort_input(const void *p1, const void *p2) +{ + int rs; + + if ((rs = (*extcmp)(((char *)p1) + 1, ((char *)p2) + 1))) + return rs; + return *((char *)p1) - *((char*)p2); +} + +ISAM_P is_merge(ISAM is, ISAM_P pos, int num, char *data) { is_mtable tab; int res; char keybuf[IS_MAX_RECORD]; - int oldnum, oldtype; + int oldnum, oldtype, i; char operation, *record; + extcmp = is->cmp; + qsort(data, num, is_keysize(is) + 1, sort_input); is_m_establish_tab(is, &tab, pos); /* TODO: do something to aquire oldnum at this point */ if (pos) @@ -279,10 +303,10 @@ ISAM_P is_merge(ISAM is, ISAM_P pos, int num, const char *data) while (num) { operation = *(data)++; - record = (char*)data; + record = (char*) data; data += is_keysize(is); num--; - while (num && !memcmp(record, data, is_keysize(tab.is) + 1)) + while (num && !memcmp(record - 1, data, is_keysize(tab.is) + 1)) { data += 1 + is_keysize(is); num--; @@ -334,16 +358,29 @@ ISAM_P is_merge(ISAM is, ISAM_P pos, int num, const char *data) } } } - while (tab.pos_type < tab.is->num_types - 1 && tab.num_records > - tab.is->types[tab.pos_type].max_keys) - tab.pos_type++; + i = tab.pos_type; + while (i < tab.is->num_types - 1 && tab.num_records > + tab.is->types[i].max_keys) + i++; + if (i != tab.pos_type) + { + is_p_unmap(&tab); + tab.pos_type = i; + } if (!oldnum || tab.pos_type != oldtype || (abs(oldnum - tab.num_records) * 100) / oldnum > tab.is->repack) is_p_remap(&tab); else is_p_align(&tab); - is_p_sync(&tab); - return is_address(tab.pos_type, tab.data->diskpos); + if (tab.data) + { + is_p_sync(&tab); + pos = is_address(tab.pos_type, tab.data->diskpos); + } + else + pos = 0; + is_m_release_tab(&tab); + return pos; } /*