MCPcopy Index your code
hub / github.com/lib/pq / scanBytes

Method scanBytes

array.go:420–472  ·  view source on GitHub ↗
(src []byte, dv reflect.Value)

Source from the content-addressed store, hash-verified

418}
419
420func (a GenericArray) scanBytes(src []byte, dv reflect.Value) error {
421 dtype, assign, del := a.evaluateDestination(dv.Type().Elem())
422 dims, elems, err := parseArray(src, []byte(del))
423 if err != nil {
424 return err
425 }
426
427 // TODO allow multidimensional
428
429 if len(dims) > 1 {
430 return fmt.Errorf("pq: scanning from multidimensional ARRAY%s is not implemented",
431 strings.Replace(fmt.Sprint(dims), " ", "][", -1))
432 }
433
434 // Treat a zero-dimensional array like an array with a single dimension of zero.
435 if len(dims) == 0 {
436 dims = append(dims, 0)
437 }
438
439 for i, rt := 0, dv.Type(); i < len(dims); i, rt = i+1, rt.Elem() {
440 switch rt.Kind() {
441 case reflect.Slice:
442 case reflect.Array:
443 if rt.Len() != dims[i] {
444 return fmt.Errorf("pq: cannot convert ARRAY%s to %s",
445 strings.Replace(fmt.Sprint(dims), " ", "][", -1), dv.Type())
446 }
447 default:
448 // TODO handle multidimensional
449 }
450 }
451
452 values := reflect.MakeSlice(reflect.SliceOf(dtype), len(elems), len(elems))
453 for i, e := range elems {
454 err := assign(e, values.Index(i))
455 if err != nil {
456 return fmt.Errorf("pq: parsing array element index %d: %w", i, err)
457 }
458 }
459
460 // TODO handle multidimensional
461
462 switch dv.Kind() {
463 case reflect.Slice:
464 dv.Set(values.Slice(0, dims[0]))
465 case reflect.Array:
466 for i := 0; i < dims[0]; i++ {
467 dv.Index(i).Set(values.Index(i))
468 }
469 }
470
471 return nil
472}
473
474// Value implements the driver.Valuer interface.
475func (a GenericArray) Value() (driver.Value, error) {

Callers 1

ScanMethod · 0.95

Calls 3

evaluateDestinationMethod · 0.95
parseArrayFunction · 0.85
TypeMethod · 0.80

Tested by

no test coverage detected