Ticket #564 (closed 改善提案: 修正済)

Opened 11 years ago

Last modified 10 years ago

PEAR::DB から PEAR::MDB2 への変更

Reported by: nanasess Owned by: nanasess
Priority: Milestone: EC-CUBE2.11.0
Component: その他 Version: コミュニティ (eccube-comu)
Keywords: Cc:
修正済み:

Description (last modified by nanasess) (diff)

現在, DB の抽象化ライブラリとして PEAR::DB を使用しているが, 以下の問題がある.

  • PEAR::DB は PHP ライセンスであり, GPL と矛盾する
  • もうメンテナンスされてない

上記の理由により PEAR::MDB2 若しくは ADOdb へ変更する

MDB2
 http://pear.php.net/package/MDB2/
ADOdb
 http://adodb.sourceforge.net/

導入要件

  • GPL と矛盾しないライセンスで配布されていること
  • Sequence 取得の抽象化メソッドがあること
    • Sequence に関して PostgreSQL 及び MySQL を同一のコードベースで記述可能なこと
  • データベースのメタデータを扱うメソッドがあること
  • 活発にメンテナンスされていること

利点

  • PEAR::MDB2
    • 2.5.x では, PDO 用のドライバも有り
    • エラーハンドリングを, 他の PEAR パッケージと統一可能
  • ADOdb
    • 速いというウワサ
    • キャッシュ機構あり
    • adodb-errorpear.inc.php を include すれば, PEAR::Error も使用可能
    • adodb-errorhandler.inc.php で, 任意のエラー定数で trigger_error を使用可能

欠点

  • PEAR::MDB2
    • PHP の include_path に, 他の PEAR クラスが存在すると, 関数の多重定義エラーになる
    • EC-CUBE のエラーハンドリングが貧弱なため, DBエラーが発生すると無限ループする
  • ADOdb
    • DB::last_query に相当する機能が無い(EC-CUBE 本体では未使用)
    • adodb-errorpear.inc.php を使用した場合, 出力するエラー文字列が膨大になり, memory_limit を越える場合がある

その他

  • DBエラーが発生した場合, PHP エラーではなく EC-CUBE のエラー画面を表示するのが望ましい

参考

Change History

comment:1 Changed 11 years ago by nanasess

  • Component changed from フロント to その他
  • Description modified (diff)
  • Summary changed from PEAR::DB から PEAR::MDB2 への変更 to PEAR::DB から PEAR::MDB2 or ADOdb への変更

comment:2 Changed 11 years ago by nanasess

  • Status changed from new to assigned
  • Description modified (diff)

現状は, どちらも導入要件を満たしていそうなので, サンプルコードを書いてみることにします.

comment:3 Changed 11 years ago by nanasess

  • Description modified (diff)

comment:4 Changed 11 years ago by nanasess

  • Description modified (diff)

PEAR::DB から PEAR::MDB2 へ移行のための参考サイト追加.

現状は, PEAR::DB への依存が激しすぎるので MDB2 の方が妥当かも...

comment:5 Changed 11 years ago by nanasess

  • Description modified (diff)

comment:6 Changed 11 years ago by nanasess

  • Description modified (diff)

説明を更新.

PEAR::MDB2 の欠点の影響が強すぎ, 簡単に動いてくれないので, ADOdb を使用する方向で検討.

comment:7 Changed 11 years ago by nanasess

r18390 で ADOdb を使用するよう改修した SC_DbConn のパッチをコミット

comment:8 Changed 11 years ago by nanasess

  • Description modified (diff)

comment:9 Changed 11 years ago by nanasess

  • Description modified (diff)

comment:10 Changed 11 years ago by nanasess

  • Description modified (diff)

エラー表示に関する説明を追記

PEAR::DB 版 SC_DbConn は下記のような実装になっている

  • DB 接続エラーの場合
    • SC_DbConn::getAll() 関数の場合のみ 0 を返し, 「DB接続に失敗しました」という文言を表示する. その他の関数は SC_DbConn::send_err_mail() 関数を呼び exit する
  • SQL エラーの場合
    • SC_DbConn::send_err_mail() 関数を呼び exit する

PEAR::DB 版 SC_DbConn の実装の問題点は, 接続エラーの場合は文言が表示されるものの, それ以外の場合は真っ白な画面になってしまう.

また, エラー画面を表示しようとしても, 表示するまでに DB 接続を行うため, 多重でエラーが発生する.

本来であれば, DB 関連のエラーはエラーコードを付与して EC-CUBE のエラー画面を表示するのが望ましい.

comment:11 follow-up: ↓ 12 Changed 11 years ago by miningbrownie

MDB2ってオリジナルBSDライセンスだったような、、、 オリジナルBSDだとBSD宣伝条項が引っかかるような気がします。

comment:12 in reply to: ↑ 11 Changed 11 years ago by nanasess

miningbrownie への返信

MDB2ってオリジナルBSDライセンスだったような、、、オリジナルBSDだとBSD宣伝条項が引っかかるような気がします。

