Nucleus

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

?>

コメント

コメントはありません

コメント送信