2 * Copyright (C) 1994-1995, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.7 1995-09-11 13:09:32 adam
8 * More work on relevance feedback.
10 * Revision 1.6 1995/09/08 14:52:27 adam
11 * Minor changes. Dictionary is lower case now.
13 * Revision 1.5 1995/09/06 16:11:16 adam
14 * Option: only one word key per file.
16 * Revision 1.4 1995/09/05 15:28:39 adam
17 * More work on search engine.
19 * Revision 1.3 1995/09/04 12:33:41 adam
20 * Various cleanup. YAZ util used instead.
22 * Revision 1.2 1995/09/04 09:10:34 adam
23 * More work on index add/del/update.
24 * Merge sort implemented.
25 * Initial work on z39 server.
27 * Revision 1.1 1995/09/01 14:06:35 adam
28 * Split of work into more files.
40 #define KEY_BUF_SIZE 100000
43 static SYSNO sysno_next;
44 static int key_fd = -1;
45 static int sys_idx_fd = -1;
47 static int key_offset;
49 void key_open (const char *fname)
54 if ((key_fd = open (fname, O_RDWR|O_CREAT, 0666)) == -1)
56 logf (LOG_FATAL|LOG_ERRNO, "open %s", fname);
59 logf (LOG_DEBUG, "key_open of %s", fname);
60 if (!(key_buf = malloc (KEY_BUF_SIZE)))
62 logf (LOG_FATAL|LOG_ERRNO, "malloc");
66 if (!(file_idx = dict_open (FNAME_FILE_DICT, 40, 1)))
68 logf (LOG_FATAL, "dict_open fail of %s", "fileidx");
71 file_key = dict_lookup (file_idx, ".");
73 memcpy (&sysno_next, (char*)file_key+1, sizeof(sysno_next));
76 if ((sys_idx_fd = open (FNAME_SYS_IDX, O_RDWR|O_CREAT, 0666)) == -1)
78 logf (LOG_FATAL|LOG_ERRNO, "open %s", FNAME_SYS_IDX);
87 logf (LOG_DEBUG, "key_close - but no file");
92 dict_insert (file_idx, ".", sizeof(sysno_next), &sysno_next);
93 dict_close (file_idx);
95 logf (LOG_DEBUG, "key close - key file exist");
106 while (i < key_offset)
108 w = write (key_fd, key_buf + i, key_offset - i);
111 logf (LOG_FATAL|LOG_ERRNO, "Write key fail");
119 void key_write (int cmd, struct it_key *k, const char *str)
122 size_t slen = strlen(str);
124 if (key_offset + sizeof(*k) + slen >= KEY_BUF_SIZE - 2)
126 x = (cmd == 'a') ? 1 : 0;
127 memcpy (key_buf + key_offset, str, slen+1);
128 key_offset += slen+1;
129 memcpy (key_buf + key_offset, &x, 1);
131 memcpy (key_buf + key_offset, k, sizeof(*k));
132 key_offset += sizeof(*k);
135 #if !IT_KEY_HAVE_SEQNO
136 void key_write_x (struct strtab *t, int cmd, struct it_key *k, const char *str)
140 if (strtab_src (t, str, &oldinfo))
141 ((struct it_key *) *oldinfo)->freq++;
144 *oldinfo = xmalloc (sizeof(*k));
145 memcpy (*oldinfo, k, sizeof(*k));
146 ((struct it_key *) *oldinfo)->freq = 1;
151 void key_rec_flush (const char *str, void *info, void *data)
153 key_write (*((int*) data), (struct it_key *)info, str);
157 void text_extract (struct strtab *t, SYSNO sysno, int cmd, const char *fname)
161 #if IT_KEY_HAVE_SEQNO
167 logf (LOG_DEBUG, "Text extract of %d", sysno);
169 inf = fopen (fname, "r");
172 logf (LOG_WARN|LOG_ERRNO, "open %s", fname);
175 while ((c=getc (inf)) != EOF)
178 while (i < IT_MAX_WORD-1 && c != EOF && isalnum(c))
180 w[i++] = index_char_cvt (c);
187 #if IT_KEY_HAVE_FIELD
190 #if IT_KEY_HAVE_SEQNO
192 key_write (cmd, &k, w);
194 key_write_x (t, cmd, &k, w);
203 void file_extract (int cmd, const char *fname, const char *kname)
209 const char *file_type;
213 logf (LOG_DEBUG, "%c %s k=%s", cmd, fname, kname);
214 for (i = strlen(fname); --i >= 0; )
220 else if (fname[i] == '.')
222 strcpy (ext, fname+i+1);
225 sprintf (ext_res, "fileExtension.%s", ext);
226 if (!(file_type = res_get (common_resource, ext_res)))
229 file_info = dict_lookup (file_idx, kname);
232 sysno = sysno_next++;
233 dict_insert (file_idx, kname, sizeof(sysno), &sysno);
234 lseek (sys_idx_fd, sysno * SYS_IDX_ENTRY_LEN, SEEK_SET);
235 write (sys_idx_fd, kname, strlen(kname)+1);
238 memcpy (&sysno, (char*) file_info+1, sizeof(sysno));
240 if (!strcmp (file_type, "text"))
241 text_extract (t, sysno, cmd, fname);
242 strtab_del (t, key_rec_flush, &cmd);