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]; } ?>