亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pooler.pas

?? 在打沙場用的最簡單
?? PAS
字號:
unit pooler;

interface

uses
  ComObj, ActiveX, Classes, SyncObjs, Windows, Pserver_TLB;

type
  TPooler = class(TAutoObject, iSvrRDM)
  private
    function LockRDM: iSvrRDM;
    procedure UnlockRDM(Value: iSvrRDM);
  protected
    { IAppServer }
    function  AS_ApplyUpdates(const ProviderName: WideString; Delta: OleVariant;
                              MaxErrors: Integer; out ErrorCount: Integer; var OwnerData: OleVariant): OleVariant; safecall;
    function  AS_GetRecords(const ProviderName: WideString; Count: Integer; out RecsOut: Integer;
                            Options: Integer; const CommandText: WideString;
                            var Params: OleVariant; var OwnerData: OleVariant): OleVariant; safecall;
    function  AS_DataRequest(const ProviderName: WideString; Data: OleVariant): OleVariant; safecall;
    function  AS_GetProviderNames: OleVariant; safecall;
    function  AS_GetParams(const ProviderName: WideString; var OwnerData: OleVariant): OleVariant; safecall;
    function  AS_RowRequest(const ProviderName: WideString; Row: OleVariant; RequestType: Integer;
                            var OwnerData: OleVariant): OleVariant; safecall;
    procedure AS_Execute(const ProviderName: WideString; const CommandText: WideString;
                         var Params: OleVariant; var OwnerData: OleVariant); safecall;
    {User define function and produce}
    procedure setip(const ip: WideString); safecall;
    function login(const usercode, password: WideString): Integer; safecall;
    function getusername(const usercode, password: WideString): WideString;
      safecall;
    function getadmin(const usercode, password: WideString): WordBool;
      safecall;
    function getapptitle: WideString; safecall;
    function getgroupid(const usercode, username: WideString): Integer;
      safecall;
    function syslog(const fform, fevent, fuser, fpcname: WideString): Integer;
      safecall;
    function execsql(const cmdstr: WideString): WordBool; safecall;
    function getlargedata(const psql: WideString;
      precCount: Integer): OleVariant; safecall;
    function applyupdata(pdelta: OleVariant; const ptablename,
      pkeyfield: WideString): WordBool; safecall;
    function getmaxid(const ptablename, pkeyfield: WideString): Integer;
      safecall;
    function isunique(const ptablename, pkeyfield,
      pkeyvalue: WideString): WordBool; safecall;
    function getnumber(pBilltypeid: Integer): WideString; safecall;
    function getinnunber(pbilltypeid: Integer): Integer; safecall;
    function purchasedetail(pitemid: Integer): OleVariant; safecall;     
  end;

  TPoolManager = class(TObject)
  private
    FRDMList: TList;
    FMaxCount: Integer;
    FTimeout: Integer;
    FCriticalSection: TCriticalSection;
    FSemaphore: THandle;

    function GetLock(Index: Integer): Boolean;
    procedure ReleaseLock(Index: Integer; var Value: iSvrRDM);
    function CreateNewInstance: iSvrRDM;
  public
    constructor Create;
    destructor Destroy; override;
    function LockRDM: iSvrRDM;
    procedure UnlockRDM(var Value: iSvrRDM);

    property Timeout: Integer read FTimeout;
    property MaxCount: Integer read FMaxCount;
  end;

  PRDM = ^TRDM;
  TRDM = record
    Intf: iSvrRDM;
    InUse: Boolean;
  end;

var
  PoolManager: TPoolManager;

implementation

uses ComServ, SysUtils, uSrvRDM;

constructor TPoolManager.Create;
begin
  FRDMList := TList.Create;
  FCriticalSection := TCriticalSection.Create;
  FTimeout := 5000;
  FMaxCount := 15;
  FSemaphore := CreateSemaphore(nil, FMaxCount, FMaxCount, nil);
end;

destructor TPoolManager.Destroy;
var
  i: Integer;
begin
  FCriticalSection.Free;
  for i := 0 to FRDMList.Count - 1 do
  begin
    PRDM(FRDMList[i]).Intf := nil;
    FreeMem(PRDM(FRDMList[i]));
  end;
  FRDMList.Free;
  CloseHandle(FSemaphore);
  inherited Destroy;
