CakePHP

今更PHP4.3.2+PostgreSQL7.3で CakePHP1.2.5をどうしても動かしたい!(2日目)

前日に引き続き検証。
なんとか動いた(?)ので、それまでの軌跡を記します。

スポンサーリンク

information_schemaの対処

PostgreSQL7.4未満ではinformation_schemaは使えないので、代替手段を使います。
dbo_postgres.php内のDboPostgres::listSources()の定義にあるSQLを修正します。

//$sql = "SELECT table_name as name FROM INFORMATION_SCHEMA.tables WHERE table_schema = '{$schema}';";
$sql = "SELECT tablename as name FROM pg_tables WHERE schemaname = '{$schema}';";

テーブル名を取ってきてるだけなので、これで良さそうです。
次は。。。

information_schema絡みの部分がもう一箇所あります。
場所はDboPostgres::describe()です。ここの$this->fetchAll()で使われているSQLを修正します。マニュアル見ながら四苦八苦してなんとかしました。

$cols = $this->fetchAll(
    /*
    "SELECT DISTINCT column_name AS name, data_type AS type, is_nullable AS null,
        column_default AS default, ordinal_position AS position, character_maximum_length AS char_length,
        character_octet_length AS oct_length FROM information_schema.columns
    WHERE table_name = " . $this->value($table) . " AND table_schema = " .
    $this->value($this->config['schema'])."  ORDER BY position",
    */
    "SELECT DISTINCT
      pg_attribute.attname AS name,
      pg_type.typname AS type,
      CASE pg_attribute.attnotnull WHEN 't' THEN 'NO' WHEN 'f' THEN 'YES' END AS null,
      pg_attrdef.adsrc AS default,
      pg_attribute.attnum AS position,
      nullif(pg_attribute.atttypmod, -1) AS char_length,
      CASE pg_type.typname WHEN 'text' THEN 1073741824 WHEN 'varchar' THEN 1073741824 ELSE null END AS oct_length
    FROM pg_attribute
      LEFT JOIN pg_stat_user_tables ON pg_attribute.attrelid = pg_stat_user_tables.relid 
      LEFT JOIN pg_type ON pg_attribute.atttypid = pg_type.oid
      LEFT JOIN pg_attrdef ON pg_attribute.attrelid = pg_attrdef.adrelid AND pg_attribute.attnum = pg_attrdef.adnum
    WHERE pg_attribute.attnum > 0
      AND pg_attribute.atttypid > 0
      AND pg_stat_user_tables.relname = " . $this->value($table) . " 
      AND pg_stat_user_tables.schemaname = " . $this->value($this->config['schema']) . " ORDER BY position",
    false
);

char_lengthは指定されている文字数+4になってしまうので間違っていると思われますが、支障ないのでとりあえずこれで済ましておきます。
それよりoct_lengthが問題。文字列型の時だけ必要になる値ですが、マニュアルをあさってもこれにあたる情報が見つかりません。。。仕方ないのでやっつけで、よくつかうtextとvarcharの場合だけ1073741824を返すようにしました。かなりいい加減なことやってますが、多分通用します。

レッツBake!

bakeコマンドで焼きます。ソース修正前で引っ掛かっていたモデルの生成も順調、順調♪・・・

のぉおおおー!なんかでたーw

Warning: pg_query(): Query failed: ERROR:  No such attribute i.indisvalid

indisvalidってカラムがpg_catalog.pg_indexに存在しないらしいです。たしかに無い。よくわからんので無視します(オイ

動作しました

最終的にはモデルの生成でエラーが出るものの、コントローラとビューは順調に作れました。そして、試しにレコードの追加、削除などをしてみましたが、エラーなども出ることなく順調です。
とりあえずこれで進めていくことにします。

きっと今後もなにか問題にぶち当たると思うので、そのつどいろいろ記していきたいと思いまふ。

スポンサーリンク
管理人

システムえんじにゃー🐈
趣味はエレキギターなど。作曲したい。
WoWs/プリコネ
記事に関する質問はお気軽にどうぞ。

surface0 (さーふぇす)をフォローする
surface0 (さーふぇす)をフォローする

コメント

タイトルとURLをコピーしました