# $Id$ mysql_command() { local sql_user local sql_pass local sql_host local sql_db local sql_command sql_user=$1 sql_pass=$2 sql_host=$3 sql_db=$4 sql_command=$5 #fallback (sql_opts not, they are optional ) if [ -z "${sql_user}" \ -o -z "${sql_pass}" \ -o -z "${sql_host}" \ -o -z "${sql_db}" \ -o -z "${sql_command}" ] then echo echo "Usage:" echo -e " mysql_command user pass host db \"sql-command\"" echo return 1 fi mysql \ --user="${sql_user}" \ --password="${sql_pass}" \ --host="${sql_host}" \ --database="${sql_db}" \ --batch \ --skip-column-names \ --execute="${sql_command}" \ || return 1 return 0 } mysql_enum_colums() { local sql_user local sql_pass local sql_host local sql_db local sql_table local showtables local i local read local field local type local null local key local default local extra sql_user=$1 sql_pass=$2 sql_host=$3 sql_db=$4 sql_table=$5 # show the column names ? if [ -n "${6}" -a "${6}" == "show" ] then showtables=true else showtables=false fi # fallback (sql_opts not, they are optional ) if [ -z "${sql_user}" \ -o -z "${sql_pass}" \ -o -z "${sql_host}" \ -o -z "${sql_db}" \ -o -z "${sql_table}" ] then echo echo "Usage:" echo -e " mysql_enum_columns user pass host db table [show]" echo return 1 fi declare -i i=0 while read field type null key default extra do i=${i}+1 [ "${showtables}" == true ] && echo "${field}" done << EOF $(mysql_command ${sql_user} ${sql_pass} ${sql_host} ${sql_db} "show columns from ${sql_table};") EOF [ "${showtables}" == true ] || echo "${i}" } beep3x() { echo -en "\a" sleep 1 echo -en "\a" sleep 1 echo -en "\a" } reach_mysql_server() { # set connection timeout to 20 secs mysql --connect_timeout=20 \ --user="${MCORE_SQL_USER}" \ --password="${MCORE_SQL_PASS}" \ --host="${MCORE_SQL_HOST}" \ --database="${MCORE_SQL_DB}" \ --batch \ --execute="" &> /dev/null && return 0 || \ ( echo -e ${COLRED} echo "Cannot reach a mysql-server at '${MCORE_SQL_HOST}'." echo "None of the current settings of this client will be touched." echo "Please inform your system-administrator." echo -e ${COLDEFAULT} beep3x sleep 5 return 1 ) } mysqldo() { mysql_command \ "${MCORE_SQL_USER}" \ "${MCORE_SQL_PASS}" \ "${MCORE_SQL_HOST}" \ "${MCORE_SQL_DB}" \ "$@" \ && return 0 || return 1 } # read tables and evaluate all variables # cmd: evaluate_table cfg_network # result: cfg_network_hostname=DUMMY_HOSTNAME evaluate_table() { local all_vars local all_items local i local count local where_statement local table="$1" if [[ -z $2 ]] then where_statement="where serial='${ALX_SERIAL}'" else where_statement="$2" fi # setup arrays all_vars=( $(mysql_enum_colums ${MCORE_SQL_USER} ${MCORE_SQL_PASS} ${MCORE_SQL_HOST} ${MCORE_SQL_DB} ${table} show) ) all_items=( $(mysqldo "select * from ${table} ${where_statement}") ) # sanity check if [[ ${#all_vars[*]} -ne ${#all_items[*]} ]] then echo "error: arrays does not match!" fi count=${#all_vars[*]} for ((i=0;i < count; i++)) do eval $(echo ${table}_${all_vars[${i}]}=\${all_items[${i}]}) export ${table}_${all_vars[${i}]} done } # read tables and evaluate all variables # cmd: evaluate_table cfg_network # result: cfg_network_hostname=DUMMY_HOSTNAME evaluate_table_xml() { local table="$1" local where_statement if [[ -z $2 ]] then where_statement="where serial='${ALX_SERIAL}'" else where_statement="$2" fi export eval $(mysql \ --user="${MCORE_SQL_USER}" \ --password="${MCORE_SQL_PASS}" \ --host="${MCORE_SQL_HOST}" \ --database="${MCORE_SQL_DB}" \ --xml \ --execute="select * from ${table} ${where_statement}" \ | xml sel -T -t -m //row/field \ -v "concat('${table}_',@name,'=',self::field)" -n) } mysql_insert() { local cmdline="$@" #local table="$1" local table="${cmdline%%,*}" local argv local insert_line local update_line local key local value local counter OLD_IFS=${IFS} IFS=, declare -i counter=0 #for argv in ${cmdline/$1/} # first value is the table_name for argv in ${cmdline#*,} # first value is the table_name do key="${argv%=*}" value="${argv#*=}" if [ ${counter} -eq 0 ] then insert_keys="${key}" insert_values="'${value}'" update_line="${key}='${value}'" else insert_keys+=",${key}" insert_values+=",'${value}'" update_line+=",${key}='${value}'" fi (( counter ++ )) done IFS=${OLD_IFS} echo "INSERT INTO ${table} (${insert_keys}) VALUES(${insert_values}) ON DUPLICATE KEY UPDATE ${update_line};" mysqldo "insert into ${table} (${insert_keys}) values(${insert_values}) on duplicate key update ${update_line};" }