Making a PING with Delphi and the WMI

Tuesday, 26 May, 2015 Leave a comment

program WMIPing;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils,
  ActiveX,
  ComObj,
  Variants;
 
function GetStatusCodeStr(statusCode:integer) : string;
begin
  case statusCode of
    0     : Result:='Success';
    11001 : Result:='Buffer Too Small';
    11002 : Result:='Destination Net Unreachable';
    11003 : Result:='Destination Host Unreachable';
    11004 : Result:='Destination Protocol Unreachable';
    11005 : Result:='Destination Port Unreachable';
    11006 : Result:='No Resources';
    11007 : Result:='Bad Option';
    11008 : Result:='Hardware Error';
    11009 : Result:='Packet Too Big';
    11010 : Result:='Request Timed Out';
    11011 : Result:='Bad Request';
    11012 : Result:='Bad Route';
    11013 : Result:='TimeToLive Expired Transit';
    11014 : Result:='TimeToLive Expired Reassembly';
    11015 : Result:='Parameter Problem';
    11016 : Result:='Source Quench';
    11017 : Result:='Option Too Big';
    11018 : Result:='Bad Destination';
    11032 : Result:='Negotiating IPSEC';
    11050 : Result:='General Failure'
    else
    result:='Unknow';
  end;
end;
 
 
//The form of the Address parameter can be either the computer name (wxyz1234), IPv4 address (192.168.177.124), or IPv6 address (2010:836B:4179::836B:4179).
procedure  Ping(const Address:string;Retries,BufferSize:Word);
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
  i             : Integer;
 
  PacketsReceived : Integer;
  Minimum         : Integer;
  Maximum         : Integer;
  Average         : Integer;
begin;
  PacketsReceived:=0;
  Minimum        :=0;
  Maximum        :=0;
  Average        :=0;
  Writeln('');
  Writeln(Format('Pinging %s with %d bytes of data:',[Address,BufferSize]));
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
  //FWMIService   := FSWbemLocator.ConnectServer('192.168.52.130', 'root\CIMV2', 'user', 'password');
  for i := 0 to Retries-1 do
  begin
    FWbemObjectSet:= FWMIService.ExecQuery(Format('SELECT * FROM Win32_PingStatus where Address=%s AND BufferSize=%d',[QuotedStr(Address),BufferSize]),'WQL',0);
    oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
    if oEnum.Next(1, FWbemObject, iValue) = 0 then
    begin
      if FWbemObject.StatusCode=0 then
      begin
        if FWbemObject.ResponseTime>0 then
          Writeln(Format('Reply from %s: bytes=%s time=%sms TTL=%s',[FWbemObject.ProtocolAddress,FWbemObject.ReplySize,FWbemObject.ResponseTime,FWbemObject.TimeToLive]))
        else
          Writeln(Format('Reply from %s: bytes=%s time=<1ms TTL=%s',[FWbemObject.ProtocolAddress,FWbemObject.ReplySize,FWbemObject.TimeToLive]));
 
        Inc(PacketsReceived);
 
        if FWbemObject.ResponseTime>Maximum then
        Maximum:=FWbemObject.ResponseTime;
 
        if Minimum=0 then
        Minimum:=Maximum;
 
        if FWbemObject.ResponseTime<Minimum then
        Minimum:=FWbemObject.ResponseTime;
 
        Average:=Average+FWbemObject.ResponseTime;
      end
      else
      if not VarIsNull(FWbemObject.StatusCode) then
        Writeln(Format('Reply from %s: %s',[FWbemObject.ProtocolAddress,GetStatusCodeStr(FWbemObject.StatusCode)]))
      else
        Writeln(Format('Reply from %s: %s',[Address,'Error processing request']));
    end;
    FWbemObject:=Unassigned;
    FWbemObjectSet:=Unassigned;
    //Sleep(500);
  end;
 
  Writeln('');
  Writeln(Format('Ping statistics for %s:',[Address]));
  Writeln(Format('    Packets: Sent = %d, Received = %d, Lost = %d (%d%% loss),',[Retries,PacketsReceived,Retries-PacketsReceived,Round((Retries-PacketsReceived)*100/Retries)]));
  if PacketsReceived>0 then
  begin
   Writeln('Approximate round trip times in milli-seconds:');
   Writeln(Format('    Minimum = %dms, Maximum = %dms, Average = %dms',[Minimum,Maximum,Round(Average/PacketsReceived)]));
  end;
end;
 
 
begin
 try
    CoInitialize(nil);
    try
      //Ping('192.168.52.130',4,32);
      Ping('theroadtodelphi.wordpress.com',4,32);
    finally
      CoUninitialize;
    end;
 except
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Readln;
end.

And the output
ping
©

Categories: Delphi Tags:

TO_CHAR(…, ‘D’)

Tuesday, 23 August, 2011 3 comments
to_char(nchar-clob-or-nclob)

to_char(datetime-or-interval)
to_char(datetime-or-interval, 'format-string')
to_char(datetime-or-interval, 'format-string', 'nlsparam')

to_char(number)
to_char(number,'format-string')
to_char(number,'format-string', 'nlsparam')

How do I get than MONDAY=1, TUESDAY=2, WEDNESDAY=3 … ?
solution1
With to_char()

alter session set nls_territory=germany;
select to_char(sysdate,’DAY D’) from dual;
TUESDAY 2

solution2
With decode()

The abbrivation of a day’s name (such as SUN, MON … can be retrieved with the format specifier DY. As to_char is sensitive to the actual nls setting, I use nls_date_language=english to make sure that the english abbreviation is returned, regardless of the nls setting.

select decode(to_char(sysdate, ‘FMDAY’, ‘NLS_DATE_LANGUAGE=american’),’MONDAY’, ’1′, ‘TUESDAY’, ’2′, ‘…’)) from dual;

solution3
With mod()
As a reference, I take monday Jan 1st, 1000.

