diff --git a/README.markdown b/README.markdown index 6f791c1..e6dc5c1 100644 --- a/README.markdown +++ b/README.markdown @@ -16,6 +16,7 @@ take on [dbext.vim][], improving on it on the following ways: - PostgreSQL - Presto - Redis + - Snowflake - SQL Server - SQLite - Your own easily implemented adapter diff --git a/autoload/db/adapter/snowflake.vim b/autoload/db/adapter/snowflake.vim new file mode 100644 index 0000000..c364172 --- /dev/null +++ b/autoload/db/adapter/snowflake.vim @@ -0,0 +1,55 @@ +if exists('g:autoloaded_db_snowflake') + finish +endif +let g:autoloaded_db_snowflake = 1 + +function! s:command_for_url(params) abort + let cmd = 'snowsql' + for [k, v] in items(a:params) + let cmd .= ' --'.k.' '.v + endfor + return cmd +endfunction + +function! s:params(url) abort + if stridx(a:url, 'connection') > 0 + let conn_string = split(a:url, "=")[1] + let conn_params = {'connection': conn_string} + return conn_params + endif + let parsed_params = db#url#parse(a:url) + let conn_params = parsed_params.params + if has_key(parsed_params, 'host') + let accountname = split(parsed_params.host, '\.')[0] + let conn_params.accountname = accountname + endif + return conn_params +endfunction + +function! db#adapter#snowflake#interactive(url) abort + echomsg "starting snowsql. executing query" + return s:command_for_url(s:params(a:url)) +endfunction + +function! db#adapter#snowflake#input_flag() abort + return ' -f ' +endfunction + +function! db#adapter#snowflake#complete_opaque(url) abort + return db#adapter#snowflake#complete_database(url) +endfunction + +function! db#adapter#snowflake#complete_database(url) abort + let cmd = s:command_for_url(s:params(a:url)) + let cmd .= ' --query "show databases"' + let out = system(cmd) + let dbs = [] + for i in split(out, "\n")[6:-1] + let dbname = split(i, "|") + if len(dbname) > 2 + call add(dbs, trim(dbname[1])) + endif + endfor + return dbs +endfunction + diff --git a/doc/dadbod.txt b/doc/dadbod.txt index b758c2e..b51537d 100644 --- a/doc/dadbod.txt +++ b/doc/dadbod.txt @@ -136,7 +136,15 @@ Redis ~ Redis doesn't have a username, so use a dummy one in the URL if a password is required. - *dadbod-sqlserver* + *dadbod-snowflake* +Snowflake +> + snowflake://[.snowflakecomputing.com]/?[username=&dbname=&warehouse=] + snowflake:connection=[] +< +SnowSQL doesn't allow password as a parameter. Check snowsql documentation. + + *dadbod-sqlserver* SQL Server ~ > sqlserver://[[:]@][][:]/[]