44 const Int_t Ids_NullPtr = 0;
45 const Int_t Ids_RootDir = 0;
46 const Int_t Ids_TSQLFile = 0;
47 const Int_t Ids_StreamerInfos = 1;
48 const Int_t Ids_FirstKey = 10;
49 const Int_t Ids_FirstObject = 1;
51 const char *ObjectRef =
"ObjectRef";
52 const char *ObjectRef_Arr =
"ObjectRefArr";
53 const char *ObjectPtr =
"ObjectPtr";
54 const char *ObjectInst =
"ObjectInst";
55 const char *Version =
"Version";
56 const char *TObjectUniqueId =
"UniqueId";
57 const char *TObjectBits =
"Bits";
58 const char *TObjectProcessId =
"ProcessId";
59 const char *TStringValue =
"StringValue";
60 const char *IndexSepar =
"..";
61 const char *RawSuffix =
":rawdata";
62 const char *ParentSuffix =
":parent";
63 const char *ObjectSuffix =
":object";
64 const char *PointerSuffix =
":pointer";
65 const char *StrSuffix =
":str";
66 const char *LongStrPrefix =
"#~#";
68 const char *Array =
"Array";
69 const char *Bool =
"Bool_t";
70 const char *Char =
"Char_t";
71 const char *Short =
"Short_t";
72 const char *Int =
"Int_t";
73 const char *Long =
"Long_t";
74 const char *Long64 =
"Long64_t";
75 const char *Float =
"Float_t";
76 const char *Double =
"Double_t";
77 const char *UChar =
"UChar_t";
78 const char *UShort =
"UShort_t";
79 const char *UInt =
"UInt_t";
80 const char *ULong =
"ULong_t";
81 const char *ULong64 =
"ULong64_t";
82 const char *CharStar =
"CharStar";
83 const char *True =
"1";
84 const char *False =
"0";
87 const char *KeysTable =
"KeysTable";
88 const char *KeysTableIndex =
"KeysTableIndex";
89 const char *ObjectsTable =
"ObjectsTable";
90 const char *ObjectsTableIndex =
"ObjectsTableIndex";
91 const char *IdsTable =
"IdsTable";
92 const char *IdsTableIndex =
"IdsTableIndex";
93 const char *StringsTable =
"StringsTable";
94 const char *ConfigTable =
"Configurations";
97 const char *KT_Name =
"Name";
98 const char *KT_Title =
"Title";
99 const char *KT_Datetime =
"Datime";
100 const char *KT_Cycle =
"Cycle";
101 const char *KT_Class =
"Class";
103 const char *DT_Create =
"CreateDatime";
104 const char *DT_Modified =
"ModifiedDatime";
105 const char *DT_UUID =
"UUID";
108 const char *OT_Class =
"Class";
109 const char *OT_Version =
"Version";
112 const char *IT_TableID =
"TableId";
113 const char *IT_SubID =
"SubId";
114 const char *IT_Type =
"Type";
115 const char *IT_FullName =
"FullName";
116 const char *IT_SQLName =
"SQLName";
117 const char *IT_Info =
"Info";
120 const char *BT_Field =
"Field";
121 const char *BT_Value =
"Value";
124 const char *ST_Value =
"LongStringValue";
127 const char *CT_Field =
"Field";
128 const char *CT_Value =
"Value";
131 const char *cfg_Version =
"SQL_IO_version";
132 const char *cfg_UseSufixes =
"UseNameSuffix";
133 const char *cfg_ArrayLimit =
"ArraySizeLimit";
134 const char *cfg_TablesType =
"TablesType";
135 const char *cfg_UseTransactions =
"UseTransactions";
136 const char *cfg_UseIndexes =
"UseIndexes";
137 const char *cfg_LockingMode =
"LockingMode";
138 const char *cfg_ModifyCounter =
"ModifyCounter";
143 Long64_t sqlio::atol64(
const char *value)
145 if (!value || (*value == 0))
147 return TString(value).Atoll();
155 ClassImp(TSQLColumnData);
161 TSQLColumnData::TSQLColumnData(
const char *name,
const char *sqltype,
const char *value, Bool_t numeric)
162 : TObject(), fName(name), fType(sqltype), fValue(value), fNumeric(numeric)
169 TSQLColumnData::TSQLColumnData(
const char *name, Long64_t value)
170 : TObject(), fName(name), fType(
"INT"), fValue(), fNumeric(kTRUE)
172 fValue.Form(
"%lld", value);
175 ClassImp(TSQLTableData);
180 TSQLTableData::TSQLTableData(TSQLFile *f, TSQLClassInfo *info)
181 : TObject(), fFile(f), fInfo(info)
183 if (info && !info->IsClassTableExist())
184 fColInfos =
new TObjArray;
190 TSQLTableData::~TSQLTableData()
202 void TSQLTableData::AddColumn(
const char *name, Long64_t value)
204 TObjString *v =
new TObjString(Form(
"%lld", value));
205 v->SetBit(BIT(20), kTRUE);
212 fColInfos->Add(
new TSQLClassColumnInfo(name, DefineSQLName(name),
"INT"));
218 void TSQLTableData::AddColumn(
const char *name,
const char *sqltype,
const char *value, Bool_t numeric)
220 TObjString *v =
new TObjString(value);
221 v->SetBit(BIT(20), numeric);
228 fColInfos->Add(
new TSQLClassColumnInfo(name, DefineSQLName(name), sqltype));
234 TString TSQLTableData::DefineSQLName(
const char *fullname)
236 Int_t maxlen = fFile->SQLMaxIdentifierLength();
238 Int_t len = strlen(fullname);
240 if ((len <= maxlen) && !HasSQLName(fullname))
241 return TString(fullname);
248 scnt.Form(
"%d", cnt);
249 Int_t numlen = cnt < 0 ? 0 : scnt.Length();
253 if (len + numlen > maxlen)
254 res.Resize(maxlen - numlen);
259 if (!HasSQLName(res.Data()))
264 }
while (cnt < 10000);
266 Error(
"DefineSQLName",
"Cannot find reasonable column name for field %s", fullname);
268 return TString(fullname);
274 Bool_t TSQLTableData::HasSQLName(
const char *sqlname)
276 TIter next(fColInfos);
278 TSQLClassColumnInfo *col =
nullptr;
280 while ((col = (TSQLClassColumnInfo *)next()) !=
nullptr) {
281 const char *colname = col->GetSQLName();
282 if (strcmp(colname, sqlname) == 0)
292 Int_t TSQLTableData::GetNumColumns()
294 return fColumns.GetLast() + 1;
300 const char *TSQLTableData::GetColumn(Int_t n)
302 return fColumns[n]->GetName();
308 Bool_t TSQLTableData::IsNumeric(Int_t n)
310 return fColumns[n]->TestBit(BIT(20));
316 TObjArray *TSQLTableData::TakeColInfos()
318 TObjArray *res = fColInfos;
325 ClassImp(TSQLStructure);
330 TSQLStructure::~TSQLStructure()
333 if (GetType() == kSqlObjectData) {
334 TSQLObjectData *objdata = (TSQLObjectData *)fPointer;
336 }
else if (GetType() == kSqlCustomElement) {
337 TStreamerElement *elem = (TStreamerElement *)fPointer;
345 Int_t TSQLStructure::NumChilds()
const
347 return fChilds.GetLast() + 1;
353 TSQLStructure *TSQLStructure::GetChild(Int_t n)
const
355 return (n < 0) || (n > fChilds.GetLast()) ? 0 : (TSQLStructure *)fChilds[n];
361 void TSQLStructure::SetObjectRef(Long64_t refid,
const TClass *cl)
364 fValue.Form(
"%lld", refid);
371 void TSQLStructure::SetObjectPointer(Long64_t ptrid)
374 fValue.Form(
"%lld", ptrid);
380 void TSQLStructure::SetVersion(
const TClass *cl, Int_t version)
385 version = cl->GetClassVersion();
386 fValue.Form(
"%d", version);
392 void TSQLStructure::SetClassStreamer(
const TClass *cl)
394 fType = kSqlClassStreamer;
401 void TSQLStructure::SetStreamerInfo(
const TStreamerInfo *info)
403 fType = kSqlStreamerInfo;
410 void TSQLStructure::SetStreamerElement(
const TStreamerElement *elem, Int_t number)
414 fArrayIndex = number;
420 void TSQLStructure::SetCustomClass(
const TClass *cl, Version_t version)
422 fType = kSqlCustomClass;
423 fPointer = (
void *)cl;
424 fArrayIndex = version;
430 void TSQLStructure::SetCustomElement(TStreamerElement *elem)
432 fType = kSqlCustomElement;
439 void TSQLStructure::SetValue(
const char *value,
const char *tname)
450 void TSQLStructure::ChangeValueOnly(
const char *value)
458 void TSQLStructure::SetArrayIndex(Int_t indx, Int_t cnt)
468 void TSQLStructure::ChildArrayIndex(Int_t index, Int_t cnt)
470 TSQLStructure *last = (TSQLStructure *)fChilds.Last();
471 if ((last != 0) && (last->GetType() == kSqlValue))
472 last->SetArrayIndex(index, cnt);
478 void TSQLStructure::SetArray(Int_t sz)
482 fValue.Form(
"%d", sz);
488 TClass *TSQLStructure::GetObjectClass()
const
490 return (fType == kSqlObject) ? (TClass *)fPointer :
nullptr;
496 TClass *TSQLStructure::GetVersionClass()
const
498 return (fType == kSqlVersion) ? (TClass *)fPointer :
nullptr;
504 TStreamerInfo *TSQLStructure::GetStreamerInfo()
const
506 return (fType == kSqlStreamerInfo) ? (TStreamerInfo *)fPointer :
nullptr;
512 TStreamerElement *TSQLStructure::GetElement()
const
514 return (fType == kSqlElement) || (fType == kSqlCustomElement) ? (TStreamerElement *)fPointer :
nullptr;
520 Int_t TSQLStructure::GetElementNumber()
const
522 return (fType == kSqlElement) ? fArrayIndex : 0;
528 const char *TSQLStructure::GetValueType()
const
530 return (fType == kSqlValue) ? (
const char *)fPointer :
nullptr;
536 TClass *TSQLStructure::GetCustomClass()
const
538 return (fType == kSqlCustomClass) ? (TClass *)fPointer :
nullptr;
544 Version_t TSQLStructure::GetCustomClassVersion()
const
546 return (fType == kSqlCustomClass) ? fArrayIndex : 0;
552 Bool_t TSQLStructure::GetClassInfo(TClass *&cl, Version_t &version)
554 if (GetType() == kSqlStreamerInfo) {
555 TStreamerInfo *info = GetStreamerInfo();
558 cl = info->GetClass();
559 version = info->GetClassVersion();
560 }
else if (GetType() == kSqlCustomClass) {
561 cl = GetCustomClass();
562 version = GetCustomClassVersion();
573 const char *TSQLStructure::GetValue()
const
575 return fValue.Data();
581 void TSQLStructure::Add(TSQLStructure *child)
584 child->SetParent(
this);
592 void TSQLStructure::AddVersion(
const TClass *cl, Int_t version)
594 TSQLStructure *ver =
new TSQLStructure;
595 ver->SetVersion(cl, version);
602 void TSQLStructure::AddValue(
const char *value,
const char *tname)
604 TSQLStructure *child =
new TSQLStructure;
605 child->SetValue(value, tname);
614 Long64_t TSQLStructure::DefineObjectId(Bool_t recursive)
616 TSQLStructure *curr =
this;
618 if ((curr->GetType() == kSqlObject) || (curr->GetType() == kSqlPointer) ||
620 (curr->GetType() == kSqlElement) || (curr->GetType() == kSqlCustomElement) ||
621 (curr->GetType() == kSqlCustomClass) || (curr->GetType() == kSqlStreamerInfo)) {
622 const char *value = curr->GetValue();
623 if (value && (strlen(value) > 0))
624 return sqlio::atol64(value);
627 curr = recursive ? curr->GetParent() :
nullptr;
635 void TSQLStructure::SetObjectData(TSQLObjectData *objdata)
637 fType = kSqlObjectData;
644 void TSQLStructure::AddObjectData(TSQLObjectData *objdata)
646 TSQLStructure *child =
new TSQLStructure;
647 child->SetObjectData(objdata);
654 TSQLObjectData *TSQLStructure::GetObjectData(Bool_t search)
656 TSQLStructure *child = GetChild(0);
657 if ((child != 0) && (child->GetType() == kSqlObjectData))
658 return (TSQLObjectData *)child->fPointer;
659 if (search && GetParent())
660 return GetParent()->GetObjectData(search);
667 void TSQLStructure::Print(Option_t *)
const
675 void TSQLStructure::PrintLevel(Int_t level)
const
677 for (Int_t n = 0; n < level; n++)
680 case 0: std::cout <<
"Undefined type";
break;
681 case kSqlObject: std::cout <<
"Object ref = " << fValue;
break;
682 case kSqlPointer: std::cout <<
"Pointer ptr = " << fValue;
break;
684 const TClass *cl = (
const TClass *)fPointer;
685 std::cout <<
"Version cl = " << cl->GetName() <<
" ver = " << cl->GetClassVersion();
688 case kSqlStreamerInfo: {
689 const TStreamerInfo *info = (
const TStreamerInfo *)fPointer;
690 std::cout <<
"Class: " << info->GetName();
693 case kSqlCustomElement:
695 const TStreamerElement *elem = (
const TStreamerElement *)fPointer;
696 std::cout <<
"Member: " << elem->GetName();
700 std::cout <<
"Value: " << fValue;
702 std::cout <<
" cnt:" << fRepeatCnt;
704 std::cout <<
" type = " << (
const char *)fPointer;
708 std::cout <<
"Array ";
709 if (fValue.Length() > 0)
710 std::cout <<
" sz = " << fValue;
713 case kSqlCustomClass: {
714 TClass *cl = (TClass *)fPointer;
715 std::cout <<
"CustomClass: " << cl->GetName() <<
" ver = " << fValue;
718 default: std::cout <<
"Unknown type";
720 std::cout << std::endl;
722 for (Int_t n = 0; n < NumChilds(); n++)
723 GetChild(n)->PrintLevel(level + 2);
729 Bool_t TSQLStructure::IsNumericType(Int_t typ)
732 case TStreamerInfo::kShort:
return kTRUE;
733 case TStreamerInfo::kInt:
return kTRUE;
734 case TStreamerInfo::kLong:
return kTRUE;
735 case TStreamerInfo::kFloat:
return kTRUE;
736 case TStreamerInfo::kFloat16:
return kTRUE;
737 case TStreamerInfo::kCounter:
return kTRUE;
738 case TStreamerInfo::kDouble:
return kTRUE;
739 case TStreamerInfo::kDouble32:
return kTRUE;
740 case TStreamerInfo::kUChar:
return kTRUE;
741 case TStreamerInfo::kUShort:
return kTRUE;
742 case TStreamerInfo::kUInt:
return kTRUE;
743 case TStreamerInfo::kULong:
return kTRUE;
744 case TStreamerInfo::kBits:
return kTRUE;
745 case TStreamerInfo::kLong64:
return kTRUE;
746 case TStreamerInfo::kULong64:
return kTRUE;
747 case TStreamerInfo::kBool:
return kTRUE;
756 const char *TSQLStructure::GetSimpleTypeName(Int_t typ)
759 case TStreamerInfo::kChar:
return sqlio::Char;
760 case TStreamerInfo::kShort:
return sqlio::Short;
761 case TStreamerInfo::kInt:
return sqlio::Int;
762 case TStreamerInfo::kLong:
return sqlio::Long;
763 case TStreamerInfo::kFloat:
return sqlio::Float;
764 case TStreamerInfo::kFloat16:
return sqlio::Float;
765 case TStreamerInfo::kCounter:
return sqlio::Int;
766 case TStreamerInfo::kDouble:
return sqlio::Double;
767 case TStreamerInfo::kDouble32:
return sqlio::Double;
768 case TStreamerInfo::kUChar:
return sqlio::UChar;
769 case TStreamerInfo::kUShort:
return sqlio::UShort;
770 case TStreamerInfo::kUInt:
return sqlio::UInt;
771 case TStreamerInfo::kULong:
return sqlio::ULong;
772 case TStreamerInfo::kBits:
return sqlio::UInt;
773 case TStreamerInfo::kLong64:
return sqlio::Long64;
774 case TStreamerInfo::kULong64:
return sqlio::ULong64;
775 case TStreamerInfo::kBool:
return sqlio::Bool;
787 class TSqlCmdsBuffer :
public TObject {
790 TSqlCmdsBuffer(TSQLFile *f, TSQLClassInfo *info) : TObject(), fFile(f), fInfo(info), fBlobStmt(0), fNormStmt(0) {}
792 virtual ~TSqlCmdsBuffer()
796 fFile->SQLDeleteStatement(fBlobStmt);
797 fFile->SQLDeleteStatement(fNormStmt);
800 void AddValues(Bool_t isnorm,
const char *values)
802 TObjString *str =
new TObjString(values);
810 TSQLClassInfo *fInfo;
813 TSQLStatement *fBlobStmt;
814 TSQLStatement *fNormStmt;
821 class TSqlRegistry :
public TObject {
825 : TObject(), fFile(0), fKeyId(0), fLastObjId(-1), fCmds(0), fFirstObjId(0), fCurrentObjId(0), fCurrentObjClass(0),
826 fLastLongStrId(0), fPool(), fLongStrValues(), fRegValues(), fRegStmt(0)
834 Long64_t fFirstObjId;
836 Long64_t fCurrentObjId;
837 TClass *fCurrentObjClass;
839 Int_t fLastLongStrId;
842 TObjArray fLongStrValues;
843 TObjArray fRegValues;
845 TSQLStatement *fRegStmt;
847 virtual ~TSqlRegistry()
849 fPool.DeleteValues();
850 fLongStrValues.Delete();
852 fFile->SQLDeleteStatement(fRegStmt);
855 Long64_t GetNextObjId() {
return ++fLastObjId; }
857 void AddSqlCmd(
const char *query)
861 fCmds =
new TObjArray;
862 fCmds->Add(
new TObjString(query));
865 TSqlCmdsBuffer *GetCmdsBuffer(TSQLClassInfo *sqlinfo)
869 TSqlCmdsBuffer *buf = (TSqlCmdsBuffer *)fPool.GetValue(sqlinfo);
871 buf =
new TSqlCmdsBuffer(fFile, sqlinfo);
872 fPool.Add(sqlinfo, buf);
877 void ConvertSqlValues(TObjArray &values,
const char *tablename)
883 if ((values.GetLast() < 0) || (tablename == 0))
886 Bool_t canbelong = fFile->IsMySQL();
888 Int_t maxsize = 50000;
889 TString sqlcmd(maxsize), value, onecmd, cmdmask;
891 const char *quote = fFile->SQLIdentifierQuote();
895 while ((cmd = iter()) != 0) {
897 if (sqlcmd.Length() == 0)
898 sqlcmd.Form(
"INSERT INTO %s%s%s VALUES (%s)", quote, tablename, quote, cmd->GetName());
901 sqlcmd += cmd->GetName();
905 if (!canbelong || (sqlcmd.Length() > maxsize * 0.9)) {
906 AddSqlCmd(sqlcmd.Data());
911 if (sqlcmd.Length() > 0)
912 AddSqlCmd(sqlcmd.Data());
915 void ConvertPoolValues()
917 TSQLClassInfo *sqlinfo = 0;
919 while ((sqlinfo = (TSQLClassInfo *)iter()) != 0) {
920 TSqlCmdsBuffer *buf = (TSqlCmdsBuffer *)fPool.GetValue(sqlinfo);
923 ConvertSqlValues(buf->fNormCmds, sqlinfo->GetClassTableName());
925 if (buf->fBlobCmds.GetLast() >= 0)
926 fFile->CreateRawTable(sqlinfo);
927 ConvertSqlValues(buf->fBlobCmds, sqlinfo->GetRawTableName());
929 buf->fBlobStmt->Process();
931 buf->fNormStmt->Process();
934 ConvertSqlValues(fLongStrValues, sqlio::StringsTable);
935 ConvertSqlValues(fRegValues, sqlio::ObjectsTable);
940 void AddRegCmd(Long64_t objid, TClass *cl)
942 Long64_t indx = objid - fFirstObjId;
944 Error(
"AddRegCmd",
"Something wrong with objid = %lld", objid);
948 if (fFile->IsOracle() || fFile->IsODBC()) {
949 if ((fRegStmt == 0) && fFile->SQLCanStatement()) {
950 const char *quote = fFile->SQLIdentifierQuote();
953 const char *pars = fFile->IsOracle() ?
":1, :2, :3, :4" :
"?, ?, ?, ?";
954 sqlcmd.Form(
"INSERT INTO %s%s%s VALUES (%s)", quote, sqlio::ObjectsTable, quote, pars);
955 fRegStmt = fFile->SQLStatement(sqlcmd.Data(), 1000);
959 fRegStmt->NextIteration();
960 fRegStmt->SetLong64(0, fKeyId);
961 fRegStmt->SetLong64(1, objid);
962 fRegStmt->SetString(2, cl->GetName(), fFile->SQLSmallTextTypeLimit());
963 fRegStmt->SetInt(3, cl->GetClassVersion());
968 const char *valuequote = fFile->SQLValueQuote();
970 cmd.Form(
"%lld, %lld, %s%s%s, %d", fKeyId, objid, valuequote, cl->GetName(), valuequote, cl->GetClassVersion());
971 fRegValues.AddAtAndExpand(
new TObjString(cmd), indx);
974 Int_t AddLongString(
const char *strvalue)
979 if (fLastLongStrId == 0)
980 fFile->VerifyLongStringTable();
981 Int_t strid = ++fLastLongStrId;
982 TString value = strvalue;
983 const char *valuequote = fFile->SQLValueQuote();
984 TSQLStructure::AddStrBrackets(value, valuequote);
987 cmd.Form(
"%lld, %d, %s", fCurrentObjId, strid, value.Data());
989 fLongStrValues.Add(
new TObjString(cmd));
994 Bool_t InsertToNormalTableOracle(TSQLTableData *columns, TSQLClassInfo *sqlinfo)
996 TSqlCmdsBuffer *buf = GetCmdsBuffer(sqlinfo);
1000 TSQLStatement *stmt = buf->fNormStmt;
1003 if (!fFile->SQLCanStatement())
1006 const char *quote = fFile->SQLIdentifierQuote();
1008 sqlcmd.Form(
"INSERT INTO %s%s%s VALUES (", quote, sqlinfo->GetClassTableName(), quote);
1009 for (
int n = 0; n < columns->GetNumColumns(); n++) {
1012 if (fFile->IsOracle()) {
1020 stmt = fFile->SQLStatement(sqlcmd.Data(), 1000);
1023 buf->fNormStmt = stmt;
1026 stmt->NextIteration();
1028 Int_t sizelimit = fFile->SQLSmallTextTypeLimit();
1030 for (Int_t ncol = 0; ncol < columns->GetNumColumns(); ncol++) {
1031 const char *value = columns->GetColumn(ncol);
1034 stmt->SetString(ncol, value, sizelimit);
1040 void InsertToNormalTable(TSQLTableData *columns, TSQLClassInfo *sqlinfo)
1044 if (fFile->IsOracle() || fFile->IsODBC())
1045 if (InsertToNormalTableOracle(columns, sqlinfo))
1048 const char *valuequote = fFile->SQLValueQuote();
1052 for (Int_t n = 0; n < columns->GetNumColumns(); n++) {
1056 if (columns->IsNumeric(n))
1057 values += columns->GetColumn(n);
1059 TString value = columns->GetColumn(n);
1060 TSQLStructure::AddStrBrackets(value, valuequote);
1065 TSqlCmdsBuffer *buf = GetCmdsBuffer(sqlinfo);
1067 buf->AddValues(kTRUE, values.Data());
1077 class TSqlRawBuffer :
public TObject {
1080 TSqlRawBuffer(TSqlRegistry *reg, TSQLClassInfo *sqlinfo)
1081 : TObject(), fFile(0), fInfo(0), fCmdBuf(0), fObjId(0), fRawId(0), fValueMask(), fValueQuote(0), fMaxStrSize(255)
1085 fCmdBuf = reg->GetCmdsBuffer(sqlinfo);
1086 fObjId = reg->fCurrentObjId;
1087 fValueQuote = fFile->SQLValueQuote();
1088 fValueMask.Form(
"%lld, %s, %s%s%s, %s", fObjId,
"%d", fValueQuote,
"%s", fValueQuote,
"%s");
1089 fMaxStrSize = reg->fFile->SQLSmallTextTypeLimit();
1092 virtual ~TSqlRawBuffer()
1095 TSQLStatement *stmt = fCmdBuf->fBlobStmt;
1096 if ((stmt != 0) && fFile->IsOracle()) {
1099 fCmdBuf->fBlobStmt = 0;
1103 Bool_t IsAnyData()
const {
return fRawId > 0; }
1105 void AddLine(
const char *name,
const char *value,
const char *topname = 0,
const char *ns = 0)
1112 Bool_t maketmt = kFALSE;
1113 if (fFile->IsOracle() || fFile->IsODBC())
1114 maketmt = (fCmdBuf->fBlobStmt == 0) && fFile->SQLCanStatement();
1118 fFile->CreateRawTable(fInfo);
1120 const char *quote = fFile->SQLIdentifierQuote();
1122 const char *params = fFile->IsOracle() ?
":1, :2, :3, :4" :
"?, ?, ?, ?";
1123 sqlcmd.Form(
"INSERT INTO %s%s%s VALUES (%s)", quote, fInfo->GetRawTableName(), quote, params);
1124 TSQLStatement *stmt = fFile->SQLStatement(sqlcmd.Data(), 2000);
1125 fCmdBuf->fBlobStmt = stmt;
1130 const char *fullname = name;
1131 if ((topname != 0) && (ns != 0)) {
1135 fullname = buf.Data();
1138 TSQLStatement *stmt = fCmdBuf->fBlobStmt;
1141 stmt->NextIteration();
1142 stmt->SetLong64(0, fObjId);
1143 stmt->SetInt(1, fRawId++);
1144 stmt->SetString(2, fullname, fMaxStrSize);
1146 stmt->SetString(3, value, fMaxStrSize);
1148 TString valuebuf(value);
1149 TSQLStructure::AddStrBrackets(valuebuf, fValueQuote);
1151 cmd.Form(fValueMask.Data(), fRawId++, fullname, valuebuf.Data());
1152 fCmdBuf->AddValues(kFALSE, cmd.Data());
1157 TSQLClassInfo *fInfo;
1158 TSqlCmdsBuffer *fCmdBuf;
1162 const char *fValueQuote;
1169 Long64_t TSQLStructure::FindMaxObjectId()
1171 Long64_t max = DefineObjectId(kFALSE);
1173 for (Int_t n = 0; n < NumChilds(); n++) {
1174 Long64_t zn = GetChild(n)->FindMaxObjectId();
1188 Bool_t TSQLStructure::ConvertToTables(TSQLFile *file, Long64_t keyid, TObjArray *cmds)
1190 if ((file == 0) || (cmds == 0))
1199 reg.fFirstObjId = DefineObjectId(kFALSE);
1201 reg.fLastObjId = FindMaxObjectId();
1203 Bool_t res = StoreObject(®, reg.fFirstObjId, GetObjectClass());
1206 reg.ConvertPoolValues();
1216 void TSQLStructure::PerformConversion(TSqlRegistry *reg, TSqlRawBuffer *blobs,
const char *topname, Bool_t useblob)
1219 const char *ns = reg->fFile->SQLNameSeparator();
1224 if (!StoreObject(reg, DefineObjectId(kFALSE), GetObjectClass()))
1227 blobs->AddLine(sqlio::ObjectRef, GetValue(), topname, ns);
1233 blobs->AddLine(sqlio::ObjectPtr, fValue.Data(), topname, ns);
1239 topname = ((TClass *)fPointer)->GetName();
1241 Error(
"PerformConversion",
"version without class");
1242 blobs->AddLine(sqlio::Version, fValue.Data(), topname, ns);
1246 case kSqlStreamerInfo: {
1248 TStreamerInfo *info = GetStreamerInfo();
1253 for (Int_t n = 0; n <= fChilds.GetLast(); n++) {
1254 TSQLStructure *child = (TSQLStructure *)fChilds.At(n);
1255 child->PerformConversion(reg, blobs, info->GetName(), useblob);
1258 Long64_t objid = reg->GetNextObjId();
1260 sobjid.Form(
"%lld", objid);
1261 if (!StoreObject(reg, objid, info->GetClass(), kTRUE))
1263 blobs->AddLine(sqlio::ObjectInst, sobjid.Data(), topname, ns);
1268 case kSqlCustomElement:
1270 const TStreamerElement *elem = (
const TStreamerElement *)fPointer;
1273 while (indx < NumChilds()) {
1274 TSQLStructure *child = GetChild(indx++);
1275 child->PerformConversion(reg, blobs, elem->GetName(), useblob);
1281 const char *tname = (
const char *)fPointer;
1282 if (fArrayIndex >= 0) {
1284 sbuf.Form(
"%s%d%s%d%s%s%s",
"[", fArrayIndex, sqlio::IndexSepar, fArrayIndex + fRepeatCnt - 1,
"]", ns,
1287 sbuf.Form(
"%s%d%s%s%s",
"[", fArrayIndex,
"]", ns, tname);
1296 const char *value = fValue.Data();
1298 if ((tname == sqlio::CharStar) && (value != 0)) {
1299 Int_t size = strlen(value);
1300 if (size > reg->fFile->SQLSmallTextTypeLimit()) {
1301 Int_t strid = reg->AddLongString(value);
1302 buf = reg->fFile->CodeLongString(reg->fCurrentObjId, strid);
1307 blobs->AddLine(sbuf.Data(), value, (fArrayIndex >= 0) ? 0 : topname, ns);
1313 if (fValue.Length() > 0)
1314 blobs->AddLine(sqlio::Array, fValue.Data(), topname, ns);
1315 for (Int_t n = 0; n <= fChilds.GetLast(); n++) {
1316 TSQLStructure *child = (TSQLStructure *)fChilds.At(n);
1317 child->PerformConversion(reg, blobs, topname, useblob);
1329 Bool_t TSQLStructure::StoreObject(TSqlRegistry *reg, Long64_t objid, TClass *cl, Bool_t registerobj)
1331 if ((cl == 0) || (objid < 0))
1335 std::cout <<
"Store object " << objid <<
" cl = " << cl->GetName() << std::endl;
1336 if (GetStreamerInfo())
1337 std::cout <<
"Info = " << GetStreamerInfo()->GetName() << std::endl;
1338 else if (GetElement())
1339 std::cout <<
"Element = " << GetElement()->GetName() << std::endl;
1342 Long64_t oldid = reg->fCurrentObjId;
1343 TClass *oldcl = reg->fCurrentObjClass;
1345 reg->fCurrentObjId = objid;
1346 reg->fCurrentObjClass = cl;
1348 Bool_t normstore = kFALSE;
1352 if (cl == TObject::Class())
1353 normstore = StoreTObject(reg);
1354 else if (cl == TString::Class())
1355 normstore = StoreTString(reg);
1356 else if (GetType() == kSqlStreamerInfo)
1360 normstore = StoreClassInNormalForm(reg);
1362 normstore = StoreObjectInNormalForm(reg);
1365 std::cout <<
"Store object " << objid <<
" of class " << cl->GetName() <<
" normal = " << normstore
1366 <<
" sqltype = " << GetType() << std::endl;
1372 TSQLClassInfo *sqlinfo = reg->fFile->RequestSQLClassInfo(cl);
1373 TSqlRawBuffer rawdata(reg, sqlinfo);
1375 for (Int_t n = 0; n < NumChilds(); n++) {
1376 TSQLStructure *child = GetChild(n);
1377 child->PerformConversion(reg, &rawdata, 0 );
1380 res = rawdata.IsAnyData();
1384 reg->AddRegCmd(objid, cl);
1386 reg->fCurrentObjId = oldid;
1387 reg->fCurrentObjClass = oldcl;
1396 Bool_t TSQLStructure::StoreObjectInNormalForm(TSqlRegistry *reg)
1398 if (fChilds.GetLast() != 1)
1401 TSQLStructure *s_ver = GetChild(0);
1403 TSQLStructure *s_info = GetChild(1);
1405 if (!CheckNormalClassPair(s_ver, s_info))
1408 return s_info->StoreClassInNormalForm(reg);
1415 Bool_t TSQLStructure::StoreClassInNormalForm(TSqlRegistry *reg)
1418 Version_t version = 0;
1419 if (!GetClassInfo(cl, version))
1424 TSQLClassInfo *sqlinfo = reg->fFile->RequestSQLClassInfo(cl->GetName(), version);
1426 TSQLTableData columns(reg->fFile, sqlinfo);
1429 TSqlRawBuffer rawdata(reg, sqlinfo);
1434 columns.AddColumn(reg->fFile->SQLObjectIdColumn(), reg->fCurrentObjId);
1436 for (Int_t n = 0; n <= fChilds.GetLast(); n++) {
1437 TSQLStructure *child = (TSQLStructure *)fChilds.At(n);
1438 TStreamerElement *elem = child->GetElement();
1441 Error(
"StoreClassInNormalForm",
"CAN NOT BE");
1445 if (child->StoreElementInNormalForm(reg, &columns))
1448 Int_t columntyp = DefineElementColumnType(elem, reg->fFile);
1449 if ((columntyp != kColRawData) && (columntyp != kColObjectArray)) {
1450 Error(
"StoreClassInNormalForm",
"Element %s typ=%d has problem with normal store ", elem->GetName(),
1455 Bool_t doblobs = kTRUE;
1457 Int_t blobid = rawdata.fRawId;
1459 if (columntyp == kColObjectArray)
1460 if (child->TryConvertObjectArray(reg, &rawdata))
1464 child->PerformConversion(reg, &rawdata, elem->GetName(), kFALSE);
1466 if (blobid == rawdata.fRawId)
1476 TString blobname = elem->GetName();
1477 if (reg->fFile->GetUseSuffixes())
1478 blobname += sqlio::RawSuffix;
1480 columns.AddColumn(blobname, blobid);
1483 reg->fFile->CreateClassTable(sqlinfo, columns.TakeColInfos());
1485 reg->InsertToNormalTable(&columns, sqlinfo);
1493 TString TSQLStructure::MakeArrayIndex(TStreamerElement *elem, Int_t index)
1496 if ((elem == 0) || (elem->GetArrayLength() == 0))
1499 for (Int_t ndim = elem->GetArrayDim() - 1; ndim >= 0; ndim--) {
1500 Int_t ix = index % elem->GetMaxIndex(ndim);
1501 index = index / elem->GetMaxIndex(ndim);
1503 buf.Form(
"%s%d%s",
"[", ix,
"]");
1512 Bool_t TSQLStructure::StoreElementInNormalForm(TSqlRegistry *reg, TSQLTableData *columns)
1514 TStreamerElement *elem = GetElement();
1518 Int_t typ = elem->GetType();
1520 Int_t columntyp = DefineElementColumnType(elem, reg->fFile);
1523 std::cout <<
"Element " << elem->GetName() <<
" type = " << typ <<
" column = " << columntyp << std::endl;
1525 TString colname = DefineElementColumnName(elem, reg->fFile);
1527 if (columntyp == kColTString) {
1529 if (!RecognizeTString(value))
1532 Int_t len = value ? strlen(value) : 0;
1534 Int_t sizelimit = reg->fFile->SQLSmallTextTypeLimit();
1536 const char *stype = reg->fFile->SQLSmallTextType();
1538 if (len <= sizelimit)
1539 columns->AddColumn(colname.Data(), stype, value, kFALSE);
1541 Int_t strid = reg->AddLongString(value);
1542 TString buf = reg->fFile->CodeLongString(reg->fCurrentObjId, strid);
1543 columns->AddColumn(colname.Data(), stype, buf.Data(), kFALSE);
1549 if (columntyp == kColParent) {
1550 Long64_t objid = reg->fCurrentObjId;
1551 TClass *basecl = elem->GetClassPointer();
1552 Int_t resversion = basecl->GetClassVersion();
1553 if (!StoreObject(reg, objid, basecl, kFALSE))
1555 columns->AddColumn(colname.Data(), resversion);
1559 if (columntyp == kColObject) {
1561 Long64_t objid = -1;
1563 if (NumChilds() == 1) {
1564 TSQLStructure *child = GetChild(0);
1566 if (child->GetType() == kSqlObject) {
1567 objid = child->DefineObjectId(kFALSE);
1568 if (!child->StoreObject(reg, objid, child->GetObjectClass()))
1570 }
else if (child->GetType() == kSqlPointer) {
1571 TString sobjid = child->GetValue();
1572 if (sobjid.Length() > 0)
1573 objid = sqlio::atol64(sobjid.Data());
1580 objid = reg->GetNextObjId();
1581 if (!StoreObject(reg, objid, elem->GetClassPointer()))
1585 columns->AddColumn(colname.Data(), objid);
1589 if (columntyp == kColNormObject) {
1591 if (NumChilds() != 1) {
1592 Error(
"kColNormObject",
"NumChilds()=%d", NumChilds());
1596 TSQLStructure *child = GetChild(0);
1597 if ((child->GetType() != kSqlPointer) && (child->GetType() != kSqlObject))
1600 Bool_t normal = kTRUE;
1602 Long64_t objid = -1;
1604 if (child->GetType() == kSqlObject) {
1605 objid = child->DefineObjectId(kFALSE);
1606 normal = child->StoreObject(reg, objid, child->GetObjectClass());
1608 objid = child->DefineObjectId(kFALSE);
1612 Error(
"kColNormObject",
"child->StoreObject fails");
1616 columns->AddColumn(colname.Data(), objid);
1620 if (columntyp == kColNormObjectArray) {
1622 if (elem->GetArrayLength() != NumChilds())
1625 for (Int_t index = 0; index < NumChilds(); index++) {
1626 TSQLStructure *child = GetChild(index);
1627 if ((child->GetType() != kSqlPointer) && (child->GetType() != kSqlObject))
1629 Bool_t normal = kTRUE;
1631 Long64_t objid = child->DefineObjectId(kFALSE);
1633 if (child->GetType() == kSqlObject)
1634 normal = child->StoreObject(reg, objid, child->GetObjectClass());
1639 colname = DefineElementColumnName(elem, reg->fFile, index);
1641 columns->AddColumn(colname.Data(), objid);
1646 if (columntyp == kColObjectPtr) {
1647 if (NumChilds() != 1)
1649 TSQLStructure *child = GetChild(0);
1650 if ((child->GetType() != kSqlPointer) && (child->GetType() != kSqlObject))
1653 Bool_t normal = kTRUE;
1654 Long64_t objid = -1;
1656 if (child->GetType() == kSqlObject) {
1657 objid = child->DefineObjectId(kFALSE);
1658 normal = child->StoreObject(reg, objid, child->GetObjectClass());
1664 columns->AddColumn(colname.Data(), objid);
1668 if (columntyp == kColSimple) {
1671 if (NumChilds() != 1) {
1672 Error(
"StoreElementInNormalForm",
"Enexpected number %d for simple element %s", NumChilds(), elem->GetName());
1676 TSQLStructure *child = GetChild(0);
1677 if (child->GetType() != kSqlValue)
1680 const char *value = child->GetValue();
1684 const char *sqltype = reg->fFile->SQLCompatibleType(typ);
1686 columns->AddColumn(colname.Data(), sqltype, value, IsNumericType(typ));
1691 if (columntyp == kColSimpleArray) {
1694 if (NumChilds() != 1) {
1695 Error(
"StoreElementInNormalForm",
"In fixed array %s only array node should be", elem->GetName());
1698 TSQLStructure *arr = GetChild(0);
1700 const char *sqltype = reg->fFile->SQLCompatibleType(typ % 20);
1702 for (Int_t n = 0; n < arr->NumChilds(); n++) {
1703 TSQLStructure *child = arr->GetChild(n);
1704 if (child->GetType() != kSqlValue)
1707 const char *value = child->GetValue();
1711 Int_t index = child->GetArrayIndex();
1712 Int_t last = index + child->GetRepeatCounter();
1714 while (index < last) {
1715 colname = DefineElementColumnName(elem, reg->fFile, index);
1716 columns->AddColumn(colname.Data(), sqltype, value, kTRUE);
1732 Bool_t TSQLStructure::TryConvertObjectArray(TSqlRegistry *reg, TSqlRawBuffer *blobs)
1734 TStreamerElement *elem = GetElement();
1738 if (NumChilds() % 2 != 0)
1743 while (indx < NumChilds()) {
1744 TSQLStructure *s_ver = GetChild(indx++);
1745 TSQLStructure *s_info = GetChild(indx++);
1746 if (!CheckNormalClassPair(s_ver, s_info))
1751 const char *ns = reg->fFile->SQLNameSeparator();
1753 while (indx < NumChilds() - 1) {
1755 TSQLStructure *s_info = GetChild(indx++);
1757 Version_t version = 0;
1758 if (!s_info->GetClassInfo(cl, version))
1760 Long64_t objid = reg->GetNextObjId();
1761 if (!s_info->StoreObject(reg, objid, cl))
1765 sobjid.Form(
"%lld", objid);
1767 blobs->AddLine(sqlio::ObjectRef_Arr, sobjid.Data(), elem->GetName(), ns);
1777 Bool_t TSQLStructure::CheckNormalClassPair(TSQLStructure *s_ver, TSQLStructure *s_info)
1779 if ((s_ver == 0) || (s_info == 0) || (s_ver->GetType() != kSqlVersion))
1782 TClass *ver_cl = s_ver->GetVersionClass();
1784 TClass *info_cl = 0;
1785 Version_t info_ver = 0;
1786 if (!s_info->GetClassInfo(info_cl, info_ver))
1789 if ((ver_cl == 0) || (info_cl == 0) || (ver_cl != info_cl) || (ver_cl->GetClassVersion() != info_ver))
1799 Bool_t TSQLStructure::StoreTObject(TSqlRegistry *reg)
1802 if ((NumChilds() < 3) || (NumChilds() > 4))
1805 TSQLStructure *str_ver = GetChild(0);
1806 TSQLStructure *str_id = GetChild(1);
1807 TSQLStructure *str_bits = GetChild(2);
1808 TSQLStructure *str_prid = GetChild(3);
1810 if (str_ver->GetType() != kSqlVersion)
1812 if ((str_id->GetType() != kSqlValue) || (str_id->GetValueType() != sqlio::UInt))
1814 if ((str_bits->GetType() != kSqlValue) || (str_bits->GetValueType() != sqlio::UInt))
1817 if ((str_prid->GetType() != kSqlValue) || (str_prid->GetValueType() != sqlio::UShort))
1820 TSQLClassInfo *sqlinfo = reg->fFile->RequestSQLClassInfo(TObject::Class());
1825 TSQLTableData columns(reg->fFile, sqlinfo);
1827 const char *uinttype = reg->fFile->SQLCompatibleType(TStreamerInfo::kUInt);
1829 columns.AddColumn(reg->fFile->SQLObjectIdColumn(), reg->fCurrentObjId);
1831 columns.AddColumn(sqlio::TObjectUniqueId, uinttype, str_id->GetValue(), kTRUE);
1832 columns.AddColumn(sqlio::TObjectBits, uinttype, str_bits->GetValue(), kTRUE);
1833 columns.AddColumn(sqlio::TObjectProcessId,
"CHAR(3)", (str_prid ? str_prid->GetValue() :
""), kFALSE);
1835 reg->fFile->CreateClassTable(sqlinfo, columns.TakeColInfos());
1837 reg->InsertToNormalTable(&columns, sqlinfo);
1846 Bool_t TSQLStructure::StoreTString(TSqlRegistry *reg)
1848 const char *value = 0;
1849 if (!RecognizeTString(value))
1852 TSQLClassInfo *sqlinfo = reg->fFile->RequestSQLClassInfo(TString::Class());
1856 TSQLTableData columns(reg->fFile, sqlinfo);
1858 columns.AddColumn(reg->fFile->SQLObjectIdColumn(), reg->fCurrentObjId);
1859 columns.AddColumn(sqlio::TStringValue, reg->fFile->SQLBigTextType(), value, kFALSE);
1861 reg->fFile->CreateClassTable(sqlinfo, columns.TakeColInfos());
1863 reg->InsertToNormalTable(&columns, sqlinfo);
1870 Bool_t TSQLStructure::RecognizeTString(
const char *&value)
1874 if ((NumChilds() == 0) || (NumChilds() > 3))
1877 TSQLStructure *len = 0, *lenbig = 0, *chars = 0;
1878 for (Int_t n = 0; n < NumChilds(); n++) {
1879 TSQLStructure *curr = GetChild(n);
1880 if (curr->fType != kSqlValue)
1882 if (curr->fPointer == sqlio::UChar) {
1887 }
else if (curr->fPointer == sqlio::Int) {
1892 }
else if (curr->fPointer == sqlio::CharStar) {
1903 if ((lenbig != 0) && (chars == 0))
1907 value = chars->GetValue();
1923 Int_t TSQLStructure::DefineElementColumnType(TStreamerElement *elem, TSQLFile *f)
1928 Int_t typ = elem->GetType();
1930 if (typ == TStreamerInfo::kMissing)
1933 if ((typ > 0) && (typ < 20) && (typ != TStreamerInfo::kCharStar))
1936 if ((typ > TStreamerInfo::kOffsetL) && (typ < TStreamerInfo::kOffsetP))
1937 if ((f->GetArrayLimit() < 0) || (elem->GetArrayLength() <= f->GetArrayLimit()))
1938 return kColSimpleArray;
1940 if (typ == TStreamerInfo::kTObject) {
1941 if (elem->InheritsFrom(TStreamerBase::Class()))
1947 if (typ == TStreamerInfo::kTNamed) {
1948 if (elem->InheritsFrom(TStreamerBase::Class()))
1954 if (typ == TStreamerInfo::kTString)
1957 if (typ == TStreamerInfo::kBase)
1960 if (typ == TStreamerInfo::kSTL)
1961 if (elem->InheritsFrom(TStreamerBase::Class()))
1966 if ((typ == TStreamerInfo::kObject) || (typ == TStreamerInfo::kAny)) {
1967 if (elem->GetArrayLength() == 0)
1969 else if (elem->GetStreamer() == 0)
1970 return kColObjectArray;
1973 if ((typ == TStreamerInfo::kObject) || (typ == TStreamerInfo::kAny) || (typ == TStreamerInfo::kAnyp) ||
1974 (typ == TStreamerInfo::kObjectp) || (typ == TStreamerInfo::kAnyP) || (typ == TStreamerInfo::kObjectP)) {
1975 if ((elem->GetArrayLength() == 0) || (elem->GetStreamer() != 0))
1976 return kColNormObject;
1978 return kColNormObjectArray;
1981 if ((typ == TStreamerInfo::kObject + TStreamerInfo::kOffsetL) ||
1982 (typ == TStreamerInfo::kAny + TStreamerInfo::kOffsetL) ||
1983 (typ == TStreamerInfo::kAnyp + TStreamerInfo::kOffsetL) ||
1984 (typ == TStreamerInfo::kObjectp + TStreamerInfo::kOffsetL) ||
1985 (typ == TStreamerInfo::kAnyP + TStreamerInfo::kOffsetL) ||
1986 (typ == TStreamerInfo::kObjectP + TStreamerInfo::kOffsetL)) {
1987 if (elem->GetStreamer() != 0)
1988 return kColNormObject;
1990 return kColNormObjectArray;
1993 if ((typ == TStreamerInfo::kObject) || (typ == TStreamerInfo::kAny) || (typ == TStreamerInfo::kAnyp) ||
1994 (typ == TStreamerInfo::kObjectp) || (typ == TStreamerInfo::kSTL)) {
1995 if (elem->GetArrayLength() == 0)
1997 else if (elem->GetStreamer() == 0)
1998 return kColObjectArray;
2001 if (((typ == TStreamerInfo::kAnyP) || (typ == TStreamerInfo::kObjectP)) && (elem->GetArrayDim() == 0))
2002 return kColObjectPtr;
2017 TString TSQLStructure::DefineElementColumnName(TStreamerElement *elem, TSQLFile *f, Int_t indx)
2019 TString colname =
"";
2021 Int_t coltype = DefineElementColumnType(elem, f);
2022 if (coltype == kColUnknown)
2025 const char *elemname = elem->GetName();
2030 if (f->GetUseSuffixes()) {
2031 colname += f->SQLNameSeparator();
2032 colname += GetSimpleTypeName(elem->GetType());
2037 case kColSimpleArray: {
2039 colname += MakeArrayIndex(elem, indx);
2045 if (f->GetUseSuffixes())
2046 colname += sqlio::ParentSuffix;
2050 case kColNormObject: {
2052 if (f->GetUseSuffixes())
2053 colname += sqlio::ObjectSuffix;
2057 case kColNormObjectArray: {
2059 colname += MakeArrayIndex(elem, indx);
2060 if (f->GetUseSuffixes())
2061 colname += sqlio::ObjectSuffix;
2067 if (f->GetUseSuffixes())
2068 colname += sqlio::ObjectSuffix;
2072 case kColObjectPtr: {
2074 if (f->GetUseSuffixes())
2075 colname += sqlio::PointerSuffix;
2080 colname = elem->GetName();
2081 if (f->GetUseSuffixes())
2082 colname += sqlio::StrSuffix;
2088 if (f->GetUseSuffixes())
2089 colname += sqlio::RawSuffix;
2093 case kColObjectArray: {
2095 if (f->GetUseSuffixes())
2096 colname += sqlio::RawSuffix;
2107 Int_t TSQLStructure::LocateElementColumn(TSQLFile *f, TBufferSQL2 *buf, TSQLObjectData *data)
2109 TStreamerElement *elem = GetElement();
2110 if ((elem == 0) || (data == 0))
2113 Int_t coltype = DefineElementColumnType(elem, f);
2116 std::cout <<
"TSQLStructure::LocateElementColumn " << elem->GetName() <<
" coltyp = " << coltype <<
" : "
2117 << elem->GetType() <<
" len = " << elem->GetArrayLength() << std::endl;
2119 if (coltype == kColUnknown)
2122 const char *elemname = elem->GetName();
2123 Bool_t located = kFALSE;
2125 TString colname = DefineElementColumnName(elem, f);
2128 std::cout <<
" colname = " << colname <<
" in " << data->GetInfo()->GetClassTableName() << std::endl;
2132 located = data->LocateColumn(colname.Data());
2136 case kColSimpleArray: {
2137 located = data->LocateColumn(colname);
2142 located = data->LocateColumn(colname.Data());
2143 if (located == kColUnknown)
2146 Long64_t objid = DefineObjectId(kTRUE);
2147 const char *clname = elemname;
2148 Version_t version = atoi(data->GetValue());
2155 if (strcmp(clname, TObject::Class()->GetName()) == 0) {
2156 UnpackTObject(f, buf, data, objid, version);
2160 TSQLClassInfo *sqlinfo = f->FindSQLClassInfo(clname, version);
2165 if (sqlinfo->IsClassTableExist()) {
2166 data->AddUnpackInt(sqlio::Version, version);
2168 TSQLObjectData *objdata = buf->SqlObjectData(objid, sqlinfo);
2169 if ((objdata == 0) || !objdata->PrepareForRawData())
2171 AddObjectData(objdata);
2185 located = data->LocateColumn(colname.Data());
2186 if (located == kColUnknown)
2189 const char *strobjid = data->GetValue();
2193 Long64_t objid = sqlio::atol64(strobjid);
2202 if (!buf->SqlObjectInfo(objid, clname, version))
2206 if (clname == TObject::Class()->GetName()) {
2207 UnpackTObject(f, buf, data, objid, version);
2211 TSQLClassInfo *sqlinfo = f->FindSQLClassInfo(clname.Data(), version);
2215 if (sqlinfo->IsClassTableExist()) {
2216 data->AddUnpackInt(sqlio::Version, version);
2218 TSQLObjectData *objdata = buf->SqlObjectData(objid, sqlinfo);
2219 if ((objdata == 0) || !objdata->PrepareForRawData())
2221 AddObjectData(objdata);
2234 case kColObjectPtr: {
2235 located = data->LocateColumn(colname.Data());
2243 case kColNormObject: {
2244 located = data->LocateColumn(colname.Data());
2248 case kColNormObjectArray: {
2249 located = data->LocateColumn(colname.Data());
2254 located = data->LocateColumn(colname);
2255 if (located == kColUnknown)
2257 const char *value = data->GetValue();
2259 Long64_t objid = DefineObjectId(kTRUE);
2260 Int_t strid = f->IsLongStringCode(objid, value);
2266 if (f->GetLongString(objid, strid, buf2))
2267 value = buf2.Data();
2269 Int_t len = (value == 0) ? 0 : strlen(value);
2271 data->AddUnpackInt(sqlio::UChar, len);
2273 data->AddUnpackInt(sqlio::UChar, 255);
2274 data->AddUnpackInt(sqlio::Int, len);
2277 data->AddUnpack(sqlio::CharStar, value);
2282 located = data->LocateColumn(colname.Data(), kTRUE);
2286 case kColObjectArray: {
2287 located = data->LocateColumn(colname.Data(), kTRUE);
2293 coltype = kColUnknown;
2302 TSQLStructure::UnpackTObject(TSQLFile *f, TBufferSQL2 *buf, TSQLObjectData *data, Long64_t objid, Int_t clversion)
2304 TSQLClassInfo *sqlinfo = f->FindSQLClassInfo(TObject::Class()->GetName(), clversion);
2308 TSQLObjectData *tobjdata = buf->SqlObjectData(objid, sqlinfo);
2312 data->AddUnpackInt(sqlio::Version, clversion);
2314 tobjdata->LocateColumn(sqlio::TObjectUniqueId);
2315 data->AddUnpack(sqlio::UInt, tobjdata->GetValue());
2316 tobjdata->ShiftToNextValue();
2318 tobjdata->LocateColumn(sqlio::TObjectBits);
2319 data->AddUnpack(sqlio::UInt, tobjdata->GetValue());
2320 tobjdata->ShiftToNextValue();
2322 tobjdata->LocateColumn(sqlio::TObjectProcessId);
2323 const char *value = tobjdata->GetValue();
2324 if ((value != 0) && (strlen(value) > 0))
2325 data->AddUnpack(sqlio::UShort, value);
2336 TSQLStructure::UnpackTString(TSQLFile *f, TBufferSQL2 *buf, TSQLObjectData *data, Long64_t objid, Int_t clversion)
2338 TSQLClassInfo *sqlinfo = f->FindSQLClassInfo(TString::Class()->GetName(), clversion);
2342 TSQLObjectData *tstringdata = buf->SqlObjectData(objid, sqlinfo);
2343 if (tstringdata == 0)
2346 tstringdata->LocateColumn(sqlio::TStringValue);
2348 const char *value = tstringdata->GetValue();
2350 Int_t len = (value == 0) ? 0 : strlen(value);
2352 data->AddUnpackInt(sqlio::UChar, len);
2354 data->AddUnpackInt(sqlio::UChar, 255);
2355 data->AddUnpackInt(sqlio::Int, len);
2358 data->AddUnpack(sqlio::CharStar, value);
2368 void TSQLStructure::AddStrBrackets(TString &s,
const char *quote)
2370 if (strcmp(quote,
"\"") == 0)
2371 s.ReplaceAll(
"\"",
"\\\"");
2373 s.ReplaceAll(
"'",
"''");