56 return "TODO:SOLR URI";
63 if (info->
off < 0 || (info->
off + l >= info->
max))
68 memcpy (info->
buf + info->
off, b, l);
102 const char *value_str = 0;
196 (*pp)->pattern =
xstrdup(pattern);
199 (*pp)->attr_list.num_attributes = ae_num;
201 (*pp)->attr_list.attributes = 0;
207 memcpy((*pp)->attr_list.attributes, ae,
243 while (fgets(line,
sizeof(line)-1, f))
302 FILE *f = fopen(fname,
"r");
318 #define Z_AttributeValue_numeric 1
319 #define Z_AttributeValue_complex 2
346 const char *category,
350 size_t clen = strlen(category);
353 if (!strncmp(e->
pattern, category, clen))
383 const char *pat1,
const char *pat2,
389 if (pat1 && pat2 && pat3)
390 sprintf(pattern,
"%.39s.%.39s.%.39s", pat1, pat2, pat3);
391 else if (pat1 && pat2)
392 sprintf(pattern,
"%.39s.%.39s", pat1, pat2);
393 else if (pat1 && pat3)
394 sprintf(pattern,
"%.39s.%.39s", pat1, pat3);
396 sprintf(pattern,
"%.39s", pat1);
409 const char *uri,
const char *val,
const char *default_val,
410 void (*pr)(
const char *buf,
void *client_data),
415 const char *eval = val ? val : default_val;
416 const char *prefix = 0;
424 !strcmp(e->
value, uri))
437 if (!res && !prefix && !strcmp(category,
"relation"))
439 if (!strcmp(val,
"=="))
441 if (!strcmp(val,
"="))
443 if (!strcmp(val,
"<="))
445 if (!strcmp(val,
">="))
455 const char *cp0 = res, *cp1;
456 while ((cp1 = strchr(cp0,
'=')))
459 while (*cp1 && *cp1 !=
' ')
461 if (cp1 - cp0 >= (ptrdiff_t)
sizeof(buf))
463 memcpy(buf, cp0, cp1 - cp0);
465 (*pr)(
"@attr ", client_data);
467 for (i = 0; buf[i]; i++)
470 (*pr)(eval, client_data);
476 (*pr)(tmp, client_data);
479 (*pr)(
" ", client_data);
487 if (errcode && !ct->
error)
499 const char *val,
const char *default_val,
500 void (*pr)(
const char *buf,
void *client_data),
505 val, default_val, pr, client_data, errcode);
510 void (*pr)(
const char *buf,
void *client_data),
514 sprintf(buf,
"%d", val);
515 (*pr)(buf, client_data);
516 (*pr)(
" ", client_data);
521 void (*pr)(
const char *buf,
void *client_data),
532 const char *
name = mods->
u.
st.index;
533 const char *term = mods->
u.
st.term;
534 const char *relation = mods->
u.
st.relation;
536 if (!strcmp(name,
"distance")) {
537 distance = strtol(term, (
char**) 0, 0);
538 if (!strcmp(relation,
"="))
540 else if (!strcmp(relation,
">"))
542 else if (!strcmp(relation,
"<"))
544 else if (!strcmp(relation,
">="))
546 else if (!strcmp(relation,
"<="))
548 else if (!strcmp(relation,
"<>"))
557 else if (!strcmp(name,
"ordered"))
559 else if (!strcmp(name,
"unordered"))
561 else if (!strcmp(name,
"unit"))
563 if (!strcmp(term,
"word"))
565 else if (!strcmp(term,
"sentence"))
567 else if (!strcmp(term,
"paragraph"))
569 else if (!strcmp(term,
"element"))
584 mods = mods->
u.
st.modifiers;
588 distance = (unit == 2) ? 1 : 0;
594 (*pr)(
"k ", client_data);
604 static const char *
wcchar(
int start,
const char *term,
int length)
608 if (start || term[-1] !=
'\\')
609 if (strchr(
"*?", *term))
622 for (mod = cn->
u.
st.modifiers; mod != 0; mod = mod->
u.
st.modifiers) {
623 if (!strcmp(mod->
u.
st.index, name))
633 const char *
term,
int length,
634 void (*pr)(
const char *buf,
void *client_data),
638 const char *ns = cn->
u.
st.index_uri;
644 if (process_term && length > 0)
646 if (length > 1 && term[0] ==
'^' && term[length-1] ==
'^')
653 else if (term[0] ==
'^')
660 else if (term[length-1] ==
'^')
673 if (process_term && length > 0)
675 const char *first_wc =
wcchar(1, term, length);
676 const char *second_wc = first_wc ?
677 wcchar(0, first_wc+1, length-(first_wc-term)-1) : 0;
685 if (first_wc == term && second_wc == term + length-1
686 && *first_wc ==
'*' && *second_wc ==
'*'
687 &&
solr_pr_attr(ct,
"truncation",
"both", 0, pr, client_data, 0))
692 else if (first_wc == term && second_wc == 0 && *first_wc ==
'*'
699 else if (first_wc == term + length-1 && second_wc == 0
720 z3958_mem = (
char *)
xmalloc(length+1);
721 for (i = 0; i < length; i++)
723 if (i > 0 && term[i-1] ==
'\\')
724 z3958_mem[i] = term[i];
725 else if (term[i] ==
'*')
727 else if (term[i] ==
'?')
730 z3958_mem[i] = term[i];
732 z3958_mem[length] =
'\0';
743 cn->
u.
st.index,
"serverChoice",
746 if (cn->
u.
st.modifiers)
749 for (; mod; mod = mod->
u.
st.modifiers)
756 (*pr)(
"\"", client_data);
757 for (i = 0; i<length; i++)
766 (*pr)(buf, client_data);
768 (*pr)(
"\" ", client_data);
774 void (*pr)(
const char *buf,
void *client_data),
781 (*pr)(
"@", client_data);
782 (*pr)(op, client_data);
783 (*pr)(
" ", client_data);
787 for (; ne; ne = ne->
u.
st.extra_terms)
789 if (ne->
u.
st.extra_terms)
791 (*pr)(
"@", client_data);
792 (*pr)(op, client_data);
793 (*pr)(
" ", client_data);
802 void (*pr)(
const char *buf,
void *client_data),
806 const char *cp0 = cn->
u.
st.term;
808 const char *last_term = 0;
814 cp1 = strchr(cp0,
' ');
817 (*pr)(
"@", client_data);
818 (*pr)(op, client_data);
819 (*pr)(
" ", client_data);
820 emit_term(ct, cn, last_term, last_length, pr, client_data);
824 last_length = cp1 - cp0;
826 last_length = strlen(cp0);
830 emit_term(ct, cn, last_term, last_length, pr, client_data);
835 void (*pr)(
const char *buf,
void *client_data),
846 ns = cn->
u.
st.index_uri;
853 (*pr)(
"@set \"", client_data);
854 (*pr)(cn->
u.
st.term, client_data);
855 (*pr)(
"\" ", client_data);
880 (*pr)(
"@", client_data);
881 (*pr)(cn->
u.
boolean.value, client_data);
882 (*pr)(
" ", client_data);
884 if (!strcmp(cn->
u.
boolean.value,
"prox"))
902 fprintf(stderr,
"Fatal: impossible SOLR node-type %d\n", cn->
which);
908 void (*pr)(
const char *buf,
void *client_data),
954 sprintf(numbuf,
"%ld", (
long) info.
max);
959 info.
buf[info.
off] =
'\0';