@Override
  public void doPromote(ScriptRunner pScriptRunner, PromotionFile pFile)
  throws ExPromote {
    
    long lStart = System.currentTimeMillis();
    Logger.logInfo("\nPromote DatabaseSource " + pFile.getFilePath());
    //Read the DBSource file in
    String lFileContents;
    try {
      lFileContents = FileUtils.readFileToString(pScriptRunner.resolveFile(pFile.getFilePath()));
    }
    catch (IOException e) {
      throw new ExFatalError("Failed to read contents of file " + pFile.getFilePath(), e);
    }

    List<ScriptExecutable> lExecutableList;
    try {
      lExecutableList = ScriptExecutableParser.parseScriptExecutables(lFileContents, false);
    }
    catch (ExParser e) {
      throw new ExFatalError("Failed to read contents of file " + pFile.getFilePath() + ": " + e.getMessage(), e);
    }
    
    Logger.logDebug("Validating source file");
    
    //Validate contents
    for(ScriptExecutable lExecutable : lExecutableList){
      if(!(lExecutable instanceof ScriptSQL)){
        throw new ExPromote("File " + pFile.getFilePath() + " has invalid contents: non-SQL markup not permitted in Database Source, " +
          "but a " + lExecutable.getDisplayString() + " command was found");
      }
    }
    
    try {
      for(ScriptExecutable lExecutable : lExecutableList){
        lExecutable.execute(pScriptRunner.getDatabaseConnection());
      }
    }
    catch (Throwable th){      
      throw new ExPromote("Failed to promote DatabaseSource " + pFile.getFilePath() + ": " + th.getMessage(), th);
    }
    long lTime = System.currentTimeMillis() - lStart;
    Logger.logInfo("OK (took " + lTime + "ms)");
    
  }