<?php

class UpdateManager
{
  var $Revision;
  var $Trace;
  var $VersionTable;
  /* @var Database */
  var $Database;
  var $InstallMethod;

  function __construct()
  {
    $this->Revision = 0;
    $this->Trace = array();
    $this->VersionTable = 'SystemVersion';
    $this->InstallMethod = 'FullInstall';
    $this->InsertSampleDataMethod = 'InsertSampleData';
  }

  function GetDbVersion()
  {
    $DbResult = $this->Database->select($this->VersionTable, '*', 'Id=1');
    $Version = $DbResult->fetch_assoc();
    return($Version['Revision']);
  }

  function IsInstalled()
  {
    $DbResult = $this->Database->query('SHOW TABLES LIKE "'.$this->VersionTable.'"');
    return($DbResult->num_rows > 0);
  }

  function IsUpToDate()
  {
    return($this->Revision <= $this->GetDbVersion());
  }

  function Upgrade()
  {
    $DbRevision = $this->GetDbVersion();
    $Output = 'Počáteční revize databáze: '.$DbRevision.'<br/>';
    while($this->Revision > $DbRevision)
    {
      $TraceItem = $this->Trace[$DbRevision];
      $Output .= 'Aktualizace na verzi '.$TraceItem['Revision'].':<br/>';
      // Show applied SQL queries immediatelly
      echo($Output);
      $Output = '';
      $RevUpdate = $TraceItem['Function'];
      $RevUpdate($this);
      $DbRevision = $TraceItem['Revision'];
      $this->Database->query('UPDATE `'.$this->VersionTable.'` SET `Revision`= '.
        $TraceItem['Revision'].' WHERE `Id`=1');
    }
    return($Output);
  }

  function Install()
  {
    $InstallMethod = $this->InstallMethod;
    $InstallMethod($this);
    $this->Update();
  }

  function Uninstall()
  {

  }

  function InsertSampleData()
  {
    $InstallMethod = $this->InsertSampleDataMethod;
    $InstallMethod($this);
  }

  function Execute($Query)
  {
    echo($Query.';<br/>');
    flush();
    return($this->Database->query($Query));
  }
}
