mariadb/storage/connect/tabzip.cpp
Olivier Bertrand 3e36eb230b Fix gcc compiler warnings reported by Sergei
modified:   storage/connect/array.cpp
  modified:   storage/connect/array.h
  modified:   storage/connect/blkfil.cpp
  modified:   storage/connect/blkfil.h
  modified:   storage/connect/block.h
  modified:   storage/connect/colblk.cpp
  modified:   storage/connect/colblk.h
  modified:   storage/connect/csort.h
  modified:   storage/connect/filamvct.cpp
  modified:   storage/connect/filter.cpp
  modified:   storage/connect/filter.h
  modified:   storage/connect/global.h
  modified:   storage/connect/json.h
  modified:   storage/connect/plgdbsem.h
  modified:   storage/connect/plgdbutl.cpp
  modified:   storage/connect/tabcol.cpp
  modified:   storage/connect/tabcol.h
  modified:   storage/connect/tabdos.cpp
  modified:   storage/connect/tabdos.h
  modified:   storage/connect/tabjson.cpp
  modified:   storage/connect/table.cpp
  modified:   storage/connect/tabodbc.cpp
  modified:   storage/connect/tabodbc.h
  modified:   storage/connect/tabsys.h
  modified:   storage/connect/tabxml.h
  modified:   storage/connect/value.cpp
  modified:   storage/connect/value.h
  modified:   storage/connect/xindex.cpp
  modified:   storage/connect/xindex.h
  modified:   storage/connect/xobject.cpp
  modified:   storage/connect/xobject.h
  modified:   storage/connect/xtable.h

Set values as nullable when retrieving catalog info
  modified:   storage/connect/jdbconn.cpp
  modified:   storage/connect/mysql-test/connect/r/odbc_oracle.result
  modified:   storage/connect/odbconn.cpp

Change format of Jpath
  modified:   storage/connect/json.cpp
  modified:   storage/connect/jsonudf.cpp
  modified:   storage/connect/mysql-test/connect/r/json.result
  modified:   storage/connect/mysql-test/connect/r/json_udf.result
  modified:   storage/connect/mysql-test/connect/r/json_udf_bin.result
  modified:   storage/connect/mysql-test/connect/r/zip.result
  modified:   storage/connect/mysql-test/connect/t/json.test
  modified:   storage/connect/mysql-test/connect/t/json_udf.test
  modified:   storage/connect/mysql-test/connect/t/json_udf_bin.test
  modified:   storage/connect/mysql-test/connect/t/zip.test
  modified:   storage/connect/tabjson.cpp
  modified:   storage/connect/tabjson.h
  modified:   storage/connect/tabmgo.cpp

Change null representation from ??? to <null>
  modified:   storage/connect/json.cpp

Change the name of UDF that are equal to a native JSON function name
  modified:   storage/connect/jsonudf.cpp
  modified:   storage/connect/jsonudf.h
  modified:   storage/connect/mysql-test/connect/t/json_udf.inc
  modified:   storage/connect/mysql-test/connect/t/json_udf2.inc

Fix bug in making JSON project info
  modified:   storage/connect/mongofam.cpp

Fix COMPUTE when one argument is null
  modified:   storage/connect/value.cpp

Value is null only when nullable
  modified:   storage/connect/value.h
2017-05-23 19:35:50 +02:00

242 lines
8.2 KiB
C++

