亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产日产欧美一区二区三区| 日韩福利电影在线观看| 亚洲激情图片小说视频| 日韩不卡在线观看日韩不卡视频| 精品一区二区综合| 在线观看三级视频欧美| 欧美电影免费观看高清完整版 | 国产亚洲一二三区| 亚洲综合另类小说| 成人性生交大合| 制服丝袜av成人在线看| 椎名由奈av一区二区三区| 久色婷婷小香蕉久久| 91福利资源站| 国产精品久久一级| 国产成人免费在线视频| 欧美高清激情brazzers| 亚洲精品国产视频| 9i看片成人免费高清| 久久久国际精品| 久久国产精品免费| 3d成人h动漫网站入口| 亚洲日本va午夜在线影院| 国产精品12区| 久久久天堂av| 国产东北露脸精品视频| 日韩欧美国产综合在线一区二区三区| 一区二区三区毛片| 91免费在线看| 亚洲女厕所小便bbb| 99久久综合色| 中文字幕一区二区不卡| 成人黄色777网| 国产精品超碰97尤物18| 国产精品88888| 欧美激情中文字幕一区二区| 国产一区二区三区| 久久久99久久精品欧美| 国产一区二区三区久久久| 日韩欧美成人激情| 精品一区二区三区欧美| 欧美成人综合网站| 国产一区欧美一区| 久久精品视频网| 成人美女在线观看| 中文字幕日韩精品一区 | 972aa.com艺术欧美| 国产精品成人一区二区艾草| av一二三不卡影片| 亚洲欧美激情插 | 欧美一区二区视频在线观看2020| 亚洲国产综合在线| 884aa四虎影成人精品一区| 亚洲va欧美va国产va天堂影院| 欧美日韩精品电影| 麻豆精品国产91久久久久久| 日韩欧美国产综合一区| 成人午夜激情视频| 亚洲精品v日韩精品| 欧美乱妇15p| 国产美女久久久久| 中文字幕一区二区视频| 欧美日韩夫妻久久| 国产麻豆精品95视频| 综合色天天鬼久久鬼色| 欧美午夜片在线看| 久久99国产精品麻豆| 国产精品视频yy9299一区| 日本高清无吗v一区| 偷拍日韩校园综合在线| 久久久午夜电影| 在线免费不卡视频| 久久er精品视频| 亚洲欧美日韩中文字幕一区二区三区| 欧美日韩精品高清| 岛国精品在线观看| 视频在线观看国产精品| 国产欧美日产一区| 欧美男男青年gay1069videost| 国产在线精品免费| 亚洲精品成人少妇| 久久久.com| 制服丝袜亚洲网站| 色综合天天视频在线观看 | 7777精品伊人久久久大香线蕉经典版下载 | 亚洲一区二区中文在线| 日韩写真欧美这视频| 成人深夜视频在线观看| 亚洲午夜一区二区| 国产精品视频免费看| 日韩视频在线你懂得| 91天堂素人约啪| 国产麻豆欧美日韩一区| 无吗不卡中文字幕| 自拍偷拍亚洲激情| 国产欧美一区二区三区网站| 欧美日韩一区成人| 92精品国产成人观看免费| 国产黄色精品视频| 国模无码大尺度一区二区三区| 亚洲国产中文字幕在线视频综合 | 中文字幕日韩一区| 亚洲精品一区二区三区蜜桃下载 | 69堂国产成人免费视频| 国产精品一区二区91| 免费成人结看片| 亚洲成人免费观看| 亚洲成人在线网站| 亚洲国产精品精华液网站| 中文字幕日韩欧美一区二区三区| 国产亚洲一二三区| 欧美极品xxx| 国产蜜臀av在线一区二区三区| 欧美一区二区女人| 91精品一区二区三区在线观看| 在线观看中文字幕不卡| 色八戒一区二区三区| 色综合天天在线| 91免费视频观看| 色婷婷国产精品久久包臀| 99国产精品久久久久久久久久久| 国产mv日韩mv欧美| 国产高清不卡二三区| 国产91综合网| 成人精品国产一区二区4080| 成人中文字幕合集| www.激情成人| 91丨porny丨在线| 91久久一区二区| 欧美性感一区二区三区| 欧美三级在线播放| 91麻豆精品国产91久久久久久久久| 欧美在线综合视频| 欧美美女黄视频| 欧美一级日韩免费不卡| 日韩欧美激情四射| 久久久国产午夜精品| 亚洲国产精品ⅴa在线观看| 国产精品天天看| 亚洲图片你懂的| 亚洲一区二区在线视频| 偷拍亚洲欧洲综合| 国产成人精品三级麻豆| 不卡的av在线| 欧美日韩国产在线播放网站| 91麻豆精品国产91久久久| 91精品午夜视频| 久久精子c满五个校花| 亚洲天堂网中文字| 一级做a爱片久久| 美国毛片一区二区三区| 国产在线精品一区二区夜色| 在线日韩国产精品| 欧美精品丝袜久久久中文字幕| 日韩午夜激情视频| 国产精品你懂的在线| 亚洲一区二区视频在线| 国产美女视频一区| 欧美视频一区在线| 国产欧美一区二区三区网站 | 色婷婷av一区二区三区软件| 欧美二区乱c少妇| 国产日本亚洲高清| 午夜不卡av免费| 国产精品1区2区| 欧美三级电影精品| 国产女人aaa级久久久级| 一区二区三区欧美日韩| 国产一区二区三区免费看 | 成人综合婷婷国产精品久久| 欧美性色aⅴ视频一区日韩精品| 日韩亚洲欧美中文三级| 亚洲天堂2016| 国内精品久久久久影院色 | 欧美一区欧美二区| 日本一区二区不卡视频| 奇米影视一区二区三区| 色综合天天综合给合国产| 久久亚洲一级片| 亚洲1区2区3区视频| 成人激情视频网站| 精品入口麻豆88视频| 亚洲大片在线观看| 91在线视频播放地址| 欧美精品一区二区三区在线| 亚洲成av人**亚洲成av**| 一本一道久久a久久精品综合蜜臀| 欧美tk—视频vk| 亚洲成a人在线观看| 在线免费观看一区| 一区二区三区四区乱视频| 高清在线观看日韩| 久久免费美女视频| 激情综合色播激情啊| 3d成人动漫网站| 日韩国产一区二| 欧美日韩一区二区三区四区| 亚洲乱码日产精品bd| 97se亚洲国产综合自在线| 国产精品家庭影院|