53 ClassImp(TBufferSQL2);
58 TBufferSQL2::TBufferSQL2()
59 : TBufferText(), fSQL(nullptr), fIOVersion(1), fStructure(nullptr), fStk(0), fReadBuffer(), fErrorFlag(0),
60 fCompressLevel(ROOT::RCompressionSetting::EAlgorithm::kUseGlobal), fReadVersionBuffer(-1), fObjIdCounter(1), fIgnoreVerification(kFALSE),
61 fCurrentData(nullptr), fObjectsInfos(nullptr), fFirstObjId(0), fLastObjId(0), fPoolsMap(nullptr)
70 TBufferSQL2::TBufferSQL2(TBuffer::EMode mode, TSQLFile *file)
71 : TBufferText(mode, file), fSQL(nullptr), fIOVersion(1), fStructure(nullptr), fStk(0), fReadBuffer(), fErrorFlag(0),
72 fCompressLevel(ROOT::RCompressionSetting::EAlgorithm::kUseGlobal), fReadVersionBuffer(-1), fObjIdCounter(1), fIgnoreVerification(kFALSE),
73 fCurrentData(nullptr), fObjectsInfos(nullptr), fFirstObjId(0), fLastObjId(0), fPoolsMap(nullptr)
77 SetCompressionLevel(file->GetCompressionLevel());
78 fIOVersion = file->GetIOVersion();
85 TBufferSQL2::~TBufferSQL2()
91 fObjectsInfos->Delete();
96 fPoolsMap->DeleteValues();
106 TSQLStructure *TBufferSQL2::SqlWriteAny(
const void *obj,
const TClass *cl, Long64_t objid)
110 fStructure =
nullptr;
113 fObjIdCounter = objid;
115 SqlWriteObject(obj, cl, kTRUE);
119 std::cout <<
"==== Printout of Sql structures ===== " << std::endl;
120 fStructure->Print(
"*");
121 std::cout <<
"=========== End printout ============ " << std::endl;
132 void *TBufferSQL2::SqlReadAny(Long64_t keyid, Long64_t objid, TClass **cl,
void *obj)
142 fReadVersionBuffer = -1;
144 fObjectsInfos = fSQL->SQLObjectsInfo(keyid);
148 TSQLObjectInfo *objinfo = (TSQLObjectInfo *)fObjectsInfos->Last();
150 fLastObjId = objinfo->GetObjId();
153 return SqlReadObjectDirect(obj, cl, objid);
160 Bool_t TBufferSQL2::SqlObjectInfo(Long64_t objid, TString &clname, Version_t &version)
162 if ((objid < 0) || !fObjectsInfos)
167 Long64_t shift = objid - fFirstObjId;
169 TSQLObjectInfo *info =
nullptr;
170 if ((shift >= 0) && (shift <= fObjectsInfos->GetLast())) {
171 info = (TSQLObjectInfo *)fObjectsInfos->At(shift);
172 if (info->GetObjId() != objid)
178 Info(
"SqlObjectInfo",
"Standard not works %lld", objid);
179 for (Int_t n = 0; n <= fObjectsInfos->GetLast(); n++) {
180 info = (TSQLObjectInfo *)fObjectsInfos->At(n);
181 if (info->GetObjId() == objid)
190 clname = info->GetObjClassName();
191 version = info->GetObjVersion();
205 TSQLObjectData *TBufferSQL2::SqlObjectData(Long64_t objid, TSQLClassInfo *sqlinfo)
207 TSQLResult *classdata =
nullptr;
208 TSQLRow *classrow =
nullptr;
210 if (sqlinfo->IsClassTableExist()) {
212 TSQLObjectDataPool *pool =
nullptr;
215 pool = (TSQLObjectDataPool *)fPoolsMap->GetValue(sqlinfo);
217 if (pool && (fLastObjId >= fFirstObjId)) {
219 Info(
"SqlObjectData",
"Before request to %s", sqlinfo->GetClassTableName());
220 TSQLResult *alldata = fSQL->GetNormalClassDataAll(fFirstObjId, fLastObjId, sqlinfo);
222 Info(
"SqlObjectData",
"After request res = 0x%lx", (Long_t)alldata);
224 Error(
"SqlObjectData",
"Cannot get data from table %s", sqlinfo->GetClassTableName());
229 fPoolsMap =
new TMap();
230 pool =
new TSQLObjectDataPool(sqlinfo, alldata);
231 fPoolsMap->Add(sqlinfo, pool);
237 if (pool->GetSqlInfo() != sqlinfo) {
238 Error(
"SqlObjectData",
"Missmatch in pools map !!! CANNOT BE !!!");
242 classdata = pool->GetClassData();
244 classrow = pool->GetObjectRow(objid);
246 Error(
"SqlObjectData",
"Can not find row for objid = %lld in table %s", objid, sqlinfo->GetClassTableName());
251 TSQLResult *blobdata =
nullptr;
252 TSQLStatement *blobstmt = fSQL->GetBlobClassDataStmt(objid, sqlinfo);
255 blobdata = fSQL->GetBlobClassData(objid, sqlinfo);
257 return new TSQLObjectData(sqlinfo, objid, classdata, classrow, blobdata, blobstmt);
265 Int_t TBufferSQL2::SqlWriteObject(
const void *obj,
const TClass *cl, Bool_t cacheReuse, TMemberStreamer *streamer,
266 Int_t streamer_index)
269 Info(
"SqlWriteObject",
"Object: %p Class: %s", obj, (cl ? cl->GetName() :
"null"));
281 Long64_t value = GetObjectTag(obj);
283 objid = fFirstObjId + value - 1;
287 Info(
"SqlWriteObject",
"Find objectid %ld", (
long)objid);
290 Stack()->SetObjectPointer(objid);
295 objid = fObjIdCounter++;
297 Stack()->SetObjectRef(objid, cl);
300 MapObject(obj, cl, objid - fFirstObjId + 1);
303 (*streamer)(*
this, (
void *)obj, streamer_index);
305 ((TClass *)cl)->Streamer((
void *)obj, *
this);
308 Info(
"SqlWriteObject",
"Done write of %s", cl->GetName());
318 void *TBufferSQL2::SqlReadObject(
void *obj, TClass **cl, TMemberStreamer *streamer, Int_t streamer_index,
319 const TClass *onFileClass)
327 Bool_t findptr = kFALSE;
329 const char *refid = fCurrentData->GetValue();
330 if ((refid == 0) || (strlen(refid) == 0)) {
331 Error(
"SqlReadObject",
"Invalid object reference value");
336 Long64_t objid = (Long64_t)std::stoll(refid);
339 Info(
"SqlReadObject",
"Starting objid: %ld column: %s", (
long)objid, fCurrentData->GetLocatedField());
341 if (!fCurrentData->IsBlobData() || fCurrentData->VerifyDataType(sqlio::ObjectPtr, kFALSE)) {
345 }
else if (objid == -1) {
347 }
else if (objid >= fFirstObjId) {
348 void *obj1 =
nullptr;
349 TClass *cl1 =
nullptr;
350 GetMappedObject(objid - fFirstObjId + 1, obj1, cl1);
359 if ((gDebug > 3) && findptr)
360 Info(
"SqlReadObject",
"Found pointer %p cl %s", obj, ((cl && *cl) ? (*cl)->GetName() :
"null"));
363 fCurrentData->ShiftToNextValue();
367 if (fCurrentData->IsBlobData())
368 if (!fCurrentData->VerifyDataType(sqlio::ObjectRef)) {
369 Error(
"SqlReadObject",
"Object reference or pointer is not found in blob data");
374 fCurrentData->ShiftToNextValue();
376 if ((gDebug > 2) || (objid < 0))
377 Info(
"SqlReadObject",
"Found object reference %ld", (
long)objid);
379 return SqlReadObjectDirect(obj, cl, objid, streamer, streamer_index, onFileClass);
386 void *TBufferSQL2::SqlReadObjectDirect(
void *obj, TClass **cl, Long64_t objid, TMemberStreamer *streamer,
387 Int_t streamer_index,
const TClass *onFileClass)
392 if (!SqlObjectInfo(objid, clname, version))
396 Info(
"SqlReadObjectDirect",
"objid = %lld clname = %s ver = %d", objid, clname.Data(), version);
398 TSQLClassInfo *sqlinfo = fSQL->FindSQLClassInfo(clname.Data(), version);
400 TClass *objClass = TClass::GetClass(clname);
401 if (objClass == TDirectory::Class())
402 objClass = TDirectoryFile::Class();
404 if (!objClass || !sqlinfo) {
405 Error(
"SqlReadObjectDirect",
"Class %s is not known", clname.Data());
410 obj = objClass->New();
412 MapObject(obj, objClass, objid - fFirstObjId + 1);
414 PushStack()->SetObjectRef(objid, objClass);
416 TSQLObjectData *olddata = fCurrentData;
418 if (sqlinfo->IsClassTableExist()) {
420 if ((objClass == TObject::Class()) || (objClass == TString::Class())) {
422 TSQLObjectData *objdata =
new TSQLObjectData;
423 if (objClass == TObject::Class())
424 TSQLStructure::UnpackTObject(fSQL,
this, objdata, objid, version);
425 else if (objClass == TString::Class())
426 TSQLStructure::UnpackTString(fSQL,
this, objdata, objid, version);
428 Stack()->AddObjectData(objdata);
429 fCurrentData = objdata;
433 fReadVersionBuffer = version;
435 TSQLObjectData *objdata = SqlObjectData(objid, sqlinfo);
436 if (!objdata || !objdata->PrepareForRawData()) {
437 Error(
"SqlReadObjectDirect",
"No found raw data for obj %lld in class %s version %d table", objid,
438 clname.Data(), version);
443 Stack()->AddObjectData(objdata);
445 fCurrentData = objdata;
449 streamer->SetOnFileClass(onFileClass);
450 (*streamer)(*
this, (
void *)obj, streamer_index);
452 objClass->Streamer((
void *)obj, *
this, onFileClass);
458 Info(
"SqlReadObjectDirect",
"Read object of class %s done", objClass->GetName());
463 fCurrentData = olddata;
474 void TBufferSQL2::IncrementLevel(TVirtualStreamerInfo *info)
479 PushStack()->SetStreamerInfo((TStreamerInfo *)info);
482 Info(
"IncrementLevel",
"Info: %s", info->GetName());
484 WorkWithClass(info->GetName(), info->GetClassVersion());
491 void TBufferSQL2::DecrementLevel(TVirtualStreamerInfo *info)
493 if (Stack()->GetElement())
498 fCurrentData = Stack()->GetObjectData(kTRUE);
501 Info(
"DecrementLevel",
"Info: %s", info->GetName());
509 void TBufferSQL2::SetStreamerElementNumber(TStreamerElement *elem, Int_t comp_type)
511 if (Stack()->GetElement())
513 TSQLStructure *curr = Stack();
515 TStreamerInfo *info = curr->GetStreamerInfo();
517 Error(
"SetStreamerElementNumber",
"Error in structures stack");
521 WorkWithElement(elem, comp_type);
539 void TBufferSQL2::ClassBegin(
const TClass *cl, Version_t classversion)
558 if (classversion < 0)
559 classversion = cl->GetClassVersion();
561 PushStack()->SetCustomClass(cl, classversion);
564 Info(
"ClassBegin",
"Class: %s", cl->GetName());
566 WorkWithClass(cl->GetName(), classversion);
573 void TBufferSQL2::ClassEnd(
const TClass *cl)
575 if (Stack()->GetType() == TSQLStructure::kSqlCustomElement)
580 fCurrentData = Stack()->GetObjectData(kTRUE);
583 Info(
"ClassEnd",
"Class: %s", cl->GetName());
592 void TBufferSQL2::ClassMember(
const char *name,
const char *typeName, Int_t arrsize1, Int_t arrsize2)
597 if (!name || (strlen(name) == 0)) {
598 Error(
"ClassMember",
"Invalid member name");
603 TString tname = typeName;
607 if (strcmp(typeName,
"raw:data") == 0)
608 typ_id = TStreamerInfo::kMissing;
611 TDataType *dt = gROOT->GetType(typeName);
613 if ((dt->GetType() > 0) && (dt->GetType() < 20))
614 typ_id = dt->GetType();
618 if (strcmp(name, typeName) == 0) {
619 TClass *cl = TClass::GetClass(tname.Data());
621 typ_id = TStreamerInfo::kBase;
625 Bool_t isptr = kFALSE;
626 if (tname[tname.Length() - 1] ==
'*') {
627 tname.Resize(tname.Length() - 1);
630 TClass *cl = TClass::GetClass(tname.Data());
632 Error(
"ClassMember",
"Invalid class specifier %s", typeName);
638 typ_id = isptr ? TStreamerInfo::kObjectp : TStreamerInfo::kObject;
640 typ_id = isptr ? TStreamerInfo::kAnyp : TStreamerInfo::kAny;
642 if ((cl == TString::Class()) && !isptr)
643 typ_id = TStreamerInfo::kTString;
646 TStreamerElement *elem =
nullptr;
648 if (typ_id == TStreamerInfo::kMissing) {
649 elem =
new TStreamerElement(name,
"title", 0, typ_id,
"raw:data");
650 }
else if (typ_id == TStreamerInfo::kBase) {
651 TClass *cl = TClass::GetClass(tname.Data());
653 TStreamerBase *b =
new TStreamerBase(tname.Data(),
"title", 0);
654 b->SetBaseVersion(cl->GetClassVersion());
657 }
else if ((typ_id > 0) && (typ_id < 20)) {
658 elem =
new TStreamerBasicType(name,
"title", 0, typ_id, typeName);
659 }
else if ((typ_id == TStreamerInfo::kObject) || (typ_id == TStreamerInfo::kTObject) ||
660 (typ_id == TStreamerInfo::kTNamed)) {
661 elem =
new TStreamerObject(name,
"title", 0, tname.Data());
662 }
else if (typ_id == TStreamerInfo::kObjectp) {
663 elem =
new TStreamerObjectPointer(name,
"title", 0, tname.Data());
664 }
else if (typ_id == TStreamerInfo::kAny) {
665 elem =
new TStreamerObjectAny(name,
"title", 0, tname.Data());
666 }
else if (typ_id == TStreamerInfo::kAnyp) {
667 elem =
new TStreamerObjectAnyPointer(name,
"title", 0, tname.Data());
668 }
else if (typ_id == TStreamerInfo::kTString) {
669 elem =
new TStreamerString(name,
"title", 0);
673 Error(
"ClassMember",
"Invalid combination name = %s type = %s", name, typeName);
679 elem->SetArrayDim(arrsize2 > 0 ? 2 : 1);
680 elem->SetMaxIndex(0, arrsize1);
682 elem->SetMaxIndex(1, arrsize2);
686 if (Stack()->GetType() == TSQLStructure::kSqlCustomElement)
690 WorkWithElement(elem, -1);
697 void TBufferSQL2::WorkWithClass(
const char *classname, Version_t classversion)
705 if (fCurrentData && fCurrentData->IsBlobData() && fCurrentData->VerifyDataType(sqlio::ObjectInst, kFALSE)) {
706 objid = atoi(fCurrentData->GetValue());
707 fCurrentData->ShiftToNextValue();
709 sobjid.Form(
"%lld", objid);
710 Stack()->ChangeValueOnly(sobjid.Data());
712 objid = Stack()->DefineObjectId(kTRUE);
714 Error(
"WorkWithClass",
"cannot define object id");
719 TSQLClassInfo *sqlinfo = fSQL->FindSQLClassInfo(classname, classversion);
721 Error(
"WorkWithClass",
"Can not find table for class %s version %d", classname, classversion);
726 TSQLObjectData *objdata = SqlObjectData(objid, sqlinfo);
728 Error(
"WorkWithClass",
"Request error for data of object %lld for class %s version %d", objid, classname,
734 Stack()->AddObjectData(objdata);
736 fCurrentData = objdata;
746 void TBufferSQL2::WorkWithElement(TStreamerElement *elem, Int_t )
749 Info(
"WorkWithElement",
"elem = %s", elem->GetName());
751 TSQLStructure *stack = Stack(1);
752 TStreamerInfo *info = stack->GetStreamerInfo();
753 Int_t number = info ? info->GetElements()->IndexOf(elem) : -1;
756 PushStack()->SetStreamerElement(elem, number);
758 PushStack()->SetCustomElement(elem);
763 Error(
"WorkWithElement",
"Object data is lost");
768 fCurrentData = Stack()->GetObjectData(kTRUE);
770 Int_t located = Stack()->LocateElementColumn(fSQL,
this, fCurrentData);
772 if (located == TSQLStructure::kColUnknown) {
773 Error(
"WorkWithElement",
"Cannot locate correct column in the table");
776 }
else if ((located == TSQLStructure::kColObject) || (located == TSQLStructure::kColObjectArray) ||
777 (located == TSQLStructure::kColParent)) {
779 fCurrentData = Stack()->GetObjectData(kTRUE);
787 TClass *TBufferSQL2::ReadClass(
const TClass *, UInt_t *)
795 void TBufferSQL2::WriteClass(
const TClass *)
804 Version_t TBufferSQL2::ReadVersion(UInt_t *start, UInt_t *bcnt,
const TClass *)
813 if (fReadVersionBuffer >= 0) {
814 res = fReadVersionBuffer;
815 fReadVersionBuffer = -1;
817 Info(
"ReadVersion",
"from buffer = %d", (
int)res);
818 }
else if (fCurrentData && fCurrentData->IsBlobData() && fCurrentData->VerifyDataType(sqlio::Version)) {
819 TString value = fCurrentData->GetValue();
822 Info(
"ReadVersion",
"from blob %s = %d", fCurrentData->GetBlobPrefixName(), (int)res);
823 fCurrentData->ShiftToNextValue();
825 Error(
"ReadVersion",
"No correspondent tags to read version");
837 UInt_t TBufferSQL2::WriteVersion(
const TClass *cl, Bool_t )
840 Info(
"WriteVersion",
"cl:%s ver:%d", (cl ? cl->GetName() :
"null"), (
int)(cl ? cl->GetClassVersion() : 0));
843 Stack()->AddVersion(cl);
851 void *TBufferSQL2::ReadObjectAny(
const TClass *)
853 return SqlReadObject(0);
861 void TBufferSQL2::SkipObjectAny()
868 void TBufferSQL2::WriteObjectClass(
const void *actualObjStart,
const TClass *actualClass, Bool_t cacheReuse)
871 Info(
"WriteObjectClass",
"class %s", (actualClass ? actualClass->GetName() :
" null"));
872 SqlWriteObject(actualObjStart, actualClass, cacheReuse);
878 template <
typename T>
879 R__ALWAYS_INLINE
void TBufferSQL2::SqlReadArrayContent(T *arr, Int_t arrsize, Bool_t withsize)
882 Info(
"SqlReadArrayContent",
"size %d", (
int)(arrsize));
883 PushStack()->SetArray(withsize ? arrsize : -1);
884 Int_t indx(0), first, last;
885 if (fCurrentData->IsBlobData()) {
886 while (indx < arrsize) {
887 const char *name = fCurrentData->GetBlobPrefixName();
888 if (strstr(name, sqlio::IndexSepar) == 0) {
889 sscanf(name,
"[%d", &first);
892 sscanf(name,
"[%d..%d", &first, &last);
894 if ((first != indx) || (last < first) || (last >= arrsize)) {
895 Error(
"SqlReadArrayContent",
"Error reading array content %s", name);
899 SqlReadBasic(arr[indx++]);
901 arr[indx++] = arr[first];
904 while (indx < arrsize)
905 SqlReadBasic(arr[indx++]);
909 Info(
"SqlReadArrayContent",
"done");
912 template <
typename T>
913 R__ALWAYS_INLINE Int_t TBufferSQL2::SqlReadArray(T *&arr, Bool_t is_static)
915 Int_t n = SqlReadArraySize();
923 SqlReadArrayContent(arr, n, kTRUE);
930 Int_t TBufferSQL2::ReadArray(Bool_t *&b)
932 return SqlReadArray(b);
938 Int_t TBufferSQL2::ReadArray(Char_t *&c)
940 return SqlReadArray(c);
946 Int_t TBufferSQL2::ReadArray(UChar_t *&c)
948 return SqlReadArray(c);
954 Int_t TBufferSQL2::ReadArray(Short_t *&h)
956 return SqlReadArray(h);
962 Int_t TBufferSQL2::ReadArray(UShort_t *&h)
964 return SqlReadArray(h);
970 Int_t TBufferSQL2::ReadArray(Int_t *&i)
972 return SqlReadArray(i);
978 Int_t TBufferSQL2::ReadArray(UInt_t *&i)
980 return SqlReadArray(i);
986 Int_t TBufferSQL2::ReadArray(Long_t *&l)
988 return SqlReadArray(l);
994 Int_t TBufferSQL2::ReadArray(ULong_t *&l)
996 return SqlReadArray(l);
1002 Int_t TBufferSQL2::ReadArray(Long64_t *&l)
1004 return SqlReadArray(l);
1010 Int_t TBufferSQL2::ReadArray(ULong64_t *&l)
1012 return SqlReadArray(l);
1018 Int_t TBufferSQL2::ReadArray(Float_t *&f)
1020 return SqlReadArray(f);
1026 Int_t TBufferSQL2::ReadArray(Double_t *&d)
1028 return SqlReadArray(d);
1034 Int_t TBufferSQL2::ReadStaticArray(Bool_t *b)
1036 return SqlReadArray(b, kTRUE);
1042 Int_t TBufferSQL2::ReadStaticArray(Char_t *c)
1044 return SqlReadArray(c, kTRUE);
1050 Int_t TBufferSQL2::ReadStaticArray(UChar_t *c)
1052 return SqlReadArray(c, kTRUE);
1058 Int_t TBufferSQL2::ReadStaticArray(Short_t *h)
1060 return SqlReadArray(h, kTRUE);
1066 Int_t TBufferSQL2::ReadStaticArray(UShort_t *h)
1068 return SqlReadArray(h, kTRUE);
1074 Int_t TBufferSQL2::ReadStaticArray(Int_t *i)
1076 return SqlReadArray(i, kTRUE);
1082 Int_t TBufferSQL2::ReadStaticArray(UInt_t *i)
1084 return SqlReadArray(i, kTRUE);
1090 Int_t TBufferSQL2::ReadStaticArray(Long_t *l)
1092 return SqlReadArray(l, kTRUE);
1098 Int_t TBufferSQL2::ReadStaticArray(ULong_t *l)
1100 return SqlReadArray(l, kTRUE);
1106 Int_t TBufferSQL2::ReadStaticArray(Long64_t *l)
1108 return SqlReadArray(l, kTRUE);
1114 Int_t TBufferSQL2::ReadStaticArray(ULong64_t *l)
1116 return SqlReadArray(l, kTRUE);
1122 Int_t TBufferSQL2::ReadStaticArray(Float_t *f)
1124 return SqlReadArray(f, kTRUE);
1130 Int_t TBufferSQL2::ReadStaticArray(Double_t *d)
1132 return SqlReadArray(d, kTRUE);
1138 template <
typename T>
1139 R__ALWAYS_INLINE
void TBufferSQL2::SqlReadFastArray(T *arr, Int_t arrsize)
1142 SqlReadArrayContent(arr, arrsize, kFALSE);
1148 void TBufferSQL2::ReadFastArray(Bool_t *b, Int_t n)
1150 SqlReadFastArray(b, n);
1157 void TBufferSQL2::ReadFastArray(Char_t *c, Int_t n)
1159 if ((n > 0) && fCurrentData->IsBlobData() && fCurrentData->VerifyDataType(sqlio::CharStar, kFALSE)) {
1160 const char *buf = SqlReadCharStarValue();
1161 if (!buf || (n <= 0))
1163 Int_t size = strlen(buf);
1166 memcpy(c, buf, size);
1168 SqlReadFastArray(c, n);
1175 void TBufferSQL2::ReadFastArray(UChar_t *c, Int_t n)
1177 SqlReadFastArray(c, n);
1183 void TBufferSQL2::ReadFastArray(Short_t *h, Int_t n)
1185 SqlReadFastArray(h, n);
1191 void TBufferSQL2::ReadFastArray(UShort_t *h, Int_t n)
1193 SqlReadFastArray(h, n);
1199 void TBufferSQL2::ReadFastArray(Int_t *i, Int_t n)
1201 SqlReadFastArray(i, n);
1207 void TBufferSQL2::ReadFastArray(UInt_t *i, Int_t n)
1209 SqlReadFastArray(i, n);
1215 void TBufferSQL2::ReadFastArray(Long_t *l, Int_t n)
1217 SqlReadFastArray(l, n);
1223 void TBufferSQL2::ReadFastArray(ULong_t *l, Int_t n)
1225 SqlReadFastArray(l, n);
1231 void TBufferSQL2::ReadFastArray(Long64_t *l, Int_t n)
1233 SqlReadFastArray(l, n);
1239 void TBufferSQL2::ReadFastArray(ULong64_t *l, Int_t n)
1241 SqlReadFastArray(l, n);
1247 void TBufferSQL2::ReadFastArray(Float_t *f, Int_t n)
1249 SqlReadFastArray(f, n);
1256 void TBufferSQL2::ReadFastArrayString(Char_t *c, Int_t n)
1258 SqlReadFastArray(c, n);
1264 void TBufferSQL2::ReadFastArray(Double_t *d, Int_t n)
1266 SqlReadFastArray(d, n);
1275 void TBufferSQL2::ReadFastArray(
void *start,
const TClass *cl, Int_t n, TMemberStreamer *streamer,
1276 const TClass *onFileClass)
1279 Info(
"ReadFastArray",
"(void *");
1282 StreamObjectExtra(start, streamer, cl, 0, onFileClass);
1287 int objectSize = cl->Size();
1288 char *obj = (
char *)start;
1289 char *end = obj + n * objectSize;
1291 for (; obj < end; obj += objectSize) {
1292 StreamObject(obj, cl, onFileClass);
1303 void TBufferSQL2::ReadFastArray(
void **start,
const TClass *cl, Int_t n, Bool_t isPreAlloc, TMemberStreamer *streamer,
1304 const TClass *onFileClass)
1307 Info(
"ReadFastArray",
"(void ** pre = %d n = %d", isPreAlloc, n);
1309 Bool_t oldStyle = kFALSE;
1311 if ((fIOVersion < 2) && !isPreAlloc) {
1312 TStreamerElement *elem = Stack(0)->GetElement();
1313 if (elem && ((elem->GetType() == TStreamerInfo::kSTLp) ||
1314 (elem->GetType() == TStreamerInfo::kSTLp + TStreamerInfo::kOffsetL)))
1320 for (Int_t j = 0; j < n; j++) {
1322 start[j] = ((TClass *)cl)->New();
1326 (*streamer)(*
this, (
void *)start, n);
1328 StreamObjectExtra((
void *)start, streamer, cl, 0, onFileClass);
1334 for (Int_t j = 0; j < n; j++) {
1337 start[j] = ((TClass *)cl)->New();
1338 ((TClass *)cl)->Streamer(start[j], *
this);
1343 if (start[j] && TStreamerInfo::CanDelete())
1344 ((TClass *)cl)->Destructor(start[j], kFALSE);
1345 start[j] = ReadObjectAny(cl);
1350 for (Int_t j = 0; j < n; j++) {
1352 start[j] = ((TClass *)cl)->New();
1353 StreamObject(start[j], cl, onFileClass);
1358 Info(
"ReadFastArray",
"(void ** Done");
1367 Int_t TBufferSQL2::SqlReadArraySize()
1369 const char *value = SqlReadValue(sqlio::Array);
1370 if (!value || (strlen(value) == 0))
1372 Int_t sz = atoi(value);
1376 template <
typename T>
1377 R__ALWAYS_INLINE
void TBufferSQL2::SqlWriteArray(T *arr, Int_t arrsize, Bool_t withsize)
1379 if (!withsize && (arrsize <= 0))
1381 PushStack()->SetArray(withsize ? arrsize : -1);
1383 if (fCompressLevel > 0) {
1384 while (indx < arrsize) {
1385 Int_t curr = indx++;
1386 while ((indx < arrsize) && (arr[indx] == arr[curr]))
1388 SqlWriteBasic(arr[curr]);
1389 Stack()->ChildArrayIndex(curr, indx - curr);
1392 for (; indx < arrsize; indx++) {
1393 SqlWriteBasic(arr[indx]);
1394 Stack()->ChildArrayIndex(indx, 1);
1403 void TBufferSQL2::WriteArray(
const Bool_t *b, Int_t n)
1405 SqlWriteArray(b, n, kTRUE);
1411 void TBufferSQL2::WriteArray(
const Char_t *c, Int_t n)
1413 SqlWriteArray(c, n, kTRUE);
1419 void TBufferSQL2::WriteArray(
const UChar_t *c, Int_t n)
1421 SqlWriteArray(c, n, kTRUE);
1427 void TBufferSQL2::WriteArray(
const Short_t *h, Int_t n)
1429 SqlWriteArray(h, n, kTRUE);
1435 void TBufferSQL2::WriteArray(
const UShort_t *h, Int_t n)
1437 SqlWriteArray(h, n, kTRUE);
1443 void TBufferSQL2::WriteArray(
const Int_t *i, Int_t n)
1445 SqlWriteArray(i, n, kTRUE);
1451 void TBufferSQL2::WriteArray(
const UInt_t *i, Int_t n)
1453 SqlWriteArray(i, n, kTRUE);
1459 void TBufferSQL2::WriteArray(
const Long_t *l, Int_t n)
1461 SqlWriteArray(l, n, kTRUE);
1467 void TBufferSQL2::WriteArray(
const ULong_t *l, Int_t n)
1469 SqlWriteArray(l, n, kTRUE);
1475 void TBufferSQL2::WriteArray(
const Long64_t *l, Int_t n)
1477 SqlWriteArray(l, n, kTRUE);
1483 void TBufferSQL2::WriteArray(
const ULong64_t *l, Int_t n)
1485 SqlWriteArray(l, n, kTRUE);
1491 void TBufferSQL2::WriteArray(
const Float_t *f, Int_t n)
1493 SqlWriteArray(f, n, kTRUE);
1499 void TBufferSQL2::WriteArray(
const Double_t *d, Int_t n)
1501 SqlWriteArray(d, n, kTRUE);
1507 void TBufferSQL2::WriteFastArray(
const Bool_t *b, Int_t n)
1509 SqlWriteArray(b, n);
1516 void TBufferSQL2::WriteFastArray(
const Char_t *c, Int_t n)
1518 Bool_t usedefault = (n == 0);
1520 const Char_t *ccc = c;
1523 for (
int i = 0; i < n; i++)
1530 SqlWriteArray(c, n);
1532 Char_t *buf =
new Char_t[n + 1];
1535 SqlWriteValue(buf, sqlio::CharStar);
1543 void TBufferSQL2::WriteFastArray(
const UChar_t *c, Int_t n)
1545 SqlWriteArray(c, n);
1551 void TBufferSQL2::WriteFastArray(
const Short_t *h, Int_t n)
1553 SqlWriteArray(h, n);
1559 void TBufferSQL2::WriteFastArray(
const UShort_t *h, Int_t n)
1561 SqlWriteArray(h, n);
1567 void TBufferSQL2::WriteFastArray(
const Int_t *i, Int_t n)
1569 SqlWriteArray(i, n);
1575 void TBufferSQL2::WriteFastArray(
const UInt_t *i, Int_t n)
1577 SqlWriteArray(i, n);
1583 void TBufferSQL2::WriteFastArray(
const Long_t *l, Int_t n)
1585 SqlWriteArray(l, n);
1591 void TBufferSQL2::WriteFastArray(
const ULong_t *l, Int_t n)
1593 SqlWriteArray(l, n);
1599 void TBufferSQL2::WriteFastArray(
const Long64_t *l, Int_t n)
1601 SqlWriteArray(l, n);
1607 void TBufferSQL2::WriteFastArray(
const ULong64_t *l, Int_t n)
1609 SqlWriteArray(l, n);
1615 void TBufferSQL2::WriteFastArray(
const Float_t *f, Int_t n)
1617 SqlWriteArray(f, n);
1623 void TBufferSQL2::WriteFastArray(
const Double_t *d, Int_t n)
1625 SqlWriteArray(d, n);
1632 void TBufferSQL2::WriteFastArrayString(
const Char_t *c, Int_t n)
1634 SqlWriteArray(c, n);
1643 void TBufferSQL2::WriteFastArray(
void *start,
const TClass *cl, Int_t n, TMemberStreamer *streamer)
1646 StreamObjectExtra(start, streamer, cl, 0);
1651 char *obj = (
char *)start;
1654 int size = cl->Size();
1656 for (Int_t j = 0; j < n; j++, obj += size)
1657 StreamObject(obj, cl);
1666 Int_t TBufferSQL2::WriteFastArray(
void **start,
const TClass *cl, Int_t n, Bool_t isPreAlloc, TMemberStreamer *streamer)
1669 Bool_t oldStyle = kFALSE;
1671 if ((fIOVersion < 2) && !isPreAlloc) {
1672 TStreamerElement *elem = Stack(0)->GetElement();
1673 if (elem && ((elem->GetType() == TStreamerInfo::kSTLp) ||
1674 (elem->GetType() == TStreamerInfo::kSTLp + TStreamerInfo::kOffsetL)))
1680 (*streamer)(*
this, (
void *)start, n);
1682 StreamObjectExtra((
void *)start, streamer, cl, 0);
1692 for (Int_t j = 0; j < n; j++) {
1694 if (!strInfo && !start[j] && !oldStyle)
1695 ForceWriteInfo(((TClass *)cl)->GetStreamerInfo(), kFALSE);
1698 ((TClass *)cl)->Streamer(start[j], *
this);
1700 res |= WriteObjectAny(start[j], cl);
1706 for (Int_t j = 0; j < n; j++) {
1708 start[j] = ((TClass *)cl)->New();
1709 StreamObject(start[j], cl);
1720 void TBufferSQL2::StreamObject(
void *obj,
const TClass *cl,
const TClass *onFileClass)
1722 if (fIOVersion < 2) {
1723 TStreamerElement *elem = Stack(0)->GetElement();
1724 if (elem && (elem->GetType() == TStreamerInfo::kTObject)) {
1725 ((TObject *)obj)->TObject::Streamer(*
this);
1727 }
else if (elem && (elem->GetType() == TStreamerInfo::kTNamed)) {
1728 ((TNamed *)obj)->TNamed::Streamer(*
this);
1734 Info(
"StreamObject",
"class %s", (cl ? cl->GetName() :
"none"));
1736 SqlReadObject(obj, 0,
nullptr, 0, onFileClass);
1738 SqlWriteObject(obj, cl, kTRUE);
1744 void TBufferSQL2::StreamObjectExtra(
void *obj, TMemberStreamer *streamer,
const TClass *cl, Int_t n,
1745 const TClass *onFileClass)
1751 Info(
"StreamObjectExtra",
"class = %s", cl->GetName());
1755 SqlReadObject(obj, 0, streamer, n, onFileClass);
1757 SqlWriteObject(obj, cl, kTRUE, streamer, n);
1763 void TBufferSQL2::ReadBool(Bool_t &b)
1771 void TBufferSQL2::ReadChar(Char_t &c)
1779 void TBufferSQL2::ReadUChar(UChar_t &c)
1787 void TBufferSQL2::ReadShort(Short_t &h)
1795 void TBufferSQL2::ReadUShort(UShort_t &h)
1803 void TBufferSQL2::ReadInt(Int_t &i)
1811 void TBufferSQL2::ReadUInt(UInt_t &i)
1819 void TBufferSQL2::ReadLong(Long_t &l)
1827 void TBufferSQL2::ReadULong(ULong_t &l)
1835 void TBufferSQL2::ReadLong64(Long64_t &l)
1843 void TBufferSQL2::ReadULong64(ULong64_t &l)
1851 void TBufferSQL2::ReadFloat(Float_t &f)
1859 void TBufferSQL2::ReadDouble(Double_t &d)
1867 void TBufferSQL2::ReadCharP(Char_t *c)
1869 const char *buf = SqlReadCharStarValue();
1877 void TBufferSQL2::ReadTString(TString &s)
1879 if (fIOVersion < 2) {
1893 char *data =
new char[nbig];
1895 ReadFastArray(data, nbig);
1907 void TBufferSQL2::WriteTString(
const TString &s)
1909 if (fIOVersion < 2) {
1911 Int_t nbig = s.Length();
1918 nwh = UChar_t(nbig);
1921 const char *data = s.Data();
1922 WriteFastArray(data, nbig);
1931 void TBufferSQL2::ReadStdString(std::string *obj)
1933 if (fIOVersion < 2) {
1935 Error(
"ReadStdString",
"The std::string address is nullptr but should not");
1950 obj->resize(nbig,
'\0');
1951 ReadFastArray((
char *)obj->data(), nbig);
1953 obj->resize(nwh,
'\0');
1954 ReadFastArray((
char *)obj->data(), nwh);
1965 void TBufferSQL2::WriteStdString(
const std::string *obj)
1967 if (fIOVersion < 2) {
1969 *
this << (UChar_t)0;
1970 WriteFastArray(
"", 0);
1975 Int_t nbig = obj->length();
1981 nwh = UChar_t(nbig);
1984 WriteFastArray(obj->data(), nbig);
1993 void TBufferSQL2::ReadCharStar(
char *&s)
2001 s =
new char[nch + 1];
2002 ReadFastArray(s, nch);
2010 void TBufferSQL2::WriteCharStar(
char *s)
2016 WriteFastArray(s, nch);
2025 void TBufferSQL2::WriteBool(Bool_t b)
2033 void TBufferSQL2::WriteChar(Char_t c)
2041 void TBufferSQL2::WriteUChar(UChar_t c)
2049 void TBufferSQL2::WriteShort(Short_t h)
2057 void TBufferSQL2::WriteUShort(UShort_t h)
2065 void TBufferSQL2::WriteInt(Int_t i)
2073 void TBufferSQL2::WriteUInt(UInt_t i)
2081 void TBufferSQL2::WriteLong(Long_t l)
2089 void TBufferSQL2::WriteULong(ULong_t l)
2097 void TBufferSQL2::WriteLong64(Long64_t l)
2105 void TBufferSQL2::WriteULong64(ULong64_t l)
2113 void TBufferSQL2::WriteFloat(Float_t f)
2121 void TBufferSQL2::WriteDouble(Double_t d)
2129 void TBufferSQL2::WriteCharP(
const Char_t *c)
2131 SqlWriteValue(c, sqlio::CharStar);
2137 Bool_t TBufferSQL2::SqlWriteBasic(Char_t value)
2140 snprintf(buf,
sizeof(buf),
"%d", value);
2141 return SqlWriteValue(buf, sqlio::Char);
2147 Bool_t TBufferSQL2::SqlWriteBasic(Short_t value)
2150 snprintf(buf,
sizeof(buf),
"%hd", value);
2151 return SqlWriteValue(buf, sqlio::Short);
2157 Bool_t TBufferSQL2::SqlWriteBasic(Int_t value)
2160 snprintf(buf,
sizeof(buf),
"%d", value);
2161 return SqlWriteValue(buf, sqlio::Int);
2167 Bool_t TBufferSQL2::SqlWriteBasic(Long_t value)
2170 snprintf(buf,
sizeof(buf),
"%ld", value);
2171 return SqlWriteValue(buf, sqlio::Long);
2177 Bool_t TBufferSQL2::SqlWriteBasic(Long64_t value)
2179 std::string buf = std::to_string(value);
2180 return SqlWriteValue(buf.c_str(), sqlio::Long64);
2186 Bool_t TBufferSQL2::SqlWriteBasic(Float_t value)
2189 ConvertFloat(value, buf,
sizeof(buf), kTRUE);
2190 return SqlWriteValue(buf, sqlio::Float);
2196 Bool_t TBufferSQL2::SqlWriteBasic(Double_t value)
2199 ConvertDouble(value, buf,
sizeof(buf), kTRUE);
2200 return SqlWriteValue(buf, sqlio::Double);
2206 Bool_t TBufferSQL2::SqlWriteBasic(Bool_t value)
2208 return SqlWriteValue(value ? sqlio::True : sqlio::False, sqlio::Bool);
2214 Bool_t TBufferSQL2::SqlWriteBasic(UChar_t value)
2217 snprintf(buf,
sizeof(buf),
"%u", value);
2218 return SqlWriteValue(buf, sqlio::UChar);
2224 Bool_t TBufferSQL2::SqlWriteBasic(UShort_t value)
2227 snprintf(buf,
sizeof(buf),
"%hu", value);
2228 return SqlWriteValue(buf, sqlio::UShort);
2234 Bool_t TBufferSQL2::SqlWriteBasic(UInt_t value)
2237 snprintf(buf,
sizeof(buf),
"%u", value);
2238 return SqlWriteValue(buf, sqlio::UInt);
2244 Bool_t TBufferSQL2::SqlWriteBasic(ULong_t value)
2247 snprintf(buf,
sizeof(buf),
"%lu", value);
2248 return SqlWriteValue(buf, sqlio::ULong);
2254 Bool_t TBufferSQL2::SqlWriteBasic(ULong64_t value)
2256 std::string buf = std::to_string(value);
2257 return SqlWriteValue(buf.c_str(), sqlio::ULong64);
2262 Bool_t TBufferSQL2::SqlWriteValue(
const char *value,
const char *tname)
2266 Stack()->AddValue(value, tname);
2274 void TBufferSQL2::SqlReadBasic(Char_t &value)
2276 const char *res = SqlReadValue(sqlio::Char);
2279 sscanf(res,
"%d", &n);
2288 void TBufferSQL2::SqlReadBasic(Short_t &value)
2290 const char *res = SqlReadValue(sqlio::Short);
2292 sscanf(res,
"%hd", &value);
2300 void TBufferSQL2::SqlReadBasic(Int_t &value)
2302 const char *res = SqlReadValue(sqlio::Int);
2304 sscanf(res,
"%d", &value);
2312 void TBufferSQL2::SqlReadBasic(Long_t &value)
2314 const char *res = SqlReadValue(sqlio::Long);
2316 sscanf(res,
"%ld", &value);
2324 void TBufferSQL2::SqlReadBasic(Long64_t &value)
2326 const char *res = SqlReadValue(sqlio::Long64);
2328 value = (Long64_t)std::stoll(res);
2336 void TBufferSQL2::SqlReadBasic(Float_t &value)
2338 const char *res = SqlReadValue(sqlio::Float);
2340 sscanf(res,
"%f", &value);
2348 void TBufferSQL2::SqlReadBasic(Double_t &value)
2350 const char *res = SqlReadValue(sqlio::Double);
2352 sscanf(res,
"%lf", &value);
2360 void TBufferSQL2::SqlReadBasic(Bool_t &value)
2362 const char *res = SqlReadValue(sqlio::Bool);
2364 value = (strcmp(res, sqlio::True) == 0);
2372 void TBufferSQL2::SqlReadBasic(UChar_t &value)
2374 const char *res = SqlReadValue(sqlio::UChar);
2377 sscanf(res,
"%ud", &n);
2386 void TBufferSQL2::SqlReadBasic(UShort_t &value)
2388 const char *res = SqlReadValue(sqlio::UShort);
2390 sscanf(res,
"%hud", &value);
2398 void TBufferSQL2::SqlReadBasic(UInt_t &value)
2400 const char *res = SqlReadValue(sqlio::UInt);
2402 sscanf(res,
"%u", &value);
2410 void TBufferSQL2::SqlReadBasic(ULong_t &value)
2412 const char *res = SqlReadValue(sqlio::ULong);
2414 sscanf(res,
"%lu", &value);
2422 void TBufferSQL2::SqlReadBasic(ULong64_t &value)
2424 const char *res = SqlReadValue(sqlio::ULong64);
2426 value = (ULong64_t)std::stoull(res);
2434 const char *TBufferSQL2::SqlReadValue(
const char *tname)
2439 if (!fCurrentData) {
2440 Error(
"SqlReadValue",
"No object data to read from");
2445 if (!fIgnoreVerification)
2446 if (!fCurrentData->VerifyDataType(tname)) {
2451 fReadBuffer = fCurrentData->GetValue();
2453 fCurrentData->ShiftToNextValue();
2456 Info(
"SqlReadValue",
"%s = %s", tname, fReadBuffer.Data());
2458 return fReadBuffer.Data();
2464 const char *TBufferSQL2::SqlReadCharStarValue()
2466 const char *res = SqlReadValue(sqlio::CharStar);
2470 Long64_t objid = Stack()->DefineObjectId(kTRUE);
2472 Int_t strid = fSQL->IsLongStringCode(objid, res);
2476 fSQL->GetLongString(objid, strid, fReadBuffer);
2478 return fReadBuffer.Data();
2484 TSQLStructure *TBufferSQL2::PushStack()
2486 TSQLStructure *res =
new TSQLStructure;
2500 TSQLStructure *TBufferSQL2::PopStack()
2504 fStk = fStk->GetParent();
2511 TSQLStructure *TBufferSQL2::Stack(Int_t depth)
2513 TSQLStructure *curr = fStk;
2514 while ((depth-- > 0) && curr)
2515 curr = curr->GetParent();
2522 TVirtualStreamerInfo *TBufferSQL2::GetInfo()
2524 return Stack()->GetStreamerInfo();