end;

function TPoolManager.GetLock(Index: Integer): Boolean;
begin
  FCriticalSection.Enter;
  try
    Result := not PRDM(FRDMList[Index]).InUse;
    if Result then
      PRDM(FRDMList[Index]).InUse := True;
  finally
    FCriticalSection.Leave;
  end;
end;

procedure TPoolManager.ReleaseLock(Index: Integer; var Value: iSvrRDM);
begin
  FCriticalSection.Enter;
  try
    PRDM(FRDMList[Index]).InUse := False;
    Value := nil;
    ReleaseSemaphore(FSemaphore, 1, nil);
  finally
    FCriticalSection.Leave;
  end;
end;

function TPoolManager.CreateNewInstance: iSvrRDM;
var
  p: PRDM;
begin
  FCriticalSection.Enter;
  try
    New(p);
    p.Intf := RDMFactory.CreateComObject(nil) as iSvrRDM;
    p.InUse := True;
    FRDMList.Add(p);
    Result := p.Intf;
  finally
    FCriticalSection.Leave;
  end;
end;

function TPoolManager.LockRDM: iSvrRDM;
var
  i: Integer;
begin
  Result := nil;
  if WaitForSingleObject(FSemaphore, Timeout) = WAIT_FAILED then
    raise Exception.Create('Server too busy');
  for i := 0 to FRDMList.Count - 1 do
  begin
    if GetLock(i) then
    begin
      Result := PRDM(FRDMList[i]).Intf;
      Exit;
    end;
  end;
  if FRDMList.Count < MaxCount then
    Result := CreateNewInstance;
  if Result = nil then { This shouldn't happen because of the sempahore locks }
    raise Exception.Create('Unable to lock RDM');
end;

procedure TPoolManager.UnlockRDM(var Value: iSvrRDM);
var
  i: Integer;
begin
  for i := 0 to FRDMList.Count - 1 do
  begin
    if Value = PRDM(FRDMList[i]).Intf then
    begin
      ReleaseLock(i, Value);
      break;
    end;
  end;
end;

{
  Each call for the server is wrapped in a call to retrieve the RDM, and then
  when it is finished it releases the RDM.
}

function TPooler.LockRDM: iSvrRDM;
begin
  Result := PoolManager.LockRDM;
end;

procedure TPooler.UnlockRDM(Value: iSvrRDM);
begin
  PoolManager.UnlockRDM(Value);
end;

function TPooler.AS_ApplyUpdates(const ProviderName: WideString;
  Delta: OleVariant; MaxErrors: Integer; out ErrorCount: Integer;
  var OwnerData: OleVariant): OleVariant;
var
  RDM: iSvrRDM;
begin
  RDM := LockRDM;
  try
    Result := RDM.AS_ApplyUpdates(ProviderName, Delta, MaxErrors, ErrorCount, OwnerData);
  finally
    UnlockRDM(RDM);
  end;
end;

function TPooler.AS_DataRequest(const ProviderName: WideString;
  Data: OleVariant): OleVariant;
var
  RDM: iSvrRDM;
begin
  RDM := LockRDM;
  try
    Result := RDM.AS_DataRequest(ProviderName, Data);
  finally
    UnlockRDM(RDM);
  end;
end;

procedure TPooler.AS_Execute(const ProviderName, CommandText: WideString;
  var Params, OwnerData: OleVariant);
var
  RDM: iSvrRDM;
begin
  RDM := LockRDM;
  try
    RDM.AS_Execute(ProviderName, CommandText, Params, OwnerData);
  finally
    UnlockRDM(RDM);
  end;
end;

function TPooler.AS_GetParams(const ProviderName: WideString;
  var OwnerData: OleVariant): OleVariant;
var
  RDM: iSvrRDM;
begin
  RDM := LockRDM;
  try
    Result := RDM.AS_GetParams(ProviderName, OwnerData);
  finally
    UnlockRDM(RDM);
  end;
end;

function TPooler.AS_GetProviderNames: OleVariant;
var
  RDM: iSvrRDM;
begin
  RDM := LockRDM;
  try
    Result := RDM.AS_GetProviderNames;
  finally
    UnlockRDM(RDM);
  end;
end;

function TPooler.AS_GetRecords(const ProviderName: WideString;
  Count: Integer; out RecsOut: Integer; Options: Integer;
  const CommandText: WideString; var Params,
  OwnerData: OleVariant): OleVariant;
var
  RDM: iSvrRDM;
begin
  RDM := LockRDM;
  try
    Result := RDM.AS_GetRecords(ProviderName, Count, RecsOut, Options,
      CommandText, Params, OwnerData);
  finally
    UnlockRDM(RDM);
  end;
end;

function TPooler.AS_RowRequest(const ProviderName: WideString;
  Row: OleVariant; RequestType: Integer;
  var OwnerData: OleVariant): OleVariant;
var
  RDM: iSvrRDM;
begin
  RDM := LockRDM;
  try
    Result := RDM.AS_RowRequest(ProviderName, Row, RequestType, OwnerData);
  finally
    UnlockRDM(RDM);
  end;
end;

procedure TPooler.setip(const ip: WideString);
var
  RDM:iSvrRDM;
begin
  RDM:=LockRDM;
  try
    Rdm.setip(ip);
  finally
    UnLockRDM(RDM);
  end;
end;

function TPooler.login(const usercode, password: WideString): Integer;
var
  RDM:iSvrRDM;
begin
  RDM:=LockRDM;
  try
    Result:=RDM.login(usercode,password);
  finally
    UnLockRDM(RDM);
  end;
end;

function TPooler.getadmin(const usercode, password: WideString): WordBool;
var
  RDM:iSvrRDM;
begin
  RDM:=LockRDM;
  try
    Result:=RDM.GetAdmin(usercode,password);
  finally
    UnLockRDM(RDM);
  end;
end;

function TPooler.getapptitle: WideString;
var
  RDM:iSvrRDM;
begin
  RDM:=LockRDM;
  try
    Result:=RDM.Getapptitle;
  finally
    UnLockRDM(RDM);
  end;
end;

function TPooler.getgroupid(const usercode, username: WideString): Integer;
var
  RDM:iSvrRDM;
begin
  RDM:=LockRDM;
  try
    Result:=RDM.getgroupid(usercode,username);
  finally
    UnLockRDM(RDM);
  end;
end;

function TPooler.getusername(const usercode,
  password: WideString): WideString;
var
  RDM:iSvrRDM;
begin
  RDM:=LockRDM;
  try
    Result:=RDM.getusername(usercode,password);
  finally
    UnLockRDM(RDM);
  end;
end;

function TPooler.syslog(const fform, fevent, fuser,
  fpcname: WideString): Integer;
var
  RDM:iSvrRDM;
begin
  RDM:=LockRDM;
  try
    Result:=RDM.syslog(fform,fevent,fuser,fpcname);
  finally
    UnLockRDM(RDM);
  end;
end;

function TPooler.execsql(const cmdstr: WideString): WordBool;
var
  RDM:iSvrRDM;
begin
  RDM:=LockRDM;
  try
    Result:=RDM.execsql(cmdstr);
  finally
    UnLockRDM(RDM);
  end;
end;

function TPooler.getlargedata(const psql: WideString;
  precCount: Integer): OleVariant;
var
  RDM:iSvrRDM;
begin
  RDM:=LockRDM;
  try
    Result:=RDM.getlargedata(psql,precCount);
  finally
    UnLockRDM(RDM);
  end;
end;

function TPooler.applyupdata(pdelta: OleVariant; const ptablename,
  pkeyfield: WideString): WordBool;
var
  RDM:iSvrRDM;
begin
  RDM:=LockRDM;
  try
    Result:=RDM.applyupdata(pdelta,ptablename,pkeyfield);
  finally
    UnLockRDM(RDM);
  end;
end;

function TPooler.getmaxid(const ptablename,
  pkeyfield: WideString): Integer;
var
  RDM:iSvrRDM;
begin
  RDM:=LockRDM;
  try
    Result:=RDM.getmaxid(ptablename,pkeyfield);
  finally
    UnLockRDM(RDM);
  end;
end;

function TPooler.isunique(const ptablename, pkeyfield,
  pkeyvalue: WideString): WordBool;
var
  RDM:iSvrRDM;
begin
  RDM:=LockRDM;
  try
    Result:=RDM.isunique(ptablename,pkeyfield,pkeyvalue);
  finally
    UnLockRDM(RDM);
  end;
end;

function TPooler.getnumber(pBilltypeid: Integer): WideString;
var
  RDM:iSvrRDM;
begin
  RDM:=LockRDM;
  try
    Result:=RDM.getnumber(pBilltypeid);
  finally
    UnLockRDM(RDM);
  end;
end;

function TPooler.getinnunber(pbilltypeid: Integer): Integer;
var
  RDM:iSvrRDM;
begin
  RDM:=LockRDM;
  try
    Result:=RDM.Getinnunber(pbilltypeid);
  finally
    UnLockRDM(RDM);
  end;
end;

function TPooler.purchasedetail(pitemid: Integer): OleVariant;
var
  RDM:iSvrRDM;
begin
  RDM:=LockRDM;
  try
    Result:=RDM.purchasedetail(pitemid);
  finally
    UnLockRDM(RDM);
  end;
end;

initialization
  PoolManager := TPoolManager.Create;
  TAutoObjectFactory.Create(ComServer, TPooler, Class_pooler, ciMultiInstance, tmFree);
finalization
  PoolManager.Free;
end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人你懂的| 国产风韵犹存在线视精品| 亚洲一区二区三区四区五区中文| 欧美精品一区二区在线播放| 欧美日韩国产大片| 欧美三级资源在线| 正在播放一区二区| 精品国产亚洲在线| 国产精品国产三级国产aⅴ无密码| 欧美吞精做爰啪啪高潮| 99久久99久久免费精品蜜臀| 高清成人免费视频| 99久久99久久精品免费观看| 色综合久久久网| 国产精品一级二级三级| 蜜臀av性久久久久蜜臀aⅴ | 蜜臀av性久久久久蜜臀av麻豆| 图片区小说区国产精品视频| 国精产品一区一区三区mba桃花| 成人三级伦理片| 麻豆成人久久精品二区三区红| 亚洲综合免费观看高清完整版| 午夜精品久久久久久久久| 裸体一区二区三区| 国产精品一区二区在线播放| 成人动漫在线一区| 在线观看91视频| 日韩欧美成人午夜| 国产精品视频一二| 日韩精品一区第一页| 日本亚洲三级在线| 色综合天天综合网国产成人综合天| jiyouzz国产精品久久| 色婷婷精品久久二区二区蜜臂av| 日韩欧美亚洲另类制服综合在线| 国产精品毛片高清在线完整版| 亚洲成人黄色小说| 精品99999| 国产在线一区二区综合免费视频| 91在线播放网址| 亚洲精品一区二区三区99| 亚洲国产三级在线| 波多野结衣欧美| 最好看的中文字幕久久| 国产电影精品久久禁18| 国产视频911| 91啪九色porn原创视频在线观看| 国产欧美日韩激情| 99久久er热在这里只有精品66| 亚洲精品国产无天堂网2021| 91啪九色porn原创视频在线观看| 另类中文字幕网| 日韩一区二区三区在线观看 | 在线播放欧美女士性生活| 另类小说综合欧美亚洲| 日韩一二三区不卡| 老司机免费视频一区二区| 精品国产乱码久久久久久影片| 亚洲成av人片在线| 欧美精品xxxxbbbb| 国产精品99久久久久久久vr| 欧美在线播放高清精品| 性欧美疯狂xxxxbbbb| 久久综合久久久久88| 不卡电影一区二区三区| 亚洲色图欧洲色图婷婷| 成人黄色av电影| 亚洲精品亚洲人成人网在线播放| 91蝌蚪国产九色| 美女网站在线免费欧美精品| 国产精品18久久久久久久久久久久 | 久久综合九色综合欧美就去吻| 成人av资源在线| 91福利区一区二区三区| 一本一道波多野结衣一区二区| 99精品视频一区| 一本久久a久久免费精品不卡| 99精品国产99久久久久久白柏| 成人av一区二区三区| 欧美在线一区二区三区| 欧美剧情片在线观看| 久久视频一区二区| 国产精品欧美久久久久无广告| 国产精品国产馆在线真实露脸| 国产午夜精品一区二区三区四区| 制服丝袜中文字幕亚洲| 欧美日本一区二区在线观看| 国产91精品欧美| 极品美女销魂一区二区三区| 久久国产精品色婷婷| 美女脱光内衣内裤视频久久影院| 国产在线一区二区| 这里只有精品免费| 亚洲欧美日韩成人高清在线一区| 亚洲第一在线综合网站| www.日本不卡| 91精品国产综合久久香蕉麻豆| 国产精品久久久久久久裸模| 麻豆精品视频在线观看| 色婷婷精品久久二区二区蜜臂av| 精品国产91乱码一区二区三区 | 色婷婷久久99综合精品jk白丝| jiyouzz国产精品久久| 欧美在线一区二区| 久久无码av三级| 午夜精品福利一区二区蜜股av| 亚洲最新视频在线播放| 视频一区二区中文字幕| 亚洲国产精品久久人人爱蜜臀| 欧美性三三影院| 亚洲精品国产无天堂网2021| 在线免费观看成人短视频| 亚洲女同ⅹxx女同tv| 日本精品视频一区二区| 一区二区免费看| 福利91精品一区二区三区| 欧美日韩免费观看一区三区| 欧美mv日韩mv国产网站| 午夜欧美电影在线观看| 精品入口麻豆88视频| 激情综合色播激情啊| 色香蕉成人二区免费| 亚洲国产精品高清| 精品一区二区三区免费观看| 精品国产乱码久久久久久老虎| 激情五月激情综合网| 26uuuu精品一区二区| 成人18视频在线播放| 亚洲精品国产视频| 欧美日韩亚洲不卡| 国产成人免费视频| 精品国产区一区| 粉嫩高潮美女一区二区三区| 天天亚洲美女在线视频| 国产精品久久久久久亚洲伦| 欧美日韩国产bt| 福利91精品一区二区三区| 一区二区三区**美女毛片| 欧美xxxxx牲另类人与| 国产不卡视频一区二区三区| 国产精品三级久久久久三级| 国产高清不卡二三区| 自拍偷自拍亚洲精品播放| 欧美片在线播放| 国产在线精品一区二区三区不卡| 欧美福利视频导航| 日韩精品欧美精品| 中文字幕不卡三区| 色哟哟一区二区三区| 日韩精品91亚洲二区在线观看| 91精品婷婷国产综合久久竹菊| 色94色欧美sute亚洲线路一ni| 成人av网站在线| 色婷婷激情久久| 日本韩国精品一区二区在线观看| 免费高清不卡av| 国产成人高清在线| 成人黄色国产精品网站大全在线免费观看 | 中国av一区二区三区| 日韩精品一区二区三区蜜臀 | 精品久久久三级丝袜| 欧美午夜精品一区二区蜜桃 | 精品乱码亚洲一区二区不卡| 在线观看亚洲精品视频| 欧美日韩夫妻久久| 精品国产3级a| 亚洲精品va在线观看| 亚洲国产cao| 国产在线国偷精品免费看| 国产成人亚洲综合a∨猫咪| 福利电影一区二区| 91在线看国产| 国产一区二区三区四区在线观看| 蜜臀av性久久久久蜜臀aⅴ流畅| 中文字幕在线一区| 亚洲视频狠狠干| 亚洲国产精品久久久久秋霞影院| 麻豆国产欧美一区二区三区| 欧美日韩视频在线一区二区| 国产欧美一区二区精品久导航 | 欧美www视频| 在线亚洲+欧美+日本专区| 7777精品伊人久久久大香线蕉超级流畅 | 精品久久久久一区| 一区二区三区在线播放| 一区二区在线观看视频在线观看| 国产成人鲁色资源国产91色综| 日韩欧美国产综合| 日本欧美韩国一区三区| 91视频在线看| 亚洲国产婷婷综合在线精品| 99这里都是精品| 一区二区三区在线观看国产 | 制服.丝袜.亚洲.中文.综合| 欧美激情一区二区三区在线| 中文字幕一区二区三区色视频 | 欧美日韩精品一区二区三区 | 三级一区在线视频先锋 | 精东粉嫩av免费一区二区三区| 欧美大片拔萝卜|