home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 April / PCWorld_2000-04_cd.bin / Komunik / Servery / PinkNet / pnws1076prof.exe / file0137.bin < prev    next >
Encoding:
Text File  |  2000-03-12  |  5.4 KB  |  169 lines

  1. library LogMySQL;
  2. {******************************************************
  3.  *  Knihovna PinkNet Web Serveru - Open Source Part   *
  4.  *                                                    *
  5.  * Toto je knihovna pro protokolovani do MySQL data-  *
  6.  * baze. Myslim si, ze je jedno z nejrychlejsich.     *
  7.  *                                                    *
  8.  * Dokumentaci naleznete na http://pnws.pinknet.cz/   *
  9.  *                                                    *
  10.  * Copyright ⌐1999, Tomas Rosa, Tomas.Rosa@pinknet.cz *
  11.  *                                                    *
  12.  ******************************************************}
  13.  
  14. uses
  15.   Windows,
  16.   SysUtils,
  17.   NTRegistry in '..\NTRegistry.pas',
  18.   _libmysq in '_libmysq.pas';
  19.  
  20. type PSvrNames=^TSvrNames;
  21.      TSvrNames=record
  22.         svrname:ShortString;
  23.         next:PSvrNames;
  24.      end;
  25.  
  26. var mysqlrec: mysql; //Global mysql struct
  27.     connected: Integer; //Global var to keep track of whether we are connected
  28.     FSvrNames:PSvrNames;
  29.  
  30. //LogPath je cesta k logum tak jak je nastavena v setupu
  31. //NeedTimer je TRUE, pokud knihovna chce casovani na ukladani dat
  32. //             FALSE, pokud nic nechce, zapisuje to hned
  33. //NewLog je TRUE, pokud se logy maji pri startu vycistit
  34. //Funkce vraci TRUE, pokud se podarilo inicializovat
  35. function LogDllInit(logpath:ShortString;var needtimer:boolean;svrnames:PSvrNames;newlog:boolean):boolean; stdcall;
  36. var Reg: TNTRegistry;
  37.     host, user, passwd, db, query: String;
  38. begin
  39.    Result:=false;
  40.    reg:=TNTRegistry.Create;
  41.    try
  42.      reg.RootKey:=HKEY_LOCAL_MACHINE;
  43.      if reg.OpenKey('software\GalaArt\WWW Server\',false) then
  44.      begin
  45.         host:=reg.ReadString('LogMySQL_host');
  46.         user:=reg.ReadString('LogMySQL_user');
  47.         passwd:=reg.ReadString('LogMySQL_passwd');
  48.      end;
  49.      reg.CloseKey;
  50.    except
  51.      host:='localhost';
  52.      user:='root';
  53.      passwd:='';
  54.    end;
  55.    reg.Free;
  56.    NeedTimer:=false;
  57.  
  58.    mysql_connect(@mysqlrec, PChar(host), PChar(user), PChar(passwd));
  59.    if mysqlrec._net.last_errno = 0 then
  60.    begin
  61.       connected:= 1;
  62.    end else
  63.    begin
  64.       connected:= 0;
  65.       Exit;
  66.    end;
  67.  
  68.    db:='pnws_log';
  69.    if mysql_select_db(@mysqlrec, PChar(db))<>0 then
  70.    begin
  71.       //chyba pri pristupu k databazi, zavri spojeni s databazi
  72.       //a zmiz
  73.       mysql_close(@mysqlrec);
  74.       Exit;
  75.    end;
  76.  
  77.    FSvrNames:=SvrNames;
  78.  
  79.    //pokud je pozadavek, smaz stare zaznamy
  80.    if newlog then
  81.    begin
  82.       query:='DELETE FROM access;';
  83.       mysql_query(@mysqlrec, PChar(query));
  84.       query:='DELETE FROM error;';
  85.       mysql_query(@mysqlrec, PChar(query));
  86.    end;
  87.  
  88.    //Vrat, ze je asi vse ok
  89.    result:=true;
  90. end;
  91.  
  92. //Ukonci logovaci knihovnu. Nelze odlozit, knihovna se musi ukoncit hned
  93. procedure LogDllDone; stdcall;
  94. var x:PSvrNames;
  95. begin
  96.    //Zlikviduj seznam serveru
  97.    while FSvrNames<>nil do
  98.    begin
  99.       x:=FSvrNames^.next;
  100.       FreeMem(FSvrNames,sizeof(TSvrNames));
  101.       FSvrNames:=x;
  102.    end;
  103.    //Pokud je otevrena, zavri databazi
  104.    if connected = 1 then mysql_close(@mysqlrec);
  105. end;
  106.  
  107. //Prida zaznam pristupu do logu
  108. { Vyznam polozek:
  109.                  svrname   - jmeno serveru, ktereho se to tyka
  110.                  from_ip   - z jake IP adresy uzivatel prisel
  111.                  auth_user - jak se prihlasil, pokud byl soubor zabespecen
  112.                  gmt_date  - datum a cas ve formatu GMT
  113.                  request   - prvni radek pozadavku "GET / HTTP/1.0"
  114.                  referer   - odkud prisel
  115.                  agent     - co pouzil za prohlizec
  116.                  code      - kod, kterym odpovedel server (200-OK, 404-Not Found,..)
  117.                  bytes     - kolik dat bylo preneseno, nebo -1, pokud to nelze zjistit
  118. //Vraci TRUE, pokud se povedlo         }
  119. function LogDllAddAccess(svrname,from_ip,auth_user,gmt_date,request,
  120.                          referer,agent:ShortString;code,bytes:Integer):boolean; stdcall;
  121. var query,x:string;
  122. begin
  123.    x:=''',''';
  124.    query:='INSERT INTO access VALUES('''+svrname+X+from_ip+X+auth_user+X+
  125.           gmt_date+X+request+''','+IntToStr(code)+','+IntToStr(bytes)+','''+
  126.           referer+X+agent+''');';
  127.    result:=mysql_query(@mysqlrec, PChar(query))=0;
  128. end;
  129.  
  130. //Prida zaznam chyby do logu
  131. { Vyznam polozek:
  132.                  msg       - chybova hlaska, ktera se ma zaznamenat
  133.                  gmt_date  - datum a cas ve formatu GMT
  134. //Vraci TRUE, pokud se povedlo         }
  135. function LogDllAddError(msg,gmt_date:ShortString):boolean; stdcall;
  136. var query:string;
  137. begin
  138.    query:='INSERT INTO error VALUES('''+gmt_date+''','''+msg+''');';
  139.    result:=mysql_query(@mysqlrec, PChar(query))=0;
  140. end;
  141.  
  142. //Pokud si Funkce LOGDLLINIT vyzadala casovac, bude volana
  143. //tato funkce pro ulozeni zaznamu na disk. Je nutne, aby ukladani
  144. //na disk bylo nezavisle na zbylych funkcich, ktere jsou volany
  145. //nezavisle a asynchrone. Je tedy mozne zavolat vsechny funkce naraz
  146. //Vraci TRUE, pokud se povedlo
  147. function LogDllTimer:boolean; stdcall;
  148. begin
  149.    result:=false;
  150. end;
  151.  
  152. //Nejaky info o knihovne a autorovi
  153. function LogDllAbout:ShortString; stdcall;
  154. begin
  155.    result:='<b>LogMySQL 1.0</b> Copyright ©1999 <a href="mailto:Tomas.Rosa@pinknet.cz">'+
  156.            'Tomas Rosa</a>, <a href="http://ws.pinknet.cz">PinkNet Web Server</a>. '+
  157.            '<i>Logging to MySQL database.</i>';
  158. end;
  159.  
  160. exports
  161.    LogDllAbout,
  162.    LogDllTimer,
  163.    LogDllAddError,
  164.    LogDllAddAccess,
  165.    LogDllDone,
  166.    LogDllInit;
  167.  
  168. end.
  169.