X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fkinput.c;h=f0649d66e4075433e74b216cb9b8f2b58f505002;hb=92bb4bdb37873f21cabe7b045e1a593ab648ae55;hp=b2cf034e3c7d6c786557709e1af2a239864ef102;hpb=3726bf6622da6a8b983bb4cbb7d654e84c3216d7;p=idzebra-moved-to-github.git diff --git a/index/kinput.c b/index/kinput.c index b2cf034..f0649d6 100644 --- a/index/kinput.c +++ b/index/kinput.c @@ -4,6 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss, Heikki Levanto * * (log at the end) + * + * Bugs + * - Allocates a lot of memory for the merge process, but never releases it. + * Doesn't matter, as the program terminates soon after. */ @@ -208,6 +212,7 @@ struct heap_info { ISAMC isamc; ISAMS isams; ISAMH isamh; + ISAMD isamd; }; struct heap_info *key_heap_init (int nkeys, @@ -478,6 +483,60 @@ int heap_inph (struct heap_info *hi) return 0; } +int heap_inpd (struct heap_info *hi) +{ + struct heap_cread_info hci; + ISAMD_I isamd_i = (ISAMD_I) xmalloc (sizeof(*isamd_i)); + + hci.key = (char *) xmalloc (KEY_SIZE); + hci.mode = 1; + hci.hi = hi; + hci.more = heap_read_one (hi, hci.cur_name, hci.key); + + isamd_i->clientData = &hci; + isamd_i->read_item = heap_cread_item; + + while (hci.more) + { + char this_name[INP_NAME_MAX]; + ISAMD_P isamd_p, isamd_p2; + char *dict_info; + + strcpy (this_name, hci.cur_name); + assert (hci.cur_name[1]); + no_diffs++; + if ((dict_info = dict_lookup (hi->dict, hci.cur_name))) + { + memcpy (&isamd_p, dict_info+1, sizeof(ISAMD_P)); + isamd_p2 = isamd_append (hi->isamd, isamd_p, isamd_i); + if (!isamd_p2) + { + no_deletions++; + if (!dict_delete (hi->dict, this_name)) + abort(); + } + else + { + no_updates++; + if (isamd_p2 != isamd_p) + dict_insert (hi->dict, this_name, + sizeof(ISAMD_P), &isamd_p2); + } + } + else + { + isamd_p = isamd_append (hi->isamd, 0, isamd_i); + no_insertions++; + dict_insert (hi->dict, this_name, sizeof(ISAMD_P), &isamd_p); + } + } + xfree (isamd_i); + return 0; +} + + + + int heap_inp (struct heap_info *hi) { char *info; @@ -591,6 +650,7 @@ void key_input (BFiles bfs, int nkeys, int cache) ISAMC isamc = NULL; ISAMS isams = NULL; ISAMH isamh = NULL; + ISAMD isamd = NULL; struct key_file **kf; char rbuf[1024]; int i, r; @@ -648,6 +708,17 @@ void key_input (BFiles bfs, int nkeys, int cache) exit (1); } } + else if (res_get_match (common_resource, "isam", "d", NULL)) + { + struct ISAMD_M_s isamd_m; + isamd = isamd_open (bfs, FNAME_ISAMD, 1, + key_isamd_m (common_resource,&isamd_m)); + if (!isamd) + { + logf (LOG_FATAL, "isamd_open fail"); + exit (1); + } + } else { struct ISAMC_M_s isamc_m; @@ -678,6 +749,7 @@ void key_input (BFiles bfs, int nkeys, int cache) hi->isamc = isamc; hi->isams = isams; hi->isamh = isamh; + hi->isamd = isamd; for (i = 1; i<=nkeys; i++) if ((r = key_file_read (kf[i], rbuf))) @@ -690,6 +762,8 @@ void key_input (BFiles bfs, int nkeys, int cache) heap_inp (hi); else if (isamh) heap_inph (hi); + else if (isamd) + heap_inpd (hi); dict_close (dict); if (isam) @@ -700,6 +774,8 @@ void key_input (BFiles bfs, int nkeys, int cache) isams_close (isams); if (isamh) isamh_close (isamh); + if (isamd) + isamd_close (isamd); for (i = 1; i<=nkeys; i++) { @@ -711,13 +787,27 @@ void key_input (BFiles bfs, int nkeys, int cache) logf (LOG_LOG, "Updates. . . . .%7d", no_updates); logf (LOG_LOG, "Deletions. . . .%7d", no_deletions); logf (LOG_LOG, "Insertions . . .%7d", no_insertions); + + /* xmalloc_trav("unfreed"); while hunting leaks */ } /* * $Log: kinput.c,v $ - * Revision 1.36 1999-07-14 10:59:26 adam + * Revision 1.40 1999-09-08 12:12:39 adam + * Removed log message. + * + * Revision 1.39 1999/08/18 10:39:20 heikki + * Added a comment on memory leaks + * + * Revision 1.38 1999/08/18 08:38:04 heikki + * Memory leak hunting + * + * Revision 1.37 1999/07/14 13:21:34 heikki + * Added isam-d files. Compiles (almost) clean. Doesn't work at all + * + * Revision 1.36 1999/07/14 10:59:26 adam * Changed functions isc_getmethod, isams_getmethod. * Improved fatal error handling (such as missing EXPLAIN schema). *