From c2ddbc0163763acaf0f0a60010bf1e1c9efed9c9 Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Tue, 16 Jul 2013 19:08:46 -0500 Subject: [PATCH] Add custom value transcoder example --- example_value_transcoder_test.go | 59 ++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 example_value_transcoder_test.go diff --git a/example_value_transcoder_test.go b/example_value_transcoder_test.go new file mode 100644 index 00000000..af37f12d --- /dev/null +++ b/example_value_transcoder_test.go @@ -0,0 +1,59 @@ +package pgx_test + +import ( + "fmt" + "github.com/JackC/pgx" + "regexp" + "strconv" +) + +var pointRegexp *regexp.Regexp = regexp.MustCompile(`^\((.*),(.*)\)$`) + +type Point struct { + x float64 + y float64 +} + +func (p Point) String() string { + return fmt.Sprintf("%v, %v", p.x, p.y) +} + +func Example_customValueTranscoder() { + pgx.ValueTranscoders[pgx.Oid(600)] = &pgx.ValueTranscoder{ + DecodeText: decodePointFromText, + EncodeTo: encodePoint} + + conn := getSharedConnection() + + v, _ := conn.SelectValue("select point(1.5,2.5)") + fmt.Println(v) + // Output: + // 1.5, 2.5 +} + +func decodePointFromText(mr *pgx.MessageReader, size int32) interface{} { + s := mr.ReadByteString(size) + match := pointRegexp.FindStringSubmatch(s) + if match == nil { + panic(fmt.Sprintf("Received invalid point: %v", s)) + } + + var err error + var p Point + p.x, err = strconv.ParseFloat(match[1], 64) + if err != nil { + panic(fmt.Sprintf("Received invalid point: %v", s)) + } + p.y, err = strconv.ParseFloat(match[2], 64) + if err != nil { + panic(fmt.Sprintf("Received invalid point: %v", s)) + } + return p +} + +func encodePoint(w *pgx.MessageWriter, value interface{}) { + p := value.(Point) + s := fmt.Sprintf("point(%v,%v)", p.x, p.y) + w.Write(int32(len(s))) + w.WriteString(s) +}