MindsDB 25.4.5.0__py3-none-any.whl → 25.5.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of MindsDB might be problematic. Click here for more details.
- mindsdb/__about__.py +1 -1
- mindsdb/__main__.py +215 -185
- mindsdb/api/a2a/__init__.py +0 -0
- mindsdb/api/a2a/__main__.py +114 -0
- mindsdb/api/a2a/a2a_client.py +439 -0
- mindsdb/api/a2a/agent.py +308 -0
- mindsdb/api/a2a/common/__init__.py +0 -0
- mindsdb/api/a2a/common/client/__init__.py +4 -0
- mindsdb/api/a2a/common/client/card_resolver.py +21 -0
- mindsdb/api/a2a/common/client/client.py +86 -0
- mindsdb/api/a2a/common/server/__init__.py +4 -0
- mindsdb/api/a2a/common/server/server.py +164 -0
- mindsdb/api/a2a/common/server/task_manager.py +287 -0
- mindsdb/api/a2a/common/server/utils.py +28 -0
- mindsdb/api/a2a/common/types.py +365 -0
- mindsdb/api/a2a/constants.py +9 -0
- mindsdb/api/a2a/run_a2a.py +129 -0
- mindsdb/api/a2a/task_manager.py +594 -0
- mindsdb/api/executor/command_executor.py +49 -28
- mindsdb/api/executor/datahub/classes/response.py +5 -2
- mindsdb/api/executor/datahub/datanodes/information_schema_datanode.py +8 -0
- mindsdb/api/executor/datahub/datanodes/integration_datanode.py +39 -72
- mindsdb/api/executor/datahub/datanodes/system_tables.py +10 -13
- mindsdb/api/executor/planner/query_planner.py +14 -2
- mindsdb/api/executor/sql_query/result_set.py +185 -52
- mindsdb/api/executor/sql_query/sql_query.py +1 -1
- mindsdb/api/executor/sql_query/steps/apply_predictor_step.py +11 -13
- mindsdb/api/executor/sql_query/steps/fetch_dataframe.py +8 -10
- mindsdb/api/executor/sql_query/steps/fetch_dataframe_partition.py +5 -44
- mindsdb/api/executor/sql_query/steps/insert_step.py +24 -15
- mindsdb/api/executor/sql_query/steps/join_step.py +1 -1
- mindsdb/api/executor/sql_query/steps/project_step.py +1 -1
- mindsdb/api/executor/sql_query/steps/sql_steps.py +1 -1
- mindsdb/api/executor/sql_query/steps/subselect_step.py +4 -8
- mindsdb/api/executor/sql_query/steps/union_step.py +1 -3
- mindsdb/api/http/initialize.py +118 -85
- mindsdb/api/http/namespaces/analysis.py +17 -4
- mindsdb/api/http/namespaces/file.py +8 -2
- mindsdb/api/http/namespaces/sql.py +13 -27
- mindsdb/api/http/namespaces/tree.py +1 -1
- mindsdb/api/http/start.py +7 -2
- mindsdb/api/mcp/start.py +42 -5
- mindsdb/api/mysql/mysql_proxy/data_types/mysql_packet.py +0 -1
- mindsdb/api/mysql/mysql_proxy/data_types/mysql_packets/binary_resultset_row_package.py +52 -19
- mindsdb/api/mysql/mysql_proxy/executor/mysql_executor.py +8 -10
- mindsdb/api/mysql/mysql_proxy/libs/constants/mysql.py +54 -38
- mindsdb/api/mysql/mysql_proxy/mysql_proxy.py +86 -123
- mindsdb/api/mysql/mysql_proxy/utilities/dump.py +351 -0
- mindsdb/api/mysql/mysql_proxy/utilities/exceptions.py +0 -4
- mindsdb/api/postgres/postgres_proxy/executor/executor.py +1 -1
- mindsdb/api/postgres/postgres_proxy/postgres_packets/postgres_message_formats.py +2 -2
- mindsdb/api/postgres/postgres_proxy/postgres_proxy.py +5 -6
- mindsdb/integrations/handlers/altibase_handler/altibase_handler.py +26 -27
- mindsdb/integrations/handlers/altibase_handler/connection_args.py +13 -13
- mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler.py +8 -8
- mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler_dsn.py +13 -13
- mindsdb/integrations/handlers/anthropic_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/anthropic_handler/anthropic_handler.py +1 -3
- mindsdb/integrations/handlers/aurora_handler/aurora_handler.py +1 -0
- mindsdb/integrations/handlers/autosklearn_handler/autosklearn_handler.py +1 -1
- mindsdb/integrations/handlers/autosklearn_handler/config.py +0 -1
- mindsdb/integrations/handlers/bigquery_handler/bigquery_handler.py +1 -1
- mindsdb/integrations/handlers/bigquery_handler/requirements.txt +1 -0
- mindsdb/integrations/handlers/bigquery_handler/tests/test_bigquery_handler.py +1 -1
- mindsdb/integrations/handlers/binance_handler/binance_handler.py +1 -0
- mindsdb/integrations/handlers/binance_handler/binance_tables.py +3 -4
- mindsdb/integrations/handlers/byom_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/chromadb_handler/requirements.txt +1 -0
- mindsdb/integrations/handlers/ckan_handler/ckan_handler.py +3 -0
- mindsdb/integrations/handlers/clickhouse_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/cloud_spanner_handler/tests/test_cloud_spanner_handler.py +0 -2
- mindsdb/integrations/handlers/cloud_sql_handler/cloud_sql_handler.py +0 -1
- mindsdb/integrations/handlers/cohere_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/cohere_handler/cohere_handler.py +11 -13
- mindsdb/integrations/handlers/confluence_handler/confluence_tables.py +6 -0
- mindsdb/integrations/handlers/databend_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/databend_handler/databend_handler.py +4 -4
- mindsdb/integrations/handlers/databend_handler/tests/__init__.py +0 -1
- mindsdb/integrations/handlers/databend_handler/tests/test_databend_handler.py +1 -1
- mindsdb/integrations/handlers/derby_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/derby_handler/derby_handler.py +14 -22
- mindsdb/integrations/handlers/derby_handler/tests/test_derby_handler.py +6 -6
- mindsdb/integrations/handlers/discord_handler/discord_handler.py +5 -5
- mindsdb/integrations/handlers/discord_handler/discord_tables.py +3 -3
- mindsdb/integrations/handlers/discord_handler/tests/test_discord.py +5 -3
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub.py +3 -3
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub_handler.py +2 -2
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub_tables.py +57 -54
- mindsdb/integrations/handlers/dremio_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/druid_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/druid_handler/druid_handler.py +2 -2
- mindsdb/integrations/handlers/edgelessdb_handler/tests/test_edgelessdb_handler.py +9 -9
- mindsdb/integrations/handlers/email_handler/email_client.py +1 -1
- mindsdb/integrations/handlers/email_handler/email_ingestor.py +1 -1
- mindsdb/integrations/handlers/email_handler/email_tables.py +0 -1
- mindsdb/integrations/handlers/email_handler/settings.py +0 -1
- mindsdb/integrations/handlers/eventstoredb_handler/eventstoredb_handler.py +2 -1
- mindsdb/integrations/handlers/firebird_handler/firebird_handler.py +1 -1
- mindsdb/integrations/handlers/flaml_handler/flaml_handler.py +9 -9
- mindsdb/integrations/handlers/frappe_handler/frappe_client.py +5 -5
- mindsdb/integrations/handlers/frappe_handler/frappe_handler.py +6 -5
- mindsdb/integrations/handlers/frappe_handler/frappe_tables.py +2 -2
- mindsdb/integrations/handlers/github_handler/connection_args.py +2 -2
- mindsdb/integrations/handlers/github_handler/github_handler.py +1 -8
- mindsdb/integrations/handlers/github_handler/github_tables.py +13 -24
- mindsdb/integrations/handlers/gitlab_handler/gitlab_handler.py +2 -1
- mindsdb/integrations/handlers/gitlab_handler/gitlab_tables.py +1 -4
- mindsdb/integrations/handlers/gmail_handler/gmail_handler.py +6 -13
- mindsdb/integrations/handlers/gmail_handler/requirements.txt +1 -0
- mindsdb/integrations/handlers/google_analytics_handler/requirements.txt +2 -1
- mindsdb/integrations/handlers/google_books_handler/google_books_handler.py +2 -1
- mindsdb/integrations/handlers/google_books_handler/google_books_tables.py +0 -3
- mindsdb/integrations/handlers/google_books_handler/requirements.txt +1 -1
- mindsdb/integrations/handlers/google_calendar_handler/google_calendar_handler.py +4 -4
- mindsdb/integrations/handlers/google_calendar_handler/google_calendar_tables.py +2 -6
- mindsdb/integrations/handlers/google_calendar_handler/requirements.txt +1 -0
- mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_handler.py +3 -2
- mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_tables.py +0 -3
- mindsdb/integrations/handlers/google_content_shopping_handler/requirements.txt +1 -1
- mindsdb/integrations/handlers/google_fit_handler/google_fit_handler.py +10 -12
- mindsdb/integrations/handlers/google_fit_handler/google_fit_tables.py +11 -13
- mindsdb/integrations/handlers/google_fit_handler/requirements.txt +2 -0
- mindsdb/integrations/handlers/google_search_handler/google_search_handler.py +2 -1
- mindsdb/integrations/handlers/google_search_handler/google_search_tables.py +0 -3
- mindsdb/integrations/handlers/google_search_handler/requirements.txt +1 -1
- mindsdb/integrations/handlers/groq_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/hackernews_handler/hn_handler.py +5 -7
- mindsdb/integrations/handlers/hackernews_handler/hn_table.py +6 -7
- mindsdb/integrations/handlers/hive_handler/tests/test_hive_handler.py +1 -1
- mindsdb/integrations/handlers/hsqldb_handler/connection_args.py +6 -6
- mindsdb/integrations/handlers/hsqldb_handler/hsqldb_handler.py +4 -3
- mindsdb/integrations/handlers/huggingface_api_handler/exceptions.py +1 -1
- mindsdb/integrations/handlers/huggingface_api_handler/huggingface_api_handler.py +1 -8
- mindsdb/integrations/handlers/huggingface_handler/huggingface_handler.py +6 -6
- mindsdb/integrations/handlers/huggingface_handler/requirements.txt +1 -1
- mindsdb/integrations/handlers/huggingface_handler/requirements_cpu.txt +1 -1
- mindsdb/integrations/handlers/ignite_handler/ignite_handler.py +2 -1
- mindsdb/integrations/handlers/impala_handler/impala_handler.py +9 -12
- mindsdb/integrations/handlers/impala_handler/tests/test_impala_handler.py +11 -11
- mindsdb/integrations/handlers/influxdb_handler/influxdb_handler.py +10 -13
- mindsdb/integrations/handlers/influxdb_handler/influxdb_tables.py +20 -20
- mindsdb/integrations/handlers/informix_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/informix_handler/__init__.py +12 -5
- mindsdb/integrations/handlers/informix_handler/informix_handler.py +99 -133
- mindsdb/integrations/handlers/informix_handler/tests/test_informix_handler.py +13 -11
- mindsdb/integrations/handlers/ingres_handler/__about__.py +0 -1
- mindsdb/integrations/handlers/ingres_handler/ingres_handler.py +1 -0
- mindsdb/integrations/handlers/jira_handler/jira_handler.archived.py +75 -0
- mindsdb/integrations/handlers/jira_handler/jira_handler.py +113 -38
- mindsdb/integrations/handlers/jira_handler/jira_tables.py +229 -0
- mindsdb/integrations/handlers/jira_handler/requirements.txt +1 -0
- mindsdb/integrations/handlers/kinetica_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/langchain_handler/langchain_handler.py +4 -4
- mindsdb/integrations/handlers/langchain_handler/tools.py +9 -10
- mindsdb/integrations/handlers/leonardoai_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/lightfm_handler/requirements.txt +1 -0
- mindsdb/integrations/handlers/lightwood_handler/functions.py +2 -2
- mindsdb/integrations/handlers/lightwood_handler/lightwood_handler.py +0 -3
- mindsdb/integrations/handlers/lightwood_handler/requirements.txt +4 -4
- mindsdb/integrations/handlers/lightwood_handler/tests/test_lightwood_handler.py +11 -11
- mindsdb/integrations/handlers/lindorm_handler/requirements.txt +1 -0
- mindsdb/integrations/handlers/llama_index_handler/llama_index_handler.py +4 -4
- mindsdb/integrations/handlers/llama_index_handler/settings.py +10 -9
- mindsdb/integrations/handlers/materialize_handler/tests/test_materialize_handler.py +8 -10
- mindsdb/integrations/handlers/matrixone_handler/matrixone_handler.py +4 -4
- mindsdb/integrations/handlers/matrixone_handler/tests/test_matrixone_handler.py +8 -9
- mindsdb/integrations/handlers/maxdb_handler/connection_args.py +25 -25
- mindsdb/integrations/handlers/maxdb_handler/maxdb_handler.py +1 -0
- mindsdb/integrations/handlers/mediawiki_handler/mediawiki_handler.py +3 -2
- mindsdb/integrations/handlers/mediawiki_handler/mediawiki_tables.py +1 -1
- mindsdb/integrations/handlers/mendeley_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/mendeley_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/mendeley_handler/mendeley_handler.py +48 -56
- mindsdb/integrations/handlers/mendeley_handler/mendeley_tables.py +24 -29
- mindsdb/integrations/handlers/mendeley_handler/tests/test_mendeley_handler.py +19 -17
- mindsdb/integrations/handlers/merlion_handler/merlion_handler.py +5 -4
- mindsdb/integrations/handlers/minds_endpoint_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/mlflow_handler/mlflow_handler.py +58 -36
- mindsdb/integrations/handlers/monetdb_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/monetdb_handler/__init__.py +15 -5
- mindsdb/integrations/handlers/monetdb_handler/connection_args.py +17 -18
- mindsdb/integrations/handlers/monetdb_handler/monetdb_handler.py +40 -57
- mindsdb/integrations/handlers/monetdb_handler/tests/test_monetdb_handler.py +7 -8
- mindsdb/integrations/handlers/monetdb_handler/utils/monet_get_id.py +13 -14
- mindsdb/integrations/handlers/monkeylearn_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/monkeylearn_handler.py +2 -5
- mindsdb/integrations/handlers/ms_one_drive_handler/ms_graph_api_one_drive_client.py +1 -0
- mindsdb/integrations/handlers/ms_one_drive_handler/ms_one_drive_handler.py +1 -1
- mindsdb/integrations/handlers/ms_one_drive_handler/requirements.txt +2 -0
- mindsdb/integrations/handlers/ms_teams_handler/ms_graph_api_teams_client.py +23 -23
- mindsdb/integrations/handlers/ms_teams_handler/ms_teams_handler.py +3 -3
- mindsdb/integrations/handlers/ms_teams_handler/ms_teams_tables.py +10 -5
- mindsdb/integrations/handlers/ms_teams_handler/requirements.txt +3 -1
- mindsdb/integrations/handlers/mssql_handler/mssql_handler.py +73 -8
- mindsdb/integrations/handlers/mysql_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/mysql_handler/__init__.py +15 -5
- mindsdb/integrations/handlers/mysql_handler/connection_args.py +43 -47
- mindsdb/integrations/handlers/mysql_handler/mysql_handler.py +101 -34
- mindsdb/integrations/handlers/mysql_handler/settings.py +15 -13
- mindsdb/integrations/handlers/neuralforecast_handler/neuralforecast_handler.py +1 -1
- mindsdb/integrations/handlers/newsapi_handler/newsapi_handler.py +1 -1
- mindsdb/integrations/handlers/newsapi_handler/tests/test_newsapi_handler.py +4 -4
- mindsdb/integrations/handlers/nuo_jdbc_handler/connection_args.py +2 -2
- mindsdb/integrations/handlers/nuo_jdbc_handler/nuo_jdbc_handler.py +28 -36
- mindsdb/integrations/handlers/nuo_jdbc_handler/tests/test_nuo_handler.py +5 -5
- mindsdb/integrations/handlers/oceanbase_handler/oceanbase_handler.py +0 -1
- mindsdb/integrations/handlers/oceanbase_handler/tests/test_oceanbase_handler.py +8 -10
- mindsdb/integrations/handlers/ollama_handler/ollama_handler.py +3 -3
- mindsdb/integrations/handlers/openai_handler/openai_handler.py +5 -4
- mindsdb/integrations/handlers/opengauss_handler/tests/test_opengauss_handler.py +1 -2
- mindsdb/integrations/handlers/openstreetmap_handler/__init__.py +7 -7
- mindsdb/integrations/handlers/oracle_handler/connection_args.py +6 -0
- mindsdb/integrations/handlers/oracle_handler/oracle_handler.py +77 -11
- mindsdb/integrations/handlers/orioledb_handler/tests/test_orioledb_handler.py +8 -10
- mindsdb/integrations/handlers/palm_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/palm_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/palm_handler/palm_handler.py +1 -3
- mindsdb/integrations/handlers/paypal_handler/paypal_handler.py +2 -2
- mindsdb/integrations/handlers/paypal_handler/paypal_tables.py +15 -14
- mindsdb/integrations/handlers/pgvector_handler/pgvector_handler.py +53 -10
- mindsdb/integrations/handlers/phoenix_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/phoenix_handler/phoenix_handler.py +1 -0
- mindsdb/integrations/handlers/pinot_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/pinot_handler/pinot_handler.py +3 -2
- mindsdb/integrations/handlers/plaid_handler/plaid_handler.py +13 -13
- mindsdb/integrations/handlers/plaid_handler/plaid_tables.py +10 -12
- mindsdb/integrations/handlers/plaid_handler/utils.py +4 -6
- mindsdb/integrations/handlers/planetscale_handler/planetscale_handler.py +1 -4
- mindsdb/integrations/handlers/portkey_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/postgres_handler/postgres_handler.py +105 -24
- mindsdb/integrations/handlers/postgres_handler/tests/test_postgres_handler.py +11 -6
- mindsdb/integrations/handlers/questdb_handler/questdb_handler.py +1 -2
- mindsdb/integrations/handlers/questdb_handler/tests/test_questdb_handler.py +2 -3
- mindsdb/integrations/handlers/quickbooks_handler/quickbooks_handler.py +6 -8
- mindsdb/integrations/handlers/quickbooks_handler/quickbooks_table.py +10 -10
- mindsdb/integrations/handlers/rag_handler/ingest.py +2 -2
- mindsdb/integrations/handlers/rag_handler/rag_handler.py +1 -1
- mindsdb/integrations/handlers/rag_handler/settings.py +1 -1
- mindsdb/integrations/handlers/reddit_handler/reddit_handler.py +2 -7
- mindsdb/integrations/handlers/reddit_handler/reddit_tables.py +2 -3
- mindsdb/integrations/handlers/replicate_handler/replicate_handler.py +6 -6
- mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_handler.py +1 -2
- mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_tables.py +0 -3
- mindsdb/integrations/handlers/rockset_handler/connection_args.py +14 -14
- mindsdb/integrations/handlers/rockset_handler/tests/test_rockset_handler.py +1 -0
- mindsdb/integrations/handlers/scylla_handler/scylla_handler.py +6 -5
- mindsdb/integrations/handlers/sendinblue_handler/sendinblue_handler.py +2 -1
- mindsdb/integrations/handlers/sendinblue_handler/sendinblue_tables.py +16 -16
- mindsdb/integrations/handlers/sentence_transformers_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/sheets_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/shopify_handler/shopify_handler.py +7 -6
- mindsdb/integrations/handlers/shopify_handler/shopify_tables.py +38 -41
- mindsdb/integrations/handlers/singlestore_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/singlestore_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/singlestore_handler/singlestore_handler.py +1 -0
- mindsdb/integrations/handlers/singlestore_handler/tests/test_singlestore_handler.py +3 -3
- mindsdb/integrations/handlers/slack_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/snowflake_handler/requirements.txt +1 -1
- mindsdb/integrations/handlers/snowflake_handler/snowflake_handler.py +100 -6
- mindsdb/integrations/handlers/solr_handler/connection_args.py +7 -7
- mindsdb/integrations/handlers/solr_handler/solr_handler.py +2 -1
- mindsdb/integrations/handlers/solr_handler/tests/test_solr_handler.py +2 -1
- mindsdb/integrations/handlers/sqlany_handler/sqlany_handler.py +3 -2
- mindsdb/integrations/handlers/sqlite_handler/sqlite_handler.py +1 -0
- mindsdb/integrations/handlers/sqreamdb_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/sqreamdb_handler/sqreamdb_handler.py +15 -20
- mindsdb/integrations/handlers/sqreamdb_handler/tests/test_sqreamdb_handler.py +4 -4
- mindsdb/integrations/handlers/stabilityai_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/starrocks_handler/starrocks_handler.py +0 -1
- mindsdb/integrations/handlers/starrocks_handler/tests/test_starrocks_handler.py +8 -10
- mindsdb/integrations/handlers/statsforecast_handler/statsforecast_handler.py +2 -2
- mindsdb/integrations/handlers/strava_handler/strava_handler.py +4 -8
- mindsdb/integrations/handlers/strava_handler/strava_tables.py +22 -30
- mindsdb/integrations/handlers/stripe_handler/stripe_handler.py +3 -2
- mindsdb/integrations/handlers/stripe_handler/stripe_tables.py +11 -27
- mindsdb/integrations/handlers/supabase_handler/tests/test_supabase_handler.py +1 -1
- mindsdb/integrations/handlers/surrealdb_handler/surrealdb_handler.py +4 -4
- mindsdb/integrations/handlers/tdengine_handler/tdengine_handler.py +25 -27
- mindsdb/integrations/handlers/tdengine_handler/tests/test_tdengine_handler.py +8 -8
- mindsdb/integrations/handlers/tidb_handler/tests/test_tidb_handler.py +1 -2
- mindsdb/integrations/handlers/timegpt_handler/timegpt_handler.py +5 -5
- mindsdb/integrations/handlers/tpot_handler/tpot_handler.py +21 -26
- mindsdb/integrations/handlers/trino_handler/trino_handler.py +14 -14
- mindsdb/integrations/handlers/twitter_handler/twitter_handler.py +2 -4
- mindsdb/integrations/handlers/unify_handler/tests/test_unify_handler.py +7 -8
- mindsdb/integrations/handlers/unify_handler/unify_handler.py +9 -9
- mindsdb/integrations/handlers/vertex_handler/requirements.txt +1 -0
- mindsdb/integrations/handlers/vertex_handler/vertex_client.py +1 -1
- mindsdb/integrations/handlers/vertica_handler/tests/test_vertica_handler.py +11 -11
- mindsdb/integrations/handlers/vertica_handler/vertica_handler.py +11 -14
- mindsdb/integrations/handlers/vitess_handler/tests/test_vitess_handler.py +9 -11
- mindsdb/integrations/handlers/vitess_handler/vitess_handler.py +0 -1
- mindsdb/integrations/handlers/web_handler/web_handler.py +1 -0
- mindsdb/integrations/handlers/whatsapp_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/writer_handler/evaluate.py +1 -1
- mindsdb/integrations/handlers/writer_handler/settings.py +0 -1
- mindsdb/integrations/handlers/writer_handler/writer_handler.py +1 -0
- mindsdb/integrations/handlers/youtube_handler/requirements.txt +1 -0
- mindsdb/integrations/handlers/youtube_handler/youtube_handler.py +5 -5
- mindsdb/integrations/handlers/youtube_handler/youtube_tables.py +26 -27
- mindsdb/integrations/handlers/yugabyte_handler/tests/test_yugabyte_handler.py +3 -3
- mindsdb/integrations/handlers/yugabyte_handler/yugabyte_handler.py +0 -6
- mindsdb/integrations/libs/response.py +67 -52
- mindsdb/integrations/libs/vectordatabase_handler.py +6 -0
- mindsdb/integrations/utilities/files/file_reader.py +5 -2
- mindsdb/integrations/utilities/handler_utils.py +15 -3
- mindsdb/integrations/utilities/handlers/api_utilities/__init__.py +0 -1
- mindsdb/integrations/utilities/handlers/auth_utilities/__init__.py +0 -2
- mindsdb/integrations/utilities/utils.py +3 -3
- mindsdb/interfaces/agents/agents_controller.py +164 -1
- mindsdb/interfaces/agents/constants.py +29 -2
- mindsdb/interfaces/agents/langchain_agent.py +18 -8
- mindsdb/interfaces/agents/mindsdb_database_agent.py +101 -2
- mindsdb/interfaces/database/projects.py +1 -7
- mindsdb/interfaces/functions/controller.py +11 -14
- mindsdb/interfaces/functions/to_markdown.py +9 -124
- mindsdb/interfaces/knowledge_base/controller.py +47 -19
- mindsdb/interfaces/knowledge_base/preprocessing/document_preprocessor.py +41 -15
- mindsdb/interfaces/knowledge_base/preprocessing/json_chunker.py +434 -0
- mindsdb/interfaces/knowledge_base/preprocessing/models.py +54 -0
- mindsdb/interfaces/knowledge_base/utils.py +10 -15
- mindsdb/interfaces/model/model_controller.py +0 -2
- mindsdb/interfaces/query_context/context_controller.py +66 -10
- mindsdb/interfaces/skills/custom/text2sql/mindsdb_kb_tools.py +190 -0
- mindsdb/interfaces/skills/custom/text2sql/mindsdb_sql_toolkit.py +92 -0
- mindsdb/interfaces/skills/skill_tool.py +202 -57
- mindsdb/interfaces/skills/sql_agent.py +238 -28
- mindsdb/interfaces/storage/fs.py +1 -0
- mindsdb/interfaces/variables/__init__.py +0 -0
- mindsdb/interfaces/variables/variables_controller.py +97 -0
- mindsdb/migrations/env.py +5 -7
- mindsdb/migrations/migrate.py +47 -9
- mindsdb/migrations/versions/2025-05-21_9f150e4f9a05_checkpoint_1.py +360 -0
- mindsdb/utilities/config.py +333 -220
- mindsdb/utilities/context.py +1 -1
- mindsdb/utilities/functions.py +0 -36
- mindsdb/utilities/langfuse.py +19 -10
- mindsdb/utilities/otel/__init__.py +9 -193
- mindsdb/utilities/otel/metric_handlers/__init__.py +5 -1
- mindsdb/utilities/otel/prepare.py +198 -0
- mindsdb/utilities/sql.py +83 -0
- mindsdb/utilities/starters.py +13 -0
- {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/METADATA +351 -338
- {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/RECORD +348 -322
- {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/WHEEL +1 -1
- mindsdb/api/mysql/mysql_proxy/classes/sql_statement_parser.py +0 -151
- mindsdb/integrations/handlers/monkeylearn_handler/requirements.txt +0 -1
- {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/licenses/LICENSE +0 -0
- {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/top_level.txt +0 -0
|
@@ -8,98 +8,92 @@ from mindsdb.utilities.render.sqlalchemy_render import SqlalchemyRender
|
|
|
8
8
|
from mindsdb.integrations.libs.response import (
|
|
9
9
|
HandlerStatusResponse as StatusResponse,
|
|
10
10
|
HandlerResponse as Response,
|
|
11
|
-
RESPONSE_TYPE
|
|
11
|
+
RESPONSE_TYPE,
|
|
12
12
|
)
|
|
13
13
|
from mindsdb.integrations.libs.const import HANDLER_CONNECTION_ARG_TYPE as ARG_TYPE
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
|
|
17
16
|
import pandas as pd
|
|
18
|
-
import IfxPyDbi as
|
|
19
|
-
from sqlalchemy_informix.ibmdb import
|
|
17
|
+
import IfxPyDbi as Ifx
|
|
18
|
+
from sqlalchemy_informix.ibmdb import InformixDialect
|
|
20
19
|
|
|
21
20
|
logger = log.getLogger(__name__)
|
|
22
21
|
|
|
23
|
-
class InformixHandler(DatabaseHandler):
|
|
24
22
|
|
|
23
|
+
class InformixHandler(DatabaseHandler):
|
|
25
24
|
|
|
26
|
-
name=
|
|
25
|
+
name = "informix"
|
|
27
26
|
|
|
28
27
|
def __init__(self, name: str, connection_data: Optional[dict], **kwargs):
|
|
29
|
-
|
|
28
|
+
"""Initialize the handler
|
|
30
29
|
Args:
|
|
31
30
|
name (str): name of particular handler instance
|
|
32
31
|
connection_data (dict): parameters for connecting to the database
|
|
33
32
|
**kwargs: arbitrary keyword arguments.
|
|
34
|
-
|
|
33
|
+
"""
|
|
35
34
|
super().__init__(name)
|
|
36
|
-
|
|
35
|
+
|
|
37
36
|
self.kwargs = kwargs
|
|
38
37
|
self.parser = parse_sql
|
|
39
|
-
self.loging_enabled =
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
self.
|
|
45
|
-
self.
|
|
46
|
-
self.
|
|
38
|
+
self.loging_enabled = (
|
|
39
|
+
connection_data["loging_enabled"]
|
|
40
|
+
if "loging_enabled" in connection_data
|
|
41
|
+
else True
|
|
42
|
+
)
|
|
43
|
+
self.server = connection_data["server"]
|
|
44
|
+
self.database = connection_data["database"]
|
|
45
|
+
self.user = connection_data["user"]
|
|
46
|
+
self.password = connection_data["password"]
|
|
47
|
+
self.schemaName = connection_data["schema_name"]
|
|
48
|
+
self.host = connection_data["host"]
|
|
49
|
+
self.port = connection_data["port"]
|
|
47
50
|
self.connString = (
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
'UID={4};'
|
|
53
|
-
'PWD={5};').format(self.server, self.database, self.host, self.port, self.user, self.password)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
51
|
+
"SERVER={0};" "DATABASE={1};" "HOST={2};" "PORT={3};" "UID={4};" "PWD={5};"
|
|
52
|
+
).format(
|
|
53
|
+
self.server, self.database, self.host, self.port, self.user, self.password
|
|
54
|
+
)
|
|
57
55
|
|
|
58
56
|
self.connection = None
|
|
59
57
|
self.is_connected = False
|
|
60
|
-
|
|
61
|
-
|
|
58
|
+
|
|
62
59
|
def connect(self):
|
|
63
|
-
|
|
60
|
+
"""Set up any connections required by the handler
|
|
64
61
|
Should return output of check_connection() method after attempting
|
|
65
62
|
connection. Should switch self.is_connected.
|
|
66
63
|
Returns:
|
|
67
64
|
Connection Object
|
|
68
|
-
|
|
65
|
+
"""
|
|
69
66
|
if self.is_connected is True:
|
|
70
67
|
return self.connection
|
|
71
68
|
|
|
72
69
|
try:
|
|
73
|
-
self.connection =
|
|
74
|
-
|
|
75
|
-
self.is_connected= True
|
|
76
|
-
except Exception as e:
|
|
77
|
-
logger.error(f'Error while connecting to {self.database}, {e}')
|
|
70
|
+
self.connection = Ifx.connect(self.connString, "", "")
|
|
78
71
|
|
|
72
|
+
self.is_connected = True
|
|
73
|
+
except Exception as e:
|
|
74
|
+
logger.error(f"Error while connecting to {self.database}, {e}")
|
|
79
75
|
|
|
80
76
|
return self.connection
|
|
81
77
|
|
|
82
|
-
|
|
83
78
|
def disconnect(self):
|
|
84
|
-
|
|
79
|
+
"""Close any existing connections
|
|
85
80
|
Should switch self.is_connected.
|
|
86
|
-
|
|
81
|
+
"""
|
|
87
82
|
if self.is_connected is False:
|
|
88
83
|
return
|
|
89
84
|
try:
|
|
90
85
|
self.connection.close()
|
|
91
86
|
self.is_connected = False
|
|
92
87
|
except Exception as e:
|
|
93
|
-
logger.error(f
|
|
94
|
-
|
|
95
|
-
return
|
|
88
|
+
logger.error(f"Error while disconnecting to {self.database}, {e}")
|
|
96
89
|
|
|
90
|
+
return
|
|
97
91
|
|
|
98
92
|
def check_connection(self) -> StatusResponse:
|
|
99
|
-
|
|
93
|
+
"""Check connection to the handler
|
|
100
94
|
Returns:
|
|
101
95
|
HandlerStatusResponse
|
|
102
|
-
|
|
96
|
+
"""
|
|
103
97
|
responseCode = StatusResponse(False)
|
|
104
98
|
need_to_close = self.is_connected is False
|
|
105
99
|
|
|
@@ -107,7 +101,7 @@ class InformixHandler(DatabaseHandler):
|
|
|
107
101
|
self.connect()
|
|
108
102
|
responseCode.success = True
|
|
109
103
|
except Exception as e:
|
|
110
|
-
logger.error(f
|
|
104
|
+
logger.error(f"Error connecting to database {self.database}, {e}!")
|
|
111
105
|
responseCode.error_message = str(e)
|
|
112
106
|
finally:
|
|
113
107
|
if responseCode.success is True and need_to_close:
|
|
@@ -117,107 +111,93 @@ class InformixHandler(DatabaseHandler):
|
|
|
117
111
|
|
|
118
112
|
return responseCode
|
|
119
113
|
|
|
120
|
-
|
|
121
114
|
def native_query(self, query: str) -> StatusResponse:
|
|
122
|
-
|
|
115
|
+
"""Receive raw query and act upon it somehow.
|
|
123
116
|
Args:
|
|
124
117
|
query (Any): query in native format (str for sql databases,
|
|
125
118
|
dict for mongo, etc)
|
|
126
119
|
Returns:
|
|
127
120
|
HandlerResponse
|
|
128
|
-
|
|
121
|
+
"""
|
|
129
122
|
need_to_close = self.is_connected is False
|
|
130
123
|
conn = self.connect()
|
|
131
124
|
cur = conn.cursor()
|
|
132
125
|
try:
|
|
133
126
|
cur.execute(query)
|
|
134
|
-
|
|
135
|
-
if cur._result_set_produced
|
|
136
|
-
result = cur.fetchall()
|
|
127
|
+
|
|
128
|
+
if cur._result_set_produced:
|
|
129
|
+
result = cur.fetchall()
|
|
137
130
|
response = Response(
|
|
138
131
|
RESPONSE_TYPE.TABLE,
|
|
139
132
|
data_frame=pd.DataFrame(
|
|
140
|
-
result,
|
|
141
|
-
|
|
142
|
-
)
|
|
133
|
+
result, columns=[x[0] for x in cur.description]
|
|
134
|
+
),
|
|
143
135
|
)
|
|
144
136
|
else:
|
|
145
137
|
response = Response(RESPONSE_TYPE.OK)
|
|
146
138
|
if self.loging_enabled:
|
|
147
139
|
self.connection.commit()
|
|
148
140
|
except Exception as e:
|
|
149
|
-
logger.error(f
|
|
150
|
-
response = Response(
|
|
151
|
-
RESPONSE_TYPE.ERROR,
|
|
152
|
-
error_message=str(e)
|
|
153
|
-
)
|
|
141
|
+
logger.error(f"Error running query: {query} on {self.database}")
|
|
142
|
+
response = Response(RESPONSE_TYPE.ERROR, error_message=str(e))
|
|
154
143
|
if self.loging_enabled:
|
|
155
144
|
self.connection.rollback()
|
|
156
145
|
|
|
157
146
|
cur.close()
|
|
158
147
|
|
|
159
|
-
|
|
160
148
|
if need_to_close is True:
|
|
161
149
|
self.disconnect()
|
|
162
150
|
|
|
163
151
|
return response
|
|
164
152
|
|
|
165
|
-
|
|
166
153
|
def query(self, query: ASTNode) -> StatusResponse:
|
|
167
|
-
|
|
154
|
+
"""Receive query as AST (abstract syntax tree) and act upon it somehow.
|
|
168
155
|
Args:
|
|
169
156
|
query (ASTNode): sql query represented as AST. May be any kind
|
|
170
157
|
of query: SELECT, INTSERT, DELETE, etc
|
|
171
158
|
Returns:
|
|
172
159
|
HandlerResponse
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
160
|
+
"""
|
|
176
161
|
|
|
177
162
|
renderer = SqlalchemyRender(InformixDialect)
|
|
178
163
|
query_str = renderer.get_string(query, with_failback=True)
|
|
179
164
|
return self.native_query(query_str)
|
|
180
165
|
|
|
181
|
-
|
|
182
166
|
def get_tables(self) -> StatusResponse:
|
|
183
|
-
|
|
167
|
+
"""Return list of entities
|
|
184
168
|
Return list of entities that will be accesible as tables.
|
|
185
169
|
Returns:
|
|
186
170
|
HandlerResponse: shoud have same columns as information_schema.tables
|
|
187
171
|
(https://dev.mysql.com/doc/refman/8.0/en/information-schema-tables-table.html)
|
|
188
172
|
Column 'TABLE_NAME' is mandatory, other is optional.
|
|
189
|
-
|
|
173
|
+
"""
|
|
190
174
|
self.connect()
|
|
191
175
|
|
|
192
|
-
|
|
193
|
-
result=self.connection.tables()
|
|
176
|
+
result = self.connection.tables()
|
|
194
177
|
try:
|
|
195
178
|
if result:
|
|
196
179
|
response = Response(
|
|
197
180
|
RESPONSE_TYPE.TABLE,
|
|
198
181
|
data_frame=pd.DataFrame(
|
|
199
|
-
[
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
182
|
+
[
|
|
183
|
+
x["TABLE_NAME"]
|
|
184
|
+
for x in result
|
|
185
|
+
if x["TABLE_SCHEM"] == self.schemaName
|
|
186
|
+
],
|
|
187
|
+
columns=["TABLE_NAME"],
|
|
188
|
+
),
|
|
203
189
|
)
|
|
204
190
|
else:
|
|
205
191
|
response = Response(RESPONSE_TYPE.OK)
|
|
206
|
-
|
|
207
|
-
except Exception as e:
|
|
208
|
-
logger.error(f'Error running while getting table {e} on ')
|
|
209
|
-
response = Response(
|
|
210
|
-
RESPONSE_TYPE.ERROR,
|
|
211
|
-
error_message=str(e)
|
|
212
|
-
)
|
|
213
|
-
|
|
214
192
|
|
|
193
|
+
except Exception as e:
|
|
194
|
+
logger.error(f"Error running while getting table {e} on ")
|
|
195
|
+
response = Response(RESPONSE_TYPE.ERROR, error_message=str(e))
|
|
215
196
|
|
|
216
197
|
return response
|
|
217
198
|
|
|
218
|
-
|
|
219
199
|
def get_columns(self, table_name: str) -> StatusResponse:
|
|
220
|
-
|
|
200
|
+
"""Returns a list of entity columns
|
|
221
201
|
Args:
|
|
222
202
|
table_name (str): name of one of tables returned by self.get_tables()
|
|
223
203
|
Returns:
|
|
@@ -226,93 +206,79 @@ class InformixHandler(DatabaseHandler):
|
|
|
226
206
|
Column 'COLUMN_NAME' is mandatory, other is optional. Hightly
|
|
227
207
|
recomended to define also 'DATA_TYPE': it should be one of
|
|
228
208
|
python data types (by default it str).
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
self.connect()
|
|
209
|
+
"""
|
|
232
210
|
|
|
211
|
+
self.connect()
|
|
233
212
|
|
|
234
|
-
result=self.connection.columns(table_name=table_name)
|
|
213
|
+
result = self.connection.columns(table_name=table_name)
|
|
235
214
|
try:
|
|
236
215
|
if result:
|
|
237
216
|
response = Response(
|
|
238
217
|
RESPONSE_TYPE.TABLE,
|
|
239
218
|
data_frame=pd.DataFrame(
|
|
240
|
-
[result[i][
|
|
241
|
-
columns=[
|
|
242
|
-
|
|
243
|
-
)
|
|
219
|
+
[result[i]["COLUMN_NAME"] for i in range(len(result))],
|
|
220
|
+
columns=["COLUMN_NAME"],
|
|
221
|
+
),
|
|
244
222
|
)
|
|
245
223
|
else:
|
|
246
224
|
response = Response(RESPONSE_TYPE.OK)
|
|
247
|
-
|
|
248
|
-
except Exception as e:
|
|
249
|
-
logger.error(f'Error running while getting table {e} on ')
|
|
250
|
-
response = Response(
|
|
251
|
-
RESPONSE_TYPE.ERROR,
|
|
252
|
-
error_message=str(e)
|
|
253
|
-
)
|
|
254
|
-
|
|
255
225
|
|
|
226
|
+
except Exception as e:
|
|
227
|
+
logger.error(f"Error running while getting table {e} on ")
|
|
228
|
+
response = Response(RESPONSE_TYPE.ERROR, error_message=str(e))
|
|
256
229
|
|
|
257
230
|
return response
|
|
258
231
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
232
|
|
|
265
233
|
connection_args = OrderedDict(
|
|
266
234
|
server={
|
|
267
|
-
|
|
268
|
-
|
|
235
|
+
"type": ARG_TYPE.STR,
|
|
236
|
+
"description": """
|
|
269
237
|
The server name you want to get connected.
|
|
270
|
-
|
|
238
|
+
""",
|
|
271
239
|
},
|
|
272
240
|
database={
|
|
273
|
-
|
|
274
|
-
|
|
241
|
+
"type": ARG_TYPE.STR,
|
|
242
|
+
"description": """
|
|
275
243
|
The database name to use when connecting with the DB2 server.
|
|
276
|
-
|
|
244
|
+
""",
|
|
277
245
|
},
|
|
278
246
|
user={
|
|
279
|
-
|
|
280
|
-
|
|
247
|
+
"type": ARG_TYPE.STR,
|
|
248
|
+
"description": "The user name used to authenticate with the DB2 server.",
|
|
281
249
|
},
|
|
282
250
|
password={
|
|
283
|
-
|
|
284
|
-
|
|
251
|
+
"type": ARG_TYPE.STR,
|
|
252
|
+
"description": "The password to authenticate the user with the DB2 server.",
|
|
285
253
|
},
|
|
286
254
|
host={
|
|
287
|
-
|
|
288
|
-
|
|
255
|
+
"type": ARG_TYPE.STR,
|
|
256
|
+
"description": "The host name or IP address of the DB2 server/database.",
|
|
289
257
|
},
|
|
290
258
|
port={
|
|
291
|
-
|
|
292
|
-
|
|
259
|
+
"type": ARG_TYPE.INT,
|
|
260
|
+
"description": "Specify port to connect DB2 through TCP/IP",
|
|
293
261
|
},
|
|
294
262
|
schema_name={
|
|
295
|
-
|
|
296
|
-
|
|
263
|
+
"type": ARG_TYPE.STR,
|
|
264
|
+
"description": "Specify the schema name for showing tables ",
|
|
297
265
|
},
|
|
298
266
|
logging_enabled={
|
|
299
|
-
|
|
300
|
-
|
|
267
|
+
"type": ARG_TYPE.BOOL,
|
|
268
|
+
"description": """
|
|
301
269
|
Used for COMMIT and ROLLBACK as this command works only for logging enabled database.
|
|
302
270
|
Note: Its optional.
|
|
303
271
|
Default is TRUE
|
|
304
|
-
|
|
305
|
-
}
|
|
306
|
-
|
|
272
|
+
""",
|
|
273
|
+
},
|
|
307
274
|
)
|
|
308
275
|
|
|
309
276
|
connection_args_example = OrderedDict(
|
|
310
|
-
server=
|
|
311
|
-
database=
|
|
312
|
-
user=
|
|
313
|
-
password=
|
|
314
|
-
host=
|
|
315
|
-
port=
|
|
316
|
-
schema_name=
|
|
317
|
-
|
|
277
|
+
server="server",
|
|
278
|
+
database="stores_demo",
|
|
279
|
+
user="informix",
|
|
280
|
+
password="in4mix",
|
|
281
|
+
host="127.0.0.1",
|
|
282
|
+
port="9091",
|
|
283
|
+
schema_name="Love",
|
|
318
284
|
)
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import unittest
|
|
2
|
-
from mindsdb.integrations.handlers.informix_handler.informix_handler import
|
|
2
|
+
from mindsdb.integrations.handlers.informix_handler.informix_handler import (
|
|
3
|
+
InformixHandler,
|
|
4
|
+
)
|
|
3
5
|
from mindsdb.api.executor.data_types.response_type import RESPONSE_TYPE
|
|
4
6
|
|
|
5
7
|
|
|
@@ -15,30 +17,30 @@ class InformixHandlerTest(unittest.TestCase):
|
|
|
15
17
|
"password": "in4mix",
|
|
16
18
|
"database": "demo",
|
|
17
19
|
"schema_name": "love",
|
|
18
|
-
"loging_enabled": False
|
|
20
|
+
"loging_enabled": False,
|
|
19
21
|
}
|
|
20
22
|
}
|
|
21
|
-
cls.handler = InformixHandler(
|
|
23
|
+
cls.handler = InformixHandler("test_informix_handler", cls.kwargs)
|
|
22
24
|
|
|
23
25
|
def test_0_connect(self):
|
|
24
26
|
self.handler.connect()
|
|
25
27
|
|
|
26
28
|
def test_1_drop_table(self):
|
|
27
29
|
res = self.handler.query("DROP TABLE IF EXISTS LOVE;")
|
|
28
|
-
assert res.type is
|
|
30
|
+
assert res.type is not RESPONSE_TYPE.ERROR
|
|
29
31
|
|
|
30
32
|
def test_2_create_table(self):
|
|
31
33
|
res = self.handler.query("CREATE TABLE IF NOT EXISTS LOVE (LOVER varchar(20));")
|
|
32
|
-
assert res.type is not
|
|
33
|
-
|
|
34
|
+
assert res.type is not RESPONSE_TYPE.ERROR
|
|
35
|
+
|
|
34
36
|
def test_3_insert(self):
|
|
35
37
|
res = self.handler.query("INSERT INTO LOVE VALUES('Hari');")
|
|
36
38
|
assert res.type is not RESPONSE_TYPE.ERROR
|
|
37
|
-
|
|
39
|
+
|
|
38
40
|
def test_4_get_tables(self):
|
|
39
41
|
tables = self.handler.get_tables()
|
|
40
42
|
assert tables.type is RESPONSE_TYPE.TABLE
|
|
41
|
-
|
|
43
|
+
|
|
42
44
|
def test_5_select_query(self):
|
|
43
45
|
query = "SELECT * FROM LOVE;"
|
|
44
46
|
result = self.handler.native_query(query)
|
|
@@ -47,6 +49,6 @@ class InformixHandlerTest(unittest.TestCase):
|
|
|
47
49
|
def test_5_check_connection(self):
|
|
48
50
|
self.handler.check_connection()
|
|
49
51
|
|
|
50
|
-
|
|
51
|
-
if __name__ ==
|
|
52
|
-
unittest.main()
|
|
52
|
+
|
|
53
|
+
if __name__ == "__main__":
|
|
54
|
+
unittest.main()
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
from mindsdb.integrations.libs.api_handler import APIHandler
|
|
2
|
+
from mindsdb.integrations.libs.response import (
|
|
3
|
+
HandlerStatusResponse as StatusResponse,
|
|
4
|
+
)
|
|
5
|
+
from mindsdb.utilities import log
|
|
6
|
+
from mindsdb.integrations.libs.api_handler_generator import APIResourceGenerator
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
logger = log.getLogger(__name__)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class JiraHandler(APIHandler):
|
|
13
|
+
|
|
14
|
+
def __init__(self, name=None, **kwargs):
|
|
15
|
+
"""
|
|
16
|
+
Initialize the handler.
|
|
17
|
+
Args:
|
|
18
|
+
name (str): name of particular handler instance
|
|
19
|
+
connection_data (dict): parameters for connecting to the database
|
|
20
|
+
**kwargs: arbitrary keyword arguments.
|
|
21
|
+
"""
|
|
22
|
+
super().__init__(name)
|
|
23
|
+
self.connection_data = kwargs.get("connection_data", {})
|
|
24
|
+
|
|
25
|
+
self.connection = None
|
|
26
|
+
self.is_connected = False
|
|
27
|
+
|
|
28
|
+
# todo store parsed data in files
|
|
29
|
+
|
|
30
|
+
self.api_resource_generator = APIResourceGenerator(
|
|
31
|
+
"https://developer.atlassian.com/cloud/jira/platform/swagger-v3.v3.json",
|
|
32
|
+
self.connection_data,
|
|
33
|
+
url_base='/rest/api/3/',
|
|
34
|
+
options={
|
|
35
|
+
'offset_param': ['startAt', 'offset'],
|
|
36
|
+
'total_column': ['totalEntryCount', 'total'],
|
|
37
|
+
'check_connection_table': 'myself'
|
|
38
|
+
}
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
resource_tables = self.api_resource_generator.generate_api_resources(self)
|
|
42
|
+
|
|
43
|
+
for table_name, resource in resource_tables.items():
|
|
44
|
+
self._register_table(table_name, resource)
|
|
45
|
+
|
|
46
|
+
def __del__(self):
|
|
47
|
+
if self.is_connected is True:
|
|
48
|
+
self.disconnect()
|
|
49
|
+
|
|
50
|
+
def connect(self):
|
|
51
|
+
"""
|
|
52
|
+
Set up the connection required by the handler.
|
|
53
|
+
Returns:
|
|
54
|
+
HandlerStatusResponse
|
|
55
|
+
"""
|
|
56
|
+
return
|
|
57
|
+
|
|
58
|
+
def check_connection(self) -> StatusResponse:
|
|
59
|
+
"""
|
|
60
|
+
Check connection to the handler.
|
|
61
|
+
Returns:
|
|
62
|
+
HandlerStatusResponse
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
response = StatusResponse(False)
|
|
66
|
+
|
|
67
|
+
try:
|
|
68
|
+
self.api_resource_generator.check_connection()
|
|
69
|
+
response.success = True
|
|
70
|
+
except Exception as e:
|
|
71
|
+
logger.error(f"Error connecting to Jira API: {e}!")
|
|
72
|
+
response.error_message = e
|
|
73
|
+
|
|
74
|
+
self.is_connected = response.success
|
|
75
|
+
return response
|