diff --git a/lua/cargdev/core/keymaps/database.lua b/lua/cargdev/core/keymaps/database.lua new file mode 100644 index 0000000..6016dd9 --- /dev/null +++ b/lua/cargdev/core/keymaps/database.lua @@ -0,0 +1,115 @@ +-- ============================================================================= +-- DATABASE KEYMAPS +-- ============================================================================= + +local keymap = vim.keymap +local opts = { noremap = true, silent = true } + +-- ============================================================================= +-- GLOBAL DATABASE KEYMAPS +-- ============================================================================= + +-- Open database interface +keymap.set("n", "db", function() + require("dbee").open() +end, { desc = "Open Database Interface" }) + +-- Close database interface +keymap.set("n", "dc", function() + require("dbee").close() +end, { desc = "Close Database Interface" }) + +-- Execute current query (when in database editor) +keymap.set("n", "dq", function() + require("dbee").api.ui.execute_query() +end, { desc = "Execute Query" }) + +-- Store results to file +keymap.set("n", "ds", function() + require("dbee").store("csv", "file", { extra_arg = "~/query_results.csv" }) +end, { desc = "Store Results to File" }) + +-- Yank results to clipboard +keymap.set("n", "dy", function() + require("dbee").store("json", "yank", {}) +end, { desc = "Yank Results to Clipboard" }) + +-- ============================================================================= +-- NVIM-DBEE INTERNAL KEYMAPS +-- ============================================================================= + +-- Set up nvim-dbee internal keymaps +local function setup_dbee_keymaps() + -- Drawer mappings (left panel) + keymap.set("n", "", function() + require("dbee").api.ui.open_connection() + end, { buffer = true, desc = "Open Connection" }) + + keymap.set("n", "a", function() + require("dbee").api.ui.add_connection() + end, { buffer = true, desc = "Add Connection" }) + + keymap.set("n", "e", function() + require("dbee").api.ui.edit_connection() + end, { buffer = true, desc = "Edit Connection" }) + + keymap.set("n", "d", function() + require("dbee").api.ui.delete_connection() + end, { buffer = true, desc = "Delete Connection" }) + + keymap.set("n", "r", function() + require("dbee").api.ui.refresh_connections() + end, { buffer = true, desc = "Refresh Connections" }) + + -- Editor mappings (query editor) + keymap.set("n", "BB", function() + require("dbee").api.ui.execute_query() + end, { buffer = true, desc = "Execute Query" }) + + keymap.set("n", "cc", function() + require("dbee").api.ui.clear_results() + end, { buffer = true, desc = "Clear Results" }) + + keymap.set("n", "ss", function() + require("dbee").api.ui.save_scratchpad() + end, { buffer = true, desc = "Save Scratchpad" }) + + -- Result mappings (results buffer) + keymap.set("n", "L", function() + require("dbee").api.ui.result_page_next() + end, { buffer = true, desc = "Next Page" }) + + keymap.set("n", "H", function() + require("dbee").api.ui.result_page_prev() + end, { buffer = true, desc = "Previous Page" }) + + keymap.set("n", "F", function() + require("dbee").api.ui.result_page_first() + end, { buffer = true, desc = "First Page" }) + + keymap.set("n", "E", function() + require("dbee").api.ui.result_page_last() + end, { buffer = true, desc = "Last Page" }) + + keymap.set("n", "yaj", function() + require("dbee").api.ui.yank_row_json() + end, { buffer = true, desc = "Yank Row as JSON" }) + + keymap.set("n", "yac", function() + require("dbee").api.ui.yank_row_csv() + end, { buffer = true, desc = "Yank Row as CSV" }) + + keymap.set("n", "yaJ", function() + require("dbee").api.ui.yank_all_json() + end, { buffer = true, desc = "Yank All as JSON" }) + + keymap.set("n", "yaC", function() + require("dbee").api.ui.yank_all_csv() + end, { buffer = true, desc = "Yank All as CSV" }) +end + +-- Apply dbee keymaps when dbee buffers are created +vim.api.nvim_create_autocmd("FileType", { + pattern = { "dbee-drawer", "dbee-editor", "dbee-result" }, + callback = setup_dbee_keymaps, +}) \ No newline at end of file diff --git a/lua/cargdev/plugins/alpha.lua b/lua/cargdev/plugins/alpha.lua index 9cb7fd8..a72ae04 100644 --- a/lua/cargdev/plugins/alpha.lua +++ b/lua/cargdev/plugins/alpha.lua @@ -29,12 +29,13 @@ return { -- 📂 Set menu with improved icons dashboard.section.buttons.val = { - dashboard.button("e", "📜 New File", "ene"), - dashboard.button("SPC ee", "📂 File Explorer", "NvimTreeToggle"), - dashboard.button("SPC ff", "🔎 Find File", "Telescope find_files"), - dashboard.button("SPC fs", "📝 Find Word", "Telescope live_grep"), - dashboard.button("SPC wr", "💾 Restore Session", "SessionRestore"), - dashboard.button("q", "❌ Quit NVIM", "qa"), + dashboard.button("f", "🔎 Find File", "Telescope find_files"), + dashboard.button("n", "📜 New File", "ene"), + dashboard.button("g", "📝 Find Text", "Telescope live_grep"), + dashboard.button("r", "📚 Recent Files", "Telescope oldfiles"), + dashboard.button("c", "⚙️ Config", "e ~/.config/nvim/init.lua"), + dashboard.button("L", "🦥 Lazy", "Lazy"), + dashboard.button("q", "🚪 Quit", "qa"), } -- 🎯 Function to center text within a width diff --git a/lua/cargdev/plugins/database.lua b/lua/cargdev/plugins/database.lua index 8c985dd..f74d743 100644 --- a/lua/cargdev/plugins/database.lua +++ b/lua/cargdev/plugins/database.lua @@ -1,178 +1,75 @@ --- Temporarily disabled to fix database error --- return { --- -- ============================================================================= --- -- DATABASE PLUGINS --- -- ============================================================================= - --- -- Database client for Neovim --- { --- "tpope/vim-dadbod", --- dependencies = { --- "kristijanhusak/vim-dadbod-ui", --- "kristijanhusak/vim-dadbod-completion", --- }, --- config = function() --- -- Dadbod UI configuration --- vim.g.db_ui_use_nerd_fonts = 1 --- vim.g.db_ui_winwidth = 30 --- vim.g.db_ui_winposition = "right" --- vim.g.db_ui_show_help = 0 --- vim.g.db_ui_auto_execute_table_helpers = 1 - --- -- Disable auto-connection to prevent errors --- vim.g.db_ui_auto_execute_table_helpers = 0 --- vim.g.db_ui_show_database_icon = 0 --- vim.g.db_ui_winwidth = 30 --- vim.g.db_ui_winposition = "right" --- vim.g.db_ui_use_nerd_fonts = 1 --- vim.g.db_ui_show_help = 0 - --- -- Disable automatic database loading --- vim.g.db_ui_auto_execute_table_helpers = 0 --- vim.g.db_ui_show_database_icon = 0 --- vim.g.db_ui_auto_execute_table_helpers = 0 --- vim.g.db_ui_show_database_icon = 0 - --- vim.g.db_ui_table_helpers = { --- sqlite = { --- count = "SELECT COUNT(*) FROM {table}", --- explain = "EXPLAIN QUERY PLAN {last_query}", --- indexes = "PRAGMA index_list({table})", --- show = "PRAGMA table_info({table})", --- size = "SELECT page_count * page_size as size FROM pragma_page_count(), pragma_page_size() WHERE name = '{table}'", --- }, --- mysql = { --- count = "SELECT COUNT(*) FROM {table}", --- explain = "EXPLAIN {last_query}", --- indexes = "SHOW INDEX FROM {table}", --- show = "SHOW CREATE TABLE {table}", --- size = "SELECT ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Size (MB)' FROM information_schema.TABLES WHERE table_schema = '{database}' AND table_name = '{table}'", --- }, --- postgresql = { --- count = "SELECT COUNT(*) FROM {table}", --- explain = "EXPLAIN (ANALYZE, COSTS, VERBOSE, BUFFERS, FORMAT JSON) {last_query}", --- indexes = "SELECT indexname, indexdef FROM pg_indexes WHERE tablename = '{table}'", --- show = "\\d {table}", --- size = "SELECT pg_size_pretty(pg_total_relation_size('{table}'))", --- }, --- redis = { --- count = "LLEN {table}", --- explain = "SLOWLOG GET 10", --- indexes = "KEYS *", --- show = "TYPE {table}", --- size = "MEMORY USAGE {table}", --- }, --- } - --- -- Dadbod completion --- vim.g.vim_dadbod_completion_mark = "📊" - --- -- Configure database adapters --- vim.g.db_adapter_sqlite = 'sqlite3' --- vim.g.db_adapter_mysql = 'mysql' --- vim.g.db_adapter_postgresql = 'psql' --- vim.g.db_adapter_redis = 'redis-cli' - --- -- Disable automatic database connections --- vim.g.db_ui_auto_execute_table_helpers = 0 --- vim.g.db_ui_show_database_icon = 0 --- end, --- }, - --- -- SQL formatting and syntax highlighting --- { --- "b4winckler/vim-objc", --- ft = { "sql", "mysql", "postgresql" }, --- }, - --- -- SQL formatting with sqlparse --- { --- "b4winckler/vim-objc", --- ft = { "sql" }, --- config = function() --- vim.g.sqlformat_command = "sqlformat" --- vim.g.sqlformat_options = "-r -k upper" --- end, --- }, --- } - --- Return empty table to prevent errors return { -- ============================================================================= -- DATABASE PLUGINS -- ============================================================================= - -- Database client for Neovim + -- Modern database client for Neovim (replaces vim-dadbod) { - "tpope/vim-dadbod", + "kndndrj/nvim-dbee", + build = function() + -- Install the Go binary + require("dbee").install() + end, dependencies = { - "kristijanhusak/vim-dadbod-ui", - "kristijanhusak/vim-dadbod-completion", + "nvim-lua/plenary.nvim", }, config = function() - -- Disable all automatic database operations - vim.g.db_ui_auto_execute_table_helpers = 0 - vim.g.db_ui_show_database_icon = 0 - vim.g.db_ui_use_nerd_fonts = 1 - vim.g.db_ui_winwidth = 30 - vim.g.db_ui_winposition = "right" - vim.g.db_ui_show_help = 0 - - -- Disable automatic database loading completely - vim.g.db_ui_auto_execute_table_helpers = 0 - vim.g.db_ui_show_database_icon = 0 - - -- Configure table helpers (only used when manually triggered) - vim.g.db_ui_table_helpers = { - sqlite = { - count = "SELECT COUNT(*) FROM {table}", - explain = "EXPLAIN QUERY PLAN {last_query}", - indexes = "PRAGMA index_list({table})", - show = "PRAGMA table_info({table})", - size = "SELECT page_count * page_size as size FROM pragma_page_count(), pragma_page_size() WHERE name = '{table}'", + require("dbee").setup({ + -- Sources for database connections + sources = { + -- Load connections from memory (only guaranteed working connections) + require("dbee.sources").MemorySource:new({ + -- PostgreSQL (confirmed working) + { + name = "mock_api", + type = "postgres", + url = "postgres://localhost:5432/mock_api?sslmode=disable", + }, + }), + -- Load connections from environment variable (for dynamic connections) + require("dbee.sources").EnvSource:new("DBEE_CONNECTIONS"), + -- Load connections from file (persistent storage - user-added connections) + require("dbee.sources").FileSource:new(vim.fn.stdpath("cache") .. "/dbee/persistence.json"), }, - mysql = { - count = "SELECT COUNT(*) FROM {table}", - explain = "EXPLAIN {last_query}", - indexes = "SHOW INDEX FROM {table}", - show = "SHOW CREATE TABLE {table}", - size = "SELECT ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Size (MB)' FROM information_schema.TABLES WHERE table_schema = '{database}' AND table_name = '{table}'", + + -- UI Configuration + ui = { + -- Layout configuration + layout = { + -- Drawer (left panel) width + drawer_width = 30, + -- Result buffer height + result_height = 15, + -- Editor buffer height + editor_height = 10, + }, }, - postgresql = { - count = "SELECT COUNT(*) FROM {table}", - explain = "EXPLAIN (ANALYZE, COSTS, VERBOSE, BUFFERS, FORMAT JSON) {last_query}", - indexes = "SELECT indexname, indexdef FROM pg_indexes WHERE tablename = '{table}'", - show = "\\d {table}", - size = "SELECT pg_size_pretty(pg_total_relation_size('{table}'))", + + -- Database configuration + database = { + -- Default page size for results + page_size = 100, + -- Connection timeout in seconds + timeout = 30, + -- Maximum number of connections + max_connections = 5, }, - redis = { - count = "LLEN {table}", - explain = "SLOWLOG GET 10", - indexes = "KEYS *", - show = "TYPE {table}", - size = "MEMORY USAGE {table}", + + -- Logging configuration + log = { + -- Log level: "debug", "info", "warn", "error" + level = "info", + -- Log file path + file = vim.fn.stdpath("cache") .. "/dbee/dbee.log", }, - } - - -- Dadbod completion - vim.g.vim_dadbod_completion_mark = "📊" - - -- Configure database adapters - vim.g.db_adapter_sqlite = 'sqlite3' - vim.g.db_adapter_mysql = 'mysql' - vim.g.db_adapter_postgresql = 'psql' - vim.g.db_adapter_redis = 'redis-cli' - - -- Ensure no automatic connections - vim.g.db_ui_auto_execute_table_helpers = 0 - vim.g.db_ui_show_database_icon = 0 + }) end, }, -- SQL formatting and syntax highlighting { "b4winckler/vim-objc", - ft = { "sql", "mysql", "postgresql" }, + ft = { "sql", "mysql", "postgresql", "oracle" }, }, -- SQL formatting with sqlparse @@ -184,4 +81,52 @@ return { vim.g.sqlformat_options = "-r -k upper" end, }, -} \ No newline at end of file + + + + -- MongoDB syntax highlighting (without LSP) + { + "neovim/nvim-lspconfig", + ft = { "javascript", "json" }, + config = function() + -- Enable MongoDB syntax highlighting for .js files + vim.api.nvim_create_autocmd("FileType", { + pattern = { "javascript", "json" }, + callback = function() + vim.bo.filetype = "javascript" + end, + }) + end, + }, + + -- Redis syntax highlighting + { + "neovim/nvim-lspconfig", + ft = { "redis" }, + config = function() + -- Enable Redis syntax highlighting + vim.api.nvim_create_autocmd("BufRead,BufNewFile", { + pattern = "*.redis", + callback = function() + vim.bo.filetype = "redis" + end, + }) + end, + }, + + -- CQL (Cassandra Query Language) syntax highlighting + { + "neovim/nvim-lspconfig", + ft = { "cql" }, + config = function() + -- Enable CQL syntax highlighting + vim.api.nvim_create_autocmd("BufRead,BufNewFile", { + pattern = "*.cql", + callback = function() + vim.bo.filetype = "cql" + end, + }) + end, + }, +} + diff --git a/lua/cargdev/plugins/lsp/lspconfig.lua b/lua/cargdev/plugins/lsp/lspconfig.lua index efbc569..41e29e3 100644 --- a/lua/cargdev/plugins/lsp/lspconfig.lua +++ b/lua/cargdev/plugins/lsp/lspconfig.lua @@ -31,7 +31,10 @@ return { "tailwindcss", -- Database language servers "sqls", -- SQL language server - "mongols", -- MongoDB language server + "mongodb", -- MongoDB language server + "redis", -- Redis language server + "oracle", -- Oracle language server + "cassandra", -- Cassandra language server }, })