/************* TabZip C++ Program Source Code File (.CPP) **************/
/* PROGRAM NAME: TABZIP Version 1.0 */
/* (C) Copyright to the author Olivier BERTRAND 2016 */
/* This program are the TABZIP class DB execution routines. */
/***********************************************************************/
/***********************************************************************/
/* Include relevant sections of the MariaDB header file. */
/***********************************************************************/
#include <my_global.h>
/***********************************************************************/
/* Include application header files: */
/* global.h is header containing all global declarations. */
/* plgdbsem.h is header containing the DB application declarations. */
/* (x)table.h is header containing the TDBASE declarations. */
/* tabzip.h is header containing the TABZIP classes declarations. */
/***********************************************************************/
#include "global.h"
#include "plgdbsem.h"
#include "xtable.h"
#include "filamtxt.h"
#include "filamzip.h"
#include "resource.h" // for IDS_COLUMNS
#include "tabdos.h"
#include "tabzip.h"
/* -------------------------- Class ZIPDEF --------------------------- */
/************************************************************************/
/* DefineAM: define specific AM block values. */
/************************************************************************/
bool ZIPDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff)
{
//target = GetStringCatInfo(g, "Target", NULL);
return DOSDEF::DefineAM(g, "ZIP", poff);
} // end of DefineAM
/***********************************************************************/
/* GetTable: makes a new Table Description Block. */
/***********************************************************************/
PTDB ZIPDEF::GetTable(PGLOBAL g, MODE m)
{
return new(g) TDBZIP(this);
} // end of GetTable
/* ------------------------------------------------------------------- */
/***********************************************************************/
/* Implementation of the TDBZIP class. */
/***********************************************************************/
TDBZIP::TDBZIP(PZIPDEF tdp) : TDBASE(tdp)
{
zipfile = NULL;
zfn = tdp->Fn;
//target = tdp->target;
nexterr = UNZ_OK;
} // end of TDBZIP standard constructor
/***********************************************************************/
/* Allocate ZIP column description block. */
/***********************************************************************/
PCOL TDBZIP::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n)
{
return new(g) ZIPCOL(cdp, this, cprec, n);
} // end of MakeCol
/***********************************************************************/
/* open a zip file. */
/* param: filename path and the filename of the zip file to open. */
/* return: true if open, false otherwise. */
/***********************************************************************/
bool TDBZIP::open(PGLOBAL g, const char *fn)
{
char filename[_MAX_PATH];
PlugSetPath(filename, fn, GetPath());
if (!zipfile && !(zipfile = unzOpen64(filename)))
sprintf(g->Message, "Zipfile open error");
return (zipfile == NULL);
} // end of open
/***********************************************************************/
/* Close the zip file. */
/***********************************************************************/
void TDBZIP::close()
{
if (zipfile) {
unzClose(zipfile);
zipfile = NULL;
} // endif zipfile
} // end of close
/***********************************************************************/
/* ZIP Cardinality: returns table size in number of rows. */
/***********************************************************************/
int TDBZIP::Cardinality(PGLOBAL g)
{
if (!g)
return 1;
else if (Cardinal < 0) {
if (!open(g, zfn)) {
unz_global_info64 ginfo;
int err = unzGetGlobalInfo64(zipfile, &ginfo);
Cardinal = (err == UNZ_OK) ? (int)ginfo.number_entry : 0;
} else
Cardinal = 0;
} // endif Cardinal
return Cardinal;
} // end of Cardinality
/***********************************************************************/
/* ZIP GetMaxSize: returns file size estimate in number of lines. */
/***********************************************************************/
int TDBZIP::GetMaxSize(PGLOBAL g)
{
if (MaxSize < 0)
MaxSize = Cardinality(g);
return MaxSize;
} // end of GetMaxSize
/***********************************************************************/
/* ZIP Access Method opening routine. */
/***********************************************************************/
bool TDBZIP::OpenDB(PGLOBAL g)
{
if (Use == USE_OPEN)
// Table already open
return false;
Use = USE_OPEN; // To be clean
return open(g, zfn);
} // end of OpenDB
/***********************************************************************/
/* ReadDB: Data Base read routine for ZIP access method. */
/***********************************************************************/
int TDBZIP::ReadDB(PGLOBAL g)
{
if (nexterr == UNZ_END_OF_LIST_OF_FILE)
return RC_EF;
else if (nexterr != UNZ_OK) {
sprintf(g->Message, "unzGoToNextFile error %d", nexterr);
return RC_FX;
} // endif nexterr
int err = unzGetCurrentFileInfo64(zipfile, &finfo, fn,
sizeof(fn), NULL, 0, NULL, 0);
if (err != UNZ_OK) {
sprintf(g->Message, "unzGetCurrentFileInfo64 error %d", err);
return RC_FX;
} // endif err
nexterr = unzGoToNextFile(zipfile);
return RC_OK;
} // end of ReadDB
/***********************************************************************/
/* WriteDB: Data Base write routine for ZIP access method. */
/***********************************************************************/
int TDBZIP::WriteDB(PGLOBAL g)
{
strcpy(g->Message, "ZIP tables are read only");
return RC_FX;
} // end of WriteDB
/***********************************************************************/
/* Data Base delete line routine for ZIP access method. */
/***********************************************************************/
int TDBZIP::DeleteDB(PGLOBAL g, int irc)
{
strcpy(g->Message, "Delete not enabled for ZIP tables");
return RC_FX;
} // end of DeleteDB
/***********************************************************************/
/* Data Base close routine for ZIP access method. */
/***********************************************************************/
void TDBZIP::CloseDB(PGLOBAL g)
{
close();
Use = USE_READY; // Just to be clean
} // end of CloseDB
/* ---------------------------- ZIPCOL ------------------------------- */
/***********************************************************************/
/* ZIPCOL public constructor. */
/***********************************************************************/
ZIPCOL::ZIPCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am)
: COLBLK(cdp, tdbp, i)
{
if (cprec) {
Next = cprec->GetNext();
cprec->SetNext(this);
} else {
Next = tdbp->GetColumns();
tdbp->SetColumns(this);
} // endif cprec
Tdbz = (TDBZIP*)tdbp;
flag = cdp->GetOffset();
} // end of ZIPCOL constructor
/***********************************************************************/
/* ReadColumn: */
/***********************************************************************/
void ZIPCOL::ReadColumn(PGLOBAL g)
{
switch (flag) {
case 1:
Value->SetValue(Tdbz->finfo.compressed_size);
break;
case 2:
Value->SetValue(Tdbz->finfo.uncompressed_size);
break;
case 3:
Value->SetValue((int)Tdbz->finfo.compression_method);
break;
case 4:
Tdbz->finfo.tmu_date.tm_year -= 1900;
if (((DTVAL*)Value)->MakeTime((tm*)&Tdbz->finfo.tmu_date))
Value->SetNull(true);
Tdbz->finfo.tmu_date.tm_year += 1900;
break;
default:
Value->SetValue_psz((PSZ)Tdbz->fn);
} // endswitch flag
} // end of ReadColumn
/* -------------------------- End of tabzip -------------------------- */