X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=sqlite%2Ftrunk%2Fnucleus%2Fsqlite%2Fsqlite.php;fp=sqlite%2Ftrunk%2Fnucleus%2Fsqlite%2Fsqlite.php;h=09a986362babedd914d6e6cda6d5c6556f9ea871;hb=dce859ff2e8ddc75885fd84406f7db256ff12be6;hp=0000000000000000000000000000000000000000;hpb=ea35cd82ab415a28e12cc3d39eb5e3780525d389;p=nucleus-jp%2Fnucleus-plugins.git diff --git a/sqlite/trunk/nucleus/sqlite/sqlite.php b/sqlite/trunk/nucleus/sqlite/sqlite.php new file mode 100644 index 0000000..09a9863 --- /dev/null +++ b/sqlite/trunk/nucleus/sqlite/sqlite.php @@ -0,0 +1,557 @@ +$btrace) { + if (!($templine=$btrace['line'])) continue; + if (!($tempfile=$btrace['file'])) continue; + $file=str_replace('\\','/',$file); + if (!$line && !$file && strpos($tempfile,'/sqlite.php')===false && strpos($tempfile,'/sqlitequeryfunctions.php')===false) { + $line=$templine; + $file=$tempfile; + } + echo "\n\n"; + } + echo "Warning from SQLite-MySQL wrapper: $text
\n"; + if ($line && $file) echo "in $file on line $line
\n"; + echo $more; + return false; +} +function sqlite_DebugMessage($text=''){ + global $SQLITECONF; + if (!$SQLITECONF['DEBUGREPORT']) return; + if ($text) $SQLITECONF['DEBUGMESSAGE'].="\n".$text."\n"; + if (headers_sent()) { + echo ''; + unset($SQLITECONF['DEBUGMESSAGE']); + } +} + +// nucleus_mysql_XXXX() functions follow. + +function nucleus_mysql_connect($p1=null,$p2=null,$p3=null,$p4=null,$p5=null){ + // All prameters are ignored. + global $SQLITE_DBHANDLE,$SQLITECONF; + if (!$SQLITE_DBHANDLE) $SQLITE_DBHANDLE=sqlite_open($SQLITECONF['DBFILENAME']); + // Initialization queries. + foreach($SQLITECONF['INITIALIZE'] as $value) nucleus_mysql_query($value); + // Unregister the function 'php' in sql query. + sqlite_create_function($SQLITE_DBHANDLE,'php','pi'); + return $SQLITE_DBHANDLE; +} + +function nucleus_mysql_close($p1=null){ + global $SQLITE_DBHANDLE; + if (!($dbhandle=$p1)) $dbhandle=$SQLITE_DBHANDLE; + $SQLITE_DBHANDLE=''; + return sqlite_close ($dbhandle); +} + +function nucleus_mysql_select_db($p1,$p2=null){ + // SQLite does not support multiple databases in a file. + // So this function do nothing and always returns true. + // Note: mysql_select_db() function returns true/false, + // not link-ID. + return true; +} + +function nucleus_mysql_query($p1,$p2=null,$unbuffered=false){//echo htmlspecialchars($p1)."
\n"; + global $SQLITE_DBHANDLE,$SQLITECONF; + if (!($dbhandle=$p2)) $dbhandle=$SQLITE_DBHANDLE; + $query=trim($p1); + if (strpos($query,"\xEF\xBB\xBF")===0) $query=substr($query,3);// UTF-8 stuff + if (substr($query,-1)==';') $query=substr($query,0,strlen($query)-1); + + // Escape style is changed from MySQL type to SQLite type here. + // This is important to avoid possible SQL-injection. + $strpositions=array();// contains the data show where the strings are (startposition => endposition) + if (strpos($query,'`')!==false || strpos($query,'"')!==false || strpos($query,"'")!==false) + $strpositions=sqlite_changeQuote($query); + //echo "
".htmlspecialchars($p1)."

