source: spip-zone/_core_/branches/spip-3.1/plugins/medias/lib/getid3/extension.cache.mysqli.php @ 113163

Last change on this file since 113163 was 113163, checked in by spip.franck@…, 5 months ago

Mise à jour de la lib getid en version 1.9.16, nous étions en 1.9.12
https://github.com/JamesHeinrich/getID3/blob/master/changelog.txt

File size: 7.2 KB
Line 
1<?php
2
3/////////////////////////////////////////////////////////////////
4/// getID3() by James Heinrich <info@getid3.org>               //
5//  available at https://github.com/JamesHeinrich/getID3       //
6//            or https://www.getid3.org                        //
7//            or http://getid3.sourceforge.net                 //
8//                                                             //
9// extension.cache.mysqli.php - part of getID3()               //
10// Please see readme.txt for more information                  //
11//                                                             //
12/////////////////////////////////////////////////////////////////
13//                                                             //
14// This extension written by Allan Hansen <ahØartemis*dk>      //
15// Table name mod by Carlo Capocasa <calroØcarlocapocasa*com>  //
16//                                                            ///
17/////////////////////////////////////////////////////////////////
18
19
20/**
21* This is a caching extension for getID3(). It works the exact same
22* way as the getID3 class, but return cached information very fast
23*
24* Example:  (see also demo.cache.mysql.php in /demo/)
25*
26*    Normal getID3 usage (example):
27*
28*       require_once 'getid3/getid3.php';
29*       $getID3 = new getID3;
30*       $getID3->encoding = 'UTF-8';
31*       $info1 = $getID3->analyze('file1.flac');
32*       $info2 = $getID3->analyze('file2.wv');
33*
34*    getID3_cached usage:
35*
36*       require_once 'getid3/getid3.php';
37*       require_once 'getid3/getid3/extension.cache.mysqli.php';
38*       // 5th parameter (tablename) is optional, default is 'getid3_cache'
39*       $getID3 = new getID3_cached_mysqli('localhost', 'database', 'username', 'password', 'tablename');
40*       $getID3->encoding = 'UTF-8';
41*       $info1 = $getID3->analyze('file1.flac');
42*       $info2 = $getID3->analyze('file2.wv');
43*
44*
45* Supported Cache Types    (this extension)
46*
47*   SQL Databases:
48*
49*   cache_type          cache_options
50*   -------------------------------------------------------------------
51*   mysqli              host, database, username, password
52*
53*
54*   DBM-Style Databases:    (use extension.cache.dbm)
55*
56*   cache_type          cache_options
57*   -------------------------------------------------------------------
58*   gdbm                dbm_filename, lock_filename
59*   ndbm                dbm_filename, lock_filename
60*   db2                 dbm_filename, lock_filename
61*   db3                 dbm_filename, lock_filename
62*   db4                 dbm_filename, lock_filename  (PHP5 required)
63*
64*   PHP must have write access to both dbm_filename and lock_filename.
65*
66*
67* Recommended Cache Types
68*
69*   Infrequent updates, many reads      any DBM
70*   Frequent updates                    mysqli
71*/
72
73class getID3_cached_mysqli extends getID3
74{
75        /**
76         * @var mysqli
77         */
78        private $mysqli;
79
80        /**
81         * @var mysqli_result
82         */
83        private $cursor;
84
85        /**
86         * @var string
87         */
88        private $table;
89
90
91        /**
92         * constructor - see top of this file for cache type and cache_options
93         *
94         * @param string $host
95         * @param string $database
96         * @param string $username
97         * @param string $password
98         * @param string $table
99         *
100         * @throws Exception
101         * @throws getid3_exception
102         */
103        public function __construct($host, $database, $username, $password, $table='getid3_cache') {
104
105                // Check for mysqli support
106                if (!function_exists('mysqli_connect')) {
107                        throw new Exception('PHP not compiled with mysqli support.');
108                }
109
110                // Connect to database
111                $this->mysqli = new mysqli($host, $username, $password);
112                if (!$this->mysqli) {
113                        throw new Exception('mysqli_connect() failed - check permissions and spelling.');
114                }
115
116                // Select database
117                if (!$this->mysqli->select_db($database)) {
118                        throw new Exception('Cannot use database '.$database);
119                }
120
121                // Set table
122                $this->table = $table;
123
124                // Create cache table if not exists
125                $this->create_table();
126
127                // Check version number and clear cache if changed
128                $version = '';
129                $SQLquery  = 'SELECT `value`';
130                $SQLquery .= ' FROM `'.$this->mysqli->real_escape_string($this->table).'`';
131                $SQLquery .= ' WHERE (`filename` = \''.$this->mysqli->real_escape_string(getID3::VERSION).'\')';
132                $SQLquery .= ' AND (`filesize` = -1)';
133                $SQLquery .= ' AND (`filetime` = -1)';
134                $SQLquery .= ' AND (`analyzetime` = -1)';
135                if ($this->cursor = $this->mysqli->query($SQLquery)) {
136                        list($version) = $this->cursor->fetch_array();
137                }
138                if ($version != getID3::VERSION) {
139                        $this->clear_cache();
140                }
141
142                parent::__construct();
143        }
144
145
146        /**
147         * clear cache
148         */
149        public function clear_cache() {
150                $this->mysqli->query('DELETE FROM `'.$this->mysqli->real_escape_string($this->table).'`');
151                $this->mysqli->query('INSERT INTO `'.$this->mysqli->real_escape_string($this->table).'` (`filename`, `filesize`, `filetime`, `analyzetime`, `value`) VALUES (\''.getID3::VERSION.'\', -1, -1, -1, \''.getID3::VERSION.'\')');
152        }
153
154
155        /**
156         * analyze file
157         *
158         * @param string $filename
159         * @param int    $filesize
160         * @param string $original_filename
161         *
162         * @return mixed
163         */
164        public function analyze($filename, $filesize=null, $original_filename='') {
165
166        $filetime = 0;
167                if (file_exists($filename)) {
168
169                        // Short-hands
170                        $filetime = filemtime($filename);
171                        $filesize =  filesize($filename);
172
173                        // Lookup file
174                        $SQLquery  = 'SELECT `value`';
175                        $SQLquery .= ' FROM `'.$this->mysqli->real_escape_string($this->table).'`';
176                        $SQLquery .= ' WHERE (`filename` = \''.$this->mysqli->real_escape_string($filename).'\')';
177                        $SQLquery .= '   AND (`filesize` = \''.$this->mysqli->real_escape_string($filesize).'\')';
178                        $SQLquery .= '   AND (`filetime` = \''.$this->mysqli->real_escape_string($filetime).'\')';
179                        $this->cursor = $this->mysqli->query($SQLquery);
180                        if ($this->cursor->num_rows > 0) {
181                                // Hit
182                                list($result) = $this->cursor->fetch_array();
183                                return unserialize(base64_decode($result));
184                        }
185                }
186
187                // Miss
188                $analysis = parent::analyze($filename, $filesize, $original_filename);
189
190                // Save result
191                if (file_exists($filename)) {
192                        $SQLquery  = 'INSERT INTO `'.$this->mysqli->real_escape_string($this->table).'` (`filename`, `filesize`, `filetime`, `analyzetime`, `value`) VALUES (';
193                        $SQLquery .=   '\''.$this->mysqli->real_escape_string($filename).'\'';
194                        $SQLquery .= ', \''.$this->mysqli->real_escape_string($filesize).'\'';
195                        $SQLquery .= ', \''.$this->mysqli->real_escape_string($filetime).'\'';
196                        $SQLquery .= ', \''.$this->mysqli->real_escape_string(time()   ).'\'';
197                        $SQLquery .= ', \''.$this->mysqli->real_escape_string(base64_encode(serialize($analysis))).'\')';
198                        $this->cursor = $this->mysqli->query($SQLquery);
199                }
200                return $analysis;
201        }
202
203
204        /**
205         * (re)create mysqli table
206         *
207         * @param bool $drop
208         */
209        private function create_table($drop=false) {
210                $SQLquery  = 'CREATE TABLE IF NOT EXISTS `'.$this->mysqli->real_escape_string($this->table).'` (';
211                $SQLquery .=   '`filename` VARCHAR(990) NOT NULL DEFAULT \'\'';
212                $SQLquery .= ', `filesize` INT(11) NOT NULL DEFAULT \'0\'';
213                $SQLquery .= ', `filetime` INT(11) NOT NULL DEFAULT \'0\'';
214                $SQLquery .= ', `analyzetime` INT(11) NOT NULL DEFAULT \'0\'';
215                $SQLquery .= ', `value` LONGTEXT NOT NULL';
216                $SQLquery .= ', PRIMARY KEY (`filename`, `filesize`, `filetime`))';
217                $this->cursor = $this->mysqli->query($SQLquery);
218                echo $this->mysqli->error;
219        }
220}
Note: See TracBrowser for help on using the repository browser.