11#![ allow( unused_variables) ]
22
3- use std:: ffi:: { c_char, c_int, c_void} ;
3+ use std:: ffi:: { c_char, c_int, c_void, CStr } ;
4+ use std:: ptr:: null_mut;
45
6+ use error:: set_err_and_get_code;
7+ use taos_error:: { Code , Error } ;
8+ use taos_query:: TBuilder ;
9+ use taos_ws:: { Taos , TaosBuilder } ;
10+
11+ mod error;
512pub mod query;
613pub mod sml;
714pub mod stmt;
@@ -13,6 +20,8 @@ pub type TAOS = c_void;
1320#[ allow( non_camel_case_types) ]
1421pub type TAOS_RES = c_void ;
1522
23+ type Result < T > = std:: result:: Result < T , Error > ;
24+
1625#[ repr( C ) ]
1726#[ allow( non_camel_case_types) ]
1827pub enum TSDB_OPTION {
@@ -61,17 +70,77 @@ pub extern "C" fn taos_connect(
6170 db : * const c_char ,
6271 port : u16 ,
6372) -> * mut TAOS {
64- todo ! ( )
73+ match connect ( ip, user, pass, db, port) {
74+ Ok ( taos) => Box :: into_raw ( Box :: new ( taos) ) as _ ,
75+ Err ( err) => {
76+ set_err_and_get_code ( err) ;
77+ null_mut ( )
78+ }
79+ }
6580}
6681
67- #[ no_mangle]
68- pub extern "C" fn taos_connect_dsn (
69- dsn : * const c_char ,
82+ fn connect (
83+ ip : * const c_char ,
7084 user : * const c_char ,
7185 pass : * const c_char ,
7286 db : * const c_char ,
73- ) -> * mut TAOS {
74- todo ! ( )
87+ mut port : u16 ,
88+ ) -> Result < Taos > {
89+ const DEFAULT_IP : & str = "localhost" ;
90+ const DEFAULT_PORT : u16 = 6041 ;
91+ const DEFAULT_USER : & str = "root" ;
92+ const DEFAULT_PASS : & str = "taosdata" ;
93+ const DEFAULT_DB : & str = "" ;
94+
95+ let ip = if ip. is_null ( ) {
96+ DEFAULT_IP
97+ } else {
98+ let ip = unsafe { CStr :: from_ptr ( ip) } ;
99+ match ip. to_str ( ) {
100+ Ok ( ip) => ip,
101+ Err ( _) => return Err ( Error :: new ( Code :: INVALID_PARA , "Invalid ip" ) ) ,
102+ }
103+ } ;
104+
105+ let user = if user. is_null ( ) {
106+ DEFAULT_USER
107+ } else {
108+ let user = unsafe { CStr :: from_ptr ( user) } ;
109+ match user. to_str ( ) {
110+ Ok ( user) => user,
111+ Err ( _) => return Err ( Error :: new ( Code :: INVALID_PARA , "Invalid user" ) ) ,
112+ }
113+ } ;
114+
115+ let pass = if pass. is_null ( ) {
116+ DEFAULT_PASS
117+ } else {
118+ let pass = unsafe { CStr :: from_ptr ( pass) } ;
119+ match pass. to_str ( ) {
120+ Ok ( pass) => pass,
121+ Err ( _) => return Err ( Error :: new ( Code :: INVALID_PARA , "Invalid pass" ) ) ,
122+ }
123+ } ;
124+
125+ let db = if db. is_null ( ) {
126+ DEFAULT_DB
127+ } else {
128+ let db = unsafe { CStr :: from_ptr ( db) } ;
129+ match db. to_str ( ) {
130+ Ok ( db) => db,
131+ Err ( _) => return Err ( Error :: new ( Code :: INVALID_PARA , "Invalid db" ) ) ,
132+ }
133+ } ;
134+
135+ if port == 0 {
136+ port = DEFAULT_PORT ;
137+ }
138+
139+ let dsn = format ! ( "ws://{user}:{pass}@{ip}:{port}/{db}" ) ;
140+ let builder = TaosBuilder :: from_dsn ( dsn) ?;
141+ let mut taos = builder. build ( ) ?;
142+ builder. ping ( & mut taos) ?;
143+ Ok ( taos)
75144}
76145
77146#[ no_mangle]
@@ -84,12 +153,40 @@ pub extern "C" fn taos_data_type(r#type: c_int) -> *const c_char {
84153 todo ! ( )
85154}
86155
87- #[ no_mangle ]
88- pub extern "C" fn taos_errstr ( res : * mut TAOS_RES ) -> * const c_char {
89- todo ! ( )
90- }
156+ #[ cfg ( test ) ]
157+ mod tests {
158+ use std :: ffi :: CString ;
159+ use std :: ptr :: null ;
91160
92- #[ no_mangle]
93- pub extern "C" fn taos_errno ( res : * mut TAOS_RES ) -> c_int {
94- todo ! ( )
161+ use super :: * ;
162+
163+ #[ test]
164+ fn test_taos_connect ( ) {
165+ let taos = taos_connect (
166+ c"localhost" . as_ptr ( ) ,
167+ c"root" . as_ptr ( ) ,
168+ c"taosdata" . as_ptr ( ) ,
169+ null ( ) ,
170+ 6041 ,
171+ ) ;
172+ assert ! ( !taos. is_null( ) ) ;
173+
174+ let taos = taos_connect ( null ( ) , null ( ) , null ( ) , null ( ) , 0 ) ;
175+ assert ! ( !taos. is_null( ) ) ;
176+
177+ let invalid_utf8 = CString :: new ( [ 0xff , 0xfe , 0xfd ] ) . unwrap ( ) ;
178+ let invalid_utf8_ptr = invalid_utf8. as_ptr ( ) ;
179+
180+ let taos = taos_connect ( invalid_utf8_ptr, null ( ) , null ( ) , null ( ) , 0 ) ;
181+ assert ! ( taos. is_null( ) ) ;
182+
183+ let taos = taos_connect ( null ( ) , invalid_utf8_ptr, null ( ) , null ( ) , 0 ) ;
184+ assert ! ( taos. is_null( ) ) ;
185+
186+ let taos = taos_connect ( null ( ) , null ( ) , invalid_utf8_ptr, null ( ) , 0 ) ;
187+ assert ! ( taos. is_null( ) ) ;
188+
189+ let taos = taos_connect ( null ( ) , null ( ) , null ( ) , invalid_utf8_ptr, 0 ) ;
190+ assert ! ( taos. is_null( ) ) ;
191+ }
95192}
0 commit comments