/bin/shell/checkdbupdate.sh

https://github.com/Yannix/ezpublish · Shell · 406 lines · 393 code · 8 blank · 5 comment · 4 complexity · 3b10b895f4bde3fff2ac0c865a6d625e MD5 · raw file

  1. #!/bin/bash
  2. . ./bin/shell/common.sh
  3. . ./bin/shell/sqlcommon.sh
  4. CHECK_TYPE="previous"
  5. SUBPATH=""
  6. # Initialise several database related variables, see sqlcommon.sh
  7. ezdist_db_init
  8. # Check parameters
  9. for arg in $*; do
  10. case $arg in
  11. --help|-h)
  12. echo "Usage: $0 [options] DATABASE"
  13. echo
  14. echo "Options: -h"
  15. echo " --help This message"
  16. echo " --check-stable Check against the last stable"
  17. echo " --check-previous Check against the last release (Default)"
  18. echo
  19. # Show options for database
  20. ezdist_db_show_options
  21. echo
  22. exit 1
  23. ;;
  24. --check-stable)
  25. CHECK_TYPE="stable"
  26. ;;
  27. --check-previous)
  28. CHECK_TYPE="previous"
  29. ;;
  30. --*)
  31. # Check for DB options
  32. ezdist_db_check_options "$arg"
  33. if [ $? -ne 0 ]; then
  34. echo "$arg: unknown long option specified"
  35. echo
  36. echo "Type '$0 --help\` for a list of options to use."
  37. exit 1
  38. fi
  39. ;;
  40. -*)
  41. # Check for DB options
  42. ezdist_db_check_short_options "$arg"
  43. if [ $? -ne 0 ]; then
  44. echo "$arg: unknown option specified"
  45. echo
  46. echo "Type '$0 --help\` for a list of options to use."
  47. exit 1
  48. fi
  49. ;;
  50. *)
  51. if [ -z "$DATABASE_NAME" ]; then
  52. DATABASE_NAME=$arg
  53. else
  54. echo "$arg: unknown argument specified"
  55. echo
  56. echo "Type '$0 --help\` for a list of options to use."
  57. exit 1
  58. fi
  59. ;;
  60. esac;
  61. done
  62. if ezdist_is_empty "$DB_TYPE"; then
  63. echo "No database type specified"
  64. exit 1
  65. fi
  66. if [[ "$DB_TYPE" != "mysql" && "$DB_TYPE" != "postgresql" ]]; then
  67. echo "Unknown database type $DB_TYPE"
  68. exit 1
  69. fi
  70. if [ -z "$DATABASE_NAME" ]; then
  71. echo "No database name specified"
  72. exit 1
  73. fi
  74. if [ "$CHECK_TYPE" = "previous" ]; then
  75. if [ "$DEVELOPMENT_PREVIOUS" == "true" ]; then
  76. SUBPATH="unstable/"
  77. elif [ "$DEVELOPMENT" == "true" ]; then
  78. SUBPATH="unstable/"
  79. fi
  80. else
  81. if [ "$DEVELOPMENT" == "true" ]; then
  82. SUBPATH="unstable/"
  83. fi
  84. fi
  85. if [ "$DB_TYPE" == "mysql" ]; then
  86. ezdist_db_init_mysql_from_defaults
  87. echo "Connecting to MySQL using `ezdist_mysql_show_config`"
  88. ezdist_mysql_prepare_params
  89. elif [ "$DB_TYPE" == "postgresql" ]; then
  90. ezdist_db_init_postgresql_from_defaults
  91. echo "Connecting to PostgreSQL using `ezdist_postgresql_show_config`"
  92. ezdist_postgresql_prepare_params
  93. fi
  94. DEST="/tmp/ez-$USER"
  95. if [ "$CHECK_TYPE" = "previous" ]; then
  96. if [ -z "$VERSION_PREVIOUS" ]; then
  97. to="$VERSION"
  98. from="$VERSION_STABLE"
  99. has_setval="false"
  100. else
  101. to="$VERSION"
  102. from="$VERSION_PREVIOUS"
  103. has_setval="true"
  104. fi
  105. else
  106. to="$VERSION"
  107. from="$VERSION_STABLE"
  108. has_setval="false"
  109. fi
  110. SCHEMA_URL="http://svn.ez.no/svn/ezpublish/versions/$to"
  111. PREVIOUS_SCHEMA_URL="http://svn.ez.no/svn/ezpublish/versions/$from"
  112. [ -d "$DEST" ] || mkdir "$DEST"
  113. # Helper function to deal with output
  114. function db_type_to_name
  115. {
  116. local type
  117. type=$1
  118. if [ "$type" == "mysql" ]; then
  119. echo "MySQL"
  120. elif [ "$type" == "postgresql" ]; then
  121. echo "PostgreSQL"
  122. else
  123. echo "Unknown"
  124. fi
  125. }
  126. function db_step_start
  127. {
  128. local step_name
  129. local resource
  130. step_name=$1
  131. resource=$2
  132. echo -n "`$POSITION_STORE``$SETCOLOR_EMPHASIZE`$step_name`$SETCOLOR_NORMAL`"
  133. [ -n "$resource" ] && echo -n "($resource)"
  134. }
  135. function db_step_done
  136. {
  137. local step_name
  138. local resource
  139. step_name=$1
  140. resource=$2
  141. echo -n "`$POSITION_RESTORE``$SETCOLOR_COMMENT`$step_name"
  142. [ -n "$resource" ] && echo -n "($resource)"
  143. echo -n "`$SETCOLOR_NORMAL`"
  144. }
  145. function db_create_failure
  146. {
  147. local type_name
  148. local db_name
  149. type_name=`db_type_to_name $1`
  150. db_name=$2
  151. echo "`$POSITION_RESTORE``$SETCOLOR_FAILURE`Creating($db_name)`$SETCOLOR_NORMAL`"
  152. echo "Failed to create $type_name database `$SETCOLOR_EMPHASIZE`$db_name`$SETCOLOR_NORMAL`"
  153. }
  154. function db_export_failure
  155. {
  156. local type_name
  157. local version
  158. local schema_url
  159. version=$2
  160. type_name=`db_type_to_name $1`
  161. schema_url=$3
  162. echo "`$POSITION_RESTORE``$SETCOLOR_FAILURE`Exporting($version)`$SETCOLOR_NORMAL`"
  163. echo "Failed checking out $type_name database schema `$SETCOLOR_EMPHASIZE`$schema_url`$SETCOLOR_NORMAL` from version `$SETCOLOR_EMPHASIZE`$from`$SETCOLOR_NORMAL`"
  164. }
  165. function db_initialize_failure
  166. {
  167. local type_name
  168. local db_name
  169. type_name=`db_type_to_name $1`
  170. db_name=$2
  171. echo "`$POSITION_RESTORE``$SETCOLOR_FAILURE`Initializing`$SETCOLOR_NORMAL`"
  172. echo "Failed to initialize $type_name database `$SETCOLOR_EMPHASIZE`$db_name`$SETCOLOR_NORMAL` with kernel_schema.sql"
  173. }
  174. function db_initialize_failure_setval
  175. {
  176. local type_name
  177. local db_name
  178. type_name=`db_type_to_name $1`
  179. db_name=$2
  180. echo "`$POSITION_RESTORE``$SETCOLOR_FAILURE`Initializing`$SETCOLOR_NORMAL`"
  181. echo "Failed to initialize $type_name database `$SETCOLOR_EMPHASIZE`$db_name`$SETCOLOR_NORMAL` with setval.sql"
  182. }
  183. function db_update_failure_dbfile
  184. {
  185. local type_name
  186. local db_name
  187. local from_to_str
  188. local dbupdatefile
  189. type_name=`db_type_to_name $1`
  190. db_name=$2
  191. from_to_str=$3
  192. dbupdatefile=$4
  193. echo "`$POSITION_RESTORE``$SETCOLOR_FAILURE`Updating($from_to_str)`$SETCOLOR_NORMAL`"
  194. echo "Failed to run database update `$SETCOLOR_EMPHASIZE`$dbupdatefile`$SETCOLOR_NORMAL` for $type_name database `$SETCOLOR_EMPHASIZE`$db_name`$SETCOLOR_NORMAL`"
  195. echo "Update file `$SETCOLOR_EMPHASIZE`$dbupdatefile`$SETCOLOR_NORMAL` does not exist"
  196. }
  197. function db_update_failure_import
  198. {
  199. local type_name
  200. local db_name
  201. local from_to_str
  202. local dbupdatefile
  203. type_name=`db_type_to_name $1`
  204. db_name=$2
  205. from_to_str=$3
  206. dbupdatefile=$4
  207. echo "`$POSITION_RESTORE``$SETCOLOR_FAILURE`Updating($from_to_str)`$SETCOLOR_NORMAL`"
  208. echo "Failed to run database update `$SETCOLOR_EMPHASIZE`$dbupdatefile`$SETCOLOR_NORMAL` for $type_name database `$SETCOLOR_EMPHASIZE`$db_name`$SETCOLOR_NORMAL`"
  209. }
  210. function db_validate_failure
  211. {
  212. local type_name
  213. local db_name
  214. type=$1
  215. type_name=`db_type_to_name $1`
  216. db_name=$2
  217. echo "`$POSITION_RESTORE``$SETCOLOR_FAILURE`Validating`$SETCOLOR_NORMAL`"
  218. echo "$type_name database `$SETCOLOR_EMPHASIZE`$db_name`$SETCOLOR_NORMAL` did not validate, this probably means the update file is incorrect"
  219. echo "Check the database difference with"
  220. echo "./bin/php/ezsqldiff.php --type=$type $db_name share/db_schema.dba"
  221. }
  222. if [ "$DB_TYPE" == "mysql" ]; then
  223. mysqladmin $PARAM_MYSQL_ALL -f drop "$DATABASE_NAME" &>/dev/null
  224. echo -n "MySQL:"
  225. echo -n " "
  226. db_step_start "Creating" "$DATABASE_NAME"
  227. mysqladmin $PARAM_MYSQL_ALL create "$DATABASE_NAME" &>/dev/null
  228. if [ $? -ne 0 ]; then
  229. db_create_failure $DB_TYPE "$DATABASE_NAME"
  230. exit 1
  231. fi
  232. db_step_done "Creating" "$DATABASE_NAME"
  233. mysql_schema_url="$PREVIOUS_SCHEMA_URL/kernel/sql/mysql/"
  234. rm -rf "$DEST/mysql"
  235. echo -n " "
  236. db_step_start "Exporting" "$from"
  237. svn export "$mysql_schema_url" "$DEST/mysql" &>/dev/null
  238. if [ $? -ne 0 ]; then
  239. db_export_failure $DB_TYPE "$from" "$mysql_schema_url"
  240. echo "`$POSITION_RESTORE`Exporting(`$SETCOLOR_FAILURE`$from`$SETCOLOR_NORMAL`)"
  241. echo "Failed checking out MySQL database schema `$SETCOLOR_EMPHASIZE`$mysql_schema_url`$SETCOLOR_NORMAL` from version `$SETCOLOR_EMPHASIZE`$VERSION`$SETCOLOR_NORMAL`"
  242. exit 1
  243. fi
  244. db_step_done "Exporting" "$from"
  245. echo -n " "
  246. db_step_start "Initializing" ""
  247. mysql $PARAM_MYSQL_ALL "$DATABASE_NAME" < "$DEST/mysql/kernel_schema.sql" &>/dev/null
  248. if [ $? -ne 0 ]; then
  249. db_initialize_failure $DB_TYPE "$DATABASE_NAME"
  250. exit 1
  251. fi
  252. db_step_done "Initializing" ""
  253. rm -rf "$DEST/mysql"
  254. dbupdatefile="update/database/mysql/""$VERSION_BRANCH""/""$SUBPATH""dbupdate-""$from""-to-""$VERSION"".sql"
  255. echo -n " "
  256. from_to_str="$from""=>""$VERSION"
  257. db_step_start "Updating" "$from_to_str"
  258. if [ ! -f "$dbupdatefile" ]; then
  259. db_update_failure_dbfile $DB_TYPE "$DATABASE_NAME" "$from_to_str" "$dbupdatefile"
  260. exit 1
  261. fi
  262. mysql $PARAM_MYSQL_ALL "$DATABASE_NAME" < "$dbupdatefile" &>/dev/null
  263. if [ $? -ne 0 ]; then
  264. db_update_failure_import $DB_TYPE "$DATABASE_NAME" "$from_to_str" "$dbupdatefile"
  265. exit 1
  266. fi
  267. db_step_done "Updating" "$from_to_str"
  268. echo -n " "
  269. db_step_start "Validating" ""
  270. # Create parameters
  271. ezdist_mysql_prepare_source_params
  272. ./bin/php/ezsqldiff.php --type=mysql $PARAM_SOURCE_ALL "$DATABASE_NAME" share/db_schema.dba &>/dev/null
  273. if [ $? -ne 0 ]; then
  274. db_validate_failure $DB_TYPE "$DATABASE_NAME"
  275. exit 1
  276. fi
  277. db_step_done "Validating" ""
  278. echo -n " `$SETCOLOR_SUCCESS`[ OK ]`$SETCOLOR_NORMAL`"
  279. echo
  280. elif [ "$DB_TYPE" == "postgresql" ]; then
  281. [ -n "$PGSQL_HOST" ] && PGSQL_HOST_OPT="-h $PGSQL_HOST"
  282. [ -n "$PGSQL_PORT" ] && PGSQL_PORT_OPT="-p $PGSQL_PORT"
  283. PGSQL_CONNECT_OPT="$PGSQL_HOST_OPT $PGSQL_PORT_OPT"
  284. dropdb $PARAM_POSTGRESQL_ALL "$DATABASE_NAME" &>/dev/null
  285. echo -n "PostgreSQL:"
  286. echo -n " "
  287. db_step_start "Creating" "$DATABASE_NAME"
  288. createdb $PARAM_POSTGRESQL_ALL "$DATABASE_NAME" &>/dev/null
  289. if [ $? -ne 0 ]; then
  290. db_create_failure $DB_TYPE "$DATABASE_NAME"
  291. exit 1
  292. fi
  293. db_step_done "Creating" "$DATABASE_NAME"
  294. postgresql_schema_url="$PREVIOUS_SCHEMA_URL/kernel/sql/postgresql/"
  295. rm -rf "$DEST/postgresql"
  296. echo -n " "
  297. db_step_start "Exporting" "$from"
  298. svn export "$postgresql_schema_url" "$DEST/postgresql" &>/dev/null
  299. if [ $? -ne 0 ]; then
  300. db_export_failure $DB_TYPE "$from" "$postgresql_schema_url"
  301. exit 1
  302. fi
  303. db_step_done "Exporting" "$from"
  304. echo -n " "
  305. db_step_start "Initializing" ""
  306. psql $PARAM_POSTGRESQL_ALL "$DATABASE_NAME" < "$DEST/postgresql/kernel_schema.sql" &>.psql.log
  307. if cat .psql.log | grep 'ERROR:' &>/dev/null; then
  308. db_initialize_failure $DB_TYPE "$DATABASE_NAME"
  309. echo `$SETCOLOR_FAILURE`
  310. cat .psql.log
  311. echo `$SETCOLOR_NORMAL`
  312. rm .psql.log
  313. exit 1
  314. fi
  315. rm .psql.log
  316. if [ "$has_setval" == "true" ]; then
  317. psql $PARAM_POSTGRESQL_ALL "$DATABASE_NAME" < "$DEST/postgresql/setval.sql" &>.psql.log
  318. if cat .psql.log | grep 'ERROR:' &>/dev/null; then
  319. db_initialize_failure_setval $DB_TYPE "$DATABASE_NAME"
  320. echo `$SETCOLOR_FAILURE`
  321. cat .psql.log
  322. echo `$SETCOLOR_NORMAL`
  323. rm .psql.log
  324. exit 1
  325. fi
  326. rm .psql.log
  327. fi
  328. db_step_done "Initializing" ""
  329. rm -rf "$DEST/postgresql"
  330. dbupdatefile="update/database/postgresql/""$VERSION_BRANCH""/""$SUBPATH""dbupdate-""$from""-to-""$VERSION"".sql"
  331. echo -n " "
  332. from_to_str="$from""=>""$VERSION"
  333. db_step_start "Updating" "$from_to_str"
  334. if [ ! -f "$dbupdatefile" ]; then
  335. db_update_failure_dbfile $DB_TYPE "$DATABASE_NAME" "$from_to_str" "$dbupdatefile"
  336. exit 1
  337. fi
  338. psql $PARAM_POSTGRESQL_ALL "$DATABASE_NAME" < "$dbupdatefile" &>.psql.log
  339. if cat .psql.log | grep 'ERROR:' &>/dev/null; then
  340. db_update_failure_import $DB_TYPE "$DATABASE_NAME" "$from_to_str" "$dbupdatefile"
  341. echo `$SETCOLOR_FAILURE`
  342. cat .psql.log
  343. echo `$SETCOLOR_NORMAL`
  344. rm .psql.log
  345. exit 1
  346. fi
  347. rm .psql.log
  348. db_step_done "Updating" "$from_to_str"
  349. echo -n " "
  350. db_step_start "Validating" ""
  351. # Create parameters
  352. ezdist_postgresql_prepare_source_params
  353. ./bin/php/ezsqldiff.php --type=postgresql $PARAM_SOURCE_ALL "$DATABASE_NAME" share/db_schema.dba &>/dev/null
  354. if [ $? -ne 0 ]; then
  355. db_validate_failure $DB_TYPE "$DATABASE_NAME"
  356. exit 1
  357. fi
  358. db_step_done "Validating" ""
  359. echo -n " `$SETCOLOR_SUCCESS`[ OK ]`$SETCOLOR_NORMAL`"
  360. echo
  361. fi