summaryrefslogtreecommitdiffstats
path: root/relblobif/inlinetile.cc
diff options
context:
space:
mode:
authorConstantin Jucovschi <cj@ubuntu.localdomain>2009-04-24 07:20:22 -0400
committerConstantin Jucovschi <cj@ubuntu.localdomain>2009-04-24 07:20:22 -0400
commit8f27e65bddd7d4b8515ce620fb485fdd78fcdf89 (patch)
treebd328a4dd4f92d32202241b5e3a7f36177792c5f /relblobif/inlinetile.cc
downloadrasdaman-upstream-8f27e65bddd7d4b8515ce620fb485fdd78fcdf89.tar.gz
rasdaman-upstream-8f27e65bddd7d4b8515ce620fb485fdd78fcdf89.tar.xz
rasdaman-upstream-8f27e65bddd7d4b8515ce620fb485fdd78fcdf89.zip
Initial commitv8.0
Diffstat (limited to 'relblobif/inlinetile.cc')
-rw-r--r--relblobif/inlinetile.cc259
1 files changed, 259 insertions, 0 deletions
diff --git a/relblobif/inlinetile.cc b/relblobif/inlinetile.cc
new file mode 100644
index 0000000..bfff1ca
--- /dev/null
+++ b/relblobif/inlinetile.cc
@@ -0,0 +1,259 @@
+/*
+* 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 <http://www.gnu.org/licenses/>.
+*
+* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
+rasdaman GmbH.
+*
+* For more information please see <http://www.rasdaman.org>
+* or contact Peter Baumann via <baumann@rasdaman.com>.
+*/
+#include "mymalloc/mymalloc.h"
+// This is -*- C++ -*-
+/*************************************************************
+ *
+ *
+ * PURPOSE:
+ *
+
+ *
+ * COMMENTS:
+ * uses embedded SQL
+ *
+ ************************************************************/
+
+static const char rcsid[] = "@(#)blobif,BLOBTile: $Id: inlinetile.cc,v 1.5 2002/06/15 16:47:29 coman Exp $";
+
+#include <iostream>
+
+#include "inlinetile.hh"
+#include "raslib/rmdebug.hh"
+#include "reladminif/externs.h"
+#include "raslib/error.hh"
+#include "reladminif/objectbroker.hh"
+#include "blobtile.hh"
+#include "relindexif/dbtcindex.hh"
+#include "reladminif/dbref.hh"
+#include "storagemgr/sstoragelayout.hh"
+
+#include <cstring>
+
+InlineTile::InlineTile(r_Data_Format dataformat)
+ : BLOBTile(dataformat)
+ {
+ RMDBGONCE(3, RMDebug::module_blobif, "InlineTile", "InlineTile()");
+ objecttype = OId::INLINETILEOID;
+ }
+
+InlineTile::InlineTile(r_Bytes newSize, char c, r_Data_Format dataformat)
+ : BLOBTile(newSize, c, dataformat)
+ {
+ RMDBGONCE(3, RMDebug::module_blobif, "InlineTile", "InlineTile(" << newSize << ", data)");
+ objecttype = OId::INLINETILEOID;
+ }
+
+InlineTile::InlineTile(r_Bytes newSize, r_Bytes patSize, const char* pat, r_Data_Format dataformat)
+ : BLOBTile(newSize, patSize, pat, dataformat)
+ {
+ RMDBGONCE(3, RMDebug::module_blobif, "InlineTile", "InlineTile(" << newSize << ", " << patSize << ", pattern)");
+ objecttype = OId::INLINETILEOID;
+ }
+
+InlineTile::InlineTile(r_Bytes newSize, const char* newCells, r_Data_Format dataformat)
+ : BLOBTile(newSize, newCells, dataformat)
+ {
+ RMDBGONCE(3, RMDebug::module_blobif, "InlineTile", "InlineTile(" << size << ", data)");
+ objecttype = OId::INLINETILEOID;
+ }
+
+InlineTile::InlineTile(const OId& id) throw (r_Error)
+ : BLOBTile(id)
+ {
+ RMDBGONCE(5, RMDebug::module_blobif, "InlineTile", "InlineTile(" << id <<")");
+ objecttype = OId::INLINETILEOID;
+ }
+
+InlineTile::InlineTile(const OId& id, char*& thecells)
+ : BLOBTile(r_Array)
+ {
+ RMDBGENTER(5, RMDebug::module_blobif, "InlineTile", "InlineTile(" << id << ", cells " << (r_Ptr)thecells << ")");
+ objecttype = OId::INLINETILEOID;
+ myIndexOId = id;
+
+ //restore the size of the blob
+ memcpy(&size, thecells, sizeof(r_Bytes));
+ thecells = thecells + sizeof(r_Bytes);
+
+ //restore the dataformat
+ memcpy(&dataFormat, thecells, sizeof(r_Data_Format));
+ thecells = thecells + sizeof(r_Data_Format);
+
+ //restore my own oid
+ memcpy(&myOId, thecells, sizeof(OId));
+ thecells = thecells + sizeof(OId);
+
+ //restore the cells
+ cells = (char*)mymalloc(size * sizeof(char));
+ memcpy(cells, thecells, size);
+ thecells = thecells + size;
+ RMDBGMIDDLE(5, RMDebug::module_blobif, "InlineTile", "OId " << myOId << " size " << size << " DataFormat " << dataFormat);
+
+ DBObject::readFromDb();
+ _isInDatabase = false;
+ ObjectBroker::registerDBObject(this);
+ RMDBGEXIT(5, RMDebug::module_blobif, "InlineTile", "InlineTile(" << id << ", cells " << (r_Ptr)thecells << ") " << myOId);
+ }
+
+void
+InlineTile::printStatus(unsigned int level, std::ostream& stream) const
+ {
+ char* indent = new char[level*2 +1];
+ for (unsigned int j = 0; j < level*2 ; j++)
+ indent[j] = ' ';
+ indent[level*2] = '\0';
+
+ stream << indent << "InlineTile ";
+ if (isInlined())
+ stream << "is Inlined at " << myIndexOId << endl;
+ else
+ stream << "is not Inlined " << endl;
+ BLOBTile::printStatus(level + 1, stream);
+ delete[] indent;
+ }
+
+void
+InlineTile::destroy()
+ {
+ if (isCached())
+ return;
+ else
+ DBObject::destroy();
+ }
+
+bool
+InlineTile::isCached() const
+ {
+ char retval = true;
+ //not previously cached
+ if (!_isCached)
+ if (!isInlined())
+ {//outlined
+ if (getSize() > StorageLayout::DefaultMinimalTileSize)//size is ok
+ retval = false;
+ }
+ else {//inlined
+ if (getSize() < StorageLayout::DefaultPCTMax)//size is ok
+ retval = false;
+ }
+ return retval;
+ }
+
+void
+InlineTile::setModified() throw(r_Error)
+ {
+ RMDBGENTER(4, RMDebug::module_blobif, "InlineTile", "setModified() " << myOId);
+ DBObject::setModified();
+ if (isInlined())
+ {
+ RMDBGMIDDLE(4, RMDebug::module_blobif, "InlineTile", " index will be modified");
+ DBTCIndexId t(myIndexOId);
+ t->setInlineTileHasChanged();
+ }
+ else {
+ RMDBGMIDDLE(4, RMDebug::module_blobif, "InlineTile", "index will not be modified");
+ }
+ RMDBGEXIT(4, RMDebug::module_blobif, "InlineTile", "setModified() " << myOId);
+ }
+
+const OId&
+InlineTile::getIndexOId() const
+ {
+ return myIndexOId;
+ }
+
+void
+InlineTile::setIndexOId(const OId& oid)
+ {
+ myIndexOId = oid;
+ }
+
+r_Bytes
+InlineTile::getStorageSize() const
+ {
+ return size + sizeof(r_Bytes) + sizeof(r_Data_Format) + sizeof(OId);
+ }
+
+void
+InlineTile::outlineTile()
+ {
+ DBTCIndexId t(myIndexOId);
+ t->removeInlineTile(this);
+ setIndexOId(OId(0, OId::INVALID));
+ _isInDatabase = false;
+ _isModified = true;
+ }
+
+void
+InlineTile::inlineTile(const OId& ixId)
+ {
+ setIndexOId(ixId);
+ DBTCIndexId t(myIndexOId);
+ t->addInlineTile(this);
+ if (_isInDatabase)
+ {
+ bool pers = _isPersistent;
+ bool modi = _isModified;
+ BLOBTile::deleteFromDb();
+ _isPersistent = pers;
+ _isModified = modi;
+ }
+ }
+
+bool
+InlineTile::isInlined() const
+ {
+ return (myIndexOId.getType() == OId::DBTCINDEXOID);
+ }
+
+char*
+InlineTile::insertInMemBlock(char* thecontents)
+ {
+ RMDBGENTER(5, RMDebug::module_blobif, "InlineTile", "insertInMemBlock(" << (void*)thecontents << ")");
+ //store size of blob
+ memcpy(thecontents, &size, sizeof(r_Bytes));
+ thecontents = thecontents + sizeof(r_Bytes);
+
+ //store the dataformat
+ memcpy(thecontents, &dataFormat, sizeof(r_Data_Format));
+ thecontents = thecontents + sizeof(r_Data_Format);
+
+ //store my own oid
+ memcpy(thecontents, &myOId, sizeof(OId));
+ thecontents = thecontents + sizeof(OId);
+
+ //store the blob
+ memcpy(thecontents, cells, size * sizeof(char));
+ thecontents = thecontents + size * sizeof(char);
+ RMDBGMIDDLE(5, RMDebug::module_blobif, "InlineTile", "OId " << myOId << " size " << size << " DataFormat " << dataFormat);
+ RMDBGIF(20, RMDebug::module_blobif, "InlineTile", for (int i = 0; i < size; i++) RMInit::dbgOut << (unsigned int)(cells[i]) << " "; RMInit::dbgOut << endl;)
+ DBObject::updateInDb();
+ RMDBGEXIT(5, RMDebug::module_blobif, "InlineTile", "insertInMemBlock(" << (void*)thecontents << ")");
+ return thecontents;
+ }
+
+InlineTile::~InlineTile()
+ {
+ }
+