\n".htmlspecialchars($query)."
\n"; + + // Debug mode + if ($SQLITECONF['DEBUGMODE']) $query=sqlite_mysql_query_debug($query); + + // Anyway try it. + if ($unbuffered) { + if ($ret=@sqlite_unbuffered_query($dbhandle,$query)) return $ret; + } else { + if ($ret=@sqlite_query($dbhandle,$query)) return $ret; + } + + // Error occured. Query must be translated. + return sqlite_mysql_query_sub($dbhandle,$query,$strpositions,$p1,$unbuffered); +} +function sqlite_mysql_query_sub($dbhandle,$query,$strpositions=array(),$p1=null,$unbuffered=false){//echo htmlspecialchars($p1)."
\n"; + // Query translation is needed, especially when changing the data in database. + // So far, this routine is written for 'CREATE TABLE','DROP TABLE', 'INSERT INTO', + // 'SHOW TABLES LIKE', 'SHOW KEYS FROM', 'SHOW INDEX FROM' + // and several functions used in query. + // How about 'UPDATE' ??? + global $SQLITE_DBHANDLE,$SQLITECONF; + $beforetrans=time()+microtime(); + if (!$p1) $p1=$query; + $morequeries=array(); + $temptable=false; + $uquery=strtoupper($query); + if (strpos($uquery,'CREATE TABLE')===0 || ($temptable=(strpos($uquery,'CREATE TEMPORARY TABLE')===0))) { + if (!($i=strpos($query,'('))) return sqlite_ReturnWithError('nucleus_mysql_query: '.$p1); + //check if the command is 'CREATE TABLE IF NOT EXISTS' + if (strpos(strtoupper($uquery),'CREATE TABLE IF NOT EXISTS')===0) { + $tablename=trim(substr($query,26,$i-26)); + if (substr($tablename,0,1)!="'") $tablename="'$tablename'"; + $res=sqlite_query($dbhandle,"SELECT tbl_name FROM sqlite_master WHERE tbl_name=$tablename LIMIT 1"); + if (nucleus_mysql_num_rows($res)) return true; + } else { + $tablename=trim(substr($query,12,$i-12)); + if (substr($tablename,0,1)!="'") $tablename="'$tablename'"; + } + $query=trim(substr($query,$i+1)); + for ($i=strlen($query);0<$i;$i--) if ($query[$i]==')') break; + $query=substr($query,0,$i); + $commands=_sqlite_divideByChar(',',$query); + require_once(dirname(__FILE__) . '/sqlitealtertable.php'); + $query=sqlite_createtable_query($commands,$tablename,$temptable,$morequeries); + } else if (strpos($uquery,'DROP TABLE IF EXISTS')===0) { + if (!($i=strpos($query,';'))) $i=strlen($query); + $tablename=trim(substr($query,20,$i-20)); + if (substr($tablename,0,1)!="'") $tablename="'$tablename'"; + $res=sqlite_query($dbhandle,"SELECT tbl_name FROM sqlite_master WHERE tbl_name=$tablename LIMIT 1"); + if (!nucleus_mysql_num_rows($res)) return true; + $query='DROP TABLE '.$tablename; + } else if (strpos($uquery,'ALTER TABLE ')===0) { + $query=trim(substr($query,11)); + if ($i=strpos($query,' ')) { + $tablename=trim(substr($query,0,$i)); + $query=trim(substr($query,$i)); + require_once(dirname(__FILE__) . '/sqlitealtertable.php'); + $ret =sqlite_altertable($tablename,$query,$dbhandle); + if (!$ret) sqlite_ReturnWithError('SQL error',"
".nucleus_mysql_error()."
".htmlspecialchars($p1)."

