Piece_ORM でpostgresqlの配列カラムへのアクセス

60 views
Skip to first unread message

takapon

unread,
May 14, 2008, 4:20:53 AM5/14/08
to Piece Framework Users (ja)
内海です。お世話になります。

Piece_ORMでpostgresqlの配列型のカラムを含むテーブルに
アクセスしようとするとエラーとなります。

一度、配列型のカラムを削除してエラーなくアクセスした後、
配列型のカラムを追加すると、エラーなくアクセスできます。
(Piece_ORMのキャッシュフォルダをクリアするとアクセスできなくなります)

長いですが、下記にエラー内容をお知らせします。
配列型のカラム名はaryです。
宜しくお願いします。

環境:
OS:windowsXP
php5.2.2 Apache2.2.4 postgresql-8.3.1
Piece_ORM1.0.0
Piece_Unity1.4.0


----------------エラー内容--------------------------
array(8) {
["code"]=>
int(-1)
["params"]=>
array(0) {
}
["package"]=>
string(9) "Piece_ORM"
["level"]=>
string(9) "exception"
["time"]=>
float(1210751977.18)
["context"]=>
array(4) {
["file"]=>
string(48) "D:\xampp\php\PEAR\Piece\ORM\Metadata\Factory.php"
["line"]=>
int(255)
["function"]=>
string(27) "_createMetadataFromDatabase"
["class"]=>
string(26) "Piece_ORM_Metadata_Factory"
}
["message"]=>
string(55) "Failed to invoke $reverse->tableInfo() for any reasons."
["repackage"]=>
array(6) {
["code"]=>
int(-6)
["message"]=>
string(25) "MDB2 Error: not supported"
["params"]=>
array(2) {
["userinfo"]=>
string(1957) "_mapNativeDatatype: [Error message: unknown
database attribute type: _numeric]
[Last executed query: SELECT a.attname AS name,
t.typname AS type,
CASE a.attlen
WHEN -1 THEN
CASE t.typname
WHEN 'numeric' THEN (a.atttypmod / 65536)
WHEN 'decimal' THEN (a.atttypmod / 65536)
WHEN 'money' THEN (a.atttypmod / 65536)
ELSE CASE a.atttypmod
WHEN -1 THEN NULL
ELSE a.atttypmod - 4
END
END
ELSE a.attlen
END AS length,
CASE t.typname
WHEN 'numeric' THEN (a.atttypmod % 65536) - 4
WHEN 'decimal' THEN (a.atttypmod % 65536) - 4
WHEN 'money' THEN (a.atttypmod % 65536) - 4
ELSE 0
END AS scale,
a.attnotnull,
a.atttypmod,
a.atthasdef,
(SELECT substring(pg_get_expr(d.adbin,
d.adrelid) for 128)
FROM pg_attrdef d
WHERE d.adrelid = a.attrelid
AND d.adnum = a.attnum
AND a.atthasdef
) as default
FROM pg_attribute a,
pg_class c,
pg_type t
WHERE c.relname = 'mt_test'
AND a.atttypid = t.oid
AND c.oid = a.attrelid
AND NOT a.attisdropped
AND a.attnum > 0
AND a.attname = 'ary'
ORDER BY a.attnum]
"
["debuginfo"]=>
string(1957) "_mapNativeDatatype: [Error message: unknown
database attribute type: _numeric]
[Last executed query: SELECT a.attname AS name,
t.typname AS type,
CASE a.attlen
WHEN -1 THEN
CASE t.typname
WHEN 'numeric' THEN (a.atttypmod / 65536)
WHEN 'decimal' THEN (a.atttypmod / 65536)
WHEN 'money' THEN (a.atttypmod / 65536)
ELSE CASE a.atttypmod
WHEN -1 THEN NULL
ELSE a.atttypmod - 4
END
END
ELSE a.attlen
END AS length,
CASE t.typname
WHEN 'numeric' THEN (a.atttypmod % 65536) - 4
WHEN 'decimal' THEN (a.atttypmod % 65536) - 4
WHEN 'money' THEN (a.atttypmod % 65536) - 4
ELSE 0
END AS scale,
a.attnotnull,
a.atttypmod,
a.atthasdef,
(SELECT substring(pg_get_expr(d.adbin,
d.adrelid) for 128)
FROM pg_attrdef d
WHERE d.adrelid = a.attrelid
AND d.adnum = a.attnum
AND a.atthasdef
) as default
FROM pg_attribute a,
pg_class c,
pg_type t
WHERE c.relname = 'mt_test'
AND a.atttypid = t.oid
AND c.oid = a.attrelid
AND NOT a.attisdropped
AND a.attnum > 0
AND a.attname = 'ary'
ORDER BY a.attnum]
"
}
["package"]=>
string(4) "PEAR"
["level"]=>
string(9) "exception"
["time"]=>
float(1210751977.18)
}
}

takapon

unread,
May 14, 2008, 8:38:54 AM5/14/08
to Piece Framework Users (ja)
内海です。

すいません、肝心なことを書いていませんでした。

エラーは、
$mapper = &Piece_ORM::getMapper('テーブル名');
で起こります。


takapon

unread,
May 14, 2008, 9:52:29 PM5/14/08
to Piece Framework Users (ja)
内海@自己レスです。

エラー内容通り、MDB2のエラーなので、
MDB2_Driver_Datatype_pgsqlクラスの
_mapNativeDatatypeメソッドの
text , varchar と同じところに _varchar を追加して
対応しました。
配列型と言ってもphpで{}付きのテキストとして
受け取るのでこれで良しとします。
(この方法が正しいのか分かりませんが・・・)

お騒がせしました。

KUBO Atsuhiro

unread,
May 15, 2008, 5:23:18 AM5/15/08
to piece-framew...@googlegroups.com
久保です。

2008/05/15 10:52 takapon <tak...@pat.hi-ho.ne.jp>:

任意の型を MDB2 に対応させるための Piece_ORM API として下記のものがあります。

Piece_ORM_MDB2_NativeTypeMapper_Xxx::addMap($nativeType, $mdb2Type)

$nativeType にはエラーになった型、$mdb2Type には MDB2 の型のうち対象の
アプリケーションにとって最も適切だと考えられるものを設定します。

--
KUBO Atsuhiro e-mail: ku...@iteman.jp

takapon

unread,
May 15, 2008, 8:59:06 PM5/15/08
to Piece Framework Users (ja)
内海です。
久保さん、レス有り難うございます。

> 任意の型を MDB2 に対応させるための Piece_ORM API として下記のものがあります。
>
> Piece_ORM_MDB2_NativeTypeMapper_Xxx::addMap($nativeType, $mdb2Type)
>
> $nativeType にはエラーになった型、$mdb2Type には MDB2 の型のうち対象の
> アプリケーションにとって最も適切だと考えられるものを設定します。

上記方法で出来ました(^^)
やはり、ちゃんとした方法があるんですね。
MDB2のソースを直接変更するのは、邪道だと思いましたが、
他に方法が分からなくて・・・

もう少しドキュメントがそろっていたらいいのですが・・・
ソースを読めと言うことですかね・・・・・・・勉強します。

Reply all
Reply to author
Forward
0 new messages