Project

General

Profile

1
#!/bin/bash -e
2
. "$(dirname "${BASH_SOURCE[0]}")"/util.sh
3

    
4
if self_not_included; then
5

    
6
# using prefixed connection vars
7
alias use_local='declare prefix=local_; import_vars; unset prefix'
8
alias use_remote='declare prefix=remote_; import_vars; unset prefix'
9
alias use_local_remote='{ use_local; use_remote; }'
10
	# *must* be run inside a function
11

    
12
quote='"'
13

    
14
esc_name() { echo "$quote${1//$quote/$quote$quote}$quote"; }
15

    
16
mk_esc_name_alias() # usage: mk_esc_name_alias schema_esc
17
{ alias mk_"$1"='declare '"$1"'="${'"$1"':-$(esc_name "$'"${1%_esc}"'")}"; '\
18
'echo_vars '"$1"; }
19

    
20
mk_esc_name_alias schema_esc
21
mk_esc_name_alias table_esc
22

    
23
fi # load new aliases
24
if self_being_included; then
25

    
26
limit() # usage: query... $([prefix=$'| |\n'] limit)
27
{
28
	echo_func; kw_params prefix; local prefix="${prefix-
29
}"
30
	echo -n "${limit:+${prefix}LIMIT $limit}"
31
}
32

    
33
mk_select() # usage: {query=... | table=... [cols=...] [filter=...]} mk_select
34
{
35
	echo_func; kw_params query table cols filter; mk_table_esc
36
	echo "$(rtrim "${query:-SELECT ${cols:-*} ${cols:+
37
}FROM $table_esc
38
${filter:+WHERE $filter
39
}}")\
40
$(limit)"
41
}
42

    
43
# export func usage: export_func() { ...; mk_select_var; ... }
44
# caller usage: {query=... | table=... [cols=...] [filter=...]} export_func
45
# cmd line usage: [limit=...] caller
46
alias mk_select_var='declare query="$(mk_select)"'
47

    
48
fi # load new aliases
49
if self_being_included; then
50

    
51
mk_drop() # usage: table=... mk_drop|*sql_ANSI
52
{
53
	log++; echo_func; kw_params table; : "${table?}"; mk_table_esc
54
	echo "DROP TABLE IF EXISTS $table_esc"
55
}
56

    
57
mk_truncate() # usage: table=... mk_truncate|*sql_ANSI
58
{
59
	log++; echo_func; kw_params table; : "${table?}"; mk_table_esc
60
	echo "TRUNCATE $table_esc"
61
}
62

    
63

    
64
### MySQL
65

    
66
alias set_database=\
67
'if test "$schema"; then declare database="${database-$schema}"; fi'
68

    
69
fi # load new aliases
70
if self_being_included; then
71

    
72
# usage: mysql*() { ...; mysql_cmd "$@"; } (with alias)
73
function mysql_cmd() # usage: mysql*() { ...; mysql_cmd cmd "$@"; }
74
# auto-adds connection/login opts when specified
75
{
76
	echo_func
77
	local cmd="$1"; shift
78
	local ssh_server="$(localize_url "$ssh_server")"
79
	local server="$(localize_url "$server")"
80
	if test "$ssh_server"; then
81
		local ssh_dest="${ssh_dest-${ssh_user:+$ssh_user@}$ssh_server}"
82
	fi
83
	
84
	local var=ssh_dest; local_inv
85
	command ${ssh_dest:+ssh "$ssh_dest" }"$cmd" \
86
${server:+ --host="$server" }${user:+--user="$user" } --password\
87
${password+="$password"} "$@"
88
}
89
alias mysql_cmd='mysql_cmd "$FUNCNAME"'
90

    
91
fi # load new aliases
92
if self_being_included; then
93

    
94
mysql() # usage: [output_data=1] [data_only=1] mysql ...
95
{
96
	echo_func; kw_params output_data data_only
97
	if test "$data_only"; then local output_data="${output_data-1}"; fi
98
	set_database
99
	
100
	set -- ${database:+--database="$database" }--local-infile=1 \
101
--${data_only:+skip-}column-names "$@"
102
	if test "$output_data"; then echo_stdin|mysql_cmd --batch "$@"
103
	else cmd_log_fd=1 mysql_cmd --verbose "$@"
104
	fi
105
}
106

    
107
mysql_ANSI()
108
{
109
	echo_func
110
	(echo "SET sql_mode = 'ANSI';"; cat)|mysql "$@"
111
}
112

    
113
mysql_truncate() { echo_func; mk_truncate|mysql_ANSI; }
114

    
115
mysql_import() # usage: table=... [cols=...] [append=1] mysql_import <file
116
# without append=1, first ensures the table is empty
117
{
118
	echo_func
119
	mk_table_esc
120
	local mysql_load_data_format="${mysql_load_data_format-\
121
FIELDS TERMINATED BY ','
122
OPTIONALLY ENCLOSED BY '\"'
123
}"
124
	