実際に MDB2.php を覗いてみました.

 http://www.google.co.jp/codesearch/p?hl=ja#yNAEdmvlCkE/package/MDB2-2.2.2.tgz|dSu2EDsdFxU/MDB2-2.2.2/MDB2.php&q=MDB2%20PEAR%20lang:php%20pear.php.net

オリジナルBSDライセンスで問題となる, 下記の条項は見当たらないので大丈夫かと思います.

All advertising materials mentioning features or use of this software must display the following acknowledgement:

comment:13 Changed 10 years ago by nanasess

  • Priority changed from to

エラーハンドリングの問題が解決できそうなので, MDB2 へ置き替えるコードも書いてみることにします

comment:14 Changed 10 years ago by nanasess

r18754:18755 で, MDB2 に対応するためのパッチとライブラリを追加しました

comment:15 Changed 10 years ago by nanasess

version-2_5-dev r18763 に MDB2 対応のコードをコミットしました.

大幅な修正を伴っていますので, 不具合などありましたらフィードバックお願いします!

comment:16 Changed 10 years ago by nanasess

r18766 で ADOdb のライブラリを削除しました

comment:17 Changed 10 years ago by nanasess

  • Summary changed from PEAR::DB から PEAR::MDB2 or ADOdb への変更 to PEAR::DB から PEAR::MDB2 への変更
  • Description modified (diff)
  • Milestone changed from EC-CUBE2.5.0alpha to EC-CUBE2.5.0beta

概ね動作していますので, milestone:EC-CUBE2.5.0beta へ変更します

comment:18 Changed 10 years ago by nanasess

MDB2 2.5.0b3 がリリースされました

 http://pear.php.net/package/MDB2/download/

しかし, このバージョンから

  • dropped PHP 4 support
Dependencies
PHP Version: PHP 5.3.0 or newer

ということなので, 当面は 2.5.0b2 を同梱しようと思います

comment:19 Changed 10 years ago by Seasoft

  • Milestone changed from EC-CUBE2.5.0beta to EC-CUBE2.5.0alpha

インストール中に発生した DROP / CREATE に関わるエラーを捕捉できない不具合があるようです。
 http://xoops.ec-cube.net/modules/newbb/viewtopic.php?viewmode=thread&topic_id=6775&forum=14&post_id=32478

comment:20 Changed 10 years ago by nanasess

  • Milestone changed from EC-CUBE2.5.0beta to EC-CUBE2.5.0

milestone:EC-CUBE2.5.0beta では問題ないようですので, milestone:EC-CUBE2.5.0 へ変 更します

comment:21 Changed 10 years ago by nanasess

r18982 不具合修正 AMUAMU様

comment:22 Changed 10 years ago by AMUAMU

r19690 の不具合修正、機能改善にて各種問題を解決しました。

comment:23 follow-up: ↓ 24 Changed 10 years ago by Seasoft

  • Milestone changed from EC-CUBE2.5.0 to EC-CUBE2.5.0beta

MySQL で dtb_member に文字化けが発生する。SET NAMES が実行されていないか。

本チケットの範疇か確信がないのですが、一旦差し戻します。(違っていたら、新たなチケット発行の方向で。)

comment:24 in reply to: ↑ 23 ; follow-up: ↓ 26 Changed 10 years ago by nanasess

  • Milestone changed from EC-CUBE2.5.0beta to EC-CUBE2.5.0

Seasoft への返信

MySQL で dtb_member に文字化けが発生する。SET NAMES が実行されていないか。

r19781 で修正しました.

深く追っていませんが, SC_Query::query() で INSERT を実行すると文字化けする場合があるようです

comment:25 Changed 10 years ago by nanasess

  • Status changed from assigned to closed
  • Resolution set to 修正済

comment:26 in reply to: ↑ 24 ; follow-up: ↓ 27 Changed 10 years ago by Seasoft

  • Status changed from closed to reopened
  • Resolution 修正済 deleted

nanasess への返信

r19781 で修正しました.

深く追っていませんが, SC_Query::query() で INSERT を実行すると文字化けする場合があるようです

改善されないことを確認。本質的には、MySQL の設定不整合に起因するものだと思うが、現実的にそういったサーバは多く、特に共用サーバでは設定変更できないケースが多い。

なお、コミュニティ版では解決していた。r17559

comment:27 in reply to: ↑ 26 Changed 10 years ago by nanasess

  • Status changed from reopened to closed
  • Resolution set to 修正済

Seasoft への返信

nanasess への返信

r19781 で修正しました.

深く追っていませんが, SC_Query::query() で INSERT を実行すると文字化けする場合があるようです

改善されないことを確認。本質的には、MySQL の設定不整合に起因するものだと思うが、現実的にそういったサーバは多く、特に共用サーバでは設定変更できないケースが多い。

なお、コミュニティ版では解決していた。r17559

別途チケット登録しました. #958

こちらは close します.

Note: See TracTickets for help on using tickets.