Database = &$Database;
    $this->Classes = array();
    $this->FormTypes = array();
    $this->Type = new Type($this);
    $this->ShowRelation = false;
  }
  function RegisterClass(string $Name, array $Class): void
  {
    $this->Classes[$Name] = $Class;
  }
  function UnregisterClass(string $Name): void
  {
    unset($this->Classes[$Name]);
  }
  function RegisterFormType(string $Name, array $Class): void
  {
    $this->FormTypes[$Name] = $Class;
  }
  function UnregisterFormType(string $Name): void
  {
    unset($this->FormTypes[$Name]);
  }
  function UpdateSQLMeta(): void
  {
    $this->Database->query('DELETE FROM ModelField');
    $this->Database->query('DELETE FROM Model');
    $this->Database->query('DELETE FROM DataType WHERE Parent IS NOT NULL');
    $this->Database->query('DELETE FROM DataType');
    foreach ($this->Type->TypeDefinitionList as $Name => $Type)
    {
      $DbResult = $this->Database->select('DataType', 'Id', 'Name="'.$Name.'"');
      if ($DbResult->num_rows == 0)
      {
        $this->Database->insert('DataType', array('Name' => $Name,
          'Title' => $Type['Class']));
      } else
      {
        $DbRow = $DbResult->fetch_assoc();
        $this->Database->update('DataType', 'Id='.$DbRow['Id'], array('Name' => $Name,
          'Title' => $Type['Class']));
      }
    }
    foreach ($this->Classes as $Class)
    if (!array_key_exists('SQL', $Class) and ($Class['Table'] != ''))
    {
      if (!$this->Database->TableExists($Class['Table'])) continue;
      echo($Class['Table'].'
');
      $Module = 1;
      $DbResult = $this->Database->select('Model', 'Id', 'Name="'.$Class['Table'].'"');
      if ($DbResult->num_rows == 0)
      {
        $this->Database->insert('Model', array('Name' => $Class['Table'], 'Title' => $Class['Title'], 'Module' => $Module));
        $Model = $this->Database->insert_id;
      } else
      {
        $DbRow = $DbResult->fetch_assoc();
        $Model = $DbRow['Id'];
        $this->Database->update('Model', 'Id='.$DbRow['Id'], array('Name' => $Class['Table'],
          'Title' => $Class['Title'], 'Module' => $Module));
      }
      foreach ($Class['Items'] as $Name => $Field)
      {
        echo($Name.', ');
        $DbResult = $this->Database->select('DataType', 'Id', 'Name="'.$Field['Type'].'"');
        if ($DbResult->num_rows > 0)
        {
          $DbRow = $DbResult->fetch_assoc();
          $Type = $DbRow['Id'];
        } else {
          $Type = $this->FormTypes[$Field['Type']];
          // Search parent type
          $DbResult = $this->Database->select('DataType', 'Id', 'Name="'.$Type['Type'].'"');
          if ($DbResult->num_rows > 0)
          {
            $DbRow = $DbResult->fetch_assoc();
            $ParentType = $DbRow['Id'];
          } else $ParentType = null;
          $this->Database->insert('DataType', array('Name' => $Field['Type'],
            'Title' => '', 'Parent' => $ParentType));
          $Type = $this->Database->insert_id;
        }
        $DbResult = $this->Database->select('ModelField', 'Id', '(Name="'.$Name.'") AND (Model='.$Model.')');
        if ($DbResult->num_rows == 0)
        {
          $this->Database->insert('ModelField', array('Name' => $Name,
            'Title' => $Field['Caption'], 'Model' => $Model, 'Type' => $Type));
        } else
        {
          $DbRow = $DbResult->fetch_assoc();
          $this->Database->update('ModelField', 'Id='.$DbRow['Id'], array('Name' => $Name,
            'Title' => $Field['Caption'], 'Model' => $Model, 'Type' => $Type));
        }
      }
      echo('
');
    }
  }
}