home *** CD-ROM | disk | FTP | other *** search
- library LogMySQL;
- {******************************************************
- * Knihovna PinkNet Web Serveru - Open Source Part *
- * *
- * Toto je knihovna pro protokolovani do MySQL data- *
- * baze. Myslim si, ze je jedno z nejrychlejsich. *
- * *
- * Dokumentaci naleznete na http://pnws.pinknet.cz/ *
- * *
- * Copyright ⌐1999, Tomas Rosa, Tomas.Rosa@pinknet.cz *
- * *
- ******************************************************}
-
- uses
- Windows,
- SysUtils,
- NTRegistry in '..\NTRegistry.pas',
- _libmysq in '_libmysq.pas';
-
- type PSvrNames=^TSvrNames;
- TSvrNames=record
- svrname:ShortString;
- next:PSvrNames;
- end;
-
- var mysqlrec: mysql; //Global mysql struct
- connected: Integer; //Global var to keep track of whether we are connected
- FSvrNames:PSvrNames;
-
- //LogPath je cesta k logum tak jak je nastavena v setupu
- //NeedTimer je TRUE, pokud knihovna chce casovani na ukladani dat
- // FALSE, pokud nic nechce, zapisuje to hned
- //NewLog je TRUE, pokud se logy maji pri startu vycistit
- //Funkce vraci TRUE, pokud se podarilo inicializovat
- function LogDllInit(logpath:ShortString;var needtimer:boolean;svrnames:PSvrNames;newlog:boolean):boolean; stdcall;
- var Reg: TNTRegistry;
- host, user, passwd, db, query: String;
- begin
- Result:=false;
- reg:=TNTRegistry.Create;
- try
- reg.RootKey:=HKEY_LOCAL_MACHINE;
- if reg.OpenKey('software\GalaArt\WWW Server\',false) then
- begin
- host:=reg.ReadString('LogMySQL_host');
- user:=reg.ReadString('LogMySQL_user');
- passwd:=reg.ReadString('LogMySQL_passwd');
- end;
- reg.CloseKey;
- except
- host:='localhost';
- user:='root';
- passwd:='';
- end;
- reg.Free;
- NeedTimer:=false;
-
- mysql_connect(@mysqlrec, PChar(host), PChar(user), PChar(passwd));
- if mysqlrec._net.last_errno = 0 then
- begin
- connected:= 1;
- end else
- begin
- connected:= 0;
- Exit;
- end;
-
- db:='pnws_log';
- if mysql_select_db(@mysqlrec, PChar(db))<>0 then
- begin
- //chyba pri pristupu k databazi, zavri spojeni s databazi
- //a zmiz
- mysql_close(@mysqlrec);
- Exit;
- end;
-
- FSvrNames:=SvrNames;
-
- //pokud je pozadavek, smaz stare zaznamy
- if newlog then
- begin
- query:='DELETE FROM access;';
- mysql_query(@mysqlrec, PChar(query));
- query:='DELETE FROM error;';
- mysql_query(@mysqlrec, PChar(query));
- end;
-
- //Vrat, ze je asi vse ok
- result:=true;
- end;
-
- //Ukonci logovaci knihovnu. Nelze odlozit, knihovna se musi ukoncit hned
- procedure LogDllDone; stdcall;
- var x:PSvrNames;
- begin
- //Zlikviduj seznam serveru
- while FSvrNames<>nil do
- begin
- x:=FSvrNames^.next;
- FreeMem(FSvrNames,sizeof(TSvrNames));
- FSvrNames:=x;
- end;
- //Pokud je otevrena, zavri databazi
- if connected = 1 then mysql_close(@mysqlrec);
- end;
-
- //Prida zaznam pristupu do logu
- { Vyznam polozek:
- svrname - jmeno serveru, ktereho se to tyka
- from_ip - z jake IP adresy uzivatel prisel
- auth_user - jak se prihlasil, pokud byl soubor zabespecen
- gmt_date - datum a cas ve formatu GMT
- request - prvni radek pozadavku "GET / HTTP/1.0"
- referer - odkud prisel
- agent - co pouzil za prohlizec
- code - kod, kterym odpovedel server (200-OK, 404-Not Found,..)
- bytes - kolik dat bylo preneseno, nebo -1, pokud to nelze zjistit
- //Vraci TRUE, pokud se povedlo }
- function LogDllAddAccess(svrname,from_ip,auth_user,gmt_date,request,
- referer,agent:ShortString;code,bytes:Integer):boolean; stdcall;
- var query,x:string;
- begin
- x:=''',''';
- query:='INSERT INTO access VALUES('''+svrname+X+from_ip+X+auth_user+X+
- gmt_date+X+request+''','+IntToStr(code)+','+IntToStr(bytes)+','''+
- referer+X+agent+''');';
- result:=mysql_query(@mysqlrec, PChar(query))=0;
- end;
-
- //Prida zaznam chyby do logu
- { Vyznam polozek:
- msg - chybova hlaska, ktera se ma zaznamenat
- gmt_date - datum a cas ve formatu GMT
- //Vraci TRUE, pokud se povedlo }
- function LogDllAddError(msg,gmt_date:ShortString):boolean; stdcall;
- var query:string;
- begin
- query:='INSERT INTO error VALUES('''+gmt_date+''','''+msg+''');';
- result:=mysql_query(@mysqlrec, PChar(query))=0;
- end;
-
- //Pokud si Funkce LOGDLLINIT vyzadala casovac, bude volana
- //tato funkce pro ulozeni zaznamu na disk. Je nutne, aby ukladani
- //na disk bylo nezavisle na zbylych funkcich, ktere jsou volany
- //nezavisle a asynchrone. Je tedy mozne zavolat vsechny funkce naraz
- //Vraci TRUE, pokud se povedlo
- function LogDllTimer:boolean; stdcall;
- begin
- result:=false;
- end;
-
- //Nejaky info o knihovne a autorovi
- function LogDllAbout:ShortString; stdcall;
- begin
- result:='<b>LogMySQL 1.0</b> Copyright ©1999 <a href="mailto:Tomas.Rosa@pinknet.cz">'+
- 'Tomas Rosa</a>, <a href="http://ws.pinknet.cz">PinkNet Web Server</a>. '+
- '<i>Logging to MySQL database.</i>';
- end;
-
- exports
- LogDllAbout,
- LogDllTimer,
- LogDllAddError,
- LogDllAddAccess,
- LogDllDone,
- LogDllInit;
-
- end.
-