윈도와 리눅스에서 동시에 작동하는 프로그램입니다.
DB에 아주 긴 스트링(100KB 이상)을 저장하고 불러오는 건데요.
윈도에서는 바르게 동작하는 데, 리눅스에선 문제가 생깁니다.
개발 환경은 windows : delphi 7, linux : kylix 3 입니다.
DB는 서버 오라클 9i, 클라이언트 9i, DBexpr의 TSQLConnection, TSQLQuery 사용합니다.
문제가 되는 것은 long type column 입니다.
DB 연결부분입니다.
<!--CodeS-->
SqlConn := TSQLConnection.Create(Nil);
SqlConn.DriverName := 'Oracle';
SqlConn.GetDriverFunc := 'getSQLDriverORACLE';
{$IFDEF MSWINDOWS}
Sqlconn.LibraryName := 'dbexpora.dll';
Sqlconn.VendorLib := 'oci.dll';
SqlConn.Params.Add('Database=ORCA');
{$ELSE}
Sqlconn.LibraryName := './libsqlora.so';
Sqlconn.VendorLib := './libclntsh.so';
SqlConn.Params.Add('Database=ORCA');
{$ENDIF}
SqlConn.Params.Add('DriverName=Oracle');
SqlConn.Params.Add('HostName=DbServer');
SqlConn.Params.Add('User_Name=user');
SqlConn.Params.Add('Password=pass');
SqlConn.Params.Add('BlobSize=-1'); //-------------- (1)
SqlConn.Params.Add('RowSetSize=50');
SqlConn.Params.Add('ErrorResourceFile=./ErrOracle.msg');
SqlConn.LoginPrompt := false;
SqlConn.Connected := true;
Qry1 := TSQLQuery.Create(Nil);
Qry1.SQLConnection := SqlConn;
문제의 부분입니다.
Qry1.SQL.Clear;
Qry1.SQL.Add('select ID, Dna from maza2 where inuse = ' // DNA가 long type
+ IntToStr(CID));
Qry1.Prepared := true;
Qry1.Open;
while not Qry1.Eof do begin
ID := Qry1['ID'];
// TempStr := Qry1['Dna']; //----------- (2) windows에서는 된다.
SS := TStringStream.Create(s);
try
TBlobField(Qry1.FieldByName('Dna')).SaveToStream(SS);
SS.Seek(0, soFromBeginning);
TempStr := SS.ReadString(high(integer));
finally
SS.Free;
end;
write(id,'-',length(TempStr), ':'); //--- (3) 여기서 값을 확인.
//........후략
<!--CodeE-->
윈도에서 할 때는 (2)와 같이 했는데 잘 되더군요. 그래서 스트림은 사용하지 않았습니다.
리눅스에서 컴파일 후 실행하니 65536으로만 나옵니다. 스트림으로 바꾸어서 해 봤는데
결과는 마찬가지입니다. 여기서 SS는 TStringStream, s는 dummy용 string입니다.
고수님들의 도움 부탁드립니다.
현재까지의 추적 결과로는 libsqlora.so 파일에 버그가 있는 듯합니다.
getblobsize인가하는 함수가 65536을 반환하는것은 확인이 되었습니다.
의외로 카일릭스 프로그램하기가 만만치 않네요. :(
redhat linux 7.3 kernel 2.4.21 patch,
libsqlora.so는 2002년 7월 31일자 313880 Byte 입니다.
이후의 버전이나 버그 패치에 대한 정보나
버그를 회피할 수 있는 방법의 추천을 바랍니다.
볼랜드 페이지는 사용이 너무 어려워서... T.T