[SPIP] v3.2.12 -> v3.2.12 - Reinstallation avec le spip_loader
[lhc/web/www.git] / www / plugins-dist / medias / lib / getid3 / extension.cache.mysqli.php
old mode 100644 (file)
new mode 100755 (executable)
index 3299caa..cee2c53
@@ -1,14 +1,14 @@
 <?php
+
 /////////////////////////////////////////////////////////////////
 /// getID3() by James Heinrich <info@getid3.org>               //
-//  available at http://getid3.sourceforge.net                 //
-//            or http://www.getid3.org                         //
-//          also https://github.com/JamesHeinrich/getID3       //
-/////////////////////////////////////////////////////////////////
+//  available at https://github.com/JamesHeinrich/getID3       //
+//            or https://www.getid3.org                        //
+//            or http://getid3.sourceforge.net                 //
 //                                                             //
-// extension.cache.mysqli.php - part of getID3()                //
+// extension.cache.mysqli.php - part of getID3()               //
 // Please see readme.txt for more information                  //
-//                                                            ///
+//                                                             //
 /////////////////////////////////////////////////////////////////
 //                                                             //
 // This extension written by Allan Hansen <ahØartemis*dk>      //
 
 class getID3_cached_mysqli extends getID3
 {
-       // private vars
+       /**
+        * @var mysqli
+        */
        private $mysqli;
+
+       /**
+        * @var mysqli_result
+        */
        private $cursor;
 
+       /**
+        * @var string
+        */
+       private $table;
 
-       // public: constructor - see top of this file for cache type and cache_options
+       /**
+        * @var bool
+        */
+       private $db_structure_check;
+
+
+       /**
+        * constructor - see top of this file for cache type and cache_options
+        *
+        * @param string $host
+        * @param string $database
+        * @param string $username
+        * @param string $password
+        * @param string $table
+        *
+        * @throws Exception
+        * @throws getid3_exception
+        */
        public function __construct($host, $database, $username, $password, $table='getid3_cache') {
 
                // Check for mysqli support
@@ -87,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
@@ -102,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();
                }
@@ -121,16 +149,59 @@ class getID3_cached_mysqli extends getID3
        }
 
 
-       // public: clear cache
+       /**
+        * 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);
+                       }
+               }
        }
 
 
-       // public: analyze file
-       public function analyze($filename, $filesize=null, $original_filename='') {
+       /**
+        * analyze file
+        *
+        * @param string   $filename
+        * @param int      $filesize
+        * @param string   $original_filename
+        * @param resource $fp
+        *
+        * @return mixed
+        */
+       public function analyze($filename, $filesize=null, $original_filename='', $fp=null) {
 
+               $filetime = 0;
                if (file_exists($filename)) {
 
                        // Short-hands
@@ -140,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
@@ -152,32 +221,43 @@ 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;
        }
 
 
-       // private: (re)create mysqli table
+       /**
+        * (re)create mysqli table
+        *
+        * @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`)) ENGINE=MyISAM CHARACTER SET=latin1 COLLATE=latin1_general_ci';
+               $SQLquery .= ', PRIMARY KEY (`hash`))';
                $this->cursor = $this->mysqli->query($SQLquery);
                echo $this->mysqli->error;
        }
-}
\ No newline at end of file
+}