Skip to content

Commit 404772c

Browse files
api: support session settings
Support session settings in a separate subpackage "settings" [1]. It allows to create a specific requests to get or set session settings. Settings are independent for each connection. 1. https://www.tarantool.io/en/doc/latest/reference/reference_lua/box_space/_session_settings/ Closes #215
1 parent 3a1e82b commit 404772c

11 files changed

+1138
-0
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ Versioning](http://semver.org/spec/v2.0.0.html) except to the first release.
1414
- Support errors extended information (#209)
1515
- Error type support in MessagePack (#209)
1616
- Event subscription support (#119)
17+
- Session settings support (#115)
1718

1819
### Changed
1920

Makefile

+6
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,12 @@ test-uuid:
8181
go clean -testcache
8282
go test -tags "$(TAGS)" ./uuid/ -v -p 1
8383

84+
.PHONY: test-settings
85+
test-settings:
86+
@echo "Running tests in settings package"
87+
go clean -testcache
88+
go test -tags "$(TAGS)" ./settings/ -v -p 1
89+
8490
.PHONY: test-main
8591
test-main:
8692
@echo "Running tests in main package"

settings/config.lua

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
-- Do not set listen for now so connector won't be
2+
-- able to send requests until everything is configured.
3+
box.cfg{
4+
work_dir = os.getenv("TEST_TNT_WORK_DIR"),
5+
}
6+
7+
box.schema.user.create('test', { password = 'test' , if_not_exists = true })
8+
box.schema.user.grant('test', 'execute', 'universe', nil, { if_not_exists = true })
9+
box.schema.user.grant('test', 'create,read,write,drop,alter', 'space', nil, { if_not_exists = true })
10+
box.schema.user.grant('test', 'create', 'sequence', nil, { if_not_exists = true })
11+
12+
-- Set listen only when every other thing is configured.
13+
box.cfg{
14+
listen = os.getenv("TEST_TNT_LISTEN"),
15+
}

settings/const.go

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package settings
2+
3+
const sessionSettingsSpace string = "_session_settings"
4+
5+
// In Go and IPROTO_UPDATE count starts with 0.
6+
const sessionSettingValueField int = 1
7+
8+
const (
9+
errorMarshalingEnabled string = "error_marshaling_enabled"
10+
sqlDefaultEngine string = "sql_default_engine"
11+
sqlDeferForeignKeys string = "sql_defer_foreign_keys"
12+
sqlFullColumnNames string = "sql_full_column_names"
13+
sqlFullMetadata string = "sql_full_metadata"
14+
sqlParserDebug string = "sql_parser_debug"
15+
sqlRecursiveTriggers string = "sql_recursive_triggers"
16+
sqlReverseUnorderedSelects string = "sql_reverse_unordered_selects"
17+
sqlSelectDebug string = "sql_select_debug"
18+
sqlVDBEDebug string = "sql_vdbe_debug"
19+
)
20+
21+
const selectAllLimit uint32 = 1000

settings/example_test.go

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package settings_test
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/tarantool/go-tarantool"
7+
"github.com/tarantool/go-tarantool/settings"
8+
"github.com/tarantool/go-tarantool/test_helpers"
9+
)
10+
11+
func example_connect(opts tarantool.Opts) *tarantool.Connection {
12+
conn, err := tarantool.Connect(server, opts)
13+
if err != nil {
14+
panic("Connection is not established: " + err.Error())
15+
}
16+
return conn
17+
}
18+
19+
func Example_sqlFullColumnNames() {
20+
var resp *tarantool.Response
21+
var err error
22+
var isLess bool
23+
24+
conn := example_connect(opts)
25+
defer conn.Close()
26+
27+
// Tarantool supports session settings since version 2.3.1
28+
isLess, err = test_helpers.IsTarantoolVersionLess(2, 3, 1)
29+
if err != nil || isLess {
30+
return
31+
}
32+
33+
// Create a space.
34+
_, err = conn.Execute("CREATE TABLE example(id INT PRIMARY KEY, x INT);", []interface{}{})
35+
if err != nil {
36+
fmt.Printf("error in create table: %v\n", err)
37+
return
38+
}
39+
40+
// Insert some tuple into space.
41+
_, err = conn.Execute("INSERT INTO example VALUES (1, 1);", []interface{}{})
42+
if err != nil {
43+
fmt.Printf("error on insert: %v\n", err)
44+
return
45+
}
46+
47+
// Enable showing full column names in SQL responses.
48+
_, err = conn.Do(settings.NewSQLFullColumnNamesSetRequest(true)).Get()
49+
if err != nil {
50+
fmt.Printf("error on setting setup: %v\n", err)
51+
return
52+
}
53+
54+
// Get some data with SQL query.
55+
resp, err = conn.Execute("SELECT x FROM example WHERE id = 1;", []interface{}{})
56+
if err != nil {
57+
fmt.Printf("error on select: %v\n", err)
58+
return
59+
}
60+
// Show response metadata.
61+
fmt.Printf("full column name: %v\n", resp.MetaData[0].FieldName)
62+
63+
// Disable showing full column names in SQL responses.
64+
_, err = conn.Do(settings.NewSQLFullColumnNamesSetRequest(false)).Get()
65+
if err != nil {
66+
fmt.Printf("error on setting setup: %v\n", err)
67+
return
68+
}
69+
70+
// Get some data with SQL query.
71+
resp, err = conn.Execute("SELECT x FROM example WHERE id = 1;", []interface{}{})
72+
if err != nil {
73+
fmt.Printf("error on select: %v\n", err)
74+
return
75+
}
76+
// Show response metadata.
77+
fmt.Printf("short column name: %v\n", resp.MetaData[0].FieldName)
78+
}

settings/msgpack.go

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//go:build !go_tarantool_msgpack_v5
2+
// +build !go_tarantool_msgpack_v5
3+
4+
package settings
5+
6+
import (
7+
"gopkg.in/vmihailenco/msgpack.v2"
8+
)
9+
10+
type encoder = msgpack.Encoder

settings/msgpack_helper_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//go:build !go_tarantool_msgpack_v5
2+
// +build !go_tarantool_msgpack_v5
3+
4+
package settings_test
5+
6+
import (
7+
"github.com/tarantool/go-tarantool"
8+
)
9+
10+
func toBoxError(i interface{}) (v tarantool.BoxError, ok bool) {
11+
v, ok = i.(tarantool.BoxError)
12+
return
13+
}

settings/msgpack_v5.go

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//go:build go_tarantool_msgpack_v5
2+
// +build go_tarantool_msgpack_v5
3+
4+
package settings
5+
6+
import (
7+
"github.com/vmihailenco/msgpack/v5"
8+
)
9+
10+
type encoder = msgpack.Encoder

settings/msgpack_v5_helper_test.go

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//go:build go_tarantool_msgpack_v5
2+
// +build go_tarantool_msgpack_v5
3+
4+
package settings_test
5+
6+
import (
7+
"github.com/tarantool/go-tarantool"
8+
)
9+
10+
func toBoxError(i interface{}) (v tarantool.BoxError, ok bool) {
11+
var ptr *tarantool.BoxError
12+
if ptr, ok = i.(*tarantool.BoxError); ok {
13+
v = *ptr
14+
}
15+
return
16+
}

0 commit comments

Comments
 (0)