XMLDB DML関数の変更 (Dev docs)

提供:MoodleDocs
移動先:案内検索

XMLDB ドキュメンテーション > ロードマップ > DML関数の変更


このポイントは、ポイント 1: Splitting datalib.phpが終了した 後に 実施する必要があります。

詳細

重要な変更は DML 関数だけですが、多くのスクリプトが影響を受ける長いプロセスです。あとは、そういった機能の使い方を何百か所も変えて、じっくりと検証していく 繰り返し作業 です。新しい最終的な DML ライブラリの ドキュメント は、第3者の開発者が彼らの貢献を更新できるように、できるだけ早く準備されなければなりません

以下、DMLライブラリで行うべき 変更のリスト と、残りのコードにおける その影響 について説明します (注意: 変更の数はそれほど多くないので、各項目を1つのセクションに移動してください!) 。

LIMIT x, y 節

LIMIT offset, num 句 (またはその逆) の使用をクロス DB 互換の SelectLimit() 関数を使用するためすべて変更する必要があります (Oracle と MSSQL の両方がそのような句をサポートしていません) 。これを行うには、dmllib.php のすべての get_recordXXX および get_recordsetXXX 関数を、取得するレコード数とスキップするレコード数を指定するための 2 つのパラメータ $sqlnum および $sqlfrom に対応させるように変更する必要があります。このライブラリの変更は重要ですが、手書きの LIMIT クラスを使用する古い Moodle のコードとの後方互換性が保たれることになります。

一度変更すると、すべての Moodle コアは古い LIMIT x,yの使用から、新しいパラメータを持つ新しい関数に変換されるはずです。

また、sql_paging_limit() は早急に非推奨となります (2.0?) 。

変更する機能は以下の通りです:

  • Done!: get_recordset(): パラメータ $limitfrom と $limitnum の順番を変更します。
  • Done!: get_recordset_select(): パラメータ $limitfrom と $limitnum の順番を変更します。
  • Done!: get_recordset_list(): パラメータ $limitfrom と $limitnum の順番を変更します。
  • Done!: get_recordset_sql(): 新しいパラメータ $limitfrom と $limitnum を追加します。必要なら SelectLimit() を使用します。
  • Done!: get_records(): パラメータ $limitfrom と $limitnum の順番を変更します。
  • Done!: get_records_select(): パラメータ $limitfrom と $limitnum の順番を変更します。
  • Done!: get_records_list(): パラメータ $limitfrom と $limitnum の順番を変更します。
  • Done!: get_records_sql(): 新しいパラメータ $limitfrom と $limitnum を追加します。
  • Done!: get_records_menu(): 新しいパラメータ $limitfrom と $limitnum を追加します。
  • Done!: get_records_select_menu(): 新しいパラメータ $limitfrom と $limitnum を追加します。
  • Done!: get_records_sql_menu(): 新しいパラメータ $limitfrom と $limitnum を追加します。

実施するグローバルな変更内容は以下の通りです:

  • Done!: LIMIT (大文字と小文字) 節の出現箇所をすべて検索し、破棄します。
  • Done!: sql_paging_limit() 関数呼び出しのすべての出現箇所を検索し、破棄します。
  • Done!: 関数 sql_paging_limit() を非推奨としました。

INSERT レコード (Oracle)

Oracle は自動数値フィールドをサポートしていないので、各テーブルに1つのシーケンスを作成し、さらに自動数値フィールドの動作をシミュレートするためのトリガーを1つ作成しなければなりません。このことは、次のことを意味します:

  1. Done!: XMLDB スキーマでテーブルを作成するたびに、対応するシーケンスを作成します。
  2. Done!: シーケンスが作成されるたびに、対応するトリガーを作成します。
  3. Done!: このシーケンスとトリガが適切に動作するように insert_record() を変更しました。(PostgreSQL と同様)。
  4. Done!: 1つのテーブルの名前を変更するたびに、シーケンスの名前を変更します。
  5. Done!: 1つのテーブルの名前が変更されるたびに、Drop/Create とトリガーを実行します。
  6. Done!: シーケンスをドロップし、1つのテーブルがドロップされるたびにトリガーします。

clob/blob データの INSERT (Oracle)

Oracle は clob/blob (text/binary) データの DB への直接挿入をサポートしません。まず empty_clob() を使ってコンテナを作成し、次に UpdateXlob() 関数で実際の内容でレコードを更新するという、2段階のトランザクションを実行する必要があります。

これは、どのフィールドが clob/blob であるかを知る必要があり、おそらく Metadata 関数に問い合わせる (そして結果をキャッシュする) ことと対になります。次に、挿入された各ロブカラムについて、上記の方法を実行します。

ADOdb のドキュメントには clob/blob の更新について何も書かれていないので、UpdateXlob() 関数で直接問題なくサポートできるはずです (実際のデータで確認する必要があります)。

修正するコードは:

  1. Done!: insert_record()
  2. Done!: update_record()
  3. Done!: set_field()
  4. Done!: 上記の関数と LOB データを使って、XMLDB のテストをいくつか作成し、すべての動作を確認します。

INSTALL するもの

  • Done!: インストーラが MSSQL とOracleの両方を選択できるようにします。
  • Done!: MSSQL と Oracle で magic_quotes_sybase が設定されていることを確認します (php.ini 必須。さもないと PGC データが適切にスラッシュされません。この要求は、PGC を永久に無効にした時点で無効になることに注意してください!)。また、stripslashes_safe() およびその他関連するいくつかの関数を修正します。注意: 別の解決策としては、magic_quotes_gpc を完全に無効にすることです (Moodleのインストール要件とは逆ですが) 。 これにより、Moodleは quoting job が始まる前に正しく定義された適切な文字ですべてを引用します。php.ini の変更と Web サーバの再起動なしに、異なる DB をジャンプ/実行することをサポートしているので、私はこの構成でサーバを実行しています。
  • Done!: Oracle DB が Unicode であることを確認し、$CFG->unicodedb (および設定レコード) を適切に設定します。
  • Done!: MSSQL は常に Unicode で、UTF-8 に変換された適切な TDS または ODBTP ドライバを使用していると仮定します。

CONCATENATION 演算子

各 DB は独自の連結構文を持っているようです。適切な SQL 文を構築するために、最大 X 個の文字列を受け付ける中央関数 sql_concat() を用意する必要があります。MySQL は CONCAT() 関数、PostgreSQL と Oracleは "||" (2本のパイプ) 文字 (SQL-Standard)、MSSQL は "+" (プラス) 記号を使用します。

  • Done!: あらゆる DB をサポートするために、適切な sql_concat() 関数を使用します (ADOdb 上のラッパー)。
  • Done!: concat のハーコード化された使い方を探します。

TEXT/BINARY の DISTINCT 節

MSSQL と Oracle は、TEXT と BINARY フィールドの DISTINCT 節をサポートしていません。存在する場合は、クエリから (ロジックに応じて DISTINCT またはフィールドを) 削除し、必要であれば、そのようなテキスト情報を取得するために PHP の反復処理を作成する必要があります。

多くの場合、すべての get_records_XXX() 関数がクエリの最初のフィールドによってすべてのレコードが異なることを保証する 1 つの連想配列を返すため、Moodle 内で DISTINCT 句を省略できることに注意してください。

  • Done!: TEXT/BINARY カラムを含む DISTINCT の使用をすべて見直し、取得するフィールドを限定するか、必要なければ DISTINCT を削除するだけです(クエリの最初のフィールド=id)。

テーブルエイリアスの "AS" の使い方をすべて見直す

XMLDBの問題 で推測したように、テーブルのエイリアスにおける "AS" キーワードの現在の使用法をすべて見直すことが必須です (Oracle はこれを禁じています) 。

また、PostgreSQL はキーワード (AS) を要求しているので、すべてのカラムエイリアスを使用しなければなりませんが、PG はそれ以来適切に動作しているので、これは昔から大丈夫なはずです。;-)

  • Done!: テーブルエイリアスの "AS" の用途をすべて検索して破棄します。

新しい upgrade.php スクリプトを各所に導入し、古いスクリプトを非推奨とする

Moodle 1.7 から、新しい XMLDB ベースの upgrade.php スクリプトのみがコアで使用される予定です。そのため、これらの点に対処する必要があります:

  • Done!: 新しい upgrade.php は基本的にすべて空 (テンプレート) ファイルを作成します。
  • Done!: 古いスクリプトをすべて非推奨としてマークし、ハッカーがそれらを変更せずに残しておくことを奨励します。

SQL 文での LCASE() と UCASE() の使い方をすべて確認する

  • Done!: lower() と upper() の両方は、これが動作するための標準的な SQL 関数なので、いたるところでこれらを置き換えてください。
  • Done!: db_uppercase() および db_lowercase() は、Moodle Core では全く使用されていないため、非推奨とします。

SQL 文における LEFT()、RIGHT()、SUBSTR()、SUBSTRING() のすべての使用方法を確認する

  • Done!: 各 DB の正しい関数名を取得するために、1つの関数 sql_substr() を作成します。
  • Done!: SQL の Left() と Right() の呼び出しを、sql_substr() の結果を関数名として使用するように変更します。
  • Done!: Substr() および Substring() の SQL コールを、sql_substr() の結果を関数名として使用するように置換します。

MSSQL と Oracle の REGEXP SQL ステートメントをすべて PREVENT する

Oracle 10gR2 と外部関数による MSSQL のみ SQL で REGEXP をサポートしているようです。次のような場所で、REGEXP を使わないようにする (できれば、より単純な LIKE に置き換える) :

  • Done!: lib/datalib.php (REGEXP が使用されないように、+/- の文字がトリミングされています)
  • Done!: lib/searchlib.php (REGEXP を使用しないように、TOKEN 検索を STRING 検索に変換し、+/- 文字でトリミングするようにされています)
  • Done!: message/lib.php (REGEXP が使用されないように、+/- の文字がトリミングされています)
  • Done!: mod/forum/lib.php (コンプリートフォーミュラリの searchfullwords フィールドが非表示にされています)
  • Done!: mod/glossary/lib.php (REGEXP が使用されないように、+/- の文字がトリミングされています)
  • Done!: mod/glossary/sql.php (REGEXP が使用されないように、+/- の文字がトリミングされています)

CFG->dbtype の使用をすべて確認する

Done!: 新しい RDBMS で何が起こるか、$CFG->dbtype を使用しているすべての場所を探します。それらにサポートを拡張します。

タイムフレーム

多かれ少なかれ 1 年で、1 つのアルファバージョンを利用できるようになります! Eloy Lafuente (stronk7) 07:19, 18 August 2006 (WST) (しびれを切らして書いた)

15日間の作業