ext/duckdb/connection.c in duckdb-0.0.6 vs ext/duckdb/connection.c in duckdb-0.0.7

- old
+ new

@@ -31,20 +31,52 @@ // rb_ivar_set(obj, rb_intern("database"), oDuckDBDatabase); return obj; } +static VALUE duckdb_connection_disconnect(VALUE self) +{ + rubyDuckDBConnection *ctx; + + Data_Get_Struct(self, rubyDuckDBConnection, ctx); + duckdb_disconnect(&(ctx->con)); + + return self; +} + +static VALUE duckdb_connection_connect(VALUE self, VALUE oDuckDBDatabase) +{ + rubyDuckDBConnection *ctx; + rubyDuckDB *ctxdb; + + if (!rb_obj_is_kind_of(oDuckDBDatabase, cDuckDBDatabase)) { + rb_raise(rb_eTypeError, "The first argument must be DuckDB::Database object."); + } + Data_Get_Struct(oDuckDBDatabase, rubyDuckDB, ctxdb); + Data_Get_Struct(self, rubyDuckDBConnection, ctx); + + if (duckdb_connect(ctxdb->db, &(ctx->con)) == DuckDBError) { + rb_raise(eDuckDBError, "connection error"); + } + + return self; +} + static VALUE duckdb_connection_query_sql(VALUE self, VALUE str) { rubyDuckDBConnection *ctx; rubyDuckDBResult *ctxr; VALUE result = create_result(); Data_Get_Struct(self, rubyDuckDBConnection, ctx); Data_Get_Struct(result, rubyDuckDBResult, ctxr); + if (!(ctx->con)) { + rb_raise(eDuckDBError, "Database connection closed"); + } + if (duckdb_query(ctx->con, StringValueCStr(str), &(ctxr->result)) == DuckDBError) { rb_raise(eDuckDBError, "%s", ctxr->result.error_message); } return result; } @@ -52,7 +84,9 @@ void init_duckdb_connection(void) { cDuckDBConnection = rb_define_class_under(mDuckDB, "Connection", rb_cObject); rb_define_alloc_func(cDuckDBConnection, allocate); + rb_define_method(cDuckDBConnection, "disconnect", duckdb_connection_disconnect, 0); + rb_define_method(cDuckDBConnection, "connect", duckdb_connection_connect, 1); rb_define_private_method(cDuckDBConnection, "query_sql", duckdb_connection_query_sql, 1); }