55from decimal import Decimal
66from typing import Optional
77
8+ import psycopg2
89import pymssql
9-
1010from apps .db .db_sql import get_table_sql , get_field_sql , get_version_sql
1111from common .error import ParseSQLResultError
1212
@@ -191,6 +191,20 @@ def check_connection(trans: Optional[Trans], ds: CoreDatasource | AssistantOutDs
191191 if is_raise :
192192 raise HTTPException (status_code = 500 , detail = trans ('i18n_ds_invalid' ) + f': { e .args } ' )
193193 return False
194+ elif ds .type == 'kingbase' :
195+ with psycopg2 .connect (host = conf .host , port = conf .port , database = conf .database ,
196+ user = conf .username ,
197+ password = conf .password ,
198+ connect_timeout = 10 , ** extra_config_dict ) as conn , conn .cursor () as cursor :
199+ try :
200+ cursor .execute ('select 1' )
201+ SQLBotLogUtil .info ("success" )
202+ return True
203+ except Exception as e :
204+ SQLBotLogUtil .error (f"Datasource { ds .id } connection failed: { e } " )
205+ if is_raise :
206+ raise HTTPException (status_code = 500 , detail = trans ('i18n_ds_invalid' ) + f': { e .args } ' )
207+ return False
194208 elif ds .type == 'es' :
195209 es_conn = get_es_connect (conf )
196210 if es_conn .ping ():
@@ -269,8 +283,7 @@ def get_schema(ds: CoreDatasource):
269283 if ds .type == "sqlServer" :
270284 sql = """select name from sys.schemas"""
271285 elif ds .type == "pg" or ds .type == "excel" :
272- sql = """SELECT nspname
273- FROM pg_namespace"""
286+ sql = """SELECT nspname FROM pg_namespace"""
274287 elif ds .type == "oracle" :
275288 sql = """select * from all_users"""
276289 with session .execute (text (sql )) as result :
@@ -294,6 +307,15 @@ def get_schema(ds: CoreDatasource):
294307 res = cursor .fetchall ()
295308 res_list = [item [0 ] for item in res ]
296309 return res_list
310+ elif ds .type == 'kingbase' :
311+ with psycopg2 .connect (host = conf .host , port = conf .port , database = conf .database , user = conf .username ,
312+ password = conf .password ,
313+ options = f"-c statement_timeout={ conf .timeout * 1000 } " ,
314+ ** extra_config_dict ) as conn , conn .cursor () as cursor :
315+ cursor .execute ("""SELECT nspname FROM pg_namespace""" )
316+ res = cursor .fetchall ()
317+ res_list = [item [0 ] for item in res ]
318+ return res_list
297319
298320
299321def get_tables (ds : CoreDatasource ):
@@ -331,6 +353,15 @@ def get_tables(ds: CoreDatasource):
331353 res = cursor .fetchall ()
332354 res_list = [TableSchema (* item ) for item in res ]
333355 return res_list
356+ elif ds .type == 'kingbase' :
357+ with psycopg2 .connect (host = conf .host , port = conf .port , database = conf .database , user = conf .username ,
358+ password = conf .password ,
359+ options = f"-c statement_timeout={ conf .timeout * 1000 } " ,
360+ ** extra_config_dict ) as conn , conn .cursor () as cursor :
361+ cursor .execute (sql .format (sql_param ))
362+ res = cursor .fetchall ()
363+ res_list = [TableSchema (* item ) for item in res ]
364+ return res_list
334365 elif ds .type == 'es' :
335366 res = get_es_index (conf )
336367 res_list = [TableSchema (* item ) for item in res ]
@@ -372,6 +403,15 @@ def get_fields(ds: CoreDatasource, table_name: str = None):
372403 res = cursor .fetchall ()
373404 res_list = [ColumnSchema (* item ) for item in res ]
374405 return res_list
406+ elif ds .type == 'kingbase' :
407+ with psycopg2 .connect (host = conf .host , port = conf .port , database = conf .database , user = conf .username ,
408+ password = conf .password ,
409+ options = f"-c statement_timeout={ conf .timeout * 1000 } " ,
410+ ** extra_config_dict ) as conn , conn .cursor () as cursor :
411+ cursor .execute (sql .format (p1 , p2 ))
412+ res = cursor .fetchall ()
413+ res_list = [ColumnSchema (* item ) for item in res ]
414+ return res_list
375415 elif ds .type == 'es' :
376416 res = get_es_fields (conf , table_name )
377417 res_list = [ColumnSchema (* item ) for item in res ]
@@ -457,6 +497,26 @@ def exec_sql(ds: CoreDatasource | AssistantOutDsSchema, sql: str, origin_column=
457497 "sql" : bytes .decode (base64 .b64encode (bytes (sql , 'utf-8' )))}
458498 except Exception as ex :
459499 raise ParseSQLResultError (str (ex ))
500+ elif ds .type == 'kingbase' :
501+ with psycopg2 .connect (host = conf .host , port = conf .port , database = conf .database , user = conf .username ,
502+ password = conf .password ,
503+ options = f"-c statement_timeout={ conf .timeout * 1000 } " ,
504+ ** extra_config_dict ) as conn , conn .cursor () as cursor :
505+ try :
506+ cursor .execute (sql )
507+ res = cursor .fetchall ()
508+ columns = [field [0 ] for field in cursor .description ] if origin_column else [field [0 ].lower () for
509+ field in
510+ cursor .description ]
511+ result_list = [
512+ {str (columns [i ]): float (value ) if isinstance (value , Decimal ) else value for i , value in
513+ enumerate (tuple_item )}
514+ for tuple_item in res
515+ ]
516+ return {"fields" : columns , "data" : result_list ,
517+ "sql" : bytes .decode (base64 .b64encode (bytes (sql , 'utf-8' )))}
518+ except Exception as ex :
519+ raise ParseSQLResultError (str (ex ))
460520 elif ds .type == 'es' :
461521 try :
462522 res , columns = get_es_data_by_http (conf , sql )
0 commit comments