Changeset 2236

Show
Ignore:
Timestamp:
07/29/06 14:46:42 (7 months ago)
Author:
demian
Message:

Extracted execution from SGL_Sql::parseAndExecute()

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/0.6-bugfix/CHANGELOG.txt

    r2232 r2236  
    1313            available on rebuild 
    1414IMPROVEMENTS 
     1529-07-06    Extracted execution from SGL_Sql::parseAndExecute(), added ability to 
     16            extract all table names from a schema file 
    151727-07-06    Added possibility to custimise defaults in installer (Eric Persson) 
    161827-07-06    Minimal modules and no sample data are now defaults 
  • branches/0.6-bugfix/lib/SGL/FrontController.php

    r2148 r2236  
    160160    { 
    161161        $cachedLibs = SGL_VAR_DIR . '/cachedLibs.php'; 
    162         if (is_file($cachedLibs) && SGL_CACHE_LIBS) { 
     162        if (is_file($cachedLibs) && defined('SGL_CACHE_LIBS')) { 
    163163            require_once $cachedLibs; 
    164164        } else { 
     
    192192                require_once $file; 
    193193 
    194                 if (SGL_CACHE_LIBS === true) { 
     194                if (defined('SGL_CACHE_LIBS') && SGL_CACHE_LIBS === true) { 
    195195                    // 270kb vs 104kb 
    196196                    if ($ok = version_compare(phpversion(), '5.1.2', '>=')) { 
     
    201201                } 
    202202            } 
    203             if (SGL_CACHE_LIBS === true) { 
     203            if (defined('SGL_CACHE_LIBS') && SGL_CACHE_LIBS === true) { 
    204204                $ok = file_put_contents($cachedLibs, $fileCache); 
    205205            } 
  • branches/0.6-bugfix/lib/SGL/Sql.php

    r1872 r2236  
    5858     * @return  void 
    5959     */ 
    60     function parseAndExecute($filename, $errorReporting = E_ALL
     60    function parse($filename, $errorReporting = E_ALL, $executerCallback = null
    6161    { 
    6262        //  Optionally shut off error reporting if logging isn't set up correctly yet 
     63        $originalErrorLevel = error_reporting(); 
    6364        error_reporting($errorReporting); 
    6465 
     
    6667            return false; 
    6768        } 
    68         // Get database handle based on working config.ini 
    69         $locator = &SGL_ServiceLocator::singleton(); 
    70         $dbh = $locator->get('DB'); 
    71         if (!$dbh) { 
    72             $dbh = & SGL_DB::singleton(); 
    73             $locator->register('DB', $dbh); 
    74         } 
     69 
    7570        $sql = ''; 
    7671        $c = &SGL_Config::singleton(); 
     
    8681 
    8782        // Iterate through each line in the file. 
     83        $aLines = array(); 
    8884        while (!feof($fp)) { 
    8985 
     
    104100#END:FIXME 
    105101            if (preg_match("/insert/i", $line) && preg_match("/\{SGL_NEXT_ID\}/", $line)) { 
    106                 $tableName = SGL_Sql::extractTableName($line); 
    107                 $nextId = $dbh->nextId($tableName); 
     102                $tableName = SGL_Sql::extractTableNameFromInsertStatement($line); 
     103                $nextId = SGL_Sql::getNextId($tableName); 
    108104                $line = SGL_Sql::rewriteWithAutoIncrement($line, $nextId); 
    109105            } 
     
    113109                continue; 
    114110            } 
    115  
    116111            // strip semi-colons for MaxDB, Oracle and mysql 3.23 
    117112            if ($conf['db']['type'] == 'oci8_SGL' || $conf['db']['type'] == 'odbc' || $isMysql323) { 
     
    119114            } 
    120115            // Execute the statement. 
    121             $res = $dbh->query($sql); 
    122  
    123             if (PEAR::isError($res, DB_ERROR_ALREADY_EXISTS)) { 
    124                 return $res; 
    125             } elseif (DB::isError($res)) { 
    126  
    127                 // Print out info on bad statements 
    128                 echo '<pre>'.$res->getMessage().'</pre>'; 
    129                 echo '<pre>'. $res->getUserInfo() . '</pre>'; 
    130             } 
     116            if (!is_null($executerCallback) && is_callable($executerCallback)) { 
     117                $res = call_user_func_array( 
     118                    array($executerCallback[0], $executerCallback[1]), $sql); 
     119                //  handle error 
     120                if (PEAR::isError($res, DB_ERROR_ALREADY_EXISTS)) { 
     121                    return $res; 
     122                } elseif (DB::isError($res)) { 
     123                    // Print out info on bad statements 
     124                    echo '<pre>'.$res->getMessage().'</pre>'; 
     125                    echo '<pre>'. $res->getUserInfo() . '</pre>'; 
     126                } 
     127            } 
     128            $aLines[] = $sql; 
    131129            $sql = ''; 
    132130        } 
    133131        fclose($fp); 
    134         return true; 
    135     } 
    136  
    137     function extractTableName($str) 
     132        //  reset orig error level 
     133        error_reporting($originalErrorLevel); 
     134        return implode("\n", $aLines); 
     135    } 
     136 
     137    function execute($sql) 
     138    { 
     139        // Get database handle based on working config.ini 
     140        $locator = &SGL_ServiceLocator::singleton(); 
     141        $dbh = $locator->get('DB'); 
     142        if (!$dbh) { 
     143            $dbh = & SGL_DB::singleton(); 
     144            $locator->register('DB', $dbh); 
     145        } 
     146        $res = $dbh->query($sql); 
     147        return $res; 
     148    } 
     149 
     150    function getNextId($tableName) 
     151    { 
     152        // Get database handle based on working config.ini 
     153        $locator = &SGL_ServiceLocator::singleton(); 
     154        $dbh = $locator->get('DB'); 
     155        if (!$dbh) { 
     156            $dbh = & SGL_DB::singleton(); 
     157            $locator->register('DB', $dbh); 
     158        } 
     159        return $dbh->nextId($tableName); 
     160    } 
     161 
     162    function extractTableNameFromInsertStatement($str) 
    138163    { 
    139164        $pattern = '/^(INSERT INTO)(\W+)(\w+)(\W+)(.*)/i'; 
     
    143168    } 
    144169 
     170    function extractTableNameFromCreateStatement($str) 
     171    { 
     172        $pattern = '/(CREATE TABLE)(\W+)(IF NOT EXISTS)?(\W+)?(\w+)(\W+)?/i'; 
     173        preg_match($pattern, $str, $matches); 
     174        $tableName = $matches[5]; 
     175        return $tableName; 
     176    } 
     177 
    145178    function rewriteWithAutoIncrement($str, $nextId) 
    146179    { 
     
    148181        return $res; 
    149182    } 
     183 
     184    function extractTableNamesFromSchemaFile($file) 
     185    { 
     186        $aLines = file($file); 
     187        $aTablesNames = array(); 
     188        foreach ($aLines as $line) { 
     189            if (preg_match("/create table/i", $line)) { 
     190                $aTablesNames[] = SGL_Sql::extractTableNameFromCreateStatement($line); 
     191            } 
     192        } 
     193        return $aTablesNames; 
     194    } 
     195 
     196    function getDbShortnameFromType($dbType) 
     197    { 
     198        switch ($dbType) { 
     199        case 'pgsql': 
     200            $shortName = 'pg'; 
     201            break; 
     202 
     203        case 'mysql_SGL': 
     204        case 'mysql': 
     205            $shortName = 'my'; 
     206            break; 
     207 
     208        case 'oci8_SGL': 
     209            $shortName = 'oci'; 
     210            break; 
     211        } 
     212        return $shortName; 
     213    } 
    150214} 
    151215?> 
  • branches/0.6-bugfix/lib/SGL/Task/Install.php

    r2234 r2236  
    405405            //  load 'sequence' table 
    406406            if ($this->conf['db']['type'] == 'mysql_SGL') { 
    407                 $result = SGL_Sql::parseAndExecute(SGL_ETC_DIR . '/sequence.my.sql', 0); 
     407                $result = SGL_Sql::parse(SGL_ETC_DIR . '/sequence.my.sql', 0, array('SGL_Sql', 'execute')); 
    408408            } 
    409409 
     
    414414                //  Load the module's schema 
    415415                if (file_exists($modulePath . $this->filename1)) { 
    416                     $result = SGL_Sql::parseAndExecute($modulePath . $this->filename1, 0); 
     416                    $result = SGL_Sql::parse($modulePath . $this->filename1, 0, array('SGL_Sql', 'execute')); 
    417417                    $displayHtml = $result ? $this->success : $this->failure; 
    418418                    $this->updateHtml($module . '_schema', $displayHtml); 
     
    457457                //  Load the module's data 
    458458                if (file_exists($modulePath . $this->filename2)) { 
    459                     $result = SGL_Sql::parseAndExecute($modulePath . $this->filename2, 0); 
     459                    $result = SGL_Sql::parse($modulePath . $this->filename2, 0, array('SGL_Sql', 'execute')); 
    460460                    $displayHtml = $result ? $this->success : $this->failure; 
    461461                    $this->updateHtml($module . '_data', $displayHtml); 
     
    487487                //  Load the module's data 
    488488                if (file_exists($modulePath . $this->filename3)) { 
    489                     $result = SGL_Sql::parseAndExecute($modulePath . $this->filename3, 0); 
     489                    $result = SGL_Sql::parse($modulePath . $this->filename3, 0, array('SGL_Sql', 'execute')); 
    490490                    $displayHtml = $result ? $this->success : $this->failure; 
    491491                    $this->updateHtml($module . '_dataSample', $displayHtml); 
     
    516516            //  Load the module's data 
    517517            if (file_exists($modulePath . $this->filename4)) { 
    518                 $result = SGL_Sql::parseAndExecute($modulePath . $this->filename4, 0); 
     518                $result = SGL_Sql::parse($modulePath . $this->filename4, 0, array('SGL_Sql', 'execute')); 
    519519                $displayHtml = $result ? $this->success : $this->failure; 
    520520                $this->updateHtml($module . '_dataBlock', $displayHtml); 
     
    543543                $modulePath = SGL_MOD_DIR . '/' . $module  . '/data'; 
    544544                if (file_exists($modulePath . $this->filename5)) { 
    545                     $result = SGL_Sql::parseAndExecute($modulePath . $this->filename5, 0); 
     545                    $result = SGL_Sql::parse($modulePath . $this->filename5, 0, array('SGL_Sql', 'execute')); 
    546546                    $displayHtml = $result ? $this->success : $this->failure; 
    547547                    $this->updateHtml($module . '_constraints', $displayHtml); 
  • branches/0.6-bugfix/lib/SGL/tests/SqlTest.wdb.php

    r1704 r2236  
    2929    { 
    3030        $file = dirname(__FILE__) . '/test.data.sql'; 
    31         $ret = $this->sql->parseAndExecute($file); 
     31        $ret = $this->sql->parse($file, E_ALL, array('SGL_Sql', 'execute')); 
    3232    } 
    3333 
     
    5151    { 
    5252        $partialSql = "INSERT INTO module VALUES ({SGL_NEXT_ID}, 1, 'asset', 'Asset Manager',"; 
    53         $res = $this->sql->extractTableName($partialSql); 
     53        $res = $this->sql->extractTableNameFromInsertStatement($partialSql); 
    5454        $this->assertEqual($res, 'module'); 
    5555 
    5656        $partialSql = "INSERT INTO `module VALUES ({SGL_NEXT_ID}, 1, 'asset', 'Asset Manager',"; 
    57         $res = $this->sql->extractTableName($partialSql); 
     57        $res = $this->sql->extractTableNameFromInsertStatement($partialSql); 
    5858        $this->assertEqual($res, 'module'); 
    5959 
    6060        $partialSql = "INSERT INTO `module` VALUES ({SGL_NEXT_ID}, 1, 'asset', 'Asset Manager',"; 
    61         $res = $this->sql->extractTableName($partialSql); 
     61        $res = $this->sql->extractTableNameFromInsertStatement($partialSql); 
    6262        $this->assertEqual($res, 'module'); 
    6363 
    6464        $partialSql = "INSERT INTO ` module` VALUES ({SGL_NEXT_ID}, 1, 'asset', 'Asset Manager',"; 
    65         $res = $this->sql->extractTableName($partialSql); 
     65        $res = $this->sql->extractTableNameFromInsertStatement($partialSql); 
    6666        $this->assertEqual($res, 'module'); 
    6767 
    6868        $partialSql = "INSERT INTO 'module' VALUES ({SGL_NEXT_ID}, 1, 'asset', 'Asset Manager',"; 
    69         $res = $this->sql->extractTableName($partialSql); 
     69        $res = $this->sql->extractTableNameFromInsertStatement($partialSql); 
    7070        $this->assertEqual($res, 'module'); 
    7171    } 
     
    7474    { 
    7575        $file = dirname(__FILE__) . '/test.schema.sql'; 
    76         $ret = $this->sql->parseAndExecute($file); 
     76        $ret = $this->sql->parse($file, E_ALL, array('SGL_Sql', 'execute')); 
    7777    } 
    7878} 
  • branches/0.6-bugfix/lib/SGL/tests/VariousTest.ndb.php

    r2174 r2236  
    11<?php 
     2 
     3require_once dirname(__FILE__) . '/../Sql.php'; 
    24 
    35/** 
     
    6870    } 
    6971 
     72    function testExtractTablenameFromCreateStatement() 
     73    { 
     74        $sql = <<< EOF 
     75/*==============================================================*/ 
     76/* Table: block                                                 */ 
     77/*==============================================================*/ 
     78create table if not exists block 
     79( 
     80   block_id                       int                            not null, 
     81   name                           varchar(64), 
     82   title                          varchar(32), 
     83   title_class                    varchar(32), 
     84   body_class                     varchar(32), 
     85   blk_order                      smallint, 
     86   position                       varchar(16), 
     87   is_enabled                     smallint, 
     88   is_cached                      smallint, 
     89   params                         longtext, 
     90   primary key (block_id) 
     91); 
     92 
     93/*==============================================================*/ 
     94/* Table: block_assignment                                      */ 
     95/*==============================================================*/ 
     96create table if not exists block_assignment 
     97( 
     98   block_id                       int                            not null, 
     99   section_id                     int                            not null, 
     100   primary key (block_id, section_id) 
     101); 
     102 
     103/*==============================================================*/ 
     104/* Index: block_assignment_fk                                   */ 
     105/*==============================================================*/ 
     106create index block_assignment_fk on block_assignment 
     107( 
     108   block_id 
     109EOF; 
     110        $aLines = explode("\n", $sql); 
     111        foreach ($aLines as $line) { 
     112            $aTableNames[] = SGL_Sql::extractTableNameFromCreateStatement($line); 
     113        } 
     114        $aTableNames = array_filter($aTableNames); //remove blanks 
     115        $this->assertEqual(count($aTableNames), 2); // doesn't catch index 
     116    } 
     117 
     118    function testExtractTableNameFromCreateStatement1() 
     119    { 
     120        $str = 'create table block'; 
     121        $tableName = SGL_Sql::extractTableNameFromCreateStatement($str); 
     122        $this->assertEqual($tableName, 'block'); 
     123    } 
     124 
     125    function testExtractTableNameFromCreateStatement2() 
     126    { 
     127        $str = 'create table `block'; 
     128        $tableName = SGL_Sql::extractTableNameFromCreateStatement($str); 
     129        $this->assertEqual($tableName, 'block'); 
     130    } 
     131 
     132    function testExtractTableNameFromCreateStatement3() 
     133    { 
     134        $str = 'create table if not exists block'; 
     135        $tableName = SGL_Sql::extractTableNameFromCreateStatement($str); 
     136        $this->assertEqual($tableName, 'block'); 
     137    } 
     138 
     139    function testExtractTableNameFromCreateStatement4() 
     140    { 
     141        $str = 'create table if not exists `block`'; 
     142        $tableName = SGL_Sql::extractTableNameFromCreateStatement($str); 
     143        $this->assertEqual($tableName, 'block'); 
     144    } 
     145 
     146    function testExtractExecuteFromSqlParse() 
     147    { 
     148        $schemaFile =  SGL_MOD_DIR . '/default/data/schema.my.sql'; 
     149        $res = SGL_Sql::parse($schemaFile, E_ALL, array('SGL_Sql', 'execute')); 
     150        $this->assertTrue(strlen($res) > 2000); // a parsed ~ 2k file is returned 
     151    } 
     152 
    70153    function testRemoveNonAlphaChars() 
    71154    { 
     
    111194        $aFilters = array('Foo1', 'Bar1', 'Baz'); 
    112195        $code = '$process = '; 
     196        $closeParens = ''; 
     197        $filters = ''; 
    113198        foreach ($aFilters as $filter) { 
    114199            $filters .= "new $filter(\n"; 
  • branches/0.6-bugfix/modules/default/classes/ModuleMgr.php

    r2042 r2236  
    173173 
    174174    } 
     175 
    175176    function _cmd_overview(&$input, &$output) 
    176177    { 
     
    322323        $aPagedData = SGL_DB::getPagedData($this->dbh, $query, $pagerOptions); 
    323324 
    324         // if there are modules, clean up output 
     325        // if there are modules, determine whether installed 
    325326        if (count($aPagedData['data'])) { 
     327            require_once SGL_CORE_DIR . '/Sql.php'; 
     328 
     329            $dbShortname = SGL_Sql::getDbShortnameFromType($this->conf['db']['type']); 
    326330            foreach ($aPagedData['data'] as $k => $aModule) { 
    327                 $aPagedData['data'][$k]['is_configurable'] = $aModule['is_configurable'] ? 'yes' : 'no'; 
    328             } 
     331                $schemaFile =  SGL_MOD_DIR . '/' . $aModule['name']  . '/data/schema.'.$dbShortname.'.sql'; 
     332                $aTables[] = SGL_Sql::extractTableNamesFromSchemaFile($schemaFile); 
     333            } 
     334#print '<pre>';print_r($aTables); 
    329335        } 
    330336        //  determine if pagination is required 
     
    336342        $output->addOnLoadEvent("switchRowColorOnHover()"); 
    337343    } 
     344 
     345    function _isInstalled() 
     346    { 
     347        SGL_Sql::extractTableNamesPerSchema($filename); 
     348    } 
    338349} 
    339350?> 
  • branches/0.6-bugfix/tests/classes/TestEnv.php

    r1875 r2236  
    9292        if (is_array($aSchemaFiles) && count($aSchemaFiles)) { 
    9393            foreach ($aSchemaFiles as $schemaFile) { 
    94                 SGL_Sql::parseAndExecute(STR_PATH .'/'. $schemaFile); 
     94                SGL_Sql::parse(STR_PATH .'/'. $schemaFile, E_ALL, array('SGL_Sql', 'execute')); 
    9595            } 
    9696        } 
     
    112112        if (is_array($aDataFiles) && count($aDataFiles)) { 
    113113            foreach ($aDataFiles as $dataFile) { 
    114                 SGL_Sql::parseAndExecute(STR_PATH .'/'. $dataFile); 
     114                SGL_Sql::parse(STR_PATH .'/'. $dataFile, E_ALL, array('SGL_Sql', 'execute')); 
    115115            } 
    116116        } 
  • branches/0.6-bugfix/tests/init.php

    r1797 r2236  
    8282 
    8383    // set error reporting as verbose as possible 
    84     error_reporting(E_ALL ^ E_NOTICE); 
     84    error_reporting(E_ALL); 
    8585 
    8686    // Ensure that the initialisation has not been run before