Rumah > hujung hadapan web > tutorial js > Uruskan Konfigurasi TOML Dari Sambungan VSCode - DBChat Bahagian 8

Uruskan Konfigurasi TOML Dari Sambungan VSCode - DBChat Bahagian 8

Mary-Kate Olsen
Lepaskan: 2025-01-22 04:32:11
asal
977 orang telah melayarinya

Shrijith Venkatrama, pengasas Hexmos, sedang membina LiveAPI, alat yang sangat berguna yang menyelaraskan aliran kerja kejuruteraan dengan menjana dokumentasi API yang hebat daripada kod anda dalam beberapa minit sahaja.

Dalam siri tutorial ini, saya sedang membina DBChat sendiri - alat mudah untuk meneroka dan menambah baik pangkalan data menggunakan sembang AI.

Lihat artikel sebelumnya untuk konteks lanjut:

  1. Membina DBChat - Teroka dan tingkatkan pangkalan data anda dengan sembang ringkas (Bahagian 1)
  2. DBChat: Melancarkan REPL mainan di Golang (Bahagian 2)
  3. DBChat Bahagian 3 - Mengkonfigurasi, Menyambung dan Melambakkan Pangkalan Data
  4. Sembang dengan pangkalan data anda dengan DBChat dan Gemini (Bahagian 4)
  5. Protokol Pelayan Bahasa - Membina DBChat (Bahagian 5)
  6. Membuat Sambungan VSCode DBChat - Interaksi Ping-Pong dengan Bahagian Belakang LSP (Bahagian 6)
  7. Melancarkan UI sambungan VSCode untuk DBChat (Bahagian 7)

Bina UI pengurus sambungan TOML untuk DBChat dalam sambungan VSCode

Dalam artikel sebelumnya, kami mencipta rangka kerja untuk UI sembang mudah dan borang sambungan pangkalan data dalam sambungan DBChat VSCode.

Dalam siaran ini, saya akan menunjukkan cara sambungan DBChat memanipulasi bahagian [sambungan] fail konfigurasi ~/.dbchat.toml untuk menambah/kemas kini/padam entri.

Untuk menyegarkan semula ingatan anda, fail konfigurasi harus mempunyai struktur berikut:

<code># DBChat 示例配置文件
# 将此文件复制到 ~/.dbchat.toml 并根据需要修改

[connections]
# 格式:name = "connection_string"
local = "postgresql://postgres:postgres@localhost:5432/postgres"
liveapi = "postgresql://user:pwd@ip:5432/db_name" 

[llm]
gemini_key = "the_key"</code>
Salin selepas log masuk

Keputusan

Senarai sambungan DBChat:

Manage TOML Configuration From VSCode Extension - DBChat Part 8

DBChat Tambah/Edit Sambungan:

Manage TOML Configuration From VSCode Extension - DBChat Part 8

Untuk pengeditan dan kemas kini, kami juga mempunyai gesaan pengesahan untuk mengelakkan ralat.

Kendalikan permintaan sambungan penciptaan

Mula-mula, pasang sambungan toml:

<code> npm install @iarna/toml</code>
Salin selepas log masuk

Kami mendapat beberapa import baharu:

<code>import * as fs from 'fs/promises';
import * as path from 'path';
import * as os from 'os';
import * as TOML from '@iarna/toml';</code>
Salin selepas log masuk

Struktur utama ialah pengendali mesej yang akan menerima acara untuk ketiga-tiga operasi:

<code>        const messageHandler = this._view.webview.onDidReceiveMessage(
            async (message) => {
                console.log('Received message:', message);
                switch (message.command) {
                    case 'saveConnection':
                        console.log('Processing saveConnection command');
                        const success = await this._saveConnection(message.name, message.connectionString);
                        if (success) {
                            console.log('Connection saved successfully, closing form');
                            this._showingConnectionForm = false;
                            this._updateView();
                        } else {
                            console.log('Connection not saved, keeping form open');
                        }
                        break;
                    case 'cancel':
                        console.log('Processing cancel command');
                        this._showingConnectionForm = false;
                        this._updateView();
                        break;
                    case 'editConnection':
                        this._showingConnectionForm = true;
                        this._editingConnection = message.name;
                        // First update the view to show the form
                        await this._updateView();
                        // Then send the prefill message after a short delay to ensure the form exists
                        setTimeout(() => {
                            this._view.webview.postMessage({ 
                                command: 'prefillForm', 
                                name: message.name, 
                                connectionString: message.connectionString 
                            });
                        }, 100);
                        break;
                    case 'deleteConnection':
                        const choice = await vscode.window.showWarningMessage(
                            `Are you sure you want to delete connection "${message.name}"?`,
                            'Yes',
                            'No'
                        );
                        if (choice === 'Yes') {
                            const deleted = await this._deleteConnection(message.name);
                            if (deleted) {
                                await this._updateView();  // Update view after successful deletion
                                vscode.window.showInformationMessage(`Connection "${message.name}" deleted successfully.`);
                            }
                        }
                        break;
                }
            }
        );

        // Add message handler to subscriptions for cleanup
        context.subscriptions.push(messageHandler);</code>
