1 /* Gateway kernel - Z39.50 Persistence
5 * Revision 1.2 1995/04/19 10:46:19 adam
6 * Persistency works much better now. New command: status - history-like
8 * Revision 1.1 1995/04/19 07:31:10 adam
9 * First work on Z39.50 persistence.
23 static int fgetsx (char *buf, int size, FILE *inf)
27 if (!fgets (buf, size, inf))
29 if ((cp = strchr (buf, '\n')))
34 static int set_change;
36 static int obtain_set (ZASS zass, struct gw_user_set *set)
38 const struct zass_searchent *p;
40 p = zass_search (zass, set->rpn, set->name, set->database);
45 if (p->num != set->hits)
47 set->present_flag = 1;
49 gw_log (GW_LOG_DEBUG, KERNEL_LOG, "Set %s researched", set->name);
53 static int obtain_sets (ZASS zass, struct ccl_rpn_node *rpn,
54 struct gw_user_set *sets)
56 struct gw_user_set *set;
65 if ((r=obtain_sets (zass, rpn->u.p[0], sets)))
67 return obtain_sets (zass, rpn->u.p[1], sets);
71 set = user_set_search (rpn->u.setname);
74 gw_log (GW_LOG_DEBUG, KERNEL_LOG, "Set %s not there at all",
78 if (set->present_flag)
80 gw_log (GW_LOG_DEBUG, KERNEL_LOG, "Set %s already there",
85 return obtain_set (zass, set);
88 const struct zass_searchent *zass_p_search (ZASS zass,
89 struct ccl_rpn_node *rpn,
90 const char *result_set,
92 struct gw_user_set *sets)
97 r = obtain_sets (zass, rpn, sets);
100 return zass_search (zass, rpn, (char*) result_set, (char*) database);
103 const struct zass_presentent *zass_p_present (ZASS zass,
104 const char *result_set, int offset, int number)
106 struct gw_user_set *set;
108 set = user_set_search (result_set);
111 if (!set->present_flag)
113 const struct zass_searchent *p;
115 p = zass_p_search (zass, set->rpn, result_set, set->database,
120 return zass_present (zass, (char*) result_set, offset, number);
123 struct ccl_rpn_node *load_rpn (char *buf, FILE *inf)
125 struct ccl_rpn_node *rpn;
126 struct ccl_rpn_attr **attrp;
127 int type, value, no_read;
130 if (!fgetsx (buf, 1024, inf))
135 rpn = malloc (sizeof (*rpn));
138 rpn->kind = CCL_RPN_AND;
139 rpn->u.p[0] = load_rpn (buf, inf);
140 rpn->u.p[1] = load_rpn (buf, inf);
143 rpn = malloc (sizeof (*rpn));
146 rpn->kind = CCL_RPN_OR;
147 rpn->u.p[0] = load_rpn (buf, inf);
148 rpn->u.p[1] = load_rpn (buf, inf);
151 rpn = malloc (sizeof (*rpn));
154 rpn->kind = CCL_RPN_NOT;
155 rpn->u.p[0] = load_rpn (buf, inf);
156 rpn->u.p[1] = load_rpn (buf, inf);
159 rpn = malloc (sizeof (*rpn));
162 rpn->kind = CCL_RPN_PROX;
163 rpn->u.p[0] = load_rpn (buf, inf);
164 rpn->u.p[1] = load_rpn (buf, inf);
167 rpn = malloc (sizeof (*rpn));
170 rpn->kind = CCL_RPN_TERM;
172 rpn->u.t.term = gw_strdup (buf+2);
173 attrp = &rpn->u.t.attr_list;
174 if (!fgetsx (buf, 1024, inf))
177 while (sscanf (cp, "%d %d%n", &type, &value, &no_read) > 1)
179 *attrp = malloc (sizeof(**attrp));
180 (*attrp)->type = type;
181 (*attrp)->value = value;
182 attrp = &(*attrp)->next;
188 rpn = malloc (sizeof (*rpn));
191 rpn->kind = CCL_RPN_SET;
192 rpn->u.setname = gw_strdup (buf+2);
197 int load_p_state (int userid)
205 struct gw_user_set *set;
207 sprintf (fname, "persist.%d", userid);
209 inf = fopen (fname, "r");
212 gw_log (GW_LOG_WARN|GW_LOG_ERRNO, KERNEL_LOG,
213 "Couldn't open %s", fname);
216 gw_log (GW_LOG_DEBUG, KERNEL_LOG,
217 "Reading persistence file %s", fname);
219 if (!fgetsx (fline, 1024, inf))
221 if (sscanf (fline, "%s", info.target) != 1)
225 if (!fgetsx (fline, 1024, inf))
227 free (info.database);
228 info.database = gw_strdup (fline);
230 if (!fgetsx (fline, 1024, inf))
232 if (sscanf (fline, "%d", &info.setno) != 1)
234 gw_log (GW_LOG_DEBUG, KERNEL_LOG,
235 "Reading persistence file %s (2)", fname);
237 while (fgetsx (fline, 1024, inf))
239 gw_log (GW_LOG_DEBUG, KERNEL_LOG,
240 "Reading persistence file %s (3)", fname);
241 if (sscanf (fline, "%s %d %s", resultname, &hits, database) != 3)
243 if (!fgetsx (fline, 1024, inf)) /* search string */
245 gw_log (GW_LOG_DEBUG, KERNEL_LOG,
246 "Adding %s, %d hits, database %s",
247 resultname, hits, database);
248 gw_log (GW_LOG_DEBUG, KERNEL_LOG, "Search string %s", fline);
249 set = user_set_add (resultname, hits, database, NULL, 0, fline);
250 set->rpn = load_rpn (fline, inf);
251 ccl_pr_tree (set->rpn, stderr);
252 fgetsx (fline, 1024, inf);
255 gw_log (GW_LOG_DEBUG, KERNEL_LOG, "Finished reading %s", fname);
259 static void save_rpn (struct ccl_rpn_node *rpn, FILE *of)
261 struct ccl_rpn_attr *attr;
267 save_rpn (rpn->u.p[0], of);
268 save_rpn (rpn->u.p[1], of);
272 save_rpn (rpn->u.p[0], of);
273 save_rpn (rpn->u.p[1], of);
277 save_rpn (rpn->u.p[0], of);
278 save_rpn (rpn->u.p[1], of);
282 save_rpn (rpn->u.p[0], of);
283 save_rpn (rpn->u.p[1], of);
286 fprintf (of, "T %s\n", rpn->u.t.term);
287 for (attr = rpn->u.t.attr_list; attr; attr = attr->next)
288 fprintf (of, "%d %d ", attr->type, attr->value);
292 fprintf (of, "S %s\n", rpn->u.setname);
296 static void save_sets (FILE *of, struct gw_user_set *sp)
300 save_sets (of, sp->prev);
301 fprintf (of, "%s %d %s\n%s\n", sp->name, sp->hits, sp->database,
303 save_rpn (sp->rpn, of);
307 int save_p_state (int userid)
312 sprintf (fname, "persist.%d", userid);
314 of = fopen (fname, "w");
317 gw_log (GW_LOG_WARN|GW_LOG_ERRNO, KERNEL_LOG,
318 "Couldn't open %s", fname);
321 gw_log (GW_LOG_DEBUG, KERNEL_LOG, "Writing persistence file %s", fname);
322 fprintf (of, "%s\n%s\n%d\n", info.target, info.database, info.setno);
323 save_sets (of, info.sets);