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

  • このエントリーをはてなブックマークに追加

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

information_schemaの対処

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

[php]
//$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}’;”;
[/php]

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

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

[php]
$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
);
[/php]

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に存在しないらしいです。たしかに無い。よくわからんので無視します(オイ

動作しました

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

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

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。




コメントを残す