More work on retrieve.
[idzebra-moved-to-github.git] / index / zserver.c
1 /*
2  * Copyright (C) 1994-1995, Index Data I/S 
3  * All rights reserved.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: zserver.c,v $
7  * Revision 1.7  1995-09-27 16:17:32  adam
8  * More work on retrieve.
9  *
10  * Revision 1.6  1995/09/08  08:53:22  adam
11  * Record buffer maintained in server_info.
12  *
13  * Revision 1.5  1995/09/06  16:11:18  adam
14  * Option: only one word key per file.
15  *
16  * Revision 1.4  1995/09/06  10:33:04  adam
17  * More work on present. Some log messages removed.
18  *
19  * Revision 1.3  1995/09/05  15:28:40  adam
20  * More work on search engine.
21  *
22  * Revision 1.2  1995/09/04  12:33:43  adam
23  * Various cleanup. YAZ util used instead.
24  *
25  * Revision 1.1  1995/09/04  09:10:41  adam
26  * More work on index add/del/update.
27  * Merge sort implemented.
28  * Initial work on z39 server.
29  *
30  */
31 #include <stdio.h>
32 #include <assert.h>
33 #include <unistd.h>
34 #include <fcntl.h>
35
36 #include "zserver.h"
37
38 #include <backend.h>
39 #include <dmalloc.h>
40
41 ZServerInfo server_info;
42
43 bend_initresult *bend_init (bend_initrequest *q)
44 {
45     static bend_initresult r;
46     static char *name = "zserver";
47
48     r.errcode = 0;
49     r.errstring = 0;
50     r.handle = name;
51
52     server_info.sets = NULL;
53     if (!(server_info.sys_idx_fd = open (FNAME_SYS_IDX, O_RDONLY)))
54     {
55         r.errcode = 1;
56         r.errstring = "dict_open fail: filedict";
57         return &r;
58     }
59     if (!(server_info.fileDict = dict_open (FNAME_FILE_DICT, 10, 0)))
60     {
61         r.errcode = 1;
62         r.errstring = "dict_open fail: filedict";
63         return &r;
64     }    
65     if (!(server_info.wordDict = dict_open (FNAME_WORD_DICT, 40, 0)))
66     {
67         dict_close (server_info.fileDict);
68         r.errcode = 1;
69         r.errstring = "dict_open fail: worddict";
70         return &r;
71     }    
72     if (!(server_info.wordIsam = is_open (FNAME_WORD_ISAM, key_compare, 0,
73                                           sizeof (struct it_key))))
74     {
75         dict_close (server_info.wordDict);
76         dict_close (server_info.fileDict);
77         r.errcode = 1;
78         r.errstring = "is_open fail: wordisam";
79         return &r;
80     }
81     server_info.recordBuf = NULL;
82     return &r;
83 }
84
85 bend_searchresult *bend_search (void *handle, bend_searchrequest *q, int *fd)
86 {
87     static bend_searchresult r;
88
89     r.errcode = 0;
90     r.errstring = 0;
91     r.hits = 0;
92
93     switch (q->query->which)
94     {
95     case Z_Query_type_1:
96         r.errcode = rpn_search (&server_info, q->query->u.type_1,
97                                 q->num_bases, q->basenames, q->setname,
98                                 &r.hits);
99         break;
100     default:
101         r.errcode = 107;
102     }
103     return &r;
104 }
105
106 bend_fetchresult *bend_fetch (void *handle, bend_fetchrequest *q, int *num)
107 {
108     static bend_fetchresult r;
109     int positions[2];
110     ZServerSetSysno *records;
111
112     r.errstring = 0;
113     r.last_in_set = 0;
114     r.basename = "base";
115
116     xfree (server_info.recordBuf);
117     server_info.recordBuf = NULL;
118     positions[0] = q->number;
119     records = resultSetSysnoGet (&server_info, q->setname, 1, positions);
120     if (!records)
121     {
122         logf (LOG_DEBUG, "resultSetRecordGet, error");
123         r.errcode = 13;
124         return &r;
125     }
126     if (!records[0].sysno)
127     {
128         r.errcode = 13;
129         logf (LOG_DEBUG, "Out of range. pos=%d", q->number);
130         return &r;
131     }
132 #if 0
133     r.len = records[0].size;
134     server_info.recordBuf = r.record = xmalloc (r.len+1);
135     strcpy (r.record, records[0].buf);
136     resultSetRecordDel (&server_info, records, 1);
137     r.format = VAL_SUTRS;
138     r.errcode = 0;
139 #endif
140     return &r;
141 }
142
143 bend_deleteresult *bend_delete (void *handle, bend_deleterequest *q, int *num)
144 {
145     return 0;
146 }
147
148 bend_scanresult *bend_scan (void *handle, bend_scanrequest *q, int *num)
149 {
150     static struct scan_entry list[200];
151     static char buf[200][200];
152     static bend_scanresult r;
153     int i;
154
155     r.term_position = q->term_position;
156     r.num_entries = q->num_entries;
157     r.entries = list;
158     for (i = 0; i < r.num_entries; i++)
159     {
160         list[i].term = buf[i];
161         sprintf(list[i].term, "term-%d", i+1);
162         list[i].occurrences = rand() % 100000;
163     }
164     r.errcode = 0;
165     r.errstring = 0;
166     return &r;
167 }
168
169 void bend_close (void *handle)
170 {
171     dict_close (server_info.fileDict);
172     dict_close (server_info.wordDict);
173     is_close (server_info.wordIsam);
174     close (server_info.sys_idx_fd);
175     xfree (server_info.recordBuf);
176     server_info.recordBuf = NULL;
177     return;
178 }
179
180 int main (int argc, char **argv)
181 {
182     char *base_name = "base";
183
184     if (!(common_resource = res_open (base_name)))
185     {
186         logf (LOG_FATAL, "Cannot open resource `%s'", base_name);
187         exit (1);
188     }
189     return statserv_main (argc, argv);
190 }