SQLite-2
2006年3月6日
NucleusでSQLiteを使用するためのラッパー。
とりあえず、ブログが表示できるようになったので、メモ。
とりあえず、ブログが表示できるようになったので、メモ。
<?php //The licence of this script is GPL.
//unlink('dummy');
$SQLITE_DBFILENAME='SQLITE_DEFAULT';
$SQLITE_DBHANDLE=sqlite_open($SQLITE_DBFILENAME);
$SQLITE_DBNAME=null;
class SQLITE_OBJECT {
}
function sqlite_ReturnWithError($text='Not supported'){
echo "Error in SQLite-MySQL wrapper: $text\n";
return null;
}
//resource mysql_query ( string query [, resource link_identifier] ) -- MySQL クエリを送信する
//resource mysql_db_query ( string database, string query [, resource link_identifier] ) -- MySQL クエリーを送信する
//resource sqlite_query ( resource dbhandle, string query [, int result_type [, string &error_msg]] ) -- 指定したデータベースに対してクエリを実行し、結果ハンドル を返す
function sqlite_mysql_query($p1,$p2=null){
//if ($p2!==null) return mysql_query ($p1,$p2);
//return mysql_query ($p1);
global $SQLITE_DBFILENAME,$SQLITE_DBHANDLE;
if (!($dbhandle=$p2)) $dbhandle=$SQLITE_DBHANDLE;
$query=preg_replace('/`([A-Z_]*?)`/i','\'$1\'',$p1);
//$query=$p1;
if (strpos(strtoupper($query),'CREATE TABLE')===0) {
if (!($i=strpos($query,'('))) return sqlite_ReturnWithError('sqlite_mysql_query: '.$p1);
$tablename=substr($query,0,$i);
$query=trim(substr($query,$i+1));
for ($i=strlen($query);0<$i;$i--) if ($query[$i]==')') break;
$query=substr($query,0,$i);
$auto_increment=false;
$commands=sqlite_splitByComma($query);
$query=$tablename.' (';
$first=true;
foreach($commands as $key => $value) {
if (strpos(strtolower($value),'auto_increment')==strlen($value)-14) $auto_increment=true;
$value=preg_replace('/int\([0-9]*?\) NOT NULL auto_increment$/i',' INTEGER NOT NULL PRIMARY KEY',$value);
$value=preg_replace('/int\([0-9]*?\) auto_increment$/i',' INTEGER PRIMARY KEY',$value);
$value=preg_replace('/^FULLTEXT KEY(.*?)$/i','',$value);
if ($auto_increment) $value=preg_replace('/^PRIMARY KEY(.*?)$/i','',$value);
$value=preg_replace('/^UNIQUE KEY[^\(]+\(/i','UNIQUE (',$value);
$value=preg_replace('/^KEY(.*?)$/i','',$value);
if ($value) {
if ($first) $first=false;
else $query.=',';
$query.=' '.$value;
}
}
$query.=' )';
//echo "".htmlspecialchars($p1)."\n".htmlspecialchars($query)."<hr />\n";
} else if (strpos(strtoupper($query),'INSERT INTO')===0) {
$buff='INSERT INTO ';
$query=trim(substr($query,11));
if ($i=strpos($query,' ')) {
$buff.=trim(substr($query,0,$i));
$query=trim(substr($query,$i));
}
if ($i=strpos($query,' ')) {
if (strpos(strtoupper($query),'SET')===0) {
$query=trim(substr($query,3));
$commands=sqlite_splitByComma($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.=sqlite_changeslashes(substr($value,$i+1));
}
}
$buff.=')';
$query.=')';
}
}
$query=$buff.$query;
}
$ret=sqlite_query($dbhandle,$query);
if (!$ret) echo "".htmlspecialchars($p1)."\n".htmlspecialchars($query)."<hr />\n";
return $ret;
}
function sqlite_splitByComma($query) {
$commands=array();
$i=0;
$in=false;
while ($query) {
if ($query[$i]=='"') {
$i++;
while ($query[$i++]!='"' && $i<strlen($query)) if ($query[$i-1]=="\\") $i++;
continue;
}
if ($query[$i]=="'") {
$i++;
while ($query[$i++]!="'" && $i<strlen($query)) if ($query[$i-1]=="\\") $i++;
continue;
}
if ($query[$i]=='(') $in=true;
if ($query[$i]==')') $in=false;
if ($query[$i]==',' && (!$in)) {
$commands[]=trim(substr($query,0,$i));
$query=trim(substr($query,$i+1));
$i=0;
continue;
}
if (strlen($query)<=($i++)) break;
}
if ($query) $commands[]=$query;
return $commands;
}
function sqlite_changeslashes(&$text){
$t=trim($text);
$b=substr($t,0,1);
$e=substr($t,-1);
if (($b=="'" && $e=="'")||($b=='"' && $e=='"')) {
$t=stripslashes(substr($t,1,strlen($text)-2));
return ("'".sqlite_escape_string ($t)."'");
}
return $t;
}
//mysql_affected_rows -- 一番最近の操作で変更された行の数を得る
//sqlite_changes -- 直近のSQLステートメントにより変更されたレコード数を返す
function sqlite_mysql_affected_rows($p1=null){
//if ($p1!==null) return mysql_affected_rows ($p1);
//return mysql_affected_rows ();
global $SQLITE_DBFILENAME,$SQLITE_DBHANDLE;
if ($p1!==null) return sqlite_changes($p1);
return sqlite_changes($SQLITE_DBHANDLE);
}
//mysql_close -- MySQL 接続を閉じる
//sqlite_close -- オープンされたSQLiteデータベースを閉じる
function sqlite_mysql_close($p1=null){
//if ($p1!==null) return mysql_close ($p1);
//return mysql_close ();
global $SQLITE_DBFILENAME,$SQLITE_DBHANDLE;
if ($p1!==null) return sqlite_close ($p1);
return sqlite_close ($SQLITE_DBHANDLE);
}
//resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags]]]]] ) -- MySQL サーバへの接続をオープンする
//resource sqlite_open ( string filename [, int mode [, string &error_message]] ) -- SQLiteデータベースをオープンする。データベースが存在しない場合は作 成する
function sqlite_mysql_connect($p1=null,$p2=null,$p3=null,$p4=null,$p5=null){
//if ($p5!==null) return mysql_connect ($p1,$p2,$p3,$p4,$p5);
//if ($p4!==null) return mysql_connect ($p1,$p2,$p3,$p4);
//if ($p3!==null) return mysql_connect ($p1,$p2,$p3);
//if ($p2!==null) return mysql_connect ($p1,$p2);
//if ($p1!==null) return mysql_connect ($p1);
//return mysql_connect ();
global $SQLITE_DBFILENAME,$SQLITE_DBHANDLE;
if ($p1==null) return sqlite_ReturnWithError('sqlite_mysql_connect');
if ($p4!==null) return sqlite_ReturnWithError('sqlite_mysql_connect');
if ($SQLITE_DBFILENAME==$p1 && $SQLITE_DBHANDLE!==null) return $SQLITE_DBHANDLE;
$SQLITE_DBFILENAME=$p1;
return ($SQLITE_DBHANDLE=sqlite_open($p1));
}
//bool mysql_select_db ( string database_name [, resource link_identifier] ) -- MySQL データベースを選択する
//resource sqlite_open ( string filename [, int mode [, string &error_message]] ) -- SQLiteデータベースをオープンする。データベースが存在しない場合は作 成する
function sqlite_mysql_select_db($p1,$p2=null){
//if ($p2!==null) return mysql_select_db ($p1,$p2);
//return mysql_select_db ($p1);
global $SQLITE_DBNAME;
if ($SQLITE_DBNAME) return ($p1=$SQLITE_DBNAME);
$SQLITE_DBNAME=$p1;
return true;
}
//mysql_error -- 直近に実行された MySQL 操作のエラーメッセージを返す
//sqlite_last_error -- データベースに関する直近のエラーコードを返す
//sqlite_error_string -- エラーコードの説明を返す
function sqlite_mysql_error($p1=null){
//if ($p1!==null) return mysql_error ($p1);
//return mysql_error ();
global $SQLITE_DBFILENAME,$SQLITE_DBHANDLE;
if (!($dbhandle=$p1)) $dbhandle=$SQLITE_DBHANDLE;
return sqlite_error_string ( sqlite_last_error ($dbhandle) );
}
//array mysql_fetch_array ( resource result [, int result_type] ) -- 連想配列、添字配列、またはその両方として結果の行を取得する
//array sqlite_fetch_array ( resource result [, int result_type [, bool decode_binary]] ) -- 結果セットから次のレコードを配列として取得する
function sqlite_mysql_fetch_array($p1,$p2=SQLITE_BOTH){
//if ($p2!==null) return mysql_fetch_array ($p1,$p2);
//return mysql_fetch_array ($p1);
return sqlite_fetch_array ($p1,$p2);
}
//array mysql_fetch_assoc ( resource result ) -- 連想配列として結果の行を取得する
//array sqlite_fetch_all ( resource result [, int result_type [, bool decode_binary]] ) -- 結果セットから全てのレコードを配列の配列として取得する
function sqlite_mysql_fetch_assoc($p1){
//return mysql_fetch_assoc ($p1);
return sqlite_fetch_array($p1,SQLITE_ASSOC);
}
//object mysql_fetch_object ( resource result ) -- 結果の行をオブジェクトとして取得する
//object sqlite_fetch_object ( resource result [, string class_name [, array ctor_params [, bool decode_binary]]] ) -- 結果セットから次のレコードをオブジェクトとして取得する
function sqlite_mysql_fetch_object($p1){
//return mysql_fetch_object ($p1);
$o=new SQLITE_OBJECT;
if (is_array($ret=sqlite_fetch_array ($p1))) foreach ($ret as $key=>$value){
$o->$key=$value;
}
return $o;
}
//mysql_fetch_row -- 結果を添字配列として取得する
//sqlite_fetch_all -- 結果セットから全てのレコードを配列の配列として取得する
function sqlite_mysql_fetch_row($p1){
//return mysql_fetch_row ($p1);
return sqlite_fetch_array($p1,SQLITE_NUM);
}
//string mysql_field_name ( resource result, int field_offset ) -- 結果において指定したフィールド名を取得する
//string sqlite_field_name ( resource result, int field_index ) -- 特定のフィールドの名前を返す
function sqlite_mysql_field_name($p1,$p2){
//return mysql_field_name ($p1,$p2);
return sqlite_field_name ($p1,$p2);
}
//mysql_free_result -- 結果保持用メモリを開放する
function sqlite_mysql_free_result($p1){
//return mysql_free_result ($p1);
return true;//????
}
//int mysql_insert_id ( [resource link_identifier] ) -- 直近の INSERT 操作で生成された ID を得る
//int sqlite_last_insert_rowid ( resource dbhandle ) -- 直近に挿入されたレコードのrowidを返す
function sqlite_mysql_insert_id($p1=null){
//if ($p1!==null) return mysql_insert_id ($p1);
//return mysql_insert_id ();
global $SQLITE_DBFILENAME,$SQLITE_DBHANDLE;
if (!($dbhandle=$p1)) $dbhandle=$SQLITE_DBHANDLE;
return sqlite_last_insert_rowid ($SQLITE_DBHANDLE);
}
//int mysql_num_fields ( resource result ) -- 結果におけるフィールドの数を得る
//int sqlite_num_fields ( resource result ) -- 結果セットのフィールド数を返す
function sqlite_mysql_num_fields($p1){
//return mysql_num_fields ($p1);
return sqlite_num_fields ($p1);
}
//int mysql_num_rows ( resource result ) -- 結果における行の数を得る
//int sqlite_num_rows ( resource result ) -- 結果セットのレコード数を返す
function sqlite_mysql_num_rows($p1){
//return mysql_num_rows ($p1);
return sqlite_num_rows ($p1);
}
//string mysql_result ( resource result, int row [, mixed field] ) -- 結果データを得る
//string sqlite_fetch_single ( resource result [, bool decode_binary] ) -- 結果セットの最初のカラムを文字列として取得する
//array sqlite_fetch_array ( resource result [, int result_type [, bool decode_binary]] ) -- 結果セットから次のレコードを配列として取得する
function sqlite_mysql_result($p1,$p2,$p3=null){
//if ($p3!==null) return mysql_result ($p1,$p2,$p3);
//return mysql_result ($p1,$p2);
if ($p3) return sqlite_ReturnWithError('sqlite_mysql_result');
if (!$p2) return sqlite_fetch_single ($p1);
$a=sqlite_fetch_array ($p1);
return $a[$p2];
}
?>