125
	if test ! "$append"; then mysql_truncate; fi
126
	mysql_load_data_format="${mysql_load_data_format%
127
}"
128
	mysql_ANSI "$@" 10<&0 <<EOF
129
LOAD DATA LOCAL INFILE '/dev/fd/10'
130
INTO TABLE $table_esc
131
$mysql_load_data_format
132
IGNORE 1 LINES
133
EOF
134
}
135

    
136
mysql_export() # does not support CSV
137
# caller usage: {query=... | table=... [cols=...] [filter=...]} mysql_export
138
# cmd line usage: [limit=...] caller
139
{
140
	echo_func
141
	mk_select_var
142
	
143
	output_data=1 mysql_ANSI "$@" <<<"$query"
144
}
145

    
146
mysql_export_outfile() # supports CSV, but requires the FILE privilege
147
{
148
	echo_func
149
	: "${file:?}"
150
	mk_select_var
151
	local mysql_load_data_format="${mysql_load_data_format-\
152
FIELDS TERMINATED BY ','
153
OPTIONALLY ENCLOSED BY '\"'
154
}"
155
	
156
	local head="${query%%FROM*}" # includes trailing newline
157
	head="${head%
158
}"
159
	local tail="${query#$head}"
160
	mysql_load_data_format="${mysql_load_data_format%
161
}"
162
	mysql_ANSI "$@" <<EOF
163
$head
164
INTO OUTFILE '$file'
165
$mysql_load_data_format
166
$tail
167
EOF
168
}
169

    
170
mysqldump() # usage: [schema=1 | data=1] mysqldump db [table...]
171
{
172
	echo_func; kw_params schema data
173
	
174
	mysql_cmd ${database:+--databases "$database" --tables } \
175
--quick --lock-tables=false --set-charset \
176
${postgres_compat:+--compatible=postgresql --add-locks=false }\
177
${schema:+--no-data }${data:+--no-create-info }"$@"
178
}
179

    
180
mysqldump_diffable()
181
{
182
	echo_func
183
	mysqldump "$@"|{ pipe_delay; echo_run sed 's/^(-- Dump completed).*$/\1/'; }
184
}
185

    
186

    
187
### PostgreSQL
188

    
189
pg_export()
190
{
191
	echo_func
192
	mk_select_var
193
	local pg_copy_format="${pg_copy_format-CSV HEADER}"
194
	
195
	psql "$@" <<<"COPY ($query) TO STDOUT $pg_copy_format;"
196
}
197

    
198
pg_header()
199
{
200
	echo_func
201
	local pg_copy_format="CSV HEADER" limit=0
202
	pg_export "$@"|echo_stdout
203
}
204

    
205
pg_export_table_no_header()
206
{
207
	echo_func
208
	local pg_copy_format="CSV"
209
	pg_export "$@"
210
}
211

    
212
pg_export_table_to_dir_no_header()
213
{
214
	echo_func
215
	local table="$1"; shift; mk_table_esc
216
	stdout="$exports_dir/$table.no_header.cols=$(pg_header).csv" to_file \
217
pg_export_table_no_header "$@"
218
}
219

    
220
fi
(3-3/7)