Inside The Machine

Coding for fun

Wrong: Joomla extension installation J! 2.5 / J! 3x begins with first Sql update file

Instead of using the matching sql file for the joomla component the database update began with the first one.

Reason:

In the manifest file following part was used for the first time

 


    <update> <!-- Runs on update; New in 2.5 -->                   
        <schemas>                                                  
            <schemapath type="mysql">sql/updates/mysql</schemapath>
        </schemas>                                                 
    </update>                                                      


 

in this case the table "#__schemas" is asked for an entry of the component with the actual version. In my case there was no entry for my component and the database update began with version one of the sql files.

 

Solution, How to fix it:

Inside the installation script we can set set the version if it doesn't exist. 

 


     public function preflight($type, $parent)
    {
        if ( $type == 'update' )
        {    
            $this->oldRelease = $this->getParam('version');
            
            //--------------------------------------------------------------------------------
            // Check if version is already set in "_schemas" table
            // Create table #__schema entry fpr rsgallery if not used before
            //--------------------------------------------------------------------------------
            
            //--- Determine extension id ------------------
            $db = JFactory::getDbo();
            $query = $db->getQuery(true);
            $query->select($db->quoteName('extension_id'))
                ->from('#__extensions')
                ->where($db->quoteName('type') . ' = ' . $db->quote('component')
                    . ' AND ' . $db->quoteName('element') . ' = ' . $db->quote('com_myComponent')
                    . ' AND ' . $db->quoteName('name') . ' = ' . $db->quote('com_myComponent'));
            $db->setQuery($query);        
            $ExtId = $db->loadResult();

            //--- Read SchemaVersion ------------------
            /*
            $query->clear();
            $query->select($db->quoteName('version_id'))
                ->from('#__schemas')
                ->where($db->quoteName('extension_id') . ' = ' . $db->quote($ExtId));
            $db->setQuery($query);        
            $SchemaVersion = $db->loadResult();
            */
            
            //--- Check if entry in _schemas table exists ------------------
            
            $query->clear();
            $query->select('count(*)');
            $query->from($db->quoteName('#__schemas'))
                ->where($db->quoteName('extension_id') . ' = ' . $db->quote($ExtId));
            $db->setQuery($query);
            $SchemaVersionCount = $db->loadResult();

            // component entry does not exist
            if($SchemaVersionCount != 1)
            {
                // Create component entry (version) in __schemas

                $query->clear();
                $query->insert($db->quoteName('#__schemas'));
                $query->columns(array($db->quoteName('extension_id'), $db->quoteName('version_id')));
                $query->values($Rsg2id . ', ' . $db->quote($this->oldRelease));
                $db->setQuery($query);
                $db->execute();

                //    example UPDATE #__schemas SET version_id = 'NEWVERSION' WHERE extension_id = 700    
            }
        }
    }