[SPIP] ~maj v3.2.9-->v3.2.11
[lhc/web/www.git] / www / plugins-dist / medias / lib / getid3 / extension.cache.mysqli.php
index 44ea694..cee2c53 100644 (file)
@@ -87,6 +87,11 @@ class getID3_cached_mysqli extends getID3
         */
        private $table;
 
+       /**
+        * @var bool
+        */
+       private $db_structure_check;
+
 
        /**
         * constructor - see top of this file for cache type and cache_options
@@ -109,8 +114,8 @@ class getID3_cached_mysqli extends getID3
 
                // Connect to database
                $this->mysqli = new mysqli($host, $username, $password);
-               if (!$this->mysqli) {
-                       throw new Exception('mysqli_connect() failed - check permissions and spelling.');
+               if ($this->mysqli->connect_error) {
+                       throw new Exception('Connect Error (' . $this->mysqli->connect_errno . ') ' . $this->mysqli->connect_error);
                }
 
                // Select database
@@ -124,14 +129,15 @@ class getID3_cached_mysqli extends getID3
                // Create cache table if not exists
                $this->create_table();
 
+               $this->db_structure_check = true; // set to false if you know your table structure has already been migrated to use `hash` as the primary key to avoid
+               $this->migrate_db_structure();
+
                // Check version number and clear cache if changed
                $version = '';
                $SQLquery  = 'SELECT `value`';
                $SQLquery .= ' FROM `'.$this->mysqli->real_escape_string($this->table).'`';
                $SQLquery .= ' WHERE (`filename` = \''.$this->mysqli->real_escape_string(getID3::VERSION).'\')';
-               $SQLquery .= ' AND (`filesize` = -1)';
-               $SQLquery .= ' AND (`filetime` = -1)';
-               $SQLquery .= ' AND (`analyzetime` = -1)';
+               $SQLquery .= ' AND (`hash` = \'getID3::VERSION\')';
                if ($this->cursor = $this->mysqli->query($SQLquery)) {
                        list($version) = $this->cursor->fetch_array();
                }
@@ -147,23 +153,55 @@ class getID3_cached_mysqli extends getID3
         * clear cache
         */
        public function clear_cache() {
-               $this->mysqli->query('DELETE FROM `'.$this->mysqli->real_escape_string($this->table).'`');
-               $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.'\')');
+               $this->mysqli->query('TRUNCATE TABLE `'.$this->mysqli->real_escape_string($this->table).'`');
+               $this->mysqli->query('INSERT INTO `'.$this->mysqli->real_escape_string($this->table).'` (`hash`, `filename`, `filesize`, `filetime`, `analyzetime`, `value`) VALUES (\'getID3::VERSION\', \''.getID3::VERSION.'\', -1, -1, -1, \''.getID3::VERSION.'\')');
+       }
+
+
+       /**
+        * migrate database structure if needed
+        */
+       public function migrate_db_structure() {
+               // Check for table structure
+               if ($this->db_structure_check) {
+                       $SQLquery  = 'SHOW COLUMNS';
+                       $SQLquery .= ' FROM `'.$this->mysqli->real_escape_string($this->table).'`';
+                       $SQLquery .= ' LIKE \'hash\'';
+                       $this->cursor = $this->mysqli->query($SQLquery);
+                       if ($this->cursor->num_rows == 0) {
+                               // table has not been migrated, add column, add hashes, change index
+                               $SQLquery  = 'ALTER TABLE `getid3_cache` DROP PRIMARY KEY, ADD `hash` CHAR(32) NOT NULL DEFAULT \'\' FIRST, ADD PRIMARY KEY(`hash`)';
+                               $this->mysqli->query($SQLquery);
+
+                               $SQLquery  = 'UPDATE `getid3_cache` SET';
+                               $SQLquery .= ' `hash` = MD5(`filename`, `filesize`, `filetime`)';
+                               $SQLquery .= ' WHERE (`filesize` > -1)';
+                               $this->mysqli->query($SQLquery);
+
+                               $SQLquery  = 'UPDATE `getid3_cache` SET';
+                               $SQLquery .= ' `hash` = \'getID3::VERSION\'';
+                               $SQLquery .= ' WHERE (`filesize` = -1)';
+                               $SQLquery .= '   AND (`filetime` = -1)';
+                               $SQLquery .= '   AND (`filetime` = -1)';
+                               $this->mysqli->query($SQLquery);
+                       }
+               }
        }
 
 
        /**
         * analyze file
         *
-        * @param string $filename
-        * @param int    $filesize
-        * @param string $original_filename
+        * @param string   $filename
+        * @param int      $filesize
+        * @param string   $original_filename
+        * @param resource $fp
         *
         * @return mixed
         */
