diff --git a/ext/ruby_snowflake.go b/ext/ruby_snowflake.go index 68c4db7..d75c2ed 100644 --- a/ext/ruby_snowflake.go +++ b/ext/ruby_snowflake.go @@ -45,7 +45,7 @@ var rbSnowflakeModule C.VALUE var DB_IDENTIFIER = C.rb_intern(C.CString("db")) var RESULT_IDENTIFIER = C.rb_intern(C.CString("rows")) var RESULT_DURATION = C.rb_intern(C.CString("@query_duration")) -var RESULT_ERROR = C.rb_intern(C.CString("@error")) +var ERROR_IDENT = C.rb_intern(C.CString("@error")) var objects = make(map[interface{}]bool) @@ -68,12 +68,14 @@ func Connect(self C.VALUE, account C.VALUE, warehouse C.VALUE, database C.VALUE, dsn, err := sf.DSN(cfg) if err != nil { - rb_raise(C.rb_eArgError, "Snowflake Config Creation Error: '%s'", err) + errStr := fmt.Sprintf("Snowflake Config Creation Error: '%s'", err.Error()) + C.rb_ivar_set(self, ERROR_IDENT, RbString(errStr)) } db, err := sql.Open("snowflake", dsn) if err != nil { - rb_raise(C.rb_eArgError, "Connection Error: '%s'", err) + errStr := fmt.Sprintf("Connection Error: '%s'", err.Error()) + C.rb_ivar_set(self, ERROR_IDENT, RbString(errStr)) } rs := SnowflakeClient{db} ptr := gopointer.Save(&rs) @@ -95,7 +97,7 @@ func (x SnowflakeClient) Fetch(statement C.VALUE) C.VALUE { if err != nil { result := C.rb_class_new_instance(0, &empty, rbSnowflakeResultClass) errStr := fmt.Sprintf("Query error: '%s'", err.Error()) - C.rb_ivar_set(result, RESULT_ERROR, RbString(errStr)) + C.rb_ivar_set(result, ERROR_IDENT, RbString(errStr)) return result } @@ -106,7 +108,7 @@ func (x SnowflakeClient) Fetch(statement C.VALUE) C.VALUE { if err != nil { result := C.rb_class_new_instance(0, &empty, rbSnowflakeResultClass) errStr := fmt.Sprintf("Query error: '%s'", err.Error()) - C.rb_ivar_set(result, RESULT_ERROR, RbString(errStr)) + C.rb_ivar_set(result, ERROR_IDENT, RbString(errStr)) return result } diff --git a/lib/ruby_snowflake_client.rb b/lib/ruby_snowflake_client.rb index d129032..a407572 100644 --- a/lib/ruby_snowflake_client.rb +++ b/lib/ruby_snowflake_client.rb @@ -4,11 +4,15 @@ module Snowflake require "ruby_snowflake_client_ext" # build bundle of the go files class Client + attr_reader :error # Wrap the private _connect method, as sending kwargs to Go would require # wrapping the function in C as the current CGO has a limitation on # accepting variadic arguments for functions. def connect(account:"", warehouse:"", database:"", schema: "", user: "", password: "", role: "") _connect(account, warehouse, database, schema, user, password, role) + if error != nil + raise(error) + end true end diff --git a/spec/snowflake/client_spec.rb b/spec/snowflake/client_spec.rb index 37942bf..18e0c34 100644 --- a/spec/snowflake/client_spec.rb +++ b/spec/snowflake/client_spec.rb @@ -7,7 +7,7 @@ context "when the account is empty" do it "will return an error" do expect { client.connect }.to raise_error( - ArgumentError, "Snowflake Config Creation Error: '260000: account is empty'" + "Snowflake Config Creation Error: '260000: account is empty'" ) end end