unit BeginUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DataUnit, ConstUnit, MainUnit;

type
  TBeginForm = class(TForm)
    begin_memo: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  BeginForm: TBeginForm;

implementation

{$R *.dfm}

procedure TBeginForm.FormCreate(Sender: TObject);
var database_flag,
    user_flag,
    userpriv_flag,
    table_patient_flag,
    table_izmereniy_flag,
    table_param_flag,
    table_znacheniya_flag,
    table_points_flag
                          : boolean;
    priv_str: string;
    i,count: Integer;
    c:Char;
begin
//флаги правильности работы программы,
database_flag := false;   //флаг существования базы данных
user_flag     := false;   //флаг существования пользователя
userpriv_flag := false;   //флаг правильности привелегий пользователя

table_patient_flag    := false;
table_izmereniy_flag  := false;
table_param_flag      := false;
table_znacheniya_flag := false;
table_points_flag     := false;

//очищаем мемо и показываем форму
Begin_memo.Clear;
BeginForm.Show;

//выводим первую запись в поле
Begin_memo.Lines.Append(Begin_mes_check_first);
//соединяемся с базой в качестве админа
{$REGION 'Подключение к базе в качестве root'}
with SQL_DM.mysql_con do
                  begin
                      loginprompt   := Begin_conn_login_prompt;
                      username      := Begin_conn_username_root;
                      server        := Begin_conn_server;
                      password      := Begin_conn_pass_root;
                      try
                      connected     := true;
                      except
                        //выводим сообщение об ошибке и прекращаем работу программы
                        Begin_memo.Lines.Append(Begin_mes_fail_connect);
                        if MessageBox(0,
                                      PChar(begin_mes_terminate+#13+begin_mes_fail_connect),
                                      Pchar(begin_caption_error),
                                      MB_ICONERROR or MB_OK
                                     )=id_OK then;
                           begin
                           beginForm.Close;
                           MainForm.Close;
                           end;
                      end;
                      connectdialog := SQL_DM.mysql_conn_dialog;
                  end;
{$ENDREGION 'Подключение к базе в качестве root'}


if SQL_DM.mysql_con.Connected then
{$REGION 'Подключение успешно'}
  begin
  {$REGION 'Работа с базой данных'}
  Begin_memo.Lines.Append(Begin_mes_root_connected);
  Begin_memo.Lines.Append('');
  Begin_memo.Lines.Append(Begin_mes_check_database);

  //смотрим доступные базы данных на сервере
  if mysql_query(SQL_DM.mysql_query1, 'Show Databases;',1)  then
      begin
         SQL_DM.mysql_DSQ1.DataSet.First;
         //проходим все, если не найдем то флаг остается в false, а если найдем
         //требуемую базу даннных - то в true
         while not SQL_DM.mysql_DSQ1.DataSet.Eof do
           begin
            if SQL_DM.mysql_DSQ1.DataSet.FieldByName('Database').AsString=database_name
              then  database_flag:=true;
            SQL_DM.mysql_DSQ1.DataSet.Next;
           end;
      end;

  //если база найдена то выводим сообщение, если нет, то пытаеммся создать
  if database_flag then
      begin
        Begin_memo.Lines.Append(Begin_mes_exist_database);
      end
      else
      begin
        Begin_memo.Lines.Append(Begin_mes_notexist_database);
        Begin_memo.Lines.Append(Begin_mes_create_database);

        if mysql_query(SQL_DM.mysql_query1, 'CREATE DATABASE `rd` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;',2)
          then
            begin
              //проверка на корректное создание базы данных
              SQL_DM.mysql_DSQ1.Enabled:=false;

              if mysql_query(SQL_DM.mysql_query1, 'Show Databases;',1)  then
                begin
                  SQL_DM.mysql_DSQ1.Enabled:=true;
                  SQL_DM.mysql_DSQ1.DataSet.First;
                  while not SQL_DM.mysql_DSQ1.DataSet.Eof do
                    begin
                      if SQL_DM.mysql_DSQ1.DataSet.FieldByName('Database').AsString=database_name
                        then database_flag:=true;
                      SQL_DM.mysql_DSQ1.DataSet.Next;
                    end;
                end;
            end;

        if database_flag then Begin_memo.Lines.Append(Begin_mes_create_database_sucsess);
  end;
  {$ENDREGION 'Работа с базой данных'}
  {$REGION 'Работа с Пользователем'}
  //начинаем проверку существования пользователя
  Begin_memo.Lines.Append(Begin_mes_check_user);
  //выбираем нужную базу данных
  mysql_query(SQL_DM.mysql_query1, 'USE mysql;',2);

  //проверяем наличие пользователя, если да, то устанавливаем флаг существования
  //пользователя
  SQL_DM.mysql_DSQ1.Enabled:=false;
  if mysql_query(SQL_DM.mysql_query1, 'SELECT user from User;',1) then
    begin
      SQL_DM.mysql_DSQ1.DataSet.First;
      while not SQL_DM.mysql_DSQ1.DataSet.Eof do
        begin
          if SQL_DM.mysql_DSQ1.DataSet.FieldByName('user').AsString=user_name
            then user_flag:=true;
          SQL_DM.mysql_DSQ1.DataSet.Next;
        end;
    end;
  if user_flag
      then Begin_memo.Lines.Append(Begin_mes_check_user_sucsess)
  else
    begin
        {$REGION 'Создание пользователя'}
        //если пользователь не найден, то создаем его.
        Begin_memo.Lines.Append(Begin_mes_check_user_notsucsess);
        Begin_memo.Lines.Append(Begin_mes_user_create);
        {$REGION 'SQL_DM.mysql_query1'}
        with SQL_DM.mysql_query1 do
          begin
            Active:=false;
            SQL.Clear;
            SQL.Append('CREATE USER '''+user_name+'''@''localhost'' IDENTIFIED BY '''+user_pass+''' ;');
            SQL.Append('');
            SQL.Append('GRANT SELECT ,');
            SQL.Append('INSERT ,');
            SQL.Append('UPDATE ,');
            SQL.Append('DELETE ,');
            SQL.Append('CREATE ,');
            SQL.Append('DROP ,  ');
            SQL.Append('EXECUTE ,  ');
            SQL.Append('INDEX , ');
            SQL.Append('ALTER ON * . * TO '''+user_name+'''@''localhost'' IDENTIFIED BY '''+user_pass+''' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;');
            try
                SQL_DM.mysql_query1.Execute;
            except
             //
            end;
          end;
        {$ENDREGION 'SQL_DM.mysql_query1'}
        //проверка на корректное создание пользователя
        SQL_DM.mysql_DSQ1.Enabled:=false;
        if mysql_query(SQL_DM.mysql_query1, 'SELECT user from User;',1)
          then
            begin
              SQL_DM.mysql_DSQ1.DataSet.First;
                while not SQL_DM.mysql_DSQ1.DataSet.Eof do
                  begin
                      if SQL_DM.mysql_DSQ1.DataSet.FieldByName('user').AsString=user_name
                        then  user_flag:=true;
                      SQL_DM.mysql_DSQ1.DataSet.Next;
                  end;
                if user_flag
                  then Begin_memo.Lines.Append(Begin_mes_user_create_suc);
            end;
        {$ENDREGION 'Создание пользователя'}
    end;

  {$REGION 'Права пользователя'}
  //проверка на достаточность прав, осуществляется только
  //при наличии пользователя
  if user_flag then
    begin
      Begin_memo.Lines.Append(Begin_mes_check_user_priv);
      if mysql_query(SQL_DM.mysql_query1, 'SELECT * from User Where user='''+user_name+''';',1)
        then
          begin
            {$REGION 'Права пользователя. Выборка'}
            SQL_DM.mysql_DSQ1.DataSet.First;
            priv_str:='';
            //в одну строку записываем все существующие права пользователя в виде Y/N
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Select_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Insert_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Update_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Delete_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Create_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Drop_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Reload_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Shutdown_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Process_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['File_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Grant_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['References_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Index_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Alter_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Show_db_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Super_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Create_tmp_table_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Lock_tables_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Execute_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Repl_slave_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Repl_client_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Create_view_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Show_view_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Create_routine_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Alter_routine_priv'];
            priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Create_user_priv'];
            {$ENDREGION 'Права пользователя. Выборка'}
            {$REGION 'Права пользователя. Проверка'}
            count:=0;
            //showmessage(priv_str);
            //showmessage(inttostr(length(priv_str)));
            for C in priv_str do
                if C='Y' then inc(count);

            {$ENDREGION 'Права пользователя. Проверка'}
            if count=priv_y_count
              then
                begin
                   userpriv_flag:=true;
                   Begin_memo.Lines.Append(Begin_mes_check_user_priv_suc);
                end
                else
                  begin
                    {$REGION 'Права пользователя. Изменение'}
                    //если права не соответствуют требуемым, то создаем их
                    Begin_memo.Lines.Append(Begin_mes_check_user_priv_notsuc);
                    SQL_DM.mysql_query1.Active:=false;
                    SQL_DM.mysql_query1.SQL.Clear;
                    SQL_DM.mysql_query1.SQL.Append('DELETE FROM `mysql`.`user` WHERE `user`.`Host` = ''''localhost'''' AND `user`.`User` = '''+user_name+''' LIMIT 1;');
                    SQL_DM.mysql_query1.SQL.Append('CREATE USER '''+user_name+'''@''localhost'' IDENTIFIED BY '''+user_pass+''' ;');
                    SQL_DM.mysql_query1.SQL.Append('');
                    SQL_DM.mysql_query1.SQL.Append('GRANT SELECT ,');
                    SQL_DM.mysql_query1.SQL.Append('INSERT ,');
                    SQL_DM.mysql_query1.SQL.Append('UPDATE ,');
                    SQL_DM.mysql_query1.SQL.Append('DELETE ,');
                    SQL_DM.mysql_query1.SQL.Append('CREATE ,');
                    SQL_DM.mysql_query1.SQL.Append('DROP ,  ');
                    SQL_DM.mysql_query1.SQL.Append('EXECUTE ,  ');
                    SQL_DM.mysql_query1.SQL.Append('INDEX , ');
                    SQL_DM.mysql_query1.SQL.Append('ALTER ON * . * TO '''+user_name+'''@''localhost'' IDENTIFIED BY '''+user_pass+''' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;');
                    try
                      SQL_DM.mysql_query1.Execute;
                    except
                      //
                    end;

                    //проверяем сделанные изменения
                    if mysql_query(SQL_DM.mysql_query1, 'SELECT * from User Where user='''+user_name+''';',1)
                      then
                        begin
                          {$REGION 'Права пользователя. Выборка'}
                          SQL_DM.mysql_DSQ1.DataSet.First;
                          priv_str:='';
                          //в одну строку записываем все существующие права пользователя в виде Y/N
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Select_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Insert_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Update_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Delete_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Create_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Drop_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Reload_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Shutdown_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Process_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['File_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Grant_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['References_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Index_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Alter_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Show_db_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Super_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Create_tmp_table_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Lock_tables_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Execute_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Repl_slave_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Repl_client_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Create_view_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Show_view_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Create_routine_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Alter_routine_priv'];
                          priv_str:=priv_str+SQL_DM.mysql_DSQ1.DataSet.FieldValues['Create_user_priv'];
                          {$ENDREGION 'Права пользователя. Выборка'}
                          count:=0;

                          for C in priv_str do
                              if C='Y' then inc(count);

                          if count=priv_y_count
                          then
                            begin
                                userpriv_flag:=true;
                                Begin_memo.Lines.Append(Begin_mes_check_user_priv_change);
                            end
                        end;
                   {$ENDREGION 'Права пользователя. Изменение'}
                  end;
          end;
    end;
  {$ENDREGION 'Права пользователя'}
  {$ENDREGION 'Работа с Пользователем'}
  if user_flag and userpriv_flag and database_flag
  then
    begin
      Begin_memo.Lines.Append('');
      Begin_memo.Lines.Append(Begin_mes_first_stage_complete);
      Begin_memo.Lines.Append('');
      Begin_memo.Lines.Append(Begin_mes_reconnect);
      {$REGION 'Подключение к базе в качестве пользователя'}
      with SQL_DM.mysql_con do
        begin
          connected     := false;
          //sleep(300);
          loginprompt   := Begin_conn_login_prompt;
          username      := user_name;
          server        := Begin_conn_server;
          password      := user_pass;
          try
              connect;
          except
              //
          end;
          connectdialog := SQL_DM.mysql_conn_dialog;
        end;
    {$ENDREGION 'Подключение к базе в качестве пользователя'}
      if SQL_DM.mysql_con.Connected
        then
          begin
            Begin_memo.Lines.Append(Begin_mes_reconnect_sucsess );
            //проверяем наличие таблиц

            mysql_query(SQL_DM.mysql_query1, 'USE '+database_name+';',2);
            if mysql_query(SQL_DM.mysql_query1, 'Show Tables;',1)
              then
                begin
                  {$REGION 'Проверка наличия таблиц'}
                  SQL_DM.mysql_DSQ1.Enabled:=true;
                  SQL_DM.mysql_DSQ1.DataSet.First;
                  while not SQL_DM.mysql_DSQ1.DataSet.Eof do
                    begin
                      if SQL_DM.mysql_DSQ1.DataSet.FieldByName('Tables_in_'+database_name).AsString=table_patient_name
                        then table_patient_flag:=true;
                      if SQL_DM.mysql_DSQ1.DataSet.FieldByName('Tables_in_'+database_name).AsString=table_izm_name
                        then table_izmereniy_flag:=true;
                      if SQL_DM.mysql_DSQ1.DataSet.FieldByName('Tables_in_'+database_name).AsString=table_param_name
                        then table_param_flag:=true;
                      if SQL_DM.mysql_DSQ1.DataSet.FieldByName('Tables_in_'+database_name).AsString=table_znacheniya_name
                        then table_znacheniya_flag:=true;
                      if SQL_DM.mysql_DSQ1.DataSet.FieldByName('Tables_in_'+database_name).AsString=table_points_name
                        then table_points_flag:=true;
                      SQL_DM.mysql_DSQ1.DataSet.Next;
                    end;
                  {$ENDREGION 'Проверка наличия таблиц'}
                  //если таблица существует, то выводим сообщение об этом, если нет
                  //то создаем их
                  {$REGION 'Таблица пациентов'}
                 if table_patient_flag then Begin_memo.Lines.Append(Begin_mes_table_pat_exist)
                 else
                  begin
                    Begin_memo.Lines.Append(Begin_mes_table_not_pat_exist);
                    Begin_memo.Lines.Append(Begin_mes_table_pat_create);
                    with SQL_DM.mysql_query1 do
                      begin
                        Active:=false;
                        SQL.Clear;

                        SQL.Append('CREATE TABLE `'+table_patient_name+'` (');
                        SQL.Append('`id` int(5) NOT NULL auto_increment,');
                        SQL.Append('`fam` varchar(60) NOT NULL,');
                        SQL.Append('`name` varchar(60) NOT NULL,');
                        SQL.Append('`otch` varchar(60) NOT NULL,');
                        SQL.Append('`day` tinyint(3) unsigned NOT NULL,');
                        SQL.Append('`mon` tinyint(3) unsigned NOT NULL,');
                        SQL.Append('`year` smallint(4) unsigned NOT NULL,');
                        SQL.Append('`opisanie` text NOT NULL,');
                        SQL.Append('PRIMARY KEY  (`id`)');
                        SQL.Append(') ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;');

                        try
                          Execute;
                        except
                          //
                        end;
                      end;
                 end;
                 {$ENDREGION 'Таблица пациентов'}
                  {$REGION 'Таблица измерений'}
                 if table_izmereniy_flag then Begin_memo.Lines.Append(Begin_mes_table_izm_exist)
                 else
                  begin
                    Begin_memo.Lines.Append(Begin_mes_table_not_izm_exist);
                    Begin_memo.Lines.Append(Begin_mes_table_izm_create);
                    with SQL_DM.mysql_query1 do
                    begin
                      Active:=false;
                      SQL.Clear;

                      SQL.Append('CREATE TABLE `'+table_izm_name+'` (');
                      SQL.Append('`id` int(5) NOT NULL auto_increment,');
                      SQL.Append('`date` datetime NOT NULL,');
                      SQL.Append('`patient_num` int(11) NOT NULL default ''0'',');
                      SQL.Append('`opisanie` text NOT NULL,');
                      SQL.Append('PRIMARY KEY  (`id`),');
                      SQL.Append('UNIQUE KEY `date` (`date`),');
                      SQL.Append('KEY `patient_num` (`patient_num`)');
                      SQL.Append(') ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;');

                      try
                          Execute;
                      except
                          //
                      end;
                    end;
                 end;
                 {$ENDREGION 'Таблица измерений'}
                  {$REGION 'Таблица параметров'}
                 if table_param_flag then Begin_memo.Lines.Append(Begin_mes_table_param_exist)
                 else
                    begin
                      Begin_memo.Lines.Append(Begin_mes_table_not_param_exist);
                      Begin_memo.Lines.Append(Begin_mes_table_param_create);

                      with SQL_DM.mysql_query1 do
                      begin
                        Active:=false;
                        SQL.Clear;

                        SQL.Append('CREATE TABLE `'+table_param_name+'` (');
                        SQL.Append('`id` tinyint(4) NOT NULL auto_increment,');
                        SQL.Append('`name` varchar(5) NOT NULL,');
                        SQL.Append('`opisanie` varchar(100) NOT NULL,');
                        SQL.Append('PRIMARY KEY  (`id`)');
                        SQL.Append(') ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;');

                        try
                          Execute;
                        except
                          //
                        end;
                      end;
                 end;
                 {$ENDREGION 'Таблица параметров'}
                  {$REGION 'Таблица значений'}
                 if table_znacheniya_flag then Begin_memo.Lines.Append(Begin_mes_table_znach_exist)
                 else
                    begin
                      Begin_memo.Lines.Append(Begin_mes_table_not_znach_exist);
                      Begin_memo.Lines.Append(Begin_mes_table_znach_create);

                      with SQL_DM.mysql_query1 do
                      begin
                        Active:=false;
                        SQL.Clear;

                        SQL.Append('CREATE TABLE `'+table_znacheniya_name+'` (');
                        SQL.Append('`id` bigint NOT NULL auto_increment,');
                        SQL.Append('`izm_num` int(11) NOT NULL,');
                        SQL.Append('`param_num` tinyint(4) NOT NULL,');
                        SQL.Append('`point_num` tinyint(3) NOT NULL,');
                        SQL.Append('`povtor_num` enum(''1'',''2'',''3'',''4'',''5'',''6'') NOT NULL,');
                        SQL.Append('`znach` float NOT NULL,');
                        SQL.Append('`znach_UI` mediumtext NOT NULL,');
                        SQL.Append('PRIMARY KEY  (`id`),');
                        SQL.Append('KEY `izm_num` (`izm_num`),');
                        SQL.Append('KEY `param_num` (`param_num`),');
                        SQL.Append('KEY `point_num` (`point_num`)');
                        SQL.Append(') ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;');
                        SQL.Append('ALTER TABLE `rd_znacheniya` ADD `znach_UI` VARCHAR( 24000 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL AFTER `znach`;');

                        try
                          Execute;
                        except
                          //
                        end;
                      end;
                 end;
                 {$ENDREGION 'Таблица значений'}
                  {$REGION 'Таблица точек'}
                 if table_points_flag then Begin_memo.Lines.Append(Begin_mes_table_points_exist)
                 else
                    begin
                      Begin_memo.Lines.Append(Begin_mes_table_not_points_exist);
                      Begin_memo.Lines.Append(Begin_mes_table_points_create);

                      with SQL_DM.mysql_query1 do
                      begin
                        Active:=false;
                        SQL.Clear;

                        SQL.Append('CREATE TABLE `'+table_points_name+'` (');
                        SQL.Append('`num` TINYINT( 3 ) NOT NULL ,');
                        SQL.Append('`opisanie` VARCHAR( 500 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,');
                        SQL.Append('`name` VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''point'',');
                        SQL.Append('`image` LONGBLOB ,');
                        SQL.Append('PRIMARY KEY ( `num` )');
                        SQL.Append(') ENGINE = innodb CHARACTER SET utf8 COLLATE utf8_general_ci;');

                        try
                          Execute;
                        except
                          //
                        end;
                      end;
                 end;
                 {$ENDREGION 'Таблица точек'}

                  {$REGION 'Проверка создания таблиц'}
                  //проверяем корректность создания таблиц
                  if mysql_query(SQL_DM.mysql_query1, 'Show Tables;',1)  then
                    begin
                      SQL_DM.mysql_DSQ1.Enabled:=true;
                      SQL_DM.mysql_DSQ1.DataSet.First;
                      while not SQL_DM.mysql_DSQ1.DataSet.Eof do begin
                      if SQL_DM.mysql_DSQ1.DataSet.FieldByName('Tables_in_'+database_name).AsString=table_patient_name
                        then table_patient_flag:=true;
                      if SQL_DM.mysql_DSQ1.DataSet.FieldByName('Tables_in_'+database_name).AsString=table_izm_name
                        then table_izmereniy_flag:=true;
                      if SQL_DM.mysql_DSQ1.DataSet.FieldByName('Tables_in_'+database_name).AsString=table_param_name
                        then table_param_flag:=true;
                      if SQL_DM.mysql_DSQ1.DataSet.FieldByName('Tables_in_'+database_name).AsString=table_znacheniya_name
                        then table_znacheniya_flag:=true;
                      if SQL_DM.mysql_DSQ1.DataSet.FieldByName('Tables_in_'+database_name).AsString=table_points_name
                        then table_points_flag:=true;
                      SQL_DM.mysql_DSQ1.DataSet.Next;
                    end;
                {$ENDREGION 'Проверка создания таблиц'}
                  {$REGION 'Обработка ошибок создания таблиц'}
                if not table_patient_flag and
                   table_izmereniy_flag and
                   table_param_flag and
                   table_znacheniya_flag and
                   table_points_flag
                then
                  begin//обрабатываем полученные результаты
                    if table_patient_flag
                      then Begin_memo.Lines.Append(Begin_mes_table_pat_create_sucsess)
                    else
                      begin
                        //обработка ошибки
                      end;

                    if table_izmereniy_flag
                      then Begin_memo.Lines.Append(Begin_mes_table_izm_create_sucsess)
                    else
                      begin
                        //обработка ошибки
                      end;

                    if table_param_flag
                      then Begin_memo.Lines.Append(Begin_mes_table_param_create_sucsess)
                    else
                      begin
                        //обработка ошибки
                      end;

                    if table_znacheniya_flag
                      then Begin_memo.Lines.Append(Begin_mes_table_znach_create_sucsess)
                    else
                      begin
                        //обработка ошибки
                      end;

                    if table_points_flag
                      then Begin_memo.Lines.Append(Begin_mes_table_points_create_sucsess)
                    else
                      begin
                        //обработка ошибки
                      end;

                  end;
                {$ENDREGION 'Обработка ошибок создания таблиц'}
                end;
            {$REGION 'Создание ключей'}
            //создание ключей. Происходит в любом случае
            Begin_memo.Lines.Append(Begin_mes_keys_create);
            with SQL_DM.mysql_query1 do
            begin
              Active:=false;
              SQL.Clear;

              SQL.Append('ALTER TABLE `rd_izmerenia`');
              SQL.Append('ADD CONSTRAINT `rd_izmerenie_ibfk_1` FOREIGN KEY (`patient_num`) REFERENCES `rd_patient` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;');

              SQL.Append('ALTER TABLE `rd_znacheniya` ADD FOREIGN KEY ( `izm_num` ) REFERENCES `rd`.`rd_izmerenia` (');
              SQL.Append('`id`');
              SQL.Append(') ON DELETE CASCADE ON UPDATE CASCADE ;');

              SQL.Append('ALTER TABLE `rd_znacheniya` ADD FOREIGN KEY ( `param_num` ) REFERENCES `rd`.`rd_param` (');
              SQL.Append('`id`');
              SQL.Append(') ON DELETE CASCADE ON UPDATE CASCADE ;');

              SQL.Append('ALTER TABLE `rd_znacheniya` ADD FOREIGN KEY ( `point_num` ) REFERENCES `rd`.`rd_points` (');
              SQL.Append('`num`');
              SQL.Append(') ON DELETE CASCADE ON UPDATE CASCADE ;');

              try
                Execute;
              except
                //
              end;
            end;
            {$ENDREGION 'Создание ключей'}
            {$REGION 'Печать сообщений, контроль ошибок'}
            if table_patient_flag and
               table_izmereniy_flag and
               table_param_flag and
               table_znacheniya_flag and
               table_points_flag then
               begin
                   Begin_memo.Lines.Append('');
                   Begin_memo.Lines.Append(Begin_mes_table_sucsess);
                   Begin_memo.Lines.Append('');
                   Begin_memo.Lines.Append(Begin_mes_check_passed);
                   Begin_memo.Lines.Append('');
                   Begin_memo.Lines.Append(Begin_mes_program_start);
                   //sleep(1000);
                   self.Close;
               end;
            {$ENDREGION 'Печать сообщений, контроль ошибок'}

          end;
    end;
  end
{$ENDREGION: 'Подключение успешно'}
else
{$REGION 'Сообщение об ошибке подключения'}
  begin
   if MessageBox
        (0,
          PChar(begin_mes_second_connect_false),
          Pchar(begin_caption_error),
          MB_ICONINFORMATION or MB_OK
        )=id_OK then
        begin
          BeginForm.Close;
          MainForm.Close;
        end;//выход из программы
  end;
{$ENDREGION 'Сообщение об ошибке подключения'}
end;

end;
end.
