Codebase list golang-github-denisenkom-go-mssqldb / 731ef37
Renamed fields. (#471) Removed unused fields. Nikita Gavrilov authored 5 years ago Daniel Theophanes committed 5 years ago
7 changed file(s) with 96 addition(s) and 100 deletion(s). Raw diff Collapse all Expand all
209209 * "cloud.google.com/go/civil".Date -> date
210210 * "cloud.google.com/go/civil".DateTime -> datetime2
211211 * "cloud.google.com/go/civil".Time -> time
212 * mssql.TVPType -> Table Value Parameter (TDS version dependent)
212 * mssql.TVP -> Table Value Parameter (TDS version dependent)
213213
214214 ## Important Notes
215215
119119 },
120120 }
121121
122 tvpType := mssql.TVPType{
123 TVPTypeName: "TestTVPSchema.exampleTVP",
124 TVPValue: exampleData,
122 tvpType := mssql.TVP{
123 TypeName: "TestTVPSchema.exampleTVP",
124 Value: exampleData,
125125 }
126126
127127 rows, err := conn.Query(execTvp,
111111 *v = 0 // By default the return value should be zero.
112112 c.returnStatus = v
113113 return driver.ErrRemoveArgument
114 case TVPType:
114 case TVP:
115115 return nil
116116 default:
117117 var err error
161161 case sql.Out:
162162 res, err = s.makeParam(val.Dest)
163163 res.Flags = fByRevValue
164 case TVPType:
164 case TVP:
165165 err = val.check()
166166 if err != nil {
167167 return
168168 }
169 schema, name, errGetName := getSchemeAndName(val.TVPTypeName)
169 schema, name, errGetName := getSchemeAndName(val.TypeName)
170170 if errGetName != nil {
171171 return
172172 }
1919 )
2020
2121 var (
22 ErrorEmptyTVPTypeName = errors.New("TVPTypeName must not be empty")
23 ErrorTypeSlice = errors.New("TVPType must be slice type")
24 ErrorTypeSliceIsEmpty = errors.New("TVPType mustn't be null value")
22 ErrorEmptyTVPTypeName = errors.New("TypeName must not be empty")
23 ErrorTypeSlice = errors.New("TVP must be slice type")
24 ErrorTypeSliceIsEmpty = errors.New("TVP mustn't be null value")
2525 ErrorSkip = errors.New("all fields mustn't skip")
2626 ErrorObjectName = errors.New("wrong tvp name")
2727 )
2828
29 //TVPType is driver type, which allows supporting Table Valued Parameters (TVP) in SQL Server
30 type TVPType struct {
31 //TVP param name, mustn't be default value
32 TVPTypeName string
33 //TVP Value Param must be the slice, mustn't be nil
34 TVPValue interface{}
35 }
36
37 func (tvp TVPType) check() error {
38 if len(tvp.TVPTypeName) == 0 {
29 //TVP is driver type, which allows supporting Table Valued Parameters (TVP) in SQL Server
30 type TVP struct {
31 //TypeName mustn't be default value
32 TypeName string
33 //Value must be the slice, mustn't be nil
34 Value interface{}
35 }
36
37 func (tvp TVP) check() error {
38 if len(tvp.TypeName) == 0 {
3939 return ErrorEmptyTVPTypeName
4040 }
41 if !isProc(tvp.TVPTypeName) {
41 if !isProc(tvp.TypeName) {
4242 return ErrorEmptyTVPTypeName
4343 }
44 if sepCount := getCountSQLSeparators(tvp.TVPTypeName); sepCount > 1 {
44 if sepCount := getCountSQLSeparators(tvp.TypeName); sepCount > 1 {
4545 return ErrorObjectName
4646 }
47 valueOf := reflect.ValueOf(tvp.TVPValue)
47 valueOf := reflect.ValueOf(tvp.Value)
4848 if valueOf.Kind() != reflect.Slice {
4949 return ErrorTypeSlice
5050 }
5151 if valueOf.IsNil() {
5252 return ErrorTypeSliceIsEmpty
5353 }
54 if reflect.TypeOf(tvp.TVPValue).Elem().Kind() != reflect.Struct {
54 if reflect.TypeOf(tvp.Value).Elem().Kind() != reflect.Struct {
5555 return ErrorTypeSlice
5656 }
5757 return nil
5858 }
5959
60 func (tvp TVPType) encode(schema, name string) ([]byte, error) {
60 func (tvp TVP) encode(schema, name string) ([]byte, error) {
6161 columnStr, tvpFieldIndexes, err := tvp.columnTypes()
6262 if err != nil {
6363 return nil, err
9090 c: conn,
9191 }
9292
93 val := reflect.ValueOf(tvp.TVPValue)
93 val := reflect.ValueOf(tvp.Value)
9494 for i := 0; i < val.Len(); i++ {
9595 refStr := reflect.ValueOf(val.Index(i).Interface())
9696 buf.WriteByte(_TVP_ROW_TOKEN)
129129 return buf.Bytes(), nil
130130 }
131131
132 func (tvp TVPType) columnTypes() ([]columnStruct, []int, error) {
133 val := reflect.ValueOf(tvp.TVPValue)
132 func (tvp TVP) columnTypes() ([]columnStruct, []int, error) {
133 val := reflect.ValueOf(tvp.Value)
134134 var firstRow interface{}
135135 if val.Len() != 0 {
136136 firstRow = val.Index(0).Interface()
137137 } else {
138 firstRow = reflect.New(reflect.TypeOf(tvp.TVPValue).Elem()).Elem().Interface()
138 firstRow = reflect.New(reflect.TypeOf(tvp.Value).Elem()).Elem().Interface()
139139 }
140140
141141 tvpRow := reflect.TypeOf(firstRow)
274274 },
275275 }
276276
277 tvpType := TVPType{
278 TVPTypeName: "tvptable",
279 TVPValue: param1,
280 }
281 tvpTypeEmpty := TVPType{
282 TVPTypeName: "tvptable",
283 TVPValue: []TvptableRow{},
277 tvpType := TVP{
278 TypeName: "tvptable",
279 Value: param1,
280 }
281 tvpTypeEmpty := TVP{
282 TypeName: "tvptable",
283 Value: []TvptableRow{},
284284 }
285285
286286 rows, err := db.QueryContext(ctx,
518518 },
519519 }
520520
521 tvpType := TVPType{
522 TVPTypeName: "tvptable",
523 TVPValue: param1,
524 }
525 tvpTypeEmpty := TVPType{
526 TVPTypeName: "tvptable",
527 TVPValue: []TvptableRowWithSkipTag{},
521 tvpType := TVP{
522 TypeName: "tvptable",
523 Value: param1,
524 }
525 tvpTypeEmpty := TVP{
526 TypeName: "tvptable",
527 Value: []TvptableRowWithSkipTag{},
528528 }
529529
530530 rows, err := db.QueryContext(ctx,
652652 },
653653 }
654654
655 tvpType := TVPType{
656 TVPTypeName: "exempleTVP",
657 TVPValue: exempleData,
655 tvpType := TVP{
656 TypeName: "exempleTVP",
657 Value: exempleData,
658658 }
659659
660660 rows, err := conn.Query(execTvp,
5959 },
6060 },
6161 {
62 name: "TVPValue has wrong field type",
62 name: "Value has wrong field type",
6363 fields: fields{
6464 TVPValue: []TestFieldError{TestFieldError{}},
6565 },
6666 wantErr: true,
6767 },
6868 {
69 name: "TVPValue has wrong type",
69 name: "Value has wrong type",
7070 fields: fields{
7171 TVPValue: []TestFieldsUnsupportedTypes{},
7272 },
7373 wantErr: true,
7474 },
7575 {
76 name: "TVPValue has wrong type",
76 name: "Value has wrong type",
7777 fields: fields{
7878 TVPValue: []structType{},
7979 },
110110 }
111111 for _, tt := range tests {
112112 t.Run(tt.name, func(t *testing.T) {
113 tvp := TVPType{
114 TVPTypeName: tt.fields.TVPName,
115 TVPValue: tt.fields.TVPValue,
113 tvp := TVP{
114 TypeName: tt.fields.TVPName,
115 Value: tt.fields.TVPValue,
116116 }
117117 _, _, err := tvp.columnTypes()
118118 if (err != nil) != tt.wantErr {
119 t.Errorf("TVPType.columnTypes() error = %v, wantErr %v", err, tt.wantErr)
119 t.Errorf("TVP.columnTypes() error = %v, wantErr %v", err, tt.wantErr)
120120 return
121121 }
122122 })
137137 wantErr bool
138138 }{
139139 {
140 name: "TVPTypeName is nil",
141 wantErr: true,
142 },
143 {
144 name: "TVPValue is nil",
140 name: "TypeName is nil",
141 wantErr: true,
142 },
143 {
144 name: "Value is nil",
145145 fields: fields{
146146 TVPName: "Test",
147147 TVPValue: nil,
149149 wantErr: true,
150150 },
151151 {
152 name: "TVPValue is nil",
152 name: "Value is nil",
153153 fields: fields{
154154 TVPName: "Test",
155155 },
156156 wantErr: true,
157157 },
158158 {
159 name: "TVPValue isn't slice",
159 name: "Value isn't slice",
160160 fields: fields{
161161 TVPName: "Test",
162162 TVPValue: "",
164164 wantErr: true,
165165 },
166166 {
167 name: "TVPValue isn't slice",
167 name: "Value isn't slice",
168168 fields: fields{
169169 TVPName: "Test",
170170 TVPValue: 12345,
172172 wantErr: true,
173173 },
174174 {
175 name: "TVPValue isn't slice",
175 name: "Value isn't slice",
176176 fields: fields{
177177 TVPName: "Test",
178178 TVPValue: nullSlice,
180180 wantErr: true,
181181 },
182182 {
183 name: "TVPValue isn't right",
183 name: "Value isn't right",
184184 fields: fields{
185185 TVPName: "Test",
186186 TVPValue: []*fields{},
188188 wantErr: true,
189189 },
190190 {
191 name: "TVPValue is right",
192 fields: fields{
193 TVPName: "Test",
194 TVPValue: []fields{},
195 },
196 wantErr: false,
197 },
198 {
199 name: "TVPValue is right",
200 fields: fields{
201 TVPName: "Test",
202 TVPValue: []fields{},
203 },
204 wantErr: false,
205 },
206 {
207 name: "TVPValue is right",
191 name: "Value is right",
192 fields: fields{
193 TVPName: "Test",
194 TVPValue: []fields{},
195 },
196 wantErr: false,
197 },
198 {
199 name: "Value is right",
200 fields: fields{
201 TVPName: "Test",
202 TVPValue: []fields{},
203 },
204 wantErr: false,
205 },
206 {
207 name: "Value is right",
208208 fields: fields{
209209 TVPName: "[Test]",
210210 TVPValue: []fields{},
212212 wantErr: false,
213213 },
214214 {
215 name: "TVPValue is right",
215 name: "Value is right",
216216 fields: fields{
217217 TVPName: "[123].[Test]",
218218 TVPValue: []fields{},
254254 }
255255 for _, tt := range tests {
256256 t.Run(tt.name, func(t *testing.T) {
257 tvp := TVPType{
258 TVPTypeName: tt.fields.TVPName,
259 TVPValue: tt.fields.TVPValue,
257 tvp := TVP{
258 TypeName: tt.fields.TVPName,
259 Value: tt.fields.TVPValue,
260260 }
261261 if err := tvp.check(); (err != nil) != tt.wantErr {
262 t.Errorf("TVPType.check() error = %v, wantErr %v", err, tt.wantErr)
262 t.Errorf("TVP.check() error = %v, wantErr %v", err, tt.wantErr)
263263 }
264264 })
265265 }
278278 wantErr bool
279279 }{
280280 {
281 name: "TVPValue gets error unsupported type",
281 name: "Value gets error unsupported type",
282282 fields: fields{
283283 TVPTypeName: "Test",
284284 TVPValue: []TestFieldError{},
288288 }
289289 for _, tt := range tests {
290290 t.Run(tt.name, func(t *testing.T) {
291 tvp := TVPType{
292 TVPTypeName: tt.fields.TVPTypeName,
293 TVPValue: tt.fields.TVPValue,
291 tvp := TVP{
292 TypeName: tt.fields.TVPTypeName,
293 Value: tt.fields.TVPValue,
294294 }
295295 schema, name, err := getSchemeAndName(tt.fields.TVPTypeName)
296296 if err != nil {
298298 }
299299 _, err = tvp.encode(schema, name)
300300 if (err != nil) != tt.wantErr {
301 t.Errorf("TVPType.encode() error = %v, wantErr %v", err, tt.wantErr)
301 t.Errorf("TVP.encode() error = %v, wantErr %v", err, tt.wantErr)
302302 }
303303 })
304304 }
308308 type val struct {
309309 Value string
310310 }
311 tvp := TVPType{
312 TVPTypeName: "Test",
313 TVPValue: []val{},
311 tvp := TVP{
312 TypeName: "Test",
313 Value: []val{},
314314 }
315315 for i := 0; i < b.N; i++ {
316316 err := tvp.check()
353353 boolsNull *bool
354354 }
355355 wal := make([]str, 100)
356 tvp := TVPType{
357 TVPTypeName: "Test",
358 TVPValue: wal,
356 tvp := TVP{
357 TypeName: "Test",
358 Value: wal,
359359 }
360360 for i := 0; i < b.N; i++ {
361361 _, _, err := tvp.columnTypes()
7272 const _PLP_NULL = 0xFFFFFFFFFFFFFFFF
7373 const _UNKNOWN_PLP_LEN = 0xFFFFFFFFFFFFFFFE
7474 const _PLP_TERMINATOR = 0x00000000
75 const _TVP_NULL_TOKEN = 0xffff
7675
7776 // TVP COLUMN FLAGS
78 const _TVP_COLUMN_DEFAULT_FLAG = 0x200
7977 const _TVP_END_TOKEN = 0x00
8078 const _TVP_ROW_TOKEN = 0x01
81 const _TVP_ORDER_UNIQUE_TOKEN = 0x10
82 const _TVP_COLUMN_ORDERING_TOKEN = 0x11
8379
8480 // TYPE_INFO rule
8581 // http://msdn.microsoft.com/en-us/library/dd358284.aspx