00001 <?php
00011 if(!file_exists('profiles/cmdline.php')) {
00012 die("Run this script from your top-level app directory (eg, /var/www/html/app)\n");
00013 }
00014 require_once('profiles/cmdline.php');
00015 $GLOBALS['db'] = Registry::get('pronto:db:main');
00016
00017 $args = $_SERVER['argv'];
00018 array_shift($args);
00019
00020 $opts = getopt("t:m:ca");
00021 for($i = 0; $i < count($opts); $i++) array_shift($args);
00022
00023 if(empty($opts)) {
00024 echo "usage: php load_schemas.php [-t <table>] [-m <module>] [-c] [-a]\n\n";
00025 echo "This script will scan for .sql schema files and execute them within your RDBMS.\n\n";
00026 echo "Options (use one):\n";
00027 echo " -t <table> Scan all enabled modules (as set in config/config.php) and\n";
00028 echo " config/sql for schema file named <table>.sql\n";
00029 echo " -m <module> Scan <module>/config/sql for schema files\n";
00030 echo " -c Scan config/sql for schema files\n";
00031 echo " -a Scan all enabled modules (as set in config/config.php) and\n";
00032 echo " config/sql for schema files\n\n";
00033 exit(0);
00034 }
00035
00036 $files = array();
00037 if(isset($opts['t'])) {
00038 if(isset($opts['m'])) {
00039 $dirs = array(DIR_FS_APP.DS.'modules'.DS.$opts['m'].DS.'config'.DS.'sql');
00040 } else {
00041
00042 $dirs = array(DIR_FS_APP.DS.'config'.DS.'sql');
00043 foreach(explode(' ', MODULES) as $mod) {
00044 $dirs[] = DIR_FS_APP.DS.'modules'.DS.$mod.DS.'config'.DS.'sql';
00045 }
00046 }
00047 foreach($dirs as $dir) {
00048 $fn = $dir.DS.$opts['t'].'.sql';
00049 if(file_exists($fn)) {
00050 $files = array($fn);
00051 break;
00052 }
00053 }
00054 } else if(isset($opts['c'])) {
00055 $files = glob(DIR_FS_APP.DS.'config'.DS.'sql'.DS.'*.sql');
00056 } else if(isset($opts['m'])) {
00057 $files = glob(DIR_FS_APP.DS.'modules'.DS.$opts['m'].DS.'config'.DS.'sql'.DS.'*.sql');
00058 } else if(isset($opts['a'])) {
00059 $files = glob(DIR_FS_APP.DS.'config'.DS.'sql'.DS.'*.sql');
00060 foreach(explode(' ', MODULES) as $mod) {
00061 $files = array_merge($files, glob(DIR_FS_APP.DS.'modules'.DS.$mod.DS.'config'.DS.'sql'.DS.'*.sql'));
00062 }
00063 }
00064
00065 if(empty($files)) {
00066 echo "No files found.\n";
00067 exit(1);
00068 }
00069
00070 $db =& Registry::get('pronto:db:main');
00071
00072 foreach($files as $f) {
00073 unset($GLOBALS['insql_done'], $GLOBALS['LFILE']);
00074 echo "Loading $f...\n";
00075 if(!do_multi_sql('', $f)) {
00076 echo "Error: An error occurred while trying to run this SQL chunk.\n";
00077 }
00078 }
00079
00080 function do_sql($sql) {
00081 global $db;
00082
00083 $sql = trim($sql);
00084 if(empty($sql)) return true;
00085
00086 return !!$db->execute($sql);
00087 }
00088
00089
00094 function do_multi_sql($insql, $fname) {
00095 $sql = '';
00096 $ochar = '';
00097 $is_cmt = '';
00098 $GLOBALS['insql_done'] = 0;
00099 while($str = get_next_chunk($insql, $fname)) {
00100 $opos =- strlen($ochar);
00101 $cur_pos = 0;
00102 $i = strlen($str);
00103 while($i--) {
00104 if($ochar) {
00105 list($clchar, $clpos) = get_close_char($str, $opos+strlen($ochar), $ochar);
00106 if($clchar) {
00107 if($ochar == '--' || $ochar == '#' || $is_cmt) {
00108 $sql .= substr($str, $cur_pos, $opos-$cur_pos);
00109 } else {
00110 $sql .= substr($str, $cur_pos, $clpos+strlen($clchar)-$cur_pos);
00111 }
00112 $cur_pos = $clpos + strlen($clchar);
00113 $ochar = '';
00114 $opos = 0;
00115 } else {
00116 $sql .= substr($str, $cur_pos);
00117 break;
00118 }
00119 } else {
00120 list($ochar, $opos) = get_open_char($str, $cur_pos);
00121 if($ochar == ';') {
00122 $sql .= substr($str, $cur_pos, $opos-$cur_pos+1);
00123 if(!do_sql($sql)) return 0;
00124 $sql='';
00125 $cur_pos = $opos + strlen($ochar);
00126 $ochar = '';
00127 $opos = 0;
00128 } else if (!$ochar) {
00129 $sql .= substr($str, $cur_pos);
00130 break;
00131 } else {
00132 $is_cmt = 0;
00133 if($ochar == '/*' && substr($str, $opos, 3) != '