cgo: change interface to not return already-collected error interfaces

This commit is contained in:
mappu 2017-05-20 15:13:16 +12:00
parent a94a330345
commit e8030a9579
5 changed files with 31 additions and 40 deletions

38
main.go
View File

@ -34,24 +34,24 @@ func Recall(f func(a int64) int64) int64 {
} }
//export Bolt_Open //export Bolt_Open
func Bolt_Open(path string, mode uint32, opts ObjectReference) (ObjectReference, error) { func Bolt_Open(path string, mode uint32, opts ObjectReference) (ObjectReference, string) {
optsIFC, ok := gms.Get(opts) optsIFC, ok := gms.Get(opts)
if !ok { if !ok {
return 0, NullObjectReference return 0, ""
} }
ptrBoltOps, ok := optsIFC.(*bolt.Options) ptrBoltOps, ok := optsIFC.(*bolt.Options)
if !ok { if !ok {
return 0, NullObjectReference return 0, ""
} }
ptrDB, err := bolt.Open(path, os.FileMode(mode), ptrBoltOps) ptrDB, err := bolt.Open(path, os.FileMode(mode), ptrBoltOps)
if err != nil { if err != nil {
return 0, err return 0, err.Error()
} }
dbRef := gms.Put(ptrDB) dbRef := gms.Put(ptrDB)
return dbRef, nil return dbRef, ""
} }
func withBoltDBReference(b ObjectReference, fn func(db *bolt.DB) error) error { func withBoltDBReference(b ObjectReference, fn func(db *bolt.DB) error) error {
@ -68,13 +68,8 @@ func withBoltDBReference(b ObjectReference, fn func(db *bolt.DB) error) error {
return fn(ptrDB) return fn(ptrDB)
} }
//export Error_Error
func Error_Error(e error) string {
return e.Error()
}
//export Bolt_ListBuckets //export Bolt_ListBuckets
func Bolt_ListBuckets(b ObjectReference, browse []string, withEach func(string)) error { func Bolt_ListBuckets(b ObjectReference, browse []string, withEach func(string)) string {
if len(browse) == 0 { if len(browse) == 0 {
return Bolt_ListBucketsAtRoot(b, withEach) return Bolt_ListBucketsAtRoot(b, withEach)
} }
@ -102,11 +97,16 @@ func Bolt_ListBuckets(b ObjectReference, browse []string, withEach func(string))
}) })
}) })
return err
if err != nil {
return err.Error()
}
return ""
} }
//export Bolt_ListBucketsAtRoot //export Bolt_ListBucketsAtRoot
func Bolt_ListBucketsAtRoot(b ObjectReference, withEach func(string)) error { func Bolt_ListBucketsAtRoot(b ObjectReference, withEach func(string)) string {
err := withBoltDBReference(b, func(db *bolt.DB) error { err := withBoltDBReference(b, func(db *bolt.DB) error {
return db.View(func(tx *bolt.Tx) error { return db.View(func(tx *bolt.Tx) error {
@ -118,21 +118,25 @@ func Bolt_ListBucketsAtRoot(b ObjectReference, withEach func(string)) error {
}) })
}) })
return err
if err != nil {
return err.Error()
}
return ""
} }
//export Bolt_Close //export Bolt_Close
func Bolt_Close(b ObjectReference) error { func Bolt_Close(b ObjectReference) string {
err := withBoltDBReference(b, func(db *bolt.DB) error { err := withBoltDBReference(b, func(db *bolt.DB) error {
return db.Close() return db.Close()
}) })
if err != nil { if err != nil {
return err return err.Error()
} }
gms.Delete(b) gms.Delete(b)
return nil return ""
} }
func main() { func main() {

10
qbolt.h
View File

@ -63,18 +63,16 @@ extern GoInt64 Recall(void* p0);
/* Return type for Bolt_Open */ /* Return type for Bolt_Open */
struct Bolt_Open_return { struct Bolt_Open_return {
GoInt64 r0; GoInt64 r0;
GoInterface r1; GoString r1;
}; };
extern struct Bolt_Open_return Bolt_Open(GoString p0, GoUint32 p1, GoInt64 p2); extern struct Bolt_Open_return Bolt_Open(GoString p0, GoUint32 p1, GoInt64 p2);
extern GoString Error_Error(GoInterface p0); extern GoString Bolt_ListBuckets(GoInt64 p0, GoSlice p1, void* p2);
extern GoInterface Bolt_ListBuckets(GoInt64 p0, GoSlice p1, void* p2); extern GoString Bolt_ListBucketsAtRoot(GoInt64 p0, void* p1);
extern GoInterface Bolt_ListBucketsAtRoot(GoInt64 p0, void* p1); extern GoString Bolt_Close(GoInt64 p0);
extern GoInterface Bolt_Close(GoInt64 p0);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -13,8 +13,8 @@ BoltDB* BoltDB::createFrom(QString filePath, QString &errorOut)
GoString filePathGS = Interop::toGoString_WeakRef(&filePathBytes); GoString filePathGS = Interop::toGoString_WeakRef(&filePathBytes);
auto open_ret = Bolt_Open(filePathGS, 0444, opts); auto open_ret = Bolt_Open(filePathGS, 0444, opts);
if (open_ret.r1.v != nullptr) { if (open_ret.r1.n != 0) {
errorOut = Interop::GetError(open_ret.r1); errorOut = QString(open_ret.r1.p);
return nullptr; return nullptr;
} }
@ -25,9 +25,9 @@ BoltDB* BoltDB::createFrom(QString filePath, QString &errorOut)
BoltDB::~BoltDB() BoltDB::~BoltDB()
{ {
auto err = Bolt_Close(this->gmsDbRef); GoString err = Bolt_Close(this->gmsDbRef);
if (err.v != nullptr) { if (err.n != 0) {
// Error closing database: // Error closing database!
// errorOut = Interop::GetError(err); // Need to display an alert... somewhere
} }
} }

View File

@ -5,15 +5,6 @@ Interop::Interop()
} }
QString Interop::GetError(GoInterface err) {
if (err.v == nullptr) {
return ""; // no error
}
GoString gs = Error_Error(err);
return QString::fromUtf8(gs.p, gs.n);
}
GoString Interop::toGoString_WeakRef(QByteArray *qba) { GoString Interop::toGoString_WeakRef(QByteArray *qba) {
return GoString{qba->data(), qba->length()}; return GoString{qba->data(), qba->length()};
} }

View File

@ -9,8 +9,6 @@ class Interop
public: public:
Interop(); Interop();
static QString GetError(GoInterface err);
static GoString toGoString_WeakRef(QByteArray *qba); static GoString toGoString_WeakRef(QByteArray *qba);
static int64_t GetMagic(); static int64_t GetMagic();