|
eZ Publish
[trunk]
|
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 ?>