\n".htmlspecialchars("ALTER TABLE $tablename $query")."
\n"); + return $ret; + } + // Else, syntax error + } else if (strpos($uquery,'RENAME TABLE ')===0) { + require_once(dirname(__FILE__) . '/sqlitealtertable.php'); + return sqlite_renametable(_sqlite_divideByChar(',',substr($query,13)),$dbhandle); + } else if (strpos($uquery,'INSERT INTO ')===0 || strpos($uquery,'REPLACE INTO ')===0 || + strpos($uquery,'INSERT IGNORE INTO ')===0 || strpos($uquery,'REPLACE IGNORE INTO ')===0) { + $buff=str_replace(' IGNORE ',' OR IGNORE ',substr($uquery,0,($i=strpos($uquery,' INTO ')+6))); + $query=trim(substr($query,$i)); + if ($i=strpos($query,' ')) { + $buff.=trim(substr($query,0,$i+1)); + $query=trim(substr($query,$i)); + } + if ($i=strpos($query,' ')) { + if (strpos(strtoupper($query),'SET')===0) { + $query=trim(substr($query,3)); + $commands=_sqlite_divideByChar(',',$query); + $query=' VALUES('; + $buff.=' ('; + foreach($commands as $key=>$value){ + //echo "[".htmlspecialchars($value)."]"; + if (0<$key) { + $buff.=', '; + $query.=', '; + } + if ($i=strpos($value,'=')) { + $buff.=trim(substr($value,0,$i)); + $query.=substr($value,$i+1); + } + } + $buff.=')'; + $query.=')'; + } else { + $beforevalues=''; + $commands=_sqlite_divideByChar(',',$query); + $query=''; + foreach($commands as $key=>$value){ + if ($beforevalues=='' && preg_match('/^(.*)\)\s+VALUES\s+\(/i',$value,$matches)) { + $beforevalues=$buff.' '.$query.$matches[1].')'; + } + if (0<$key) $query.=$beforevalues.' VALUES ';// supports multiple insertion + $query.=$value.';'; + } + } + } + $query=$buff.' '.$query; + } else if (strpos($uquery,'SHOW TABLES LIKE ')===0) { + $query='SELECT name FROM sqlite_master WHERE type=\'table\' AND name LIKE '.substr($query,17); + } else if (strpos($uquery,'SHOW TABLES')===0) { + $query='SELECT name FROM sqlite_master WHERE type=\'table\''; + } else if (strpos($uquery,'SHOW KEYS FROM ')===0) { + require_once(dirname(__FILE__) . '/sqlitealtertable.php'); + $query=sqlite_showKeysFrom(trim(substr($query,15)),$dbhandle); + } else if (strpos($uquery,'SHOW INDEX FROM ')===0) { + require_once(dirname(__FILE__) . '/sqlitealtertable.php'); + $query=sqlite_showKeysFrom(trim(substr($query,16)),$dbhandle); + } else if (strpos($uquery,'SHOW FIELDS FROM ')===0) { + require_once(dirname(__FILE__) . '/sqlitealtertable.php'); + $query=sqlite_showFieldsFrom(trim(substr($query,17)),$dbhandle); + } else if (strpos($uquery,'SHOW COLUMNS FROM ')===0) { + require_once(dirname(__FILE__) . '/sqlitealtertable.php'); + $query=sqlite_showFieldsFrom(trim(substr($query,18)),$dbhandle); + } else if (strpos($uquery,'TRUNCATE TABLE ')===0) { + $query='DELETE FROM '.substr($query,15); + } else if (preg_match('/^DESC \'([^\']+)\' \'([^\']+)\'$/',$query,$m)) { + return nucleus_mysql_query("SHOW FIELDS FROM '$m[1]' LIKE '$m[2]'"); + } else if (preg_match('/^DESC ([^\s]+) ([^\s]+)$/',$query,$m)) { + return nucleus_mysql_query("SHOW FIELDS FROM '$m[1]' LIKE '$m[2]'"); + } else SQLite_Functions::sqlite_modifyQueryForUserFunc($query,$strpositions); + + //Throw query again. + $aftertrans=time()+microtime(); + if ($unbuffered) { + $ret=sqlite_unbuffered_query($dbhandle,$query); + } else { + $ret=sqlite_query($dbhandle,$query); + } + + $afterquery=time()+microtime(); + if ($SQLITECONF['MEASURESPEED']) sqlite_DebugMessage("translated query:$query\n". + 'translation: '.($aftertrans-$beforetrans).'sec, query: '.($afterquery-$aftertrans).'sec'); + if (!$ret) sqlite_ReturnWithError('SQL error',"
".nucleus_mysql_error()."
".htmlspecialchars($p1)."

