@@ -128,6 +128,7 @@ public class DatabaseUpgradeChecker implements SystemIntegrityChecker {
128128 private static final Logger s_logger = Logger .getLogger (DatabaseUpgradeChecker .class );
129129 private final DatabaseVersionHierarchy hierarchy ;
130130 private static final String VIEWS_DIRECTORY = Paths .get ("META-INF" , "db" , "views" ).toString ();
131+ private static final String PROCEDURES_DIRECTORY = Paths .get ("META-INF" , "db" , "procedures" ).toString ();
131132
132133 @ Inject
133134 VersionDao _dao ;
@@ -295,83 +296,120 @@ private void updateSystemVmTemplates(DbUpgrade[] upgrades) {
295296 }
296297
297298 protected void upgrade (CloudStackVersion dbVersion , CloudStackVersion currentVersion ) {
299+ executeProcedureScripts ();
300+ final DbUpgrade [] upgrades = executeUpgrades (dbVersion , currentVersion );
301+
302+ executeViewScripts ();
303+ updateSystemVmTemplates (upgrades );
304+ }
305+
306+ protected void executeProcedureScripts () {
307+ s_logger .info (String .format ("Executing Stored Procedure scripts that are under resource directory [%s]." , PROCEDURES_DIRECTORY ));
308+ List <String > filesPathUnderViewsDirectory = FileUtil .getFilesPathsUnderResourceDirectory (PROCEDURES_DIRECTORY );
309+
310+ try (TransactionLegacy txn = TransactionLegacy .open ("execute-procedure-scripts" )) {
311+ Connection conn = txn .getConnection ();
312+
313+ for (String filePath : filesPathUnderViewsDirectory ) {
314+ s_logger .debug (String .format ("Executing PROCEDURE script [%s]." , filePath ));
315+
316+ InputStream viewScript = Thread .currentThread ().getContextClassLoader ().getResourceAsStream (filePath );
317+ runScript (conn , viewScript );
318+ }
319+
320+ s_logger .info (String .format ("Finished execution of PROCEDURE scripts that are under resource directory [%s]." , PROCEDURES_DIRECTORY ));
321+ } catch (SQLException e ) {
322+ String message = String .format ("Unable to execute PROCEDURE scripts due to [%s]." , e .getMessage ());
323+ s_logger .error (message , e );
324+ throw new CloudRuntimeException (message , e );
325+ }
326+ }
327+
328+ private DbUpgrade [] executeUpgrades (CloudStackVersion dbVersion , CloudStackVersion currentVersion ) {
298329 s_logger .info ("Database upgrade must be performed from " + dbVersion + " to " + currentVersion );
299330
300331 final DbUpgrade [] upgrades = calculateUpgradePath (dbVersion , currentVersion );
301332
302333 for (DbUpgrade upgrade : upgrades ) {
303- VersionVO version ;
304- s_logger .debug ("Running upgrade " + upgrade .getClass ().getSimpleName () + " to upgrade from " + upgrade .getUpgradableVersionRange ()[0 ] + "-" + upgrade
305- .getUpgradableVersionRange ()[1 ] + " to " + upgrade .getUpgradedVersion ());
306- TransactionLegacy txn = TransactionLegacy .open ("Upgrade" );
307- txn .start ();
308- try {
309- Connection conn ;
310- try {
311- conn = txn .getConnection ();
312- } catch (SQLException e ) {
313- String errorMessage = "Unable to upgrade the database" ;
314- s_logger .error (errorMessage , e );
315- throw new CloudRuntimeException (errorMessage , e );
316- }
317- InputStream [] scripts = upgrade .getPrepareScripts ();
318- if (scripts != null ) {
319- for (InputStream script : scripts ) {
320- runScript (conn , script );
321- }
322- }
323-
324- upgrade .performDataMigration (conn );
325-
326- version = new VersionVO (upgrade .getUpgradedVersion ());
327- version = _dao .persist (version );
334+ VersionVO version = executeUpgrade (upgrade );
335+ executeUpgradeCleanup (upgrade , version );
336+ }
337+ return upgrades ;
338+ }
328339
329- txn .commit ();
330- } catch (CloudRuntimeException e ) {
340+ private VersionVO executeUpgrade (DbUpgrade upgrade ) {
341+ VersionVO version ;
342+ s_logger .debug ("Running upgrade " + upgrade .getClass ().getSimpleName () + " to upgrade from " + upgrade .getUpgradableVersionRange ()[0 ] + "-" + upgrade
343+ .getUpgradableVersionRange ()[1 ] + " to " + upgrade .getUpgradedVersion ());
344+ TransactionLegacy txn = TransactionLegacy .open ("Upgrade" );
345+ txn .start ();
346+ try {
347+ Connection conn ;
348+ try {
349+ conn = txn .getConnection ();
350+ } catch (SQLException e ) {
331351 String errorMessage = "Unable to upgrade the database" ;
332352 s_logger .error (errorMessage , e );
333353 throw new CloudRuntimeException (errorMessage , e );
334- } finally {
335- txn .close ();
354+ }
355+ InputStream [] scripts = upgrade .getPrepareScripts ();
356+ if (scripts != null ) {
357+ for (InputStream script : scripts ) {
358+ runScript (conn , script );
359+ }
336360 }
337361
338- // Run the corresponding '-cleanup.sql' script
339- txn = TransactionLegacy .open ("Cleanup" );
340- try {
341- s_logger .info ("Cleanup upgrade " + upgrade .getClass ().getSimpleName () + " to upgrade from " + upgrade .getUpgradableVersionRange ()[0 ] + "-" + upgrade
342- .getUpgradableVersionRange ()[1 ] + " to " + upgrade .getUpgradedVersion ());
362+ upgrade .performDataMigration (conn );
343363
344- txn .start ();
345- Connection conn ;
346- try {
347- conn = txn .getConnection ();
348- } catch (SQLException e ) {
349- s_logger .error ("Unable to cleanup the database" , e );
350- throw new CloudRuntimeException ("Unable to cleanup the database" , e );
351- }
364+ version = new VersionVO (upgrade .getUpgradedVersion ());
365+ version = _dao .persist (version );
352366
353- InputStream [] scripts = upgrade .getCleanupScripts ();
354- if (scripts != null ) {
355- for (InputStream script : scripts ) {
356- runScript (conn , script );
357- s_logger .debug ("Cleanup script " + upgrade .getClass ().getSimpleName () + " is executed successfully" );
358- }
359- }
360- txn .commit ();
367+ txn .commit ();
368+ } catch (CloudRuntimeException e ) {
369+ String errorMessage = "Unable to upgrade the database" ;
370+ s_logger .error (errorMessage , e );
371+ throw new CloudRuntimeException (errorMessage , e );
372+ } finally {
373+ txn .close ();
374+ }
375+ return version ;
376+ }
361377
362- txn .start ();
363- version .setStep (Step .Complete );
364- version .setUpdated (new Date ());
365- _dao .update (version .getId (), version );
366- txn .commit ();
367- s_logger .debug ("Upgrade completed for version " + version .getVersion ());
368- } finally {
369- txn .close ();
378+ private void executeUpgradeCleanup (DbUpgrade upgrade , VersionVO version ) {
379+ TransactionLegacy txn ;
380+ // Run the corresponding '-cleanup.sql' script
381+ txn = TransactionLegacy .open ("Cleanup" );
382+ try {
383+ s_logger .info ("Cleanup upgrade " + upgrade .getClass ().getSimpleName () + " to upgrade from " + upgrade .getUpgradableVersionRange ()[0 ] + "-" + upgrade
384+ .getUpgradableVersionRange ()[1 ] + " to " + upgrade .getUpgradedVersion ());
385+
386+ txn .start ();
387+ Connection conn ;
388+ try {
389+ conn = txn .getConnection ();
390+ } catch (SQLException e ) {
391+ s_logger .error ("Unable to cleanup the database" , e );
392+ throw new CloudRuntimeException ("Unable to cleanup the database" , e );
370393 }
371- }
372394
373- executeViewScripts ();
374- updateSystemVmTemplates (upgrades );
395+ InputStream [] scripts = upgrade .getCleanupScripts ();
396+ if (scripts != null ) {
397+ for (InputStream script : scripts ) {
398+ runScript (conn , script );
399+ s_logger .debug ("Cleanup script " + upgrade .getClass ().getSimpleName () + " is executed successfully" );
400+ }
401+ }
402+ txn .commit ();
403+
404+ txn .start ();
405+ version .setStep (Step .Complete );
406+ version .setUpdated (new Date ());
407+ _dao .update (version .getId (), version );
408+ txn .commit ();
409+ s_logger .debug ("Upgrade completed for version " + version .getVersion ());
410+ } finally {
411+ txn .close ();
412+ }
375413 }
376414
377415 protected void executeViewScripts () {
0 commit comments