From 3c97a446c7c170625e51b02058d2d560b227c4d0 Mon Sep 17 00:00:00 2001 From: Jacek Kowalski <Jacek@jacekk.info> Date: Mon, 17 Sep 2012 09:50:13 +0000 Subject: [PATCH] Poprawa błędu w klasie BotSession powodującego wielokrotne tworzenie wpisów w bazie danych sesyjnych (class=NULL, name=user_struct). --- class/BotSession.php | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 41 insertions(+), 4 deletions(-) diff --git a/class/BotSession.php b/class/BotSession.php index 9c7a5b0..25ec23c 100644 --- a/class/BotSession.php +++ b/class/BotSession.php @@ -7,12 +7,12 @@ /** * Nazwa modułu, którego zmienne klasa przetwarza - * @var string max. 40 znak�w + * @var string max. 40 znaków */ - var $class; + protected $class = ''; + protected $class_empty = TRUE; private $user; - /** * Inicjuje klasę w zależności od użytkownika @@ -21,10 +21,14 @@ $this->user = sha1($user); $this->user_struct = parse_url($user); - $this->class = ''; + $this->class_empty = FALSE; } private function init() { + if(strlen($this->class) == 0 && !$this->class_empty) { + throw new Exception('Przed użyciem $msg->session należy ustawić nazwę modułu za pomocą metody setClass - patrz "Poradnik tworzenia modułów", dział "Klasa BotMessage", rozdział "Pole $session".'); + } + if($this->PDO) { return NULL; } @@ -33,6 +37,30 @@ $this->PDO = new PDO('sqlite:'.BOT_TOPDIR.'/database/'.sha1($this->user).'.sqlite'); $this->PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->PDO->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_TO_STRING); + + $st = $this->PDO->query('SELECT value FROM data WHERE class=\'\' AND name=\'_version\''); + if($st->rowCount > 0) { + $row = $st->fetch(PDO::FETCH_ASSOC); + $version = (int)$row['value']; + } + else + { + $version = 0; + } + $st->closeCursor(); + + if($version < 1) { + $this->PDO->query('UPDATE data SET class=\'kino\' WHERE class=\'\' AND name=\'kino\''); + $this->PDO->query('INSERT OR REPLACE INTO data (class, name, value) VALUES (\'\', \'_version\', 1)'); + $version = 1; + } + + if($version < 2) { + $this->PDO->query('DELETE FROM data WHERE class=NULL AND name=\'user_struct\''); + $this->PDO->query('INSERT OR REPLACE INTO data (class, name, value) VALUES (\'\', \'_version\', 2)'); + $version = 2; + } + return; } @@ -54,9 +82,14 @@ ); $files = glob(BOT_TOPDIR.'/db/*/'.$this->user_struct['user'].'.ggdb'); + if(!$files) { + return; + } $this->PDO->beginTransaction(); $st = $this->PDO->prepare('INSERT OR REPLACE INTO data (class, name, value) VALUES (?, ?, ?)'); + + $st->execute(array('', '_version', 2)); foreach($files as $file) { $data = unserialize(file_get_contents($file)); @@ -142,6 +175,10 @@ return $return; } + function setClass($class) { + $this->class = $class; + } + function truncate() { $this->init(); -- Gitblit v1.9.1