📄 fe-print.c
字号:
fprintf(fp, "\n"); } if (!quiet) fprintf(fp, "\nQuery returned %d row%s.\n", PQntuples(res), (PQntuples(res) == 1) ? "" : "s"); fflush(fp);}/* * PQprintTuples() * * kept for backward compatibility * */voidPQprintTuples(PGresult *res, FILE *fout, /* output stream */ int PrintAttNames,/* print attribute names or not */ int TerseOutput, /* delimiter bars or not? */ int colWidth /* width of column, if 0, use variable * width */){ int nFields; int nTups; int i, j; char formatString[80]; char *tborder = NULL; nFields = PQnfields(res); nTups = PQntuples(res); if (colWidth > 0) sprintf(formatString, "%%s %%-%ds", colWidth); else sprintf(formatString, "%%s %%s"); if (nFields > 0) { /* only print rows with at least 1 field. */ if (!TerseOutput) { int width; width = nFields * 14; tborder = malloc(width + 1); for (i = 0; i <= width; i++) tborder[i] = '-'; tborder[i] = '\0'; fprintf(fout, "%s\n", tborder); } for (i = 0; i < nFields; i++) { if (PrintAttNames) { fprintf(fout, formatString, TerseOutput ? "" : "|", PQfname(res, i)); } } if (PrintAttNames) { if (TerseOutput) fprintf(fout, "\n"); else fprintf(fout, "|\n%s\n", tborder); } for (i = 0; i < nTups; i++) { for (j = 0; j < nFields; j++) { char *pval = PQgetvalue(res, i, j); fprintf(fout, formatString, TerseOutput ? "" : "|", pval ? pval : ""); } if (TerseOutput) fprintf(fout, "\n"); else fprintf(fout, "|\n%s\n", tborder); } }}#ifdef MULTIBYTE/* * returns the byte length of the word beginning s. * Client side encoding is determined by the environment variable * "PGCLIENTENCODING". * if this variable is not defined, the same encoding as * the backend is assumed. */intPQmblen(unsigned char *s){ char *str; int encoding = -1; str = getenv("PGCLIENTENCODING"); if (str && *str != '\0') encoding = pg_char_to_encoding(str); if (encoding < 0) encoding = MULTIBYTE; return (pg_encoding_mblen(encoding, s));}#else/* Provide a default definition in case someone calls it anyway */intPQmblen(unsigned char *s){ return 1;}#endif /* MULTIBYTE */static voiddo_field(PQprintOpt *po, PGresult *res, const int i, const int j, char *buf, const int fs_len, char **fields, const int nFields, char **fieldNames, unsigned char *fieldNotNum, int *fieldMax, const int fieldMaxLen, FILE *fout){ char *pval, *p, *o; int plen; bool skipit; plen = PQgetlength(res, i, j); pval = PQgetvalue(res, i, j); if (plen < 1 || !pval || !*pval) { if (po->align || po->expanded) skipit = true; else { skipit = false; goto efield; } } else skipit = false; if (!skipit) { char ch = 0;#ifdef MULTIBYTE int len; for (p = pval, o = buf; *p; len = PQmblen(p), memcpy(o, p, len), o += len, p += len)#else for (p = pval, o = buf; *p; *(o++) = *(p++))#endif { ch = *p; /* * Consensus on pgsql-interfaces (as of Aug 1998) seems to be * that the print functions ought not insert backslashes. If * you like them, you can re-enable this next bit. */#ifdef GRATUITOUS_BACKSLASHES if ((fs_len == 1 && (ch == *(po->fieldSep))) || ch == '\\' || ch == '\n') *(o++) = '\\';#endif if (po->align && !((ch >= '0' && ch <= '9') || ch == '.' || ch == 'E' || ch == 'e' || ch == ' ' || ch == '-')) fieldNotNum[j] = 1; } *o = '\0'; /* * Above loop will believe E in first column is numeric; also, we * insist on a digit in the last column for a numeric. This test * is still not bulletproof but it handles most cases. */ if (po->align && (*pval == 'E' || *pval == 'e' || !(ch >= '0' && ch <= '9'))) fieldNotNum[j] = 1; if (!po->expanded && (po->align || po->html3)) { int n = strlen(buf); if (n > fieldMax[j]) fieldMax[j] = n; if (!(fields[i * nFields + j] = (char *) malloc(n + 1))) { perror("malloc"); exit(1); } strcpy(fields[i * nFields + j], buf); } else { if (po->expanded) { if (po->html3) fprintf(fout, "<tr><td align=left><b>%s</b></td>" "<td align=%s>%s</td></tr>\n", fieldNames[j], fieldNotNum[j] ? "left" : "right", buf); else { if (po->align) fprintf(fout, "%-*s%s %s\n", fieldMaxLen - fs_len, fieldNames[j], po->fieldSep, buf); else fprintf(fout, "%s%s%s\n", fieldNames[j], po->fieldSep, buf); } } else { if (!po->html3) { fputs(buf, fout); efield: if ((j + 1) < nFields) fputs(po->fieldSep, fout); else fputc('\n', fout); } } } }}static char *do_header(FILE *fout, PQprintOpt *po, const int nFields, int *fieldMax, char **fieldNames, unsigned char *fieldNotNum, const int fs_len, PGresult *res){ int j; /* for loop index */ char *border = NULL; if (po->html3) fputs("<tr>", fout); else { int j; /* for loop index */ int tot = 0; int n = 0; char *p = NULL; for (; n < nFields; n++) tot += fieldMax[n] + fs_len + (po->standard ? 2 : 0); if (po->standard) tot += fs_len * 2 + 2; border = malloc(tot + 1); if (!border) { perror("malloc"); exit(1); } p = border; if (po->standard) { char *fs = po->fieldSep; while (*fs++) *p++ = '+'; } for (j = 0; j < nFields; j++) { int len; for (len = fieldMax[j] + (po->standard ? 2 : 0); len--; *p++ = '-'); if (po->standard || (j + 1) < nFields) { char *fs = po->fieldSep; while (*fs++) *p++ = '+'; } } *p = '\0'; if (po->standard) fprintf(fout, "%s\n", border); } if (po->standard) fputs(po->fieldSep, fout); for (j = 0; j < nFields; j++) { char *s = PQfname(res, j); if (po->html3) { fprintf(fout, "<th align=%s>%s</th>", fieldNotNum[j] ? "left" : "right", fieldNames[j]); } else { int n = strlen(s); if (n > fieldMax[j]) fieldMax[j] = n; if (po->standard) fprintf(fout, fieldNotNum[j] ? " %-*s " : " %*s ", fieldMax[j], s); else fprintf(fout, fieldNotNum[j] ? "%-*s" : "%*s", fieldMax[j], s); if (po->standard || (j + 1) < nFields) fputs(po->fieldSep, fout); } } if (po->html3) fputs("</tr>\n", fout); else fprintf(fout, "\n%s\n", border); return border;}static voidoutput_row(FILE *fout, PQprintOpt *po, const int nFields, char **fields, unsigned char *fieldNotNum, int *fieldMax, char *border, const int row_index){ int field_index; /* for loop index */ if (po->html3) fputs("<tr>", fout); else if (po->standard) fputs(po->fieldSep, fout); for (field_index = 0; field_index < nFields; field_index++) { char *p = fields[row_index * nFields + field_index]; if (po->html3) fprintf(fout, "<td align=%s>%s</td>", fieldNotNum[field_index] ? "left" : "right", p ? p : ""); else { fprintf(fout, fieldNotNum[field_index] ? (po->standard ? " %-*s " : "%-*s") : (po->standard ? " %*s " : "%*s"), fieldMax[field_index], p ? p : ""); if (po->standard || field_index + 1 < nFields) fputs(po->fieldSep, fout); } if (p) free(p); } if (po->html3) fputs("</tr>", fout); else if (po->standard) fprintf(fout, "\n%s", border); fputc('\n', fout);}/* simply send out max-length number of filler characters to fp */static voidfill(int length, int max, char filler, FILE *fp){ int count; count = max - length; while (count-- >= 0) putc(filler, fp);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -