Magellan Linux

Annotation of /alx-src/branches/alx-web-070/scripts/sql-schema/mcore-sql-schema.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 8488 - (hide annotations) (download) (as text)
Fri Feb 5 12:29:42 2016 UTC (8 years, 3 months ago) by niro
File MIME type: application/x-sh
File size: 5261 byte(s)
-removed obsolete mysq_insert function
1 niro 8485 #!/bin/bash
2    
3     # include everything from include
4     for inc in $(find ./include -type f -name \*.sh)
5     do
6     source "${inc}"
7     done
8    
9     die()
10     {
11     echo "ERROR: $@"
12     exit 1
13     }
14    
15     mysql_command()
16     {
17     local sql_user
18     local sql_pass
19     local sql_host
20     local sql_db
21     local sql_command
22    
23     sql_user=$1
24     sql_pass=$2
25     sql_host=$3
26     sql_db=$4
27     sql_command=$5
28    
29     #fallback (sql_opts not, they are optional )
30     if [ -z "${sql_user}" \
31     -o -z "${sql_pass}" \
32     -o -z "${sql_host}" \
33     -o -z "${sql_db}" \
34     -o -z "${sql_command}" ]
35     then
36     echo
37     echo "Usage:"
38     echo -e " mysql_command user pass host db \"sql-command\""
39     echo
40     return 1
41     fi
42    
43     mysql \
44     --user="${sql_user}" \
45     --password="${sql_pass}" \
46     --host="${sql_host}" \
47     --database="${sql_db}" \
48     --batch \
49     --skip-column-names \
50     --execute="${sql_command}" \
51     || return 1
52    
53     return 0
54     }
55    
56     mysqldo()
57     {
58     mysql_command \
59     "${MCORE_SQL_USER}" \
60     "${MCORE_SQL_PASS}" \
61     "${MCORE_SQL_HOST}" \
62     "${MCORE_SQL_DB}" \
63     "$@" \
64     && return 0 || return 1
65     }
66    
67     # creates a mysql table with help of a defined array TABLE_DEFINITION:
68     # array values are a struct like this:
69     # first array element is the table name, everything else are column descriptions
70     # TABLE_DEFINITION=(
71     # "table_name"
72     # "column1_name column1_argvs"
73     # "column2_name column2_argvs"
74     # "columnN_name columnN_argvs"
75     # )
76     sql_create_table()
77     {
78     local table
79     local count
80     local i
81     local line
82     local opts
83     local column
84     local autoincrement
85     local primary
86     local create
87    
88     table="${TABLE_DEFINITION[0]}"
89     count="${#TABLE_DEFINITION[*]}"
90    
91     for ((i=1; i<count; i++))
92     do
93     line="${TABLE_DEFINITION[${i}]}"
94     column="${line%% *}"
95     opts="${line/${column} /}"
96    
97     case ${opts} in
98     *"PRIMARY KEY"*) opts="${opts//PRIMARY KEY}"; primary="${column}" ;;
99     *"primary key"*) opts="${opts//primary key}"; primary="${column}" ;;
100     esac
101    
102     case ${opts} in
103     *AUTO_INCREMENT*) opts="${opts//AUTO_INCREMENT}"; autoincrement="${column} ${opts}" ;;
104     *auto_increment*) opts="${opts//auto_increment}"; autoincrement="${column} ${opts}" ;;
105     esac
106    
107     if [[ -z ${create} ]]
108     then
109     create="${column} ${opts}"
110     else
111     create+=", ${column} ${opts}"
112     fi
113     done
114     echo "CREATE TABLE ${MCORE_SQL_DB}.${table} ( ${create} );"
115     mysqldo "CREATE TABLE ${MCORE_SQL_DB}.${table} ( ${create} );" || die "creating table '${table}'"
116    
117     if [[ -n ${primary} ]]
118     then
119     echo "ALTER TABLE ${MCORE_SQL_DB}.${table} ADD PRIMARY KEY (${primary});"
120     mysqldo "ALTER TABLE ${MCORE_SQL_DB}.${table} ADD PRIMARY KEY (${primary});" || die "adding primary key to table '${table}'"
121     fi
122     if [[ -n ${autoincrement} ]]
123     then
124     echo "ALTER TABLE ${MCORE_SQL_DB}.${table} MODIFY ${autoincrement} AUTO_INCREMENT;"
125     mysqldo "ALTER TABLE ${MCORE_SQL_DB}.${table} MODIFY ${autoincrement} AUTO_INCREMENT;" || die "adding auto_increment to table '${table}'"
126     fi
127     }
128    
129     # VALUE_DEFINITION=(
130     # "table_name, value_column_name, bool_column_name, id_column_name"
131     # "value1, bool1"
132     # "value2, bool2"
133     # "valueN, boolN"
134     # )
135     sql_set_value()
136     {
137     local line
138     local meta
139     local table
140     local column_value
141     local column_bool
142     local column_id
143     local value
144     local bool
145     local count
146     local i
147     local id
148    
149     count="${#VALUE_DEFINITION[*]}"
150     line="${VALUE_DEFINITION[0]}"
151     for i in ${line//,/ }
152     do
153     meta+=( "${i}" )
154     done
155    
156     table="${meta[0]}"
157     column_value="${meta[1]}"
158     column_bool="${meta[2]}"
159     column_id="${meta[3]}"
160    
161     for ((i=1; i<count; i++))
162     do
163     line="${VALUE_DEFINITION[${i}]}"
164     value="${line%%,*}"
165     bool="${line##*,}"
166     # remove any leading whitespaces
167     bool="${bool// }"
168    
169     # now check if the value already exist in the database
170     id=$(mysqldo "SELECT ${column_id} FROM ${MCORE_SQL_DB}.${table} WHERE ${column_value}='${value}';")
171     if [[ -n ${id} ]]
172     then
173     # update value in database
174     echo "UPDATE ${MCORE_SQL_DB}.${table} SET ${column_value}='${value}', ${column_bool}='${bool}' WHERE ${column_id}='${id}';"
175     mysqldo "UPDATE ${MCORE_SQL_DB}.${table} SET ${column_value}='${value}', ${column_bool}='${bool}' WHERE ${column_id}='${id}';" || die "update value in table ${table}"
176     else
177     # insert into the database
178     echo "INSERT INTO ${MCORE_SQL_DB}.${table} (${column_value}, ${column_bool}) VALUES ( '${value}', '${bool}' );"
179     mysqldo "INSERT INTO ${MCORE_SQL_DB}.${table} (${column_value}, ${column_bool}) VALUES ( '${value}', '${bool}' );" || die "insert value into table ${table}"
180     fi
181     done
182     }
183    
184     update_to_database_schema_version_2()
185     {
186     return 0
187     }
188    
189     update_to_database_schema_version_3()
190     {
191     return 0
192     }
193    
194     create_database()
195     {
196     create_database_schema
197     }
198    
199     update_database()
200     {
201     local current_sql_db_version
202     local i
203    
204     current_sql_db_version=$(mysqldo "SELECT MAX(version) from meta;")
205    
206     if [[ ${current_sql_db_version} = ${MCORE_SQL_DB_VERSION} ]]
207     then
208     echo "Database is already up to date"
209     return 0
210     fi
211    
212     # run every update_to_database_version_X script which exist up to version MCORE_SQL_DB_VERSION
213     for i in $(seq $((${current_sql_db_version}+1)) ${MCORE_SQL_DB_VERSION})
214     do
215     if [[ -n $(typeset -f update_to_database_version_${i}) ]]
216     then
217     echo "Running update_to_database_schema_version_${i}()"
218     update_to_database_schema_version_${i}
219     fi
220     done
221     }
222    
223     fill_database()
224     {
225     create_database_values
226     }
227    
228     case $1 in
229     create)
230     create_database
231     fill_database
232     ;;
233    
234     update)
235     update_database
236     fill_database
237     ;;
238     esac