Perl Filter and Perl API
[idzebra-moved-to-github.git] / perl / zebra_api_ext.c
1 #include <assert.h>
2 #include <stdio.h>
3 #ifdef WIN32
4 #include <io.h>
5 #include <process.h>
6 #include <direct.h>
7 #else
8 #include <unistd.h>
9 #endif
10
11 #include <yaz/diagbib1.h>
12 #include "index.h"
13 #include <charmap.h>
14 #include <data1.h>
15 #include "rg.h"
16 #include "yaz/log.h"
17 #include <yaz/pquery.h>
18
19 void data1_print_tree(data1_handle dh, data1_node *n, FILE *out) {
20   data1_pr_tree(dh, n, stdout);
21 }
22
23 int zebra_get_shadow_enable (ZebraHandle zh) {
24   return (zh->shadow_enable);
25 }
26
27 void zebra_set_shadow_enable (ZebraHandle zh, int value) {
28   zh->shadow_enable = value;
29 }
30 /* recordGroup stuff */
31 void describe_recordGroup (recordGroup *rg) {
32   printf ("name:%s\ndatabaseName%s\npath:%s\n",
33           rg->groupName,
34           rg->databaseName,
35           rg->path);
36 }
37
38 void init_recordGroup (recordGroup *rg) {
39     rg->groupName = NULL;
40     rg->databaseName = NULL;
41     rg->path = NULL;
42     rg->recordId = NULL;
43     rg->recordType = NULL;
44     rg->flagStoreData = -1;
45     rg->flagStoreKeys = -1;
46     rg->flagRw = 1;
47     rg->databaseNamePath = 0;
48     rg->explainDatabase = 0;
49     rg->fileVerboseLimit = 100000;
50     rg->followLinks = -1;
51 }
52
53
54 /* This is from extract.c... it seems useful, when extract_rec_in mem is 
55    called... and in general... Should be moved to somewhere else */
56 void res_get_recordGroup (ZebraHandle zh,
57                           recordGroup *rGroup,
58                           const char *ext) {
59   char gprefix[128];
60   char ext_res[128];
61     
62   if (!rGroup->groupName || !*rGroup->groupName)
63     *gprefix = '\0';
64   else
65     sprintf (gprefix, "%s.", rGroup->groupName);
66   
67   /* determine file type - depending on extension */
68   if (!rGroup->recordType) {
69     sprintf (ext_res, "%srecordType.%s", gprefix, ext);
70     if (!(rGroup->recordType = res_get (zh->res, ext_res))) {
71       sprintf (ext_res, "%srecordType", gprefix);
72       rGroup->recordType = res_get (zh->res, ext_res);
73     }
74   }
75   /* determine match criteria */
76   if (!rGroup->recordId) {
77     sprintf (ext_res, "%srecordId.%s", gprefix, ext);
78     if (!(rGroup->recordId = res_get (zh->res, ext_res))) {
79       sprintf (ext_res, "%srecordId", gprefix);
80       rGroup->recordId = res_get (zh->res, ext_res);
81     }
82   }
83   
84   /* determine database name */
85   if (!rGroup->databaseName) {
86     sprintf (ext_res, "%sdatabase.%s", gprefix, ext);
87     if (!(rGroup->databaseName = res_get (zh->res, ext_res))) {
88       sprintf (ext_res, "%sdatabase", gprefix);
89       rGroup->databaseName = res_get (zh->res, ext_res);
90     }
91   }
92   if (!rGroup->databaseName)
93     rGroup->databaseName = "Default";
94
95   /* determine if explain database */
96   sprintf (ext_res, "%sexplainDatabase", gprefix);
97   rGroup->explainDatabase =
98     atoi (res_get_def (zh->res, ext_res, "0"));
99
100   /* storeData */
101   if (rGroup->flagStoreData == -1) {
102     const char *sval;
103     sprintf (ext_res, "%sstoreData.%s", gprefix, ext);
104     if (!(sval = res_get (zh->res, ext_res))) {
105       sprintf (ext_res, "%sstoreData", gprefix);
106       sval = res_get (zh->res, ext_res);
107     }
108     if (sval)
109       rGroup->flagStoreData = atoi (sval);
110   }
111   if (rGroup->flagStoreData == -1)  rGroup->flagStoreData = 0;
112
113   /* storeKeys */
114   if (rGroup->flagStoreKeys == -1)  {
115     const char *sval;
116     
117     sprintf (ext_res, "%sstoreKeys.%s", gprefix, ext);
118     sval = res_get (zh->res, ext_res);
119     if (!sval) {
120       sprintf (ext_res, "%sstoreKeys", gprefix);
121       sval = res_get (zh->res, ext_res);
122     }
123     if (!sval)  sval = res_get (zh->res, "storeKeys");
124     if (sval) rGroup->flagStoreKeys = atoi (sval);
125   }
126   if (rGroup->flagStoreKeys == -1) rGroup->flagStoreKeys = 0;
127   
128 }
129
130 /* ---------------------------------------------------------------------------
131   Record insert(=update), delete 
132
133   If sysno is provided, then it's used to identify the reocord.
134   If not, and match_criteria is provided, then sysno is guessed
135   If not, and a record is provided, then sysno is got from there
136
137 */
138
139 int zebra_update_record (ZebraHandle zh, 
140                          struct recordGroup *rGroup, 
141                          int sysno, const char *match, const char *fname,
142                          const char *buf, int buf_size)
143
144 {
145     int res;
146
147     if (buf_size < 1) buf_size = strlen(buf);
148
149     res=bufferExtractRecord (zh, buf, buf_size, rGroup, 
150                              0, // delete_flag
151                              0, // test_mode, 
152                              &sysno,
153                              match, fname);    
154   
155     return sysno;
156 }
157
158 int zebra_delete_record (ZebraHandle zh, 
159                          struct recordGroup *rGroup, 
160                          int sysno, const char *match, const char *fname,
161                          const char *buf, int buf_size)
162 {
163     int res;
164
165     if (buf_size < 1) buf_size = strlen(buf);
166
167     res=bufferExtractRecord (zh, buf, buf_size, rGroup, 
168                              1, // delete_flag
169                              0, // test_mode, 
170                              &sysno,
171                              match,fname);    
172     return sysno;
173 }
174 void zebra_search_RPN (ZebraHandle zh, ODR decode, ODR stream,
175                        Z_RPNQuery *query, const char *setname, int *hits)
176 {
177     zh->hits = 0;
178     *hits = 0;
179
180     if (zebra_begin_read (zh))
181         return;
182     resultSetAddRPN (zh, decode, stream, query, 
183                      zh->num_basenames, zh->basenames, setname);
184
185         zebra_end_read (zh);
186
187     *hits = zh->hits;
188 }
189
190 void zebra_retrieve_sysnos (ZebraHandle zh,
191                             const char *setname,
192                             int num_recs)
193 {                           
194   if (!zh->res) {
195     zh->errCode = 30;
196     /* zh->errString = odr_strdup (stream, setname); */
197     logf(LOG_FATAL,"No resources open");
198     return;
199   }
200
201   zh->errCode = 0;
202     if (zebra_begin_read (zh))
203         return;
204
205     zebra_end_read (zh);
206
207 }
208
209 int zebra_search_PQF (ZebraHandle zh, 
210                       ODR odr_input, ODR odr_output, 
211                       const char *pqf_query,
212                       const char *setname)
213
214 {
215   int hits;
216   Z_RPNQuery *query;
217   logf (LOG_LOG, "11");
218   query = p_query_rpn (odr_input, PROTO_Z3950, pqf_query);
219   logf (LOG_LOG, "22");
220
221   if (!query) {
222     logf (LOG_WARN, "bad query %s\n", pqf_query);
223     odr_reset (odr_input);
224     return(0);
225   }
226   zebra_search_RPN (zh, odr_input, odr_output, query, setname, &hits);
227
228   odr_reset (odr_input);
229   odr_reset (odr_output);
230   
231   return(hits);
232 }