Salin selepas log masuk

Menyimpan sambungan adalah mudah:

<code>    private async _saveConnection(name: string, connectionString: string): Promise<boolean> {
        console.log('Starting _saveConnection with:', { name, connectionString });
        try {
            const configPath = path.join(os.homedir(), 'dbchat.toml');
            console.log('Config path:', configPath);

            let config: any = {
                connections: {},
                llm: {}
            };
            console.log('Initial config structure:', config);

            // Read existing config if it exists
            try {
                console.log('Attempting to read existing config file...');
                const fileContent = await fs.readFile(configPath, 'utf-8');
                console.log('Existing file content:', fileContent);

                console.log('Parsing TOML content...');
                config = TOML.parse(fileContent);
                console.log('Parsed config:', config);

                // Ensure connections section exists
                config.connections = config.connections || {};
                console.log('Config after ensuring connections exist:', config);
            } catch (error: any) {
                console.log('Error reading config:', error);
                if (error.code !== 'ENOENT') {
                    console.error('Unexpected error reading config:', error);
                    throw error;
                }
                console.log('Config file does not exist, will create new one');
            }

            // Check if connection already exists
            if (config.connections[name]) {
                console.log(`Connection "${name}" already exists, showing confirmation dialog`);
                const choice = await vscode.window.showWarningMessage(
                    `Connection "${name}" already exists. Do you want to overwrite it?`,
                    'Yes',
                    'No'
                );
                console.log('User choice for overwrite:', choice);

                if (choice !== 'Yes') {
                    console.log('User declined to overwrite, returning false');
                    return false;
                }
            }

            // Update the connection
            config.connections[name] = connectionString;
            console.log('Updated config:', config);

            // Convert config to TOML and write back to file
            console.log('Converting config to TOML...');
            const tomlContent = TOML.stringify(config);
            console.log('Generated TOML content:', tomlContent);

            // Preserve the header comments
            const finalContent = `# DBChat Sample Configuration File
# Copy this file to ~/.dbchat.toml and modify as needed

${tomlContent}`;
            console.log('Final content to write:', finalContent);

            console.log('Writing to file...');
            await fs.writeFile(configPath, finalContent, 'utf-8');
            console.log('File written successfully');

            // Update view immediately after successful file write
            this._showingConnectionForm = false;
            console.log('Form hidden, updating view');
            this._updateView();

            await vscode.window.showInformationMessage(`Connection "${name}" saved successfully!`, { modal: false });
            return true;
        } catch (error) {
            console.error('Error in _saveConnection:', error);
            if (error instanceof Error) {
                console.error('Error stack:', error.stack);
            }
            await vscode.window.showErrorMessage(`Failed to save connection: ${error}`);
            return false;
        }
    }
</boolean></code>
Salin selepas log masuk

Senaraikan sambungan

<code>    private async _getConnections(): Promise {
        try {
            const configPath = path.join(os.homedir(), 'dbchat.toml');
            const fileContent = await fs.readFile(configPath, 'utf-8');
            const config = TOML.parse(fileContent);
            return config.connections || {};
        } catch (error) {
            console.error('Error reading connections:', error);
            return {};
        }
    }</code>
Salin selepas log masuk

Padam sambungan

<code>    private async _deleteConnection(name: string): Promise<boolean> {
        try {
            const configPath = path.join(os.homedir(), 'dbchat.toml');
            const fileContent = await fs.readFile(configPath, 'utf-8');
            const config = TOML.parse(fileContent);

            if (!config.connections || !config.connections[name]) {
                await vscode.window.showErrorMessage(`Connection "${name}" not found.`);
                return false;
            }

            delete config.connections[name];

            const tomlContent = TOML.stringify(config);
            const finalContent = `# DBChat Sample Configuration File
# Copy this file to ~/.dbchat.toml and modify as needed

${tomlContent}`;

            await fs.writeFile(configPath, finalContent, 'utf-8');
            // Show message after file operations are complete
            vscode.window.showInformationMessage(`Connection "${name}" deleted successfully.`);
            return true;
        } catch (error) {
            console.error('Error deleting connection:', error);
            vscode.window.showErrorMessage(`Failed to delete connection: ${error}`);
            return false;
        }
    }
</boolean></code>
Salin selepas log masuk

Itu sahaja untuk siaran ini. Melalui struktur ini, kami melaksanakan senarai sambungan pangkalan data asas, menambah, memadam dan mengemas kini operasi.

Langkah Seterusnya

Memandangkan kami mempunyai mekanisme konfigurasi pangkalan data asas, seterusnya kami akan berusaha untuk membolehkan keupayaan untuk menyambung kepada konfigurasi tertentu, mendapatkan skema, berbual dengan pangkalan data, dsb. - menggunakan LSP golang.

Atas ialah kandungan terperinci Uruskan Konfigurasi TOML Dari Sambungan VSCode - DBChat Bahagian 8. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan