瀏覽代碼

prepared statements are now identified by a md5sum

Christoph Hack 13 年之前
父節點
當前提交
9915bf7047
共有 1 個文件被更改,包括 10 次插入9 次删除
  1. 10 9
      gocql.go

+ 10 - 9
gocql.go

@@ -59,7 +59,7 @@ const (
 
 	flagCompressed byte = 0x01
 
-	keyVersion  string = "CQL_VERSION"
+	keyVersion     string = "CQL_VERSION"
 	keyCompression string = "COMPRESSION"
 )
 
@@ -233,8 +233,9 @@ func (cn *connection) Prepare(query string) (driver.Stmt, error) {
 	if opcode != opResult || binary.BigEndian.Uint32(body) != 4 {
 		return nil, fmt.Errorf("expected prepared result")
 	}
-	prepared := int(binary.BigEndian.Uint32(body[4:]))
-	columns, meta, _ := parseMeta(body[8:])
+	n := int(binary.BigEndian.Uint16(body[4:]))
+	prepared := body[6 : 6+n]
+	columns, meta, _ := parseMeta(body[6+n:])
 	return &statement{cn: cn, query: query,
 		prepared: prepared, columns: columns, meta: meta}, nil
 }
@@ -242,7 +243,7 @@ func (cn *connection) Prepare(query string) (driver.Stmt, error) {
 type statement struct {
 	cn       *connection
 	query    string
-	prepared int
+	prepared []byte
 	columns  []string
 	meta     []uint16
 }
@@ -286,15 +287,16 @@ func parseMeta(body []byte) ([]string, []uint16, int) {
 }
 
 func (st *statement) exec(v []driver.Value) error {
-	sz := 8
+	sz := 6 + len(st.prepared)
 	for i := range v {
 		if b, ok := v[i].([]byte); ok {
 			sz += len(b) + 4
 		}
 	}
-	body, p := make([]byte, sz), 6
-	binary.BigEndian.PutUint32(body, uint32(st.prepared))
-	binary.BigEndian.PutUint16(body[4:], uint16(len(v)))
+	body, p := make([]byte, sz), 4+len(st.prepared)
+	binary.BigEndian.PutUint16(body, uint16(len(st.prepared)))
+	copy(body[2:], st.prepared)
+	binary.BigEndian.PutUint16(body[p-2:], uint16(len(v)))
 	for i := range v {
 		b, ok := v[i].([]byte)
 		if !ok {
@@ -373,7 +375,6 @@ func (r *rows) Next(values []driver.Value) error {
 			values[column] = decode(r.body[:n], r.meta[column])
 			r.body = r.body[n:]
 		} else {
-			fmt.Println(column, n)
 			values[column] = nil
 		}
 	}