Skip to content

Commit c5cd184

Browse files
api: support session settings
Support session settings in a separate subpackage "settings" [1]. It allows to create a specific Select/Update 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 63ac35b commit c5cd184

9 files changed

+1014
-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

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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 defines whether error objects
10+
// have a special structure. Added in Tarantool 2.4.1, dropped
11+
// in Tarantool 2.10.0 in favor of ErrorExtensionFeature protocol
12+
// feature. Default is `false`.
13+
ErrorMarshalingEnabled string = "error_marshaling_enabled"
14+
// SQLDefaultEngine defined default storage engine for
15+
// new SQL tables. Added in Tarantool 2.3.1. Default is `"memtx"`.
16+
SQLDefaultEngine string = "sql_default_engine"
17+
// SQLDeferForeignKeys defines whether foreign-key checks
18+
// can wait till commit. Added in Tarantool 2.3.1, dropped
19+
// in master commit 14618c4 (possible 2.10.5 or 2.11.0). Default is `false`.
20+
SQLDeferForeignKeys string = "sql_defer_foreign_keys"
21+
// SQLFullColumnNames defines whether full column names is displayed
22+
// in SQL result set metadata. Added in Tarantool 2.3.1. Default is `false`.
23+
SQLFullColumnNames string = "sql_full_column_names"
24+
// SQLFullMetadata defines whether SQL result set metadata will have
25+
// more than just name and type. Added in Tarantool 2.3.1. Default is `false`.
26+
SQLFullMetadata string = "sql_full_metadata"
27+
// SQLParserDebug defines whether to show parser steps for following
28+
// statements. Option has no effect unless Tarantool was built with
29+
// `-DCMAKE_BUILD_TYPE=Debug`. Added in Tarantool 2.3.1. Default is `false`.
30+
SQLParserDebug string = "sql_parser_debug"
31+
// SQLParserDebug defines whether a triggered statement can activate
32+
// a trigger. Added in Tarantool 2.3.1. Default is `true`.
33+
SQLRecursiveTriggers string = "sql_recursive_triggers"
34+
// SQLReverseUnorderedSelects defines whether result rows are usually
35+
// in reverse order if there is no ORDER BY clause. Added in Tarantool 2.3.1.
36+
// Default is `false`.
37+
SQLReverseUnorderedSelects string = "sql_reverse_unordered_selects"
38+
// SQLSelectDebug defines whether to show execution steps during SELECT.
39+
// Option has no effect unless Tarantool was built with `-DCMAKE_BUILD_TYPE=Debug`.
40+
// Added in Tarantool 2.3.1. Default is `false`.
41+
SQLSelectDebug string = "sql_select_debug"
42+
// SQLVDBEDebug defines whether VDBE debug mode is enabled.
43+
// Option has no effect unless Tarantool was built with `-DCMAKE_BUILD_TYPE=Debug`.
44+
// Added in Tarantool 2.3.1. Default is `false`.
45+
SQLVDBEDebug string = "sql_vdbe_debug"
46+
)
47+
48+
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 ExampleSQLFullColumnNames() {
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.SetSQLFullColumnNames(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.SetSQLFullColumnNames(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_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_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+
}

settings/request.go

+165
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
package settings
2+
3+
import (
4+
"github.com/tarantool/go-tarantool"
5+
)
6+
7+
func newSetRequest(setting string, value interface{}) *tarantool.UpdateRequest {
8+
return tarantool.NewUpdateRequest(sessionSettingsSpace).
9+
Key(tarantool.StringKey{S: setting}).
10+
Operations(tarantool.NewOperations().Assign(sessionSettingValueField, value))
11+
}
12+
13+
func newGetRequest(setting string) *tarantool.SelectRequest {
14+
return tarantool.NewSelectRequest(sessionSettingsSpace).
15+
Key(tarantool.StringKey{S: setting}).
16+
Limit(1)
17+
}
18+
19+
// SetErrorMarshalingEnabled creates a request to
20+
// update current session ErrorMarshalingEnabled setting.
21+
// Added in 1.10.0.
22+
func SetErrorMarshalingEnabled(value bool) *tarantool.UpdateRequest {
23+
return newSetRequest(ErrorMarshalingEnabled, value)
24+
}
25+
26+
// GetErrorMarshalingEnabled creates a request to get
27+
// current session ErrorMarshalingEnabled setting in tuple format.
28+
// Added in 1.10.0.
29+
func GetErrorMarshalingEnabled() *tarantool.SelectRequest {
30+
return newGetRequest(ErrorMarshalingEnabled)
31+
}
32+
33+
// SetSQLDefaultEngine creates a request to
34+
// update current session SQLDefaultEngine setting.
35+
// Added in 1.10.0.
36+
func SetSQLDefaultEngine(value string) *tarantool.UpdateRequest {
37+
return newSetRequest(SQLDefaultEngine, value)
38+
}
39+
40+
// GetSQLDefaultEngine creates a request to get
41+
// current session SQLDefaultEngine setting in tuple format.
42+
// Added in 1.10.0.
43+
func GetSQLDefaultEngine() *tarantool.SelectRequest {
44+
return newGetRequest(SQLDefaultEngine)
45+
}
46+
47+
// SetSQLDeferForeignKeys creates a request to
48+
// update current session SQLDeferForeignKeys setting.
49+
// Added in 1.10.0.
50+
func SetSQLDeferForeignKeys(value bool) *tarantool.UpdateRequest {
51+
return newSetRequest(SQLDeferForeignKeys, value)
52+
}
53+
54+
// GetSQLDeferForeignKeys creates a request to get
55+
// current session SQLDeferForeignKeys setting in tuple format.
56+
// Added in 1.10.0.
57+
func GetSQLDeferForeignKeys() *tarantool.SelectRequest {
58+
return newGetRequest(SQLDeferForeignKeys)
59+
}
60+
61+
// SetSQLFullColumnNames creates a request to
62+
// update current session SQLFullColumnNames setting.
63+
// Added in 1.10.0.
64+
func SetSQLFullColumnNames(value bool) *tarantool.UpdateRequest {
65+
return newSetRequest(SQLFullColumnNames, value)
66+
}
67+
68+
// GetSQLFullColumnNames creates a request to get
69+
// current session SQLFullColumnNames setting in tuple format.
70+
// Added in 1.10.0.
71+
func GetSQLFullColumnNames() *tarantool.SelectRequest {
72+
return newGetRequest(SQLFullColumnNames)
73+
}
74+
75+
// SetSQLFullMetadata creates a request to
76+
// update current session SQLFullMetadata setting.
77+
// Added in 1.10.0.
78+
func SetSQLFullMetadata(value bool) *tarantool.UpdateRequest {
79+
return newSetRequest(SQLFullMetadata, value)
80+
}
81+
82+
// GetSQLFullMetadata creates a request to get
83+
// current session SQLFullMetadata setting in tuple format.
84+
// Added in 1.10.0.
85+
func GetSQLFullMetadata() *tarantool.SelectRequest {
86+
return newGetRequest(SQLFullMetadata)
87+
}
88+
89+
// SetSQLParserDebug creates a request to
90+
// update current session SQLParserDebug setting.
91+
// Added in 1.10.0.
92+
func SetSQLParserDebug(value bool) *tarantool.UpdateRequest {
93+
return newSetRequest(SQLParserDebug, value)
94+
}
95+
96+
// GetSQLParserDebug creates a request to get
97+
// current session SQLParserDebug setting in tuple format.
98+
// Added in 1.10.0.
99+
func GetSQLParserDebug() *tarantool.SelectRequest {
100+
return newGetRequest(SQLParserDebug)
101+
}
102+
103+
// SetSQLRecursiveTriggers creates a request to
104+
// update current session SQLRecursiveTriggers setting.
105+
// Added in 1.10.0.
106+
func SetSQLRecursiveTriggers(value bool) *tarantool.UpdateRequest {
107+
return newSetRequest(SQLRecursiveTriggers, value)
108+
}
109+
110+
// GetSQLRecursiveTriggers creates a request to get
111+
// current session SQLRecursiveTriggers setting in tuple format.
112+
// Added in 1.10.0.
113+
func GetSQLRecursiveTriggers() *tarantool.SelectRequest {
114+
return newGetRequest(SQLRecursiveTriggers)
115+
}
116+
117+
// SetSQLReverseUnorderedSelects creates a request to
118+
// update current session SQLReverseUnorderedSelects setting.
119+
// Added in 1.10.0.
120+
func SetSQLReverseUnorderedSelects(value bool) *tarantool.UpdateRequest {
121+
return newSetRequest(SQLReverseUnorderedSelects, value)
122+
}
123+
124+
// GetSQLReverseUnorderedSelects creates a request to get
125+
// current session SQLReverseUnorderedSelects setting in tuple format.
126+
// Added in 1.10.0.
127+
func GetSQLReverseUnorderedSelects() *tarantool.SelectRequest {
128+
return newGetRequest(SQLReverseUnorderedSelects)
129+
}
130+
131+
// SetSQLSelectDebug creates a request to
132+
// update current session SQLSelectDebug setting.
133+
// Added in 1.10.0.
134+
func SetSQLSelectDebug(value bool) *tarantool.UpdateRequest {
135+
return newSetRequest(SQLSelectDebug, value)
136+
}
137+
138+
// GetSQLSelectDebug creates a request to get
139+
// current session SQLSelectDebug setting in tuple format.
140+
// Added in 1.10.0.
141+
func GetSQLSelectDebug() *tarantool.SelectRequest {
142+
return newGetRequest(SQLSelectDebug)
143+
}
144+
145+
// SetSQLVDBEDebug creates a request to
146+
// update current session SQLVDBEDebug setting.
147+
// Added in 1.10.0.
148+
func SetSQLVDBEDebug(value bool) *tarantool.UpdateRequest {
149+
return newSetRequest(SQLVDBEDebug, value)
150+
}
151+
152+
// GetSQLVDBEDebug creates a request to get
153+
// current session SQLVDBEDebug setting in tuple format.
154+
// Added in 1.10.0.
155+
func GetSQLVDBEDebug() *tarantool.SelectRequest {
156+
return newGetRequest(SQLVDBEDebug)
157+
}
158+
159+
// GetSession creates a request to get all
160+
// current session settings in tuple format.
161+
// Added in 1.10.0.
162+
func GetSession() *tarantool.SelectRequest {
163+
return tarantool.NewSelectRequest(sessionSettingsSpace).
164+
Limit(selectAllLimit)
165+
}

0 commit comments

Comments
 (0)