Annotation of /mcore-src/trunk/mcore-tools/src/include/mysqlfunctions.global.class.in
Parent Directory | Revision Log
Revision 2907 -
(hide annotations)
(download)
Fri Sep 15 09:41:12 2023 UTC (8 months ago) by niro
File size: 4785 byte(s)
Fri Sep 15 09:41:12 2023 UTC (8 months ago) by niro
File size: 4785 byte(s)
use maridb instead of mysql, mysql prints warnings that this cmd invocation will be deprecated in future mysql releases
1 | niro | 2093 | # $Id$ |
2 | |||
3 | niro | 2486 | provide mysql sql |
4 | |||
5 | niro | 2093 | mysql_command() |
6 | { | ||
7 | niro | 2481 | local sql_user |
8 | local sql_pass | ||
9 | local sql_host | ||
10 | local sql_db | ||
11 | local sql_command | ||
12 | niro | 2093 | |
13 | niro | 2481 | sql_user=$1 |
14 | sql_pass=$2 | ||
15 | sql_host=$3 | ||
16 | sql_db=$4 | ||
17 | sql_command=$5 | ||
18 | niro | 2093 | |
19 | niro | 2481 | #fallback (sql_opts not, they are optional ) |
20 | if [ -z "${sql_user}" \ | ||
21 | -o -z "${sql_pass}" \ | ||
22 | -o -z "${sql_host}" \ | ||
23 | -o -z "${sql_db}" \ | ||
24 | -o -z "${sql_command}" ] | ||
25 | niro | 2093 | then |
26 | echo | ||
27 | echo "Usage:" | ||
28 | echo -e " mysql_command user pass host db \"sql-command\"" | ||
29 | echo | ||
30 | return 1 | ||
31 | fi | ||
32 | niro | 2481 | |
33 | niro | 2907 | mariadb \ |
34 | niro | 2481 | --user="${sql_user}" \ |
35 | --password="${sql_pass}" \ | ||
36 | --host="${sql_host}" \ | ||
37 | --database="${sql_db}" \ | ||
38 | niro | 2093 | --batch \ |
39 | --skip-column-names \ | ||
40 | niro | 2481 | --execute="${sql_command}" \ |
41 | niro | 2093 | || return 1 |
42 | niro | 2481 | |
43 | niro | 2093 | return 0 |
44 | } | ||
45 | |||
46 | mysql_enum_colums() | ||
47 | { | ||
48 | niro | 2481 | local sql_user |
49 | local sql_pass | ||
50 | local sql_host | ||
51 | local sql_db | ||
52 | local sql_table | ||
53 | niro | 2093 | |
54 | niro | 2481 | local showtables |
55 | niro | 2093 | local i |
56 | local read | ||
57 | local field | ||
58 | local type | ||
59 | local null | ||
60 | local key | ||
61 | local default | ||
62 | local extra | ||
63 | niro | 2481 | |
64 | sql_user=$1 | ||
65 | sql_pass=$2 | ||
66 | sql_host=$3 | ||
67 | sql_db=$4 | ||
68 | sql_table=$5 | ||
69 | |||
70 | # show the column names ? | ||
71 | niro | 2093 | if [ -n "${6}" -a "${6}" == "show" ] |
72 | then | ||
73 | niro | 2481 | showtables=true |
74 | niro | 2093 | else |
75 | niro | 2481 | showtables=false |
76 | niro | 2093 | fi |
77 | |||
78 | niro | 2481 | # fallback (sql_opts not, they are optional ) |
79 | if [ -z "${sql_user}" \ | ||
80 | -o -z "${sql_pass}" \ | ||
81 | -o -z "${sql_host}" \ | ||
82 | -o -z "${sql_db}" \ | ||
83 | -o -z "${sql_table}" ] | ||
84 | niro | 2093 | then |
85 | echo | ||
86 | echo "Usage:" | ||
87 | echo -e " mysql_enum_columns user pass host db table [show]" | ||
88 | echo | ||
89 | return 1 | ||
90 | fi | ||
91 | |||
92 | declare -i i=0 | ||
93 | while read field type null key default extra | ||
94 | do | ||
95 | i=${i}+1 | ||
96 | niro | 2481 | [ "${showtables}" == true ] && echo "${field}" |
97 | niro | 2093 | done << EOF |
98 | niro | 2481 | $(mysql_command ${sql_user} ${sql_pass} ${sql_host} ${sql_db} "show columns from ${sql_table};") |
99 | niro | 2093 | EOF |
100 | niro | 2481 | [ "${showtables}" == true ] || echo "${i}" |
101 | niro | 2093 | } |
102 | |||
103 | beep3x() | ||
104 | { | ||
105 | echo -en "\a" | ||
106 | sleep 1 | ||
107 | echo -en "\a" | ||
108 | sleep 1 | ||
109 | echo -en "\a" | ||
110 | } | ||
111 | |||
112 | reach_mysql_server() | ||
113 | { | ||
114 | # set connection timeout to 20 secs | ||
115 | niro | 2907 | mariadb --connect_timeout=20 \ |
116 | niro | 2483 | --user="${MCORE_SQL_USER}" \ |
117 | --password="${MCORE_SQL_PASS}" \ | ||
118 | --host="${MCORE_SQL_HOST}" \ | ||
119 | --database="${MCORE_SQL_DB}" \ | ||
120 | niro | 2093 | --batch \ |
121 | --execute="" &> /dev/null && return 0 || \ | ||
122 | ( | ||
123 | echo -e ${COLRED} | ||
124 | niro | 2483 | echo "Cannot reach a mysql-server at '${MCORE_SQL_HOST}'." |
125 | niro | 2093 | echo "None of the current settings of this client will be touched." |
126 | echo "Please inform your system-administrator." | ||
127 | echo -e ${COLDEFAULT} | ||
128 | beep3x | ||
129 | sleep 5 | ||
130 | return 1 | ||
131 | ) | ||
132 | } | ||
133 | |||
134 | mysqldo() | ||
135 | { | ||
136 | mysql_command \ | ||
137 | niro | 2483 | "${MCORE_SQL_USER}" \ |
138 | "${MCORE_SQL_PASS}" \ | ||
139 | "${MCORE_SQL_HOST}" \ | ||
140 | "${MCORE_SQL_DB}" \ | ||
141 | niro | 2093 | "$@" \ |
142 | && return 0 || return 1 | ||
143 | } | ||
144 | |||
145 | # read tables and evaluate all variables | ||
146 | # cmd: evaluate_table cfg_network | ||
147 | # result: cfg_network_hostname=DUMMY_HOSTNAME | ||
148 | evaluate_table() | ||
149 | { | ||
150 | local all_vars | ||
151 | local all_items | ||
152 | local i | ||
153 | niro | 2481 | local count |
154 | niro | 2093 | local where_statement |
155 | |||
156 | local table="$1" | ||
157 | |||
158 | if [[ -z $2 ]] | ||
159 | then | ||
160 | where_statement="where serial='${ALX_SERIAL}'" | ||
161 | else | ||
162 | where_statement="$2" | ||
163 | fi | ||
164 | |||
165 | # setup arrays | ||
166 | niro | 2483 | all_vars=( $(mysql_enum_colums ${MCORE_SQL_USER} ${MCORE_SQL_PASS} ${MCORE_SQL_HOST} ${MCORE_SQL_DB} ${table} show) ) |
167 | niro | 2093 | all_items=( $(mysqldo "select * from ${table} ${where_statement}") ) |
168 | |||
169 | # sanity check | ||
170 | if [[ ${#all_vars[*]} -ne ${#all_items[*]} ]] | ||
171 | then | ||
172 | echo "error: arrays does not match!" | ||
173 | fi | ||
174 | |||
175 | niro | 2481 | count=${#all_vars[*]} |
176 | for ((i=0;i < count; i++)) | ||
177 | niro | 2093 | do |
178 | eval $(echo ${table}_${all_vars[${i}]}=\${all_items[${i}]}) | ||
179 | export ${table}_${all_vars[${i}]} | ||
180 | done | ||
181 | } | ||
182 | |||
183 | # read tables and evaluate all variables | ||
184 | # cmd: evaluate_table cfg_network | ||
185 | # result: cfg_network_hostname=DUMMY_HOSTNAME | ||
186 | evaluate_table_xml() | ||
187 | { | ||
188 | local table="$1" | ||
189 | local where_statement | ||
190 | |||
191 | if [[ -z $2 ]] | ||
192 | then | ||
193 | where_statement="where serial='${ALX_SERIAL}'" | ||
194 | else | ||
195 | where_statement="$2" | ||
196 | fi | ||
197 | |||
198 | niro | 2907 | eval $(mariadb \ |
199 | niro | 2483 | --user="${MCORE_SQL_USER}" \ |
200 | --password="${MCORE_SQL_PASS}" \ | ||
201 | --host="${MCORE_SQL_HOST}" \ | ||
202 | --database="${MCORE_SQL_DB}" \ | ||
203 | niro | 2093 | --xml \ |
204 | --execute="select * from ${table} ${where_statement}" \ | ||
205 | | xml sel -T -t -m //row/field \ | ||
206 | niro | 2876 | -v "concat('${table}_',@name,'=','\"',self::field,'\"')" -n) |
207 | niro | 2093 | } |
208 | |||
209 | mysql_insert() | ||
210 | { | ||
211 | local cmdline="$@" | ||
212 | #local table="$1" | ||
213 | local table="${cmdline%%,*}" | ||
214 | local argv | ||
215 | local insert_line | ||
216 | local update_line | ||
217 | local key | ||
218 | local value | ||
219 | local counter | ||
220 | |||
221 | OLD_IFS=${IFS} | ||
222 | IFS=, | ||
223 | declare -i counter=0 | ||
224 | #for argv in ${cmdline/$1/} # first value is the table_name | ||
225 | for argv in ${cmdline#*,} # first value is the table_name | ||
226 | do | ||
227 | key="${argv%=*}" | ||
228 | value="${argv#*=}" | ||
229 | |||
230 | if [ ${counter} -eq 0 ] | ||
231 | then | ||
232 | insert_keys="${key}" | ||
233 | insert_values="'${value}'" | ||
234 | update_line="${key}='${value}'" | ||
235 | else | ||
236 | insert_keys+=",${key}" | ||
237 | insert_values+=",'${value}'" | ||
238 | update_line+=",${key}='${value}'" | ||
239 | fi | ||
240 | (( counter ++ )) | ||
241 | done | ||
242 | IFS=${OLD_IFS} | ||
243 | |||
244 | niro | 2494 | decho "INSERT INTO ${table} (${insert_keys}) VALUES(${insert_values}) ON DUPLICATE KEY UPDATE ${update_line};" |
245 | niro | 2093 | mysqldo "insert into ${table} (${insert_keys}) values(${insert_values}) on duplicate key update ${update_line};" |
246 | } |