summaryrefslogtreecommitdiff
path: root/fpcsrc/packages/fcl-db/examples/pqeventstest.pp
blob: da395c22bde3693da2e452e9bac03022737ca43e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
program PQEventsTest;

{$mode delphi}{$H+}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  Classes,sysutils,
  PQEventMonitor,pqconnection,sqldb;

const
  MAXEVENTS=35;
  NUMTESTS=100;

type

  { TMyEventAlert }

  TMyEventAlert=class
    class procedure OnPQEvent(Sender: TObject; EventName: string; EventCount: longint;
      var CancelAlerts: boolean);
  end;

var
  EvSent,EvReceived:Array [1..MAXEVENTS] of integer;
  TotalRecieved:integer;

function testNEvents(PQConnection:TPQConnection;n:integer):boolean;
var
  EventsM:TPQEventMonitor;
  i,j,k:integer;
begin
  for i:=1 to MAXEVENTS do
    begin
    EvSent[i]:=0;
    EvReceived[i]:=0;
    end;
  EventsM:=TPQEventMonitor.create(nil);
  EventsM.Connection:=PQConnection;
  for i:=1 to n do
    EventsM.Events.Add('E'+IntToStr(i));
  EventsM.OnEventAlert:=TMyEventAlert.OnPQEvent;
  EventsM.RegisterEvents;
  i:=NUMTESTS;
  TotalRecieved:=0;
  Randomize;
  while i>0 do
    begin
    k:=1+random(n);
    PQConnection.ExecuteDirect('NOTIFY E'+IntTostr(k));
    PQConnection.Transaction.Commit;
    EvSent[k]:=EvSent[k]+1;
    EventsM.Poll;
    i:=i-1;
    end;
  for i:=1 to 300 do  //3 secs max
    begin
    Sleep(10); //wait until everything received
    EventsM.Poll;
    if TotalRecieved=NUMTESTS then
      break;
    end;
  result:=true;
  for i:=1 to n do
    begin
    result:=result and (EvSent[i]=EvReceived[i]);
    end;
  EventsM.Free;
end;

{ TMyEventAlert }

class procedure TMyEventAlert.OnPQEvent(Sender: TObject; EventName: string;
  EventCount: longint; var CancelAlerts: boolean);
var i:integer;
begin
  i:=StrToInt(copy(EventName,2,2));
  EvReceived[i]:=EvReceived[i]+EventCount;
  TotalRecieved:=TotalRecieved+EventCount;
end;

var
  PQConnection1:TPQConnection;
  SQLTransaction1: TSQLTransaction;
  i:integer;

begin
  if paramcount<4 then
    begin
    WriteLn('Usage:');
    WriteLn('  '+Paramstr(0) +' database hostname username password');
    exit;
    end;
  PQConnection1:=TPQConnection.Create(nil);
  SQLTransaction1:= TSQLTransaction.Create(nil);
  PQConnection1.Transaction:=SQLTransaction1;
  SQLTransaction1.DataBase:=PQConnection1;
  PQConnection1.Password:=paramstr(4);
  PQConnection1.UserName:=paramstr(3);
  PQConnection1.HostName:=paramstr(2);
  PQConnection1.DatabaseName:=paramstr(1);
  for i:=1 to 16 do
    begin
    if testNEvents(PQConnection1,i) then
      WriteLn(inttostr(i)+' succeeded')
    else
      WriteLn(inttostr(i)+' failed. Missed '+ IntToStr(NUMTESTS-TotalRecieved)+' Events');
    end;
  SQLTransaction1.Free;
  PQConnection1.Free;
  WriteLn('Tests finished.');
end.