2 * Copyright (C) 1995, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.3 1995-09-04 12:33:41 adam
8 * Various cleanup. YAZ util used instead.
10 * Revision 1.2 1995/09/04 09:10:34 adam
11 * More work on index add/del/update.
12 * Merge sort implemented.
13 * Initial work on z39 server.
15 * Revision 1.1 1995/09/01 14:06:35 adam
16 * Split of work into more files.
28 #define KEY_BUF_SIZE 100000
31 static SYSNO sysno_next;
32 static int key_fd = -1;
34 static int key_offset;
36 void key_open (const char *fname)
41 if ((key_fd = open (fname, O_RDWR|O_CREAT, 0666)) == -1)
43 logf (LOG_FATAL|LOG_ERRNO, "Creat %s", fname);
46 logf (LOG_DEBUG, "key_open of %s", fname);
47 if (!(key_buf = malloc (KEY_BUF_SIZE)))
49 logf (LOG_FATAL|LOG_ERRNO, "malloc");
53 if (!(file_idx = dict_open ("fileidx", 10, 1)))
55 logf (LOG_FATAL, "dict_open fail of %s", "fileidx");
58 file_key = dict_lookup (file_idx, ".");
60 memcpy (&sysno_next, (char*)file_key+1, sizeof(sysno_next));
69 logf (LOG_DEBUG, "key_close - but no file");
73 dict_insert (file_idx, ".", sizeof(sysno_next), &sysno_next);
74 dict_close (file_idx);
76 logf (LOG_DEBUG, "key close - key file exist");
87 while (i < key_offset)
89 w = write (key_fd, key_buf + i, key_offset - i);
92 logf (LOG_FATAL|LOG_ERRNO, "Write key fail");
100 void key_write (int cmd, struct it_key *k, const char *str)
103 size_t slen = strlen(str);
105 if (key_offset + sizeof(*k) + slen >= KEY_BUF_SIZE - 2)
107 x = (cmd == 'a') ? 1 : 0;
108 memcpy (key_buf + key_offset, str, slen+1);
109 key_offset += slen+1;
110 memcpy (key_buf + key_offset, &x, 1);
112 memcpy (key_buf + key_offset, k, sizeof(*k));
113 key_offset += sizeof(*k);
116 void text_extract (SYSNO sysno, int cmd, const char *fname)
124 logf (LOG_DEBUG, "Text extract of %d", sysno);
126 inf = fopen (fname, "r");
129 logf (LOG_WARN|LOG_ERRNO, "open %s", fname);
132 while ((c=getc (inf)) != EOF)
135 while (i < 254 && c != EOF && isalnum(c))
146 key_write (cmd, &k, w);
154 void file_extract (int cmd, const char *fname, const char *kname)
160 const char *file_type;
163 logf (LOG_DEBUG, "%c %s k=%s", cmd, fname, kname);
164 for (i = strlen(fname); --i >= 0; )
170 else if (fname[i] == '.')
172 strcpy (ext, fname+i+1);
175 sprintf (ext_res, "fileExtension.%s", ext);
176 if (!(file_type = res_get (common_resource, ext_res)))
179 file_info = dict_lookup (file_idx, kname);
182 sysno = sysno_next++;
183 dict_insert (file_idx, kname, sizeof(sysno), &sysno);
186 memcpy (&sysno, (char*) file_info+1, sizeof(sysno));
187 if (!strcmp (file_type, "text"))
188 text_extract (sysno, cmd, fname);