2 * Copyright (C) 1994-1995, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.11 1995-09-28 12:10:31 adam
8 * Bug fixes. Field prefix used in queries.
10 * Revision 1.10 1995/09/28 09:19:41 adam
11 * xfree/xmalloc used everywhere.
12 * Extract/retrieve method seems to work for text records.
14 * Revision 1.9 1995/09/27 12:22:28 adam
15 * More work on extract in record control.
16 * Field name is not in isam keys but in prefix in dictionary words.
18 * Revision 1.8 1995/09/14 07:48:22 adam
19 * Record control management.
21 * Revision 1.7 1995/09/11 13:09:32 adam
22 * More work on relevance feedback.
24 * Revision 1.6 1995/09/08 14:52:27 adam
25 * Minor changes. Dictionary is lower case now.
27 * Revision 1.5 1995/09/06 16:11:16 adam
28 * Option: only one word key per file.
30 * Revision 1.4 1995/09/05 15:28:39 adam
31 * More work on search engine.
33 * Revision 1.3 1995/09/04 12:33:41 adam
34 * Various cleanup. YAZ util used instead.
36 * Revision 1.2 1995/09/04 09:10:34 adam
37 * More work on index add/del/update.
38 * Merge sort implemented.
39 * Initial work on z39 server.
41 * Revision 1.1 1995/09/01 14:06:35 adam
42 * Split of work into more files.
56 static SYSNO sysno_next;
57 static int key_fd = -1;
58 static int sys_idx_fd = -1;
60 static int key_offset, key_buf_size;
64 void key_open (const char *fname)
69 if ((key_fd = open (fname, O_RDWR|O_CREAT, 0666)) == -1)
71 logf (LOG_FATAL|LOG_ERRNO, "open %s", fname);
74 logf (LOG_DEBUG, "key_open of %s", fname);
76 key_buf = xmalloc (key_buf_size);
78 if (!(file_idx = dict_open (FNAME_FILE_DICT, 40, 1)))
80 logf (LOG_FATAL, "dict_open fail of %s", "fileidx");
83 file_key = dict_lookup (file_idx, ".");
85 memcpy (&sysno_next, (char*)file_key+1, sizeof(sysno_next));
88 if ((sys_idx_fd = open (FNAME_SYS_IDX, O_RDWR|O_CREAT, 0666)) == -1)
90 logf (LOG_FATAL|LOG_ERRNO, "open %s", FNAME_SYS_IDX);
99 logf (LOG_DEBUG, "key_close - but no file");
104 dict_insert (file_idx, ".", sizeof(sysno_next), &sysno_next);
105 dict_close (file_idx);
111 void wordFlush (int sysno)
118 while (i < key_offset)
120 w = write (key_fd, key_buf + i, key_offset - i);
123 logf (LOG_FATAL|LOG_ERRNO, "Write key fail");
131 static void wordInit (RecWord *p)
135 p->which = Word_String;
138 static void wordAdd (const RecWord *p)
144 if (key_offset + 1000 > key_buf_size)
149 new_key_buf = xmalloc (2*key_buf_size);
150 memcpy (new_key_buf, key_buf, key_offset);
152 key_buf = new_key_buf;
154 key_offset += index_word_prefix (key_buf + key_offset,
155 p->attrSet, p->attrUse);
159 for (i = 0; p->u.string[i]; i++)
160 key_buf[key_offset++] = index_char_cvt (p->u.string[i]);
161 key_buf[key_offset++] = '\0';
166 x = (key_cmd == 'a') ? 1 : 0;
167 memcpy (key_buf + key_offset, &x, 1);
170 key.sysno = key_sysno;
171 key.seqno = p->seqno;
172 memcpy (key_buf + key_offset, &key, sizeof(key));
173 key_offset += sizeof(key);
176 void file_extract (int cmd, const char *fname, const char *kname)
182 const char *file_type;
185 struct recExtractCtrl extractCtrl;
188 logf (LOG_DEBUG, "%c %s k=%s", cmd, fname, kname);
189 for (i = strlen(fname); --i >= 0; )
195 else if (fname[i] == '.')
197 strcpy (ext, fname+i+1);
200 sprintf (ext_res, "fileExtension.%s", ext);
201 if (!(file_type = res_get (common_resource, ext_res)))
203 if (!(rt = recType_byName (file_type)))
205 file_info = dict_lookup (file_idx, kname);
208 sysno = sysno_next++;
209 dict_insert (file_idx, kname, sizeof(sysno), &sysno);
210 lseek (sys_idx_fd, sysno * SYS_IDX_ENTRY_LEN, SEEK_SET);
211 write (sys_idx_fd, file_type, strlen (file_type)+1);
212 write (sys_idx_fd, kname, strlen(kname)+1);
215 memcpy (&sysno, (char*) file_info+1, sizeof(sysno));
217 if (!(inf = fopen (fname, "r")))
219 logf (LOG_WARN|LOG_ERRNO, "open %s", fname);
222 extractCtrl.inf = inf;
223 extractCtrl.subType = "";
224 extractCtrl.init = wordInit;
225 extractCtrl.add = wordAdd;
228 (*rt->extract)(&extractCtrl);