OSDN Git Service

Ver 0.9.0.4
authorkmorimatsu <kmorimatsu@1ca29b6e-896d-4ea0-84a5-967f57386b96>
Tue, 17 Mar 2009 02:02:41 +0000 (02:02 +0000)
committerkmorimatsu <kmorimatsu@1ca29b6e-896d-4ea0-84a5-967f57386b96>
Tue, 17 Mar 2009 02:02:41 +0000 (02:02 +0000)
Add mysql_server_info() and mysql_client_info() functions.

git-svn-id: https://svn.sourceforge.jp/svnroot/nucleus-jp/plugin@980 1ca29b6e-896d-4ea0-84a5-967f57386b96

sqlite/trunk/nucleus/sqlite/note.txt
sqlite/trunk/nucleus/sqlite/sqlite.php

index 6124138..1517224 100644 (file)
@@ -1,82 +1,86 @@
-
-  The licence of this script is GPL
-
-                ACKOWLEDGMENT
-
-  I thank all the people of Nucleus JP forum 
-  who discussed this project. Especially, I 
-  thank kosugiatkips, mekyo, and nakahara21 
-  for ideas of some part of code.
-  I also thank Jon Jensen for his generous
-  acceptance for using his PHP code in the
-  earlier version of this library.
-
-  The features that are supported by this library but not
-  generally by SQLite are as follows:
-
-  CREATE TABLE IF NOT EXISTS, auto_increment,
-  DROP TABLE IF EXISTS, ALTER TABLE,
-  RENAME TABLE, DESC,
-  INSERT INTO ... SET xx=xx, xx=xx,
-  REPLACE INTO ... SET xx=xx, xx=xx,
-  SHOW KEYS FROM, SHOW INDEX FROM,
-  SHOW FIELDS FROM, SHOW COLUMNS FROM,
-  CREATE TABLE ... KEYS xxx (xxx,xxx)
-  SHOW TABLES LIKE, TRUNCATE TABLE
-  SHOW TABLES
-
-
-  Following functions are available in SQL query.
-
-  CONCAT, IF, IFNULL, NULLIF, SUBSTRING, 
-  match() against(),
-  replace, UNIX_TIMESTAMP, REGEXP, DAYOFMONTH, MONTH, YEAR, 
-  ADDDATE, DATE_ADD, SUBDATE, DATE_SUB, FIND_IN_SET,
-  CURDATE, CURRENT_DATE, CURTIME, CURRENT_TIME, CURRENT_TIMESTAMP, 
-  LOCALTIME, LOCALTIMESTAMP, SYSDATE, DATE_FORMAT, TIME_FORMAT, 
-  DAYNAME, DAYOFWEEK, DAYOFYEAR, EXTRACT, FROM_DAYS, FROM_UNIXTIME,
-  HOUR, MINUTE, MONTH, MONTHNAME, PERIOD_ADD, PERIOD_DIFF, QUARTER,
-  SECOND, SEC_TO_TIME, SECOND, WEEK, WEEKDAY, YEAR, YEARWEEK,
-  FORMAT, INET_ATON, INET_NTOA, MD5,
-  ACOS, ASIN, ATAN, CEIL, CEILING, COS, COT, CRC32, DEGREES, 
-  EXP, FLOOR, GREATEST, MAX, LEAST, MIN, ln, log, log2, log10,
-  MOD, PI, POW, POWER, RADIANS, RAND, SIGN, SIN, SQRT, TAN,
-  ASCII, BIN, BIT_LENGTH, CHAR, CHAR_LENGTH, CONCAT_WS,
-  CONV, ELT, EXPORT_SET, FIELD, HEX, INSERT, LOCATE,
-  INSTR, LCASE, LOWER, LEFT, LENGTH, OCTET_LENGTH,
-  LOAD_FILE, LPAD, LTRIM, MAKE_SET, MID, SUBSTRING,
-  OCT, ORD, QUOTE, REPEAT, REVERSE, RIGHT, RPAD,
-  RTRIM, SOUNDEX, SPACE, SUBSTRING_INDEX, TRIM,
-  UCASE, UPPER,
-
-
- Release note:
-  Version 0.8.0
-    -This is the first established version and
-     exactly the same as ver 0.7.8b.
-
-  Version 0.8.1
-    -Execute "PRAGMA short_column_names=1" first.
-    -Avoid executing outside php file in some very specfic environment.
-    -Avoid executing multiple queries using ";" as delimer.
-    -Add check routine for the installed SQLite
-
-  Version 0.8.5
-    -Use SQLite_Functions class
-    -'PRAGMA synchronous = off;' when installing
-
-  Version 0.8.5.5
-    - ALTER TABLE syntaxes updated, bugs fixed
-
-  Version 0.8.6.0
-    - ALTER TABLE almost completery re-written
-    - DESC 'table' 'field' supported
-    - The function 'php' is unregestered from SQL query.
-
-  Version 0.9.0.1
-    - Support RENAME TABLE
-    - Some tunings are done to improve the speed.
-
-  Version 0.9.0.2
-    - Debug of CREATE TABLE routine.
-    - NP_SQLite: trim the query when 'Copy' is used.
+\r
+  The licence of this script is GPL\r
+\r
+                ACKOWLEDGMENT\r
+\r
+  I thank all the people of Nucleus JP forum \r
+  who discussed this project. Especially, I \r
+  thank kosugiatkips, mekyo, and nakahara21 \r
+  for ideas of some part of code.\r
+  I also thank Jon Jensen for his generous\r
+  acceptance for using his PHP code in the\r
+  earlier version of this library.\r
+\r
+  The features that are supported by this library but not\r
+  generally by SQLite are as follows:\r
+\r
+  CREATE TABLE IF NOT EXISTS, auto_increment,\r
+  DROP TABLE IF EXISTS, ALTER TABLE,\r
+  RENAME TABLE, DESC,\r
+  INSERT INTO ... SET xx=xx, xx=xx,\r
+  REPLACE INTO ... SET xx=xx, xx=xx,\r
+  SHOW KEYS FROM, SHOW INDEX FROM,\r
+  SHOW FIELDS FROM, SHOW COLUMNS FROM,\r
+  CREATE TABLE ... KEYS xxx (xxx,xxx)\r
+  SHOW TABLES LIKE, TRUNCATE TABLE\r
+  SHOW TABLES\r
+\r
+\r
+  Following functions are available in SQL query.\r
+\r
+  CONCAT, IF, IFNULL, NULLIF, SUBSTRING, \r
+  match() against(),\r
+  replace, UNIX_TIMESTAMP, REGEXP, DAYOFMONTH, MONTH, YEAR, \r
+  ADDDATE, DATE_ADD, SUBDATE, DATE_SUB, FIND_IN_SET,\r
+  CURDATE, CURRENT_DATE, CURTIME, CURRENT_TIME, CURRENT_TIMESTAMP, \r
+  LOCALTIME, LOCALTIMESTAMP, SYSDATE, DATE_FORMAT, TIME_FORMAT, \r
+  DAYNAME, DAYOFWEEK, DAYOFYEAR, EXTRACT, FROM_DAYS, FROM_UNIXTIME,\r
+  HOUR, MINUTE, MONTH, MONTHNAME, PERIOD_ADD, PERIOD_DIFF, QUARTER,\r
+  SECOND, SEC_TO_TIME, SECOND, WEEK, WEEKDAY, YEAR, YEARWEEK,\r
+  FORMAT, INET_ATON, INET_NTOA, MD5,\r
+  ACOS, ASIN, ATAN, CEIL, CEILING, COS, COT, CRC32, DEGREES, \r
+  EXP, FLOOR, GREATEST, MAX, LEAST, MIN, ln, log, log2, log10,\r
+  MOD, PI, POW, POWER, RADIANS, RAND, SIGN, SIN, SQRT, TAN,\r
+  ASCII, BIN, BIT_LENGTH, CHAR, CHAR_LENGTH, CONCAT_WS,\r
+  CONV, ELT, EXPORT_SET, FIELD, HEX, INSERT, LOCATE,\r
+  INSTR, LCASE, LOWER, LEFT, LENGTH, OCTET_LENGTH,\r
+  LOAD_FILE, LPAD, LTRIM, MAKE_SET, MID, SUBSTRING,\r
+  OCT, ORD, QUOTE, REPEAT, REVERSE, RIGHT, RPAD,\r
+  RTRIM, SOUNDEX, SPACE, SUBSTRING_INDEX, TRIM,\r
+  UCASE, UPPER,\r
+\r
+\r
+ Release note:\r
+  Version 0.8.0\r
+    -This is the first established version and\r
+     exactly the same as ver 0.7.8b.\r
+\r
+  Version 0.8.1\r
+    -Execute "PRAGMA short_column_names=1" first.\r
+    -Avoid executing outside php file in some very specfic environment.\r
+    -Avoid executing multiple queries using ";" as delimer.\r
+    -Add check routine for the installed SQLite\r
+\r
+  Version 0.8.5\r
+    -Use SQLite_Functions class\r
+    -'PRAGMA synchronous = off;' when installing\r
+\r
+  Version 0.8.5.5\r
+    - ALTER TABLE syntaxes updated, bugs fixed\r
+\r
+  Version 0.8.6.0\r
+    - ALTER TABLE almost completery re-written\r
+    - DESC 'table' 'field' supported\r
+    - The function 'php' is unregestered from SQL query.\r
+\r
+  Version 0.9.0.1\r
+    - Support RENAME TABLE\r
+    - Some tunings are done to improve the speed.\r
+\r
+  Version 0.9.0.2\r
+    - Debug of CREATE TABLE routine.\r
+    - NP_SQLite: trim the query when 'Copy' is used.\r
+\r
+  Version 0.9.0.4\r
+    - Debug of REGEX function\r
+    - Add mysql_server_info() and mysql_client_info() functions.\r
index 09a9863..271bdb9 100644 (file)
-<?php
-    /****************************************
-    * SQLite-MySQL wrapper for Nucleus      *
-    *                           ver 0.9.0.3 *
-    * Written by Katsumi                    *
-    ****************************************/
-
-// Check SQLite installed
-
-if (!function_exists('sqlite_open')) exit('Sorry, SQLite is not available from PHP (maybe, not installed in the server).');
-
-// Initializiation stuff
-require_once dirname(__FILE__) . '/sqliteconfig.php';
-$SQLITE_DBHANDLE=sqlite_open($SQLITECONF['DBFILENAME']);
-require_once dirname(__FILE__) . '/sqlitequeryfunctions.php';
-$SQLITECONF['VERSION']='0.9.0.3';
-
-//Following thing may work if MySQL is NOT installed in server.
-if (!function_exists('mysql_query')) {
-       define ("MYSQL_ASSOC", SQLITE_ASSOC);
-       define ("MYSQL_BOTH", SQLITE_BOTH);
-       define ("MYSQL_NUM", SQLITE_NUM);
-       function mysql_connect(){
-               global $SQLITECONF;
-               $SQLITECONF['OVERRIDEMODE']=true;
-               $args=func_get_args();
-               return call_user_func_array('nucleus_mysql_connect',$args);
-       }
-       foreach (array('mysql_affected_rows','mysql_change_user','mysql_client_encoding','mysql_close',
-               'mysql_create_db','mysql_data_seek','mysql_db_name','mysql_db_query','mysql_drop_db','mysql_errno',
-               'mysql_error','mysql_escape_string','mysql_fetch_array','mysql_fetch_assoc','mysql_fetch_field','mysql_fetch_lengths',
-               'mysql_fetch_object','mysql_fetch_row','mysql_field_flags','mysql_field_len','mysql_field_name','mysql_field_seek',
-               'mysql_field_table','mysql_field_type','mysql_free_result','mysql_get_client_info','mysql_get_host_info',
-               'mysql_get_proto_info','mysql_get_server_info','mysql_info','mysql_insert_id','mysql_list_dbs',
-               'mysql_list_fields','mysql_list_processes','mysql_list_tables','mysql_num_fields','mysql_num_rows','mysql_numrows',
-               'mysql_pconnect','mysql_ping','mysql_query','mysql_real_escape_string','mysql_result','mysql_select_db',
-               'mysql_stat','mysql_tablename','mysql_thread_id','mysql_unbuffered_query')
-                as $value) eval(
-               "function $value(){\n".
-               "  \$args=func_get_args();\n".
-               "  return call_user_func_array('nucleus_$value',\$args);\n".
-               "}\n");
-}
-
-// Empty object for mysql_fetch_object().
-class SQLITE_OBJECT {}
-
-function sqlite_ReturnWithError($text='Not supported',$more=''){
-       // Show warning when error_reporting() is set.
-       if (!(error_reporting() & E_WARNING)) return false;
-       
-       // Seek the file and line that originally called sql function.
-       $a=debug_backtrace();
-       foreach($a as $key=>$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<!--$tempfile line:$templine-->\n";
-       }
-       echo "Warning from SQLite-MySQL wrapper: $text<br />\n";
-       if ($line && $file) echo "in <b>$file</b> on line <b>$line</b><br />\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 '<!--sqlite_DebugMessage'.$SQLITECONF['DEBUGMESSAGE'].'sqlite_DebugMessage-->';
-               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)."<br />\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 "<br />".htmlspecialchars($p1)."<br /><br />\n".htmlspecialchars($query)."<hr />\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)."<br />\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',"<br /><i>".nucleus_mysql_error()."</i><br />".htmlspecialchars($p1)."<br /><br />\n".htmlspecialchars("ALTER TABLE $tablename $query")."<hr />\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',"<br /><i>".nucleus_mysql_error()."</i><br />".htmlspecialchars($p1)."<br /><br />\n".htmlspecialchars($query)."<hr />\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).'<br />'.htmlspecialchars($ret).'<br />';
-       $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('<html><body>Moved Permanently</body></html>');
-}
-
+<?php\r
+    /****************************************\r
+    * SQLite-MySQL wrapper for Nucleus      *\r
+    *                           ver 0.9.0.4 *\r
+    * Written by Katsumi                    *\r
+    ****************************************/\r
+\r
+// Check SQLite installed\r
+\r
+if (!function_exists('sqlite_open')) exit('Sorry, SQLite is not available from PHP (maybe, not installed in the server).');\r
+\r
+// Initializiation stuff\r
+require_once dirname(__FILE__) . '/sqliteconfig.php';\r
+$SQLITE_DBHANDLE=sqlite_open($SQLITECONF['DBFILENAME']);\r
+require_once dirname(__FILE__) . '/sqlitequeryfunctions.php';\r
+$SQLITECONF['VERSION']='0.9.0.4';\r
+\r
+//Following thing may work if MySQL is NOT installed in server.\r
+if (!function_exists('mysql_query')) {\r
+       define ("MYSQL_ASSOC", SQLITE_ASSOC);\r
+       define ("MYSQL_BOTH", SQLITE_BOTH);\r
+       define ("MYSQL_NUM", SQLITE_NUM);\r
+       function mysql_connect(){\r
+               global $SQLITECONF;\r
+               $SQLITECONF['OVERRIDEMODE']=true;\r
+               $args=func_get_args();\r
+               return call_user_func_array('nucleus_mysql_connect',$args);\r
+       }\r
+       foreach (array('mysql_affected_rows','mysql_change_user','mysql_client_encoding','mysql_close',\r
+               'mysql_create_db','mysql_data_seek','mysql_db_name','mysql_db_query','mysql_drop_db','mysql_errno',\r
+               'mysql_error','mysql_escape_string','mysql_fetch_array','mysql_fetch_assoc','mysql_fetch_field','mysql_fetch_lengths',\r
+               'mysql_fetch_object','mysql_fetch_row','mysql_field_flags','mysql_field_len','mysql_field_name','mysql_field_seek',\r
+               'mysql_field_table','mysql_field_type','mysql_free_result','mysql_get_client_info','mysql_get_host_info',\r
+               'mysql_get_proto_info','mysql_get_server_info','mysql_info','mysql_insert_id','mysql_list_dbs',\r
+               'mysql_list_fields','mysql_list_processes','mysql_list_tables','mysql_num_fields','mysql_num_rows','mysql_numrows',\r
+               'mysql_pconnect','mysql_ping','mysql_query','mysql_real_escape_string','mysql_result','mysql_select_db',\r
+               'mysql_stat','mysql_tablename','mysql_thread_id','mysql_unbuffered_query')\r
+                as $value) eval(\r
+               "function $value(){\n".\r
+               "  \$args=func_get_args();\n".\r
+               "  return call_user_func_array('nucleus_$value',\$args);\n".\r
+               "}\n");\r
+}\r
+\r
+// Empty object for mysql_fetch_object().\r
+class SQLITE_OBJECT {}\r
+\r
+function sqlite_ReturnWithError($text='Not supported',$more=''){\r
+       // Show warning when error_reporting() is set.\r
+       if (!(error_reporting() & E_WARNING)) return false;\r
+       \r
+       // Seek the file and line that originally called sql function.\r
+       $a=debug_backtrace();\r
+       foreach($a as $key=>$btrace) {\r
+               if (!($templine=$btrace['line'])) continue;\r
+               if (!($tempfile=$btrace['file'])) continue;\r
+               $file=str_replace('\\','/',$file);\r
+               if (!$line && !$file && strpos($tempfile,'/sqlite.php')===false && strpos($tempfile,'/sqlitequeryfunctions.php')===false) {\r
+                       $line=$templine;\r
+                       $file=$tempfile;\r
+               }\r
+               echo "\n<!--$tempfile line:$templine-->\n";\r
+       }\r
+       echo "Warning from SQLite-MySQL wrapper: $text<br />\n";\r
+       if ($line && $file) echo "in <b>$file</b> on line <b>$line</b><br />\n";\r
+       echo $more;\r
+       return false;\r
+}\r
+function sqlite_DebugMessage($text=''){\r
+       global $SQLITECONF;\r
+       if (!$SQLITECONF['DEBUGREPORT']) return;\r
+       if ($text) $SQLITECONF['DEBUGMESSAGE'].="\n".$text."\n";\r
+       if (headers_sent()) {\r
+               echo '<!--sqlite_DebugMessage'.$SQLITECONF['DEBUGMESSAGE'].'sqlite_DebugMessage-->';\r
+               unset($SQLITECONF['DEBUGMESSAGE']);\r
+       }\r
+}\r
+\r
+// nucleus_mysql_XXXX() functions follow.\r
+\r
+function nucleus_mysql_connect($p1=null,$p2=null,$p3=null,$p4=null,$p5=null){\r
+       // All prameters are ignored.\r
+       global $SQLITE_DBHANDLE,$SQLITECONF;\r
+       if (!$SQLITE_DBHANDLE) $SQLITE_DBHANDLE=sqlite_open($SQLITECONF['DBFILENAME']);\r
+       // Initialization queries.\r
+       foreach($SQLITECONF['INITIALIZE'] as $value) nucleus_mysql_query($value);\r
+       // Unregister the function 'php' in sql query.\r
+       sqlite_create_function($SQLITE_DBHANDLE,'php','pi');\r
+       return $SQLITE_DBHANDLE;\r
+}\r
+\r
+function nucleus_mysql_close($p1=null){\r
+       global $SQLITE_DBHANDLE;\r
+       if (!($dbhandle=$p1)) $dbhandle=$SQLITE_DBHANDLE;\r
+       $SQLITE_DBHANDLE='';\r
+       return sqlite_close ($dbhandle);\r
+}\r
+\r
+function nucleus_mysql_select_db($p1,$p2=null){\r
+       // SQLite does not support multiple databases in a file.\r
+       // So this function do nothing and always returns true.\r
+       // Note: mysql_select_db() function returns true/false,\r
+       // not link-ID.\r
+       return true;\r
+}\r
+\r
+function nucleus_mysql_query($p1,$p2=null,$unbuffered=false){//echo htmlspecialchars($p1)."<br />\n";\r
+       global $SQLITE_DBHANDLE,$SQLITECONF;\r
+       if (!($dbhandle=$p2)) $dbhandle=$SQLITE_DBHANDLE;\r
+       $query=trim($p1);\r
+       if (strpos($query,"\xEF\xBB\xBF")===0) $query=substr($query,3);// UTF-8 stuff\r
+       if (substr($query,-1)==';') $query=substr($query,0,strlen($query)-1);\r
+       \r
+       // Escape style is changed from MySQL type to SQLite type here.\r
+       // This is important to avoid possible SQL-injection.\r
+       $strpositions=array();// contains the data show where the strings are (startposition => endposition)\r
+       if (strpos($query,'`')!==false || strpos($query,'"')!==false || strpos($query,"'")!==false)\r
+               $strpositions=sqlite_changeQuote($query);\r
+       //echo "<br />".htmlspecialchars($p1)."<br /><br />\n".htmlspecialchars($query)."<hr />\n";\r
+\r
+       // Debug mode\r
+       if ($SQLITECONF['DEBUGMODE']) $query=sqlite_mysql_query_debug($query);\r
+       \r
+       // Anyway try it.\r
+       if ($unbuffered) {\r
+               if ($ret=@sqlite_unbuffered_query($dbhandle,$query)) return $ret;\r
+       } else {\r
+               if ($ret=@sqlite_query($dbhandle,$query)) return $ret;\r
+       }\r
+       \r
+       // Error occured. Query must be translated.\r
+       return sqlite_mysql_query_sub($dbhandle,$query,$strpositions,$p1,$unbuffered);\r
+}\r
+function sqlite_mysql_query_sub($dbhandle,$query,$strpositions=array(),$p1=null,$unbuffered=false){//echo htmlspecialchars($p1)."<br />\n";\r
+       // Query translation is needed, especially when changing the data in database.\r
+       // So far, this routine is written for 'CREATE TABLE','DROP TABLE', 'INSERT INTO',\r
+       // 'SHOW TABLES LIKE', 'SHOW KEYS FROM', 'SHOW INDEX FROM'\r
+       // and several functions used in query.\r
+       // How about 'UPDATE' ???\r
+       global $SQLITE_DBHANDLE,$SQLITECONF;\r
+       $beforetrans=time()+microtime();\r
+       if (!$p1) $p1=$query;\r
+       $morequeries=array();\r
+       $temptable=false;\r
+       $uquery=strtoupper($query);\r
+       if (strpos($uquery,'CREATE TABLE')===0 || ($temptable=(strpos($uquery,'CREATE TEMPORARY TABLE')===0))) {\r
+               if (!($i=strpos($query,'('))) return sqlite_ReturnWithError('nucleus_mysql_query: '.$p1);\r
+               //check if the command is 'CREATE TABLE IF NOT EXISTS'\r
+               if (strpos(strtoupper($uquery),'CREATE TABLE IF NOT EXISTS')===0) {\r
+                       $tablename=trim(substr($query,26,$i-26));\r
+                       if (substr($tablename,0,1)!="'") $tablename="'$tablename'";\r
+                       $res=sqlite_query($dbhandle,"SELECT tbl_name FROM sqlite_master WHERE tbl_name=$tablename LIMIT 1");\r
+                       if (nucleus_mysql_num_rows($res)) return true;\r
+               } else {\r
+                       $tablename=trim(substr($query,12,$i-12));\r
+                       if (substr($tablename,0,1)!="'") $tablename="'$tablename'";\r
+               }\r
+               $query=trim(substr($query,$i+1));\r
+               for ($i=strlen($query);0<$i;$i--) if ($query[$i]==')') break;\r
+               $query=substr($query,0,$i);\r
+               $commands=_sqlite_divideByChar(',',$query);\r
+               require_once(dirname(__FILE__) . '/sqlitealtertable.php');\r
+               $query=sqlite_createtable_query($commands,$tablename,$temptable,$morequeries);\r
+       } else if (strpos($uquery,'DROP TABLE IF EXISTS')===0) {\r
+               if (!($i=strpos($query,';'))) $i=strlen($query);\r
+               $tablename=trim(substr($query,20,$i-20));\r
+               if (substr($tablename,0,1)!="'") $tablename="'$tablename'";\r
+               $res=sqlite_query($dbhandle,"SELECT tbl_name FROM sqlite_master WHERE tbl_name=$tablename LIMIT 1");\r
+               if (!nucleus_mysql_num_rows($res)) return true;\r
+               $query='DROP TABLE '.$tablename;\r
+       } else if (strpos($uquery,'ALTER TABLE ')===0) {\r
+               $query=trim(substr($query,11));\r
+               if ($i=strpos($query,' ')) {\r
+                       $tablename=trim(substr($query,0,$i));\r
+                       $query=trim(substr($query,$i));\r
+                       require_once(dirname(__FILE__) . '/sqlitealtertable.php');\r
+                       $ret =sqlite_altertable($tablename,$query,$dbhandle);\r
+                       if (!$ret) sqlite_ReturnWithError('SQL error',"<br /><i>".nucleus_mysql_error()."</i><br />".htmlspecialchars($p1)."<br /><br />\n".htmlspecialchars("ALTER TABLE $tablename $query")."<hr />\n");\r
+                       return $ret;\r
+               }\r
+               // Else, syntax error\r
+       } else if (strpos($uquery,'RENAME TABLE ')===0) {\r
+               require_once(dirname(__FILE__) . '/sqlitealtertable.php');\r
+               return sqlite_renametable(_sqlite_divideByChar(',',substr($query,13)),$dbhandle);\r
+       } else if (strpos($uquery,'INSERT INTO ')===0 || strpos($uquery,'REPLACE INTO ')===0 ||\r
+                       strpos($uquery,'INSERT IGNORE INTO ')===0 || strpos($uquery,'REPLACE IGNORE INTO ')===0) {\r
+               $buff=str_replace(' IGNORE ',' OR IGNORE ',substr($uquery,0,($i=strpos($uquery,' INTO ')+6)));\r
+               $query=trim(substr($query,$i));\r
+               if ($i=strpos($query,' ')) {\r
+                       $buff.=trim(substr($query,0,$i+1));\r
+                       $query=trim(substr($query,$i));\r
+               }\r
+               if ($i=strpos($query,' ')) {\r
+                       if (strpos(strtoupper($query),'SET')===0) {\r
+                               $query=trim(substr($query,3));\r
+                               $commands=_sqlite_divideByChar(',',$query);\r
+                               $query=' VALUES(';\r
+                               $buff.=' (';\r
+                               foreach($commands as $key=>$value){\r
+                                       //echo "[".htmlspecialchars($value)."]";\r
+                                       if (0<$key) {\r
+                                               $buff.=', ';\r
+                                               $query.=', ';\r
+                                       }\r
+                                       if ($i=strpos($value,'=')) {\r
+                                               $buff.=trim(substr($value,0,$i));\r
+                                               $query.=substr($value,$i+1);\r
+                                       }\r
+                               }\r
+                               $buff.=')';\r
+                               $query.=')';\r
+                       } else {\r
+                               $beforevalues='';\r
+                               $commands=_sqlite_divideByChar(',',$query);\r
+                               $query='';\r
+                               foreach($commands as $key=>$value){\r
+                                       if ($beforevalues=='' && preg_match('/^(.*)\)\s+VALUES\s+\(/i',$value,$matches)) {\r
+                                               $beforevalues=$buff.' '.$query.$matches[1].')';\r
+                                       }\r
+                                       if (0<$key) $query.=$beforevalues.' VALUES ';// supports multiple insertion\r
+                                       $query.=$value.';';\r
+                               }\r
+                       }\r
+               }\r
+               $query=$buff.' '.$query;\r
+       } else if (strpos($uquery,'SHOW TABLES LIKE ')===0) {\r
+               $query='SELECT name FROM sqlite_master WHERE type=\'table\' AND name LIKE '.substr($query,17);\r
+       } else if (strpos($uquery,'SHOW TABLES')===0) {\r
+               $query='SELECT name FROM sqlite_master WHERE type=\'table\'';\r
+       } else if (strpos($uquery,'SHOW KEYS FROM ')===0) {\r
+               require_once(dirname(__FILE__) . '/sqlitealtertable.php');\r
+               $query=sqlite_showKeysFrom(trim(substr($query,15)),$dbhandle);\r
+       } else if (strpos($uquery,'SHOW INDEX FROM ')===0) {\r
+               require_once(dirname(__FILE__) . '/sqlitealtertable.php');\r
+               $query=sqlite_showKeysFrom(trim(substr($query,16)),$dbhandle);\r
+       } else if (strpos($uquery,'SHOW FIELDS FROM ')===0) {\r
+               require_once(dirname(__FILE__) . '/sqlitealtertable.php');\r
+               $query=sqlite_showFieldsFrom(trim(substr($query,17)),$dbhandle);\r
+       } else if (strpos($uquery,'SHOW COLUMNS FROM ')===0) {\r
+               require_once(dirname(__FILE__) . '/sqlitealtertable.php');\r
+               $query=sqlite_showFieldsFrom(trim(substr($query,18)),$dbhandle);\r
+       } else if (strpos($uquery,'TRUNCATE TABLE ')===0) {\r
+               $query='DELETE FROM '.substr($query,15);\r
+       } else if (preg_match('/^DESC \'([^\']+)\' \'([^\']+)\'$/',$query,$m)) {\r
+               return nucleus_mysql_query("SHOW FIELDS FROM '$m[1]' LIKE '$m[2]'");\r
+       } else if (preg_match('/^DESC ([^\s]+) ([^\s]+)$/',$query,$m)) {\r
+               return nucleus_mysql_query("SHOW FIELDS FROM '$m[1]' LIKE '$m[2]'");\r
+       } else SQLite_Functions::sqlite_modifyQueryForUserFunc($query,$strpositions);\r
+\r
+       //Throw query again.\r
+       $aftertrans=time()+microtime();\r
+       if ($unbuffered) {\r
+               $ret=sqlite_unbuffered_query($dbhandle,$query);\r
+       } else {\r
+               $ret=sqlite_query($dbhandle,$query);\r
+       }\r
+\r
+       $afterquery=time()+microtime();\r
+       if ($SQLITECONF['MEASURESPEED']) sqlite_DebugMessage("translated query:$query\n".\r
+               'translation: '.($aftertrans-$beforetrans).'sec, query: '.($afterquery-$aftertrans).'sec');\r
+       if (!$ret) sqlite_ReturnWithError('SQL error',"<br /><i>".nucleus_mysql_error()."</i><br />".htmlspecialchars($p1)."<br /><br />\n".htmlspecialchars($query)."<hr />\n");\r
+       foreach ($morequeries as $value) if ($value) @sqlite_query($dbhandle,$value);\r
+       return $ret;\r
+}\r
+function sqlite_changeQuote(&$query){\r
+       // This function is most important.\r
+       // When you modify this function, do it very carefully.\r
+       // Otherwise, you may allow crackers to do SQL-injection.\r
+       // This function returns array that shows where the strings are.\r
+       $sarray=array();\r
+       $ret='';\r
+       $qlen=strlen($query);\r
+       for ($i=0;$i<$qlen;$i++) {\r
+               // Go to next quote\r
+               if (($i1=strpos($query,'"',$i))===false) $i1=$qlen;\r
+               if (($i2=strpos($query,"'",$i))===false) $i2=$qlen;\r
+               if (($i3=strpos($query,'`',$i))===false) $i3=$qlen;\r
+               if ($i1==$qlen && $i2==$qlen && $i3==$qlen) {\r
+                       $temp=preg_replace('/[\s]+/',' ',substr($query,$i)); // Change all spacying to ' '.\r
+                       $ret.=($temp);\r
+                       if (strstr($temp,';')) exit('Warning: try to use more than two queries?');\r
+                       break;\r
+               }\r
+               if ($i2<($j=$i1)) $j=$i2;\r
+               if ($i3<$j) $j=$i3;\r
+               $temp=preg_replace('/[\s]+/',' ',substr($query,$i,$j-$i)); // Change all spacying to ' '.\r
+               $ret.=($temp);\r
+               $c=$query[($i=$j)]; // $c keeps the type of quote.\r
+               if (strstr($temp,';')) exit('Warning: try to use more than two queries?');\r
+               \r
+               // Check between quotes.\r
+               // $j shows the begging positioin.\r
+               // $i will show the ending position.\r
+               $j=(++$i);\r
+               while ($i<$qlen) {\r
+                       if (($i1=strpos($query,$c,$i))===false) $i1=$qlen;\r
+                       if (($i2=strpos($query,"\\",$i))===false) $i2=$qlen;\r
+                       if ($i2<$i1) {\r
+                               // \something. Skip two characters.\r
+                               $i=$i2+2;\r
+                               continue;\r
+                       } if ($i1<($qlen-1) && $query[$i1+1]==$c) {\r
+                               // "", '' or ``.  Skip two characters.\r
+                               $i=$i1+2;\r
+                               continue;\r
+                       } else {// OK. Reached the end position\r
+                               $i=$i1;\r
+                               break;\r
+                       }\r
+               }\r
+               $i1=strlen($ret);\r
+               $ret.="'".sqlite_changeslashes(substr($query,$j,$i-$j));\r
+               if ($i<$qlen) $ret.="'"; //else Syntax error in query.\r
+               $i2=strlen($ret);\r
+               $sarray[$i1]=$i2;\r
+       }//echo htmlspecialchars($query).'<br />'.htmlspecialchars($ret).'<br />';\r
+       $query=$ret;\r
+       return $sarray;\r
+}\r
+function sqlite_changeslashes(&$text){\r
+       // By SQLite, "''" is used in the quoted string instead of "\'".\r
+       // In addition, only "'" seems to be allowed for perfect quotation of string.\r
+       // This routine is used for the conversion from MySQL type to SQL type.\r
+       // Do NOT use stripslashes() but use stripcslashes().  Otherwise, "\r\n" is not converted.\r
+       if ($text==='') return '';\r
+       return (sqlite_escape_string (stripcslashes((string)$text)));\r
+}\r
+function _sqlite_divideByChar($char,$query,$limit=-1){\r
+       if (!is_array($char)) $char=array($char);\r
+       $ret=array();\r
+       $query=trim($query);\r
+       $buff='';\r
+       while (strlen($query)){\r
+               $i=strlen($query);\r
+               foreach($char as $value){\r
+                       if (($j=strpos($query,$value))!==false) {\r
+                               if ($j<$i) $i=$j;\r
+                       }\r
+               }\r
+               if (($j=strpos($query,'('))===false) $j=strlen($query);\r
+               if (($k=strpos($query,"'"))===false) $k=strlen($query);\r
+               if ($i<$j && $i<$k) {// ',' found\r
+                       $buff.=substr($query,0,$i);\r
+                       if (strlen($buff)) $ret[]=$buff;\r
+                       $query=trim(substr($query,$i+1));\r
+                       $buff='';\r
+                       $limit--;\r
+                       if ($limit==0) exit;\r
+               } else if ($j<$i && $j<$k) {// '(' found\r
+                       if (($i=strpos($query,')',$j))===false) {\r
+                               $buff.=$query;\r
+                               if (strlen($buff)) $ret[]=$buff;\r
+                               $query=$buff='';\r
+                       } else {\r
+                               $buff.=substr($query,0,$i+1);\r
+                               $query=substr($query,$i+1);\r
+                       }\r
+               } else if ($k<$i && $k<$j) {// "'" found\r
+                       if (($i=strpos($query,"'",$k+1))===false) {\r
+                               $buff.=$query;\r
+                               if (strlen($buff)) $ret[]=$buff;\r
+                               $query=$buff='';\r
+                       } else {\r
+                               $buff.=substr($query,0,$i+1);\r
+                               $query=substr($query,$i+1);\r
+                       }\r
+               } else {// last column\r
+                       $buff.=$query;\r
+                       if (strlen($buff)) $ret[]=$buff;\r
+                       $query=$buff='';\r
+               }\r
+       }\r
+       if (strlen($buff)) $ret[]=$buff;\r
+       return $ret;\r
+}\r
+function sqlite_mysql_query_debug(&$query){\r
+       // There is nothing to do here in this version.\r
+       return $query;\r
+}\r
+\r
+function nucleus_mysql_list_tables($p1=null,$p2=null) {\r
+       global $SQLITE_DBHANDLE,$MYSQL_DATABASE;\r
+       return sqlite_query($SQLITE_DBHANDLE,"SELECT name as Tables_in_$MYSQL_DATABASE FROM sqlite_master WHERE type='table'");\r
+}\r
+function nucleus_mysql_listtables($p1=null,$p2=null) { return nucleus_mysql_list_tables($p1,$p2);}\r
+\r
+function nucleus_mysql_affected_rows($p1=null){\r
+       global $SQLITE_DBHANDLE;\r
+       if (!($dbhandle=$p1)) $dbhandle=$SQLITE_DBHANDLE;\r
+       return sqlite_changes($dbhandle);\r
+}\r
+\r
+function nucleus_mysql_error($p1=null){\r
+       global $SQLITE_DBHANDLE;\r
+       if (!($dbhandle=$p1)) $dbhandle=$SQLITE_DBHANDLE;\r
+       return sqlite_error_string ( sqlite_last_error ($dbhandle) );\r
+}\r
+\r
+function nucleus_mysql_fetch_array($p1,$p2=SQLITE_BOTH){\r
+       return sqlite_fetch_array ($p1,$p2);\r
+}\r
+\r
+function nucleus_mysql_fetch_assoc($p1){\r
+       return sqlite_fetch_array($p1,SQLITE_ASSOC);\r
+}\r
+\r
+function nucleus_mysql_fetch_object($p1,$p2=SQLITE_BOTH){\r
+       if (is_array($ret=sqlite_fetch_array ($p1,$p2))) {\r
+               $o=new SQLITE_OBJECT;\r
+               foreach ($ret as $key=>$value) {\r
+                       if (strstr($key,'.')) {// Remove table name.\r
+                               $key=preg_replace('/^(.+)\."(.+)"$/','"$2"',$key);\r
+                               $key=preg_replace('/^(.+)\.([^.^"]+)$/','$2',$key);\r
+                       }\r
+                       $o->$key=$value;\r
+               }\r
+               return $o;\r
+       } else return false;\r
+}\r
+\r
+function nucleus_mysql_fetch_row($p1){\r
+       return sqlite_fetch_array($p1,SQLITE_NUM);\r
+}\r
+\r
+function nucleus_mysql_field_name($p1,$p2){\r
+       return sqlite_field_name ($p1,$p2);\r
+}\r
+\r
+function nucleus_mysql_free_result($p1){\r
+       // ???? Cannot find corresponding function of SQLite.\r
+       // Maybe SQLite is NOT used for the high spec server\r
+       // that need mysql_free_result() function because of\r
+       // many SQL-queries in a script.\r
+       return true;\r
+}\r
+\r
+function nucleus_mysql_insert_id($p1=null){\r
+       global $SQLITE_DBHANDLE;\r
+       if (!($dbhandle=$p1)) $dbhandle=$SQLITE_DBHANDLE;\r
+       return sqlite_last_insert_rowid ($dbhandle);\r
+}\r
+\r
+function nucleus_mysql_num_fields($p1){\r
+       return sqlite_num_fields ($p1);\r
+}\r
+\r
+function nucleus_mysql_num_rows($p1){\r
+       return sqlite_num_rows ($p1);\r
+}\r
+function nucleus_mysql_numrows($p1){\r
+       return sqlite_num_rows ($p1);\r
+}\r
+\r
+function nucleus_mysql_result($p1,$p2,$p3=null){\r
+       if ($p3) return sqlite_ReturnWithError('nucleus_mysql_result');\r
+       if (!$p2) return sqlite_fetch_single ($p1);\r
+       $a=sqlite_fetch_array ($p1);\r
+       return $a[$p2];\r
+}\r
+\r
+function nucleus_mysql_unbuffered_query($p1,$p2=null){\r
+       return nucleus_mysql_query($p1,$p2,true);\r
+}\r
+\r
+function nucleus_mysql_client_encoding($p1=null){\r
+       return sqlite_libencoding();\r
+}\r
+\r
+function nucleus_mysql_data_seek($p1,$p2) {\r
+       return sqlite_seek($p1,$p2);\r
+}\r
+\r
+function nucleus_mysql_errno ($p1=null){\r
+       global $SQLITE_DBHANDLE;\r
+       if (!($dbhandle=$p1)) $dbhandle=$SQLITE_DBHANDLE;\r
+       return sqlite_last_error($dbhandle);\r
+}\r
+\r
+function nucleus_mysql_escape_string ($p1){\r
+       // The "'" will be changed to "''".\r
+       // This way works for both MySQL and SQLite when single quotes are used for string.\r
+       // Note that single quote is always used in this wrapper.\r
+       // If a plugin is made on SQLite-Nucleus and such plugin will be used for MySQL-Nucleus,\r
+       // nucleus_mysql_escape_string() will be changed to mysql_escape_string() and\r
+       // this routine won't be used, so this way won't be problem.\r
+       return sqlite_escape_string($p1);\r
+}\r
+\r
+function nucleus_mysql_real_escape_string ($p1,$p2=null){\r
+       //addslashes used here.\r
+       return addslashes($p1);\r
+}\r
+\r
+function nucleus_mysql_create_db ($p1,$p2=null){\r
+       // All prameters are ignored.\r
+       // Returns always true;\r
+       return true;\r
+}\r
+\r
+function nucleus_mysql_pconnect($p1=null,$p2=null,$p3=null,$p4=null,$p5=null){\r
+       global $SQLITE_DBHANDLE,$SQLITECONF;\r
+       sqlite_close ($SQLITE_DBHANDLE);\r
+       $SQLITE_DBHANDLE=sqlite_popen($SQLITECONF['DBFILENAME']);\r
+       return ($SQLITE['DBHANDLE']=$SQLITE_DBHANDLE);\r
+}\r
+\r
+function nucleus_mysql_fetch_field($p1,$p2=null){\r
+       if ($p2) return sqlite_ReturnWithError('nucleus_mysql_fetch_field');\r
+       // Only 'name' is supported.\r
+       $o=new SQLITE_OBJECT;\r
+       $o->name=array();\r
+       if(is_array($ret=sqlite_fetch_array ($p1,SQLITE_ASSOC )))\r
+               foreach ($ret as $key=>$value) {\r
+                       if (is_string($key)) array_push($o->name,$key);\r
+               }\r
+       return $o;\r
+\r
+}\r
+function nucleus_mysql_get_client_info(){\r
+       return nucleus_mysql_get_server_info();\r
+}\r
+function nucleus_mysql_get_server_info(){\r
+       $res=nucleus_mysql_query('SELECT sqlite_version();');\r
+       if (!$res) return '?.?.?';\r
+       $row=nucleus_mysql_fetch_row($res);\r
+       if (!$row) return '?.?.?';\r
+       return $row[0];\r
+}\r
+\r
+// This function is called instead of _execute_queries() in backp.php\r
+function sqlite_restore_execute_queries(&$query){\r
+       global $DIR_NUCLEUS,$DIR_LIBS,$DIR_PLUGINS,$CONF;\r
+       \r
+       // Skip until the first "#" or "--"\r
+       if (($i=strpos($query,"\n#"))===false) $i=strlen($query);\r
+       if (($j=strpos($query,"\n--"))===false) $j=strlen($query);\r
+       if ($i<$j) $query=substr($query,$i+1);\r
+       else  $query=substr($query,$j+1);\r
+       \r
+       // Save the query to temporary file in sqlite directory.\r
+       if (function_exists('microtime')) {\r
+               $prefix=preg_replace('/[^0-9]/','',microtime());\r
+       } else {\r
+               srand(time());\r
+               $prefix=(string)rand(0,999999);\r
+       }\r
+       $tmpname=tempnam($DIR_NUCLEUS.'sqlite/',"tmp$prefix");\r
+       if (!($handle=@fopen($tmpname,'w'))) return 'Cannot save temporary DB file.';\r
+       fwrite($handle,$query);\r
+       fclose($handle);\r
+       $tmpname=preg_replace('/[\s\S]*?[\/\\\\]([^\/\\\\]+)$/','$1',$tmpname);\r
+       \r
+       // Read the option from NP_SQLite\r
+       if (!class_exists('NucleusPlugin')) { include($DIR_LIBS.'PLUGIN.php');}\r
+       if (!class_exists('NP_SQLite')) { include($DIR_PLUGINS.'NP_SQLite.php'); }\r
+       $p=new NP_SQLite();\r
+       if (!($numatonce=@$p->getOption('numatonce'))) $numatonce=20;\r
+       if (!($refreshwait=@$p->getOption('refreshwait'))) $refreshwait=1;\r
+       \r
+       // Start process.\r
+       $url="plugins/sqlite/restore.php?dbfile=$tmpname&numatonce=$numatonce&refreshwait=$refreshwait";\r
+       header('HTTP/1.0 301 Moved Permanently');\r
+       header('Location: '.$url);\r
+       exit('<html><body>Moved Permanently</body></html>');\r
+}\r
+\r
 ?>
\ No newline at end of file