* 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.
*/
ISAMC isamc;
ISAMS isams;
ISAMH isamh;
+ ISAMD isamd;
};
struct heap_info *key_heap_init (int nkeys,
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;
ISAMC isamc = NULL;
ISAMS isams = NULL;
ISAMH isamh = NULL;
+ ISAMD isamd = NULL;
struct key_file **kf;
char rbuf[1024];
int i, r;
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;
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)))
heap_inp (hi);
else if (isamh)
heap_inph (hi);
+ else if (isamd)
+ heap_inpd (hi);
dict_close (dict);
if (isam)
isams_close (isams);
if (isamh)
isamh_close (isamh);
+ if (isamd)
+ isamd_close (isamd);
for (i = 1; i<=nkeys; i++)
{
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.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).
*