Package: libxbase2.0-0
Version: 2.0.0-8.2
Severity: important
--- Please enter the report below this line. ---
The library is pretty unusable for writing to dbf file on amd64. The
same source, recompiled under i386 works fine.
I'm attaching the program I'm talking about (GPL). The resulting .dbf
file is completely broken, no field has a meaningful content. The
software is a bit messy, but should be readable.
Cheers
--- System information. ---
Architecture: amd64
Kernel: Linux 2.6.24-1-amd64
Debian Release: lenny/sid
500 unstable www.debian-multimedia.org
500 unstable ftp.it.debian.org
--- Package information. ---
Depends (Version) | Installed
==============================-+-================
libc6 (>= 2.7-1) | 2.7-9
libgcc1 (>= 1:4.1.1-21) | 1:4.3.0-1
libstdc++6 (>= 4.2.1-4) | 4.3.0-1
--
Enrico Tassi
#include <iostream>
#include <xbase/xbase.h>
#include <ctype.h>
using namespace std;
int main(int argn, char**argv)
{
#define LIBROID 5
#define CODEDI 3
#define CODSET 7
xbSchema new_book_layout[] =
{
{"AUTORE" ,XB_CHAR_FLD ,70 ,0 },
{"TITOLO" ,XB_CHAR_FLD ,70 ,0 },
{"COLLANA" ,XB_CHAR_FLD ,30 ,0 },
{"codEDITORE" ,XB_NUMERIC_FLD ,CODEDI ,0 },
{"codSETTORE" ,XB_CHAR_FLD ,CODSET ,0 },
{"TEMI" ,XB_MEMO_FLD ,10 ,0 },
{"EDIZIONE" ,XB_NUMERIC_FLD ,4 ,0 },
{"ACQUISTO" ,XB_NUMERIC_FLD ,4 ,0 },
{"COLLOCATO" ,XB_CHAR_FLD ,5 ,0 },
{"PRESTATO" ,XB_LOGICAL_FLD ,1 ,0 },
{"LIBROid" ,XB_NUMERIC_FLD ,LIBROID,0 },
{ "",0,0,0 }
};
/* define the classes */
xbXBase x; /* initialize xbase */
xbDbf db_libri( &x ); /* class for table */
xbNdx in_id_libro( &db_libri );
xbShort rc;
db_libri.SetVersion( 3 ); /* create dbase III style files */
cout << "Creo il dbase" << argv[2] << "\n";
if(( rc = db_libri.CreateDatabase( argv[2], new_book_layout , XB_OVERLAY )) != XB_NO_ERROR )
{
cout << "Error creating database libri.dbf : " ; x.DisplayError(rc); cout << "\n";
exit(1);
}
if(( rc = in_id_libro.CreateIndex( "xxxx", "LIBROid" , XB_UNIQUE, XB_OVERLAY )) != XB_NO_ERROR )
{
cout << "Error creating database libri.dbf : " ; x.DisplayError(rc); cout << "\n";
exit(1);
}
cout << "Travaso i dati da "<< argv[1] <<"\n";
xbDbf db_oldlibri(&x);
rc = db_oldlibri.OpenDatabase( argv[1] );
if( rc != XB_NO_ERROR )
{
x.DisplayError(rc);
exit(1);
}
xbShort OLD_TITOLO = db_oldlibri.GetFieldNo("TITOLO");
xbShort OLD_CODSET = db_oldlibri.GetFieldNo("codSETTORE");
xbShort OLD_CODEDI = db_oldlibri.GetFieldNo("codEDITORE");
xbShort OLD_AUTORE = db_oldlibri.GetFieldNo("AUTORE");
xbShort OLD_COLLANA = db_oldlibri.GetFieldNo("COLLANA");
xbShort OLD_TEMI = db_oldlibri.GetFieldNo("TEMI");
xbShort OLD_EDIZIONE = db_oldlibri.GetFieldNo("EDIZIONE");
xbShort OLD_ACQUISTO = db_oldlibri.GetFieldNo("ACQUISTO");
xbShort OLD_COLLOCATO = db_oldlibri.GetFieldNo("COLLOCATO");
xbShort OLD_PRESTATO = db_oldlibri.GetFieldNo("PRESTATO");
xbShort NEW_TITOLO = db_libri.GetFieldNo("TITOLO");
xbShort NEW_CODSET = db_libri.GetFieldNo("codSETTORE");
xbShort NEW_CODEDI = db_libri.GetFieldNo("codEDITORE");
xbShort NEW_AUTORE = db_libri.GetFieldNo("AUTORE");
xbShort NEW_COLLANA = db_libri.GetFieldNo("COLLANA");
xbShort NEW_TEMI = db_libri.GetFieldNo("TEMI");
xbShort NEW_EDIZIONE = db_libri.GetFieldNo("EDIZIONE");
xbShort NEW_ACQUISTO = db_libri.GetFieldNo("ACQUISTO");
xbShort NEW_COLLOCATO = db_libri.GetFieldNo("COLLOCATO");
xbShort NEW_PRESTATO = db_libri.GetFieldNo("PRESTATO");
xbShort NEW_ID = db_libri.GetFieldNo("LIBROid");
xbShort old_fields[9] = {
OLD_TITOLO, OLD_CODSET, OLD_CODEDI,
OLD_AUTORE, OLD_COLLANA,
OLD_EDIZIONE, OLD_ACQUISTO, OLD_COLLOCATO,
OLD_PRESTATO
};
xbShort new_fields[9] = {
NEW_TITOLO, NEW_CODSET, NEW_CODEDI,
NEW_AUTORE, NEW_COLLANA,
NEW_EDIZIONE, NEW_ACQUISTO, NEW_COLLOCATO,
NEW_PRESTATO
};
#define TMPLEN 65540
xbLong number=0;
char tmp[TMPLEN]="";
db_oldlibri.GetFirstRecord();
while(rc == XB_NO_ERROR)
{
rc = db_libri.BlankRecord();
if ( rc != XB_NO_ERROR ) { cout << "blanking " << number << " : "; x.DisplayError(rc); cout << "\n"; exit(1); }
for (int id = 0; id < 9; id ++){
bzero(tmp,TMPLEN);
rc = db_oldlibri.GetField(old_fields[id],tmp);
if ( rc == 0 ) { cout << id << number << " :: "; x.DisplayError(rc); cout << "\n"; exit(1); }
if( (id == 5 || id == 6) && !isdigit(tmp[0])) tmp[0]='\0';;
if( (id == 5 || id == 6) && !isdigit(tmp[1])) tmp[1]='\0';;
if( (id == 5 || id == 6) && !isdigit(tmp[2])) tmp[2]='\0';
if( (id == 5 || id == 6) && !isdigit(tmp[3])) tmp[3]='\0';
rc = db_libri.PutField(new_fields[id],tmp);
if ( rc != XB_NO_ERROR ) { cout << id << number << " : "; x.DisplayError(rc); cout << "\n"; exit(1); }
}
// temi
bzero(tmp,TMPLEN);
db_oldlibri.GetMemoField(OLD_TEMI,TMPLEN,tmp,F_SETLKW);
xbLong l = db_oldlibri.GetMemoFieldLen(OLD_TEMI);
db_libri.UpdateMemoData(NEW_TEMI,l,tmp,F_SETLKW);
tmp[l]=0;
cout << "MEMO: " << tmp << endl;
// id
rc = db_libri.PutLongField(NEW_ID,number);
if ( rc != XB_NO_ERROR ) { cout << "id -> " << number << " : "; x.DisplayError(rc); cout << "\n"; exit(1); }
number++;
rc = db_libri.AppendRecord();
rc = db_oldlibri.GetNextRecord();
}
rc = db_oldlibri.CloseDatabase();
x.DisplayError(rc);
rc = db_libri.CloseDatabase(); /* Close database and associated indexes */
x.DisplayError(rc);
return 0;
}