\n".htmlspecialchars($query)."
\n"); + foreach ($morequeries as $value) if ($value) @sqlite_query($dbhandle,$value); + return $ret; +} +function sqlite_changeQuote(&$query){ + // This function is most important. + // When you modify this function, do it very carefully. + // Otherwise, you may allow crackers to do SQL-injection. + // This function returns array that shows where the strings are. + $sarray=array(); + $ret=''; + $qlen=strlen($query); + for ($i=0;$i<$qlen;$i++) { + // Go to next quote + if (($i1=strpos($query,'"',$i))===false) $i1=$qlen; + if (($i2=strpos($query,"'",$i))===false) $i2=$qlen; + if (($i3=strpos($query,'`',$i))===false) $i3=$qlen; + if ($i1==$qlen && $i2==$qlen && $i3==$qlen) { + $temp=preg_replace('/[\s]+/',' ',substr($query,$i)); // Change all spacying to ' '. + $ret.=($temp); + if (strstr($temp,';')) exit('Warning: try to use more than two queries?'); + break; + } + if ($i2<($j=$i1)) $j=$i2; + if ($i3<$j) $j=$i3; + $temp=preg_replace('/[\s]+/',' ',substr($query,$i,$j-$i)); // Change all spacying to ' '. + $ret.=($temp); + $c=$query[($i=$j)]; // $c keeps the type of quote. + if (strstr($temp,';')) exit('Warning: try to use more than two queries?'); + + // Check between quotes. + // $j shows the begging positioin. + // $i will show the ending position. + $j=(++$i); + while ($i<$qlen) { + if (($i1=strpos($query,$c,$i))===false) $i1=$qlen; + if (($i2=strpos($query,"\\",$i))===false) $i2=$qlen; + if ($i2<$i1) { + // \something. Skip two characters. + $i=$i2+2; + continue; + } if ($i1<($qlen-1) && $query[$i1+1]==$c) { + // "", '' or ``. Skip two characters. + $i=$i1+2; + continue; + } else {// OK. Reached the end position + $i=$i1; + break; + } + } + $i1=strlen($ret); + $ret.="'".sqlite_changeslashes(substr($query,$j,$i-$j)); + if ($i<$qlen) $ret.="'"; //else Syntax error in query. + $i2=strlen($ret); + $sarray[$i1]=$i2; + }//echo htmlspecialchars($query).'
'.htmlspecialchars($ret).'
'; + $query=$ret; + return $sarray; +} +function sqlite_changeslashes(&$text){ + // By SQLite, "''" is used in the quoted string instead of "\'". + // In addition, only "'" seems to be allowed for perfect quotation of string. + // This routine is used for the conversion from MySQL type to SQL type. + // Do NOT use stripslashes() but use stripcslashes(). Otherwise, "\r\n" is not converted. + if ($text==='') return ''; + return (sqlite_escape_string (stripcslashes((string)$text))); +} +function _sqlite_divideByChar($char,$query,$limit=-1){ + if (!is_array($char)) $char=array($char); + $ret=array(); + $query=trim($query); + $buff=''; + while (strlen($query)){ + $i=strlen($query); + foreach($char as $value){ + if (($j=strpos($query,$value))!==false) { + if ($j<$i) $i=$j; + } + } + if (($j=strpos($query,'('))===false) $j=strlen($query); + if (($k=strpos($query,"'"))===false) $k=strlen($query); + if ($i<$j && $i<$k) {// ',' found + $buff.=substr($query,0,$i); + if (strlen($buff)) $ret[]=$buff; + $query=trim(substr($query,$i+1)); + $buff=''; + $limit--; + if ($limit==0) exit; + } else if ($j<$i && $j<$k) {// '(' found + if (($i=strpos($query,')',$j))===false) { + $buff.=$query; + if (strlen($buff)) $ret[]=$buff; + $query=$buff=''; + } else { + $buff.=substr($query,0,$i+1); + $query=substr($query,$i+1); + } + } else if ($k<$i && $k<$j) {// "'" found + if (($i=strpos($query,"'",$k+1))===false) { + $buff.=$query; + if (strlen($buff)) $ret[]=$buff; + $query=$buff=''; + } else { + $buff.=substr($query,0,$i+1); + $query=substr($query,$i+1); + } + } else {// last column + $buff.=$query; + if (strlen($buff)) $ret[]=$buff; + $query=$buff=''; + } + } + if (strlen($buff)) $ret[]=$buff; + return $ret; +} +function sqlite_mysql_query_debug(&$query){ + // There is nothing to do here in this version. + return $query; +} + +function nucleus_mysql_list_tables($p1=null,$p2=null) { + global $SQLITE_DBHANDLE,$MYSQL_DATABASE; + return sqlite_query($SQLITE_DBHANDLE,"SELECT name as Tables_in_$MYSQL_DATABASE FROM sqlite_master WHERE type='table'"); +} +function nucleus_mysql_listtables($p1=null,$p2=null) { return nucleus_mysql_list_tables($p1,$p2);} + +function nucleus_mysql_affected_rows($p1=null){ + global $SQLITE_DBHANDLE; + if (!($dbhandle=$p1)) $dbhandle=$SQLITE_DBHANDLE; + return sqlite_changes($dbhandle); +} + +function nucleus_mysql_error($p1=null){ + global $SQLITE_DBHANDLE; + if (!($dbhandle=$p1)) $dbhandle=$SQLITE_DBHANDLE; + return sqlite_error_string ( sqlite_last_error ($dbhandle) ); +} + +function nucleus_mysql_fetch_array($p1,$p2=SQLITE_BOTH){ + return sqlite_fetch_array ($p1,$p2); +} + +function nucleus_mysql_fetch_assoc($p1){ + return sqlite_fetch_array($p1,SQLITE_ASSOC); +} + +function nucleus_mysql_fetch_object($p1,$p2=SQLITE_BOTH){ + if (is_array($ret=sqlite_fetch_array ($p1,$p2))) { + $o=new SQLITE_OBJECT; + foreach ($ret as $key=>$value) { + if (strstr($key,'.')) {// Remove table name. + $key=preg_replace('/^(.+)\."(.+)"$/','"$2"',$key); + $key=preg_replace('/^(.+)\.([^.^"]+)$/','$2',$key); + } + $o->$key=$value; + } + return $o; + } else return false; +} + +function nucleus_mysql_fetch_row($p1){ + return sqlite_fetch_array($p1,SQLITE_NUM); +} + +function nucleus_mysql_field_name($p1,$p2){ + return sqlite_field_name ($p1,$p2); +} + +function nucleus_mysql_free_result($p1){ + // ???? Cannot find corresponding function of SQLite. + // Maybe SQLite is NOT used for the high spec server + // that need mysql_free_result() function because of + // many SQL-queries in a script. + return true; +} + +function nucleus_mysql_insert_id($p1=null){ + global $SQLITE_DBHANDLE; + if (!($dbhandle=$p1)) $dbhandle=$SQLITE_DBHANDLE; + return sqlite_last_insert_rowid ($dbhandle); +} + +function nucleus_mysql_num_fields($p1){ + return sqlite_num_fields ($p1); +} + +function nucleus_mysql_num_rows($p1){ + return sqlite_num_rows ($p1); +} +function nucleus_mysql_numrows($p1){ + return sqlite_num_rows ($p1); +} + +function nucleus_mysql_result($p1,$p2,$p3=null){ + if ($p3) return sqlite_ReturnWithError('nucleus_mysql_result'); + if (!$p2) return sqlite_fetch_single ($p1); + $a=sqlite_fetch_array ($p1); + return $a[$p2]; +} + +function nucleus_mysql_unbuffered_query($p1,$p2=null){ + return nucleus_mysql_query($p1,$p2,true); +} + +function nucleus_mysql_client_encoding($p1=null){ + return sqlite_libencoding(); +} + +function nucleus_mysql_data_seek($p1,$p2) { + return sqlite_seek($p1,$p2); +} + +function nucleus_mysql_errno ($p1=null){ + global $SQLITE_DBHANDLE; + if (!($dbhandle=$p1)) $dbhandle=$SQLITE_DBHANDLE; + return sqlite_last_error($dbhandle); +} + +function nucleus_mysql_escape_string ($p1){ + // The "'" will be changed to "''". + // This way works for both MySQL and SQLite when single quotes are used for string. + // Note that single quote is always used in this wrapper. + // If a plugin is made on SQLite-Nucleus and such plugin will be used for MySQL-Nucleus, + // nucleus_mysql_escape_string() will be changed to mysql_escape_string() and + // this routine won't be used, so this way won't be problem. + return sqlite_escape_string($p1); +} + +function nucleus_mysql_real_escape_string ($p1,$p2=null){ + //addslashes used here. + return addslashes($p1); +} + +function nucleus_mysql_create_db ($p1,$p2=null){ + // All prameters are ignored. + // Returns always true; + return true; +} + +function nucleus_mysql_pconnect($p1=null,$p2=null,$p3=null,$p4=null,$p5=null){ + global $SQLITE_DBHANDLE,$SQLITECONF; + sqlite_close ($SQLITE_DBHANDLE); + $SQLITE_DBHANDLE=sqlite_popen($SQLITECONF['DBFILENAME']); + return ($SQLITE['DBHANDLE']=$SQLITE_DBHANDLE); +} + +function nucleus_mysql_fetch_field($p1,$p2=null){ + if ($p2) return sqlite_ReturnWithError('nucleus_mysql_fetch_field'); + // Only 'name' is supported. + $o=new SQLITE_OBJECT; + $o->name=array(); + if(is_array($ret=sqlite_fetch_array ($p1,SQLITE_ASSOC ))) + foreach ($ret as $key=>$value) { + if (is_string($key)) array_push($o->name,$key); + } + return $o; + +} + +// This function is called instead of _execute_queries() in backp.php +function sqlite_restore_execute_queries(&$query){ + global $DIR_NUCLEUS,$DIR_LIBS,$DIR_PLUGINS,$CONF; + + // Skip until the first "#" or "--" + if (($i=strpos($query,"\n#"))===false) $i=strlen($query); + if (($j=strpos($query,"\n--"))===false) $j=strlen($query); + if ($i<$j) $query=substr($query,$i+1); + else $query=substr($query,$j+1); + + // Save the query to temporary file in sqlite directory. + if (function_exists('microtime')) { + $prefix=preg_replace('/[^0-9]/','',microtime()); + } else { + srand(time()); + $prefix=(string)rand(0,999999); + } + $tmpname=tempnam($DIR_NUCLEUS.'sqlite/',"tmp$prefix"); + if (!($handle=@fopen($tmpname,'w'))) return 'Cannot save temporary DB file.'; + fwrite($handle,$query); + fclose($handle); + $tmpname=preg_replace('/[\s\S]*?[\/\\\\]([^\/\\\\]+)$/','$1',$tmpname); + + // Read the option from NP_SQLite + if (!class_exists('NucleusPlugin')) { include($DIR_LIBS.'PLUGIN.php');} + if (!class_exists('NP_SQLite')) { include($DIR_PLUGINS.'NP_SQLite.php'); } + $p=new NP_SQLite(); + if (!($numatonce=@$p->getOption('numatonce'))) $numatonce=20; + if (!($refreshwait=@$p->getOption('refreshwait'))) $refreshwait=1; + + // Start process. + $url="plugins/sqlite/restore.php?dbfile=$tmpname&numatonce=$numatonce&refreshwait=$refreshwait"; + header('HTTP/1.0 301 Moved Permanently'); + header('Location: '.$url); + exit('Moved Permanently'); +} + +?> \ No newline at end of file