Jacek Kowalski
2012-06-25 170544e77746833fcef43c40b13867acb13b504d
commit | author | age
8bd4d9 1 <?php
JK 2 /**
3  * Klasa przechowująca dane użytkownika. Całość przypomina mechanizm sesji w PHP.
4  */
5 class BotSession {
6     private $PDO;
7     
8     /**
9      * Nazwa modułu, którego zmienne klasa przetwarza
10      * @var string max. 40 znaków
11      */
12     var $class;
13     
14     private $user;
15     
16     
17     /**
18      * Inicjuje klasę w zależności od użytkownika
19      */
20     function __construct($user) {
21         $this->user = sha1($user);
22         $this->user_struct = parse_url($user);
23         
24         $this->class = '';
25     }
26     
27     private function init() {
28         if($this->PDO) {
29             return NULL;
30         }
31         
32         if(is_file(BOT_TOPDIR.'/database/'.sha1($this->user).'.sqlite')) {
33             $this->PDO = new PDO('sqlite:'.BOT_TOPDIR.'/database/'.sha1($this->user).'.sqlite');
34             $this->PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
35             $this->PDO->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_TO_STRING);
36             return;
37         }
38         
39         try {
40             $this->PDO = new PDO('sqlite:'.BOT_TOPDIR.'/database/'.sha1($this->user).'.sqlite');
41             $this->PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
42             $this->PDO->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_TO_STRING);
43             
44             $this->PDO->query(
45                 'CREATE TABLE data (
46                     class VARCHAR(50),
47                     name VARCHAR(40) NOT NULL,
48                     value TEXT NOT NULL,
49                     PRIMARY KEY (
50                         class ASC,
51                         name ASC
52                     )
53                 )'
54             );
55             
56             $files = glob(BOT_TOPDIR.'/db/*/'.$this->user_struct['user'].'.ggdb');
57             
58             $this->PDO->beginTransaction();
59             $st = $this->PDO->prepare('INSERT OR REPLACE INTO data (class, name, value) VALUES (?, ?, ?)');
60             
61             foreach($files as $file) {
62                 $data = unserialize(file_get_contents($file));
63                 foreach($data as $name => $value) {
64                     $st->execute(array($this->class, $name, $value));
65                 }
66             }
67             
68             $this->PDO->commit();
69             
70             foreach($files as $file) {
71                 unlink($file);
72             }
73         }
74         catch(Exception $e) {
d22cb4 75             if(file_exists(BOT_TOPDIR.'/database/'.sha1($this->user).'.sqlite')) {
JK 76                 @unlink(BOT_TOPDIR.'/database/'.sha1($this->user).'.sqlite');
77             }
8bd4d9 78             throw $e;
JK 79         }
80     }
81     
82     function __get($name) {
83         $this->init();
84         
85         $st = $this->PDO->prepare('SELECT value FROM data WHERE class=? AND name=?');
86         $st->execute(array($this->class, $name));
87         $st = $st->fetch(PDO::FETCH_ASSOC);
88         
89         if(is_array($st)) {
90             return unserialize($st['value']);
91         }
92         else
93         {
94             return NULL;
95         }
96     }
97     
98     function __set($name, $value) {
99         $this->init();
100         
101         $st = $this->PDO->prepare('INSERT OR REPLACE INTO data (class, name, value) VALUES (?, ?, ?)');
102         $st->execute(array($this->class, $name, serialize($value)));
103     }
104     
105     function __isset($name) {
106         $this->init();
107         
108         $st = $this->PDO->prepare('SELECT COUNT(name) FROM data WHERE class=? AND name=?');
109         $st->execute(array($this->class, $name));
110         $st = $st->fetch(PDO::FETCH_NUM);
111         
112         return ($st[0]>0);
113     }
114     
115     function __unset($name) {
116         $this->init();
117         
118         $st = $this->PDO->prepare('DELETE FROM data WHERE class=? AND name=?');
119         $st->execute(array($this->class, $name));
120     }
121     
122     function push($array) {
123         $this->PDO->beginTransaction();
124         foreach($array as $name => $value) {
125             $this->__set($name, $value);
126         }
127         $this->PDO->commit();
128     }
129     
130     function pull() {
131         $this->init();
132         
133         $st = $this->PDO->prepare('SELECT name, value FROM data WHERE class=?');
134         $st->execute(array($this->class));
135         $st = $st->fetchAll(PDO::FETCH_ASSOC);
136         
137         $return = array();
138         foreach($st as $row) {
139             $return[$row['name']] = $row['value'];
140         }
141         
142         return $return;
143     }
144     
145     function truncate() {
146         $this->init();
147         
148         $st = $this->PDO->prepare('DELETE FROM data WHERE class=?');
149         $st->execute(array($this->class));
150     }
151 }
d22cb4 152 ?>