diff --git a/sql/inc/TBufferSQL2.h b/sql/inc/TBufferSQL2.h index 60c275fcdc95a4f48e51f8ce7db5a6b5d96469c6..e7c8c5014b8c240865e6c1e4877d24f6a280b1d5 100644 --- a/sql/inc/TBufferSQL2.h +++ b/sql/inc/TBufferSQL2.h @@ -1,4 +1,4 @@ -// @(#)root/sql:$Name: $:$Id: TBufferSQL2.h,v 1.5 2005/12/02 23:23:36 pcanal Exp $ +// @(#)root/sql:$Name: $:$Id: TBufferSQL2.h,v 1.6 2005/12/07 14:59:57 rdm Exp $ // Author: Sergey Linev 20/11/2005 @@ -132,8 +132,7 @@ class TBufferSQL2 : public TBuffer { TSQLStructure* SqlWrite(const TObject* obj, Int_t objid); TSQLStructure* SqlWrite(const void* obj, const TClass* cl, Int_t objid); - TObject* SqlRead(Int_t objid); - void* SqlReadAny(Int_t objid, TClass** cl); + void* SqlReadAny(Int_t objid, void* obj, TClass** cl); // suppress class writing/reading diff --git a/sql/inc/TKeySQL.h b/sql/inc/TKeySQL.h index 24402d1d05e4056929d4a4833753783ba437e2a3..492f532238a91716cf8766a65f6f7af2cacbfebe 100644 --- a/sql/inc/TKeySQL.h +++ b/sql/inc/TKeySQL.h @@ -1,4 +1,4 @@ -// @(#)root/sql:$Name: $:$Id: TKeySQL.h,v 1.2 2005/11/22 20:42:36 pcanal Exp $ +// @(#)root/sql:$Name: $:$Id: TKeySQL.h,v 1.3 2005/12/07 14:59:57 rdm Exp $ // Author: Sergey Linev 20/11/2005 /************************************************************************* @@ -34,6 +34,7 @@ protected: virtual Int_t Read(const char *name) { return TKey::Read(name); } void StoreObject(const void* obj, const TClass* cl); + void* SqlReadAny(void* obj, const TClass* expectedClass); TSQLFile* fFile; //! pointer on SQL file Int_t fKeyId; //! key identifier in KeysTables @@ -61,16 +62,16 @@ public: virtual Long64_t GetSeekPdir() const { return 1;} virtual void Keep() {} - virtual Int_t Read(TObject*) { return 0; } + virtual Int_t Read(TObject* obj); virtual TObject *ReadObj(); - virtual void *ReadObjectAny(const TClass *cl); + virtual void *ReadObjectAny(const TClass *expectedClass); virtual void ReadBuffer(char *&) {} virtual void ReadFile() {} virtual void SetBuffer() { fBuffer = 0; } virtual void SetParent(const TObject* ) { } virtual Int_t Sizeof() const { return 0; } - virtual Int_t WriteFile(Int_t =1) { return 0; } + virtual Int_t WriteFile(Int_t =1, TFile* = 0) { return 0; } ClassDef(TKeySQL,1) // a special TKey for SQL data base }; diff --git a/sql/src/TBufferSQL2.cxx b/sql/src/TBufferSQL2.cxx index 634fa95da6c72e4a715c18589c84660b7da3354b..6ff6667e26013538a4395ecc708fccaf254c4b23 100644 --- a/sql/src/TBufferSQL2.cxx +++ b/sql/src/TBufferSQL2.cxx @@ -1,4 +1,4 @@ -// @(#)root/sql:$Name: $:$Id: TBufferSQL2.cxx,v 1.6 2005/12/02 23:23:36 pcanal Exp $ +// @(#)root/sql:$Name: $:$Id: TBufferSQL2.cxx,v 1.7 2005/12/07 14:59:57 rdm Exp $ // Author: Sergey Linev 20/11/2005 /************************************************************************* @@ -155,26 +155,7 @@ TSQLStructure* TBufferSQL2::SqlWrite(const void* obj, const TClass* cl, Int_t ob } //______________________________________________________________________________ -TObject* TBufferSQL2::SqlRead(Int_t objid) -{ - // Recreate object from sql structure. - // Return pointer to read object. - // If object class is not inherited from TObject, - // object is deleted and function return 0 - - TClass* cl = 0; - void* obj = SqlReadAny(objid, &cl); - - if ((cl!=0) && !cl->InheritsFrom(TObject::Class())) { - cl->Destructor(obj); - obj = 0; - } - - return (TObject*) obj; -} - -//______________________________________________________________________________ -void* TBufferSQL2::SqlReadAny(Int_t objid, TClass** cl) +void* TBufferSQL2::SqlReadAny(Int_t objid, void* obj, TClass** cl) { // Recreate object from sql structure. // Return pointer to read object. @@ -188,7 +169,7 @@ void* TBufferSQL2::SqlReadAny(Int_t objid, TClass** cl) fReadVersionBuffer = -1; - return SqlReadObjectDirect(0, cl, objid); + return SqlReadObjectDirect(obj, cl, objid); } //______________________________________________________________________________ diff --git a/sql/src/TKeySQL.cxx b/sql/src/TKeySQL.cxx index b423f5144905c18c0151b04e1b23a2827ac9dbe6..ed98c66672651e41e582f85deb98cfde5ab62cae 100644 --- a/sql/src/TKeySQL.cxx +++ b/sql/src/TKeySQL.cxx @@ -1,4 +1,4 @@ -// @(#)root/sql:$Name: $:$Id: TKeySQL.cxx,v 1.4 2005/12/01 16:30:43 pcanal Exp $ +// @(#)root/sql:$Name: $:$Id: TKeySQL.cxx,v 1.5 2005/12/07 14:59:57 rdm Exp $ // Author: Sergey Linev 20/11/2005 /************************************************************************* @@ -19,6 +19,7 @@ #include "TKeySQL.h" +#include "TROOT.h" #include "TClass.h" #include "TBrowser.h" #include "Riostream.h" @@ -208,35 +209,70 @@ zombie: // delete this; } +//______________________________________________________________________________ +Int_t TKeySQL::Read(TObject* tobj) +{ + // To read an object from the file. + // The object associated to this key is read from the file into memory. + // Before invoking this function, obj has been created via the + // default constructor. + + if (tobj==0) return 0; + + void* res = SqlReadAny(tobj, 0); + + return res==0 ? 0 : 1; +} + //______________________________________________________________________________ TObject* TKeySQL::ReadObj() { // Read object derived from TObject class // If it is not TObject or in case of error, return 0 - if (gDebug>0) - cout << "TKeySQL::ReadObj fKeyId = " << fKeyId << endl; - - if ((fKeyId<=0) || (fFile==0)) return 0; - - TBufferSQL2 buffer(TBuffer::kRead, fFile); - - TObject* obj = buffer.SqlRead(fObjId); - - return obj; + TObject* tobj = (TObject*) SqlReadAny(0, TObject::Class()); + + if ((tobj!=0) && gROOT->GetForceStyle()) tobj->UseCurrentStyle(); + + return tobj; } //______________________________________________________________________________ -void* TKeySQL::ReadObjectAny(const TClass* /*cl*/) +void* TKeySQL::ReadObjectAny(const TClass* expectedClass) { // read object of any type from SQL database + return SqlReadAny(0, expectedClass); +} + +//______________________________________________________________________________ +void* TKeySQL::SqlReadAny(void* obj, const TClass* expectedClass) +{ if ((fKeyId<=0) || (fFile==0)) return 0; TBufferSQL2 buffer(TBuffer::kRead, fFile); + + TClass* cl = 0; - void* obj = buffer.SqlReadAny(fObjId, 0); - - return obj; + void* res = buffer.SqlReadAny(fObjId, obj, &cl); + + if ((cl==0) || (res==0)) return 0; + + Int_t delta = 0; + + if (expectedClass!=0) { + delta = cl->GetBaseClassOffset(expectedClass); + if (delta<0) { + if (obj==0) cl->Destructor(res); + return 0; + } + if (cl->GetClassInfo() && !expectedClass->GetClassInfo()) { + //we cannot mix a compiled class with an emulated class in the inheritance + Warning("XmlReadAny", + "Trying to read an emulated class (%s) to store in a compiled pointer (%s)", + cl->GetName(),expectedClass->GetName()); + } + } + + return ((char*)res) + delta; } - diff --git a/sql/src/TSQLFile.cxx b/sql/src/TSQLFile.cxx index 2e9101ff419bb724b4fdb623497a87fb81365398..22ae48dd7801bbc91b5e015e76128dc56b96d2c7 100644 --- a/sql/src/TSQLFile.cxx +++ b/sql/src/TSQLFile.cxx @@ -1,4 +1,4 @@ -// @(#)root/sql:$Name: $:$Id: TSQLFile.cxx,v 1.4 2005/11/28 23:22:31 pcanal Exp $ +// @(#)root/sql:$Name: $:$Id: TSQLFile.cxx,v 1.5 2005/12/07 14:59:57 rdm Exp $ // Author: Sergey Linev 20/11/2005 /************************************************************************* @@ -963,38 +963,6 @@ TList* TSQLFile::GetStreamerInfoList() // Hopefully, problem will be solved soon return new TList; - - if (gDebug>1) - Info("GetStreamerInfoList","Start reading of streamer infos"); - - Int_t objid = -1; - - TString sqlcmd; - const char* quote = SQLIdentifierQuote(); - - sqlcmd.Form("SELECT %s%s%s FROM %s%s%s WHERE %s%s%s=%d", - quote, SQLObjectIdColumn(), quote, - quote, sqlio::KeysTable, quote, - quote, SQLKeyIdColumn(), quote, sqlio::Ids_StreamerInfos); - TSQLResult* res = SQLQuery(sqlcmd.Data(), 1); - TSQLRow* row = (res==0) ? 0 : res->Next(); - if (row!=0) objid = atoi((*row)[0]); - delete res; - delete row; - - if (objid<=0) return 0; - - TBufferSQL2 buffer(TBuffer::kRead, this); - - buffer.SetIgnoreVerification(); - - TObject* obj = buffer.SqlRead(objid); - - TList* list = dynamic_cast<TList*> (obj); - if (list==0) delete obj; - else list->Print("*"); - - return list; } //______________________________________________________________________________ diff --git a/xml/inc/TBufferXML.h b/xml/inc/TBufferXML.h index d98aa9efb051d56e5ebe7d18e6466eee964ddb25..6fe75862e7a904244427d06c0e50e44cbb3ce620 100644 --- a/xml/inc/TBufferXML.h +++ b/xml/inc/TBufferXML.h @@ -1,4 +1,4 @@ -// @(#)root/xml:$Name: $:$Id: TBufferXML.h,v 1.3 2005/12/02 23:23:36 pcanal Exp $ +// @(#)root/xml:$Name: $:$Id: TBufferXML.h,v 1.4 2006/01/20 01:12:13 pcanal Exp $ // Author: Sergey Linev 10.05.2004 /************************************************************************* @@ -218,7 +218,7 @@ protected: XMLNodePointer_t XmlWriteAny(const void* obj, const TClass* cl); void XmlReadBlock(XMLNodePointer_t node); - void* XmlReadAny(XMLNodePointer_t node, TClass** cl); + void* XmlReadAny(XMLNodePointer_t node, void* obj, TClass** cl); TXMLStackObj* PushStack(XMLNodePointer_t current, Bool_t simple = kFALSE); TXMLStackObj* PopStack(); diff --git a/xml/inc/TKeyXML.h b/xml/inc/TKeyXML.h index 1ede2ec16c442829e2cc4af212db69b6adc99b69..2c38455bdb9e3e75166875db3d279a4874522a25 100644 --- a/xml/inc/TKeyXML.h +++ b/xml/inc/TKeyXML.h @@ -1,4 +1,4 @@ -// @(#)root/xml:$Name: $:$Id: TKeyXML.h,v 1.2 2005/09/06 09:34:48 brun Exp $ +// @(#)root/xml:$Name: $:$Id: TKeyXML.h,v 1.3 2005/11/20 05:07:41 pcanal Exp $ // Author: Sergey Linev 10.05.2004 /************************************************************************* @@ -44,16 +44,16 @@ class TKeyXML : public TKey { //virtual void ls(Option_t* ="") const; //virtual void Print(Option_t* ="") const {} - virtual Int_t Read(TObject*) { return 0; } + virtual Int_t Read(TObject* tobj); virtual TObject *ReadObj(); - virtual void *ReadObjectAny(const TClass *cl); + virtual void *ReadObjectAny(const TClass *expectedClass); virtual void ReadBuffer(char *&) {} virtual void ReadFile() {} virtual void SetBuffer() { fBuffer = 0; } virtual void SetParent(const TObject* ) { } virtual Int_t Sizeof() const { return 0; } - virtual Int_t WriteFile(Int_t =1) { return 0; } + virtual Int_t WriteFile(Int_t =1, TFile* = 0) { return 0; } // TKeyXML specific methods @@ -67,6 +67,8 @@ class TKeyXML : public TKey { XMLNodePointer_t ObjNode(); XMLNodePointer_t BlockNode(); + void* XmlReadAny(void* obj, const TClass* expectedClass); + TXMLFile* fFile; //! TXMLEngine* fXML; //! XMLNodePointer_t fKeyNode; //! diff --git a/xml/src/TBufferXML.cxx b/xml/src/TBufferXML.cxx index 30bce115fc918aaa95e9e0fc4e4fd05b756b73ac..c6b70f65d48d2a1a27e451b6891939dee6c337a9 100644 --- a/xml/src/TBufferXML.cxx +++ b/xml/src/TBufferXML.cxx @@ -1,4 +1,4 @@ -// @(#)root/:$Name: $:$Id: TBufferXML.cxx,v 1.7 2005/12/02 23:23:36 pcanal Exp $ +// @(#)root/:$Name: $:$Id: TBufferXML.cxx,v 1.8 2006/01/20 01:12:13 pcanal Exp $ // Author: Sergey Linev, Rene Brun 10.05.2004 /************************************************************************* @@ -215,7 +215,7 @@ void* TBufferXML::ConvertFromXMLAny(const char* str, TClass** cl, Bool_t Generic XMLNodePointer_t xmlnode = xml.ReadSingleNode(str); - void* obj = buf.XmlReadAny(xmlnode, cl); + void* obj = buf.XmlReadAny(xmlnode, 0, cl); xml.FreeNode(xmlnode); @@ -238,7 +238,7 @@ XMLNodePointer_t TBufferXML::XmlWriteAny(const void* obj, const TClass* cl) } //______________________________________________________________________________ -void* TBufferXML::XmlReadAny(XMLNodePointer_t node, TClass** cl) +void* TBufferXML::XmlReadAny(XMLNodePointer_t node, void* obj, TClass** cl) { // Recreate object from xml structure. // Return pointer to read object. @@ -253,11 +253,11 @@ void* TBufferXML::XmlReadAny(XMLNodePointer_t node, TClass** cl) PushStack(node, kTRUE); - void* obj = XmlReadObject(0, cl); + void* res = XmlReadObject(obj, cl); PopStack(); - return obj; + return res; } //______________________________________________________________________________ @@ -1005,13 +1005,13 @@ void TBufferXML::WorkWithElement(TStreamerElement* elem, Int_t number) } //______________________________________________________________________________ -void TBufferXML::ClassBegin(const TClass* cl, Version_t version) +void TBufferXML::ClassBegin(const TClass* cl, Version_t) { WorkWithClass(0, cl); } //______________________________________________________________________________ -void TBufferXML::ClassEnd(const TClass* cl) +void TBufferXML::ClassEnd(const TClass*) { DecrementLevel(0); } diff --git a/xml/src/TKeyXML.cxx b/xml/src/TKeyXML.cxx index 0e03fee07b814e1404a9f13946ba9348595aa311..b4e4d94fcc9e87608106bae5999c2e070b5b54fc 100644 --- a/xml/src/TKeyXML.cxx +++ b/xml/src/TKeyXML.cxx @@ -1,4 +1,4 @@ -// @(#)root/xml:$Name: $:$Id: TKeyXML.cxx,v 1.4 2005/11/22 20:42:37 pcanal Exp $ +// @(#)root/xml:$Name: $:$Id: TKeyXML.cxx,v 1.5 2006/01/20 01:12:13 pcanal Exp $ // Author: Sergey Linev, Rene Brun 10.05.2004 /************************************************************************* @@ -22,6 +22,7 @@ #include "TBufferXML.h" #include "TXMLFile.h" #include "TClass.h" +#include "TROOT.h" #include "TBrowser.h" ClassImp(TKeyXML); @@ -196,42 +197,74 @@ XMLNodePointer_t TKeyXML::BlockNode() return 0; } +//______________________________________________________________________________ +Int_t TKeyXML::Read(TObject* tobj) +{ + // To read an object from the file. + // The object associated to this key is read from the file into memory. + // Before invoking this function, obj has been created via the + // default constructor. + + if (tobj==0) return 0; + + void* res = XmlReadAny(tobj, 0); + + return res==0 ? 0 : 1; +} + //______________________________________________________________________________ TObject* TKeyXML::ReadObj() { // read object derived from TObject class, from key // if it is not TObject or in case of error, return 0 - if (fKeyNode==0) return 0; - TBufferXML buffer(TBuffer::kRead, fFile); - if (fFile->GetIOVersion()==1) - buffer.SetBit(TBuffer::kCannotHandleMemberWiseStreaming, kFALSE); - buffer.XmlReadBlock(BlockNode()); - TClass* cl = 0; - void* obj = buffer.XmlReadAny(ObjNode(), &cl); + TObject* tobj = (TObject*) XmlReadAny(0, TObject::Class()); - if ((cl==0) || (obj==0)) return 0; - - Int_t delta = cl->GetBaseClassOffset(TObject::Class()); - - if (delta<0) { - cl->Destructor(obj); - return 0; - } + if ((tobj!=0) && gROOT->GetForceStyle()) tobj->UseCurrentStyle(); - return (TObject*) ( ( (char*)obj ) + delta ); + return tobj; } //______________________________________________________________________________ -void* TKeyXML::ReadObjectAny(const TClass* /*cl*/) +void* TKeyXML::ReadObjectAny(const TClass *expectedClass) { // read object of any type + + return XmlReadAny(0, expectedClass); +} + +//______________________________________________________________________________ +void* TKeyXML::XmlReadAny(void* obj, const TClass* expectedClass) +{ + // read object from key and cast to expected class if (fKeyNode==0) return 0; + TBufferXML buffer(TBuffer::kRead, fFile); if (fFile->GetIOVersion()==1) buffer.SetBit(TBuffer::kCannotHandleMemberWiseStreaming, kFALSE); buffer.XmlReadBlock(BlockNode()); - void* obj = buffer.XmlReadAny(ObjNode(), 0); - return obj; + + TClass* cl = 0; + void* res = buffer.XmlReadAny(ObjNode(), obj, &cl); + + if ((cl==0) || (res==0)) return 0; + + Int_t delta = 0; + + if (expectedClass!=0) { + delta = cl->GetBaseClassOffset(expectedClass); + if (delta<0) { + if (obj==0) cl->Destructor(res); + return 0; + } + if (cl->GetClassInfo() && !expectedClass->GetClassInfo()) { + //we cannot mix a compiled class with an emulated class in the inheritance + Warning("XmlReadAny", + "Trying to read an emulated class (%s) to store in a compiled pointer (%s)", + cl->GetName(),expectedClass->GetName()); + } + } + + return ((char*)res) + delta; }