annotate plugins/dbtables.vim.new @ 4:1a705d7a7521

working on stuff
author luka
date Thu, 23 Oct 2025 12:33:51 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
1a705d7a7521 working on stuff
luka
parents:
diff changeset
1 let g:db_user = "" " Replace with your default database username
1a705d7a7521 working on stuff
luka
parents:
diff changeset
2 let g:db_password = "" " Replace with your default database password
1a705d7a7521 working on stuff
luka
parents:
diff changeset
3 let g:db_name = "" " Replace with your default database name
1a705d7a7521 working on stuff
luka
parents:
diff changeset
4 let g:db_host = "" " Replace with your default database name
1a705d7a7521 working on stuff
luka
parents:
diff changeset
5
1a705d7a7521 working on stuff
luka
parents:
diff changeset
6 let s:popup_table = ""
1a705d7a7521 working on stuff
luka
parents:
diff changeset
7
1a705d7a7521 working on stuff
luka
parents:
diff changeset
8
1a705d7a7521 working on stuff
luka
parents:
diff changeset
9 " Helper function to execute a command and handle errors
1a705d7a7521 working on stuff
luka
parents:
diff changeset
10 function! s:ExecuteShellCommand(command)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
11 let result = system(a:command . ' 2>&1')
1a705d7a7521 working on stuff
luka
parents:
diff changeset
12 if v:shell_error != 0
1a705d7a7521 working on stuff
luka
parents:
diff changeset
13 return [v:false, result]
1a705d7a7521 working on stuff
luka
parents:
diff changeset
14 endif
1a705d7a7521 working on stuff
luka
parents:
diff changeset
15 return [v:true, result]
1a705d7a7521 working on stuff
luka
parents:
diff changeset
16 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
17
1a705d7a7521 working on stuff
luka
parents:
diff changeset
18 function! s:ExecuteDBQuery(query)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
19 let db_user = shellescape(g:db_user)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
20 let db_password = shellescape(g:db_password)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
21 let db_name = shellescape(g:db_name)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
22 let db_host = shellescape(g:db_host)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
23
1a705d7a7521 working on stuff
luka
parents:
diff changeset
24 let command = 'mariadb --user=' . db_user
1a705d7a7521 working on stuff
luka
parents:
diff changeset
25 \ . ' --password=' . db_password
1a705d7a7521 working on stuff
luka
parents:
diff changeset
26 \ . ' --database=' . db_name
1a705d7a7521 working on stuff
luka
parents:
diff changeset
27 \ . ' --host=' . db_host
1a705d7a7521 working on stuff
luka
parents:
diff changeset
28 \ . ' -e ' . shellescape(a:query)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
29
1a705d7a7521 working on stuff
luka
parents:
diff changeset
30 let [success, result] = s:ExecuteShellCommand(command)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
31
1a705d7a7521 working on stuff
luka
parents:
diff changeset
32 if !success
1a705d7a7521 working on stuff
luka
parents:
diff changeset
33 call s:HandleDBError(result, command)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
34 return []
1a705d7a7521 working on stuff
luka
parents:
diff changeset
35 endif
1a705d7a7521 working on stuff
luka
parents:
diff changeset
36 return split(result, "\n")
1a705d7a7521 working on stuff
luka
parents:
diff changeset
37 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
38
1a705d7a7521 working on stuff
luka
parents:
diff changeset
39 function! s:HandleDBError(result, command)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
40 echoerr 'Shell command failed: ' . a:command
1a705d7a7521 working on stuff
luka
parents:
diff changeset
41 echoerr a:result
1a705d7a7521 working on stuff
luka
parents:
diff changeset
42
1a705d7a7521 working on stuff
luka
parents:
diff changeset
43 if a:result =~# 'Access denied'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
44 echoerr 'Authentication error: Check your username and password.'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
45 elseif a:result =~# 'Unknown database'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
46 echoerr 'Database error: The specified database does not exist.'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
47 elseif a:result =~# 'Could not connect'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
48 echoerr 'Connection error: Verify host and network connectivity.'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
49 elseif a:result =~# 'You have an error in your SQL syntax'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
50 echoerr 'Syntax error in SQL query.'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
51 else
1a705d7a7521 working on stuff
luka
parents:
diff changeset
52 echoerr 'Unexpected error: ' . a:result
1a705d7a7521 working on stuff
luka
parents:
diff changeset
53 endif
1a705d7a7521 working on stuff
luka
parents:
diff changeset
54 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
55
1a705d7a7521 working on stuff
luka
parents:
diff changeset
56
1a705d7a7521 working on stuff
luka
parents:
diff changeset
57 " Show the structure/schema of the selected table
1a705d7a7521 working on stuff
luka
parents:
diff changeset
58 function! s:ShowTableSchema(table)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
59 " Open a new tab for schema
1a705d7a7521 working on stuff
luka
parents:
diff changeset
60 tabnew
1a705d7a7521 working on stuff
luka
parents:
diff changeset
61 enew
1a705d7a7521 working on stuff
luka
parents:
diff changeset
62 execute 'file ' . table . '_schema'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
63 " Describe the table structure
1a705d7a7521 working on stuff
luka
parents:
diff changeset
64 let data = s:ExecuteDBQuery('DESCRIBE ' . table . ';')
1a705d7a7521 working on stuff
luka
parents:
diff changeset
65 if len(data) > 0
1a705d7a7521 working on stuff
luka
parents:
diff changeset
66 call append(0, data)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
67 else
1a705d7a7521 working on stuff
luka
parents:
diff changeset
68 call append(0, 'No schema found or an error occurred.')
1a705d7a7521 working on stuff
luka
parents:
diff changeset
69 endif
1a705d7a7521 working on stuff
luka
parents:
diff changeset
70 " Set buffer options and syntax
1a705d7a7521 working on stuff
luka
parents:
diff changeset
71 setlocal filetype=sql buftype=nofile bufhidden=wipe nobuflisted noswapfile nomodifiable
1a705d7a7521 working on stuff
luka
parents:
diff changeset
72 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
73
1a705d7a7521 working on stuff
luka
parents:
diff changeset
74
1a705d7a7521 working on stuff
luka
parents:
diff changeset
75 " Popup selection for table actions
1a705d7a7521 working on stuff
luka
parents:
diff changeset
76 function! s:ShowTablePopup()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
77 " Use Vim popup_menu if available
1a705d7a7521 working on stuff
luka
parents:
diff changeset
78 if exists('*popup_menu')
1a705d7a7521 working on stuff
luka
parents:
diff changeset
79 s:popup_table = getline(line('.'))
1a705d7a7521 working on stuff
luka
parents:
diff changeset
80 let items = ['View Data', 'View Schema', 'Cancel']
1a705d7a7521 working on stuff
luka
parents:
diff changeset
81 popup_menu(items, {})
1a705d7a7521 working on stuff
luka
parents:
diff changeset
82
1a705d7a7521 working on stuff
luka
parents:
diff changeset
83 nnoremap <buffer> <CR> :call <SID>HandlePopupSelection()<CR>
1a705d7a7521 working on stuff
luka
parents:
diff changeset
84 return
1a705d7a7521 working on stuff
luka
parents:
diff changeset
85 endif
1a705d7a7521 working on stuff
luka
parents:
diff changeset
86 " Popup_menu not available
1a705d7a7521 working on stuff
luka
parents:
diff changeset
87 echoerr 'Floating popup requires Vim8.2+.'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
88 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
89
1a705d7a7521 working on stuff
luka
parents:
diff changeset
90 function! s:HandlePopupSelection()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
91 let choice = getline('.')
1a705d7a7521 working on stuff
luka
parents:
diff changeset
92 let table = s:popup_table
1a705d7a7521 working on stuff
luka
parents:
diff changeset
93 call s:ClosePopup()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
94 if choice ==# 'View Data'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
95 call s:OpenTableData(table)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
96 elseif choice ==# 'View Schema'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
97 call s:OpenTableSchema(table)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
98 else
1a705d7a7521 working on stuff
luka
parents:
diff changeset
99 call s:ClosePopup()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
100 endif
1a705d7a7521 working on stuff
luka
parents:
diff changeset
101 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
102
1a705d7a7521 working on stuff
luka
parents:
diff changeset
103 function! s:ClosePopup()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
104 unlet! s:popup_table
1a705d7a7521 working on stuff
luka
parents:
diff changeset
105 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
106
1a705d7a7521 working on stuff
luka
parents:
diff changeset
107
1a705d7a7521 working on stuff
luka
parents:
diff changeset
108 " Modal menu: let user pick Data or Schema from a simple list
1a705d7a7521 working on stuff
luka
parents:
diff changeset
109 function! s:ShowTableMenuModal()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
110 let table = getline(line('.'))
1a705d7a7521 working on stuff
luka
parents:
diff changeset
111 let opts = [ 'Select action for "' . table . '"', 'View Data', 'View Schema', 'Cancel' ]
1a705d7a7521 working on stuff
luka
parents:
diff changeset
112 let choice = inputlist(opts)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
113 if choice == 1
1a705d7a7521 working on stuff
luka
parents:
diff changeset
114 call s:ShowTableData()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
115 elseif choice == 2
1a705d7a7521 working on stuff
luka
parents:
diff changeset
116 call s:ShowTableSchema()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
117 endif
1a705d7a7521 working on stuff
luka
parents:
diff changeset
118 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
119
1a705d7a7521 working on stuff
luka
parents:
diff changeset
120 " Internal: remove any existing dropdown option lines from the DBTables buffer
1a705d7a7521 working on stuff
luka
parents:
diff changeset
121 function! s:ClearTableOptions()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
122 let to_del = []
1a705d7a7521 working on stuff
luka
parents:
diff changeset
123 for lnum in range(1, line('$'))
1a705d7a7521 working on stuff
luka
parents:
diff changeset
124 let ln = getline(lnum)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
125 if ln =~# '^\s\+\(Data\|Schema\)$'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
126 call add(to_del, lnum)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
127 endif
1a705d7a7521 working on stuff
luka
parents:
diff changeset
128 endfor
1a705d7a7521 working on stuff
luka
parents:
diff changeset
129 if !empty(to_del)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
130 for lnum in reverse(to_del)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
131 call deletebufline('%', lnum)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
132 endfor
1a705d7a7521 working on stuff
luka
parents:
diff changeset
133 endif
1a705d7a7521 working on stuff
luka
parents:
diff changeset
134 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
135
1a705d7a7521 working on stuff
luka
parents:
diff changeset
136 " Internal: insert Data/Schema options under the selected table
1a705d7a7521 working on stuff
luka
parents:
diff changeset
137 function! s:InsertTableOptions()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
138 call s:ClearTableOptions()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
139 let tlnum = line('.')
1a705d7a7521 working on stuff
luka
parents:
diff changeset
140 " Insert indented options
1a705d7a7521 working on stuff
luka
parents:
diff changeset
141 call append(tlnum, ' Data')
1a705d7a7521 working on stuff
luka
parents:
diff changeset
142 call append(tlnum+1, ' Schema')
1a705d7a7521 working on stuff
luka
parents:
diff changeset
143 " Move cursor to the 'Data' line
1a705d7a7521 working on stuff
luka
parents:
diff changeset
144 call cursor(tlnum+1, 1)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
145 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
146
1a705d7a7521 working on stuff
luka
parents:
diff changeset
147 " Internal: find the nearest table name above the cursor (first non-indented line)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
148 function! s:GetNearestTableName()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
149 let lnum = line('.')
1a705d7a7521 working on stuff
luka
parents:
diff changeset
150 while lnum > 0
1a705d7a7521 working on stuff
luka
parents:
diff changeset
151 let text = getline(lnum)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
152 if text =~# '^\S'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
153 if text ==# 'Available Tables:'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
154 return ''
1a705d7a7521 working on stuff
luka
parents:
diff changeset
155 endif
1a705d7a7521 working on stuff
luka
parents:
diff changeset
156 return text
1a705d7a7521 working on stuff
luka
parents:
diff changeset
157 endif
1a705d7a7521 working on stuff
luka
parents:
diff changeset
158 let lnum -= 1
1a705d7a7521 working on stuff
luka
parents:
diff changeset
159 endwhile
1a705d7a7521 working on stuff
luka
parents:
diff changeset
160 return ''
1a705d7a7521 working on stuff
luka
parents:
diff changeset
161 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
162
1a705d7a7521 working on stuff
luka
parents:
diff changeset
163
1a705d7a7521 working on stuff
luka
parents:
diff changeset
164 " Open table data for a given table name
1a705d7a7521 working on stuff
luka
parents:
diff changeset
165 function! s:OpenTableData(table)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
166 tabnew
1a705d7a7521 working on stuff
luka
parents:
diff changeset
167 enew
1a705d7a7521 working on stuff
luka
parents:
diff changeset
168 execute 'file ' . a:table
1a705d7a7521 working on stuff
luka
parents:
diff changeset
169 let data = s:ExecuteDBQuery('SELECT * FROM ' . a:table . ';')
1a705d7a7521 working on stuff
luka
parents:
diff changeset
170 if !empty(data)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
171 call append(0, data)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
172 else
1a705d7a7521 working on stuff
luka
parents:
diff changeset
173 call append(0, 'No data found.')
1a705d7a7521 working on stuff
luka
parents:
diff changeset
174 endif
1a705d7a7521 working on stuff
luka
parents:
diff changeset
175 setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nomodifiable
1a705d7a7521 working on stuff
luka
parents:
diff changeset
176 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
177
1a705d7a7521 working on stuff
luka
parents:
diff changeset
178 " Open table schema for a given table name
1a705d7a7521 working on stuff
luka
parents:
diff changeset
179 function! s:OpenTableSchema(table)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
180 tabnew
1a705d7a7521 working on stuff
luka
parents:
diff changeset
181 enew
1a705d7a7521 working on stuff
luka
parents:
diff changeset
182 execute 'file ' . a:table . '_schema'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
183 let data = s:ExecuteDBQuery('DESCRIBE ' . a:table . ';')
1a705d7a7521 working on stuff
luka
parents:
diff changeset
184 if !empty(data)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
185 call append(0, data)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
186 else
1a705d7a7521 working on stuff
luka
parents:
diff changeset
187 call append(0, 'No schema found or an error occurred.')
1a705d7a7521 working on stuff
luka
parents:
diff changeset
188 endif
1a705d7a7521 working on stuff
luka
parents:
diff changeset
189 setlocal filetype=sql buftype=nofile bufhidden=wipe nobuflisted noswapfile nomodifiable
1a705d7a7521 working on stuff
luka
parents:
diff changeset
190 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
191
1a705d7a7521 working on stuff
luka
parents:
diff changeset
192 function! s:OpenDBTablesWindow()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
193 " Open a new vertical split window
1a705d7a7521 working on stuff
luka
parents:
diff changeset
194 execute '34 vsplit'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
195 " Create a new buffer
1a705d7a7521 working on stuff
luka
parents:
diff changeset
196 enew
1a705d7a7521 working on stuff
luka
parents:
diff changeset
197 " Set buffer name to "DBTables"
1a705d7a7521 working on stuff
luka
parents:
diff changeset
198 file DBTables
1a705d7a7521 working on stuff
luka
parents:
diff changeset
199
1a705d7a7521 working on stuff
luka
parents:
diff changeset
200 let tables = s:ExecuteDBQuery("SHOW TABLES;")
1a705d7a7521 working on stuff
luka
parents:
diff changeset
201 if empty(tables)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
202 echo "No tables found or an error occurred."
1a705d7a7521 working on stuff
luka
parents:
diff changeset
203 return
1a705d7a7521 working on stuff
luka
parents:
diff changeset
204 endif
1a705d7a7521 working on stuff
luka
parents:
diff changeset
205
1a705d7a7521 working on stuff
luka
parents:
diff changeset
206 " Display the tables in the buffer
1a705d7a7521 working on stuff
luka
parents:
diff changeset
207 call append(0, 'Available Tables:')
1a705d7a7521 working on stuff
luka
parents:
diff changeset
208 call remove(tables, 0)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
209 for table in tables
1a705d7a7521 working on stuff
luka
parents:
diff changeset
210 call append('$', table)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
211 endfor
1a705d7a7521 working on stuff
luka
parents:
diff changeset
212
1a705d7a7521 working on stuff
luka
parents:
diff changeset
213 " Set buffer options
1a705d7a7521 working on stuff
luka
parents:
diff changeset
214 setlocal buftype=nofile
1a705d7a7521 working on stuff
luka
parents:
diff changeset
215 setlocal bufhidden=wipe
1a705d7a7521 working on stuff
luka
parents:
diff changeset
216 setlocal nobuflisted
1a705d7a7521 working on stuff
luka
parents:
diff changeset
217 setlocal noswapfile
1a705d7a7521 working on stuff
luka
parents:
diff changeset
218 setlocal nomodifiable
1a705d7a7521 working on stuff
luka
parents:
diff changeset
219 setlocal nonumber
1a705d7a7521 working on stuff
luka
parents:
diff changeset
220 setlocal norelativenumber
1a705d7a7521 working on stuff
luka
parents:
diff changeset
221 setlocal winfixwidth
1a705d7a7521 working on stuff
luka
parents:
diff changeset
222
1a705d7a7521 working on stuff
luka
parents:
diff changeset
223 " Map <Enter> to a modal menu (data or schema)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
224 nnoremap <buffer> <CR> :call <SID>ShowTablePopup()<CR>
1a705d7a7521 working on stuff
luka
parents:
diff changeset
225 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
226
1a705d7a7521 working on stuff
luka
parents:
diff changeset
227
1a705d7a7521 working on stuff
luka
parents:
diff changeset
228 function! s:ShowTableData()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
229 " Get the current line (table name)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
230 let lnum = line('.')
1a705d7a7521 working on stuff
luka
parents:
diff changeset
231 let table_name = getline(lnum)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
232
1a705d7a7521 working on stuff
luka
parents:
diff changeset
233 " Open a new tab and create a new buffer
1a705d7a7521 working on stuff
luka
parents:
diff changeset
234 tabnew
1a705d7a7521 working on stuff
luka
parents:
diff changeset
235 enew
1a705d7a7521 working on stuff
luka
parents:
diff changeset
236 " Set buffer name to the table name
1a705d7a7521 working on stuff
luka
parents:
diff changeset
237 execute 'file ' . table_name
1a705d7a7521 working on stuff
luka
parents:
diff changeset
238
1a705d7a7521 working on stuff
luka
parents:
diff changeset
239 let data = s:ExecuteDBQuery("SELECT * FROM " . table_name . ";")
1a705d7a7521 working on stuff
luka
parents:
diff changeset
240
1a705d7a7521 working on stuff
luka
parents:
diff changeset
241 " Display the table data in the buffer
1a705d7a7521 working on stuff
luka
parents:
diff changeset
242 if len(data) > 0
1a705d7a7521 working on stuff
luka
parents:
diff changeset
243 call append(0, data)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
244 else
1a705d7a7521 working on stuff
luka
parents:
diff changeset
245 call append(0, 'No data found.')
1a705d7a7521 working on stuff
luka
parents:
diff changeset
246 endif
1a705d7a7521 working on stuff
luka
parents:
diff changeset
247
1a705d7a7521 working on stuff
luka
parents:
diff changeset
248 " Set buffer options
1a705d7a7521 working on stuff
luka
parents:
diff changeset
249 setlocal buftype=nofile
1a705d7a7521 working on stuff
luka
parents:
diff changeset
250 setlocal bufhidden=wipe
1a705d7a7521 working on stuff
luka
parents:
diff changeset
251 setlocal nobuflisted
1a705d7a7521 working on stuff
luka
parents:
diff changeset
252 setlocal noswapfile
1a705d7a7521 working on stuff
luka
parents:
diff changeset
253 setlocal nomodifiable
1a705d7a7521 working on stuff
luka
parents:
diff changeset
254 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
255
1a705d7a7521 working on stuff
luka
parents:
diff changeset
256 let s:query_history = []
1a705d7a7521 working on stuff
luka
parents:
diff changeset
257
1a705d7a7521 working on stuff
luka
parents:
diff changeset
258 function! s:ExecuteSQLQuery()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
259 " Get the content of the current buffer (SQL query)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
260 let query = join(getline(1, '$'), " ")
1a705d7a7521 working on stuff
luka
parents:
diff changeset
261
1a705d7a7521 working on stuff
luka
parents:
diff changeset
262 " Append the query to history
1a705d7a7521 working on stuff
luka
parents:
diff changeset
263 call add(s:query_history, query)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
264
1a705d7a7521 working on stuff
luka
parents:
diff changeset
265 let data = s:ExecuteDBQuery(query)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
266
1a705d7a7521 working on stuff
luka
parents:
diff changeset
267 tabnew
1a705d7a7521 working on stuff
luka
parents:
diff changeset
268 enew
1a705d7a7521 working on stuff
luka
parents:
diff changeset
269 execute 'file SQLQueryResult'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
270 call append(0, data)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
271
1a705d7a7521 working on stuff
luka
parents:
diff changeset
272 " Set the buffer file type to SQL for syntax highlighting
1a705d7a7521 working on stuff
luka
parents:
diff changeset
273 setlocal filetype=sql
1a705d7a7521 working on stuff
luka
parents:
diff changeset
274
1a705d7a7521 working on stuff
luka
parents:
diff changeset
275 setlocal buftype=nofile
1a705d7a7521 working on stuff
luka
parents:
diff changeset
276 setlocal bufhidden=wipe
1a705d7a7521 working on stuff
luka
parents:
diff changeset
277 setlocal nobuflisted
1a705d7a7521 working on stuff
luka
parents:
diff changeset
278 setlocal noswapfile
1a705d7a7521 working on stuff
luka
parents:
diff changeset
279 setlocal nomodifiable
1a705d7a7521 working on stuff
luka
parents:
diff changeset
280 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
281
1a705d7a7521 working on stuff
luka
parents:
diff changeset
282 " Execute SQL from a visual selection
1a705d7a7521 working on stuff
luka
parents:
diff changeset
283 function! s:ExecuteVisualSQLQuery() range
1a705d7a7521 working on stuff
luka
parents:
diff changeset
284 " Get the content of the selected lines as a single SQL query
1a705d7a7521 working on stuff
luka
parents:
diff changeset
285 let lines = getline(a:firstline, a:lastline)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
286 let query = join(lines, " ")
1a705d7a7521 working on stuff
luka
parents:
diff changeset
287
1a705d7a7521 working on stuff
luka
parents:
diff changeset
288 " Append the query to history
1a705d7a7521 working on stuff
luka
parents:
diff changeset
289 call add(s:query_history, query)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
290
1a705d7a7521 working on stuff
luka
parents:
diff changeset
291 " Execute the query and capture results
1a705d7a7521 working on stuff
luka
parents:
diff changeset
292 let data = s:ExecuteDBQuery(query)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
293
1a705d7a7521 working on stuff
luka
parents:
diff changeset
294 " Open results in a new tab
1a705d7a7521 working on stuff
luka
parents:
diff changeset
295 tabnew
1a705d7a7521 working on stuff
luka
parents:
diff changeset
296 enew
1a705d7a7521 working on stuff
luka
parents:
diff changeset
297 execute 'file SQLQueryResult'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
298 call append(0, data)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
299
1a705d7a7521 working on stuff
luka
parents:
diff changeset
300 " Set buffer options and highlight
1a705d7a7521 working on stuff
luka
parents:
diff changeset
301 setlocal filetype=sql
1a705d7a7521 working on stuff
luka
parents:
diff changeset
302 setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nomodifiable
1a705d7a7521 working on stuff
luka
parents:
diff changeset
303 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
304
1a705d7a7521 working on stuff
luka
parents:
diff changeset
305 function! s:OpenQueryHistory()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
306 " Open the query history in a new split window
1a705d7a7521 working on stuff
luka
parents:
diff changeset
307 execute 'vsplit'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
308 enew
1a705d7a7521 working on stuff
luka
parents:
diff changeset
309 call setline(1, s:query_history)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
310
1a705d7a7521 working on stuff
luka
parents:
diff changeset
311 " Allow selecting a query to be put into a new buffer to execute
1a705d7a7521 working on stuff
luka
parents:
diff changeset
312 nnoremap <buffer> <CR> :call <SID>ExecuteHistoryQuery(line('.'))<CR>
1a705d7a7521 working on stuff
luka
parents:
diff changeset
313
1a705d7a7521 working on stuff
luka
parents:
diff changeset
314 " Set buffer options
1a705d7a7521 working on stuff
luka
parents:
diff changeset
315 setlocal buftype=nofile
1a705d7a7521 working on stuff
luka
parents:
diff changeset
316 setlocal bufhidden=wipe
1a705d7a7521 working on stuff
luka
parents:
diff changeset
317 setlocal nobuflisted
1a705d7a7521 working on stuff
luka
parents:
diff changeset
318 setlocal noswapfile
1a705d7a7521 working on stuff
luka
parents:
diff changeset
319 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
320
1a705d7a7521 working on stuff
luka
parents:
diff changeset
321 function! s:ExecuteHistoryQuery(lnum)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
322 " Execute the selected query from history
1a705d7a7521 working on stuff
luka
parents:
diff changeset
323 let query = getline(a:lnum)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
324 execute 'normal! i' . query
1a705d7a7521 working on stuff
luka
parents:
diff changeset
325 " Optionally call the execute function directly or process
1a705d7a7521 working on stuff
luka
parents:
diff changeset
326 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
327
1a705d7a7521 working on stuff
luka
parents:
diff changeset
328
1a705d7a7521 working on stuff
luka
parents:
diff changeset
329 function! DBConsole()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
330 " Save the current cursor position
1a705d7a7521 working on stuff
luka
parents:
diff changeset
331 let save_cursor = getpos(".")
1a705d7a7521 working on stuff
luka
parents:
diff changeset
332
1a705d7a7521 working on stuff
luka
parents:
diff changeset
333 "Format the files
1a705d7a7521 working on stuff
luka
parents:
diff changeset
334 let db_user = g:db_user
1a705d7a7521 working on stuff
luka
parents:
diff changeset
335 let db_password = g:db_password
1a705d7a7521 working on stuff
luka
parents:
diff changeset
336 let db_name = g:db_name
1a705d7a7521 working on stuff
luka
parents:
diff changeset
337 " let db_host = shellescape(g:db_host)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
338 let db_host = g:db_host
1a705d7a7521 working on stuff
luka
parents:
diff changeset
339
1a705d7a7521 working on stuff
luka
parents:
diff changeset
340
1a705d7a7521 working on stuff
luka
parents:
diff changeset
341
1a705d7a7521 working on stuff
luka
parents:
diff changeset
342 let command = 'mariadb --user=' . db_user . ' --password=' . db_password . ' --database=' . db_name . ' --host=' . db_host . ' '
1a705d7a7521 working on stuff
luka
parents:
diff changeset
343 let command = substitute(command, '\n', '', 'g')
1a705d7a7521 working on stuff
luka
parents:
diff changeset
344 execute ':term ' . command
1a705d7a7521 working on stuff
luka
parents:
diff changeset
345 call setpos(".", save_cursor)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
346 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
347
1a705d7a7521 working on stuff
luka
parents:
diff changeset
348 function! OpenMariaDBConsole()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
349 " The command to connect to MariaDB. Customize it with your actual connection details.
1a705d7a7521 working on stuff
luka
parents:
diff changeset
350 let cmd = 'mariadb -u your_username -p your_database_name'
1a705d7a7521 working on stuff
luka
parents:
diff changeset
351
1a705d7a7521 working on stuff
luka
parents:
diff changeset
352 " Open a new terminal window at the bottom with 10 lines height.
1a705d7a7521 working on stuff
luka
parents:
diff changeset
353 " Split the window horizontally; you can adjust the height by changing `10`.
1a705d7a7521 working on stuff
luka
parents:
diff changeset
354 botright 10split
1a705d7a7521 working on stuff
luka
parents:
diff changeset
355 call termopen(cmd)
1a705d7a7521 working on stuff
luka
parents:
diff changeset
356 endfunction
1a705d7a7521 working on stuff
luka
parents:
diff changeset
357
1a705d7a7521 working on stuff
luka
parents:
diff changeset
358 " Keybinding to open query history
1a705d7a7521 working on stuff
luka
parents:
diff changeset
359 nnoremap <Leader>qh :call <SID>OpenQueryHistory()<CR>
1a705d7a7521 working on stuff
luka
parents:
diff changeset
360 nnoremap <Leader>db :call DBConsole()<cr>
1a705d7a7521 working on stuff
luka
parents:
diff changeset
361
1a705d7a7521 working on stuff
luka
parents:
diff changeset
362 command! DBTables call s:OpenDBTablesWindow()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
363 command! ExecuteSQL call s:ExecuteSQLQuery()
1a705d7a7521 working on stuff
luka
parents:
diff changeset
364
1a705d7a7521 working on stuff
luka
parents:
diff changeset
365 " Function to refresh the list of tables
1a705d7a7521 working on stuff
luka
parents:
diff changeset
366 nnoremap <Leader>rt :DBTables<CR>
1a705d7a7521 working on stuff
luka
parents:
diff changeset
367
1a705d7a7521 working on stuff
luka
parents:
diff changeset
368 " Function to execute the contents of the current buffer as an SQL query
1a705d7a7521 working on stuff
luka
parents:
diff changeset
369 nnoremap <Leader>eq :ExecuteSQL<CR>
1a705d7a7521 working on stuff
luka
parents:
diff changeset
370
1a705d7a7521 working on stuff
luka
parents:
diff changeset
371 " Function to open the database tables window
1a705d7a7521 working on stuff
luka
parents:
diff changeset
372 nnoremap <Leader>dt :DBTables<CR>
1a705d7a7521 working on stuff
luka
parents:
diff changeset
373
1a705d7a7521 working on stuff
luka
parents:
diff changeset
374 " Optional: Shortcut to open MariaDB console
1a705d7a7521 working on stuff
luka
parents:
diff changeset
375 nnoremap <Leader>mc :call DBConsole()<CR>
1a705d7a7521 working on stuff
luka
parents:
diff changeset
376 " Map visual selection to execute selected SQL
1a705d7a7521 working on stuff
luka
parents:
diff changeset
377 xnoremap <silent> <Leader>ev :call <SID>ExecuteVisualSQLQuery()<CR>