Skip to content

Commit 7170fd2

Browse files
authored
Merge pull request #307 from ydb-platform/RegisterParser
* Added `ydb.RegisterParser(name string, parser func(value string) []…
2 parents 7590c56 + 107fc9c commit 7170fd2

File tree

4 files changed

+172
-42
lines changed

4 files changed

+172
-42
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
* Added `ydb.RegisterParser(name string, parser func(value string) []ydb.Option)` function for register parser of specified param name (supporting additional params in connection string)
12
* Fix write KeepInCacheFlag for table traces
23

34
## v3.29.5

internal/dsn/dsn_test.go

Lines changed: 33 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,100 +1,81 @@
11
package dsn
22

33
import (
4-
"context"
4+
"strconv"
55
"testing"
66

7+
"github.com/stretchr/testify/require"
8+
79
"github.com/ydb-platform/ydb-go-sdk/v3/config"
8-
"github.com/ydb-platform/ydb-go-sdk/v3/internal/credentials"
910
"github.com/ydb-platform/ydb-go-sdk/v3/testutil"
1011
)
1112

12-
func init() {
13-
_ = Register("token", func(token string) ([]config.Option, error) {
14-
return []config.Option{
15-
config.WithCredentials(
16-
credentials.NewAccessTokenCredentials(token, ""),
17-
),
18-
}, nil
19-
})
20-
}
21-
2213
func TestParseConnectionString(t *testing.T) {
2314
for _, test := range []struct {
2415
connectionString string
2516
secure bool
2617
endpoint string
2718
database string
28-
token string
2919
}{
3020
{
3121
"grpc://ydb-ru.yandex.net:2135/?" +
32-
"database=/ru/home/gvit/mydb&token=123",
22+
"database=/ru/home/gvit/mydb",
3323
false,
3424
"ydb-ru.yandex.net:2135",
3525
"/ru/home/gvit/mydb",
36-
"123",
3726
},
3827
{
39-
"grpc://ydb-ru.yandex.net:2135/ru/home/gvit/mydb?token=123",
28+
"grpc://ydb-ru.yandex.net:2135/ru/home/gvit/mydb",
4029
false,
4130
"ydb-ru.yandex.net:2135",
4231
"/ru/home/gvit/mydb",
43-
"123",
4432
},
4533
{
4634
"grpcs://ydb.serverless.yandexcloud.net:2135/?" +
47-
"database=/ru-central1/b1g8skpblkos03malf3s/etn02qso4v3isjb00te1&token=123",
35+
"database=/ru-central1/b1g8skpblkos03malf3s/etn02qso4v3isjb00te1",
4836
true,
4937
"ydb.serverless.yandexcloud.net:2135",
5038
"/ru-central1/b1g8skpblkos03malf3s/etn02qso4v3isjb00te1",
51-
"123",
5239
},
5340
{
5441
"grpcs://ydb.serverless.yandexcloud.net:2135" +
55-
"/ru-central1/b1g8skpblkos03malf3s/etn02qso4v3isjb00te1?token=123",
42+
"/ru-central1/b1g8skpblkos03malf3s/etn02qso4v3isjb00te1",
5643
true,
5744
"ydb.serverless.yandexcloud.net:2135",
5845
"/ru-central1/b1g8skpblkos03malf3s/etn02qso4v3isjb00te1",
59-
"123",
6046
},
6147
{
6248
"grpcs://ydb.serverless.yandexcloud.net:2135" +
63-
"/ru-central1/b1g8skpblkos03malf3s/etn02qso4v3isjb00te1?database=/ru/home/gvit/mydb&token=123",
49+
"/ru-central1/b1g8skpblkos03malf3s/etn02qso4v3isjb00te1?database=/ru/home/gvit/mydb",
6450
true,
6551
"ydb.serverless.yandexcloud.net:2135",
6652
"/ru/home/gvit/mydb",
67-
"123",
6853
},
6954
{
7055
"grpcs://lb.etn03r9df42nb631unbv.ydb.mdb.yandexcloud.net:2135/?" +
71-
"database=/ru-central1/b1g8skpblkos03malf3s/etn03r9df42nb631unbv&token=123",
56+
"database=/ru-central1/b1g8skpblkos03malf3s/etn03r9df42nb631unbv",
7257
true,
7358
"lb.etn03r9df42nb631unbv.ydb.mdb.yandexcloud.net:2135",
7459
"/ru-central1/b1g8skpblkos03malf3s/etn03r9df42nb631unbv",
75-
"123",
7660
},
7761
{
7862
"grpcs://lb.etn03r9df42nb631unbv.ydb.mdb.yandexcloud.net:2135" +
79-
"/ru-central1/b1g8skpblkos03malf3s/etn03r9df42nb631unbv?token=123",
63+
"/ru-central1/b1g8skpblkos03malf3s/etn03r9df42nb631unbv",
8064
true,
8165
"lb.etn03r9df42nb631unbv.ydb.mdb.yandexcloud.net:2135",
8266
"/ru-central1/b1g8skpblkos03malf3s/etn03r9df42nb631unbv",
83-
"123",
8467
},
8568
{
8669
"abcd://ydb-ru.yandex.net:2135/?database=/ru/home/gvit/mydb",
8770
true,
8871
"ydb-ru.yandex.net:2135",
8972
"/ru/home/gvit/mydb",
90-
"",
9173
},
9274
{
9375
"abcd://ydb-ru.yandex.net:2135/ru/home/gvit/mydb",
9476
true,
9577
"ydb-ru.yandex.net:2135",
9678
"/ru/home/gvit/mydb",
97-
"",
9879
},
9980
} {
10081
t.Run(test.connectionString, func(t *testing.T) {
@@ -106,16 +87,29 @@ func TestParseConnectionString(t *testing.T) {
10687
testutil.Equal(t, test.secure, config.Secure())
10788
testutil.Equal(t, test.endpoint, config.Endpoint())
10889
testutil.Equal(t, test.database, config.Database())
109-
var token string
110-
if credentials := config.Credentials(); credentials != nil {
111-
token, err = credentials.Token(context.Background())
112-
if err != nil {
113-
t.Fatalf("Received unexpected error:\n%+v", err)
114-
}
115-
} else {
116-
token = ""
117-
}
118-
testutil.Equal(t, test.token, token)
11990
})
12091
}
12192
}
93+
94+
func TestRegister(t *testing.T) {
95+
var test1, test2, test3 int
96+
_ = Register("test1", func(value string) (_ []config.Option, err error) {
97+
test1, err = strconv.Atoi(value)
98+
if err != nil {
99+
return nil, err
100+
}
101+
return []config.Option{}, nil
102+
})
103+
_ = Register("test2", func(value string) (_ []config.Option, err error) {
104+
test2, err = strconv.Atoi(value)
105+
if err != nil {
106+
return nil, err
107+
}
108+
return []config.Option{}, nil
109+
})
110+
_, err := Parse("grpc://ydb-ru.yandex.net:2135/ru/home/gvit/mydb?test1=1&test2=2&test3=3")
111+
require.NoError(t, err, "")
112+
require.Equal(t, 1, test1, "")
113+
require.Equal(t, 2, test2, "")
114+
require.NotEqualf(t, 3, test3, "")
115+
}

internal/table/session_test.go

Lines changed: 134 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@ package table
33
import (
44
"context"
55
"fmt"
6-
"github.com/stretchr/testify/require"
7-
"github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Operations"
86
"reflect"
97
"testing"
108
"time"
119

10+
"github.com/stretchr/testify/require"
1211
"google.golang.org/protobuf/proto"
1312

1413
"github.com/ydb-platform/ydb-go-genproto/Ydb_Table_V1"
1514
"github.com/ydb-platform/ydb-go-genproto/protos/Ydb"
15+
"github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Operations"
1616
"github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Scheme"
1717
"github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Table"
1818

@@ -460,7 +460,8 @@ func TestCreateTableRegression(t *testing.T) {
460460
},
461461
}
462462
if !proto.Equal(exp, act.(proto.Message)) {
463-
return nil, fmt.Errorf("act: %v\n\nexp: %s\n\n", act, exp)
463+
// nolint:revive
464+
return nil, fmt.Errorf("proto's not equal: \n\nact: %v\n\nexp: %s\n\n", act, exp)
464465
}
465466
return &Ydb_Table.CreateTableResponse{}, nil
466467
},
@@ -490,3 +491,133 @@ func TestCreateTableRegression(t *testing.T) {
490491

491492
require.NoError(t, err, "")
492493
}
494+
495+
func TestDescribeTableRegression(t *testing.T) {
496+
client := New(
497+
testutil.NewRouter(
498+
testutil.WithInvokeHandlers(
499+
testutil.InvokeHandlers{
500+
testutil.TableCreateSession: func(request interface{}) (proto.Message, error) {
501+
return &Ydb_Table.CreateSessionResult{
502+
SessionId: "",
503+
}, nil
504+
},
505+
testutil.TableDescribeTable: func(act interface{}) (proto.Message, error) {
506+
return &Ydb_Table.DescribeTableResult{
507+
Self: &Ydb_Scheme.Entry{
508+
Name: "episodes",
509+
},
510+
Columns: []*Ydb_Table.ColumnMeta{
511+
{
512+
Name: "series_id",
513+
Type: &Ydb.Type{Type: &Ydb.Type_OptionalType{
514+
OptionalType: &Ydb.OptionalType{Item: &Ydb.Type{Type: &Ydb.Type_TypeId{
515+
TypeId: Ydb.Type_UINT64,
516+
}}},
517+
}},
518+
},
519+
{
520+
Name: "season_id",
521+
Type: &Ydb.Type{Type: &Ydb.Type_OptionalType{
522+
OptionalType: &Ydb.OptionalType{Item: &Ydb.Type{Type: &Ydb.Type_TypeId{
523+
TypeId: Ydb.Type_UINT64,
524+
}}},
525+
}},
526+
},
527+
{
528+
Name: "episode_id",
529+
Type: &Ydb.Type{Type: &Ydb.Type_OptionalType{
530+
OptionalType: &Ydb.OptionalType{Item: &Ydb.Type{Type: &Ydb.Type_TypeId{
531+
TypeId: Ydb.Type_UINT64,
532+
}}},
533+
}},
534+
},
535+
{
536+
Name: "title",
537+
Type: &Ydb.Type{Type: &Ydb.Type_OptionalType{
538+
OptionalType: &Ydb.OptionalType{Item: &Ydb.Type{Type: &Ydb.Type_TypeId{
539+
TypeId: Ydb.Type_UTF8,
540+
}}},
541+
}},
542+
},
543+
{
544+
Name: "air_date",
545+
Type: &Ydb.Type{Type: &Ydb.Type_OptionalType{
546+
OptionalType: &Ydb.OptionalType{Item: &Ydb.Type{Type: &Ydb.Type_TypeId{
547+
TypeId: Ydb.Type_UINT64,
548+
}}},
549+
}},
550+
},
551+
},
552+
PrimaryKey: []string{
553+
"series_id",
554+
"season_id",
555+
"episode_id",
556+
},
557+
Attributes: map[string]string{
558+
"attr": "attr_value",
559+
},
560+
}, nil
561+
},
562+
},
563+
),
564+
),
565+
config.New(),
566+
)
567+
568+
ctx, cancel := context.WithTimeout(
569+
context.Background(),
570+
time.Second,
571+
)
572+
defer cancel()
573+
574+
var act options.Description
575+
576+
err := client.Do(ctx, func(ctx context.Context, s table.Session) (err error) {
577+
act, err = s.DescribeTable(ctx, "episodes")
578+
return err
579+
})
580+
581+
require.NoError(t, err, "")
582+
583+
exp := options.Description{
584+
Name: "episodes",
585+
Columns: []options.Column{
586+
{
587+
Name: "series_id",
588+
Type: types.Optional(types.TypeUint64),
589+
},
590+
{
591+
Name: "season_id",
592+
Type: types.Optional(types.TypeUint64),
593+
},
594+
{
595+
Name: "episode_id",
596+
Type: types.Optional(types.TypeUint64),
597+
},
598+
{
599+
Name: "title",
600+
Type: types.Optional(types.TypeUTF8),
601+
},
602+
{
603+
Name: "air_date",
604+
Type: types.Optional(types.TypeUint64),
605+
},
606+
},
607+
KeyRanges: []options.KeyRange{
608+
{},
609+
},
610+
PrimaryKey: []string{
611+
"series_id",
612+
"season_id",
613+
"episode_id",
614+
},
615+
Attributes: map[string]string{
616+
"attr": "attr_value",
617+
},
618+
}
619+
620+
if fmt.Sprintf("%+v", act) != fmt.Sprintf("%+v", exp) {
621+
t.Fatalf("description's not equal: \n\nact: %+v\n\nexp: %+v\n\n", act, exp)
622+
}
623+
}

options.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ import (
3131
// Option contains configuration values for Connection
3232
type Option func(ctx context.Context, c *connection) error
3333

34+
func RegisterParser(name string, parser dsn.Parser) error {
35+
return dsn.Register(name, parser)
36+
}
37+
3438
func WithAccessTokenCredentials(accessToken string) Option {
3539
return WithCredentials(
3640
credentials.NewAccessTokenCredentials(

0 commit comments

Comments
 (0)