284 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			284 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| 
 | |
| namespace Nextend\SmartSlider3\Install;
 | |
| 
 | |
| 
 | |
| use Nextend\Framework\Database\Database;
 | |
| use Nextend\Framework\Notification\Notification;
 | |
| 
 | |
| class Tables {
 | |
| 
 | |
|     protected $tables = array(
 | |
|         'nextend2_image_storage'             => "(
 | |
|                 `id`    INT(11)     NOT NULL AUTO_INCREMENT,
 | |
|                 `hash`  VARCHAR(32) NOT NULL,
 | |
|                 `image` TEXT        NOT NULL,
 | |
|                 `value` MEDIUMTEXT  NOT NULL,
 | |
|                 PRIMARY KEY (`id`),
 | |
|                 UNIQUE KEY `hash` (`hash`)
 | |
|             )",
 | |
|         'nextend2_section_storage'           => "(
 | |
|                 `id`           INT(11)     NOT NULL AUTO_INCREMENT,
 | |
|                 `application`  VARCHAR(20) NOT NULL,
 | |
|                 `section`      VARCHAR(128) NOT NULL,
 | |
|                 `referencekey` VARCHAR(128) DEFAULT '',
 | |
|                 `value`        MEDIUMTEXT  NOT NULL,
 | |
|                 `isSystem`       INT(11)     NOT NULL DEFAULT '0',
 | |
|                 `editable`     INT(11)     NOT NULL DEFAULT '1',
 | |
|                 PRIMARY KEY (`id`),
 | |
|                 KEY `application` (`application`, `section`(50), `referencekey`(50)),
 | |
|                 KEY `application_2` (`application`, `section`(50)),
 | |
|                 INDEX (`isSystem`),
 | |
|                 INDEX (`editable`)
 | |
|             )
 | |
|             AUTO_INCREMENT = 10000",
 | |
|         'nextend2_smartslider3_generators'   => "(
 | |
|                 `id`     INT(11)      NOT NULL AUTO_INCREMENT,
 | |
|                 `group`  VARCHAR(254) NOT NULL,
 | |
|                 `type`   VARCHAR(254) NOT NULL,
 | |
|                 `params` TEXT         NOT NULL,
 | |
|                 PRIMARY KEY (`id`)
 | |
|             )",
 | |
|         'nextend2_smartslider3_sliders'      => "(
 | |
|           `id`     INT(11)      NOT NULL AUTO_INCREMENT,
 | |
|           `alias`  TEXT         NULL DEFAULT NULL,
 | |
|           `title`  TEXT         NOT NULL,
 | |
|           `type`   VARCHAR(30)  NOT NULL,
 | |
|           `params` MEDIUMTEXT   NOT NULL,
 | |
|           `slider_status` VARCHAR(50) NOT NULL DEFAULT 'published',
 | |
|           `time`   DATETIME     NOT NULL,
 | |
|           `thumbnail` TEXT      NOT NULL,
 | |
|           `ordering` INT NOT NULL DEFAULT '0',
 | |
|           INDEX (`slider_status`),
 | |
|           INDEX (`time`),
 | |
|           PRIMARY KEY (`id`)
 | |
|         )",
 | |
|         'nextend2_smartslider3_sliders_xref' => "(
 | |
|           `group_id` int(11) NOT NULL,
 | |
|           `slider_id` int(11) NOT NULL,
 | |
|           `ordering` int(11) NOT NULL DEFAULT '0',
 | |
|           PRIMARY KEY (`group_id`,`slider_id`),
 | |
|           INDEX (`ordering`)
 | |
|         )",
 | |
|         'nextend2_smartslider3_slides'       => "(
 | |
|           `id`           INT(11)      NOT NULL AUTO_INCREMENT,
 | |
|           `title`        TEXT         NOT NULL,
 | |
|           `slider`       INT(11)      NOT NULL,
 | |
|           `publish_up`   DATETIME     NOT NULL default '1970-01-01 00:00:00',
 | |
