/*
* 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 .
/
/**
* SOURCE: ref.cc
*
* MODULE: rasodmg
* CLASS: r_Ref
*
* COMMENTS:
* None
*/
static const char rcsidref[] = "@(#)rasodmg, r_Ref: $Id: ref.cc,v 1.28 2002/08/28 12:10:18 coman Exp $";
#include "rasodmg/database.hh"
#include "rasodmg/ref.hh"
#include "raslib/rmdebug.hh"
#ifdef __VISUALC__
#include
#else
#include
#endif
#include "rasodmg/transaction.hh"
#include "clientcomm/clientcomm.hh"
// forward declaration needed because of EARLY_TEMPLATE
class r_Transaction;
// In case of early templates take care non-template code is only
// compiled once.
#ifndef __EXECUTABLE__
r_Ref_Any::r_Ref_Any()
: memptr(0), oid()
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref_Any", "r_Ref_Any()")
}
r_Ref_Any::r_Ref_Any( const r_Ref_Any& obj )
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref_Any", "r_Ref_Any( const r_Ref_Any& )")
memptr = obj.memptr;
oid = obj.oid;
}
r_Ref_Any::r_Ref_Any( const r_OId& initOId )
: memptr(0)
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref_Any", "r_Ref_Any( const r_OId& )")
oid = initOId;
}
r_Ref_Any::r_Ref_Any( r_Object* ptr )
: oid(), memptr( ptr )
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref_Any", "r_Ref_Any( r_Object* )")
}
r_Ref_Any::r_Ref_Any( void* ptr )
: oid(), memptr( ptr )
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref_Any", "r_Ref_Any( void* )")
}
r_Ref_Any::r_Ref_Any( const r_OId &initOId, r_Object* ptr )
: oid( initOId ), memptr( ptr )
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref_Any", "r_Ref_Any( const r_OId &oid, const r_Object* )")
}
r_Ref_Any::~r_Ref_Any()
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref_Any", "~r_Ref_Any()")
// object should not be delete from databse when reference destructor is called
// if( memptr ){
// delete memptr;
// memptr = 0;
// }
}
r_Ref_Any&
r_Ref_Any::operator=( const r_Ref_Any& objptr )
{
memptr = objptr.memptr;
oid = objptr.oid;
return *this;
}
r_Ref_Any&
r_Ref_Any::operator=( r_Object* ptr )
{
memptr = ptr;
oid = r_OId();
return *this;
}
void
r_Ref_Any::destroy()
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref_Any", "destroy()")
if( memptr && !oid.is_valid() ){
delete memptr;
memptr = 0;
}
}
void
r_Ref_Any::delete_object()
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref_Any", "delete_object()")
if( memptr ){
delete memptr;
memptr = 0;
}
}
r_Ref_Any::operator const void*() const
{
return memptr;
}
r_Ref_Any::operator void*()
{
return memptr;
}
r_Ref_Any::operator r_Point*()
{
return (r_Point*)memptr;
}
r_Ref_Any::operator r_Sinterval*()
{
return (r_Sinterval*)memptr;
}
r_Ref_Any::operator r_Minterval*()
{
return (r_Minterval*)memptr;
}
r_Ref_Any::operator r_OId*()
{
return (r_OId*)memptr;
}
r_Ref_Any::operator r_Scalar*()
{
return (r_Scalar*)memptr;
}
r_Ref_Any::operator r_Primitive*()
{
return (r_Primitive*)memptr;
}
r_Ref_Any::operator r_Structure*()
{
return (r_Structure*)memptr;
}
int
r_Ref_Any::operator!() const
{
return !is_null();
}
int
r_Ref_Any::is_null() const
{
return (memptr==0) && !oid.is_valid();
}
int
r_Ref_Any::operator==( const r_Ref_Any& ref ) const
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref_Any", "operator==( const r_Ref_Any& )")
return // both refs are not valid or ...
( is_null() && ref.is_null() ) ||
// both oids are valid and the same or ...
( oid.is_valid() && oid == ref.oid ) ||
// both oids are not valid and memory pointers are the same
( !oid.is_valid() && !ref.oid.is_valid() && memptr == ref.memptr );
}
int
r_Ref_Any::operator!=( const r_Ref_Any& ref ) const
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref_Any", "operator!=( const r_Ref_Any& )")
return !operator==( ref );
}
int
r_Ref_Any::operator==( const r_Object* ptr ) const
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref_Any", "operator==( const r_Object* )")
return memptr == (void*)ptr;
}
int
r_Ref_Any::operator!=( const r_Object* ptr ) const
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref_Any", "operator!=( const r_Object* )")
return !operator==( ptr );
}
void*
r_Ref_Any::get_memory_ptr() const
{
return memptr;
}
#endif // __EXECUTABLE__
template
r_Ref::r_Ref()
: memptr(0), oid()
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "r_Ref()")
}
template
r_Ref::r_Ref( const r_Ref& obj )
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "r_Ref( const r_Ref& )")
memptr = obj.memptr;
oid = obj.oid;
}
template
r_Ref::r_Ref( const r_OId& initOId )
: memptr(0)
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "r_Ref( const r_OId& )")
oid = initOId;
}
template
r_Ref::r_Ref( const r_Ref_Any& obj )
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "r_Ref( const r_Ref_Any& )")
memptr = (T*)obj.get_memory_ptr();
oid = obj.get_oid();
}
template
r_Ref::r_Ref( T* ptr )
: oid(), memptr( ptr )
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "r_Ref( const T* )")
}
template
r_Ref::r_Ref( const r_OId &initOId, T* ptr )
: oid( initOId ), memptr( ptr )
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "r_Ref( const r_OId &oid, const T* )")
}
template
r_Ref::~r_Ref()
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "~r_Ref()")
// object should not be delete from databse when reference destructor is called
// if( memptr ){
// delete memptr;
// memptr = 0;
// }
}
template
r_Ref::operator r_Ref_Any() const
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "operator r_Ref_Any()")
return r_Ref_Any( oid, (r_Object *)memptr );
}
/*
template
r_Ref::operator const r_Ref_Any() const
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "operator const r_Ref_Any()")
return r_Ref_Any( oid, memptr );
}
*/
template
r_Ref&
r_Ref::operator=( const r_Ref_Any& ptr )
{
memptr = (T*)ptr.get_memory_ptr();
oid = ptr.get_oid();
return *this;
}
template
r_Ref&
r_Ref::operator=( T* ptr )
{
memptr = ptr;
oid = r_OId();
return *this;
}
/*
template
r_Ref&
r_Ref::operator=( r_Ref& objptr )
{
memptr = objptr.memptr;
oid = objptr.oid;
return *this;
}
*/
template
r_Ref&
r_Ref::operator=( const r_Ref& objptr )
{
memptr = objptr.memptr;
oid = objptr.oid;
return *this;
}
template
const T&
r_Ref::operator*() const throw( r_Error )
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "operator*()")
if( !memptr )
load_object();
if( !memptr )
{
r_Error err = r_Error( r_Error::r_Error_RefNull );
throw err;
}
return *memptr;
}
template
T&
r_Ref::operator*() throw( r_Error )
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "operator*()")
if( !memptr )
load_object();
if( !memptr )
{
r_Error err = r_Error( r_Error::r_Error_RefNull );
throw err;
}
return *memptr;
}
template
const T*
r_Ref::operator->() const throw( r_Error )
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "operator->()")
if( !memptr )
load_object();
if( !memptr )
{
r_Error err = r_Error( r_Error::r_Error_RefNull );
throw err;
}
return memptr;
}
template
T*
r_Ref::operator->() throw( r_Error )
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "operator->()")
if( !memptr )
load_object();
if( !memptr )
{
r_Error err = r_Error( r_Error::r_Error_RefNull );
throw err;
}
return memptr;
}
template
const T*
r_Ref::ptr() const throw( r_Error )
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "ptr()")
if( !memptr )
load_object();
return memptr;
}
template
T*
r_Ref::ptr() throw( r_Error )
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "ptr()")
if( !memptr )
load_object();
return memptr;
}
template
int
r_Ref::operator!() const
{
return !is_null();
}
template
int
r_Ref::is_null() const
{
return (memptr==0) && !oid.is_valid();
}
template
int
r_Ref::operator==( const r_Ref& refR ) const
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "operator==( const r_Ref& )")
return // both refs are not valid or ...
( is_null() && refR.is_null() ) ||
// both oids are valid and the same or ...
( oid.is_valid() && oid == refR.oid ) ||
// both oids are not valid and memory pointers are the same
( !oid.is_valid() && !refR.oid.is_valid() && memptr == refR.memptr );
}
template
int
r_Ref::operator!=( const r_Ref& refR ) const
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "operator!=( const r_Ref& )")
return !operator==( refR );
}
template
int
r_Ref::operator==( const T* ptr ) const
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "operator==( const T* )")
return memptr == ptr;
}
template
int
r_Ref::operator!=( const T* ptr ) const
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "operator!=( const T* )")
return !operator==( ptr );
}
template
void
r_Ref::destroy()
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "destroy()")
if( memptr && !oid.is_valid() ){
delete memptr;
memptr = 0;
}
}
template
void
r_Ref::delete_object()
{
RMDBGONCE(4, RMDebug::module_rasodmg, "r_Ref", "delete_object()")
if( memptr ){
delete memptr;
memptr = 0;
}
}
template
T*
r_Ref::get_memory_ptr() const
{
return memptr;
}
#ifdef DEF_TRANSACTION
template
void
r_Ref::load_object() const
{
if( oid.is_valid() )
{
if( r_Database::actual_database == 0 || r_Database::actual_database->get_status() == r_Database::not_open )
{
r_Error err = r_Error( r_Error::r_Error_DatabaseClosed );
throw err;
}
if( r_Transaction::actual_transaction == 0 ||
r_Transaction::actual_transaction->get_status() != r_Transaction::active )
{
r_Error err = r_Error( r_Error::r_Error_TransactionNotOpen );
throw err;
}
// load object and take its memory pointer
r_Ref ref = r_Transaction::actual_transaction->load_object( oid );
memptr = ref.get_memory_ptr();
}
}
#endif