前日に引き続き検証。
なんとか動いた(?)ので、それまでの軌跡を記します。
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に存在しないらしいです。たしかに無い。よくわからんので無視します(オイ
動作しました
最終的にはモデルの生成でエラーが出るものの、コントローラとビューは順調に作れました。そして、試しにレコードの追加、削除などをしてみましたが、エラーなども出ることなく順調です。
とりあえずこれで進めていくことにします。
きっと今後もなにか問題にぶち当たると思うので、そのつどいろいろ記していきたいと思いまふ。
コメント