Extra Systems Database
unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, database, table, common;

type
  TMainForm = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Edit3: TEdit;
    Button4: TButton;
    Button5: TButton;
    Memo1: TMemo;
    Button6: TButton;
    Memo2: TMemo;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    Button11: TButton;
    Button12: TButton;
    Button13: TButton;
    Button14: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
    procedure Button12Click(Sender: TObject);
    procedure Button13Click(Sender: TObject);
    procedure Button14Click(Sender: TObject);
  private
     FDatabase : TESDBDatabase;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.DFM}

procedure TMainForm.FormCreate(Sender: TObject);
begin
     FDatabase:=TESDBDatabase.Create;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
     FDatabase.Free;
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
     if FDatabase.CreateDatabase(Edit1.Text, Edit2.Text, StrToInt(Edit3.Text)) then begin
          ShowMessage('База данных успешно создана.');
     end else begin
          ShowMessage('Не удалось создать базу данных.');
     end;
end;

procedure TMainForm.Button2Click(Sender: TObject);
begin
     if FDatabase.Open(Edit1.Text, Edit2.Text, StrToInt(Edit3.Text)) then begin
          Button1.Enabled:=False;
          Button2.Enabled:=False;
          Button3.Enabled:=True;
     end else begin
          ShowMessage('Не удалось подключиться к базе данных.');
     end;
end;

procedure TMainForm.Button3Click(Sender: TObject);
begin
     FDatabase.Close;
     Button1.Enabled:=True;
     Button2.Enabled:=True;
     Button3.Enabled:=False;
end;

procedure TMainForm.Button4Click(Sender: TObject);
var
     i:Integer;
     Field:TESDBField;
     FieldsList:TESDBFieldsList;
     Table:TESDBTable;
begin
     Button4.Enabled:=False;
     FieldsList:=TESDBFieldsList.Create;
     Field.FieldName:='CharField';
     Field.FieldType:=FIELD_TYPE_CHAR;
     Field.FieldLength:=32;
     FieldsList.AddItem(Field);
     Field.FieldName:='IntegerField';
     Field.FieldType:=FIELD_TYPE_INTEGER;
     Field.FieldLength:=4;
     FieldsList.AddItem(Field);
     Field.FieldName:='DateTimeField';
     Field.FieldType:=FIELD_TYPE_DATE;
     Field.FieldLength:=Sizeof(_SYSTEMTIME);
     FieldsList.AddItem(Field);
     if FDatabase.CreateTable('TestTable', FieldsList) then begin
          ShowMessage('Таблица успешно создана.');
     end else begin
          ShowMessage('Таблицу создать не удалось.');
     end;
     Table:=TESDBTable.Create(FDatabase);
     if Table.Open('TestTable') then begin
          ShowMessage('Открыли таблицу.');
          for i:=1 to 100 do begin
               Table.Append;
               Table.SetIntegerField('IntegerField', i);
               Table.SetStringField('CharField', 'Row ' + IntToStr(i));
               Table.SetDateTimeField('DateTimeField', Now);
               Table.Post;
          end;
          Table.Close;
          ShowMessage('Записали таблицу.');
     end else begin
          ShowMessage('Открыть таблицу не удалось.');
     end;
     Table.Free;
     FieldsList.Free;
     Button4.Enabled:=True;
end;

procedure TMainForm.Button5Click(Sender: TObject);
var
     ServerInfo:TESDBServerInfo;
     CurStr:String;
begin
     if FDatabase.GetServerInfo(ServerInfo) then begin
          CurStr:='';
          CurStr:=CurStr + 'Общее количество рабочих потоков: ' + IntToStr(ServerInfo.TotalThreadsCount) + #13#10;
          CurStr:=CurStr + 'Активное количество рабочих потоков: ' + IntToStr(ServerInfo.ActiveThreadsCount) + #13#10;
          CurStr:=CurStr + 'Общее количество БД: ' + IntToStr(ServerInfo.TotalDatabasesCount) + #13#10;
          CurStr:=CurStr + 'Активное количество БД: ' + IntToStr(ServerInfo.ActiveDatabasesCount) + #13#10;
          CurStr:=CurStr + 'Общее количество таблиц: ' + IntToStr(ServerInfo.TotalTablesCount) + #13#10;
          CurStr:=CurStr + 'Активное количество таблиц: ' + IntToStr(ServerInfo.ActiveTablesCount) + #13#10;
          CurStr:=CurStr + 'Общее количество элементов связи: ' + IntToStr(ServerInfo.TotalDatasetsCount) + #13#10;
          CurStr:=CurStr + 'Активное количество элементов связи: ' + IntToStr(ServerInfo.ActiveDatasetsCount) + #13#10;
          ShowMessage(CurStr);
     end else begin
          ShowMessage('Не удалось получить информацию.');
     end;
end;

procedure TMainForm.Button6Click(Sender: TObject);
var
     Table:TESDBTable;