select mod(trunc(sysdate)-date ’1000-01-01′,7)+1 from dual;
  • bonus )))
  • How do I trunc date to current monday?

    trunc(date, ‘D’) or here is with my solution with 1000-01-01:

    select trunc((sysdate-date ’1000-01-01′)/7)*7+date ’1000-01-01′ from dual;
    

    thanks to jan-marcel idea, I found that one
    trunc(date,’IW’) for current monday and date-trunc(date,’IW’)+1 for day number

    Spelling a number

    select to_char(to_date('429','J'),'Jsp') from dual;
    TO_CHAR(TO_DATE('429','J
    ------------------------
    Four Hundred Twenty-Nine
    

    from1
    from2

    Categories: PL/SQL Tags: , ,

    Extraction of consecutive periods (without regard to the OverLap)

    Thursday, 18 August, 2011 Leave a comment

    kikanT
    ID StaD EndD
    -- ---------- ----------
    10 2010-06-01 2010-06-12
    10 2010-06-13 2010-06-14
    10 2010-06-15 null
    20 2010-06-01 2010-06-11
    20 2010-06-13 2010-06-15
    50 2010-11-11 2010-11-13
    50 2010-11-14 2010-11-20
    50 2010-12-22 2010-12-30

    Summarized in consecutive periods every ID.

    ID StaD EndD
    -- ---------- ----------
    10 2010-06-01 null
    20 2010-06-01 2010-06-11
    20 2010-06-13 2010-06-15
    50 2010-11-11 2010-11-20
    50 2010-12-22 2010-12-30

    Data creation script

    create table kikanT(ID,StaD,EndD) as
    select 10,date '2010-06-01',date '2010-06-12' from dual union
    select 10,date '2010-06-13',date '2010-06-14' from dual union
    select 10,date '2010-06-15',null              from dual union
    select 20,date '2010-06-01',date '2010-06-11' from dual union
    select 20,date '2010-06-13',date '2010-06-15' from dual union
    select 50,date '2010-11-11',date '2010-11-13' from dual union
    select 50,date '2010-11-14',date '2010-11-20' from dual union
    select 50,date '2010-12-22',date '2010-12-30' from dual;
    

    Solution1
    How to use hierarchical queries (> 10g)

    select ID,min(connect_by_root StaD) as StaD,EndD
      from kikanT
     where connect_by_IsLeaf = 1
    connect by prior ID=ID
           and prior EndD+1=StaD
    group by ID,EndD
    order by ID,EndD;
    

    Solution2
    Analysis of the relevant number

    select ID,min(StaD) as StaD,
    max(EndD) Keep(Dense_Rank Last order by EndD) as EndD
      from (select ID,StaD,EndD,
            sum(willSum) over(partition by ID order by StaD) as GID
            from (select ID,StaD,EndD,
                  case when StaD = 1+Lag(EndD) over(partition by ID order by StaD)
                       then 0 else 1 end as willSum
                    from kikanT))
    group by ID,GID
    order by ID,GID;
    
    Categories: PL/SQL Tags: , , ,

    Summarizes the start and end dates (or how to eleminate overlaps in dates)

    Thursday, 18 August, 2011 1 comment

    TimeSheet table
    StartDate EndDate
    ---------- ----------
    2005-01-01 2005-01-03
    2005-01-02 2005-01-04
    2005-01-04 2005-01-05
    2005-01-06 2005-01-09
    2005-01-09 2005-01-09
    2005-01-12 2005-01-15
    2005-01-13 2005-01-14
    2005-01-14 2005-01-14
    2005-01-17 2005-01-17

    result
    StartDate EndDate
    ---------- ----------
    2005-01-01 2005-01-05
    2005-01-06 2005-01-09
    2005-01-12 2005-01-15
    2005-01-17 2005-01-17

    Data creation script

    create table TimeSheets(
    StartDate Date,
    EndDate   Date,
    primary key (StartDate));
    
    insert into TimeSheets values(to_date('20050101','yyyymmdd'),to_date('20050103','yyyymmdd'));
    insert into TimeSheets values(to_date('20050102','yyyymmdd'),to_date('20050104','yyyymmdd'));
    insert into TimeSheets values(to_date('20050104','yyyymmdd'),to_date('20050105','yyyymmdd'));
    insert into TimeSheets values(to_date('20050106','yyyymmdd'),to_date('20050109','yyyymmdd'));
    insert into TimeSheets values(to_date('20050109','yyyymmdd'),to_date('20050109','yyyymmdd'));
    insert into TimeSheets values(to_date('20050112','yyyymmdd'),to_date('20050115','yyyymmdd'));
    insert into TimeSheets values(to_date('20050113','yyyymmdd'),to_date('20050114','yyyymmdd'));
    insert into TimeSheets values(to_date('20050114','yyyymmdd'),to_date('20050114','yyyymmdd'));
    insert into TimeSheets values(to_date('20050117','yyyymmdd'),to_date('20050117','yyyymmdd'));
    commit;
    

    SQL

    Solution 1
    How to use an inline view

    select StartDate,min(EndDate) as EndDate
    from
    (select a.StartDate,b.EndDate
       from TimeSheets a,TimeSheets b
      where a.EndDate     and not exists(select 1 from TimeSheets c
                        where (c.StartDate <  a.StartDate and a.StartDate                        or (c.StartDate group by StartDate
    order by StartDate;
    

    Solution 2
    How to use an inline view

    select a.StartDate,min(b.EndDate) as EndDate
       from TimeSheets a,TimeSheets b
      where a.EndDate     and not exists(select 1 from TimeSheets c
                        where (c.StartDate <  a.StartDate and a.StartDate                        or (c.StartDate group by a.StartDate
    order by a.StartDate;
    

    Solution 3
    How to use an inline view

    SELECT startdate, MIN(enddate) AS enddate
      FROM (SELECT T1.startdate, T2.enddate
              FROM Timesheets T1, Timesheets T2
             WHERE T1.enddate  T3.startdate AND T1.startdate = T3.startdate AND T2.enddate < T3.enddate)))
     GROUP BY startdate;
    

    Solution 4
    How to use an inline view

    SELECT startdate, MIN(enddate) AS enddate
      FROM (SELECT T1.startdate AS startdate, T2.enddate AS enddate
              FROM Timesheets T1, Timesheets T2, Timesheets T3
             WHERE T1.enddate  T3.startdate AND T1.startdate = T3.startdate AND T2.enddate < T3.enddate) THEN 1 END) = 0)
     GROUP BY startdate;
    

    Solution 5
    How to use a hierarchical queries (> 10g)

    select min(connect_by_root StartDate) as StartDate,EndDate
      from TimeSheets
     where connect_by_IsLeaf = 1
    connect by nocycle prior EndDate between StartDate and EndDate
    group by EndDate
    order by StartDate;
    

    Solution 6
    How to use hierarchical queries (> 10g)

    select connect_by_root StartDate as StartDate,EndDate
      from TimeSheets a
     where connect_by_IsLeaf = 1
    start with not exists(select 1 from TimeSheets b
                           where a.RowID != b.RowID
                             and a.StartDate between b.StartDate and b.EndDate)
    connect by nocycle prior EndDate between StartDate and EndDate
    order by StartDate;
    

    Solution 7
    How to use analysis of the relevant number range

    select min(StartDate) as StartDate,max(EndDate) as EndDate
    from (select StartDate,EndDate,
          sum(willSum) over(order by StartDate) as GID
          from (select StartDate,EndDate,
                case when StartDate
                                                     range between unbounded preceding
                                                 and 1 preceding)
                     then 0 else 1 end as willSum
                  from TimeSheets))
    group by GID
    order by StartDate;
    

    from

    Categories: PL/SQL Tags: , , ,

    How does one get the time difference between two date columns?

    Friday, 12 August, 2011 Leave a comment

    Oracle allows two date values to be subtracted from each other returning a numeric value indicating the number of days between the two dates (may be a fraction). This example will show how to relate it back to a time value.

    Let’s investigate some solutions. Test data:

    CREATE TABLE dates (date1 DATE, date2 DATE);
    INSERT INTO dates VALUES (SYSDATE, SYSDATE-1);
    INSERT INTO dates VALUES (SYSDATE, SYSDATE-1/24);
    INSERT INTO dates VALUES (SYSDATE, SYSDATE-1/60/24);
    SELECT (date1 - date2) FROM dates;
    
    DATE1-DATE2
    -----------
    1
    .041666667
    .000694444
    

    Solution 1

    SELECT floor(((date1-date2)*24*60*60)/3600)
    || ' HOURS ' ||
    floor((((date1-date2)*24*60*60) -
    floor(((date1-date2)*24*60*60)/3600)*3600)/60)
    || ' MINUTES ' ||
    round((((date1-date2)*24*60*60) -
    floor(((date1-date2)*24*60*60)/3600)*3600 -
    (floor((((date1-date2)*24*60*60) -
    floor(((date1-date2)*24*60*60)/3600)*3600)/60)*60) ))
    || ' SECS ' time_difference
    FROM dates;
    
    TIME_DIFFERENCE
    --------------------------------------------------------------------------------
    24 HOURS 0 MINUTES 0 SECS
    1 HOURS 0 MINUTES 0 SECS
    0 HOURS 1 MINUTES 0 SECS
    

    An enhancement to solution 1

    SELECT floor((date1-date2)*24)
    || ' HOURS ' ||
    mod(floor((date1-date2)*24*60),60)
    || ' MINUTES ' ||
    mod(floor((date1-date2)*24*60*60),60)
    || ' SECS ' time_difference
    FROM dates;</code>
    
    TIME_DIFFERENCE
    --------------------------------------------------------------------------------
    24 HOURS 0 MINUTES 0 SECS
    1 HOURS 0 MINUTES 0 SECS
    0 HOURS 1 MINUTES 0 SECS
    

    Solution 2

    If you don’t want to go through the floor and ceiling math, try this method (contributed by Erik Wile):

    SELECT to_number( to_char(to_date('1','J') +
    (date1 - date2), 'J') - 1) days,
    to_char(to_date('00:00:00','HH24:MI:SS') +
    (date1 - date2), 'HH24:MI:SS') time
    FROM dates;
    
    DAYS TIME
    ---------- --------
    1 00:00:00
    0 01:00:00
    0 00:01:00
    

    Solution 3: If u want an easier method, use numtodsinterval()

  • Submitted by Shilpa Petrim
  • NUMTODSINTERVAL: This function is new to Oracle 9i. It takes two arguments numtodsinterval(x,c) where x is a number and c is a character string denoting the units of x. Valid units are ‘DAY’, ‘HOUR’, ‘MINUTE’ and ‘SECOND’.

    This function converts the number x into an INTERVAL DAY TO SECOND datatype.

    select numtodsinterval(date1-date2,'day') time_difference from dates;
    TIME_DIFFERENCE
    ----------------------------------------------------------------
    +000000001 00:00:00.000000000
    +000000000 01:00:00.000000000
    +000000000 00:01:00.000000000
    

    from

    Categories: PL/SQL Tags: , , , ,

    Concatenate sets of intervals

    Thursday, 5 May, 2011 Leave a comment
    CLEAR;
    with t as (
               select 11  AS ID, 1  AS val1, 'B'  AS val2 from dual union all
               select 12,1,'A' from dual union ALL
               select 13,1,'A' from dual union all           
               select 14,1,'B' from dual union ALL
               select 15,1,'A' from dual UNION ALL
               select 16,1,'B' from dual union ALL           
               select 17,1,'B' from dual union ALL
               select 18,1,'A' from dual union ALL           
               select 19,2,'B' from dual union all
               select 20,2,'A' from dual union ALL
               select 21,2,'B' from dual union ALL
               select 22,2,'A' from dual union ALL
               select 23,2,'B' from dual union ALL           
               select 24,2,'A' from dual union ALL           
               select 25,1,'B' from dual union ALL                      
               select 26,1,'A' from dual
               ),
    tt AS(select t.*,
            case when lag (val2) over (partition by val1 order by id) || val2 in ('A', 'BA') then 1 end as start_of_group,
            case when lead(val2) over (partition by val1 order by id) || val2 in ('B', 'AB') then 1 end as   end_of_group
          from t),
    ttt AS (SELECT tt.*, COUNT(start_of_group) over(PARTITION BY val1 ORDER BY id) AS group_no FROM tt),
    tttt AS (SELECT row_number() over(ORDER BY val1, group_no) AS rn, 
           val1, 
           t1.ID AS id1, 
           t2.ID AS id2, 
           t1.val2 AS VAL2A, 
           t2.val2 AS VAL2B
      FROM (SELECT * FROM ttt WHERE start_of_group IS NOT NULL) t1
      FULL JOIN (SELECT * FROM ttt WHERE end_of_group IS NOT NULL) t2
     USING (val1, group_no)
     ORDER BY rn)
      SELECT * FROM tttt;
    
    Categories: PL/SQL Tags:

    Getting a Request Parameter Using JSTL in a JSP Page

    Thursday, 17 February, 2011 Leave a comment

    When using the JSTL’s expression language (see Enabling the JSTL Expression Language in a JSP Page), the request parameters are made available in the implicit object param. This example demonstrates how to include the value of a request parameter from the query string or posted data in the generated output:

    <%-- Declare the core library --%>
    <%@ taglib uri="/WEB-INF/tld/c.tld" prefix="c" %>
    
    <c:choose>
        <c:when test="${empty param.name}">
            Please enter your name.
        </c:when>
        <c:otherwise>
            Hello <b><c:out value="${param.name}" /></b>!
        </c:otherwise>
    </c:choose>
    

    If the page was accessed with the URL:
    http://hostname.com/mywebapp/mypage.jsp?name=UserName
    the resulting output would be:
    Hello UserName!

    Categories: jsp Tags: , ,
    Follow

    Get every new post delivered to your Inbox.