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);
}