|           `publish_down` DATETIME     NOT NULL default '1970-01-01 00:00:00',
 | |
|           `published`    TINYINT(1)   NOT NULL,
 | |
|           `first`        INT(11)      NOT NULL,
 | |
|           `slide`        LONGTEXT,
 | |
|           `description`  TEXT         NOT NULL,
 | |
|           `thumbnail`    TEXT         NOT NULL,
 | |
|           `params`       TEXT         NOT NULL,
 | |
|           `ordering`     INT(11)      NOT NULL,
 | |
|           `generator_id` INT(11)      NOT NULL,
 | |
|           PRIMARY KEY (`id`),
 | |
|           INDEX (`published`),
 | |
|           INDEX (`publish_up`),
 | |
|           INDEX (`publish_down`),
 | |
|           INDEX (`generator_id`),
 | |
|           KEY `thumbnail` (`thumbnail`(100)),
 | |
|           INDEX (`ordering`),
 | |
|           INDEX (`slider`)
 | |
|         )"
 | |
|     );
 | |
| 
 | |
| 
 | |
|     public function install() {
 | |
|         foreach ($this->tables as $tableName => $structure) {
 | |
|             $this->installTable($tableName, $structure);
 | |
|         }
 | |
| 
 | |
|         self::dropIndex('#__nextend2_section_storage', 'system');
 | |
| 
 | |
|         $this->renameColumn('#__nextend2_section_storage', 'system', 'isSystem', 'INT(11) NOT NULL DEFAULT \'0\'');
 | |
| 
 | |
|         self::dropIndex('#__nextend2_section_storage', 'application');
 | |
|         self::dropIndex('#__nextend2_section_storage', 'application_2');
 | |
| 
 | |
|         $this->fixColumn('#__nextend2_section_storage', 'section', 'VARCHAR(128)', 'NOT NULL');
 | |
|         $this->fixColumn('#__nextend2_section_storage', 'referencekey', 'VARCHAR(128)', 'NOT NULL');
 | |
| 
 | |
|         $this->query("ALTER TABLE `#__nextend2_section_storage` ADD INDEX `application` (`application`, `section`(50), `referencekey`(50))");
 | |
|         $this->query("ALTER TABLE `#__nextend2_section_storage` ADD INDEX `application_2` (`application`, `section`(50))");
 | |
| 
 | |
|         self::fixIndex('#__nextend2_section_storage', 'isSystem');
 | |
|         self::fixIndex('#__nextend2_section_storage', 'editable');
 | |
| 
 | |
|         $this->fixColumn('#__nextend2_smartslider3_sliders', 'ordering', 'INT', 'NOT NULL DEFAULT \'0\'');
 | |
| 
 | |
|         self::dropIndex('#__nextend2_smartslider3_sliders', 'status');
 | |
| 
 | |
|         $this->renameColumn('#__nextend2_smartslider3_sliders', 'status', 'slider_status', 'VARCHAR(50) NOT NULL DEFAULT \'published\'');
 | |
| 
 | |
|         $this->fixColumn('#__nextend2_smartslider3_sliders', 'title', 'TEXT', 'NOT NULL');
 | |
|         $this->fixColumn('#__nextend2_smartslider3_sliders', 'alias', 'TEXT', 'NULL DEFAULT NULL');
 | |
|         $this->fixColumn('#__nextend2_smartslider3_sliders', 'thumbnail', 'TEXT', 'NOT NULL');
 | |
| 
 | |
|         $this->fixColumn('#__nextend2_smartslider3_slides', 'title', 'TEXT');
 | |
|         $this->fixColumn('#__nextend2_smartslider3_slides', 'thumbnail', 'TEXT');
 | |
| 
 | |
|         $this->fixColumn('#__nextend2_smartslider3_slides', 'publish_up', 'DATETIME', 'NOT NULL DEFAULT \'1970-01-01 00:00:00\'');
 | |
|         $this->fixColumn('#__nextend2_smartslider3_slides', 'publish_down', 'DATETIME', 'NOT NULL DEFAULT \'1970-01-01 00:00:00\'');
 | |
| 
 | |
|         self::fixIndex('#__nextend2_smartslider3_sliders', 'slider_status');
 | |
|         self::fixIndex('#__nextend2_smartslider3_sliders', 'time');
 | |
| 
 | |
|         self::fixIndex('#__nextend2_smartslider3_sliders_xref', 'ordering');
 | |
| 
 | |
|         $this->query("DELETE FROM `#__nextend2_section_storage` WHERE `application` LIKE 'smartslider' AND `section` LIKE 'sliderChanged'");
 | |
| 
 | |
| 
 | |
|         self::fixIndex('#__nextend2_smartslider3_slides', 'published');
 | |
|         self::fixIndex('#__nextend2_smartslider3_slides', 'publish_up');
 | |
|         self::fixIndex('#__nextend2_smartslider3_slides', 'publish_down');
 | |
|         self::fixIndex('#__nextend2_smartslider3_slides', 'generator_id');
 | |
| 
 | |
| 
 | |
|         self::dropIndex('#__nextend2_smartslider3_slides', 'thumbnail');
 | |
|         self::fixIndex('#__nextend2_smartslider3_slides', 'thumbnail', 100);
 | |
| 
 | |
|         self::fixIndex('#__nextend2_smartslider3_slides', 'ordering');
 | |
|         self::fixIndex('#__nextend2_smartslider3_slides', 'slider');
 | |
| 
 | |
|         if (Notification::hasErrors()) {
 | |
|             Notification::displayPlainErrors();
 | |
|             exit;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private function installTable($tableName, $structure) {
 | |
|         $query = 'CREATE TABLE IF NOT EXISTS `' . Database::getPrefix() . $tableName . '` ';
 | |
| 
 | |
|         $query .= $structure;
 | |
|         $query .= ' ' . Database::getCharsetCollate();
 | |
| 
 | |
|         $this->query($query);
 | |
|     }
 | |
| 
 | |
|     private function query($query) {
 | |
| 
 | |
|         Database::query(Database::parsePrefix($query));
 | |
|     }
 | |
| 
 | |
|     private function hasColumn($table, $col) {
 | |
|         return !!Database::queryRow(Database::parsePrefix("SHOW COLUMNS FROM `" . $table . "` LIKE '" . $col . "'"));
 | |
|     }
 | |
| 
 | |
|     public static function repair() {
 | |
| 
 | |
|         self::fixPrimaryKey('#__nextend2_section_storage', 'id', true);
 | |
| 
 | |
|         self::fixPrimaryKey('#__nextend2_image_storage', 'id', true);
 | |
| 
 | |
|         self::fixPrimaryKey('#__nextend2_smartslider3_generators', 'id', true);
 | |
| 
 | |
|         self::fixPrimaryKey('#__nextend2_smartslider3_sliders', 'id', true);
 | |
| 
 | |
|         self::fixPrimaryKey('#__nextend2_smartslider3_slides', 'id', true);
 | |
| 
 | |
|         self::fixPrimaryKey('#__nextend2_smartslider3_sliders_xref', array(
 | |
|             'slider_id',
 | |
|             'group_id'
 | |
|         ));
 | |
|     }
 | |
| 
 | |
| 
 | |
|     public function reindexOrders() {
 | |
|         $query   = "SELECT
 | |
|             sliders.*
 | |
|         FROM
 | |
|             `#__nextend2_smartslider3_sliders` AS sliders
 | |
|         LEFT JOIN `#__nextend2_smartslider3_sliders_xref` AS xref
 | |
|         ON
 | |
|             xref.slider_id = sliders.id
 | |
|         WHERE
 | |
|             (
 | |
|                 xref.group_id IS NULL OR xref.group_id = 0
 | |
|             )
 | |
|         ORDER BY ordering";
 | |
|         $sliders = Database::queryAll(Database::parsePrefix($query));
 | |
|         foreach ($sliders as $idx => $slider) {
 | |
|             $this->query("UPDATE `#__nextend2_smartslider3_sliders` SET `ordering` = '" . $idx . "'  WHERE `id` = " . $slider['id'] . " ");
 | |
|         }
 | |
| 
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * @param string       $tableName
 | |
|      * @param array|string $colNames
 | |
|      * @param bool         $autoIncrement
 | |
|      */
 | |
|     private static function fixPrimaryKey($tableName, $colNames, $autoIncrement = false) {
 | |
|         if (!is_array($colNames)) {
 | |
|             $colNames = array($colNames);
 | |
|         }
 | |
|         $tableName = Database::parsePrefix($tableName);
 | |
| 
 | |
|         Database::query('DELETE FROM ' . $tableName . ' WHERE ' . $colNames[0] . ' = 0;');
 | |
|         $hasIndex = Database::queryRow("SHOW INDEXES FROM " . $tableName . " WHERE Key_name = 'PRIMARY'");
 | |
|         if (!$hasIndex) {
 | |
|             Database::query('ALTER TABLE ' . $tableName . ' ADD PRIMARY KEY(' . implode(', ', $colNames) . ');');
 | |
|         }
 | |
| 
 | |
|         if (count($colNames) == 1 && $autoIncrement) {
 | |
|             Database::query('ALTER TABLE ' . $tableName . ' MODIFY `' . $colNames[0] . '` INT NOT NULL AUTO_INCREMENT;');
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private static function fixIndex($tableName, $colName, $limit = null) {
 | |
|         $tableName = Database::parsePrefix($tableName);
 | |
| 
 | |
|         if (!self::hasIndex($tableName, $colName)) {
 | |
|             Database::query("ALTER TABLE " . $tableName . " ADD INDEX `" . $colName . "` (`" . $colName . "`" . (isset($limit) ? '(' . $limit . ')' : '') . ")");
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private static function dropIndex($tableName, $colName) {
 | |
|         $tableName = Database::parsePrefix($tableName);
 | |
| 
 | |
|         if (self::hasIndex($tableName, $colName)) {
 | |
|             Database::query("ALTER TABLE " . $tableName . " DROP INDEX `" . $colName . "`");
 | |
|         }
 | |
| 
 | |
|     }
 | |
| 
 | |
|     private static function hasIndex($tableName, $colName) {
 | |
|         return Database::queryRow("SHOW INDEXES FROM " . $tableName . " WHERE Key_name = '" . $colName . "'");
 | |
|     }
 | |
| 
 | |
|     private static function fixType($tableName, $colName, $type, $default = '') {
 | |
|         $tableName = Database::parsePrefix($tableName);
 | |
| 
 | |
|         $column = Database::queryRow(Database::parsePrefix("SHOW COLUMNS FROM " . $tableName . " LIKE '" . $colName . "'"));
 | |
| 
 | |
|         if ($column['Type'] != $type) {
 | |
|             Database::query("ALTER TABLE " . $tableName . " MODIFY `" . $colName . "` " . $type . " " . $default);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     //Create column if doesn't exists. If column exists, fix its type.
 | |
|     private function fixColumn($tableName, $colName, $type, $default = '') {
 | |
|         if (!$this->hasColumn($tableName, $colName)) {
 | |
|             $this->query("ALTER TABLE " . $tableName . " ADD `" . $colName . "` " . $type . " " . $default);
 | |
| 
 | |
|         } else {
 | |
|             self::fixType($tableName, $colName, $type, $default);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private function renameColumn($tableName, $colFrom, $colTo, $typeAndDefault) {
 | |
|         if (!$this->hasColumn($tableName, $colTo)) {
 | |
|             if ($this->hasColumn($tableName, $colFrom)) {
 | |
|                 $this->query("ALTER TABLE " . $tableName . " CHANGE  `" . $colFrom . "`  `" . $colTo . "` " . $typeAndDefault);
 | |
| 
 | |
|             } else {
 | |
|                 $this->query("ALTER TABLE " . $tableName . " ADD `" . $colTo . "` " . $typeAndDefault);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| } |