No Comment !

Emin, Nicolas, Oussama

2011-06-15

Switzernet

 

          

 

       

 

USE astrad;

CREATE TABLE `location2_history` (

  `start` datetime default NULL,

  `stop`  datetime default NULL,

  `domain` varchar(15) NOT NULL default '',

  `username` varchar(80) NOT NULL default '',

  `ipaddr`   varchar(15) NOT NULL default '',

  `port`     smallint(5) unsigned NOT NULL default 0,

  `count` INT(10) unsigned default 1,

  PRIMARY KEY  (`username`,`domain`,`ipaddr`,`port`)

) ;

 

CREATE TABLE `config` (

  `name` varchar(80) NOT NULL default '',

  `value` varchar(80) NOT NULL default '',

  `description` text default NULL,

  PRIMARY KEY  (`name`)

) ;

 

INSERT INTO config VALUES ('day_log_history',60,'Keep log registration for number of days specified.');

INSERT INTO config VALUES ('max_reg_to_check',1000,'Execute delete query  every N registration received.');

INSERT INTO config VALUES ('tmp_reg_to_check',1,'Used by procedure REGISTER, auto-increment for each registration received.');

 

DELIMITER |

DROP PROCEDURE IF EXISTS `REGISTER`|

CREATE PROCEDURE `REGISTER`(IN USR VARCHAR(80),IN DOM VARCHAR(15), IN CON VARCHAR(255), IN EXR DATETIME)

BEGIN

DECLARE MAXD INT(5) DEFAULT 0;

IF (SELECT 1 FROM location2 WHERE username=USR AND contact=CON AND domain=DOM) THEN

  UPDATE location2 SET expires=EXR WHERE username=USR AND contact=CON AND domain=DOM;

ELSE

  INSERT INTO location2 VALUES (USR,DOM,CON,EXR);

END IF;

INSERT INTO location2_history (start,stop,domain,username,ipaddr,port,count) VALUES (NOW(),NOW(),DOM,USR,SUBSTRING_INDEX(SUBSTRING(CON,LOCATE('@', CON)+1), ':', 1),SUBSTRING_INDEX(SUBSTRING(CON,LOCATE('@', CON)+1), ':', -1),1) ON DUPLICATE KEY UPDATE count=count+1, stop=NOW();

IF (SELECT value FROM config WHERE name='tmp_reg_to_check') < 1000 THEN

  UPDATE config SET value=value+1 WHERE name='tmp_reg_to_check';

  ELSE

    UPDATE config SET value=1 WHERE name='tmp_reg_to_check';

     SET MAXD=(SELECT value FROM config WHERE name='day_log_history');

     DELETE FROM location2_history WHERE stop < DATE_ADD(NOW(), INTERVAL -MAXD DAY);

END IF;

END |

 

DROP PROCEDURE IF EXISTS `StatReg`|

CREATE PROCEDURE StatReg( IN DOM VARCHAR(15) , IN ST datetime, IN SP datetime, IN ITV INT(5))

BEGIN

  DECLARE TMP1 datetime default '';

  DECLARE TMP2 datetime default '';

  DECLARE NB INT(10) default 0;

  DECLARE done INT DEFAULT 0;

  DECLARE USR VARCHAR(11);

  DECLARE cur CURSOR FOR select distinct(username) from location2_history where domain=DOM;

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;   

  DROP TABLE IF EXISTS timetempo;

    CREATE TEMPORARY TABLE timetempo (

    `START` VARCHAR(19) default '',

     `STOP` VARCHAR(19) default '',

     `COUNT = 1` INT(10) default 0,

     `COUNT > 1` INT(10) default 0,

     PRIMARY KEY  (`START`,`STOP`)

  );

  OPEN cur;

  read_loop: LOOP

    FETCH cur INTO USR;

      IF done THEN

      LEAVE read_loop;

    END IF;    

    SET TMP1=ST; 

    SET TMP2=DATE_ADD(TMP1, INTERVAL ITV MINUTE);     

    WHILE TMP1 < SP DO

       SET NB=(select count(*) from location2_history where start>TMP1 and stop<TMP2 and domain=DOM and username=USR);

       IF (NB>1) THEN

        INSERT INTO timetempo (`START`,`STOP`,`COUNT > 1`) VALUES (TMP1,TMP2,1) ON DUPLICATE KEY UPDATE `COUNT > 1`=`COUNT > 1`+1;

       ELSE

        INSERT INTO timetempo (`START`,`STOP`,`COUNT = 1`) VALUES (TMP1,TMP2,1) ON DUPLICATE KEY UPDATE `COUNT = 1`=`COUNT = 1`+1;

       END IF; 

      SET TMP1=TMP2; 

      SET TMP2=DATE_ADD(TMP1, INTERVAL ITV MINUTE);

    END WHILE;

  END LOOP;

  CLOSE cur;

  SELECT * FROM timetempo;

  DELETE FROM timetempo;

END|

DELIMITER ;

 

mysql> CALL StatReg('91.121.XX.XX','2011-06-16 13:00:00','2011-06-16 19:00:00',30);

+---------------------+---------------------+-----------+-----------+

| START               | STOP                | COUNT = 1 | COUNT > 1 |

+---------------------+---------------------+-----------+-----------+

| 2011-06-16 13:00:00 | 2011-06-16 13:30:00 |       166 |        26 |

| 2011-06-16 13:30:00 | 2011-06-16 14:00:00 |       166 |        26 |

| 2011-06-16 14:00:00 | 2011-06-16 14:30:00 |       165 |        27 |

| 2011-06-16 14:30:00 | 2011-06-16 15:00:00 |       166 |        26 |

| 2011-06-16 15:00:00 | 2011-06-16 15:30:00 |       166 |        26 |

| 2011-06-16 15:30:00 | 2011-06-16 16:00:00 |       166 |        26 |

| 2011-06-16 16:00:00 | 2011-06-16 16:30:00 |       192 |         0 |

| 2011-06-16 16:30:00 | 2011-06-16 17:00:00 |       192 |         0 |

| 2011-06-16 17:00:00 | 2011-06-16 17:30:00 |       191 |         1 |

| 2011-06-16 17:30:00 | 2011-06-16 18:00:00 |       191 |         1 |

| 2011-06-16 18:00:00 | 2011-06-16 18:30:00 |       192 |         0 |

| 2011-06-16 18:30:00 | 2011-06-16 19:00:00 |       192 |         0 |

+---------------------+---------------------+-----------+-----------+

12 rows in set (1.67 sec)

 

Query OK, 12 rows affected, 2 warnings (1.67 sec)

 

* * *