+ RSET *rsets = nmem_malloc(stream, num_bases * sizeof(*rsets));
+ ZEBRA_RES res = ZEBRA_OK;
+ int i;
+ for (i = 0; i < num_bases; i++)
+ {
+
+ if (zebraExplain_curDatabase(zh->reg->zei, basenames[i]))
+ {
+ zebra_setError(zh, YAZ_BIB1_DATABASE_UNAVAILABLE,
+ basenames[i]);
+ res = ZEBRA_FAIL;
+ break;
+ }
+ res = rpn_search_database(zh, zapt, attributeSet, stream,
+ sort_sequence, 1, basenames+i,
+ rset_nmem, rsets+i, kc);
+ if (res != ZEBRA_OK)
+ break;
+ }
+ if (res != ZEBRA_OK)
+ { /* must clean up the already created sets */
+ int j;
+ for (i = 0; j < i; j++)
+ rset_delete(rsets[j]);
+ *rset = 0;
+ }
+ else
+ {
+ if (num_bases == 1)
+ *rset = rsets[0];
+ else if (num_bases == 0)
+ *rset = rset_create_null(rset_nmem, kc, 0);
+ else
+ *rset = rset_create_and(rset_nmem, kc, kc->scope,
+ num_bases, rsets);
+ }
+ return res;
+}
+
+static ZEBRA_RES rpn_search_database(ZebraHandle zh,
+ Z_AttributesPlusTerm *zapt,
+ const Odr_oid *attributeSet, NMEM stream,
+ Z_SortKeySpecList *sort_sequence,
+ int num_bases, char **basenames,
+ NMEM rset_nmem,
+ RSET *rset,
+ struct rset_key_control *kc)
+{