pqeventstest.pp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. program PQEventsTest;
  2. {$mode delphi}{$H+}
  3. uses
  4. {$IFDEF UNIX}
  5. cthreads,
  6. {$ENDIF}
  7. Classes,sysutils,
  8. PQEventMonitor,pqconnection,sqldb;
  9. const
  10. MAXEVENTS=35;
  11. NUMTESTS=100;
  12. type
  13. { TMyEventAlert }
  14. TMyEventAlert=class
  15. class procedure OnPQEvent(Sender: TObject; EventName: string; EventCount: longint;
  16. var CancelAlerts: boolean);
  17. end;
  18. var
  19. EvSent,EvReceived:Array [1..MAXEVENTS] of integer;
  20. TotalRecieved:integer;
  21. function testNEvents(PQConnection:TPQConnection;n:integer):boolean;
  22. var
  23. EventsM:TPQEventMonitor;
  24. i,j,k:integer;
  25. begin
  26. for i:=1 to MAXEVENTS do
  27. begin
  28. EvSent[i]:=0;
  29. EvReceived[i]:=0;
  30. end;
  31. EventsM:=TPQEventMonitor.create(nil);
  32. EventsM.Connection:=PQConnection;
  33. for i:=1 to n do
  34. EventsM.Events.Add('E'+IntToStr(i));
  35. EventsM.OnEventAlert:=TMyEventAlert.OnPQEvent;
  36. EventsM.RegisterEvents;
  37. i:=NUMTESTS;
  38. TotalRecieved:=0;
  39. Randomize;
  40. while i>0 do
  41. begin
  42. k:=1+random(n);
  43. PQConnection.ExecuteDirect('NOTIFY E'+IntTostr(k));
  44. PQConnection.Transaction.Commit;
  45. EvSent[k]:=EvSent[k]+1;
  46. EventsM.Poll;
  47. i:=i-1;
  48. end;
  49. for i:=1 to 300 do //3 secs max
  50. begin
  51. Sleep(10); //wait until everything received
  52. EventsM.Poll;
  53. if TotalRecieved=NUMTESTS then
  54. break;
  55. end;
  56. result:=true;
  57. for i:=1 to n do
  58. begin
  59. result:=result and (EvSent[i]=EvReceived[i]);
  60. end;
  61. EventsM.Free;
  62. end;
  63. { TMyEventAlert }
  64. class procedure TMyEventAlert.OnPQEvent(Sender: TObject; EventName: string;
  65. EventCount: longint; var CancelAlerts: boolean);
  66. var i:integer;
  67. begin
  68. i:=StrToInt(copy(EventName,2,2));
  69. EvReceived[i]:=EvReceived[i]+EventCount;
  70. TotalRecieved:=TotalRecieved+EventCount;
  71. end;
  72. var
  73. PQConnection1:TPQConnection;
  74. SQLTransaction1: TSQLTransaction;
  75. i:integer;
  76. begin
  77. if paramcount<4 then
  78. begin
  79. WriteLn('Usage:');
  80. WriteLn(' '+Paramstr(0) +' database hostname username password');
  81. exit;
  82. end;
  83. PQConnection1:=TPQConnection.Create(nil);
  84. SQLTransaction1:= TSQLTransaction.Create(nil);
  85. PQConnection1.Transaction:=SQLTransaction1;
  86. SQLTransaction1.DataBase:=PQConnection1;
  87. PQConnection1.Password:=paramstr(4);
  88. PQConnection1.UserName:=paramstr(3);
  89. PQConnection1.HostName:=paramstr(2);
  90. PQConnection1.DatabaseName:=paramstr(1);
  91. for i:=1 to 16 do
  92. begin
  93. if testNEvents(PQConnection1,i) then
  94. WriteLn(inttostr(i)+' succeeded')
  95. else
  96. WriteLn(inttostr(i)+' failed. Missed '+ IntToStr(NUMTESTS-TotalRecieved)+' Events');
  97. end;
  98. SQLTransaction1.Free;
  99. PQConnection1.Free;
  100. WriteLn('Tests finished.');
  101. end.