Minor fix in bend_init where handle wasn't set to NULL when
[idzebra-moved-to-github.git] / index / kinput.c
index 4a635c0..f0649d6 100644 (file)
@@ -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;
@@ -619,8 +679,9 @@ void key_input (BFiles bfs, int nkeys, int cache)
     }
     if (res_get_match (common_resource, "isam", "s", NULL))
     {
+       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");
@@ -647,10 +708,22 @@ 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;
         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");
@@ -676,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)))
@@ -688,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)
@@ -698,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++)
     {
@@ -709,13 +787,31 @@ 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.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