Commit ca012682 authored by Olivier Bertrand's avatar Olivier Bertrand

- Fix huge vec tables bug. This was not yet completely implemented for Unix.

modified:
  storage/connect/filamvct.cpp
parent d8056905
......@@ -10,7 +10,7 @@
/* WHAT THIS PROGRAM DOES: */
/* ----------------------- */
/* This program are the VCT file access method classes. */
/* Added in version 2: */
/* Added in version 2: F */
/* - Split Vec format. */
/* - Partial delete. */
/* - Use of tempfile for update. */
......@@ -65,6 +65,7 @@
extern int num_read, num_there; // Statistics
static int num_write;
extern "C" int trace;
#if defined(UNIX)
// Add dummy strerror (NGC)
......@@ -302,10 +303,9 @@ int VCTFAM::Cardinality(PGLOBAL g)
else
sprintf(g->Message, MSG(NOT_FIXED_LEN), To_File, len, clen);
#ifdef DEBTRACE
htrc(" Computed max_K=%d Filen=%d Clen=%d\n",
card, len, clen);
#endif
if (trace)
htrc(" Computed max_K=%d Filen=%d Clen=%d\n", card, len, clen);
} else
card = 0;
......@@ -430,16 +430,15 @@ bool VCTFAM::OpenTableFile(PGLOBAL g)
PlugSetPath(filename, To_File, Tdbp->GetPath());
if (!(Stream = PlugOpenFile(g, filename, opmode))) {
#ifdef DEBTRACE
if (trace)
htrc("%s\n", g->Message);
#endif
return (mode == MODE_READ && errno == ENOENT)
? PushWarning(g, Tdbp) : true;
} // endif Stream
#ifdef DEBTRACE
if (trace)
htrc("File %s is open in mode %s\n", filename, opmode);
#endif
To_Fb = dbuserp->Openlist; // Keep track of File block
......@@ -601,10 +600,9 @@ int VCTFAM::ReadBuffer(PGLOBAL g)
OldBlk = CurBlk; // Last block actually read
} // endif oldblk
#ifdef DEBTRACE
htrc(" Read: CurNum=%d CurBlk=%d rc=%d\n",
CurNum, CurBlk, RC_OK);
#endif
if (trace)
htrc(" Read: CurNum=%d CurBlk=%d rc=%d\n", CurNum, CurBlk, RC_OK);
return rc;
} // end of ReadBuffer
......@@ -613,10 +611,9 @@ int VCTFAM::ReadBuffer(PGLOBAL g)
/***********************************************************************/
int VCTFAM::WriteBuffer(PGLOBAL g)
{
#ifdef DEBTRACE
if (trace)
htrc("VCT WriteBuffer: R%d Mode=%d CurNum=%d CurBlk=%d\n",
Tdbp->GetTdb_No(), Tdbp->GetMode(), CurNum, CurBlk);
#endif
if (Tdbp->GetMode() == MODE_UPDATE) {
// Mode Update is done in ReadDB, we just initialize it here
......@@ -706,20 +703,20 @@ int VCTFAM::WriteBuffer(PGLOBAL g)
int VCTFAM::DeleteRecords(PGLOBAL g, int irc)
{
bool eof = false;
#ifdef DEBTRACE
fprintf(debug,
"VCT DeleteDB: rc=%d UseTemp=%d Fpos=%d Tpos=%d Spos=%d\n",
if (trace)
htrc("VCT DeleteDB: rc=%d UseTemp=%d Fpos=%d Tpos=%d Spos=%d\n",
irc, UseTemp, Fpos, Tpos, Spos);
#endif
if (irc != RC_OK) {
/*******************************************************************/
/* EOF: position Fpos at the end-of-file position. */
/*******************************************************************/
Fpos = (Block - 1) * Nrec + Last;
#ifdef DEBTRACE
if (trace)
htrc("Fpos placed at file end=%d\n", Fpos);
#endif
eof = UseTemp && !MaxBlk;
} else // Fpos is the Deleted line position
Fpos = CurBlk * Nrec + CurNum;
......@@ -753,14 +750,13 @@ int VCTFAM::DeleteRecords(PGLOBAL g, int irc)
/*******************************************************************/
/* Reposition the file pointer and set Spos. */
/*******************************************************************/
#ifdef DEBTRACE
#ifdef _DEBUG
assert(Spos == Fpos);
#endif
Spos++; // New start position is on next line
#ifdef DEBTRACE
if (trace)
htrc("after: Tpos=%d Spos=%d\n", Tpos, Spos);
#endif
} else {
/*******************************************************************/
......@@ -808,9 +804,9 @@ int VCTFAM::DeleteRecords(PGLOBAL g, int irc)
close(h);
#ifdef DEBTRACE
if (trace)
htrc("done, h=%d irc=%d\n", h, irc);
#endif
} else
// Clean the unused space in the file, this is required when
// inserting again with a partial column list.
......@@ -850,9 +846,9 @@ bool VCTFAM::OpenTempFile(PGLOBAL g)
opmode = "wb";
if (!(T_Stream = PlugOpenFile(g, tempname, opmode))) {
#ifdef DEBTRACE
if (trace)
htrc("%s\n", g->Message);
#endif
rc = true;
} else
To_Fbt = PlgGetUser(g)->Openlist;
......@@ -898,9 +894,8 @@ bool VCTFAM::MoveIntermediateLines(PGLOBAL g, bool *b)
len = fread(To_Buf, Clens[i], req, Stream);
#ifdef DEBTRACE
if (trace)
htrc("after read req=%d len=%d\n", req, len);
#endif
if (len != req) {
sprintf(g->Message, MSG(DEL_READ_ERROR), (int) req, (int) len);
......@@ -928,9 +923,9 @@ bool VCTFAM::MoveIntermediateLines(PGLOBAL g, bool *b)
} // endif UseTemp
#ifdef DEBTRACE
if (trace)
htrc("after write pos=%d\n", ftell(Stream));
#endif
} // endfor i
Tpos += (int)req;
......@@ -959,9 +954,9 @@ bool VCTFAM::MoveIntermediateLines(PGLOBAL g, bool *b)
} // endif UseTemp
#ifdef DEBTRACE
if (trace)
htrc("loop: Tpos=%d Spos=%d\n", Tpos, Spos);
#endif
} // endfor n
return false;
......@@ -1094,10 +1089,10 @@ void VCTFAM::CloseTableFile(PGLOBAL g)
if (!(UseTemp && T_Stream))
rc = PlugCloseFile(g, To_Fb);
#ifdef DEBTRACE
if (trace)
htrc("VCT CloseTableFile: closing %s wrc=%d rc=%d\n",
To_File, wrc, rc);
#endif
Stream = NULL;
} // end of CloseTableFile
......@@ -1168,10 +1163,9 @@ bool VCTFAM::ReadBlock(PGLOBAL g, PVCTCOL colp)
else // Blocked vector format
len = Nrec * (colp->Deplac + Lrecl * CurBlk);
#ifdef DEBTRACE
if (trace)
htrc("len=%d Nrec=%d Deplac=%d Lrecl=%d CurBlk=%d maxblk=%d\n",
len, Nrec, colp->Deplac, Lrecl, CurBlk, MaxBlk);
#endif
if (fseek(Stream, len, SEEK_SET)) {
sprintf(g->Message, MSG(FSEEK_ERROR), strerror(errno));
......@@ -1188,15 +1182,15 @@ bool VCTFAM::ReadBlock(PGLOBAL g, PVCTCOL colp)
sprintf(g->Message, MSG(READ_ERROR),
To_File, strerror(errno));
#ifdef DEBTRACE
if (trace)
htrc(" Read error: %s\n", g->Message);
#endif
return true;
} // endif
#ifdef DEBTRACE
if (trace)
num_read++;
#endif
return false;
} // end of ReadBlock
......@@ -1220,10 +1214,9 @@ bool VCTFAM::WriteBlock(PGLOBAL g, PVCTCOL colp)
else // Old VCT format
len = Nrec * (colp->Deplac + Lrecl * colp->ColBlk);
#ifdef DEBTRACE
if (trace)
htrc("modif=%d len=%d Nrec=%d Deplac=%d Lrecl=%d colblk=%d\n",
Modif, len, Nrec, colp->Deplac, Lrecl, colp->ColBlk);
#endif
if (fseek(T_Stream, len, SEEK_SET)) {
sprintf(g->Message, MSG(FSEEK_ERROR), strerror(errno));
......@@ -1239,9 +1232,10 @@ bool VCTFAM::WriteBlock(PGLOBAL g, PVCTCOL colp)
(size_t)colp->Clen, n, T_Stream)) {
sprintf(g->Message, MSG(WRITE_STRERROR),
(UseTemp) ? To_Fbt->Fname : To_File, strerror(errno));
#ifdef DEBTRACE
if (trace)
htrc("Write error: %s\n", strerror(errno));
#endif
return true;
} // endif
......@@ -1310,9 +1304,9 @@ bool VCMFAM::OpenTableFile(PGLOBAL g)
&& fp->Count && fp->Mode == mode)
break;
#ifdef DEBTRACE
if (trace)
htrc("Mapping VCM file, fp=%p cnt=%d\n", fp, fp->Count);
#endif
} else
fp = NULL;
......@@ -1368,9 +1362,9 @@ bool VCMFAM::OpenTableFile(PGLOBAL g)
sprintf(g->Message, MSG(OPEN_MODE_ERROR),
"map", (int) rc, filename);
#ifdef DEBTRACE
if (trace)
htrc("%s\n", g->Message);
#endif
return (mode == MODE_READ && rc == ENOENT)
? PushWarning(g, Tdbp) : true;
} // endif hFile
......@@ -1420,10 +1414,9 @@ bool VCMFAM::OpenTableFile(PGLOBAL g)
To_Fb = fp; // Useful when closing
#ifdef DEBTRACE
if (trace)
htrc("fp=%p count=%d MapView=%p len=%d Top=%p\n",
fp, fp->Count, Memory, len);
#endif
return AllocateBuffer(g);
} // end of OpenTableFile
......@@ -1523,10 +1516,9 @@ bool VCMFAM::InitInsert(PGLOBAL g)
/***********************************************************************/
int VCMFAM::WriteBuffer(PGLOBAL g)
{
#ifdef DEBTRACE
if (trace)
htrc("VCM WriteBuffer: R%d Mode=%d CurNum=%d CurBlk=%d\n",
Tdbp->GetTdb_No(), Tdbp->GetMode(), CurNum, CurBlk);
#endif
// Mode Update being done in ReadDB we process here Insert mode only.
if (Tdbp->GetMode() == MODE_INSERT) {
......@@ -1568,20 +1560,19 @@ int VCMFAM::DeleteRecords(PGLOBAL g, int irc)
int i;
int m, n;
#ifdef DEBTRACE
fprintf(debug,
"VCM DeleteDB: irc=%d tobuf=%p Tpos=%p Spos=%p\n",
if (trace)
htrc("VCM DeleteDB: irc=%d tobuf=%p Tpos=%p Spos=%p\n",
irc, To_Buf, Tpos, Spos);
#endif
if (irc != RC_OK) {
/*******************************************************************/
/* EOF: position Fpos at the top of map position. */
/*******************************************************************/
Fpos = (Block - 1) * Nrec + Last;
#ifdef DEBTRACE
if (trace)
htrc("Fpos placed at file top=%p\n", Fpos);
#endif
} else // Fpos is the Deleted line position
Fpos = CurBlk * Nrec + CurNum;
......@@ -1627,17 +1618,16 @@ int VCMFAM::DeleteRecords(PGLOBAL g, int irc)
Tpos += n;
} // endif MaxBlk
#ifdef DEBTRACE
if (trace)
htrc("move %d bytes\n", n);
#endif
} // endif n
if (irc == RC_OK) {
Spos = Fpos + 1; // New start position
#ifdef DEBTRACE
if (trace)
htrc("after: Tpos=%p Spos=%p\n", Tpos, Spos);
#endif
} else {
/*******************************************************************/
......@@ -1676,9 +1666,8 @@ int VCMFAM::DeleteRecords(PGLOBAL g, int irc)
return RC_FX;
} // endif
#ifdef DEBTRACE
if (trace)
htrc("done, Tpos=%p newsize=%d drc=%d\n", Tpos, n, drc);
#endif
if (!SetEndOfFile(fp->Handle)) {
sprintf(g->Message, MSG(FUNCTION_ERROR),
......@@ -1760,17 +1749,16 @@ bool VCMFAM::ReadBlock(PGLOBAL g, PVCTCOL colp)
/*********************************************************************/
mempos = Memcol[i] + n * CurBlk;
#ifdef DEBTRACE
if (trace)
htrc("mempos=%p i=%d Nrec=%d Clen=%d CurBlk=%d\n",
mempos, i, Nrec, colp->Clen, CurBlk);
#endif
if (colp->GetStatus(BUF_MAPPED))
colp->Blk->SetValPointer(mempos);
#ifdef DEBTRACE
if (trace)
num_read++;
#endif
return false;
} // end of ReadBlock
......@@ -1792,10 +1780,9 @@ bool VCMFAM::WriteBlock(PGLOBAL g, PVCTCOL colp)
/*********************************************************************/
mempos = Memcol[i] + n * CurBlk;
#ifdef DEBTRACE
if (trace)
htrc("modif=%d mempos=%p i=%d Nrec=%d Clen=%d colblk=%d\n",
Modif, mempos, i, Nrec, colp->Clen, colp->ColBlk);
#endif
#endif // _DEBUG
......@@ -1954,16 +1941,15 @@ bool VECFAM::OpenColumnFile(PGLOBAL g, char *opmode, int i)
sprintf(filename, Colfn, i+1);
if (!(Streams[i] = PlugOpenFile(g, filename, opmode))) {
#ifdef DEBTRACE
if (trace)
htrc("%s\n", g->Message);
#endif
return (Tdbp->GetMode() == MODE_READ && errno == ENOENT)
? PushWarning(g, Tdbp) : true;
} // endif Streams
#ifdef DEBTRACE
if (trace)
htrc("File %s is open in mode %s\n", filename, opmode);
#endif
To_Fbs[i] = dup->Openlist; // Keep track of File blocks
return false;
......@@ -2110,10 +2096,9 @@ void VECFAM::ResetBuffer(PGLOBAL g)
/***********************************************************************/
int VECFAM::WriteBuffer(PGLOBAL g)
{
#ifdef DEBTRACE
if (trace)
htrc("VCT WriteBuffer: R%d Mode=%d CurNum=%d CurBlk=%d\n",
Tdbp->GetTdb_No(), Tdbp->GetMode(), CurNum, CurBlk);
#endif
if (Tdbp->GetMode() == MODE_INSERT) {
if (Closing || ++CurNum == Nrec) {
......@@ -2161,20 +2146,19 @@ int VECFAM::DeleteRecords(PGLOBAL g, int irc)
/* file, and at the end erase all trailing records. */
/* This depends on the Check setting, false by default. */
/*********************************************************************/
#ifdef DEBTRACE
fprintf(debug,
"VEC DeleteDB: rc=%d UseTemp=%d Fpos=%d Tpos=%d Spos=%d\n",
if (trace)
htrc("VEC DeleteDB: rc=%d UseTemp=%d Fpos=%d Tpos=%d Spos=%d\n",
irc, UseTemp, Fpos, Tpos, Spos);
#endif
if (irc != RC_OK) {
/*******************************************************************/
/* EOF: position Fpos at the end-of-file position. */
/*******************************************************************/
Fpos = Cardinality(g);
#ifdef DEBTRACE
if (trace)
htrc("Fpos placed at file end=%d\n", Fpos);
#endif
} else // Fpos is the Deleted line position
Fpos = CurBlk * Nrec + CurNum;
......@@ -2201,14 +2185,13 @@ int VECFAM::DeleteRecords(PGLOBAL g, int irc)
return RC_FX;
if (irc == RC_OK) {
#ifdef DEBTRACE
#ifdef _DEBUG
assert(Spos == Fpos);
#endif
Spos++; // New start position is on next line
#ifdef DEBTRACE
if (trace)
htrc("after: Tpos=%d Spos=%d\n", Tpos, Spos);
#endif
} else {
/*******************************************************************/
......@@ -2250,9 +2233,9 @@ int VECFAM::DeleteRecords(PGLOBAL g, int irc)
close(h);
#ifdef DEBTRACE
if (trace)
htrc("done, h=%d irc=%d\n", h, irc);
#endif
} // endfor i
} else // UseTemp
......@@ -2288,9 +2271,9 @@ bool VECFAM::OpenTempFile(PGLOBAL g)
sprintf(tempname, Tempat, i+1);
if (!(T_Streams[i] = PlugOpenFile(g, tempname, "wb"))) {
#ifdef DEBTRACE
if (trace)
htrc("%s\n", g->Message);
#endif
return true;
} else
T_Fbs[i] = PlgGetUser(g)->Openlist;
......@@ -2348,9 +2331,8 @@ bool VECFAM::MoveIntermediateLines(PGLOBAL g, bool *bn)
len = fread(To_Buf, Clens[i], req, Streams[i]);
#ifdef DEBTRACE
if (trace)
htrc("after read req=%d len=%d\n", req, len);
#endif
if (len != req) {
sprintf(g->Message, MSG(DEL_READ_ERROR), (int) req, (int) len);
......@@ -2368,17 +2350,16 @@ bool VECFAM::MoveIntermediateLines(PGLOBAL g, bool *bn)
return true;
} // endif
#ifdef DEBTRACE
if (trace)
htrc("after write pos=%d\n", ftell(Streams[i]));
#endif
} // endfor i
Tpos += (int)req;
Spos += (int)req;
#ifdef DEBTRACE
if (trace)
htrc("loop: Tpos=%d Spos=%d\n", Tpos, Spos);
#endif
b = true;
} // endfor n
......@@ -2496,10 +2477,9 @@ void VECFAM::CloseTableFile(PGLOBAL g)
To_Fbs[i] = NULL;
} // endif Streams
#ifdef DEBTRACE
htrc("VCT CloseTableFile: closing %s wrc=%d rc=%d\n",
To_File, wrc, rc);
#endif
if (trace)
htrc("VCT CloseTableFile: closing %s wrc=%d rc=%d\n", To_File, wrc, rc);
} // end of CloseTableFile
/***********************************************************************/
......@@ -2516,10 +2496,9 @@ bool VECFAM::ReadBlock(PGLOBAL g, PVCTCOL colp)
len = Nrec * colp->Clen * CurBlk;
i = colp->Index - 1;
#ifdef DEBTRACE
if (trace)
htrc("len=%d i=%d Nrec=%d Deplac=%d Lrecl=%d CurBlk=%d\n",
len, i, Nrec, colp->Deplac, Lrecl, CurBlk);
#endif
if (fseek(Streams[i], len, SEEK_SET)) {
sprintf(g->Message, MSG(FSEEK_ERROR), strerror(errno));
......@@ -2543,15 +2522,15 @@ bool VECFAM::ReadBlock(PGLOBAL g, PVCTCOL colp)
sprintf(g->Message, MSG(READ_ERROR),
fn, strerror(errno));
#ifdef DEBTRACE
if (trace)
htrc(" Read error: %s\n", g->Message);
#endif
return true;
} // endif
#ifdef DEBTRACE
if (trace)
num_read++;
#endif
return false;
} // end of ReadBlock
......@@ -2572,10 +2551,9 @@ bool VECFAM::WriteBlock(PGLOBAL g, PVCTCOL colp)
len = Nrec * colp->Clen * colp->ColBlk;
i = colp->Index - 1;
#ifdef DEBTRACE
if (trace)
htrc("modif=%d len=%d i=%d Nrec=%d Deplac=%d Lrecl=%d colblk=%d\n",
Modif, len, i, Nrec, colp->Deplac, Lrecl, colp->ColBlk);
#endif
if (Tdbp->GetMode() == MODE_UPDATE && !UseTemp)
if (fseek(T_Streams[i], len, SEEK_SET)) {
......@@ -2595,9 +2573,10 @@ bool VECFAM::WriteBlock(PGLOBAL g, PVCTCOL colp)
sprintf(fn, (UseTemp) ? Tempat : Colfn, colp->Index);
sprintf(g->Message, MSG(WRITE_STRERROR), fn, strerror(errno));
#ifdef DEBTRACE
if (trace)
htrc("Write error: %s\n", strerror(errno));
#endif
return true;
} else
Spos = Fpos + n;
......@@ -2605,11 +2584,6 @@ bool VECFAM::WriteBlock(PGLOBAL g, PVCTCOL colp)
#if defined(UNIX)
fflush(Streams[i]); //NGC
#endif
#ifdef DEBTRACE
//num_write++;
#endif
return false;
} // end of WriteBlock
......@@ -2740,9 +2714,9 @@ bool VMPFAM::MapColumnFile(PGLOBAL g, MODE mode, int i)
&& fp->Count && fp->Mode == mode)
break;
#ifdef DEBTRACE
if (trace)
htrc("Mapping file, fp=%p\n", fp);
#endif
} else
fp = NULL;
......@@ -2765,9 +2739,9 @@ bool VMPFAM::MapColumnFile(PGLOBAL g, MODE mode, int i)
if (!(*g->Message))
sprintf(g->Message, MSG(OPEN_MODE_ERROR),
"map", (int) rc, filename);
#ifdef DEBTRACE
if (trace)
htrc("%s\n", g->Message);
#endif
return (mode == MODE_READ && rc == ENOENT)
? PushWarning(g, Tdbp) : true;
} // endif hFile
......@@ -2817,10 +2791,9 @@ bool VMPFAM::MapColumnFile(PGLOBAL g, MODE mode, int i)
To_Fbs[i] = fp; // Useful when closing
#ifdef DEBTRACE
if (trace)
htrc("fp=%p count=%d MapView=%p len=%d\n",
fp, fp->Count, Memcol[i], len);
#endif
return false;
} // end of MapColumnFile
......@@ -2863,20 +2836,19 @@ int VMPFAM::DeleteRecords(PGLOBAL g, int irc)
int i;
int m, n;
#ifdef DEBTRACE
fprintf(debug,
"VMP DeleteDB: irc=%d tobuf=%p Tpos=%p Spos=%p\n",
if (trace)
htrc("VMP DeleteDB: irc=%d tobuf=%p Tpos=%p Spos=%p\n",
irc, To_Buf, Tpos, Spos);
#endif
if (irc != RC_OK) {
/*******************************************************************/
/* EOF: position Fpos at the top of map position. */
/*******************************************************************/
Fpos = (Block - 1) * Nrec + Last;
#ifdef DEBTRACE
if (trace)
htrc("Fpos placed at file top=%p\n", Fpos);
#endif
} else // Fpos is the Deleted line position
Fpos = CurBlk * Nrec + CurNum;
......@@ -2897,17 +2869,16 @@ int VMPFAM::DeleteRecords(PGLOBAL g, int irc)
Tpos += n;
#ifdef DEBTRACE
if (trace)
htrc("move %d bytes\n", n);
#endif
} // endif n
if (irc == RC_OK) {
Spos = Fpos + 1; // New start position
#ifdef DEBTRACE
if (trace)
htrc("after: Tpos=%p Spos=%p\n", Tpos, Spos);
#endif
} else {
/*******************************************************************/
......@@ -2937,9 +2908,8 @@ int VMPFAM::DeleteRecords(PGLOBAL g, int irc)
return RC_FX;
} // endif
#ifdef DEBTRACE
if (trace)
htrc("done, Tpos=%p newsize=%d drc=%d\n", Tpos, n, drc);
#endif
if (!SetEndOfFile(fp->Handle)) {
sprintf(g->Message, MSG(FUNCTION_ERROR),
......@@ -3045,9 +3015,8 @@ bool BGVFAM::BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req)
DWORD nbr, drc, len = (DWORD)req;
bool brc = ReadFile(h, inbuf, len, &nbr, NULL);
#ifdef DEBTRACE
if (trace)
htrc("after read req=%d brc=%d nbr=%d\n", req, brc, nbr);
#endif
if (!brc || nbr != len) {
char buf[256]; // , *fn = (h == Hfile) ? To_File : "Tempfile";
......@@ -3062,9 +3031,10 @@ bool BGVFAM::BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req)
} // endelse brc
sprintf(g->Message, MSG(READ_ERROR), To_File, buf);
#ifdef DEBTRACE
if (trace)
htrc("BIGREAD: %s\n", g->Message);
#endif
rc = true;
} // endif brc || nbr
#else // !WIN32
......@@ -3075,10 +3045,11 @@ bool BGVFAM::BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req)
const char *fn = (h == Hfile) ? To_File : "Tempfile";
sprintf(g->Message, MSG(READ_ERROR), fn, strerror(errno));
#ifdef DEBTRACE
if (trace)
htrc("BIGREAD: nbr=%d len=%d errno=%d %s\n",
nbr, len, errno, g->Message);
#endif
rc = true;
} // endif nbr
#endif // !WIN32
......@@ -3097,9 +3068,8 @@ bool BGVFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req)
DWORD nbw, drc, len = (DWORD)req;
bool brc = WriteFile(h, inbuf, len, &nbw, NULL);
#ifdef DEBTRACE
if (trace)
htrc("after write req=%d brc=%d nbw=%d\n", req, brc, nbw);
#endif
if (!brc || nbw != len) {
char buf[256], *fn = (h == Hfile) ? To_File : "Tempfile";
......@@ -3115,10 +3085,10 @@ bool BGVFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req)
sprintf(g->Message, MSG(WRITE_STRERROR), fn, buf);
#ifdef DEBTRACE
if (trace)
htrc("BIGWRITE: nbw=%d len=%d errno=%d %s\n",
nbw, len, drc, g->Message);
#endif
rc = true;
} // endif brc || nbw
#else // !WIN32
......@@ -3129,10 +3099,11 @@ bool BGVFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req)
const char *fn = (h == Hfile) ? To_File : "Tempfile";
sprintf(g->Message, MSG(WRITE_STRERROR), fn, strerror(errno));
#ifdef DEBTRACE
if (trace)
htrc("BIGWRITE: nbw=%d len=%d errno=%d %s\n",
nbw, len, errno, g->Message);
#endif
rc = true;
} // endif nbr
#endif // !WIN32
......@@ -3180,6 +3151,9 @@ int BGVFAM::GetBlockInfo(PGLOBAL g)
if (h == INVALID_HANDLE_VALUE || !_filelength(h)) {
#endif // !WIN32
// Consider this is a void table
if (trace)
htrc("Void table h=%d\n", h);
Last = Nrec;
Block = 0;
......@@ -3200,6 +3174,10 @@ int BGVFAM::GetBlockInfo(PGLOBAL g)
} else {
Block = (vh.NumRec > 0) ? (vh.NumRec + Nrec - 1) / Nrec : 0;
Last = (vh.NumRec + Nrec - 1) % Nrec + 1;
if (trace)
htrc("Block=%d Last=%d\n", Block, Last);
} // endif's
CloseFileHandle(h);
......@@ -3297,6 +3275,10 @@ bool BGVFAM::MakeEmptyFile(PGLOBAL g, char *fn)
of.QuadPart = (BIGINT)n + (BIGINT)MaxBlk * (BIGINT)Blksize - (BIGINT)1;
if (trace)
htrc("MEF: of=%lld n=%d maxblk=%d blksize=%d\n",
of.QuadPart, n, Maxblk, Blksize);
of.LowPart = SetFilePointer(h, of.LowPart,
&of.HighPart, FILE_BEGIN);
......@@ -3332,14 +3314,17 @@ bool BGVFAM::MakeEmptyFile(PGLOBAL g, char *fn)
int h;
BIGINT pos;
h= global_open64(g, MSGID_OPEN_EMPTY_FILE, filename,
O_CREAT | O_WRONLY, S_IREAD | S_IWRITE);
h= open64(filename, O_CREAT | O_WRONLY, S_IREAD | S_IWRITE);
if (h == -1)
return true;
pos = (BIGINT)n + (BIGINT)MaxBlk * (BIGINT)Blksize - (BIGINT)1;
if (trace)
htrc("MEF: pos=%lld n=%d maxblk=%d blksize=%d\n",
pos, n, MaxBlk, Blksize);
if (lseek64(h, pos, SEEK_SET) < 0) {
sprintf(g->Message, MSG(MAKE_EMPTY_FILE), To_File, strerror(errno));
close(h);
......@@ -3376,10 +3361,9 @@ bool BGVFAM::OpenTableFile(PGLOBAL g)
PlugSetPath(filename, To_File, Tdbp->GetPath());
#ifdef DEBTRACE
if (trace)
htrc("OpenTableFile: filename=%s mode=%d Last=%d\n",
filename, mode, Last);
#endif
#if defined(WIN32)
DWORD access, creation, share = 0, rc = 0;
......@@ -3454,11 +3438,9 @@ bool BGVFAM::OpenTableFile(PGLOBAL g)
strcat(g->Message, filename);
} // endif Hfile
#ifdef DEBTRACE
fprintf(debug,
" rc=%d access=%p share=%p creation=%d handle=%p fn=%s\n",
if (trace)
htrc(" rc=%d access=%p share=%p creation=%d handle=%p fn=%s\n",
drc, access, share, creation, Hfile, filename);
#endif
if (mode == MODE_INSERT) {
/*******************************************************************/
......@@ -3497,7 +3479,19 @@ bool BGVFAM::OpenTableFile(PGLOBAL g)
oflag = O_RDONLY;
break;
case MODE_INSERT:
if (MaxBlk) {
if (!Block)
if (MakeEmptyFile(g, To_File))
return true;
// Required to update empty blocks
oflag = O_RDWR;
} else if (Last == Nrec)
oflag = O_WRONLY | O_CREAT | O_APPEND;
else
// Required to update the last block
oflag = O_RDWR | O_CREAT | O_APPEND;
pmd = S_IREAD | S_IWRITE;
break;
case MODE_DELETE:
......@@ -3532,11 +3526,9 @@ bool BGVFAM::OpenTableFile(PGLOBAL g)
strcat(g->Message, strerror(errno));
} // endif Hfile
#ifdef DEBTRACE
htrc(" lrc=%d oflag=%p mode=%p handle=%d fn=%s\n",
lrc, oflag, mode, Hfile, filename);
#endif
if (trace)
htrc(" rc=%d oflag=%p mode=%p handle=%d fn=%s\n",
rc, oflag, mode, Hfile, filename);
#endif // UNIX
if (!rc) {
......@@ -3555,9 +3547,8 @@ bool BGVFAM::OpenTableFile(PGLOBAL g)
To_Fb->Mode = mode;
To_Fb->Handle = Hfile;
#ifdef DEBTRACE
if (trace)
htrc("File %s is open in mode %d\n", filename, mode);
#endif
if (del)
// This will stop the process by
......@@ -3659,10 +3650,9 @@ bool BGVFAM::AllocateBuffer(PGLOBAL g)
/***********************************************************************/
int BGVFAM::WriteBuffer(PGLOBAL g)
{
#ifdef DEBTRACE
if (trace)
htrc("BGV WriteDB: R%d Mode=%d CurNum=%d CurBlk=%d\n",
Tdbp->GetTdb_No(), Tdbp->GetMode(), CurNum, CurBlk);
#endif
if (Tdbp->GetMode() == MODE_UPDATE) {
// Mode Update is done in ReadDB, we just initialize it here
......@@ -3760,20 +3750,19 @@ int BGVFAM::DeleteRecords(PGLOBAL g, int irc)
/* 2 - directly move the not deleted lines inside the original */
/* file, and at the end erase all trailing records. */
/*********************************************************************/
#ifdef DEBTRACE
fprintf(debug,
"BGV DeleteDB: irc=%d UseTemp=%d Fpos=%d Tpos=%d Spos=%d\n",
if (trace)
htrc("BGV DeleteDB: irc=%d UseTemp=%d Fpos=%d Tpos=%d Spos=%d\n",
irc, UseTemp, Fpos, Tpos, Spos);
#endif
if (irc != RC_OK) {
/*******************************************************************/
/* EOF: position Fpos at the end-of-file position. */
/*******************************************************************/
Fpos = (Block - 1) * Nrec + Last;
#ifdef DEBTRACE
if (trace)
htrc("Fpos placed at file end=%d\n", Fpos);
#endif
eof = UseTemp && !MaxBlk;
} else // Fpos is the deleted line position
Fpos = CurBlk * Nrec + CurNum;
......@@ -3805,14 +3794,13 @@ int BGVFAM::DeleteRecords(PGLOBAL g, int irc)
return RC_FX;
if (irc == RC_OK) {
#ifdef DEBTRACE
#ifdef _DEBUG
assert(Spos == Fpos);
#endif
Spos++; // New start position is on next line
#ifdef DEBTRACE
if (trace)
htrc("after: Tpos=%d Spos=%d\n", Tpos, Spos);
#endif
} else {
/*******************************************************************/
......@@ -3998,9 +3986,9 @@ bool BGVFAM::MoveIntermediateLines(PGLOBAL g, bool *b)
} // endif Usetemp...
#ifdef DEBTRACE
if (trace)
htrc("loop: Tpos=%d Spos=%d\n", Tpos, Spos);
#endif
} // endfor n
return false;
......@@ -4132,10 +4120,10 @@ void BGVFAM::CloseTableFile(PGLOBAL g)
if (Hfile != INVALID_HANDLE_VALUE)
rc = PlugCloseFile(g, To_Fb);
#ifdef DEBTRACE
if (trace)
htrc("BGV CloseTableFile: closing %s wrc=%d rc=%d\n",
To_File, wrc, rc);
#endif
Hfile = INVALID_HANDLE_VALUE;
} // end of CloseDB
......@@ -4178,11 +4166,9 @@ bool BGVFAM::ReadBlock(PGLOBAL g, PVCTCOL colp)
pos = (BIGINT)Nrec * ((BIGINT)colp->Deplac
+ (BIGINT)Lrecl * (BIGINT)CurBlk);
#ifdef DEBTRACE
fprintf(debug,
"RB: offset=%lf Nrec=%d Deplac=%d Lrecl=%d CurBlk=%d MaxBlk=%d\n",
(double)pos, Nrec, colp->Deplac, Lrecl, CurBlk, MaxBlk);
#endif
if (trace)
htrc("RB: offset=%lld Nrec=%d Deplac=%d Lrecl=%d CurBlk=%d MaxBlk=%d\n",
pos, Nrec, colp->Deplac, Lrecl, CurBlk, MaxBlk);
if (BigSeek(g, Hfile, pos))
return true;
......@@ -4190,9 +4176,9 @@ bool BGVFAM::ReadBlock(PGLOBAL g, PVCTCOL colp)
if (BigRead(g, Hfile, colp->Blk->GetValPointer(), colp->Clen * Nrec))
return true;
#ifdef DEBTRACE
if (trace)
num_read++;
#endif
return false;
} // end of ReadBlock
......@@ -4217,10 +4203,9 @@ bool BGVFAM::WriteBlock(PGLOBAL g, PVCTCOL colp)
pos = (BIGINT)Nrec * ((BIGINT)colp->Deplac
+ (BIGINT)Lrecl * (BIGINT)colp->ColBlk);
#ifdef DEBTRACE
htrc("WB: offset=%lf Nrec=%d Deplac=%d Lrecl=%d ColBlk=%d\n",
(double)pos, Nrec, colp->Deplac, Lrecl, colp->ColBlk);
#endif
if (trace)
htrc("WB: offset=%lld Nrec=%d Deplac=%d Lrecl=%d ColBlk=%d\n",
pos, Nrec, colp->Deplac, Lrecl, colp->ColBlk);
if (BigSeek(g, Tfile, pos))
return true;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment