Esempio n. 1
0
// driverArgsToMap turns driver.Value list into a parameter map
// for neo4j parameters
func driverArgsToMap(args []driver.Value) (map[string]interface{}, error) {
	output := map[string]interface{}{}
	for _, arg := range args {
		argBytes, ok := arg.([]byte)
		if !ok {
			return nil, errors.New("You must pass only a gob encoded map to the Exec/Query args")
		}

		m, err := encoding.Unmarshal(argBytes)
		if err != nil {
			return nil, err
		}

		for k, v := range m.(map[string]interface{}) {
			output[k] = v
		}

	}

	return output, nil
}
func main() {

	t := &test{[]byte{1, 2, 3}}
	t1 := &test{}
	fmt.Printf("TEE: %#v\n", t)
	fmt.Printf("TEE1: %#v\n", t1)
	*t1 = *t
	t = nil
	fmt.Printf("TEE: %#v\n", t)
	fmt.Printf("TEE1: %#v\n", t1)

	args := map[string]interface{}{
		"a": 1,
		"b": 34234.34323,
		"c": "string",
		"d": []interface{}{1, 2, 3},
		"e": true,
		"f": nil,
	}

	enc, err := encoding.Marshal(args)
	if err != nil {
		fmt.Printf("MARSHALLERR: %#v\n", err)
	}
	fmt.Printf("ENCODED: %#v\n", enc)

	decoded, err := encoding.Unmarshal(enc)
	if err != nil {
		fmt.Printf("UNMARSHALLERR: %#v\n", err)
	}

	fmt.Printf("DECODED: %#v\n", decoded)

	buf := &bytes.Buffer{}
	err = gob.NewEncoder(buf).Encode(args)
	if err != nil {
		fmt.Printf("GOBERR: %#v", err)
	}

	var y map[string]interface{}
	gob.NewDecoder(buf).Decode(&y)

	fmt.Printf("GOB: %#v\n", y)

	fmt.Printf("LenMake: %d\n", len(make([]interface{}, 15)))

	fmt.Println("test.b:", len(test{}.b))
	buf = bytes.NewBuffer([]byte{byte(0xf0)})
	var x int
	binary.Read(buf, binary.BigEndian, &x)
	fmt.Println("Marker: 0xf0 ", 0xf0, "INT: ", x)

	buf = bytes.NewBuffer([]byte{byte(0xff)})
	binary.Read(buf, binary.BigEndian, &x)
	fmt.Println("Marker: 0xff ", 0xff, "INT: ", x)

	buf = bytes.NewBuffer([]byte{byte(0x7f)})
	binary.Read(buf, binary.BigEndian, &x)
	fmt.Println("Marker: 0x7f ", 0x7f, "INT: ", x)

	buf = &bytes.Buffer{}
	binary.Write(buf, binary.BigEndian, int8(-1))
	fmt.Printf("BYTES: %#x\n", buf.Bytes())
	binary.Write(buf, binary.BigEndian, int8(127))
	fmt.Printf("BYTES: %#x\n", buf.Bytes())
	fmt.Printf("INT1: %#x\n", byte(1))
	fmt.Printf("INT34234234: %#x\n", byte(234))
	fmt.Println("DONE")

	fmt.Printf("MAX INT8: %d\n", math.MaxInt8)
	fmt.Printf("MAX INT16: %d\n", math.MaxInt16)
	fmt.Printf("MAX INT32: %d\n", math.MaxInt32)
	fmt.Printf("MAX INT64: %d\n", math.MaxInt64)

	fmt.Printf("MIN INT8: %d\n", math.MinInt8)
	fmt.Printf("MIN INT16: %d\n", math.MinInt16)
	fmt.Printf("MIN INT32: %d\n", math.MinInt32)
	fmt.Printf("MIN INT64: %d\n", math.MinInt64)

	fmt.Printf("MAX UINT8: %d\n", math.MaxUint8)
	fmt.Printf("MAX UINT16: %d\n", math.MaxUint16)
	fmt.Printf("MAX UINT32: %d\n", math.MaxUint32)
	z := fmt.Sprint(uint64(math.MaxUint64))
	fmt.Printf("MAX UINT64: %s\n", z)

	fmt.Println("Marker: 0xf0 ", 0xf0, "INT: ", int(byte(0xf0)))
	fmt.Println("Marker: 0xf0 byte{}", 0xf0, "INT: ", int(0xf0))
	_ = `b1 71 99 cb  80 0 0 0  0 0 0 0  ca 80 0 0

	 0 c9 80 0  c8 80 f0 7f  c9 7f ff ca  7f ff ff ff

	 cb 7f ff ff  ff ff ff ff  ff`
}
func TestBoltStmt_SqlQueryAndExec(t *testing.T) {
	if neo4jConnStr == "" {
		t.Skip("Cannot run this test when in recording mode")
	}

	db, err := sql.Open("neo4j-bolt", neo4jConnStr)
	if err != nil {
		t.Fatalf("An error occurred opening conn: %s", err)
	}
	defer db.Close()

	args := map[string]interface{}{
		"a": 1,
		"b": 34234.34323,
		"c": "string",
		"d": []interface{}{1, 2, 3},
		"e": true,
		"f": nil,
	}
	arg, err := encoding.Marshal(args)
	if err != nil {
		t.Fatalf("An error occurred marshalling args: %s", err)
	}

	stmt, err := db.Prepare(`CREATE path=(f:FOO {a: {a}, b: {b}, c: {c}, d: {d}, e: {e}, f: {f}})-[b:BAR]->(c:BAZ) RETURN f.a, f.b, f.c, f.d, f.e, f.f, f, b, path`)
	if err != nil {
		t.Fatalf("An error occurred preparing statement: %s", err)
	}
	rows, err := stmt.Query(arg)
	if err != nil {
		t.Fatalf("An error occurred querying statement: %s", err)
	}
	var a int
	var b float64
	var c string
	var d []byte
	var e bool
	var f interface{}
	var node []byte
	var rel []byte
	var path []byte
	if !rows.Next() {
		t.Fatalf("Rows.Next failed")
	}
	err = rows.Scan(&a, &b, &c, &d, &e, &f, &node, &rel, &path)
	if err != nil {
		t.Fatalf("An error occurred scanning row: %s", err)
	}
	defer rows.Close()

	if a != 1 {
		t.Fatalf("Unexpected value for a. Expected: %#v  Got: %#v", 1, a)
	}
	if b != 34234.34323 {
		t.Fatalf("Unexpected value for b. Expected: %#v  Got: %#v", 34234.34323, b)
	}
	if c != "string" {
		t.Fatalf("Unexpected value for c. Expected: %#v  Got: %#v", "string", b)
	}

	dVal, err := encoding.Unmarshal(d)
	if err != nil {
		t.Fatalf("Error occurred decoding item: %s", err)
	}
	if !reflect.DeepEqual(dVal.([]interface{}), []interface{}{int64(1), int64(2), int64(3)}) {
		t.Fatalf("Unexpected value for d. Expected: %#v  Got: %#v", []interface{}{1, 2, 3}, dVal)
	}

	if !e {
		t.Fatalf("Unexpected value for e. Expected: %#v  Got: %#v", true, e)
	}

	if f != nil {
		t.Fatalf("Unexpected value for f. Expected: %#v  Got: %#v", nil, f)
	}

	nodeVal, err := encoding.Unmarshal(node)
	if err != nil {
		t.Fatalf("Error occurred decoding node: %s", err)
	}
	if nodeVal.(graph.Node).Labels[0] != "FOO" {
		t.Fatalf("Unexpected label for node. Expected: %#v  Got: %#v", "FOO", nodeVal)
	}
	if nodeVal.(graph.Node).Properties["a"] != int64(1) {
		t.Fatalf("Unexpected value for node. Expected: %#v  Got: %#v", int64(1), nodeVal)
	}

	relVal, err := encoding.Unmarshal(rel)
	if err != nil {
		t.Fatalf("Error occurred decoding rel: %s", err)
	}
	if relVal.(graph.Relationship).Type != "BAR" {
		t.Fatalf("Unexpected label for node. Expected: %#v  Got: %#v", "FOO", relVal)
	}

	pathVal, err := encoding.Unmarshal(path)
	if err != nil {
		t.Fatalf("Error occurred decoding path: %s", err)
	}
	if pathVal.(graph.Path).Nodes[0].Labels[0] != "FOO" {
		t.Fatalf("Unexpected label for path node 0. Expected: %#v  Got: %#v", "FOO", pathVal)
	}
	if pathVal.(graph.Path).Nodes[1].Labels[0] != "BAZ" {
		t.Fatalf("Unexpected label for path node 1. Expected: %#v  Got: %#v", "BAZ", pathVal)
	}
	if pathVal.(graph.Path).Relationships[0].Type != "BAR" {
		t.Fatalf("Unexpected label for path relationship 1. Expected: %#v  Got: %#v", "BAR", pathVal)
	}
	if pathVal.(graph.Path).Sequence[0] != 1 {
		t.Fatalf("Unexpected label for path sequence 0. Expected: %#v  Got: %#v", 1, pathVal)
	}

	err = stmt.Close()
	if err != nil {
		t.Fatalf("An error occurred closing statement: %s", err)
	}

	stmt, err = db.Prepare(`MATCH (f:FOO)-[b:BAR]->(c:BAZ) DELETE f, b, c`)

	result, err := stmt.Exec()
	if err != nil {
		t.Fatalf("An error occurred preparing delete statement: %s", err)
	}

	affected, err := result.RowsAffected()
	if err != nil {
		t.Fatalf("An error occurred getting affected rows: %s", err)
	}
	if affected != 3 {
		t.Fatalf("Expected to delete 3 items, got %#v", affected)
	}

	err = stmt.Close()
	if err != nil {
		t.Fatalf("An error occurred closing statement: %s", err)
	}

	err = db.Close()
	if err != nil {
		t.Fatalf("Error closing connection: %s", err)
	}
}