/*
* This file is part of rasdaman community.
*
* Rasdaman community is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Rasdaman community is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with rasdaman community. If not, see .
*
* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
rasdaman GmbH.
*
* For more information please see
* or contact Peter Baumann via .
*/
/*
get mddoid, iterate domain, dataformat
select mdd
get domain
{
begin ta
iterate over domain
retrieve tiles
alter tiles
commit ta
}
*/
#ifdef EARLY_TEMPLATE
#define __EXECUTABLE__
#include "server/template_inst.hh"
#endif
#include "reladminif/adminif.hh"
#include "reladminif/databaseif.hh"
#include "reladminif/transactionif.hh"
#include "reladminif/oidif.hh"
#include "mddmgr/mddobj.hh"
#include "tilemgr/tile.hh"
#include "cmlparser.hh"
#include "raslib/mitera.hh"
#define ALLDONE 0
#define ERRORPARSINGCOMMANDLINE 1
#define DOMAINMISSING 2
#define OIDMISSING 3
#define OIDINVALID 4
#define DOMAINMISMATCH 5
#define FAILED 6
#define DOMAININVALID 7
#define UNKNOWNDATAFORMAT 8
char globalConnectId[256];
RMINITGLOBALS('S')
r_Minterval domain;
OId oid;
int
main(int argc, char** argv)
{
RMInit::logOut.rdbuf(cout.rdbuf());
RMInit::dbgOut.rdbuf(cout.rdbuf());
int retval = 0;
CommandLineParser &cmlInter = CommandLineParser::getInstance();
CommandLineParameter &clp_help = cmlInter.addFlagParameter('h', "help", "show command line switches");
CommandLineParameter &clp_connect = cmlInter.addStringParameter(CommandLineParser::noShortName, "connect", "database connect string", "/");
CommandLineParameter &clp_mdddomain = cmlInter.addStringParameter(CommandLineParser::noShortName, "mdddomain", "the domain to do the changes in.");
CommandLineParameter &clp_domain = cmlInter.addStringParameter(CommandLineParser::noShortName, "domain", "the extent to be used when selecting data from the mdd.");
CommandLineParameter &clp_oid = cmlInter.addStringParameter(CommandLineParser::noShortName, "oid", "the oid of the mdd to operate on");
CommandLineParameter &clp_comptype = cmlInter.addStringParameter(CommandLineParser::noShortName, "storageformat", "name of storage format", "Array");
CommandLineParameter &clp_readonly = cmlInter.addFlagParameter('r', "readonly", "read only check");
try {
cmlInter.processCommandLine(argc, argv);
}
catch(CmlException& err)
{
cmlInter.printHelp();
cout << "Error parsing command line:" << endl;
cout << err.what() << endl;
return ERRORPARSINGCOMMANDLINE;
}
if (cmlInter.isPresent('h'))
{
cmlInter.printHelp();
return ALLDONE;
}
r_Data_Format storageFormat = r_Array;
if (cmlInter.isPresent("storageformat"))
{
storageFormat = get_data_format_from_name(cmlInter.getValueAsString("storageformat"));
if (storageFormat == r_Data_Format_NUMBER)
{
cout << "unknown data format " << cmlInter.getValueAsString("storageformat") << endl;
return UNKNOWNDATAFORMAT;
}
}
if (!cmlInter.isPresent("domain"))
{
cout << "domain is missing" << endl;
return DOMAINMISSING;
}
if (!cmlInter.isPresent("oid"))
{
cout << "oid is missing" << endl;
return OIDMISSING;
}
strcpy((char*)globalConnectId, cmlInter.getValueAsString("connect"));
cout << "connect " << globalConnectId << endl;
try {
domain = r_Minterval(cmlInter.getValueAsString("domain"));
}
catch (const r_Error& e)
{
cout << "domain is not valid: " << e.what() << " " << e.get_errorno() << endl;
return DOMAININVALID;
}
oid = OId(atol(cmlInter.getValueAsString("oid")));
if (oid.getType() != OId::MDDOID)
{
cout << "oid is not a mdd oid" << endl;
return OIDINVALID;
}
bool readonly = cmlInter.isPresent("readonly");
if (readonly)
{
cout << "performing read only check" << std::endl;
}
else {
cout << "performing recompression" << std::endl;
}
cout << "set up done" << endl;
AdminIf::instance();
DatabaseIf d;
TransactionIf t;
MDDObj* mdd = NULL;
r_Minterval completeDomain;
r_MiterArea* miter = NULL;
try {
d.open("RASBASE");
t.begin(&d, true);
mdd = new MDDObj(oid);
if (mdd->getCurrentDomain().dimension() == domain.dimension())
{
completeDomain = mdd->getCurrentDomain();
if (cmlInter.isPresent("mdddomain"))
{
try {
r_Minterval temp(cmlInter.getValueAsString("mdddomain"));
if (temp.dimension() == completeDomain.dimension())
{
cout << "Not using complete mdd domain (" << completeDomain << ") but " << temp << endl;
completeDomain = temp;
}
else {
cout << "Domains do not have same number of dimensions" << endl;
delete mdd;
mdd = NULL;
t.commit();
d.close();
return DOMAINMISMATCH;
}
}
catch (const r_Error& e2)
{
cout << "mdddomain parameter is not correct: " << e2.get_errorno() << " " << e2.what() << endl;
delete mdd;
mdd = NULL;
t.commit();
d.close();
return DOMAININVALID;
}
}
miter = new r_MiterArea(&domain, &completeDomain);
}
else {
t.commit();
d.close();
return DOMAINMISMATCH;
}
delete mdd;
mdd = NULL;
t.commit();
d.close();
}
catch (const r_Error& e)
{
delete miter;
miter = NULL;
cout << "Caught exception " << e.get_errorno() << " " << e.what() << endl;
try {
t.abort();
}
catch (const r_Error& ee)
{
cout << "Caugh exception while aborting " << ee.get_errorno() << " " << ee.what() << endl;
try {
t.abort();
}
catch (const r_Error& eee)
{
cout << "Caugh exception while 2nd aborting " << eee.get_errorno() << " " << eee.what() << endl;
}
}
try {
d.close();
}
catch (const r_Error& eeee)
{
cout << "Caugh exception while closing " << eeee.get_errorno() << " " << eeee.what() << endl;
}
return FAILED;
}
std::vector* tiles = NULL;
std::vector::iterator here;
std::vector::iterator end;
r_Minterval currentDomain;
while (!miter->isDone())
{
currentDomain = miter->nextArea();
try {
d.open("RASBASE");
t.begin(&d, readonly);
mdd = new MDDObj(oid);
tiles = mdd->intersect(currentDomain);
end = tiles->end();
if (tiles)
{
cout << "working on " << currentDomain << " with " << tiles->size() << " tiles" << endl;
for (here = tiles->begin(); here < end; here++)
{
cout << " tile " << (*here)->getDomain() << " " << (*here)->getDBTile()->getOId() << " " << (*here)->getDataFormat() << " " << (*here)->getCompressedSize();
if (!(*here)->decompress())
{
cout << " decompress failed";
}
if (((*here)->getDataFormat() != storageFormat) && (!readonly))
{
cout << " changing storage format";
(*here)->setCompressionFormat(storageFormat);
cout << " compressed size " << (*here)->getCompressedSize();
}
cout << endl;
}
}
else {
cout << currentDomain << " no tiles" << endl;
}
delete mdd;
mdd = NULL;
delete tiles;
tiles = NULL;
t.commit();
d.close();
}
catch (const r_Error& e)
{
delete miter;
miter = NULL;
delete tiles;
tiles = NULL;
cout << "Caught exception " << e.get_errorno() << " " << e.what() << endl;
try {
t.abort();
}
catch (const r_Error& ee)
{
cout << "Caugh exception while aborting " << ee.get_errorno() << " " << ee.what() << endl;
try {
t.abort();
}
catch (const r_Error& eee)
{
cout << "Caugh exception while 2nd aborting " << eee.get_errorno() << " " << eee.what() << endl;
}
}
try {
d.close();
}
catch (const r_Error& eeee)
{
cout << "Caugh exception while closing " << eeee.get_errorno() << " " << eeee.what() << endl;
}
return FAILED;
}
}
delete tiles;
tiles = NULL;
delete miter;
miter = NULL;
return retval;
}