1+ #include "connection.h"
2+
3+ VALUE connection_alloc (VALUE klass ) {
4+ Connection * conn = ALLOC (Connection );
5+ DEBUG_PRINT ("Allocating Connection: %p" , (void * )conn );
6+ conn -> c_conn = NULL ;
7+ return rb_data_typed_object_wrap (klass , conn , & ConnectionType );
8+ }
9+
10+ VALUE connection_initialize (VALUE self , VALUE argc , VALUE argv ) {
11+ Check_Type (argc , T_FIXNUM );
12+ Check_Type (argv , T_ARRAY );
13+
14+ int c_argc = NUM2INT (argc );
15+ char * * c_argv = ALLOC_N (char * , c_argc );
16+
17+ for (int i = 0 ; i < c_argc ; i ++ )
18+ {
19+ VALUE arg = rb_ary_entry (argv , i );
20+ c_argv [i ] = StringValueCStr (arg );
21+ }
22+
23+ Connection * conn ;
24+ TypedData_Get_Struct (self , Connection , & ConnectionType , conn );
25+ conn -> c_conn = connect_chdb (c_argc , c_argv );
26+
27+ if (!conn -> c_conn )
28+ {
29+ xfree (c_argv );
30+ rb_raise (cChDBError , "Failed to connect to chDB" );
31+ }
32+
33+ xfree (c_argv );
34+ rb_gc_unregister_address (& argv );
35+ return self ;
36+ }
37+
38+ VALUE connection_query (VALUE self , VALUE query , VALUE format ) {
39+ Connection * conn ;
40+ TypedData_Get_Struct (self , Connection , & ConnectionType , conn );
41+
42+ Check_Type (query , T_STRING );
43+ Check_Type (format , T_STRING );
44+
45+ struct local_result_v2 * c_result = query_conn (
46+ * conn -> c_conn ,
47+ StringValueCStr (query ),
48+ StringValueCStr (format )
49+ );
50+
51+ if (!c_result )
52+ rb_raise (cChDBError , "Query failed with nil result" );
53+
54+ if (c_result -> error_message )
55+ {
56+ VALUE error_message = rb_str_new_cstr (c_result -> error_message );
57+ rb_raise (cChDBError , "CHDB error: %s" , StringValueCStr (error_message ));
58+ }
59+
60+ VALUE result_obj = rb_class_new_instance (0 , NULL , cLocalResult );
61+ LocalResult * result ;
62+ TypedData_Get_Struct (result_obj , LocalResult , & LocalResultType , result );
63+ result -> c_result = c_result ;
64+
65+ return result_obj ;
66+ }
67+
68+ VALUE connection_close (VALUE self ) {
69+ Connection * conn ;
70+ TypedData_Get_Struct (self , Connection , & ConnectionType , conn );
71+
72+ if (conn -> c_conn ) {
73+ close_conn (conn -> c_conn );
74+ conn -> c_conn = NULL ;
75+ }
76+ return Qnil ;
77+ }
78+
79+ static void connection_free (void * ptr ) {
80+ Connection * conn = (Connection * )ptr ;
81+ DEBUG_PRINT ("Closing connection: %p" , (void * )conn -> c_conn );
82+ if (conn -> c_conn ) {
83+ close_conn (conn -> c_conn );
84+ }
85+ free (conn );
86+ }
87+
88+ const rb_data_type_t ConnectionType = {
89+ "Connection" ,
90+ {NULL , connection_free , NULL },
91+ };
92+
93+ // 其他 Connection 方法保持不变...
0 commit comments