Dne 12.1.2012 16:19, Philippe Makowski napsal(a):
> hum,
> 
> this part of code is really important, and I am lost (but that's not
> really a surprise for me)
> 
> if I do :
> def
> build_dpb(user,password,sql_dialect,role,charset,buffers,force_write,no_reserve,db_key_scope):
>     params = [str(isc_dpb_version1)]
> 
>     def addString(codeAsByte, s):
>         #assert isinstance(codeAsByte,types.IntType) and codeAsByte >= 0
> and codeAsByte <= 255
>         sLen = len(s)
>         if sLen >= 256:
>             # Because the length is denoted in the DPB by a single byte.
>             raise ProgrammingError("Individual component of database"
>                 " parameter buffer is too large.  Components must be less"
>                 " than 256 bytes."
>               )
>         format = 'ii%ds' % sLen # like 'ii50s' for a 50-byte string
>         newEntry = struct.pack(format, codeAsByte, sLen, s)
>         params.append(newEntry.decode())
>     def addInt(codeAsByte, value):
>         #assert isinstance(codeAsByte,types.IntType) and codeAsByte >= 0
> and codeAsByte <= 255
>         if not isinstance(value, int) or value < 0 or value > 255:
>             raise ProgrammingError("The value for an integer DPB code
> must be"
>                 " an int or long with a value between 0 and 255."
>               )
>         newEntry = struct.pack('ipi', codeAsByte, b'\x01', value)
>         params.append(newEntry.decode())
> 
>     if user:
>         addString(isc_dpb_user_name,user.encode("utf8"))
>     if password:
>         addString(isc_dpb_password,password.encode("utf8"))
>     if role:
>         addString(isc_dpb_sql_role_name,role.encode("utf8"))
>     if sql_dialect:
>         addInt(isc_dpb_sql_dialect,sql_dialect)
>     if charset:
>         addString(isc_dpb_lc_ctype, charset.encode("utf8"))
>     if buffers:
>         addInt(isc_dpb_num_buffers,buffers)
>     if force_write:
>         addInt(isc_dpb_force_write,force_write)
>     if no_reserve:
>         addInt(isc_dpb_no_reserve,no_reserve)
>     if db_key_scope:
>         addInt(isc_dpb_dbkey_scope,db_key_scope)
>     return ''.join(params)
> 
> then I have a ctype error, of course
> ibase.isc_attach_database(_isc_status,len(dsn),dsn,_db_handle,len(dpb),dpb)
> ctypes.ArgumentError: argument 6: <class 'TypeError'>: wrong type
> 
> 
> so we really need to find how to fix this part of code for Python3
> 
> build_dpb in fbcore have to be change
> but I don't know how yet :(

Which type is 'dpb' (the sixth parameter passed to isc_attach_database)
? It's bytes or str? In ctypes description, this parameter is of type
STRING, which allows passing Python strings easily (as is). In Python 2
it means type <str>, which is something different in Python 3.

So there are several possible scenarios:

1) We're passing <str> instead <bytes>, and ctypes.STRING means <bytes>.
Then we simply need to create 'dpb' as <bytes>.
2) We're passing <bytes>, but ctypes.STRING expects <str> under P3. Then
we have to change the definition for this parameter in IBASE to
something else (see 'buf_pointer' type and it's use in fbcore.py).

But I think that we're facing case 1 here.

BTW, the same case is with tpb.

best regards
Pavel Cisar

Reply via email to