mirror of
https://github.com/jackc/pgx.git
synced 2025-05-31 11:42:24 +00:00
Squashed commit of the following: commit c19454582b335ce5bdda6320f7e4e8c76cfeaf44 Author: Jack Christensen <jack@jackchristensen.com> Date: Fri Mar 3 15:24:47 2017 -0600 Add AssignTo to pgtype.Timestamptz Also handle infinity for pgtype.Date commit 7329933610b38f4bc15731b1f7c55c520b49e300 Author: Jack Christensen <jack@jackchristensen.com> Date: Fri Mar 3 15:12:18 2017 -0600 Implement AssignTo for most pgtypes commit cc3d1e4af896d34ec98c3bf2e982d0367451f21c Author: Jack Christensen <jack@jackchristensen.com> Date: Thu Mar 2 21:19:07 2017 -0600 Use pgtype.Int2Array in pgx commit 36da5cc2178d1a31a56dc6e6f128843bd80dea0b Author: Jack Christensen <jack@jackchristensen.com> Date: Tue Feb 28 21:45:33 2017 -0600 Add text array transcoding commit 1b0f18d99f38b69f8c2db26388815e67b2b03d59 Author: Jack Christensen <jack@jackchristensen.com> Date: Mon Feb 27 19:28:55 2017 -0600 Add ParseUntypedTextArray commit 0f50ce3e833fc38495d333228daf04f5142be676 Author: Jack Christensen <jack@jackchristensen.com> Date: Mon Feb 27 18:54:20 2017 -0600 wip commit d934f273627d79997035c282416db922f2fbe87a Author: Jack Christensen <jack@jackchristensen.com> Date: Sun Feb 26 17:14:32 2017 -0600 WIP - beginning text format array parsing commit 7276ad33ce7fa9c250745a3ed909998f3dae4a32 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Feb 25 22:50:11 2017 -0600 Beginning binary arrays commit 917faa5a3175d376222423c10aca297a20f96448 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Feb 25 19:36:35 2017 -0600 Fix incomplete tests commit de8c140cfb98b7b047d53c5718ccbf12eaf813a1 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Feb 25 19:32:22 2017 -0600 Add timestamptz null and infinity commit 7d9f954de4e071a1eccac762248079b90dbeb53f Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Feb 25 18:19:38 2017 -0600 Add infinity to pgtype.Date commit 7bf783ae20ba05571c2fb9f661183233c95eab41 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Feb 25 17:19:55 2017 -0600 Add Status to pgtype.Date commit 984500455c9b9a4b6221758540d248e6410d93a4 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Feb 25 16:54:01 2017 -0600 Add status to Int4 and Int8 commit 6fe76fcfc2de31552790db3b093480a9d5b2a742 Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Feb 25 16:40:27 2017 -0600 Extract testSuccessfulTranscode commit 001647c1da03f796014cf21f41c9a7fd2cfadfde Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Feb 25 16:15:51 2017 -0600 Add Status to pgtype.Int2 commit 720451f06d13d9c9fa2a0482e010f24bf4627c2a Author: Jack Christensen <jack@jackchristensen.com> Date: Sat Feb 25 15:56:44 2017 -0600 Add status to pgtype.Bool commit 325f700b6edff215a692b10bc5b94cdfe1100769 Author: Jack Christensen <jack@jackchristensen.com> Date: Fri Feb 24 17:28:15 2017 -0600 Add date to conversion system commit 4a9343e45d3897f59eab98a0009d2ddbe07e02d7 Author: Jack Christensen <jack@jackchristensen.com> Date: Fri Feb 24 16:28:35 2017 -0600 Add bool to oid based encoding commit d984fcafab1476cf84852485b6711f4b2069eb6d Author: Jack Christensen <jack@jackchristensen.com> Date: Fri Feb 24 16:15:38 2017 -0600 Add pgtype interfaces commit 0f93bfc2de4023b069b966c0988bf7f0469d1809 Author: Jack Christensen <jack@jackchristensen.com> Date: Fri Feb 24 14:48:34 2017 -0600 Begin introduction of Convert commit e5707023cac7c07342b8c910e480d09a1caaf6ee Author: Jack Christensen <jack@jackchristensen.com> Date: Fri Feb 24 14:10:56 2017 -0600 Move bool to pgtype commit bb764d2129efe7fb21e841dbb35e6d0dc7586d37 Author: Jack Christensen <jack@jackchristensen.com> Date: Fri Feb 24 13:45:05 2017 -0600 Add Int2 test commit 08c49437f455a32f7c3f0a524cd21a895d440301 Author: Jack Christensen <jack@jackchristensen.com> Date: Fri Feb 24 13:44:09 2017 -0600 Add Int4 test commit 16722952222fd15c53c8fa84974645504a6d0dc0 Author: Jack Christensen <jack@jackchristensen.com> Date: Fri Feb 24 08:56:59 2017 -0600 Add int8 tests commit 83a5447cd2c46b58d0880023cc4e9af0c84988a2 Author: Jack Christensen <jack@jackchristensen.com> Date: Wed Feb 22 18:08:05 2017 -0600 wip commit 0ca0ee72068a72b016729b01fccef22474595285 Author: Jack Christensen <jack@jackchristensen.com> Date: Mon Feb 20 18:56:52 2017 -0600 wip commit d2c2baf4ea2cd0793d68c7094c425217df952bec Author: Jack Christensen <jack@jackchristensen.com> Date: Mon Feb 20 18:46:10 2017 -0600 wip commit f78371da0098356527b193fd496a338da5fe414b Author: Jack Christensen <jack@jackchristensen.com> Date: Mon Feb 20 17:43:39 2017 -0600 wip commit 3366699bea62ec0110db05f3cb2998d58ac9ce5d Author: Jack Christensen <jack@jackchristensen.com> Date: Mon Feb 20 14:07:47 2017 -0600 wip commit 66b79e940870fd0133ebb10ac1547e1d4d7d0b51 Author: Jack Christensen <jack@jackchristensen.com> Date: Mon Feb 20 13:35:37 2017 -0600 Extract pgio commit 8b07d97d1305ed98fd76db6e306a289c0af92d56 Author: Jack Christensen <jack@jackchristensen.com> Date: Mon Feb 20 13:20:00 2017 -0600 wip commit 62f1adb3427f4317b708da075dce50c4d4daff7b Author: Jack Christensen <jack@jackchristensen.com> Date: Mon Feb 20 12:08:46 2017 -0600 wip commit a712d2546933a5a8433c65eef0ff2ee135077c87 Author: Jack Christensen <jack@jackchristensen.com> Date: Mon Feb 20 09:30:52 2017 -0600 wip commit 4faf97cc588126dda160fc360680719572a23105 Author: Jack Christensen <jack@jackchristensen.com> Date: Fri Feb 17 22:20:18 2017 -0600 wip
166 lines
3.8 KiB
Go
166 lines
3.8 KiB
Go
package pgx
|
|
|
|
import (
|
|
"encoding/binary"
|
|
)
|
|
|
|
const (
|
|
protocolVersionNumber = 196608 // 3.0
|
|
)
|
|
|
|
const (
|
|
backendKeyData = 'K'
|
|
authenticationX = 'R'
|
|
readyForQuery = 'Z'
|
|
rowDescription = 'T'
|
|
dataRow = 'D'
|
|
commandComplete = 'C'
|
|
errorResponse = 'E'
|
|
noticeResponse = 'N'
|
|
parseComplete = '1'
|
|
parameterDescription = 't'
|
|
bindComplete = '2'
|
|
notificationResponse = 'A'
|
|
emptyQueryResponse = 'I'
|
|
noData = 'n'
|
|
closeComplete = '3'
|
|
flush = 'H'
|
|
copyInResponse = 'G'
|
|
copyData = 'd'
|
|
copyFail = 'f'
|
|
copyDone = 'c'
|
|
)
|
|
|
|
type startupMessage struct {
|
|
options map[string]string
|
|
}
|
|
|
|
func newStartupMessage() *startupMessage {
|
|
return &startupMessage{map[string]string{}}
|
|
}
|
|
|
|
func (s *startupMessage) Bytes() (buf []byte) {
|
|
buf = make([]byte, 8, 128)
|
|
binary.BigEndian.PutUint32(buf[4:8], uint32(protocolVersionNumber))
|
|
for key, value := range s.options {
|
|
buf = append(buf, key...)
|
|
buf = append(buf, 0)
|
|
buf = append(buf, value...)
|
|
buf = append(buf, 0)
|
|
}
|
|
buf = append(buf, ("\000")...)
|
|
binary.BigEndian.PutUint32(buf[0:4], uint32(len(buf)))
|
|
return buf
|
|
}
|
|
|
|
type FieldDescription struct {
|
|
Name string
|
|
Table OID
|
|
AttributeNumber int16
|
|
DataType OID
|
|
DataTypeSize int16
|
|
DataTypeName string
|
|
Modifier int32
|
|
FormatCode int16
|
|
}
|
|
|
|
// PgError represents an error reported by the PostgreSQL server. See
|
|
// http://www.postgresql.org/docs/9.3/static/protocol-error-fields.html for
|
|
// detailed field description.
|
|
type PgError struct {
|
|
Severity string
|
|
Code string
|
|
Message string
|
|
Detail string
|
|
Hint string
|
|
Position int32
|
|
InternalPosition int32
|
|
InternalQuery string
|
|
Where string
|
|
SchemaName string
|
|
TableName string
|
|
ColumnName string
|
|
DataTypeName string
|
|
ConstraintName string
|
|
File string
|
|
Line int32
|
|
Routine string
|
|
}
|
|
|
|
func (pe PgError) Error() string {
|
|
return pe.Severity + ": " + pe.Message + " (SQLSTATE " + pe.Code + ")"
|
|
}
|
|
|
|
func newWriteBuf(c *Conn, t byte) *WriteBuf {
|
|
buf := append(c.wbuf[0:0], t, 0, 0, 0, 0)
|
|
c.writeBuf = WriteBuf{buf: buf, sizeIdx: 1, conn: c}
|
|
return &c.writeBuf
|
|
}
|
|
|
|
// WriteBuf is used build messages to send to the PostgreSQL server. It is used
|
|
// by the Encoder interface when implementing custom encoders.
|
|
type WriteBuf struct {
|
|
buf []byte
|
|
convBuf [8]byte
|
|
sizeIdx int
|
|
conn *Conn
|
|
}
|
|
|
|
func (wb *WriteBuf) startMsg(t byte) {
|
|
wb.closeMsg()
|
|
wb.buf = append(wb.buf, t, 0, 0, 0, 0)
|
|
wb.sizeIdx = len(wb.buf) - 4
|
|
}
|
|
|
|
func (wb *WriteBuf) closeMsg() {
|
|
binary.BigEndian.PutUint32(wb.buf[wb.sizeIdx:wb.sizeIdx+4], uint32(len(wb.buf)-wb.sizeIdx))
|
|
}
|
|
|
|
func (wb *WriteBuf) WriteByte(b byte) {
|
|
wb.buf = append(wb.buf, b)
|
|
}
|
|
|
|
func (wb *WriteBuf) WriteCString(s string) {
|
|
wb.buf = append(wb.buf, []byte(s)...)
|
|
wb.buf = append(wb.buf, 0)
|
|
}
|
|
|
|
func (wb *WriteBuf) WriteInt16(n int16) {
|
|
wb.WriteUint16(uint16(n))
|
|
}
|
|
|
|
func (wb *WriteBuf) WriteUint16(n uint16) (int, error) {
|
|
binary.BigEndian.PutUint16(wb.convBuf[:2], n)
|
|
wb.buf = append(wb.buf, wb.convBuf[:2]...)
|
|
return 2, nil
|
|
}
|
|
|
|
func (wb *WriteBuf) WriteInt32(n int32) {
|
|
wb.WriteUint32(uint32(n))
|
|
}
|
|
|
|
func (wb *WriteBuf) WriteUint32(n uint32) (int, error) {
|
|
binary.BigEndian.PutUint32(wb.convBuf[:4], n)
|
|
wb.buf = append(wb.buf, wb.convBuf[:4]...)
|
|
return 4, nil
|
|
}
|
|
|
|
func (wb *WriteBuf) WriteInt64(n int64) {
|
|
wb.WriteUint64(uint64(n))
|
|
}
|
|
|
|
func (wb *WriteBuf) WriteUint64(n uint64) (int, error) {
|
|
binary.BigEndian.PutUint64(wb.convBuf[:8], n)
|
|
wb.buf = append(wb.buf, wb.convBuf[:8]...)
|
|
return 8, nil
|
|
}
|
|
|
|
func (wb *WriteBuf) WriteBytes(b []byte) {
|
|
wb.buf = append(wb.buf, b...)
|
|
}
|
|
|
|
func (wb *WriteBuf) Write(b []byte) (int, error) {
|
|
wb.buf = append(wb.buf, b...)
|
|
return len(b), nil
|
|
}
|