-       public function analyze($filename, $filesize=null, $original_filename='') {
+       public function analyze($filename, $filesize=null, $original_filename='', $fp=null) {
 
-        $filetime = 0;
+               $filetime = 0;
                if (file_exists($filename)) {
 
                        // Short-hands
@@ -173,9 +211,7 @@ class getID3_cached_mysqli extends getID3
                        // Lookup file
                        $SQLquery  = 'SELECT `value`';
                        $SQLquery .= ' FROM `'.$this->mysqli->real_escape_string($this->table).'`';
-                       $SQLquery .= ' WHERE (`filename` = \''.$this->mysqli->real_escape_string($filename).'\')';
-                       $SQLquery .= '   AND (`filesize` = \''.$this->mysqli->real_escape_string($filesize).'\')';
-                       $SQLquery .= '   AND (`filetime` = \''.$this->mysqli->real_escape_string($filetime).'\')';
+                       $SQLquery .= ' WHERE (`hash` = \''.$this->mysqli->real_escape_string(md5($filename.$filesize.$filetime)).'\')';
                        $this->cursor = $this->mysqli->query($SQLquery);
                        if ($this->cursor->num_rows > 0) {
                                // Hit
@@ -185,16 +221,18 @@ class getID3_cached_mysqli extends getID3
                }
 
                // Miss
-               $analysis = parent::analyze($filename, $filesize, $original_filename);
+               $analysis = parent::analyze($filename, $filesize, $original_filename, $fp);
 
                // Save result
                if (file_exists($filename)) {
-                       $SQLquery  = 'INSERT INTO `'.$this->mysqli->real_escape_string($this->table).'` (`filename`, `filesize`, `filetime`, `analyzetime`, `value`) VALUES (';
-                       $SQLquery .=   '\''.$this->mysqli->real_escape_string($filename).'\'';
+                       $SQLquery  = 'INSERT INTO `'.$this->mysqli->real_escape_string($this->table).'` (`hash`, `filename`, `filesize`, `filetime`, `analyzetime`, `value`) VALUES (';
+                       $SQLquery .=   '\''.$this->mysqli->real_escape_string(md5($filename.$filesize.$filetime)).'\'';
+                       $SQLquery .= ', \''.$this->mysqli->real_escape_string($filename).'\'';
                        $SQLquery .= ', \''.$this->mysqli->real_escape_string($filesize).'\'';
                        $SQLquery .= ', \''.$this->mysqli->real_escape_string($filetime).'\'';
-                       $SQLquery .= ', \''.$this->mysqli->real_escape_string(time()   ).'\'';
-                       $SQLquery .= ', \''.$this->mysqli->real_escape_string(base64_encode(serialize($analysis))).'\')';
+                       $SQLquery .= ', UNIX_TIMESTAMP()';
+                       $SQLquery .= ', \''.$this->mysqli->real_escape_string(base64_encode(serialize($analysis))).'\'';
+                       $SQLquery .= ')';
                        $this->cursor = $this->mysqli->query($SQLquery);
                }
                return $analysis;
@@ -207,13 +245,18 @@ class getID3_cached_mysqli extends getID3
         * @param bool $drop
         */
        private function create_table($drop=false) {
+               if ($drop) {
+                       $SQLquery  = 'DROP TABLE IF EXISTS `'.$this->mysqli->real_escape_string($this->table).'`';
+                       $this->mysqli->query($SQLquery);
+               }
                $SQLquery  = 'CREATE TABLE IF NOT EXISTS `'.$this->mysqli->real_escape_string($this->table).'` (';
-               $SQLquery .=   '`filename` VARCHAR(990) NOT NULL DEFAULT \'\'';
+               $SQLquery .=   '`hash` CHAR(32) NOT NULL DEFAULT \'\'';
+               $SQLquery .= ', `filename` VARCHAR(1000) NOT NULL DEFAULT \'\'';
                $SQLquery .= ', `filesize` INT(11) NOT NULL DEFAULT \'0\'';
                $SQLquery .= ', `filetime` INT(11) NOT NULL DEFAULT \'0\'';
                $SQLquery .= ', `analyzetime` INT(11) NOT NULL DEFAULT \'0\'';
                $SQLquery .= ', `value` LONGTEXT NOT NULL';
-               $SQLquery .= ', PRIMARY KEY (`filename`, `filesize`, `filetime`))';
+               $SQLquery .= ', PRIMARY KEY (`hash`))';
                $this->cursor = $this->mysqli->query($SQLquery);
                echo $this->mysqli->error;
        }