begin
     Button6.Enabled:=False;
     Table:=TESDBTable.Create(FDatabase);
          if Table.Open('TestTable') then begin
               Table.First;
               while not Table.EOF do begin
                    Memo1.Lines.Add(IntToStr(Table.GetIntegerField('IntegerField')) + '. ' + Table.GetStringField('CharField') + ' - ' + FormatDateTime('dd.mm.yyyy hh:nn:ss', Table.GetDateTimeField('DateTimeField')));
                    Table.Next;
               end;
               Table.Last;
               while not Table.BOF do begin
                    Memo2.Lines.Add(IntToStr(Table.GetIntegerField('IntegerField')) + '. ' + Table.GetStringField('CharField'));
                    Table.Prior;
               end;
               Table.Close;
          end else begin
               ShowMessage('Открыть таблицу не удалось.');
          end;
     Table.Free;
     Button6.Enabled:=True;
end;

procedure TMainForm.Button7Click(Sender: TObject);
var
     Table:TESDBTable;
     i:Integer;
begin
     Button7.Enabled:=False;
     Table:=TESDBTable.Create(FDatabase);
          if Table.Open('TestTable') then begin
               Table.First;
               while not Table.EOF do begin
                    i:=Table.GetIntegerField('IntegerField');
                    i:=i and 15;
                    if (i = 0) then begin
                         Table.Edit;
                         Table.SetIntegerField('IntegerField', Table.GetIntegerField('IntegerField') + 1000);
                         Table.Post;
                    end;
                    Table.Next;
               end;
               Table.Close;
          end else begin
               ShowMessage('Открыть таблицу не удалось.');
          end;
     Table.Free;
     Button7.Enabled:=True;
end;

procedure TMainForm.Button8Click(Sender: TObject);
var
     Table:TESDBTable;
begin
     Button8.Enabled:=False;
     Table:=TESDBTable.Create(FDatabase);
     if Table.Open('TestTable') then begin
               Table.First;
               while not Table.EOF do begin
                    Table.Delete;
               end;
               Table.Close;
     end else begin
               ShowMessage('Открыть таблицу не удалось.');
     end;
     Table.Free;
     Button8.Enabled:=True;
end;

procedure TMainForm.Button9Click(Sender: TObject);
var
     CurStr:String;
     TablesList:TESDBTablesList;
     TableItem:TESDBTableItem;
     i:Integer;
begin
     TablesList:=TESDBTablesList.Create;
     if not FDatabase.GetStructure(TablesList) then begin
          ShowMessage('Список таблиц получить не удалось.');
     end else begin
          CurStr:='Список таблиц:'#13#10#13#10;
          i:=0;
          while (i < TablesList.Count) do begin
               TablesList.GetItem(i, TableItem);
               CurStr:=CurStr + 'Имя таблицы: ' + StrPas(@TableItem.TableName[1]) + #13#10;
               CurStr:=CurStr + 'Количество полей: ' + IntToStr(TableItem.FieldsCount) + #13#10;
               CurStr:=CurStr + 'Общее количество записей: ' + IntToStr(TableItem.TotalRecordsCount) + #13#10;
               CurStr:=CurStr + 'Количество активных записей: ' + IntToStr(TableItem.RealRecordsCount) + #13#10;
               CurStr:=CurStr + 'Количество индексов: ' + IntToStr(TableItem.IndexesCount) + #13#10#13#10;
               i:=i + 1;
          end;
          ShowMessage(CurStr);
     end;
     TablesList.Free;
end;

procedure TMainForm.Button10Click(Sender: TObject);
begin
     if FDatabase.DropTable('TestTable') then begin
          ShowMessage('Таблица успешно уничтожена.');
     end else begin
          ShowMessage('Таблицу уничтожить не удалось.');
     end;
end;

procedure TMainForm.Button11Click(Sender: TObject);
begin
     if FDatabase.DropDatabase(Edit1.Text, Edit2.Text, StrToInt(Edit3.Text)) then begin
          ShowMessage('База данных успешно уничтожена.');
     end else begin
          ShowMessage('Не удалось уничтожить базу данных.');
     end;
end;

procedure TMainForm.Button12Click(Sender: TObject);
begin
     if FDatabase.LocalBackup('c:\DBbackup.dat') then begin
          ShowMessage('База данных успешно сохранена.');
     end else begin
          ShowMessage('Не удалось сохранить базу данных.');
     end;
end;

procedure TMainForm.Button13Click(Sender: TObject);
begin
     if FDatabase.RemoteBackup('c:\DBbackup.dat') then begin
          ShowMessage('База данных успешно сохранена.');
     end else begin
          ShowMessage('Не удалось сохранить базу данных.');
     end;
end;

procedure TMainForm.Button14Click(Sender: TObject);
var
     Table:TESDBTable;
begin
     Button14.Enabled:=False;
     Table:=TESDBTable.Create(FDatabase);
     if Table.Open('TestTable') then begin
          if Table.Pack then begin
               ShowMessage('Таблица успешно упакована.');
          end else begin
               ShowMessage('Упаковать таблицу не удалось.');
          end;
          Table.Close;
     end else begin
          ShowMessage('Открыть таблицу не удалось.');
     end;
     Table.Free;
     Button14.Enabled:=True;
end;

end.