Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ydb: support lastErr; callRet: allow omit nil error #84

Merged
merged 1 commit into from
Feb 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion demo/classfile_blog/gop_autogen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion demo/classfile_hello/gop_autogen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion demo/classfile_static/gop_autogen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion demo/classfile_statichttp/gop_autogen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

51 changes: 29 additions & 22 deletions ydb/class.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,17 @@ var (
type Class struct {
Sql

self reflect.Value
tbl string
query *query // query
self reflect.Value
tbl string

result []reflect.Value // result of an api call

ret func(args ...any) error
onErr func(err error)
ret func(args ...any) error
onErr func(err error)
lastErr error
test.Case

query *query // query
}

func (p *Class) initClass(self any) {
Expand Down Expand Up @@ -147,19 +149,22 @@ func (p *Class) call(name string, vFn reflect.Value, args ...any) {
}
defer func() {
p.onErr = old
if e := recover(); e != nil {
if p.result == nil { // set p.result to zero if panic
fnt := vFn.Type()
n := fnt.NumOut()
p.result = make([]reflect.Value, n)
for i := 0; i < n; i++ {
p.result[i] = reflect.Zero(fnt.Out(i))
}
if p.result == nil { // set p.result to zero if panic
fnt := vFn.Type()
n := fnt.NumOut()
p.result = make([]reflect.Value, n, n+1)
for i := 0; i < n; i++ {
p.result[i] = reflect.Zero(fnt.Out(i))
}
}
if !hasRetErrType(p.result) {
p.result = append(p.result, reflect.Zero(tyError))
}
if e := recover(); e != nil {
if errRet == nil {
errRet = recoverErr(e)
}
setRetErr(p.result, errRet)
p.result[len(p.result)-1] = reflect.ValueOf(errRet)
if debugExec {
log.Println("PANIC:", e)
debug.PrintStack()
Expand All @@ -175,10 +180,13 @@ func (p *Class) callRet(args ...any) error {
t := p.t()
result := p.result
if len(result) != len(args) {
t.Fatalf(
"call ret: unmatched result parameters count - got %d, expected %d\n",
len(args), len(result),
)
if len(result) != len(args)+1 {
t.Fatalf(
"call ret: unmatched result parameters count - got %d, expected %d\n",
len(args), len(result),
)
}
args = append(args, nil)
}
for i, arg := range args {
ret := result[i].Interface()
Expand All @@ -192,12 +200,11 @@ var (
tyError = reflect.TypeOf((*error)(nil)).Elem()
)

func setRetErr(result []reflect.Value, errRet error) {
func hasRetErrType(result []reflect.Value) bool {
if n := len(result); n > 0 {
if result[n-1].Type() == tyError {
result[n-1] = reflect.ValueOf(errRet)
}
return result[n-1].Type() == tyError
}
return false
}

// Out returns the ith reuslt.
Expand Down
31 changes: 15 additions & 16 deletions ydb/demo/foo/articles_ydb.gox
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,18 @@ type Tag struct {
Doc string `CHAR(32)`
}

func API_Add(doc Article) error {
func API_Add(doc Article) {
insert doc
return nil
}

func API_Get(docId string) (doc Article, err error) {
query "id=?", docId
ret &doc
err = lastErr
return
}

func API_SetTags(docId string, tags ...string) error {
func API_SetTags(docId string, tags ...string) {
var oldtags []string
query "tag.doc=?", docId
ret "tag.name", &oldtags
Expand All @@ -40,10 +40,9 @@ func API_SetTags(docId string, tags ...string) error {

delete "tag.name=?", tagsDel
insert "tag.doc", docId, "tag.name", tagsAdd
return nil
}

func API_Tags(docId string) (tags []string, err error) {
func API_Tags(docId string) (tags []string) {
query "tag.doc=?", docId
ret "tag.name", &tags
return
Expand Down Expand Up @@ -75,51 +74,51 @@ use "article"
doc1 := Article{}
doc1.Id, doc1.Author, doc1.Title = "123", "abc", "title1"
add doc1
ret nil
ret

add doc1
ret ErrDuplicated

doc2 := Article{}
doc2.Id, doc2.Author, doc2.Title = "124", "efg", "title2"
add doc2
ret nil
ret

doc3 := Article{}
doc3.Id, doc3.Author, doc3.Title = "125", "efg", "title3"
add doc3
ret nil
ret

doc4 := Article{}
doc4.Id, doc4.Author, doc4.Title = "225", "abc", "title4"
add doc4
ret nil
ret

doc5 := Article{}
doc5.Id, doc5.Author, doc5.Title = "555", "abc", "title5"
add doc5
ret nil
ret

get doc1.Id
ret doc1, nil
ret doc1

get doc2.Id
ret doc2, nil
ret doc2

get "unknown"
match out(1), ErrNoRows

setTags doc1.Id, "tag1", "tag2"
ret nil
ret

tags doc1.Id
ret set("tag2", "tag1"), nil
ret set("tag2", "tag1")

setTags doc1.Id, "tag1", "tag3"
ret nil
ret

tags doc1.Id
ret set("tag1", "tag3"), nil
ret set("tag1", "tag3")

setTags doc2.Id, "tag1", "tag5"
setTags doc3.Id, "tag1", "tag3"
Expand Down
Loading