Personal tools
You are here: Home Wiki ZMySQLDA

ZMySQLDA

Document Actions
last edited 7 years ago by jack

ハマり中です。

現象:

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), をコメントアウトすると、以前と同じ動作になります。

 
そちらのOSの時刻なので 正確性はあなた次第
 
こういう意味のないの好き
 
本をお勧め中
 
CDもお勧め中
のだめカンタービレ ベスト100
ドラマの演奏とは違います。でもこの感じでこの価格ならアリかと
 
消耗品や家電
 
よく使うサイト
社名ロゴ88×631
 
ぐぐってみる
 
誰が使うんだろう
 

Powered by Plone