Skip to content

Commit a523455

Browse files
committed
added the varray type mapping
1 parent d61f051 commit a523455

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed

oracle/varray.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package oracle
2+
3+
import (
4+
"context"
5+
"database/sql/driver"
6+
"fmt"
7+
8+
"github.com/godror/godror"
9+
)
10+
11+
var DB godror.Execer // set in tests
12+
13+
// EmailList is a Go wrapper for Oracle VARRAY type EMAIL_LIST_ARR.
14+
type EmailList []string
15+
16+
// Scan implements sql.Scanner (Oracle -> Go)
17+
func (e *EmailList) Scan(src interface{}) error {
18+
obj, ok := src.(*godror.Object)
19+
if !ok {
20+
return fmt.Errorf("expected *godror.Object, got %T", src)
21+
}
22+
defer obj.Close()
23+
24+
coll := obj.Collection()
25+
length, err := coll.Len()
26+
if err != nil {
27+
return fmt.Errorf("get collection length: %w", err)
28+
}
29+
30+
var list []string
31+
for i := 0; i < length; i++ {
32+
var data godror.Data
33+
if err := coll.GetItem(&data, i); err != nil {
34+
return fmt.Errorf("GetItem %d: %w", i, err)
35+
}
36+
val := data.Get()
37+
switch v := val.(type) {
38+
case string:
39+
list = append(list, v)
40+
case []byte:
41+
list = append(list, string(v))
42+
default:
43+
if v != nil {
44+
list = append(list, fmt.Sprint(v))
45+
}
46+
}
47+
}
48+
*e = list
49+
return nil
50+
}
51+
52+
// Value implements driver.Valuer (Go -> Oracle)
53+
func (e EmailList) Value() (driver.Value, error) {
54+
if e == nil {
55+
return nil, nil
56+
}
57+
if DB == nil {
58+
return nil, fmt.Errorf("oracle.DB not initialized")
59+
}
60+
61+
ctx := context.Background()
62+
63+
objType, err := godror.GetObjectType(ctx, DB, "EMAIL_LIST_ARR")
64+
if err != nil {
65+
return nil, fmt.Errorf("get object type: %w", err)
66+
}
67+
defer objType.Close()
68+
69+
obj, err := objType.NewObject()
70+
if err != nil {
71+
return nil, fmt.Errorf("new object: %w", err)
72+
}
73+
coll := obj.Collection()
74+
75+
for _, s := range e {
76+
if err := coll.Append(s); err != nil {
77+
obj.Close()
78+
return nil, fmt.Errorf("append: %w", err)
79+
}
80+
}
81+
82+
return obj, nil
83+
}

0 commit comments

Comments
 (0)