eZ Publish  [trunk]
ezdbpackagehandler.php
Go to the documentation of this file.
00001 <?php
00002 /**
00003  * File containing the eZDBPackageHandler class.
00004  *
00005  * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved.
00006  * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2
00007  * @version //autogentag//
00008  * @package kernel
00009  */
00010 
00011 /*!
00012   \class eZDBPackageHandler ezdbpackagehandler.php
00013   \brief Handles SQL files in the package system
00014 
00015 */
00016 
00017 class eZDBPackageHandler extends eZPackageHandler
00018 {
00019     /*!
00020      Constructor
00021     */
00022     function eZDBPackageHandler()
00023     {
00024         $this->eZPackageHandler( 'ezdb' );
00025     }
00026 
00027     /*!
00028      Installs the package type
00029     */
00030     function install( $package, $installType, $parameters,
00031                       $name, $os, $filename, $subdirectory,
00032                       $content, &$installParameters,
00033                       &$installData )
00034     {
00035         $path = $package->path();
00036         $databaseType = false;
00037         if ( isset( $parameters['database-type'] ) )
00038         {
00039             $databaseType = $parameters['database-type'];
00040         }
00041         $path .= '/' . eZDBPackageHandler::sqlDirectory();
00042         if ( $databaseType )
00043         {
00044             $path .= '/' . $databaseType;
00045         }
00046 
00047         if ( file_exists( $path ) )
00048         {
00049             $db = eZDB::instance();
00050             $canInsert = true;
00051             if ( $databaseType and
00052                  $databaseType != $db->databaseName() )
00053             {
00054                 $canInsert = false;
00055             }
00056 
00057             if ( $canInsert )
00058             {
00059                 eZDebug::writeDebug( "Installing SQL file $path/$filename" );
00060                 $db->insertFile( $path, $filename, false );
00061                 return true;
00062             }
00063             else
00064             {
00065                 eZDebug::writeDebug( "Skipping SQL file $path/$filename" );
00066             }
00067         }
00068         else
00069         {
00070             eZDebug::writeError( "Could not find SQL file $path/$filename" );
00071         }
00072         return false;
00073     }
00074 
00075     function add( $packageType, $package, $cli, $parameters )
00076     {
00077         if ( isset( $parameters['sql-file-list'] ) )
00078         {
00079             foreach ( $parameters['sql-file-list'] as $fileItem )
00080             {
00081                 $package->appendInstall( 'sql', false, false, true,
00082                                          $fileItem['file'], false,
00083                                          array( 'path' => $fileItem['path'],
00084                                                 'database-type' => $fileItem['database_type'],
00085                                                 'copy-file' => true ) );
00086                 if ( $fileItem['database_type'] )
00087                     $package->appendDependency( 'requires',
00088                                                 array( 'type' => 'ezdb',
00089                                                        'name' => $fileItem['database_type'],
00090                                                        'value' => false ) );
00091                 $noticeText = "Adding " . $cli->stylize( 'mark', "sql" ) . " file " . $cli->stylize( 'file', $fileItem['path'] );
00092                 if ( $fileItem['database_type'] )
00093                     $noticeText .= " for database " . $cli->stylize( 'emphasize',  $fileItem['database_type']  );
00094                 $cli->notice( $noticeText );
00095             }
00096         }
00097     }
00098 
00099     function handleAddParameters( $packageType, $package, $cli, $arguments )
00100     {
00101         return $this->handleParameters( $packageType, $package, $cli, 'add', $arguments );
00102     }
00103 
00104     function handleParameters( $packageType, $package, $cli, $type, $arguments )
00105     {
00106         $sqlFileList = array();
00107         $currentDatabaseType = false;
00108 
00109         for ( $i = 0; $i < count( $arguments ); ++$i )
00110         {
00111             $argument = $arguments[$i];
00112             if ( $argument[0] == '-' )
00113             {
00114                 if ( strlen( $argument ) > 1 and
00115                      $argument[1] == '-' )
00116                 {
00117                 }
00118                 else
00119                 {
00120                     $flag = substr( $argument, 1, 1 );
00121                     if ( $flag == 'd' )
00122                     {
00123                         if ( strlen( $argument ) > 2 )
00124                         {
00125                             $data = substr( $argument, 2 );
00126                         }
00127                         else
00128                         {
00129                             $data = $arguments[$i+1];
00130                             ++$i;
00131                         }
00132                         if ( $flag == 'd' )
00133                         {
00134                             $currentDatabaseType = $data;
00135                         }
00136                     }
00137                 }
00138             }
00139             else
00140             {
00141                 $sqlFile = $argument;
00142                 $databaseType = $currentDatabaseType;
00143                 $realFilePath = $this->sqlFileExists( $sqlFile, $databaseType,
00144                                                       $triedFiles );
00145                 if ( !$realFilePath )
00146                 {
00147                     $cli->error( "SQL file " . $cli->style( 'file' ) . $sqlFile . $cli->style( 'file-end' ) . " does not exist\n" .
00148                                  "The following files were searched for:\n" .
00149                                  implode( "\n", $triedFiles ) );
00150                     return false;
00151                 }
00152                 $fileList[] = array( 'file' => $sqlFile,
00153                                      'database_type' => $databaseType,
00154                                      'path' => $realFilePath );
00155             }
00156         }
00157         if ( count( $fileList ) == 0 )
00158         {
00159             $cli->error( "No files were added" );
00160             return false;
00161         }
00162         return array( 'sql-file-list' => $fileList );
00163     }
00164 
00165     function sqlFileExists( &$sqlFile, &$databaseType,
00166                             &$triedFiles )
00167     {
00168         $triedFiles = array();
00169         if ( file_exists( $sqlFile ) )
00170         {
00171             $filePath = $sqlFile;
00172             if ( preg_match( '#^.+/([^/]+$)#', $sqlFile, $matches ) )
00173                 $sqlFile = $matches[1];
00174             return $filePath;
00175         }
00176         $filePath = 'kernel/sql/' . $databaseType . '/' . $sqlFile;
00177         if ( file_exists( $filePath ) )
00178             return $filePath;
00179         $triedFiles[] = $filePath;
00180         $filePath = 'kernel/sql/' . $databaseType . '/' . $sqlFile . '.sql';
00181         if ( file_exists( $filePath ) )
00182         {
00183             $sqlFile .= '.sql';
00184             return $filePath;
00185         }
00186         $triedFiles[] = $filePath;
00187         return false;
00188     }
00189 
00190     function sqlDirectory()
00191     {
00192         return 'sql';
00193     }
00194 
00195     function createInstallNode( $package, $installNode, $installItem, $installType )
00196     {
00197         $installNode->setAttribute( 'original-path', $installItem['path'] );
00198         $installNode->setAttribute( 'database-type', $installItem['database-type'] );
00199 
00200         $originalPath = $installItem['path'];
00201         $installDirectory = $package->path() . '/' . eZDBPackageHandler::sqlDirectory();
00202         if ( $installItem['database-type'] )
00203             $installDirectory .= '/' . $installItem['database-type'];
00204         if ( !file_exists(  $installDirectory ) )
00205             eZDir::mkdir( $installDirectory, false, true );
00206         eZFileHandler::copy( $originalPath, $installDirectory . '/' . $installItem['filename'] );
00207     }
00208 
00209     function parseInstallNode( $package, $installNode, &$installParameters, $isInstall )
00210     {
00211         $installParameters['path'] = $installNode->getAttribute( 'original-path' );
00212         $installParameters['database-type'] = $installNode->getAttribute( 'database-type' );
00213     }
00214 }
00215 
00216 ?>