Nucleus(JP)フォーラムNucleus(JP)フォーラムNucleusCMS日本語版ユーザーのためのサポートフォーラムです。疑問が生じたらまずは記事検索をご利用ください。登録ログインログインしていません。動くようにした物です。このフォーラムのどこかにアップしたかったのですが、どこがよいか分からなかったのでとりあえずここに挙げました。コメント追加・削除がとりあえずできるようになったので、ここに公表します。試して頂ける方は、ご意見よろしくお願いします。Nucleusコアが使えるだけで、まだプラグインには対応していません。MySQLに直接クエリーを投げるルーチンを含まないプラグインなら、使えるはずです。近い将来に、殆どのプラグインにも対応できるようにしようと思っています。(追記:現在のバージョンでは、殆ど(恐らく、90%以上)のプラグインに対応しています。)改造のメインは、『nucleus/sqlite』フォルダにある『sqlite.php』です。ここに、SQLite関数をラップしてMySQL関数として供給するためのグローバル関数群があります。『nucleus_mysql_xxxx()』の形になっていて、NucleusコアのMySQL関数呼び出しはすべてこの『nucleus_mysql_xxxx()』に変更してあります。これらを『mysql_xxxx()』にすればコアの改造もいらず、プラグインも殆どが使えるようになるはずですが、そうしなかったのは次の理由からです。インストールされていないサーバ環境では、コアの改造は必要有りません。)1.MySQLとSQLiteの両方がインストールされているサーバでも試用できるようにするため。2.SQLiteだけ供給していたプロバイダがある日突然MySQLも供給するようになった時の不都合を回避するため。MySQL-SQLite間でのクエリー構文の違いは、大まかに次のような感じです。1.SQLiteでは、データに型の概念がない(型を宣言しても、無視されるようです)。2.テーブル作成時・及び、データ挿入時の構文に若干の違いが見られる。3.データ呼び出し時のクエリー構文は殆ど違わないようである。1と3については、Nucleusコアを働かせている分には影響が無いように見えます。二つのクエリーに関して変換を行っています。追記)データ呼び出しの際のクエリー構文についてもいくらか違いが認められており、翻訳ルーチンを追加しています。against()』及び、『replace()』に付いてクエリーを変換しています。ベータバージョンです。殆ど問題なく動くようになりました。コアの部分も異なりますので、完全に入れ替えてください。データベースファイル(.DBSQLITE)はそのまま使えます。[size=150:ohsbo8p9]ここは、βバージョンだけです。βバージョンここに、Nucleus-SQLiteのコアファイルを置いておくことにします。ラッパーを上書きして使って下さい。コアファイルについてオリジナル版との違いは、全ての『mysql_xxx()』が『nucleus_mysql_xxx()』に置き換わっていることだけです(他は、全くと言っていいほど同じです)。(2006-03-22)バージョン0.5からベータバージョンです。コアの書き換えも自動でできるようになりました。下に『使用方法』を長々と書いていますが、要するにzipファイルを展開して、『install.php』をブラウザで開くだけです。nucleus/sqlite/フォルダのセキュリティーだけは注意してください。ここにデータベースファイル(.DBSQLITE)が入っています。よる防御が効かないこともありますので、念のために確認を怠らないようにしてください。インストールの際は、データベースのアクセスIDやパスワードなどは指定する必要はありません。データベースとして通常ファイルを用います。これは、『nucleus/sqlite/.dbsqlite』固定です。インストール前に『nucleus/sqlite/』フォルダのパーミッションを、読み書き可能な形(777とか)にしてください。別のファイル名を使用したい場合は、『nucleus/sqlite/sqlite.php』を書き換えてください。あとは、『install.php』を実行するだけです。オリジナル版のNucleusと同じようなインストール完了画面が出れば、おそらくインストールが成功しています。プラグインとしてデフォルトでインストールされるはずです。インストールされていない場合は、手動でインストールしてください。自動的にSQLite用にプラグインのPHPファイルを書き換えてくれるはずです。βバージョン素晴らしいではないですか!!本家フォーラムの方には投稿されないのですか?あちらの方にはSQLiteサポートを待っている人たちがかなりいると思います。さんの発言:Nucleusコアが使えるだけで、まだプラグインには対応していません。MySQLに直接クエリーを投げるルーチンを含まないプラグインなら、使えるはずです。近い将来に、殆どのプラグインにも対応できるようにしようと思っています。プラグインに対応してから本家に投稿した方がいいかな。こんなの日本にあるけど、って言ってきても良いですか?というか、Andyさんに宣伝してきて、って言っても良いですか?というか、それよりも前に日本フォーラムをチェックしている英語圏の人が先に報告しちゃうかも、ですけど。さんの発言:素晴らしいではないですか!!本家フォーラムの方には投稿されないのですか?あちらの方にはSQLiteサポートを待っている人たちがかなりいると思います。さんの発言:うーーん。私は自己紹介が得意な方ではないので、nakahara21さん、もといまみおさんか、Andyさんにトピックを立ち上げて貰えれば、その続きに記事を書くことができるかと思います。英語も少しはできますから。βバージョンこれは興味深いハックですね。独自フォークにするのはもったいないかも。要望があったような記憶があります。エンジンの差異はほとんど吸収されます。動くようになったら、ちょっとすごいかも。関数が含まれてたら併用できなくなりそうですが。βバージョン本家のフォーラムにも投稿してきました。あちらにも書きましたが、現在の問題点はNucleusの検索機能を使った時に起きます。記述が得意な人の意見が欲しいところです。動くようになったら、ちょっとすごいかも。関数が含まれてたら併用できなくなりそうですが。現在使用中のサーバでは、PostgreSQLが使えないので、使える人に是非コードを書いて欲しいです。プラグインの対応については、プラグインのインストール時にphpファイル中の『mysql_xxxx()』を『sqlite_mysql_xxxx()』に、正規表現か何かで書き換えることを考えています。併用やその他諸々の問題は起きないのではないかと。実行時にコアのphpをすべて調査して同じように書き換える事を考えているので、コアのアップグレードも簡単にできるようになると思っています。EXISTSが使えないことですね。2.テーブル作成時・及び、データ挿入時の構文に若干の違いが見られる。何件かヒットするのでちょっと気になりましたなにかテーブルのありなしが簡単に帰ってくる判定関数があるとプラグインの移植がしやすくなると思います。期待したものがかえってこないというようなことがあったっようなきがします。EXISTSが使えないことですね。独自テーブル使うプラグインではこれは,ほとんど使ってますね。プラグインのアンインストール時にテーブルを削除しない設定が可能なプラグインはすべて使っていると思います。ここが最難問かもしれないですね。βバージョン今日見たら、ダウンロード数が2になってる。嬉しい(1回目は、自分だけれど)。EXISTSが使えないことですね。さんの発言:独自テーブル使うプラグインではこれは,ほとんど使ってますね。EXISTS』で固定ならば、それほど難しくないかもしれません。TABLE』クエリーを投げるようにすればよいかも。さんの発言:2.テーブル作成時・及び、データ挿入時の構文に若干の違いが見られる。KEY』あたりの変換です。期待したものがかえってこないというようなことがあったっようなきがします。nullデータの調査を含めて、クエリーを検査してから投げるようなことを考えています。MySQLとSQLiteで文字列のエスケープ方法が異なるので、このあたりでクエリ・インジェクションが起こらないようにすることが優先課題です。今、次の事で困っているのでどなたか教えてくださいませんか。string』という内容で検索すると、次のようなクエリーが投げられます。)』相当の処理は、SQLiteではどのようにしたらよいでしょうか。0,50』の部分をどうすれば...。βバージョンとにかくすごい改造ですね。さんの発言:今日見たら、ダウンロード数が2になってる。嬉しい(1回目は、自分だけれど)。SQLiteの実装経験はないのですが、ちょっと試したくなりました。今のコードをみるとMySQL関数をオーバーライドしてSQLite化っていう感じでしょうか。今後は分岐点がいろいろありそうですね。こんなので返ってくるので早速の情報、どうも有り難うございます。さんの発言:プラグインで急いで対応させるときとかはプラグインの対応、もう少し待ってください。基本的には、MySQL用のクエリーを書くことで、すべて対応できるようにする予定ですので...。プラグイン作者の方は、従来通りMySQL用にコードを書いて頂けたらと思っています。さんの発言:・SQL部分を残して、それぞれのDB毎にカスタマイズこんなのを考えています。SQLを排除する一般的なラッパーに付いては、消極的ですね。SQL-Queryエラーが出た時に、PHPのどの行でのエラーかが分かりにくいかと。スクリプトの開発はあくまでMySQLで行うのが良いと思っています。さんの発言:今、次の事で困っているのでどなたか教えてくださいませんか。string』という内容で検索すると、次のようなクエリーが投げられます。解決しました(お騒がせしました)。SQLiteでは、クエリー内のユーザー関数が定義できるんですね(ちょっと、すごいのかも)。それで、match_against()というユーザー関数を定義して、それを使うようにクエリーを書き換えるようにすればうまく行きました。0,50』の部分は、SQLiteでもそのまま通りました。NP_MultipleCategoriesのテーブル作成ルーチンで、動作確認しました。0.1.1をアップしました。EXISTS』に対応しました。『nucleus/sqlite/sqlite.php』に上書きして使ってください。βバージョンフォーラム復活して、ヨカッタです。復旧作業お疲れさまでした。嬉しいのと、非常に光栄なのと、期待に答えられるかどうか不安なのと、複雑です。0.27aをアップしました。このバージョンでようやく、日本語にも対応させました。日本語版についても、インストールと記事・コメントの書き込みができることを確認しています。それから、SQLデータベースの取り込みができるようになりました。現時点でのロードマップは、次の通りです。1.自分自身のブログのミラーを、SQLiteを使って構築する。2.プラグインに完全対応できるようにする。このロードマップにしたがって進めていくと同時に、SQLインジェクションによるセキュリティーホールが入らないようにソースコードを見直す作業が入ります。現時点ではこの見直し作業は殆ど終わっていて、あと一息と言うところです。P.S.コアファイルをSQL用に自動的に書き換えてしまうスクリプトを制作しているのですが、現在の物は英語版とEUC-JP版では上手くいきますがUTF8版ではダメです。でるまでに仕上げたいと思っています。付いては英語版・日本語版の両方で改造コアをすでに用意してあります(2番目の記事を参照)。害はないのですができたブログのindex.php?itemid=1の改行がrnrnとして表示されます。新しく書いた記事には影響ないようです。さんの発言:改行がrnrnとして表示されます。これは、英語版を含む全てのバージョンで起こっていて、まだ改善されていません。SQLiteとMySQL間で文字列のエスケープの仕方が違っていて、それが原因だと考えています。新しく書く記事ではそういうことは起こらないので、mekyoさんおっしゃるように実害はないかと思います。これが直る頃にはベータ版配布かな。さんの発言:SQLiteとMySQL間で文字列のエスケープの仕方が違っていて、それが原因だと考えています。新しく書く記事ではそういうことは起こらないので、mekyoさんおっしゃるように実害はないかと思います。エスケープの仕方が違うということは、バックスラッシュではエスケープされないということでしょうか。さんの発言:エスケープの仕方が違うということは、バックスラッシュではエスケープされないということでしょうか。SQLiteでは、文字列はシングルクオート『'』で囲み、『'』を文字列に含めたいときは『''』のように二つつなげるというやり方です。さんの発言:だとすると、addslashesを使っている場所でエスケープが実質的に無効になっているということのようにも思え、コードを眺めているだけで、インストールしていないのでテストしないでこんなことを書くのもなんなんですが、シングルクォートなどを検索文字列に使用した場合にSQLインジェクションが可能になったりしませんか?最終目標は、MySQL用にコードを書いている限り、SQLインジェクションが不可能であるといったものです。sqlite.phpの現在のバージョン(0.27a)ではクエリー中に『"』『'』『`』が在るかどうかをまず確かめ、もしあればMySQLのルールに従った形で文字列の認識を行って、全ての文字列を『'』ではさみ、かつSQLite用にエスケープした状態にします。その後sqlite_query()関数にクエリーを引き継いでいるので、もしこの作業がパーフェクトに行われればaddslashes等を用いてエスケープすることで、SQLite版Nucleusでも大丈夫だということになります。先の記事においてロードマップについて書いた部分で『SQLインジェクションによるセキュリティーホールが入らないようにソースコードを見直す作業』と述べたのは、このあたりを意識しています。さんの発言:その通りです。SQLiteでは、文字列はシングルクオート『'』で囲み、『'』を文字列に含めたいときは『''』のように二つつなげるというやり方です。どこかで見たようなエスケープですね。Shift_JIS向きのような。さんの発言:最終目標は、MySQL用にコードを書いている限り、SQLインジェクションが不可能であるといったものです。SQLite版へのプラグインを書くときにsqlite_escape_stringを使うのかとおもっていましたが、マップしているので普通にMySQL用に作ればいいわけですね。sqlite_escape_stringならNullはセーフだと思うのですが、sqlite_changeQuoteでNull文字を突っ込まれた場合とか、どうなるんだろうと思ったりもしますが、後は自分で調べてみますね。(調べてから書けって=>俺)ありがとうございました。さんの発言:SQLite版へのプラグインを書くときにsqlite_escape_stringを使うのかとおもっていましたが、マップしているので普通にMySQL用に作ればいいわけですね。sqlite_escape_stringを使ってはいけないということになります。『mysql_escape_string』『mysql_real_escape_string』はNucleusコアでは使われていないのでsqlite.phpでは未実装ですが、プラグイン中で使っている人もいると思うので、『sqlite_mysql_escape_string()』は『addslashes()』で返そうかと思っています。さんの発言:sqlite_escape_stringならNullはセーフだと思うのですが、sqlite_changeQuoteでNull文字を突っ込まれた場合とか、どうなるんだろうと思ったりもしますが、後は自分で調べてみますね。お知恵拝借したいので、よろしくお願いします。P.S.現在、自分のブログのデータをSQLite版に入力するために、悪戦苦闘中です。それ用(データ取り込み用)のプラグインを一つ書かなければならない気配です。βバージョン一難去って、また一難。今使っているMySQLを使ったブログのデータベースの全てのデータを、『DBの保存/復元』プラス自作のPHPでSQLiteに取り込む事に成功。コアだけの時は良かったんですが、プラグインを使うとそれぞれのプラグインで種々雑多なqueryが投げられるもんで、エラー続出です。節で使用する関数』が随分使われているんですね~。against()』だけではなかった...。乗りかかった船なので、クエリー中で使われる関数は全てサポートする予定です。使われている関数から順に記述していきたいので、もしよろしければ、どんな関数が使われているか知らせていただけませんでしょうか。現在のところこちらで把握している関数は、次の通りです。"(^|,)(,|$)"DAYOFMONTH(itime)よろしくお願いします。categoryを使っています。NP_ItemNaviEXとNP_MultipleCategoriesで『SUBSTRING』使用しています。r.up_id=i.inumber';という構文があります。count(*)』が使われています。~という構文があります。『MONTH(i.itime)』と『YEAR(i.itime)』もありました。βバージョン有り難うございます。(追記)次の関数は、最優先で実装する事にします。』がコアで使われている(データベース保存時)ので最優先で実装予定です。y』『MAX()』は、標準のSQLiteで大丈夫のようです。BY』は、現在調べています。βバージョンあと、現在の最新版で使われているかどうかは未調査ですが、『DISTINCT』を使っているプラグインがあるかもしれません。ここに構文のっています。BY』は、現在調べています。そのまま通る可能性ありです。