• 远程数据模块远程方法定义


    unit uTestSvr;

    {$WARN SYMBOL_PLATFORM OFF}

    interface

    uses
      Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,
      DBClient, MidServer_TLB, StdVcl, DB, ADODB, Provider, Variants,
      Forms, ThreadComLib;

    type
      TsvrDM = class(TRemoteDataModule, ITest)
      private
        { Private declarations }
        function GetSqlCommand(ModuleId: string; SqlId: Integer): string;
      protected
        class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override;
        function GetDateTime: TDateTime; safecall;
        function GetDate: TDateTime; safecall;
        function QryData(const ModuleId: WideString; SqlId: ShortInt; Params: OleVariant): OleVariant; safecall;
        function ApplyUpdate(const ModuleId: WideString; SqlId: Shortint; Delta: OleVariant): Shortint; safecall;
        function ExecSQL(const ModuleId: WideString; SqlId: Shortint; Params: OleVariant): Shortint; safecall;
        function GetStoredData(const ModuleId: WideString; SqlId: Shortint; Params: OleVariant): OleVariant; safecall;
        function ExecStored(const ModuleId: WideString; SqlId: Shortint; Params: OleVariant):ShortInt; safecall;
        function DownloadFile(const FileName: WideString): OleVariant; safecall;
        function GetFieldsDef(const ModuleId: WideString; SqlId: Shortint): OleVariant; safecall;
        function ApplyUpdates(const ModuleId: WideString; SqlId: ShortInt; Delta0: OleVariant;
                              Delta1: OleVariant; Delta2: OleVariant; Delta3: OleVariant): Shortint; safecall;
        function GetCaptions(const ModuleId: WideString): OleVariant; safecall;
        function ChangePassword(const UserId: WideString; const OldPassword: WideString;
                                const NewPassword: WideString): Shortint; safecall;
        function CheckUser(const UserId: WideString; const Password: WideString): Shortint; safecall;
        function GetRights(const UserId: WideString; const ModuleId:WideString): OleVariant; safecall;                       
      public
        { Public declarations }
      end;

    implementation

    uses uMain, ZLibEx, AdoconnectPool, AdoqueryPool, DSPPool, ProcPool, uFun;

    {$R *.DFM}

    var
      tableList:TStringList;

    class procedure TsvrDM.UpdateRegistry(Register: Boolean; const ClassID, ProgID: string);
    begin
      if Register then
      begin
        inherited UpdateRegistry(Register, ClassID, ProgID);
        EnableSocketTransport(ClassID);
        EnableWebTransport(ClassID);
      end
      else
      begin
        DisableSocketTransport(ClassID);
        DisableWebTransport(ClassID);
        inherited UpdateRegistry(Register, ClassID, ProgID);
      end;
    end;

    function TsvrDM.QryData(const ModuleId: WideString; SqlId: ShortInt;
      Params: OleVariant): OleVariant;
    var
      conn: TADOConnection;
      qry: TADOQuery;
      dsp: TDataSetProvider;
    begin                      
      try
        Result := Null;
        if ModuleId ='' then Exit;
        if SqlId =0 then Exit;
        conn := ConnPool.Lock;
        qry := QryPool.Lock;
        dsp := DSPPooler.Lock;
        try
          qry.Close;
          qry.Connection := conn;
          qry.SQL.Clear;
          qry.SQL.Text := GetSqlCommand(ModuleId, SqlId);
          if Params<>Null then                   // have params
            VariantToParameters(Params, qry.Parameters);
          qry.Open;
          if (qry.Active) and (not qry.IsEmpty) then     // have data
          begin
            dsp.DataSet := qry;
            Result := CompressData(dsp.Data);
          end;
          qry.Close;
        finally
          ConnPool.UnLock(conn);
          QryPool.UnLock(qry);
          DSPPooler.UnLock(dsp);
        end;
      except
        Result :=Null;
        Exit;
      end;
    end;

    function TsvrDM.ApplyUpdate(const ModuleId: WideString;
      SqlId: Shortint; Delta: OleVariant): Shortint;
    const
      sql='Select * from %s where 1<>1';
    var
      ErrCount:Integer;
      conn:TADOConnection;
      qry:TADOQuery;
      dsp:TDataSetProvider;
    begin
      try
        Result:=0;
        if ModuleId ='' then Exit;
        if SqlId =0 then Exit;
        if Delta = Null then Exit;
        conn := ConnPool.Lock;
        qry:=QryPool.Lock;
        dsp:=DSPPooler.Lock;
        try
          qry.Connection := conn;
          qry.Close;
          qry.SQL.Clear;
          qry.SQL.Text:=Format(sql,[GetSqlCommand(ModuleId,SqlId)]);  // table name
          qry.Open;
          dsp.DataSet := qry;
          dsp.ApplyUpdates(DeCompressData(Delta),0,ErrCount);
          qry.Close;
        finally
          ConnPool.UnLock(conn);
          QryPool.UnLock(qry);
          DSPPooler.UnLock(dsp);
        end;
        Result :=1;
      Except
        Result:=0;
        Exit;
      end;
    end;

    function TsvrDM.ExecSQL(const ModuleId: WideString; SqlId: Shortint;
      Params: OleVariant): Shortint;
    var
      conn:TADOConnection;
      qry:TADOQuery;
    begin
      try
        Result := 0;
        if ModuleId ='' then Exit;
        if SqlId =0 then Exit;
        conn:=ConnPool.Lock;
        qry:=QryPool.Lock;
        try
          qry.Close;
          qry.Connection :=conn;
          qry.SQL.Clear;
          qry.SQL.Text := GetSqlCommand(ModuleId, SqlId);
          if Params <>null then                            // have params
            VariantToParameters(Params, qry.Parameters);
          qry.ExecSQL;
          qry.Close;
        finally
          ConnPool.UnLock(conn);
          QryPool.UnLock(qry);
        end;
        Result :=1;
      except
        Result := 0;
        Exit;
      end; 
    end;

    function TsvrDM.GetDateTime: TDateTime;
    begin
      Result := Now;
    end;

    function TsvrDM.GetSqlCommand(ModuleId: string; SqlId: Integer): string;
    var
      conn:TADOConnection;
      qry:TADOQuery;
    begin
      try
        Result :='';
        if ModuleId ='' then Exit;
        if SqlId = 0 then Exit;
        conn :=ConnPool.Lock;
        qry:=QryPool.Lock;
        try
          qry.Close;
          qry.Connection :=conn;
          qry.SQL.Clear;
          qry.SQL.Text := 'select sqlcommand from sys_sql where moduleid =:moduleid and sqlid =:sqlid';
          qry.Parameters.ParamByName('moduleid').Value := ModuleId;
          qry.Parameters.ParamByName('sqlid').Value :=SqlId;
          qry.Open;
          if qry.Active and not qry.IsEmpty then            // have data
            Result := qry.fieldbyname('sqlcommand').AsString;
        finally
          ConnPool.Unlock(conn);
          QryPool.UnLock(qry);
        end;
      except
        Result :='';
        Exit;
      end;
    end;

    function TsvrDM.GetStoredData(const ModuleId: WideString; SqlId: Shortint;
      Params: OleVariant): OleVariant;
    var
      conn:TADOConnection;
      stored: TADOStoredProc;
      dsp:TDataSetProvider;
    begin
      try
        Result :=Null;
        if ModuleId = '' then Exit;
        if SqlId =0 then Exit;
        conn:=ConnPool.Lock;
        stored :=ProcPooler.Lock;
        dsp:=DSPPooler.Lock;
        try
          Stored.Close;
          Stored.Connection :=conn;
          Stored.ProcedureName := GetSqlCommand(ModuleId, SqlId);   // stored procedure name
          if Params <>Null then                              // have params
            VariantToParameters(Params, Stored.Parameters);
          Stored.Prepared := True;
          Stored.Open;
          if (stored.Active) and (not stored.IsEmpty) then    // have data
          begin
            dsp.DataSet :=stored;
            Result := CompressData(dsp.Data);
          end;
          Stored.Close;
        finally
          ConnPool.UnLock(conn);
          ProcPooler.Unlock(stored);
          DSPPooler.Unlock(dsp);
        end;
      except
        Result :=Null;
        Exit;
      end;
    end;

    function TsvrDM.ExecStored(const ModuleId: WideString; SqlId: Shortint;
      Params: OleVariant):ShortInt;
    var
      conn:TADOConnection;
      stored:TADOStoredProc;
    begin
      try
        Result :=0;
        if ModuleId ='' then Exit;
        if SqlId =0 then exit;
        conn :=ConnPool.Lock;
        stored :=ProcPooler.Lock;
        try
          Stored.Close;
          Stored.Connection :=conn;
          Stored.ProcedureName := GetSqlCommand(ModuleId, SqlId);   // stored procedure name
          if Params<>Null then  // have params
            VariantToParameters(Params, Stored.Parameters);
          Stored.ExecProc;
          Stored.Close;
        finally
          ConnPool.UnLock(conn);
          ProcPooler.UnLock(stored);
        end;
        Result :=1;
      except
        Result :=0;
        Exit;
      end;
    end;

    function TsvrDM.DownloadFile(const FileName: WideString): OleVariant;
    var
      v: OleVariant;
    begin
      Result :=Null;
      if FileName ='' then exit;
      if not FileExists(ExtractFilePath(Application.ExeName) + 'download\' + FileName) then Exit;
      try
        try
          g_DownStream.Clear;
          g_DownStream.LoadFromFile(FileName);
          StreamToVariant(g_DownStream, v);
          Result := CompressData(v);
        finally
          g_DownStream.Clear;
        end;
      except
        Result :=Null;
        Exit;
      end;
    end;

    function TsvrDM.GetDate: TDateTime;
    begin
      Result :=Date;
    end;

    function TsvrDM.GetFieldsDef(const ModuleId: WideString;
      SqlId: Shortint): OleVariant;
    var
      conn:TADOConnection;
      qry:TADOQuery;
      dsp:TDataSetProvider;
    begin
      try
        Result :=Null;
        if ModuleId ='' then Exit;
        if SqlId =0 then Exit;
        conn :=ConnPool.Lock;
        qry:=QryPool.Lock;
        dsp:=DSPPooler.Lock;
        try
          qry.Close;
          qry.Connection :=conn;
          qry.SQL.Clear;
          qry.SQL.Text := 'select fieldname, cnName, moduleid, tablename,'+
            'sqlid, index, width, readonly, visible, iskey, issave '
            +'from sys_FieldsDef where moduleid = :moduleid and sqlid = :sqlid';
          qry.Parameters.ParamByName('moduleid').Value := ModuleId;
          qry.Parameters.ParamByName('sqlid').Value :=SqlId;
          qry.Open;
          if (qry.Active) and (not qry.IsEmpty) then  // have data
          begin
            dsp.DataSet := qry;
            Result := CompressData(dsp.Data);
          end;
          qry.Close;
        finally
          ConnPool.Unlock(conn);
          QryPool.UnLock(qry);
          DSPPooler.UnLock(dsp);
        end;
      except
        Result :=Null;
        Exit;
      end;
    end;

    function TsvrDM.GetCaptions(const ModuleId: WideString): OleVariant;
    var
      conn: TADOConnection;
      qry: TADOQuery;
      dsp: TDataSetProvider;
    begin
      try
        Result :=Null;
        if ModuleId ='' then Exit;
        conn :=ConnPool.Lock;
        qry:=QryPool.Lock;
        dsp:=DSPPooler.Lock;
        try
          qry.Close;
          qry.Connection :=conn;
          qry.SQL.Clear;
          qry.SQL.Text := 'select moduleId,controlName,cnName from sys_captions '+
            'where moduleid=:moduleid';
          qry.Parameters.ParamByName('moduleid').Value :=ModuleId;
          qry.Open;
          if (qry.Active) and (not qry.IsEmpty) then   // have data
          begin
            dsp.DataSet := qry;
            Result := CompressData(dsp.Data);
          end;
          qry.Close;
        finally
          ConnPool.Unlock(conn);
          QryPool.UnLock(qry);
          DSPPooler.UnLock(dsp);
        end;
      except
        Result:=Null;
        Exit;
      end;
    end;

    function TsvrDM.ApplyUpdates(const ModuleId: WideString;sqlId:ShortInt; Delta0,
      Delta1, Delta2, Delta3: OleVariant): Shortint;
    const
      sql='Select * from %s where 1<>1'; 
    var
      aData: array of OleVariant;
      i:integer;
      conn:TADOConnection;
      qry:TADOQuery;
      dsp:TDataSetProvider;
      errCount:integer;
    begin
      try
        Result :=0;
        tableList.Clear;
        tableList.DelimitedText:=GetSqlCommand(ModuleId,sqlid); // table name list
        if tableList.Count = 0 then
        begin
          Result :=0;
          exit;
        end;
        if Delta0 <>Null then
        begin
          SetLength(aData, 1);
          aData[0]:=DeCompressData(Delta0);
        end;
        if Delta1<>Null then
        begin
          SetLength(aData,1);
          aData[1]:=DeCompressData(Delta1);
        end;
        if Delta2<>Null then
        begin
          SetLength(aData,2);
          aData[2]:=DeCompressData(Delta2);
        end;
        if Delta3<>Null then
        begin
          SetLength(aData,3);
          aData[3]:=DeCompressData(Delta3);
        end;
        conn:=ConnPool.Lock;
        qry:=QryPool.Lock;
        dsp:=DSPPooler.Lock;
        conn.BeginTrans;
        try
          try
            qry.Connection := conn;
            dsp.DataSet := qry;
            for i:=Low(adata) to High(adata) do
            begin
              qry.Close;
              qry.SQL.Clear;
              qry.SQL.Text:=Format(sql,[tableList.Strings[i]]);  // table name
              qry.Open;
              if (qry.Active) and (aData[i]<>Null) then
                dsp.ApplyUpdates(aData[i],0,ErrCount);
              qry.Close;
            end;
          finally
            ConnPool.Unlock(conn);
            QryPool.UnLock(qry);
            DSPPooler.UnLock(dsp);
          end;
          conn.CommitTrans;
        except
          Result:=0;
          conn.RollbackTrans;
          Exit;
        end;
        Result :=1;
      except
        Result :=0;
        Exit;
      end;
    end;

    function TsvrDM.ChangePassword(const UserId, OldPassword,
      NewPassword: WideString): Shortint;
    var
      conn:TADOConnection;
      qry:TADOQuery;
    begin
      try
        Result :=0;
        if UserId = '' then Exit;
        if OldPassword ='' then exit;
        if NewPassword = '' then Exit;
        if CheckUser(UserId, OldPassword)=0 then Exit;
        conn:=ConnPool.Lock;
        qry:=QryPool.Lock;
        try
          qry.Connection :=conn;
          qry.close;
          qry.SQL.Clear;
          qry.SQL.Text :='update sys_user set password=:password where userid=:userid';
          qry.Parameters.ParamByName('password').Value :=NewPassword;
          qry.Parameters.ParamByName('userid').Value :=UserId;
          qry.ExecSQL;
          qry.Close;
        finally
          ConnPool.Unlock(conn);
          QryPool.UnLock(qry);
        end;
        Result :=1;
      except
        Result :=0;
        Exit;
      end;
    end;

    function TsvrDM.CheckUser(const UserId, Password: WideString): Shortint;
    var
      conn:TADOConnection;
      qry:TADOQuery;
    begin
      try
        Result :=0;
        if UserId ='' then Exit;
        if Password ='' then Exit;
        conn :=ConnPool.Lock;
        qry:=QryPool.Lock;
        try
          qry.Connection :=conn;
          qry.Close;
          qry.SQL.Clear;
          qry.SQL.Text :='select userid from sys_user where userid=:userid '+
            'and password=:password and valid=1';
          qry.Parameters.ParamByName('userid').Value := UserId;
          qry.Parameters.ParamByName('password').Value := Password;
          qry.Open;
          if (qry.Active) and (not qry.IsEmpty) then
            Result :=1;
          qry.Close;
        finally
          ConnPool.Unlock(conn);
          QryPool.UnLock(qry);
        end;  
      except
        Result :=0;
        Exit;
      end;
    end;

    function TsvrDM.GetRights(const UserId: WideString; const ModuleId:WideString): OleVariant;
    var
      conn: TADOConnection;
      qry: TADOQuery;
      dsp: TDataSetProvider;
    begin                      
      try
        Result := Null;
        if UserId ='' then Exit;
        if ModuleId ='' then Exit;
        conn := ConnPool.Lock;
        qry := QryPool.Lock;
        dsp := DSPPooler.Lock;
        try
          qry.Close;
          qry.Connection := conn;
          qry.SQL.Clear;
          qry.SQL.Text := 'select c.canbrowse,c.caninsert,c.canedit,c.candelete, '+
            'c.canpost,c.canprint,c.canimport,c.canexport,c.canverify '+
            'from sys_user a inner join sys_ruler b on a.userid=b.userid '+
            'left join sys_rights c on b.rulerid=c.rulerid '+
            'where a.userid=:userid and c.moduleid=:moduleid';
          qry.Parameters.ParamByName('userid').Value :=UserId;
          qry.Parameters.ParamByName('moduleid').Value :=ModuleId;
          qry.Open;
          if (qry.Active) and (not qry.IsEmpty) then     // have data
          begin
            dsp.DataSet := qry;
            Result := CompressData(dsp.Data);
          end;
          qry.Close;
        finally
          ConnPool.UnLock(conn);
          QryPool.UnLock(qry);
          DSPPooler.UnLock(dsp);
        end;
      except
        Result :=Null;
        Exit;
      end;
    end;

    initialization
      TThreadedClassFactory.Create (ComServer, TsvrDM, CLASS_Test,   // create com thread pooling
        ciMultiInstance);
      tableList :=TStringList.Create;
      tableList.Delimiter:=';';
    finalization
      FreeAndNil(tableList);

    end.

  • 相关阅读:
    问题 A: 走出迷宫(BFS)
    问题 A: 工作团队(并查集删点操作)
    刷题-力扣-989
    刷题-力扣-12
    刷题-力扣-628
    刷题-力扣-11
    刷题-力扣-1018
    刷题-力扣-9
    刷题-力扣-7
    刷题-力扣-6
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2319965.html
Copyright © 2020-2023  润新知