/* * 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 . */ #include "mymalloc/mymalloc.h" // This is -*- C++ -*- /************************************************************* * * * PURPOSE: * * * COMMENTS: * uses embedded SQL * ************************************************************/ static const char rcsid[] = "@(#)blobif,DBTile: $Id: dbtile.cc,v 1.12 2005/09/03 20:41:40 rasdev Exp $"; #include "dbtile.hh" #include "raslib/rmdebug.hh" #include "reladminif/externs.h" #include "reladminif/sqlerror.hh" #include "raslib/error.hh" #include "reladminif/objectbroker.hh" #include "blobtile.hh" #include "inlinetile.hh" #include "reladminif/dbref.hh" #include "debug.hh" // for ENTER/LEAVE/TALK macros #include "unistd.h" #include #include #include #ifdef BASEDB_ORACLE #include #include #include #endif r_Data_Format DBTile::getDataFormat() const { RMDBGONCE(3, RMDebug::module_blobif, "DBTile", "getDataFormat() const " << myOId << " " << dataFormat); return dataFormat; } r_Data_Format DBTile::getCurrentFormat() const { return currentFormat; } void DBTile::setCurrentFormat(const r_Data_Format& dataformat) const { currentFormat = dataformat; } void DBTile::setDataFormat(const r_Data_Format& dataformat) { dataFormat = dataformat; setModified(); } r_Bytes DBTile::getMemorySize() const { return size * sizeof(char) + sizeof(char*) + sizeof(r_Data_Format) + DBObject::getMemorySize() + sizeof(r_Bytes); } void DBTile::setCells(char* newCells) { if(cells != newCells) { if(cells != NULL) { TALK( "DBTile::setCells() freeing blob cells" ); free(cells); // cells = NULL; // added PB 2005-jan-10 } cells = newCells; setModified(); } } void DBTile::setNoModificationData(char* newCells) const { if(cells != newCells) { if(cells != NULL) { TALK( "DBTile::setNoModificationData() freeing blob cells" ); free(cells); // cells = NULL; // added PB 2005-jan-10 } cells = newCells; } } void DBTile::setNoModificationSize(r_Bytes newSize) const { size = newSize; } char* DBTile::getCells() { RMDBGONCE(3, RMDebug::module_blobif, "DBTile", "getCells() " << myOId); setModified(); return cells; } const char* DBTile::getCells() const { RMDBGONCE(3, RMDebug::module_blobif, "DBTile", "getCells() const " << myOId); return cells; } char DBTile::getCell(r_Bytes index) const { RMDBGONCE(3, RMDebug::module_blobif, "DBTile", "getCell(" << index << ") const " << myOId); return cells[index]; } r_Bytes DBTile::getSize() const { RMDBGONCE(3, RMDebug::module_blobif, "DBTile", "getSize() const " << myOId << " " << size); return size; } void DBTile::setCell(r_Bytes index, char newCell) { RMDBGONCE(3, RMDebug::module_blobif, "DBTile", "setCell(" << index << ", " << (int)newCell << ") " << myOId); setModified(); cells[index] = newCell; } DBTile::DBTile(r_Data_Format dataformat) : DBObject(), size(0), cells(NULL), dataFormat(dataformat), currentFormat(r_Array) { RMDBGONCE(3, RMDebug::module_blobif, "DBTile", "DBTile(" << dataFormat << ")"); objecttype = OId::INVALID; } DBTile::DBTile(r_Bytes newSize, char c, r_Data_Format dataformat) : DBObject(), size(newSize), cells(NULL), currentFormat(r_Array), dataFormat(dataformat) { RMDBGENTER(3, RMDebug::module_blobif, "DBTile", "DBTile(" << newSize << ", '(int)" << (int) c << "', " << dataFormat << ")"); TALK( "DBTile::DBTile() allocating " << newSize << " bytes for blob cells, previous ptr was " << (long) cells ); cells = (char*)mymalloc(newSize * sizeof(char)); objecttype = OId::INVALID; memset(cells, c, size); RMDBGEXIT(3, RMDebug::module_blobif, "DBTile", "DBTile(" << newSize << ", '(int)" << (int) c << "', " << dataFormat << ") " << myOId); } DBTile::DBTile(r_Bytes newSize, r_Bytes patSize, const char* pat, r_Data_Format dataformat) : DBObject(), size(newSize), cells(NULL), currentFormat(r_Array), dataFormat(dataformat) { RMDBGENTER(3, RMDebug::module_blobif, "DBTile", "DBTile(" << newSize << ", " << patSize << ", pattern, " << dataFormat << ")"); objecttype = OId::INVALID; TALK( "DBTile::DBTile() allocating " << newSize << " bytes for blob cells, previous ptr was " << (long) cells ); cells = (char*)mymalloc(newSize * sizeof(char)); r_Bytes i = 0; r_Bytes j = 0; if (patSize >= size) { // fill cells with pattern for (j = 0; j < size; j++) { cells[j] = pat[j]; } } else { if (patSize >= 0) { // fill cells with repeated pattern for (i = 0; i < size; i += patSize) { for (j = 0; j < patSize; j++) { cells[(i+j)]= pat[j]; } } // pad end with 0 if (i != size) { // no padding necessary i -= patSize; for (; i < size; i++) { cells[i]=0; } } } else { // fill cells with 0 for (i = 0; i < size; i++) { cells[i] = 0; } } } RMDBGEXIT(3, RMDebug::module_blobif, "DBTile", "DBTile(" << newSize << ", " << patSize << ", pattern, " << dataFormat << ") " << myOId); } DBTile::DBTile(r_Bytes newSize, const char* newCells, r_Data_Format dataformat) : DBObject(), size(newSize), cells(0), dataFormat(dataformat), currentFormat(r_Array) { RMDBGENTER(3, RMDebug::module_blobif, "DBTile", "DBTile(" << size << ", data, " << dataFormat << ")"); TALK( "DBTile::DBTile() allocating " << newSize << " bytes for blob cells, previous ptr was " << (long) cells ); cells = (char*)mymalloc(size * sizeof(char)); objecttype = OId::INVALID; memcpy(cells, newCells, newSize); RMDBGEXIT(3, RMDebug::module_blobif, "DBTile", "DBTile(" << size << ", data, " << dataFormat << ") " << myOId); } DBTile::DBTile(const OId& id) throw (r_Error) : DBObject(id), size(0), cells(NULL), currentFormat(r_Array) { RMDBGONCE(3, RMDebug::module_blobif, "DBTile", "DBTile(" << id <<")"); } DBTile::~DBTile() { RMDBGENTER(3, RMDebug::module_blobif, "DBTile", "~DBTile() " << myOId); if (cells) { TALK( "DBTile::~DBTile() freeing blob cells" ); free(cells); } cells = NULL; RMDBGEXIT(3, RMDebug::module_blobif, "DBTile", "~DBTile() " << myOId); } void DBTile::resize(r_Bytes newSize) { RMDBGONCE(3, RMDebug::module_blobif, "DBTile", "resize(" << newSize << ") " << myOId); if (size != newSize) { setModified(); if (cells) { TALK( "DBTile::resize() freeing blob cells" ); free(cells); // cells = NULL; // added PB 2005-jan-10 } TALK( "DBTile::resize() allocating " << newSize << " bytes for blob cells, previous ptr was " << (long) cells ); cells = (char*)mymalloc(newSize * sizeof(char)); size = newSize; } } void DBTile::printStatus(unsigned int level, std::ostream& stream) const { DBObject::printStatus(level, stream); stream << " r_Data_Format " << dataFormat << " size " << size << " "; RMDBGIF(20, RMDebug::module_blobif, "DBTile", for (int a = 0; a < size; a++)\ stream << " " << (int)(cells[a]); stream << endl;) } std::ostream& operator << (std::ostream& stream, DBTile& b) { stream << "\tDBTile at " << &b << endl; stream << "\t\tOId\t\t:" << b.myOId << endl; stream << "\t\tId\t\t:" << b.myOId.getCounter() << endl; stream << "\t\tSize\t\t:" << b.size << endl; stream << "\t\tModified\t:" << (int)b._isModified << endl; stream << "\t\tCells\t\t:"; RMDBGIF(20, RMDebug::module_blobif, "DBTile", for (int a = 0; a < b.size; a++)\ stream << " " << (int)(b.cells[a]); stream << endl;) return stream; }