⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fe-print.c

📁 关系型数据库 Postgresql 6.5.2
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -