import { invoke } from "@tauri-apps/api/core"; import { listen, type UnlistenFn } from "@tauri-apps/api/event"; import type { ConnectionConfig, DatabaseInfo, LinkedServerInfo, TableInfo, ObjectInfo, ObjectStatistics, ObjectSource, ObjectSourceKind, ColumnInfo, IndexInfo, ForeignKeyInfo, TriggerInfo, FunctionInfo, SequenceInfo, RuleInfo, OwnerInfo, QueryResult, SqlReferenceAnalysis, DatabaseType, InstalledPlugin, JdbcDriverInfo, JdbcMavenBundleInfo, JdbcPluginStatus, SavedSqlFile, SavedSqlFolder, SavedSqlLibrary, } from "@/types/database"; import type { SidebarObjectKind } from "@/lib/databaseObjectCapabilities"; import type { AiConfig, AiTestConnectionResult } from "@/stores/settingsStore"; import type { QueryEditability } from "@/lib/sqlAnalysis"; import type { DataGridColumnValueFilterConditionOptions, DataGridContextFilterConditionOptions, DataGridCountSqlOptions, DataGridCopyInsertStatementOptions, DataGridCopyUpdateStatementOptions, DataGridSaveStatementOptions, HiveTablePropertiesSqlOptions } from "@/lib/dataGridSql"; import type { DataCompareFromTablesOptions, DataCompareFromTablesPreparation, DataCompareSyncPlan, DataCompareSyncPlanOptions, DataComparePreparation, DataComparePreparationOptions } from "@/lib/dataCompare"; import type { SchemaDiffPreparation, SchemaDiffPreparationOptions, TableDiff, FunctionDiff, SequenceDiff, RuleDiff, OwnerDiff } from "@/lib/schemaDiff"; import type { BuildTableStructureChangeSqlOptions, BuildSingleColumnAlterSqlOptions, TableStructureChangeSql } from "@/lib/tableStructureEditorSql"; import type { BuildTableSelectSqlOptions } from "@/lib/tableSelectSql"; import type { DatabaseSearchSql, DatabaseSearchSqlOptions, SearchResultWhereOptions } from "@/lib/databaseSearch"; import type { BuildEditableObjectSourceSqlInput, BuildRoutineRenameObjectSourceInput } from "@/lib/objectSourceEditor"; import type { BuildViewDdlInput } from "@/lib/viewDdl"; import type { BuildRenameObjectSqlOptions } from "@/lib/objectRenameSql"; import type { CreateDatabaseSqlOptions } from "@/lib/createDatabaseSql"; import type { DatabaseNameSqlOptions, DropTableChildObjectSqlOptions, DropObjectSqlOptions, DuplicateTableStructureSqlOptions, SchemaNameSqlOptions, TableAdminSqlOptions } from "@/lib/dbAdminSql"; import type { BuildDatabaseSqlExportOptions, BuildExportInsertStatementsOptions } from "@/lib/databaseExport"; export interface AgentDriverInfo { db_type: string; label: string; version: string; size: number; installed: boolean; installed_version: string | null; update_available: boolean; jre: string; jre_installed: boolean; } export interface AgentDriverUpdateIssue { db_type: string; error: string; } export interface UpgradeAllAgentDriversResult { upgraded: number; failed: AgentDriverUpdateIssue[]; } export interface AgentUpdateBlocker { db_type: string; label: string; } export type JavaRuntimeMode = "managed" | "system" | "custom"; export interface JavaRuntimeConfig { mode: JavaRuntimeMode; custom_java_path: string | null; } export interface DriverStoreUsageItem { id: string; bytes: number; } export interface DriverStoreUsage { total_bytes: number; jre_bytes: number; agent_driver_bytes: number; download_cache_bytes?: number; jdbc_plugin_bytes: number; jdbc_driver_bytes: number; jres: DriverStoreUsageItem[]; agent_drivers: DriverStoreUsageItem[]; } export type DriverRuntimeHealth = "healthy" | "warning" | "error"; export type DriverRuntimeStatus = "running" | "stopped" | "error" | "unknown"; export interface DriverRuntimeInfo { id: string; driver_key: string; label: string; kind: string; source: string; status: DriverRuntimeStatus; pid: number | null; memory_bytes: number | null; cpu_percent: number | null; uptime_seconds: number | null; version: string | null; last_error: string | null; can_stop: boolean; can_restart: boolean; control_unavailable_reason: string | null; } export interface DriverRuntimeSummary { running_count: number; total_memory_bytes: number; last_error: string | null; health: DriverRuntimeHealth; runtimes: DriverRuntimeInfo[]; } export interface DesktopSettings { show_tray_icon: boolean; icon_theme: "default" | "black"; quit_on_close: boolean; close_action_prompted: boolean; debug_logging_enabled: boolean; saved_sql_sync_dir?: string | null; driver_store_dir?: string | null; plugin_store_dir?: string | null; agent_store_dir?: string | null; sidebar_table_page_size?: number | null; } export interface SavedSqlSyncEntry { folderName?: string; fileName: string; sql: string; } export interface SavedSqlSyncRequest { targetDir: string; entries: SavedSqlSyncEntry[]; } export interface WebDavConfig { endpoint: string; username?: string; password?: string; remotePath?: string; } export interface WebDavSyncSummary { remotePath: string; bytes: number; exportedAt?: string; appVersion?: string; } export interface WebDavDownloadResult { summary: WebDavSyncSummary; editorSettings?: unknown; desktopSettings: DesktopSettings; applySummary: { encryptedSecretsPresent: boolean; secretsApplied: boolean; }; } export interface WebDavPasswordStatus { hasSavedPassword: boolean; } export interface QueryPagination { limit: number; offset: number; sessionId?: string; } export interface QueryPaginationExecutionPlanOptions { sql: string; queryBaseSql: string; databaseType?: DatabaseType; pagination: QueryPagination; useAgentCursor: boolean; } export interface QueryPaginationExecutionPlan { sqlToExecute: string; pageSql?: string; pageLimit?: number; pageOffset?: number; countSql?: string; useAgentResultSession: boolean; } export type QuerySortDirection = "asc" | "desc"; export interface SortedQuerySqlOptions { originalSql: string; databaseType?: DatabaseType; resultColumns: string[]; columnIndex: number; column: string; direction: QuerySortDirection; } export interface QuerySqlBuildResult { ok: boolean; sql?: string; reason?: "empty" | "multi" | "not_select" | "unsupported" | "with"; } export interface BuildExplainSqlOptions { databaseType?: DatabaseType; sql: string; } export interface ExplainSqlBuildResult { ok: boolean; sql?: string; reason?: "unsupported" | "empty" | "unsafe"; } export interface DroppedFilePreviewSqlOptions { path: string; limit?: number; } export type XlsxCellValue = string | number | boolean | null; export interface DriverInstallProgress { step: string; downloaded?: number; total?: number; db_type?: string; current?: number; total_drivers?: number; } export interface AiMessage { role: "user" | "assistant" | "system"; content: string; } export interface AiCompletionRequest { config: AiConfig; systemPrompt: string; messages: AiMessage[]; maxTokens?: number; temperature?: number; } export interface AiModelInfo { id: string; displayName?: string; } export async function aiComplete(request: AiCompletionRequest): Promise { return invoke("ai_complete", { request }); } export interface AiStreamChunk { session_id: string; delta: string; reasoning_delta?: string; done: boolean; } export async function aiStream(sessionId: string, request: AiCompletionRequest, onChunk: (chunk: AiStreamChunk) => void): Promise { const unlisten: UnlistenFn = await listen("ai-stream-chunk", (event) => { if (event.payload.session_id === sessionId) { onChunk(event.payload); if (event.payload.done) unlisten(); } }); try { await invoke("ai_stream", { sessionId, request }); } catch (e) { unlisten(); throw e; } } export type AgentEvent = | { type: "turn_start"; turn: number } | { type: "text_delta"; delta: string } | { type: "reasoning_delta"; delta: string } | { type: "tool_call_start"; tool_call_id: string; tool_name: string; args: Record } | { type: "tool_call_end"; tool_call_id: string; tool_name: string; result: unknown; is_error: boolean } | { type: "turn_end"; turn: number } | { type: "agent_end"; input_tokens?: number; output_tokens?: number } | { type: "context_compacted"; summary: string; summary_tokens: number; compacted_messages: number; estimated_before: number; estimated_after: number } | { type: "error"; message: string }; export async function aiAgentStream(sessionId: string, request: AiCompletionRequest, connectionId: string, database: string, dbType: string, onEvent: (event: AgentEvent) => void, mode?: string, _signal?: AbortSignal): Promise { const unlisten: UnlistenFn = await listen("ai-agent-event", (event) => { onEvent(event.payload); if (event.payload.type === "agent_end" || event.payload.type === "error") { unlisten(); } }); try { return await invoke("ai_agent_stream", { sessionId, request, connectionId, database, dbType, mode }); } catch (e) { unlisten(); throw e; } } export async function saveAiConfig(config: AiConfig): Promise { return invoke("save_ai_config", { config }); } export async function aiTestConnection(config: AiConfig): Promise { return invoke("ai_test_connection", { config }); } export async function aiListModels(config: AiConfig): Promise { return invoke("ai_list_models", { config }); } export async function aiCancelStream(sessionId: string): Promise { return invoke("ai_cancel_stream", { sessionId }); } export async function loadAiConfig(): Promise { return invoke("load_ai_config"); } export async function loadDesktopSettings(): Promise { return invoke("load_desktop_settings"); } export async function saveDesktopSettings(settings: DesktopSettings): Promise { return invoke("save_desktop_settings", { settings }); } export interface DriverStoreMigrationResult { driver_store_dir: string | null; plugin_store_dir: string | null; agent_store_dir: string | null; plugins_dir: string; agents_dir: string; migrated_plugins: boolean; migrated_agents: boolean; } export async function setDriverStoreDir(newDir: string | null): Promise { return invoke("set_driver_store_dir", { newDir }); } export async function setPluginStoreDir(newDir: string | null): Promise { return invoke("set_plugin_store_dir", { newDir }); } export async function setAgentStoreDir(newDir: string | null): Promise { return invoke("set_agent_store_dir", { newDir }); } export interface DriverStorePathInfo { driver_store_dir: string | null; plugin_store_dir: string | null; agent_store_dir: string | null; plugins_dir: string; agents_dir: string; } export async function getDriverStorePath(): Promise { return invoke("get_driver_store_path"); } export async function webdavSyncTest(config: WebDavConfig): Promise { return invoke("webdav_sync_test", { config }); } export async function webdavPasswordStatus(config: WebDavConfig): Promise { return invoke("webdav_password_status", { config }); } export async function saveWebdavSavedPassword(config: WebDavConfig, password: string): Promise { return invoke("save_webdav_saved_password", { config, password }); } export async function forgetWebdavSavedPassword(config: WebDavConfig): Promise { return invoke("forget_webdav_saved_password", { config }); } export async function webdavSyncUpload(config: WebDavConfig, editorSettings?: unknown, secretsPassphrase?: string): Promise { return invoke("webdav_sync_upload", { config, editorSettings, secretsPassphrase }); } export async function webdavSyncDownload(config: WebDavConfig, secretsPassphrase?: string): Promise { return invoke("webdav_sync_download", { config, secretsPassphrase }); } export async function loadPinnedTreeNodeIds(): Promise { return invoke("load_pinned_tree_node_ids"); } export async function savePinnedTreeNodeIds(ids: string[]): Promise { return invoke("save_pinned_tree_node_ids", { ids }); } export async function listSystemFonts(): Promise { return invoke("list_system_fonts"); } export async function pendingOpenSqlFiles(): Promise { return invoke("pending_open_sql_files"); } export async function pendingOpenDbFiles(): Promise { return invoke("pending_open_db_files"); } export async function pendingOpenConnectionLinks(): Promise { return invoke("pending_open_connection_links"); } export async function readExternalSqlFile(path: string): Promise { return invoke("read_external_sql_file", { path }); } // --- AI Conversations --- export interface AiChatMessage { role: string; content: string; reasoning?: string; kind?: "contextSummary"; } export interface AiConversation { id: string; title: string; connectionName: string; database: string; messages: AiChatMessage[]; createdAt: string; updatedAt: string; } export async function saveAiConversation(conversation: AiConversation): Promise { return invoke("save_ai_conversation", { conversation }); } export async function loadAiConversations(): Promise { return invoke("load_ai_conversations"); } export async function deleteAiConversation(id: string): Promise { return invoke("delete_ai_conversation", { id }); } export async function testConnection(config: ConnectionConfig): Promise { return invoke("test_connection", { config }); } export async function connectDb(config: ConnectionConfig): Promise { return invoke("connect_db", { config }); } export async function connectionFinalProxyPort(config: ConnectionConfig): Promise { return invoke("connection_final_proxy_port", { config }); } export async function disconnectDb(connectionId: string): Promise { return invoke("disconnect_db", { connectionId }); } export async function checkConnectionHealth(connectionId: string): Promise { return invoke("check_connection_health", { connectionId }); } export async function closeDatabaseConnection(connectionId: string, database: string): Promise { return invoke("close_database_connection", { connectionId, database }); } export async function listDatabases(connectionId: string): Promise { return invoke("list_databases", { connectionId }); } export async function listSqlServerLinkedServers(connectionId: string): Promise { return invoke("list_sqlserver_linked_servers", { connectionId }); } export async function listSqlServerLinkedServerCatalogs(connectionId: string, server: string): Promise { return invoke("list_sqlserver_linked_server_catalogs", { connectionId, server }); } export async function listSqlServerLinkedServerSchemas(connectionId: string, server: string, catalog: string): Promise { return invoke("list_sqlserver_linked_server_schemas", { connectionId, server, catalog }); } export async function listSqlServerLinkedServerTables(connectionId: string, server: string, catalog: string, schema: string, filter?: string, limit?: number, offset?: number): Promise { return invoke("list_sqlserver_linked_server_tables", { connectionId, server, catalog, schema, filter, limit, offset }); } export async function saveSchemaCache(cacheKey: string, payload: unknown): Promise { return invoke("save_schema_cache", { cacheKey, payload }); } export async function loadSchemaCache(cacheKey: string): Promise { return invoke("load_schema_cache", { cacheKey }); } export async function deleteSchemaCachePrefix(prefix: string): Promise { return invoke("delete_schema_cache_prefix", { prefix }); } export async function listTables(connectionId: string, database: string, schema: string, filter?: string, limit?: number, offset?: number, objectTypes?: SidebarObjectKind[]): Promise { return invoke("list_tables", { connectionId, database, schema, filter, limit, offset, objectTypes }); } export async function listObjects(connectionId: string, database: string, schema: string, objectTypes?: SidebarObjectKind[]): Promise { return invoke("list_objects", { connectionId, database, schema, objectTypes }); } export async function listObjectStatistics(connectionId: string, database: string, schema: string): Promise { return invoke("list_object_statistics", { connectionId, database, schema }); } export async function listCompletionObjects(connectionId: string, database: string, schema: string): Promise { return invoke("list_completion_objects", { connectionId, database, schema }); } export async function getObjectSource(connectionId: string, database: string, schema: string, name: string, objectType: ObjectSourceKind): Promise { return invoke("get_object_source", { connectionId, database, schema, name, objectType }); } export async function listSchemas(connectionId: string, database: string): Promise { return invoke("list_schemas", { connectionId, database }); } export async function getColumns(connectionId: string, database: string, schema: string, table: string): Promise { return invoke("get_columns", { connectionId, database, schema, table }); } export async function executeQuery( connectionId: string, database: string, sql: string, schema?: string, executionId?: string, options?: { maxRows?: number; fetchSize?: number; pageSize?: number; resultSessionId?: string; clientSessionId?: string; timeoutSecs?: number; }, ): Promise { return invoke("execute_query", { connectionId, database, sql, schema, executionId, ...options }); } export async function executeMulti( connectionId: string, database: string, sql: string, schema?: string, executionId?: string, options?: { maxRows?: number; fetchSize?: number; pageSize?: number; resultSessionId?: string; clientSessionId?: string; timeoutSecs?: number; }, ): Promise { return invoke("execute_multi", { connectionId, database, sql, schema, executionId, ...options }); } export async function refreshConnections(): Promise { return invoke("refresh_connections"); } export async function cancelQuery(executionId: string): Promise { return invoke("cancel_query", { executionId }); } export async function closeQuerySession(connectionId: string, database: string, sessionId: string, clientSessionId?: string): Promise { return invoke("close_query_session", { connectionId, database, sessionId, clientSessionId }); } export async function closeClientConnectionSession(connectionId: string, database: string, clientSessionId: string): Promise { return invoke("close_client_connection_session", { connectionId, database, clientSessionId }); } export async function executeBatch(connectionId: string, database: string, statements: string[], schema?: string, timeoutSecs?: number): Promise { return invoke("execute_batch", { connectionId, database, statements, schema, timeoutSecs }); } export async function executeScript(connectionId: string, database: string, sql: string, schema?: string): Promise { return invoke("execute_script", { connectionId, database, sql, schema }); } export async function executeInTransaction(connectionId: string, database: string, statements: string[], schema?: string): Promise { return invoke("execute_in_transaction", { connectionId, database, statements, schema }); } export async function analyzeSqlReferences(sql: string, dialect?: string): Promise { return invoke("analyze_sql_references", { sql, dialect }); } export async function findStatementAtCursor(sql: string, cursorPos: number, databaseType?: DatabaseType): Promise { return invoke("find_statement_at_cursor", { sql, cursorPos, databaseType }); } export async function prepareQueryPaginationExecutionPlan(options: QueryPaginationExecutionPlanOptions): Promise { return invoke("prepare_query_pagination_execution_plan", { options }); } export async function buildSortedQuerySql(options: SortedQuerySqlOptions): Promise { return invoke("build_sorted_query_sql", { options }); } export async function buildExplainSql(options: BuildExplainSqlOptions): Promise { return invoke("build_explain_sql", { options }); } export async function buildCreateUserSql(username: string, password: string, tablespace: string): Promise { return invoke("build_create_user_sql", { username, password, tablespace }); } export async function getExplainInfo(connectionId: string, database: string | undefined, schema: string | undefined, sql: string, mode: string): Promise { try { const result = await invoke("get_explain_info", { connectionId, database, schema, sql, mode }); return result; } catch (e: any) { console.error("[getExplainInfo] invoke failed:", e?.message || e); return undefined; } } export async function buildDroppedFilePreviewSql(options: DroppedFilePreviewSqlOptions): Promise { const result = await invoke("build_dropped_file_preview_sql", { options }); return result ?? undefined; } export async function buildTableSelectSql(options: BuildTableSelectSqlOptions): Promise { return invoke("build_table_select_sql", { options }); } export async function buildDatabaseSearchSql(options: DatabaseSearchSqlOptions): Promise { return invoke("build_database_search_sql", { options }); } export async function buildSearchResultWhere(options: SearchResultWhereOptions): Promise { return invoke("build_search_result_where", { options }); } export async function buildRenameObjectSql(options: BuildRenameObjectSqlOptions): Promise { return invoke("build_rename_object_sql", { options }); } export async function buildCreateDatabaseSql(options: CreateDatabaseSqlOptions): Promise { return invoke("build_create_database_sql", { options }); } export async function buildDuckDbAttachDatabaseSql(path: string, name: string): Promise { return invoke("build_duckdb_attach_database_sql", { options: { path, name } }); } export async function buildDropObjectSql(options: DropObjectSqlOptions): Promise { return invoke("build_drop_object_sql", { options }); } export async function buildDropTableSql(options: TableAdminSqlOptions): Promise { return invoke("build_drop_table_sql", { options }); } export async function buildDropTableChildObjectSql(options: DropTableChildObjectSqlOptions): Promise { return invoke("build_drop_table_child_object_sql", { options }); } export async function buildEmptyTableSql(options: TableAdminSqlOptions): Promise { return invoke("build_empty_table_sql", { options }); } export async function buildTruncateTableSql(options: TableAdminSqlOptions): Promise { return invoke("build_truncate_table_sql", { options }); } export async function buildDropDatabaseSql(options: DatabaseNameSqlOptions): Promise { return invoke("build_drop_database_sql", { options }); } export async function buildCreateSchemaSql(options: SchemaNameSqlOptions): Promise { return invoke("build_create_schema_sql", { options }); } export async function buildDropSchemaSql(options: SchemaNameSqlOptions): Promise { return invoke("build_drop_schema_sql", { options }); } export async function buildDuplicateTableStructureSql(options: DuplicateTableStructureSqlOptions): Promise { return invoke("build_duplicate_table_structure_sql", { options }); } export async function buildExecutableObjectSourceStatements(input: BuildEditableObjectSourceSqlInput): Promise { return invoke("build_executable_object_source_statements", { input }); } export async function buildExecutableObjectSourceSql(input: BuildEditableObjectSourceSqlInput): Promise { return invoke("build_executable_object_source_sql", { input }); } export async function buildEditableObjectSource(input: BuildEditableObjectSourceSqlInput): Promise { return invoke("build_editable_object_source", { input }); } export async function buildRoutineRenameObjectSourceStatements(input: BuildRoutineRenameObjectSourceInput): Promise { return invoke("build_routine_rename_object_source_statements", { input }); } export async function buildViewDdlSql(input: BuildViewDdlInput): Promise { return invoke("build_view_ddl_sql", { input }); } export async function buildTableStructureChangeSql(options: BuildTableStructureChangeSqlOptions): Promise { return invoke("build_table_structure_change_sql", { options }); } export async function buildCreateTableSql(options: BuildTableStructureChangeSqlOptions): Promise { return invoke("build_create_table_sql", { options }); } export async function buildSingleColumnAlterSql(options: BuildSingleColumnAlterSqlOptions): Promise { return invoke("build_single_column_alter_sql", { options }); } export async function analyzeEditableQueryEditability(sql: string): Promise { return invoke("analyze_editable_query_editability", { sql }); } export interface DataGridSavePreparation { validationError?: string; statements: string[]; rollbackStatements: string[]; executionSchema?: string; } export async function prepareDataGridSave(options: DataGridSaveStatementOptions): Promise { return invoke("prepare_data_grid_save", { options }); } export async function buildDataGridCopyUpdateStatements(options: DataGridCopyUpdateStatementOptions): Promise { return invoke("build_data_grid_copy_update_statements", { options }); } export async function buildDataGridCopyInsertStatement(options: DataGridCopyInsertStatementOptions): Promise { const result = await invoke("build_data_grid_copy_insert_statement", { options }); return result ?? undefined; } export async function buildDataGridContextFilterCondition(options: DataGridContextFilterConditionOptions): Promise { const result = await invoke("build_data_grid_context_filter_condition", { options }); return result ?? undefined; } export async function buildDataGridColumnValueFilterCondition(options: DataGridColumnValueFilterConditionOptions): Promise { const result = await invoke("build_data_grid_column_value_filter_condition", { options }); return result ?? undefined; } export async function buildDataGridCountSql(options: DataGridCountSqlOptions): Promise { return invoke("build_data_grid_count_sql", { options }); } export async function buildHiveTablePropertiesSql(options: HiveTablePropertiesSqlOptions): Promise { return invoke("build_hive_table_properties_sql", { options }); } export async function buildExportInsertStatements(options: BuildExportInsertStatementsOptions): Promise { return invoke("build_export_insert_statements", { options }); } export async function buildExportSqlInsert(options: BuildExportInsertStatementsOptions): Promise { return invoke("build_export_sql_insert", { options }); } export async function buildDatabaseSqlExport(options: BuildDatabaseSqlExportOptions): Promise { return invoke("build_database_sql_export", { options }); } export async function prepareDataCompare(options: DataComparePreparationOptions): Promise { return invoke("prepare_data_compare", { options }); } export async function prepareDataCompareFromTables(options: DataCompareFromTablesOptions): Promise { return invoke("prepare_data_compare_from_tables", { options }); } export async function prepareDataCompareMissingTarget(options: import("@/lib/dataCompare").DataCompareMissingTargetOptions): Promise { return invoke("prepare_data_compare_missing_target", { options }); } export async function buildDataCompareSyncPlan(options: DataCompareSyncPlanOptions): Promise { return invoke("build_data_compare_sync_plan", { options }); } export async function listIndexes(connectionId: string, database: string, schema: string, table: string): Promise { return invoke("list_indexes", { connectionId, database, schema, table }); } export async function listForeignKeys(connectionId: string, database: string, schema: string, table: string): Promise { return invoke("list_foreign_keys", { connectionId, database, schema, table }); } export async function listTriggers(connectionId: string, database: string, schema: string, table: string): Promise { return invoke("list_triggers", { connectionId, database, schema, table }); } export async function getTableDdl(connectionId: string, database: string, schema: string, table: string, objectType?: ObjectSourceKind): Promise { return invoke("get_table_ddl", { connectionId, database, schema, table, objectType }); } export async function prepareSchemaDiff(options: SchemaDiffPreparationOptions): Promise { return invoke("prepare_schema_diff", { options }); } export async function generateSchemaSyncSql(diffs: TableDiff[], databaseType: DatabaseType, targetSchema?: string, functionDiffs?: FunctionDiff[], sequenceDiffs?: SequenceDiff[], ruleDiffs?: RuleDiff[], ownerDiffs?: OwnerDiff[], cascadeDelete?: boolean): Promise { return invoke("generate_schema_sync_sql", { diffs, databaseType, targetSchema, functionDiffs: functionDiffs ?? [], sequenceDiffs: sequenceDiffs ?? [], ruleDiffs: ruleDiffs ?? [], ownerDiffs: ownerDiffs ?? [], cascadeDelete: cascadeDelete ?? false, }); } export async function listFunctions(connectionId: string, database: string, schema: string): Promise { return invoke("list_functions", { connectionId, database, schema }); } export async function listSequences(connectionId: string, database: string, schema: string, withLastValues: boolean): Promise { return invoke("list_sequences", { connectionId, database, schema, withLastValues }); } export async function listRules(connectionId: string, database: string, schema: string): Promise { return invoke("list_rules", { connectionId, database, schema }); } export async function listOwners(connectionId: string, database: string, schema: string): Promise { return invoke("list_owners", { connectionId, database, schema }); } export async function saveConnections(configs: ConnectionConfig[]): Promise { return invoke("save_connections", { configs }); } export async function loadConnections(): Promise { return invoke("load_connections"); } export async function readKeychainPassword(service: string): Promise { return invoke("read_keychain_password", { service, account: null }); } export async function readKeychainPasswords(services: string[]): Promise<[string, string][]> { return invoke("read_keychain_passwords", { services }); } export async function decryptConfig(payload: unknown, passphrase: string): Promise { const { decryptConfig: decryptConfigPayload } = await import("@/lib/configCrypto"); return decryptConfigPayload(payload as any, passphrase); } export async function listPlugins(): Promise { return invoke("list_plugins"); } export async function listJdbcDrivers(): Promise { return invoke("list_jdbc_drivers"); } export async function listJdbcMavenBundles(): Promise { return invoke("list_jdbc_maven_bundles"); } export async function importJdbcDrivers(paths: (string | File)[]): Promise { if (paths.some((path) => typeof path !== "string")) { throw new Error("Desktop JDBC driver import requires local file paths"); } return invoke("import_jdbc_drivers", { paths }); } export async function installJdbcDriverFromMaven(coordinate: string, repositories: string[] = []): Promise { return invoke("install_jdbc_driver_from_maven", { request: { coordinate, repositories } }); } export async function installPrestoSqlJdbcDriver(): Promise { return invoke("install_prestosql_jdbc_driver"); } export async function deleteJdbcDriver(path: string): Promise { return invoke("delete_jdbc_driver", { path }); } export async function deleteJdbcMavenBundle(bundleId: string): Promise { return invoke("delete_jdbc_maven_bundle", { bundleId }); } export async function jdbcPluginStatus(): Promise { return invoke("jdbc_plugin_status"); } export async function installJdbcPlugin(): Promise { return invoke("install_jdbc_plugin"); } export async function installJdbcPluginLocal(path: string | File): Promise { if (typeof path !== "string") { throw new Error("Desktop JDBC plugin install requires a local file path"); } return invoke("install_jdbc_plugin_local", { path }); } export async function uninstallJdbcPlugin(): Promise { return invoke("uninstall_jdbc_plugin"); } export async function listInstalledAgentsLocal(): Promise { return invoke("list_installed_agents_local"); } export async function listInstalledAgents(): Promise { return invoke("list_installed_agents"); } export async function getDriverStoreUsage(): Promise { return invoke("get_driver_store_usage"); } export async function getDriverRuntimeSummary(): Promise { return invoke("get_driver_runtime_summary"); } export async function stopDriverRuntime(runtimeId: string): Promise { return invoke("stop_driver_runtime", { runtimeId }); } export async function restartDriverRuntime(runtimeId: string): Promise { return invoke("restart_driver_runtime", { runtimeId }); } export async function installAgent(dbType: string): Promise { return invoke("install_agent", { dbType }); } export async function upgradeAllAgents(): Promise { return invoke("upgrade_all_agents"); } export async function checkAgentUpdateBlockers(dbTypes: string[]): Promise { return invoke("check_agent_update_blockers", { dbTypes }); } export async function uninstallAgent(dbType: string): Promise { return invoke("uninstall_agent", { dbType }); } export async function getAgentJavaRuntimeConfig(): Promise { return invoke("get_agent_java_runtime_config"); } export async function setAgentJavaRuntimeConfig(config: JavaRuntimeConfig): Promise { return invoke("set_agent_java_runtime_config", { config }); } export async function invalidateAgentRegistryCache(): Promise { return invoke("invalidate_agent_registry_cache"); } export async function importAgentsFromZip(path: string | File): Promise { if (typeof path !== "string") { throw new Error("Desktop offline ZIP import requires a local file path"); } return invoke("import_agents_from_zip", { path }); } export async function importAgentJar(dbType: string, path: string | File): Promise { if (typeof path !== "string") { throw new Error("Desktop driver JAR import requires a local file path"); } return invoke("import_agent_jar_cmd", { dbType, path }); } export async function reinstallJre(jreKey?: string): Promise { return invoke("reinstall_jre", { jreKey }); } export async function uninstallJre(jreKey: string): Promise { return invoke("uninstall_jre", { jreKey }); } export async function listenAgentInstallProgress(handler: (progress: DriverInstallProgress) => void): Promise { return listen("agent-install-progress", (event) => handler(event.payload)); } export async function loadSavedSqlLibrary(): Promise { return invoke("load_saved_sql_library"); } export async function saveSavedSqlFolder(folder: SavedSqlFolder): Promise { return invoke("save_saved_sql_folder", { folder }); } export async function deleteSavedSqlFolder(id: string): Promise { return invoke("delete_saved_sql_folder", { id }); } export async function saveSavedSqlFile(file: SavedSqlFile): Promise { return invoke("save_saved_sql_file", { file }); } export async function deleteSavedSqlFile(id: string): Promise { return invoke("delete_saved_sql_file", { id }); } export async function savedSqlStorageDir(): Promise { return invoke("saved_sql_storage_dir"); } export async function openSavedSqlStorageDir(dir?: string | null): Promise { return invoke("open_saved_sql_storage_dir", { dir }); } export async function revealPathInFileManager(path: string): Promise { return invoke("reveal_path_in_file_manager", { path }); } export async function backupSqliteDatabase(connectionId: string, destinationPath: string): Promise { return invoke("backup_sqlite_database", { connectionId, destinationPath }); } export async function syncSavedSqlDirectory(request: SavedSqlSyncRequest): Promise { return invoke("sync_saved_sql_directory", { request }); } export async function saveSidebarLayout(layout: import("@/types/database").SidebarLayout): Promise { return invoke("save_sidebar_layout", { layout }); } export async function loadSidebarLayout(): Promise { return invoke("load_sidebar_layout"); } // --- Updates --- export interface UpdateInfo { current_version: string; latest_version: string; update_available: boolean; portable_mode: boolean; release_name: string; release_url: string; release_notes: string; } export interface McpServerStatus { installed: boolean; npm_available: boolean; node_version: string | null; current_version: string | null; latest_version: string | null; update_available: boolean; bin_path: string | null; install_command: string; update_command: string; error: string | null; } export async function checkMcpServerStatus(): Promise { return invoke("check_mcp_server_status"); } export async function installMcpServer(): Promise { return invoke("install_mcp_server"); } export async function checkForUpdates(): Promise { return invoke("check_for_updates"); } export async function getSystemProxyUrl(): Promise { return invoke("get_system_proxy_url"); } export async function getAppVersion(): Promise { const { getVersion } = await import("@tauri-apps/api/app"); return getVersion(); } // --- Redis --- export interface RedisKeyInfo { key_display: string; key_raw: string; key_type: string; ttl: number; size: number; value_preview: string; } export interface RedisDatabaseInfo { db: number; keys: number; } export interface RedisValue { key_display: string; key_raw: string; key_type: string; ttl: number; value_is_binary: boolean; value: any; total?: number; scan_cursor?: number; } export interface RedisScanResult { cursor: number; keys: RedisKeyInfo[]; total_keys: number; } export type RedisCommandSafety = "allowed" | "confirm" | "blocked"; export interface RedisCommandResult { command: string; safety: RedisCommandSafety; value: any; } export interface RedisSlowlogEntry { id: number; timestamp: number; duration_micros: number; command: string; client_addr: string | null; client_name: string | null; } export interface RedisNodeEndpoint { host: string; port: number; } export async function redisListDatabases(connectionId: string): Promise { return invoke("redis_list_databases", { connectionId }); } export async function redisScanKeys(connectionId: string, db: number, cursor: number, pattern: string, count: number): Promise { return invoke("redis_scan_keys", { connectionId, db, cursor, pattern, count }); } export async function redisScanKeysBatch(connectionId: string, db: number, cursor: number, pattern: string, count: number, maxIterations: number, includeTypes = true): Promise { return invoke("redis_scan_keys_batch", { connectionId, db, cursor, pattern, count, maxIterations, includeTypes }); } export async function redisScanValues(connectionId: string, db: number, cursor: number, pattern: string, query: string, count: number, includeKeyMatches = false): Promise { return invoke("redis_scan_values", { connectionId, db, cursor, pattern, query, includeKeyMatches, count }); } export async function redisGetValue(connectionId: string, db: number, keyRaw: string): Promise { return invoke("redis_get_value", { connectionId, db, keyRaw }); } export async function redisSetString(connectionId: string, db: number, keyRaw: string, value: string, ttl?: number): Promise { return invoke("redis_set_string", { connectionId, db, keyRaw, value, ttl }); } export async function redisDeleteKey(connectionId: string, db: number, keyRaw: string): Promise { return invoke("redis_delete_key", { connectionId, db, keyRaw }); } export async function redisHashSet(connectionId: string, db: number, keyRaw: string, field: string, value: string, ttl?: number): Promise { return invoke("redis_hash_set", { connectionId, db, keyRaw, field, value, ttl }); } export async function redisHashDel(connectionId: string, db: number, keyRaw: string, field: string): Promise { return invoke("redis_hash_del", { connectionId, db, keyRaw, field }); } export async function redisListPush(connectionId: string, db: number, keyRaw: string, value: string, ttl?: number): Promise { return invoke("redis_list_push", { connectionId, db, keyRaw, value, ttl }); } export async function redisListSet(connectionId: string, db: number, keyRaw: string, index: number, value: string): Promise { return invoke("redis_list_set", { connectionId, db, keyRaw, index, value }); } export async function redisListRemove(connectionId: string, db: number, keyRaw: string, index: number): Promise { return invoke("redis_list_remove", { connectionId, db, keyRaw, index }); } export async function redisSetAdd(connectionId: string, db: number, keyRaw: string, member: string, ttl?: number): Promise { return invoke("redis_set_add", { connectionId, db, keyRaw, member, ttl }); } export async function redisSetRemove(connectionId: string, db: number, keyRaw: string, member: string): Promise { return invoke("redis_set_remove", { connectionId, db, keyRaw, member }); } export async function redisZadd(connectionId: string, db: number, keyRaw: string, member: string, score: number, ttl?: number): Promise { return invoke("redis_zadd", { connectionId, db, keyRaw, member, score, ttl }); } export async function redisZrem(connectionId: string, db: number, keyRaw: string, member: string): Promise { return invoke("redis_zrem", { connectionId, db, keyRaw, member }); } export async function redisStreamAdd(connectionId: string, db: number, keyRaw: string, entryId: string, fields: [string, string][], ttl?: number): Promise { return invoke("redis_stream_add", { connectionId, db, keyRaw, entryId, fields, ttl }); } export async function redisJsonSet(connectionId: string, db: number, keyRaw: string, value: string, ttl?: number): Promise { return invoke("redis_json_set", { connectionId, db, keyRaw, value, ttl }); } export async function redisCheckJsonModule(connectionId: string, db: number): Promise { return invoke("redis_check_json_module", { connectionId, db }); } export async function redisSetTtl(connectionId: string, db: number, keyRaw: string, ttl: number): Promise { return invoke("redis_set_ttl", { connectionId, db, keyRaw, ttl }); } export async function redisDeleteKeys(connectionId: string, db: number, keyRaws: string[]): Promise { return invoke("redis_delete_keys", { connectionId, db, keyRaws }); } export async function redisFlushDb(connectionId: string, db: number): Promise { return invoke("redis_flush_db", { connectionId, db }); } export async function redisExecuteCommand(connectionId: string, db: number, command: string, skipSafetyCheck?: boolean): Promise { return invoke("redis_execute_command", { connectionId, db, command, skipSafetyCheck: skipSafetyCheck ?? false }); } export async function redisLoadMore(connectionId: string, db: number, keyRaw: string, keyType: string, cursor: number, count: number): Promise { return invoke("redis_load_more", { connectionId, db, keyRaw, keyType, cursor, count }); } export async function redisPubSubPublish(connectionId: string, db: number, channel: string, message: string): Promise<{ subscribers: number }> { return invoke("redis_pubsub_publish", { connectionId, db, channel, message }); } export async function redisSlowlogGet(connectionId: string, count: number, nodeHost?: string, nodePort?: number): Promise { return invoke("redis_slowlog_get", { connectionId, count, nodeHost, nodePort }); } export async function redisClusterMasterNodes(connectionId: string): Promise { return invoke("redis_cluster_master_nodes", { connectionId }); } // --- etcd --- export type KvValueEncoding = "utf8" | "base64"; export interface KvValue { encoding: KvValueEncoding; data: string; } export interface KvKeyMetadata { createRevision?: number | null; modRevision?: number | null; version?: number | null; lease?: number | null; valueSize?: number | null; } export interface KvKeySummary extends KvKeyMetadata { key: string; } export interface KvListPrefixResponse { keys: KvKeySummary[]; continuation?: string | null; revision?: number | null; } export interface KvGetResponse { found: boolean; key?: string | null; value?: KvValue | null; metadata?: KvKeyMetadata | null; } export interface KvPutResponse { revision?: number | null; } export interface KvDeleteResponse { deleted: number; revision?: number | null; } export async function etcdListPrefix(connectionId: string, prefix: string, limit: number, continuation?: string | null): Promise { return invoke("etcd_list_prefix", { connectionId, prefix, limit, continuation }); } export async function etcdGet(connectionId: string, key: string): Promise { return invoke("etcd_get", { connectionId, key }); } export async function etcdPut(connectionId: string, key: string, value: KvValue, lease?: number | null): Promise { return invoke("etcd_put", { connectionId, key, value, lease }); } export async function etcdDelete(connectionId: string, key: string): Promise { return invoke("etcd_delete", { connectionId, key }); } // --- MongoDB --- export interface MongoDocumentResult { documents: any[]; total: number; } export async function mongoListDatabases(connectionId: string): Promise { return invoke("mongo_list_databases", { connectionId }); } export async function mongoListCollections(connectionId: string, database: string): Promise { return invoke("mongo_list_collections", { connectionId, database }); } export async function mongoCreateDatabase(connectionId: string, database: string): Promise { return invoke("mongo_create_database", { connectionId, database }); } export async function mongoDropDatabase(connectionId: string, database: string): Promise { return invoke("mongo_drop_database", { connectionId, database }); } export async function mongoDropCollection(connectionId: string, database: string, collection: string): Promise { return invoke("mongo_drop_collection", { connectionId, database, collection }); } export async function elasticsearchListIndices(connectionId: string): Promise { return mongoListCollections(connectionId, "default"); } export async function vectorListCollections(connectionId: string): Promise { return mongoListCollections(connectionId, "default"); } export async function mongoFindDocuments(connectionId: string, database: string, collection: string, skip: number, limit: number, filter?: string, sort?: string, executionId?: string): Promise { return invoke("mongo_find_documents", { connectionId, database, collection, skip, limit, filter, sort, executionId }); } export async function documentFindDocuments(connectionId: string, database: string, collection: string, skip: number, limit: number, filter?: string, sort?: string, executionId?: string): Promise { return invoke("document_find_documents", { connectionId, database, collection, skip, limit, filter, sort, executionId }); } export async function mongoAggregateDocuments(connectionId: string, database: string, collection: string, pipelineJson: string, maxRows?: number, executionId?: string): Promise { return invoke("mongo_aggregate_documents", { connectionId, database, collection, pipelineJson, maxRows, executionId }); } export async function mongoInsertDocument(connectionId: string, database: string, collection: string, docJson: string): Promise { return invoke("mongo_insert_document", { connectionId, database, collection, docJson }); } export async function mongoInsertDocuments(connectionId: string, database: string, collection: string, docsJson: string): Promise<{ affected_rows: number }> { const affectedRows = await invoke("mongo_insert_documents", { connectionId, database, collection, docsJson }); return { affected_rows: affectedRows }; } export async function mongoUpdateDocument(connectionId: string, database: string, collection: string, id: string, docJson: string): Promise { return invoke("mongo_update_document", { connectionId, database, collection, id, docJson }); } export async function mongoUpdateDocuments(connectionId: string, database: string, collection: string, filterJson: string, updateJson: string, many: boolean): Promise<{ affected_rows: number }> { const affectedRows = await invoke("mongo_update_documents", { connectionId, database, collection, filterJson, updateJson, many, }); return { affected_rows: affectedRows }; } export async function mongoDeleteDocument(connectionId: string, database: string, collection: string, id: string): Promise { return invoke("mongo_delete_document", { connectionId, database, collection, id }); } export async function mongoDeleteDocuments(connectionId: string, database: string, collection: string, filterJson: string, many: boolean): Promise<{ affected_rows: number }> { const affectedRows = await invoke("mongo_delete_documents", { connectionId, database, collection, filterJson, many, }); return { affected_rows: affectedRows }; } // --- History --- export interface HistoryEntry { id: string; connection_id?: string; connection_name: string; database: string; sql: string; executed_at: string; execution_time_ms: number; success: boolean; error?: string; activity_kind?: "query" | "data_change" | "schema_change" | "import" | "transfer" | "redis_command"; operation?: string; target?: string; affected_rows?: number | null; rollback_sql?: string | null; details_json?: string | null; } export async function saveHistory(entry: HistoryEntry): Promise { return invoke("save_history", { entry }); } export async function loadHistory(limit: number, offset: number, activityKind?: string): Promise { return invoke("load_history", { limit, offset, activityKind: activityKind ?? null }); } export async function loadRedisHistory(limit = 100, offset = 0): Promise { return loadHistory(limit, offset, "redis_command"); } export async function clearHistory(): Promise { return invoke("clear_history"); } export async function clearRedisHistory(): Promise { const entries = await loadRedisHistory(1000, 0); await Promise.all(entries.map((e) => deleteHistoryEntry(e.id))); } export async function deleteHistoryEntry(id: string): Promise { return invoke("delete_history_entry", { id }); } // --- SQL File Execution --- export type SqlFileStatus = "started" | "running" | "statementDone" | "statementFailed" | "done" | "error" | "cancelled"; export interface SqlFileRequest { executionId: string; connectionId: string; database: string; filePath: string; continueOnError: boolean; } export interface SqlFilePreview { fileName: string; filePath: string; sizeBytes: number; preview: string; } export interface SqlFileProgress { executionId: string; status: SqlFileStatus; statementIndex: number; successCount: number; failureCount: number; affectedRows: number; elapsedMs: number; statementSummary: string; error?: string | null; } export async function previewSqlFile(filePath: string): Promise { return invoke("preview_sql_file", { filePath }); } export async function executeSqlFile(request: SqlFileRequest): Promise { return invoke("execute_sql_file", { request }); } export async function cancelSqlFileExecution(executionId: string): Promise { return invoke("cancel_sql_file_execution", { executionId }); } export async function listenSqlFileProgress(handler: (progress: SqlFileProgress) => void): Promise { return listen("sql-file-progress", (event) => handler(event.payload)); } // --- Data Transfer --- export type TransferMode = "append" | "overwrite" | "upsert"; export type TransferTableNameCase = "preserve" | "lower" | "upper"; export interface TransferRequest { transferId: string; sourceConnectionId: string; sourceDatabase: string; sourceSchema: string; targetConnectionId: string; targetDatabase: string; targetSchema: string; tables: string[]; createTable: boolean; mode: TransferMode; targetTableNameCase: TransferTableNameCase; batchSize: number; } export interface TransferProgress { transferId: string; table: string; tableIndex: number; totalTables: number; rowsTransferred: number; totalRows: number | null; status: "running" | "tableDone" | "done" | "error" | "cancelled"; error: string | null; } export async function startTransfer(request: TransferRequest, onProgress: (progress: TransferProgress) => void): Promise { return new Promise((resolve, reject) => { let unlisten: UnlistenFn | null = null; void (async () => { try { unlisten = await listen("transfer-progress", (event) => { if (event.payload.transferId !== request.transferId) return; onProgress(event.payload); if (event.payload.status === "done" || event.payload.status === "cancelled") { unlisten?.(); resolve(); } }); await invoke("start_transfer", { request }); } catch (e) { unlisten?.(); reject(e); } })(); }); } export async function cancelTransfer(transferId: string): Promise { return invoke("cancel_transfer", { transferId }); } export interface SortTablesByFkOptions { connectionId: string; database: string; schema: string; tables: string[]; parentsFirst: boolean; } export async function sortTablesByFkDependency(options: SortTablesByFkOptions): Promise { return invoke("sort_tables_by_fk_dependency", { connectionId: options.connectionId, database: options.database, schema: options.schema, tables: options.tables, parentsFirst: options.parentsFirst, }); } // --- Table File Import --- export type TableImportMode = "append" | "truncate"; export type TableImportStatus = "running" | "done" | "error" | "cancelled"; export interface TableImportColumnMapping { sourceColumn: string; targetColumn: string; } export interface TableImportPreview { fileName: string; filePath: string; fileType: string; sizeBytes: number; columns: string[]; rows: unknown[][]; totalRows: number; } export interface TableImportRequest { importId: string; connectionId: string; database: string; schema: string; table: string; filePath: string; mappings: TableImportColumnMapping[]; mode: TableImportMode; batchSize: number; } export interface TableImportSummary { importId: string; rowsImported: number; totalRows: number; } export interface TableImportProgress { importId: string; status: TableImportStatus; rowsImported: number; totalRows: number; error?: string | null; } export async function previewTableImportFile(filePath: string): Promise { return invoke("preview_table_import_file", { filePath }); } export async function importTableFile(request: TableImportRequest, onProgress: (progress: TableImportProgress) => void): Promise { const unlisten: UnlistenFn = await listen("table-import-progress", (event) => { if (event.payload.importId === request.importId) { onProgress(event.payload); if (event.payload.status === "done" || event.payload.status === "error" || event.payload.status === "cancelled") { unlisten(); } } }); try { return await invoke("import_table_file", { request }); } catch (e) { unlisten(); throw e; } } export async function cancelTableImport(importId: string): Promise { return invoke("cancel_table_import", { importId }); } // --- Database Export --- export interface DatabaseExportRequest { exportId: string; connectionId: string; database: string; schema: string; filePath: string; selectedTables?: string[]; includeStructure: boolean; includeData: boolean; includeObjects: boolean; dropTableIfExists?: boolean; batchSize: number; } export interface ExportProgress { exportId: string; currentObject: string; objectIndex: number; totalObjects: number; rowsExported: number; totalRows: number | null; status: "Running" | "Done" | "Error" | "Cancelled"; error: string | null; } // --- Table Export --- export type TableExportStatus = "Running" | "Writing" | "Done" | "Error" | "Cancelled"; export interface TableExportRequest { exportId: string; connectionId: string; database: string; schema?: string; tableName: string; filePath: string; format: "csv" | "xlsx" | "json" | "markdown" | "sql"; columns?: string[]; columnTypes?: Array; primaryKeys?: string[]; whereInput?: string; orderBy?: string; skipCount?: boolean; batchSize?: number; } export interface TableCsvExportOptions { filePath: string; connectionId: string; database: string; schema?: string; tableName: string; columns?: string[]; pageSize?: number; timeoutSecs?: number; } export interface TableExportProgress { exportId: string; tableName: string; rowsExported: number; totalRows: number | null; status: TableExportStatus; errorMessage?: string; } export async function startTableExport(request: TableExportRequest, onProgress: (progress: TableExportProgress) => void): Promise { let unlisten: UnlistenFn | undefined; let settled = false; let resolveTerminal: (progress: TableExportProgress) => void = () => {}; let rejectTerminal: (error: unknown) => void = () => {}; const terminalProgress = new Promise((resolve, reject) => { resolveTerminal = resolve; rejectTerminal = reject; }); const finish = (callback: () => void) => { if (settled) return; settled = true; unlisten?.(); callback(); }; try { unlisten = await listen("table-export-progress", (event) => { if (event.payload.exportId !== request.exportId) return; onProgress(event.payload); if (event.payload.status === "Done" || event.payload.status === "Error" || event.payload.status === "Cancelled") { if (event.payload.status === "Error") { finish(() => rejectTerminal(new Error(event.payload.errorMessage || "Export failed"))); } else { finish(() => resolveTerminal(event.payload)); } } }); await invoke("start_table_export", { request }); return await terminalProgress; } catch (error) { if (!settled) { settled = true; unlisten?.(); } throw error; } } export async function cancelTableExport(exportId: string): Promise { return invoke("cancel_table_export", { exportId }); } export async function exportDatabaseSql(request: DatabaseExportRequest, onProgress: (progress: ExportProgress) => void): Promise { const unlisten: UnlistenFn = await listen("database-export-progress", (event) => { if (event.payload.exportId === request.exportId) { onProgress(event.payload); if (event.payload.status === "Done" || event.payload.status === "Error" || event.payload.status === "Cancelled") { unlisten(); } } }); try { await invoke("export_database_sql", { request }); } catch (e) { unlisten(); throw e; } } export async function cancelDatabaseExport(exportId: string): Promise { await invoke("cancel_database_export", { exportId }); } export async function exportQueryResultCsv(filePath: string, columns: string[], rows: readonly (readonly XlsxCellValue[])[]): Promise { return invoke("export_query_result_csv", { request: { filePath, columns, rows, }, }); } export async function exportTableDataCsv(options: TableCsvExportOptions): Promise { return invoke("export_table_data_csv", { request: options }); } export async function exportQueryResultXlsx(filePath: string, sheetName: string | undefined, columns: string[], rows: readonly (readonly XlsxCellValue[])[]): Promise { return invoke("export_query_result_xlsx", { request: { filePath, sheetName, columns, rows, }, }); } export async function exportQueryResultsXlsx(filePath: string, worksheets: readonly { sheetName?: string; columns: string[]; rows: readonly (readonly XlsxCellValue[])[] }[]): Promise { return invoke("export_query_results_xlsx", { request: { filePath, worksheets, }, }); } export async function exportQueryResultJson(filePath: string, columns: string[], rows: readonly (readonly XlsxCellValue[])[]): Promise { return invoke("export_query_result_json", { request: { filePath, columns, rows, }, }); } export async function exportQueryResultMarkdown(filePath: string, columns: string[], rows: readonly (readonly XlsxCellValue[])[]): Promise { return invoke("export_query_result_markdown", { request: { filePath, columns, rows, }, }); } export * from "./mq-tauri";