📄 query_man.c
字号:
{ if (qptr) { switch (qptr->type) { case LOGICAL: Debug (75, 4, ("node is LOGICAL; llist=%x rlist=%x\n", qptr->llist, qptr->rlist)); if (qptr->rlist) QM_free_qlist((qlist_t *) qptr->rlist); if (qptr->llist) QM_free_qlist((qlist_t *) qptr->llist); break; case FUNCTION: Debug (75, 4, ("node is FUNCTION; llist=%x rlist=%x\n", qptr->llist, qptr->rlist)); if (qptr->rlist) QM_free_args((arg_t *) qptr->rlist); if (qptr->llist) QM_free_qlist((qlist_t *) qptr->llist); break; case SELECT: Debug (75, 4, ("node is SELECT; llist=%x rlist=%x\n", qptr->llist, qptr->rlist)); if (qptr->rlist) { xfree(qptr->rlist); qptr->rlist = NULL; } if (qptr->llist) { xfree(qptr->llist); qptr->llist = NULL; } break; } xfree(qptr); qptr = NULL; } return SUCCESS;}#define BulkBeginStr "@DELETE{ }\n@REFRESH{ }\n@UPDATE{\n"static int QM_bulk_count;int QM_send_bulk_begin(sock)int sock;{ Debug(75, 1, ("Starting a Broker-to-Broker transfer...\n")); SWRITE(sock, BULK_SUC, strlen(BULK_SUC)); SWRITE(sock, BulkBeginStr, strlen(BulkBeginStr)); QM_bulk_count = 0; return SUCCESS;}int QM_send_bulk_end(sock)int sock;{ SWRITE(sock, "}\n", 2); /* close the @UPDATE */ SWRITE(sock, BULK_END, strlen(BULK_END)); Log("Bulk transfer returned %d objects.\n", QM_bulk_count); Debug(75, 1, ("Finished Broker-to-Broker transfer...\n")); return SUCCESS;}/* ----------------------------------------------------------------- QM_send_bulk_fd -- send a file to the socket ofile, based on FD ----------------------------------------------------------------- */int QM_send_bulk_fd(FD, ofile, tmp)fd_t FD;FILE *ofile;reg_t *tmp; /* needed for logging */{ FILE *ifile; char buf[BUFSIZ]; int n; if (tmp == NULL) return ERROR; LOGBULK_R(tmp); if ((ifile = SM_Read_Obj(FD)) == NULL) { return ERROR; } while ((n = fread(buf, 1, BUFSIZ, ifile)) > 0) { fwrite(buf, 1, n, ofile); } fclose(ifile); fflush(ofile); QM_bulk_count++; return SUCCESS;}/* * QM_return_attributes - Selects and returns the desired attributes * for FD to rsock socket. */void QM_return_attributes(FD, rsock)fd_t FD;int rsock;{ FILE *fp; Template *T = NULL; AVPair *pair; int i; char buf[BUFSIZ]; if (QM_nattlist <= 0) /* any attributes to return? */ return; /* Parse the SOIF */ if ((fp = SM_Read_Obj(FD)) != NULL) { init_parse_template_file(fp); T = parse_template(); finish_parse_template(); fclose(fp); } /* Valid SOIF? */ if (T == NULL) return; /* Now return the attributes */ for (i = 0; i < QM_nattlist; i++) { if ((pair = extract_AVPair(T->list, QM_attlist[i])) != NULL) { sprintf(buf, "%03d - %s %ld\n", BR_ATTRIBUTE, QM_attlist[i], (long) pair->vsize); (void) write(rsock, buf, strlen(buf)); (void) write(rsock, pair->value, pair->vsize); } } free_template(T); /* clean up */}#ifdef QM_RET_EMBED_ATT/* * QM_return_embed_attrs - Selects and returns the desired attributes * of the form embed<nn>-attr for matched lines for FD to rsock socket. * * Experimental --DW */void QM_return_embed_attrs(FD, rsock, num)fd_t FD;int rsock;int num;{ FILE *fp; Template *T = NULL; AVPair *pair; int i; char buf[BUFSIZ]; char embedattr[128]; if (QM_nattlist <= 0) /* any attributes to return? */ return; /* Parse the SOIF */ if ((fp = SM_Read_Obj(FD)) != NULL) { init_parse_template_file(fp); T = parse_template(); finish_parse_template(); fclose(fp); } /* Valid SOIF? */ if (T == NULL) return; /* Now return the attributes */ for (i = 0; i < QM_nattlist; i++) { sprintf (embedattr, "embed<%d>-%s", num, QM_attlist[i]); if ((pair = extract_AVPair(T->list, embedattr)) != NULL) { sprintf(buf, "%03d - %s %ld\n", BR_ATTRIBUTE, QM_attlist[i], (long) pair->vsize); (void) write(rsock, buf, strlen(buf)); (void) write(rsock, pair->value, pair->vsize); } } free_template(T); /* clean up */}/*** QM_find_embed_attrs**** Searches for 'embed<num>-' on a matched line (Glimpse only).** If found, passes 'num' to QM_return_embed_attrs()*/void QM_find_embed_attrs (FD, rsock, ml)fd_t FD;int rsock;char *ml;{ int num; char jnk[64]; if (sscanf (ml, "Matched line: embed<%d>-", &num) == 1) { QM_return_embed_attrs(FD, rsock, num); } else if (sscanf (ml, "Matched line: %[^#]# embed<%d>-", jnk, &num) == 2) { QM_return_embed_attrs(FD, rsock, num); }}#endif/* ----------------------------------------------------------------- * QM_user_object -- send data about an object back to user. * ----------------------------------------------------------------- */int QM_user_object(rsock, fd, opsize, opdata)int rsock;fd_t fd;int opsize;char *opdata[];{ reg_t *entry; int i; char buf[BUFSIZ], *s; int len; /* Be careful not to sprintf something too large! */ if ((entry = RG_Get_Entry(fd)) == NULL) return FAIL; /* ----- Show URL ----- */ sprintf(buf, "%03d - %s\n", BR_URL, entry->url); SWRITE(rsock, buf, strlen(buf)); /* ----- Show Description ----- */ if (QM_descflag == 1 && entry->desc != NULL && entry->descs > 0) { sprintf(buf, "%03d - %d\n", BR_DESCRIPTION, entry->descs); SWRITE(rsock, buf, strlen(buf)); SWRITE(rsock, entry->desc, entry->descs); } /* ----- Pointer to Summary Object ----- */ s = SM_Get_Obj_URL(fd); sprintf(buf, "%03d - %s\n", BR_SUMMARY_URL, s); xfree(s); s = NULL; SWRITE(rsock, buf, strlen(buf)); /* ----- Opaque Data ----- */ if (QM_opaqueflag == 1) { for (i = 0; i < opsize; i++) { if (opdata[i] && (len = strlen(opdata[i])) > 0) { if (len > (BUFSIZ-15)) *(opdata[i]+BUFSIZ-15) = '\0'; sprintf(buf, "%03d - %s\n", BR_OPAQUE_DATA, opdata[i]); SWRITE(rsock, buf, strlen(buf));#ifdef QM_RET_EMBED_ATT if (QM_nattlist > 0) QM_find_embed_attrs (fd, rsock, opdata[i]);#endif } } } /* ----- Attribute Requests ----- */ QM_return_attributes(fd, rsock); /* ----- Object End ----- */ sprintf (buf, "%d - object end\n", BR_END_OBJECT); SWRITE(rsock, buf, strlen(buf)); LOGQUERY_R(entry); return SUCCESS;}/* ----------------------------------------------------------------- QM_user_done -- send trailer information from user query. ----------------------------------------------------------------- */int QM_user_done(rsock, count)int rsock, count;{ char ret[BUFSIZ]; extern char *BrkHomePage, *WebServer; QM_free_attributes(); /* do this first */ if (BrkHomePage != NULL && WebServer != NULL) { sprintf(ret, "%03d - http://%s%s\n", BR_BROKER_URL, WebServer, BrkHomePage); SWRITE(rsock, ret, strlen(ret)); } /* End the Query results with 103 */ sprintf(ret, "%03d - %d Returned Object(s).\n", BR_END_RESULTS, count); Log("Query returned %d objects.\n", count); SWRITE(rsock, ret, strlen(ret)); return SUCCESS;}/* * QM_add_attribute() - Adds the given #attribute argument to the * query. Must normalize the attribute name. */int QM_add_attribute(att)char *att;{ QM_attlist[QM_nattlist] = xstrdup(att); (void)COL_Normalize_Name(QM_attlist[QM_nattlist]); Debug(75,5,("QM: Adding attribute: %s\n",QM_attlist[QM_nattlist])); QM_nattlist++; return SUCCESS;}int QM_free_attributes(){ int i; for (i = 0; i < QM_nattlist; i++) { if (QM_attlist[i] != NULL) { xfree(QM_attlist[i]); QM_attlist[i] = NULL; } } QM_nattlist = 0; return SUCCESS;}int QM_user_warning(rsock, message)int rsock;char *message;{ char ret[BUFSIZ]; sprintf(ret, "%03d - %s\n", BR_USER_MSG, message); SWRITE(rsock, ret, strlen(ret)); return SUCCESS;}int QM_send_bulk_err(sock)int sock;{ Debug(75, 1, ("Error occurred in Broker-to-Broker transfer.\n")); SWRITE(sock, BULK_ERR, strlen(BULK_ERR)); return SUCCESS;}static void admin_log(n,s)int n;char *s;{ char *p, *q, *w, *t, buf[BUFSIZ]; /* remove password from broker.out */ for (t = buf, w = s; *w; ) *t++ = tolower(*w++); if ((p = (char *) strstr(buf, "#password")) != NULL) { p += strlen("#password"); q = strchr(p+1, '#'); q = (q == NULL) ? t : q - 1; for (t = buf, w = s; *w; t++, w++) *t = (t < p || t > q) ? *w : 'X'; *t = '\0'; Log("Processing Admin Command %d: %s\n", n, buf); } else { Log("Processing Admin Command %d: %s\n", n, s); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -