データベースの定義の取得

データベースの定義の取得 -- 物理データベースあるいは MDB2 の XML からの定義配列の作成方法

導入

MDB2_Schema の内部的な動作は、すべて配列構造で行っています。 この配列を "定義配列" と呼ぶことにします。 createDatabase のようなメソッドの多くは、 入力パラメータとしてファイル名ではなく定義配列を要求します。中には、 内部で自動変換を行うことによってファイル名でも受け付けるものもあります。

定義配列が必要となったときに手動で作成する方法は二通りあります。 ひとつはそのスキーマのソース (データベースあるいはスキーマファイル) から作成する方法です。もうひとつの方法として、 もちろん手書きで作成することも可能です。しかし、 この方法はおすすめしません。

データベースの定義の取得

既存のデータベースから定義配列を取得するには getDefinitionFromDatabase() を使用します。

<?php
require_once 'MDB2/Schema.php';

$options = array(
    'log_line_break' => '<br>',
    'idxname_format' => '%s',
    'debug' => true,
    'quote_identifier' => true,
    'force_defaults' => false,
    'portability' => false
);
$dsn = 'mysql://root:@localhost/MDB2Example';

$schema =& MDB2_Schema::factory($dsn, $options);

if (PEAR::isError($schema)) {
    $error = $schema->getMessage();
} else {
    // このメソッドは、データベースの定義を「何とかして」
    // 取得するようがんばります。念のため、期待通りの結果が得られるかどうかを
    // テストしてください。
    $definition = $schema->getDefinitionFromDatabase();

    if (PEAR::isError($definition)) {
      $error = $definition->getMessage();
    }
}

if (isset($error)) {
  var_dump($error);
}

$schema->disconnect();
?>

手動で作成したデータベースに対してこのメソッドを使用する場合は、 十分な注意が必要です。情報が正しく取得できない可能性もあります。 しかし、MDB2_Schema で作成したデータベースに関しては、 このメソッドは安心して使用でき、毎回同じ $definition を返します。

データベースの定義のパース

スキーマファイルから定義配列を取得するには、 parseDatabaseDefinitionFile() を使用します。

<?php
require_once 'MDB2/Schema.php';

$options = array(
    'log_line_break' => '<br>',
    'idxname_format' => '%s',
    'debug' => true,
    'quote_identifier' => true,
    'force_defaults' => false,
    'portability' => false
);
$dsn = 'mysql://root:@localhost/MDB2Example';

$schema =& MDB2_Schema::factory($dsn, $options);

if (PEAR::isError($schema)) {
    $error = $schema->getMessage();
} else {
    $definition = $schema->parseDatabaseDefinitionFile('schema.xml');

    if (PEAR::isError($definition)) {
      $error = $definition->getMessage();
    }
}

if (isset($error)) {
  var_dump($error);
}

$schema->disconnect();
?>

このメソッドにはいくつかのパラメータがありますが、 必須なのは最初のパラメータだけです。