#!/bin/bash

# This script is intendent to be used to extend bkserver database to 
# to be able to hold both bkserver and lbproxy jobs.
# The operation should be non-destructive, i.e. all data should persist
# and continue to be fully usable.
 
usage() {
cat <<EOF
NAME:
	glite-lb-migrate_db2version20
		script for migrating older LB server or proxy databases
		to new schema required for transaction locking and USP 
		(United Server and Proxy)
USAGE:
	glite-lb-migrate_db2version20 -s|-p [-d db_name]

		-s		migrate old server DB to new version
		-p		migrate old proxy DB to new version
		-d db_name	non-default database name
EOF

}

SERVER=""
PROXY=""

while getopts "spd:h" OPTION 
do
    case "$OPTION" in 
    "s") SERVER=1
    ;;

    "p") PROXY=1
    ;;

    "d") DB_NAME=$OPTARG
    ;;

    "h") 
	usage;
	exit;
    ;;

    esac
done

if [ -z "$SERVER" -a -z "$PROXY" ]; then
	usage;
	exit;
fi

if [ "$SERVER" -a "$PROXY" ]; then
	usage;
	exit;
fi


# default DB name (for server or proxy, overriden by -d option)
if [ -z "$DB_NAME" ]; then
	if [ "$SERVER" ]; then
		DB_NAME="lbserver20"
	else
		DB_NAME="lbproxy"
	fi
fi


# convert for transactions (if needed and very old DB)
for table in jobs users events short_fields long_fields states status_tags server_state acls notif_registrations notif_jobs; do
	echo "SHOW CREATE TABLE $table;" | mysql -u lbserver $DB_NAME | grep -i ENGINE | grep -i InnoDB >/dev/null
	if [ $? != 0 ]; then
		echo "ALTER TABLE $table ENGINE=InnoDB" | mysql -u lbserver $DB_NAME
	fi
done


# add new columns
mysql -u lbserver $DB_NAME -e "ALTER TABLE jobs ADD proxy bool not null"
mysql -u lbserver $DB_NAME -e "ALTER TABLE jobs ADD server bool not null"
mysql -u lbserver $DB_NAME -e "ALTER TABLE jobs ADD grey bool not null"
mysql -u lbserver $DB_NAME -e "ALTER TABLE jobs ADD nevents int not null"


# flag all jobs as server jobs
if [ "$SERVER" ]; then
	mysql -u lbserver $DB_NAME -e "UPDATE jobs SET proxy='0'"
	mysql -u lbserver $DB_NAME -e "UPDATE jobs SET server='1'"
else
	mysql -u lbserver $DB_NAME -e "UPDATE jobs SET proxy='1'"
	mysql -u lbserver $DB_NAME -e "UPDATE jobs SET server='0'"
fi


# for all greyjobs set a flag
mysql -u lbserver $DB_NAME -e "UPDATE jobs,grey_jobs SET jobs.grey='1' WHERE jobs.jobid=grey_jobs.jobid"


# erase grey_jobs table
mysql -u lbserver $DB_NAME -e "DROP TABLE grey_jobs"


# set nevents field
mysql -u lbserver $DB_NAME -e "UPDATE jobs SET nevents=(SELECT max(event) FROM events where events.jobid=jobs.jobid)+1"


# seqcode
mysql -u lbserver $DB_NAME -e "ALTER TABLE events ADD seqcode varchar(255) binary not null"
mysql -u lbserver $DB_NAME -e "UPDATE events,short_fields SET events.seqcode=short_fields.value WHERE events.event=short_fields.event AND events.jobid=short_fields.jobid AND short_fields.name='SEQCODE'"
mysql -u lbserver $DB_NAME -e "DELETE FROM short_fields where name='SEQCODE'"


# create events_flesh table
mysql -u lbserver $DB_NAME -e "\
\
create table events_flesh (\
        jobid           char(32)        binary not null,\
        event           int             not null,\
        ulm             mediumblob      not null,\
\
        primary key (jobid,event)\
) engine=innodb"


# notif_registrations UPDATE
mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD flags int not null"

mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD STD_owner varchar(200) null" && \
mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD index(STD_owner)"

mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD STD_network_server varchar(200) null" && \
mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD index(STD_network_server)"

mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD JDL_VirtualOrganisation varchar(200) null" && \
mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD index(JDL_VirtualOrganisation)"


# zombie jobs
mysql -u lbserver $DB_NAME -e "\
\
create table zombie_jobs (\
        jobid		varchar(32)	not null,\
        prefix_id	tinyint		unsigned not null,\
        suffix_id	tinyint		unsigned not null,\
\
        primary key (jobid)\
) engine=innodb"

mysql -u lbserver $DB_NAME -e "\
\
create table zombie_prefixes (\
        prefix_id	tinyint		unsigned not null auto_increment,\
        prefix          varchar(255)    binary not null,\
\
        primary key (prefix_id)\
) engine=innodb"

mysql -u lbserver $DB_NAME -e "\
\
create table zombie_suffixes (\
        suffix_id       tinyint unsigned not null auto_increment,\
        suffix          varchar(255)    binary not null,\
\
        primary key (suffix_id)\
) engine=innodb"

