00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #define DBCNV_DVPERSISTENT_CPP
00018
00019 #include "GaudiDb/DbLink.h"
00020 #include "GaudiDb/DbPersistent.h"
00021 #include "GaudiDb/DbContainer.h"
00022 #include "GaudiDb/DbObjectGuard.h"
00023
00024 void DbPersistent::release() {
00025 delete this;
00026 }
00027
00028 DbPersistentGuard* DbPersistent::createGuard() {
00029 return new DbObjectGuard();
00030 }
00031
00032 void* DbPersistent::allocate ( const dbHandle<DbContainer>& cntH, const DbTypeInfo& type ) {
00033 if ( cntH.isValid() ) {
00034 DbPersistent* persistent = type.create(cntH);
00035 void* transient = type.allocate();
00036 DbObjectGuard* guard = new DbObjectGuard(type.type(), persistent, cntH);
00037 DbPersistent::setGuard( (DbObject*)transient, guard );
00038 return transient;
00039 }
00040 return 0;
00041 }
00042
00043 DbObject* DbPersistent::create (const DbTypeInfo* type, DbPersistent* persistent, const dbHandle<DbContainer>& cntH) {
00044 void* transient = type->allocate();
00045 DbObject* pObj = type->construct(transient);
00046 DbObjectGuard* guard = new DbObjectGuard(type->type(), persistent, cntH);
00047 DbPersistent::setGuard( pObj, guard );
00048 return pObj;
00049 }
00050
00051 DbObject* DbPersistent::load (DbPersistent* persistent, const dbHandle<DbContainer>& cntH) {
00052 const DbTypeInfo* type = persistent->typeInfo();
00053 DbObject* pObj = create(type, persistent, cntH);
00054 persistent->load(pObj);
00055 return pObj;
00056 }
00057
00058 bool DbPersistent::load(DbObject* pObj) {
00059
00060 DbPersistentGuard* g = DbPersistent::guard(pObj);
00061
00062 if ( getBuffer(0, g->objectSize(), g->objBuffer()) ) {
00063
00064 if ( getBuffer(g->objectSize(), g->size()-g->objectSize(), g->linkBuffer()) ) {
00065 return true;
00066 }
00067 }
00068 return false;
00069 }
00070
00071 bool DbPersistent::save(const DbObject* pObj) {
00072
00073 const DbPersistentGuard* g = DbPersistent::guard(pObj);
00074 long linkSize = g->linkBuffer().buffPointer();
00075 long objSize = g->objBuffer().buffPointer();
00076
00077 if ( setBuffer(0, objSize, g->objBuffer()) ) {
00078
00079 if ( setBuffer(objSize, linkSize, g->linkBuffer()) ) {
00080 return true;
00081 }
00082 }
00083 return false;
00084 }