2016-03-29 3 views
0

Derzeit verwenden wir DCORacle2 Oracle-Bindung für Python.Segmentierungsfehler in DCOracle2 Oracle-Datenbankbindungen für Python

DCOracle2 wird nicht mehr gewartet, aber wir verwenden es aufgrund von Einschränkungen in der Vergangenheit. Wenn ich versuche, 'SQLT_CLOB' mit einer höheren Datengröße zu erstellen, stürzt es ab (Segmentierungsfehler).

Mit diesen Python-Code Segmentierungsfehlern wiedergegeben werden:

from DCOracle2 import DCOracle2,dbi 

connection = DCOracle2.connect(user='username', password='password',database='DBname') 
lob_locator = connection.LobLocator('SQLT_CLOB') 
data = '1' * 90000 
lob_locator.write(data) 
connection.procedures.your_schema_name.your_procedure_name(lob_locator) # This line causes segmentation fault 
connection.close() 

Dies ist die einfache Prozedur, die ich erstellt haben:

create or replace function proceclob(i_clob clob) return clob as 
l_tmp clob; 
begin 
    l_tmp := i_clob; 
    return l_tmp; 
end; 

Dies ist die Rückverfolgung, die ich nach segfault sehen:

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff69f5d80 in ??() from /lib/x86_64-linux-gnu/libc.so.6 
(gdb) where 
#0 0x00007ffff69f5d80 in ??() from /lib/x86_64-linux-gnu/libc.so.6 
#1 0x0000000000462e51 in PyString_FromStringAndSize() 
#2 0x00007ffff5da612f in listDescriptors (self=0x7ffff7e898f0, parmh=0x7ffff00ec768, entry=0x7ffff5fb0fa0, current=<optimized out>) at src/dco2.c:2293 
#3 0x00007ffff5da69ea in ServerContext_describe (self=0x7ffff7e898f0, args=<optimized out>) at src/dco2.c:2425 
#4 0x000000000056d4a4 in PyEval_EvalFrameEx() 
#5 0x000000000056dc92 in PyEval_EvalFrameEx() 
#6 0x000000000056dc92 in PyEval_EvalFrameEx() 
#7 0x00000000005747c0 in PyEval_EvalCodeEx() 
#8 0x00000000005697b0 in ??() 
#9 0x000000000043a8b6 in PyObject_Call() 
#10 0x000000000043b626 in PyEval_CallObjectWithKeywords() 
#11 0x00000000004fdc2a in ??() 
#12 0x000000000056d54e in PyEval_EvalFrameEx() 
#13 0x00000000005747c0 in PyEval_EvalCodeEx() 
#14 0x0000000000569ee1 in PyRun_FileExFlags() 
#15 0x000000000056a6b3 in PyRun_SimpleFileExFlags() 
#16 0x000000000056ba75 in Py_Main() 
#17 0x00007ffff68cd76d in __libc_start_main() from /lib/x86_64-linux-gnu/libc.so.6 
#18 0x000000000041bb11 in _start() 

PS: Dieser Code funktioniert perfekt mit Python 2.6, stürzt aber für Python 2.7 ab und über Versionen.

Ich habe versucht, Python mit GDB zu debuggen, konnte aber keinen bestimmten Grund finden. DCOracle2-Version, die wir verwenden, ist 1.3 (Neueste)

Bitte geben Sie alle Hinweise, wenn möglich.

Antwort

0

Ich könnte das Problem lösen. Das Problem war: Oracle-Header definieren typedef 'ub4' als 'unsigned int' auf einigen Plattformen und 'unsigned long int' auf einigen Plattformen. Auf meiner Plattform wurde 'UB4' als 'unsigned int' definiert, was eine 'Out of Bounds'-Ausnahme verursachte, weil der Zeiger auf einen größeren Datenblock zeigte.