X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fkinput.c;h=fd3099b361ed7f0c1484b886bc161d11fc147126;hb=28f3461a79a4569d736f4ffc66c6ae207e38c2ab;hp=4a635c0e06b059095d8569cf8b21a0fb4104d967;hpb=4f2ca550b3aeaf42480ba84e196fd930ba407a18;p=idzebra-moved-to-github.git diff --git a/index/kinput.c b/index/kinput.c index 4a635c0..fd3099b 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. */ @@ -204,10 +208,12 @@ struct heap_info { int *ptr; int (*cmp)(const void *p1, const void *p2); Dict dict; + ISAMS isams; +#if ZMBOL ISAM isam; ISAMC isamc; - ISAMS isams; - ISAMH isamh; + ISAMD isamd; +#endif }; struct heap_info *key_heap_init (int nkeys, @@ -341,6 +347,7 @@ int heap_cread_item (void *vp, char **dst, int *insertMode) return 1; } +#if ZMBOL int heap_inpc (struct heap_info *hi) { struct heap_cread_info hci; @@ -392,58 +399,23 @@ int heap_inpc (struct heap_info *hi) return 0; } -int heap_inps (struct heap_info *hi) +int heap_inpd (struct heap_info *hi) { struct heap_cread_info hci; - ISAMS_I isams_i = (ISAMS_I) xmalloc (sizeof(*isams_i)); + 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); - isams_i->clientData = &hci; - isams_i->read_item = heap_cread_item; + isamd_i->clientData = &hci; + isamd_i->read_item = heap_cread_item; while (hci.more) { char this_name[INP_NAME_MAX]; - ISAMS_P isams_p; - 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))) - { - isams_p = isams_merge (hi->isams, isams_i); - no_insertions++; - dict_insert (hi->dict, this_name, sizeof(ISAMS_P), &isams_p); - } - else - abort(); - } - xfree (isams_i); - return 0; -} - -int heap_inph (struct heap_info *hi) -{ - struct heap_cread_info hci; - ISAMH_I isamh_i = (ISAMH_I) xmalloc (sizeof(*isamh_i)); - - hci.key = (char *) xmalloc (KEY_SIZE); - hci.mode = 1; - hci.hi = hi; - hci.more = heap_read_one (hi, hci.cur_name, hci.key); - - isamh_i->clientData = &hci; - isamh_i->read_item = heap_cread_item; - - while (hci.more) - { - char this_name[INP_NAME_MAX]; - ISAMH_P isamh_p, isamh_p2; + ISAMD_P isamd_p, isamd_p2; char *dict_info; strcpy (this_name, hci.cur_name); @@ -451,9 +423,9 @@ int heap_inph (struct heap_info *hi) no_diffs++; if ((dict_info = dict_lookup (hi->dict, hci.cur_name))) { - memcpy (&isamh_p, dict_info+1, sizeof(ISAMH_P)); - isamh_p2 = isamh_append (hi->isamh, isamh_p, isamh_i); - if (!isamh_p2) + 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)) @@ -462,19 +434,19 @@ int heap_inph (struct heap_info *hi) else { no_updates++; - if (isamh_p2 != isamh_p) + if (isamd_p2 != isamd_p) dict_insert (hi->dict, this_name, - sizeof(ISAMH_P), &isamh_p2); + sizeof(ISAMD_P), &isamd_p2); } } else { - isamh_p = isamh_append (hi->isamh, 0, isamh_i); + isamd_p = isamd_append (hi->isamd, 0, isamd_i); no_insertions++; - dict_insert (hi->dict, this_name, sizeof(ISAMH_P), &isamh_p); + dict_insert (hi->dict, this_name, sizeof(ISAMD_P), &isamd_p); } } - xfree (isamh_i); + xfree (isamd_i); return 0; } @@ -548,6 +520,43 @@ int heap_inp (struct heap_info *hi) return 0; } +#endif + +int heap_inps (struct heap_info *hi) +{ + struct heap_cread_info hci; + ISAMS_I isams_i = (ISAMS_I) xmalloc (sizeof(*isams_i)); + + hci.key = (char *) xmalloc (KEY_SIZE); + hci.mode = 1; + hci.hi = hi; + hci.more = heap_read_one (hi, hci.cur_name, hci.key); + + isams_i->clientData = &hci; + isams_i->read_item = heap_cread_item; + + while (hci.more) + { + char this_name[INP_NAME_MAX]; + ISAMS_P isams_p; + 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))) + { + isams_p = isams_merge (hi->isams, isams_i); + no_insertions++; + dict_insert (hi->dict, this_name, sizeof(ISAMS_P), &isams_p); + } + else + abort(); + } + xfree (isams_i); + return 0; +} + struct progressInfo { time_t startTime; time_t lastTime; @@ -587,10 +596,12 @@ void key_input (BFiles bfs, int nkeys, int cache) { Dict dict; + ISAMS isams = NULL; +#if ZMBOL ISAM isam = NULL; ISAMC isamc = NULL; - ISAMS isams = NULL; - ISAMH isamh = NULL; + ISAMD isamd = NULL; +#endif struct key_file **kf; char rbuf[1024]; int i, r; @@ -617,17 +628,20 @@ void key_input (BFiles bfs, int nkeys, int cache) logf (LOG_FATAL, "dict_open fail"); exit (1); } - if (res_get_match (common_resource, "isam", "s", NULL)) + if (res_get_match (common_resource, "isam", "s", ISAM_DEFAULT)) { + struct ISAMS_M_s isams_m; isams = isams_open (bfs, FNAME_ISAMS, 1, - key_isams_m (common_resource)); + key_isams_m (common_resource, &isams_m)); if (!isams) { logf (LOG_FATAL, "isams_open fail"); exit (1); } + logf (LOG_LOG, "isams opened"); } - else if (res_get_match (common_resource, "isam", "i", NULL)) +#if ZMBOL + else if (res_get_match (common_resource, "isam", "i", ISAM_DEFAULT)) { isam = is_open (bfs, FNAME_ISAM, key_compare, 1, sizeof(struct it_key), common_resource); @@ -637,26 +651,29 @@ void key_input (BFiles bfs, int nkeys, int cache) exit (1); } } - else if (res_get_match (common_resource, "isam", "h", NULL)) + else if (res_get_match (common_resource, "isam", "d", ISAM_DEFAULT)) { - isamh = isamh_open (bfs, FNAME_ISAMH, 1, - key_isamh_m (common_resource)); - if (!isamh) + 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, "isamh_open fail"); + logf (LOG_FATAL, "isamd_open fail"); exit (1); } } - else + else if (res_get_match (common_resource, "isam", "c", ISAM_DEFAULT)) { + struct ISAMC_M_s isamc_m; isamc = isc_open (bfs, FNAME_ISAMC, 1, - key_isamc_m (common_resource)); + key_isamc_m (common_resource, &isamc_m)); if (!isamc) { logf (LOG_FATAL, "isc_open fail"); exit (1); } } +#endif kf = (struct key_file **) xmalloc ((1+nkeys) * sizeof(*kf)); progressInfo.totalBytes = 0; progressInfo.totalOffset = 0; @@ -672,32 +689,38 @@ void key_input (BFiles bfs, int nkeys, int cache) } hi = key_heap_init (nkeys, key_qsort_compare); hi->dict = dict; + hi->isams = isams; +#if ZMBOL hi->isam = isam; hi->isamc = isamc; - hi->isams = isams; - hi->isamh = isamh; + hi->isamd = isamd; +#endif for (i = 1; i<=nkeys; i++) if ((r = key_file_read (kf[i], rbuf))) key_heap_insert (hi, rbuf, r, kf[i]); - if (isamc) - heap_inpc (hi); - else if (isams) + if (isams) heap_inps (hi); +#if ZMBOL + else if (isamc) + heap_inpc (hi); else if (isam) heap_inp (hi); - else if (isamh) - heap_inph (hi); + else if (isamd) + heap_inpd (hi); +#endif dict_close (dict); + if (isams) + isams_close (isams); +#if ZMBOL if (isam) is_close (isam); if (isamc) isc_close (isamc); - if (isams) - isams_close (isams); - if (isamh) - isamh_close (isamh); + if (isamd) + isamd_close (isamd); +#endif for (i = 1; i<=nkeys; i++) { @@ -709,13 +732,34 @@ 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.35 1999-06-30 15:07:23 heikki + * Revision 1.41 1999-11-30 13:48:03 adam + * Improved installation. Updated for inclusion of YAZ header files. + * + * 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). + * + * Revision 1.35 1999/06/30 15:07:23 heikki * Adding isamh stuff * * Revision 1.34 1999/05/26 07:49:13 adam