ZMySQLDA
ハマり中です。
現象:
ZMySQLDA 経由のアクセスで、varchar のカラムにアクセスすると以前は'123.4'のように文字列で帰ってきたものが、array(c, 123.4)の形式で戻ってくるようになった
動いていた環境: FedoraCore1 Python 2.3.3 Zope 2.7.2 MySQL-python 1.0.0 ZMySQLDA 2.0.8 MySQL 3.23.58
動いてない環境: FedoraCore3 Python 2.4.0 Zope 2.7.4 MySQL-python 1.0.0 ZMySQLDA 2.0.8 MySQL 3.23.58
やってみたこと:
- x.val を x.val[1] にしてみる
⇒ insufficient privilleges
- x.val を x.val.tostring() にしてみる(array()型を文字列に変換するmethod)
⇒ insufficient privilleges
- 該当Python Script のProxy Role を Manager に設定
⇒ insufficient privilleges
- 該当インスタンス のProducts フォルダに Global というフォルダを掘り __init.py__を作成
from Products.PythonScripts.Utility import allow_module from AccessControl import ClassSecurityInfo security = ClassSecurityInfo() security.setDefaultAccess(allow) allow_module(csv) allow_module(datetime) allow_module(time) allow_module(cStringIO) allow_module(gdchart) allow_module(array)
して、Python Script 内で from array import array を追加
⇒ やっぱりinsufficient privilleges
考えてみれば、Name Error が出てないんだから・・・
- MySQL-python は 検索したら、1.0.1 が出てたのでいれかえてみる
⇒ やっぱりinsufficient privilleges
よくみてみたら、セキュリティパッチぽかったです。
Traceback (most recent call last):
File "/home/zope/lib/python/ZPublisher/Publish.py", line 101, in publish
request, bind=1)
File "/home/zope/lib/python/ZPublisher/mapply.py", line 88, in mapply
if debug is not None: return debug(object,args,context)
File "/home/zope/lib/python/ZPublisher/Publish.py", line 39, in call_object
result=apply(object,args) # Type s to step into published object.
File "/home/zope/lib/python/Shared/DC/Scripts/Bindings.py", line 306, in __call__
return self._bindAndExec(args, kw, None)
File "/home/zope/lib/python/Shared/DC/Scripts/Bindings.py", line 343, in _bindAndExec
return self._exec(bound_data, args, kw)
File "/home/zope/lib/python/Products/PythonScripts/PythonScript.py", line 323, in _exec
result = f(args, *kw)
File "Script (Python)", line 39, in wcps
File "/home/zope/lib/python/AccessControl/ImplPython.py", line 554, in guarded_getattr
if validate(inst, inst, name, v):
File "/home/zope/lib/python/AccessControl/ImplPython.py", line 404, in validate
self._context)
File "/home/zope/FirstInstance/Products/VerboseSecurity/VerboseSecurityPolicy.py", line 167, in validate
raise Unauthorized(info)
Unauthorized: The container has no security assertions. Access to tostring of array(c, 137.7) denied.
解決?しました
しかたないのでZMySQLDA を追っていったら、MySQL-python につきました(あたりまえ)
src/MySQL-Python-1.0.0/MySQLdb/ か site-package/MySQLdb/ へ行って、converters.py を探します。
その中に conversion という table(dict型)があります。これで、query result の型変換をしてます。
で、そこをみると、
FIELD_TYPE.BLOB: [
(FLAG.BINARY, char_array),
(None, None),
],
となってて、BINARYだと char_array()内で、array(c, 内容) を呼ぶようになってます。
よくわかりませんが、2.3.4 までだと FLAG.BINARYは成立しなくて、2.4 だと成立してしまうため、ハマり元の現象が発生したようです。
で、この現象の究明は棚上げにして(ぉ_ぃ)、(FLAG.BINARY, char_array), をコメントアウトすると、以前と同じ動作になります。