different from database's ...
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: pqformat.c,v 1.2 1999/04/25 19:27:44 tgl Exp $
+ * $Id: pqformat.c,v 1.3 1999/04/25 21:50:56 tgl Exp $
*
*-------------------------------------------------------------------------
*/
/*
* INTERFACE ROUTINES
- * Message output:
+ * Message assembly and output:
* pq_beginmessage - initialize StringInfo buffer
* pq_sendbyte - append a raw byte to a StringInfo buffer
* pq_sendint - append a binary integer to a StringInfo buffer
* the regular StringInfo routines, but this is discouraged since required
* MULTIBYTE conversion may not occur.
*
+ * Special-case message output:
+ * pq_puttextmessage - generate a MULTIBYTE-converted message in one step
+ *
* Message input:
* pq_getint - get an integer from connection
* pq_getstr - get a null terminated string from connection
buf->data = NULL;
}
+/* --------------------------------
+ * pq_puttextmessage - generate a MULTIBYTE-converted message in one step
+ *
+ * This is the same as the pqcomm.c routine pq_putmessage, except that
+ * the message body is a null-terminated string to which MULTIBYTE
+ * conversion applies.
+ *
+ * returns 0 if OK, EOF if trouble
+ * --------------------------------
+ */
+int
+pq_puttextmessage(char msgtype, const char *str)
+{
+ int slen = strlen(str);
+#ifdef MULTIBYTE
+ const char *p;
+ p = (const char *) pg_server_to_client((unsigned char *) str, slen);
+ if (p != str) /* actual conversion has been done? */
+ {
+ str = p;
+ slen = strlen(str);
+ }
+#endif
+ return pq_putmessage(msgtype, str, slen+1);
+}
+
/* --------------------------------
* pq_getint - get an integer from connection
*
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/tcop/dest.c,v 1.27 1999/04/25 19:27:45 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/tcop/dest.c,v 1.28 1999/04/25 21:50:57 tgl Exp $
*
*-------------------------------------------------------------------------
*/
* send fe info on tuples we're about to send
* ----------------
*/
- pq_putmessage('P', pname, strlen(pname)+1);
+ pq_puttextmessage('P', pname);
/* ----------------
* if this is a retrieve, then we send back the tuple
* ----------------
*/
sprintf(buf, "%s%s", commandTag, CommandInfo);
- pq_putmessage('C', buf, strlen(buf)+1);
+ pq_puttextmessage('C', buf);
CommandInfo[0] = '\0';
break;
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.42 1999/04/25 03:19:11 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.43 1999/04/25 21:50:57 tgl Exp $
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include "miscadmin.h"
#include "libpq/libpq.h"
+#include "libpq/pqformat.h"
#include "storage/proc.h"
#include "tcop/tcopprot.h"
#include "utils/trace.h"
msgtype = 'E';
}
/* exclude the timestamp from msg sent to frontend */
- pq_putmessage(msgtype, line + TIMESTAMP_SIZE,
- strlen(line + TIMESTAMP_SIZE) + 1);
+ pq_puttextmessage(msgtype, line + TIMESTAMP_SIZE);
/*
* This flush is normally not necessary, since postgres.c will
* flush out waiting data when control returns to the main loop.
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: pqformat.h,v 1.2 1999/04/25 19:27:47 tgl Exp $
+ * $Id: pqformat.h,v 1.3 1999/04/25 21:50:58 tgl Exp $
*
*-------------------------------------------------------------------------
*/
extern void pq_sendint(StringInfo buf, int i, int b);
extern void pq_endmessage(StringInfo buf);
+extern int pq_puttextmessage(char msgtype, const char *str);
+
extern int pq_getint(int *result, int b);
extern int pq_getstr(char *s, int maxlen);