69const char *
Bool =
"Bool_t";
70const char *
Char =
"Char_t";
72const char *
Int =
"Int_t";
73const char *
Long =
"Long_t";
79const char *
UInt =
"UInt_t";
145 if (!value || (*value == 0))
195 :
TObject(), fFile(
f), fInfo(info), fColumns(), fColInfos(0)
235 v->SetBit(
BIT(20), numeric);
252 Int_t len = strlen(fullname);
267 if (len + numlen > maxlen)
268 res.
Resize(maxlen - numlen);
278 }
while (
cnt < 10000);
280 Error(
"DefineSQLName",
"Cannot find reasonable column name for field %s", fullname);
296 if (strcmp(colname, sqlname) == 0)
342 :
TObject(), fParent(0),
fType(0), fPointer(0),
fValue(), fArrayIndex(-1), fRepeatCnt(0), fChilds()
642 const char *value = curr->
GetValue();
643 if ((value != 0) && (strlen(value) > 0))
647 curr = recursive ? curr->
GetParent() : 0;
700 case 0: std::cout <<
"Undefined type";
break;
710 std::cout <<
"Class: " << info->
GetName();
716 std::cout <<
"Member: " << elem->
GetName();
720 std::cout <<
"Value: " <<
fValue;
724 std::cout <<
" type = " << (
const char *)
fPointer;
728 std::cout <<
"Array ";
730 std::cout <<
" sz = " <<
fValue;
735 std::cout <<
"CustomClass: " << cl->
GetName() <<
" ver = " <<
fValue;
738 default: std::cout <<
"Unknown type";
740 std::cout << std::endl;
807class TSqlCmdsBuffer :
public TObject {
812 virtual ~TSqlCmdsBuffer()
816 fFile->SQLDeleteStatement(fBlobStmt);
817 fFile->SQLDeleteStatement(fNormStmt);
820 void AddValues(
Bool_t isnorm,
const char *values)
841class TSqlRegistry :
public TObject {
845 :
TObject(), fFile(0), fKeyId(0), fLastObjId(-1), fCmds(0), fFirstObjId(0), fCurrentObjId(0), fCurrentObjClass(0),
846 fLastLongStrId(0), fPool(), fLongStrValues(), fRegValues(), fRegStmt(0)
859 Int_t fLastLongStrId;
867 virtual ~TSqlRegistry()
875 Long64_t GetNextObjId() {
return ++fLastObjId; }
877 void AddSqlCmd(
const char *query)
889 TSqlCmdsBuffer *buf = (TSqlCmdsBuffer *)fPool.
GetValue(sqlinfo);
891 buf =
new TSqlCmdsBuffer(fFile, sqlinfo);
892 fPool.
Add(sqlinfo, buf);
897 void ConvertSqlValues(
TObjArray &values,
const char *tablename)
903 if ((values.
GetLast() < 0) || (tablename == 0))
908 Int_t maxsize = 50000;
909 TString sqlcmd(maxsize), value, onecmd, cmdmask;
915 while ((cmd = iter()) != 0) {
917 if (sqlcmd.Length() == 0)
918 sqlcmd.Form(
"INSERT INTO %s%s%s VALUES (%s)", quote, tablename, quote, cmd->
GetName());
925 if (!canbelong || (sqlcmd.Length() > maxsize * 0.9)) {
926 AddSqlCmd(sqlcmd.Data());
931 if (sqlcmd.Length() > 0)
932 AddSqlCmd(sqlcmd.Data());
935 void ConvertPoolValues()
940 TSqlCmdsBuffer *buf = (TSqlCmdsBuffer *)fPool.
GetValue(sqlinfo);
945 if (buf->fBlobCmds.GetLast() >= 0)
949 buf->fBlobStmt->Process();
951 buf->fNormStmt->Process();
962 Long64_t indx = objid - fFirstObjId;
964 Error(
"AddRegCmd",
"Something wrong with objid = %lld", objid);
973 const char *pars = fFile->
IsOracle() ?
":1, :2, :3, :4" :
"?, ?, ?, ?";
994 Int_t AddLongString(
const char *strvalue)
999 if (fLastLongStrId == 0)
1001 Int_t strid = ++fLastLongStrId;
1007 cmd.
Form(
"%lld, %d, %s", fCurrentObjId, strid, value.
Data());
1016 TSqlCmdsBuffer *buf = GetCmdsBuffer(sqlinfo);
1043 buf->fNormStmt = stmt;
1051 const char *value = columns->
GetColumn(ncol);
1054 stmt->
SetString(ncol, value, sizelimit);
1065 if (InsertToNormalTableOracle(columns, sqlinfo))
1085 TSqlCmdsBuffer *buf = GetCmdsBuffer(sqlinfo);
1097class TSqlRawBuffer :
public TObject {
1101 :
TObject(), fFile(0), fInfo(0), fCmdBuf(0), fObjId(0), fRawId(0), fValueMask(), fValueQuote(0), fMaxStrSize(255)
1105 fCmdBuf = reg->GetCmdsBuffer(sqlinfo);
1106 fObjId = reg->fCurrentObjId;
1108 fValueMask.Form(
"%lld, %s, %s%s%s, %s", fObjId,
"%d", fValueQuote,
"%s", fValueQuote,
"%s");
1109 fMaxStrSize = reg->fFile->SQLSmallTextTypeLimit();
1112 virtual ~TSqlRawBuffer()
1116 if ((stmt != 0) && fFile->
IsOracle()) {
1119 fCmdBuf->fBlobStmt = 0;
1123 Bool_t IsAnyData()
const {
return fRawId > 0; }
1125 void AddLine(
const char *
name,
const char *value,
const char *topname = 0,
const char *
ns = 0)
1142 const char *params = fFile->
IsOracle() ?
":1, :2, :3, :4" :
"?, ?, ?, ?";
1143 sqlcmd.
Form(
"INSERT INTO %s%s%s VALUES (%s)", quote, fInfo->GetRawTableName(), quote, params);
1145 fCmdBuf->fBlobStmt = stmt;
1150 const char *fullname =
name;
1151 if ((topname != 0) && (
ns != 0)) {
1155 fullname = buf.
Data();
1163 stmt->
SetInt(1, fRawId++);
1164 stmt->
SetString(2, fullname, fMaxStrSize);
1171 cmd.
Form(fValueMask.Data(), fRawId++, fullname, valuebuf.Data());
1178 TSqlCmdsBuffer *fCmdBuf;
1182 const char *fValueQuote;
1210 if ((
file == 0) || (cmds == 0))
1226 reg.ConvertPoolValues();
1239 const char *
ns = reg->fFile->SQLNameSeparator();
1261 Error(
"PerformConversion",
"version without class");
1278 Long64_t objid = reg->GetNextObjId();
1280 sobjid.
Form(
"%lld", objid);
1301 const char *tname = (
const char *)
fPointer;
1319 Int_t size = strlen(value);
1320 if (size > reg->fFile->SQLSmallTextTypeLimit()) {
1321 Int_t strid = reg->AddLongString(value);
1322 buf = reg->fFile->CodeLongString(reg->fCurrentObjId, strid);
1351 if ((cl == 0) || (objid < 0))
1355 std::cout <<
"Store object " << objid <<
" cl = " << cl->
GetName() << std::endl;
1362 Long64_t oldid = reg->fCurrentObjId;
1363 TClass *oldcl = reg->fCurrentObjClass;
1365 reg->fCurrentObjId = objid;
1366 reg->fCurrentObjClass = cl;
1385 std::cout <<
"Store object " << objid <<
" of class " << cl->
GetName() <<
" normal = " << normstore
1386 <<
" sqltype = " <<
GetType() << std::endl;
1392 TSQLClassInfo *sqlinfo = reg->fFile->RequestSQLClassInfo(cl);
1393 TSqlRawBuffer rawdata(reg, sqlinfo);
1400 res = rawdata.IsAnyData();
1404 reg->AddRegCmd(objid, cl);
1406 reg->fCurrentObjId = oldid;
1407 reg->fCurrentObjClass = oldcl;
1449 TSqlRawBuffer rawdata(reg, sqlinfo);
1454 columns.
AddColumn(reg->fFile->SQLObjectIdColumn(), reg->fCurrentObjId);
1461 Error(
"StoreClassInNormalForm",
"CAN NOT BE");
1470 Error(
"StoreClassInNormalForm",
"Element %s typ=%d has problem with normal store ", elem->
GetName(),
1477 Int_t blobid = rawdata.fRawId;
1486 if (blobid == rawdata.fRawId)
1497 if (reg->fFile->GetUseSuffixes())
1503 reg->fFile->CreateClassTable(sqlinfo, columns.
TakeColInfos());
1505 reg->InsertToNormalTable(&columns, sqlinfo);
1523 buf.
Form(
"%s%d%s",
"[", ix,
"]");
1543 std::cout <<
"Element " << elem->
GetName() <<
" type = " << typ <<
" column = " << columntyp << std::endl;
1552 Int_t len = value ? strlen(value) : 0;
1554 Int_t sizelimit = reg->fFile->SQLSmallTextTypeLimit();
1556 const char *stype = reg->fFile->SQLSmallTextType();
1558 if (len <= sizelimit)
1561 Int_t strid = reg->AddLongString(value);
1562 TString buf = reg->fFile->CodeLongString(reg->fCurrentObjId, strid);
1570 Long64_t objid = reg->fCurrentObjId;
1600 objid = reg->GetNextObjId();
1632 Error(
"kColNormObject",
"child->StoreObject fails");
1692 Error(
"StoreElementInNormalForm",
"Enexpected number %d for simple element %s",
NumChilds(), elem->
GetName());
1700 const char *value = child->
GetValue();
1704 const char *sqltype = reg->fFile->SQLCompatibleType(typ);
1715 Error(
"StoreElementInNormalForm",
"In fixed array %s only array node should be", elem->
GetName());
1720 const char *sqltype = reg->fFile->SQLCompatibleType(typ % 20);
1727 const char *value = child->
GetValue();
1734 while (index < last) {
1771 const char *
ns = reg->fFile->SQLNameSeparator();
1780 Long64_t objid = reg->GetNextObjId();
1785 sobjid.
Form(
"%lld", objid);
1809 if ((ver_cl == 0) || (info_cl == 0) || (ver_cl != info_cl) || (ver_cl->
GetClassVersion() != info_ver))
1849 columns.
AddColumn(reg->fFile->SQLObjectIdColumn(), reg->fCurrentObjId);
1855 reg->fFile->CreateClassTable(sqlinfo, columns.
TakeColInfos());
1857 reg->InsertToNormalTable(&columns, sqlinfo);
1868 const char *value = 0;
1878 columns.
AddColumn(reg->fFile->SQLObjectIdColumn(), reg->fCurrentObjId);
1881 reg->fFile->CreateClassTable(sqlinfo, columns.
TakeColInfos());
1883 reg->InsertToNormalTable(&columns, sqlinfo);
1923 if ((lenbig != 0) && (chars == 0))
1927 value = chars->GetValue();
1957 if ((
f->GetArrayLimit() < 0) || (elem->
GetArrayLength() <=
f->GetArrayLimit()))
2045 const char *elemname = elem->
GetName();
2050 if (
f->GetUseSuffixes()) {
2051 colname +=
f->SQLNameSeparator();
2065 if (
f->GetUseSuffixes())
2072 if (
f->GetUseSuffixes())
2080 if (
f->GetUseSuffixes())
2087 if (
f->GetUseSuffixes())
2094 if (
f->GetUseSuffixes())
2101 if (
f->GetUseSuffixes())
2108 if (
f->GetUseSuffixes())
2115 if (
f->GetUseSuffixes())
2130 if ((elem == 0) || (data == 0))
2136 std::cout <<
"TSQLStructure::LocateElementColumn " << elem->
GetName() <<
" coltyp = " << coltype <<
" : "
2142 const char *elemname = elem->
GetName();
2167 const char *clname = elemname;
2209 const char *strobjid = data->
GetValue();
2277 const char *value = data->
GetValue();
2280 Int_t strid =
f->IsLongStringCode(objid, value);
2286 if (
f->GetLongString(objid, strid, buf2))
2287 value = buf2.
Data();
2289 Int_t len = (value == 0) ? 0 : strlen(value);
2343 const char *value = tobjdata->
GetValue();
2344 if ((value != 0) && (strlen(value) > 0))
2363 if (tstringdata == 0)
2368 const char *value = tstringdata->
GetValue();
2370 Int_t len = (value == 0) ? 0 : strlen(value);
2390 if (strcmp(quote,
"\"") == 0)
2391 s.ReplaceAll(
"\"",
"\\\"");
2393 s.ReplaceAll(
"'",
"''");
char * Form(const char *fmt,...)
Converts data to SQL statements or read data from SQL tables.
Bool_t SqlObjectInfo(Long64_t objid, TString &clname, Version_t &version)
Returns object info like classname and version Should be taken from buffer, which is produced in the ...
TSQLObjectData * SqlObjectData(Long64_t objid, TSQLClassInfo *sqlinfo)
Creates TSQLObjectData for specified object id and specified class.
TClass instances represent classes, structs and namespaces in the ROOT type system.
Version_t GetClassVersion() const
virtual const char * GetName() const
Return name of this collection.
TMap implements an associative array of (key,value) pairs using a THashTable for efficient retrieval ...
void Add(TObject *obj)
This function may not be used (but we need to provide it since it is a pure virtual in TCollection).
void DeleteValues()
Remove all (key,value) pairs from the map AND delete the values when they are allocated on the heap.
TObject * GetValue(const char *keyname) const
Returns a pointer to the value associated with keyname as name of the key.
virtual const char * GetName() const
Returns name of object.
virtual void AddAtAndExpand(TObject *obj, Int_t idx)
Add object at position idx.
TObject * Last() const
Return the object in the last filled slot. Returns 0 if no entries.
virtual void Delete(Option_t *option="")
Remove all objects from the array AND delete all heap based objects.
Int_t GetLast() const
Return index of last object in array.
TObject * At(Int_t idx) const
Collectable string class.
Mother of all ROOT objects.
virtual const char * GetName() const
Returns name of object.
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
virtual void Delete(Option_t *option="")
Delete this object.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
const char * GetSQLName() const
Contains information about tables specific to one class and version.
Bool_t IsClassTableExist() const
const char * GetClassTableName() const
const char * GetRawTableName() const
TSQLColumnData()
default constructor
TString fValue
! value of the table column
virtual ~TSQLColumnData()
TSQLColumnData destructor.
Access an SQL db via the TFile interface.
const char * SQLIdentifierQuote() const
Bool_t SQLCanStatement()
Test if DB support statement and number of open statements is not exceeded.
Bool_t CreateRawTable(TSQLClassInfo *sqlinfo)
Create the raw table.
const char * SQLValueQuote() const
Bool_t IsMySQL() const
checks, if MySQL database
Bool_t IsOracle() const
checks, if Oracle database
Int_t SQLSmallTextTypeLimit() const
TSQLStatement * SQLStatement(const char *cmd, Int_t bufsize=1000)
Produces SQL statement for currently conected DB server.
void SQLDeleteStatement(TSQLStatement *stmt)
delete statement and decrease counter
Int_t SQLMaxIdentifierLength()
returns maximum allowed length of identifiers
Bool_t IsODBC() const
checks, if ODBC driver used for database connection
Bool_t VerifyLongStringTable()
Checks that table for big strings is exists If not, will be created.
TSQLObjectData is used in TBufferSQL2 class in reading procedure.
Bool_t LocateColumn(const char *colname, Bool_t isblob=kFALSE)
locate column of that name in results
void ShiftToNextValue()
shift to next column or next row in blob data
const char * GetValue() const
TSQLClassInfo * GetInfo() const
void AddUnpack(const char *tname, const char *value)
add emulated data this used to place version or TObject raw data, read from normal tables
Bool_t PrepareForRawData()
prepare to read data from raw table
void AddUnpackInt(const char *tname, Int_t value)
emulate integer value in raw data
virtual Bool_t NextIteration()=0
virtual Bool_t SetString(Int_t, const char *, Int_t=256)
virtual Bool_t Process()=0
virtual Bool_t SetInt(Int_t, Int_t)
virtual Bool_t SetLong64(Int_t, Long64_t)
This is hierarchical structure, which is created when data is written by TBufferSQL2.
Bool_t RecognizeTString(const char *&value)
prove that structure contains TString data
TSQLStructure * GetParent() const
Int_t LocateElementColumn(TSQLFile *f, TBufferSQL2 *buf, TSQLObjectData *data)
find column in TSQLObjectData object, which correspond to current element
TClass * GetObjectClass() const
return object class if type kSqlObject
virtual void Print(Option_t *option="") const
print content of complete structure
Bool_t TryConvertObjectArray(TSqlRegistry *reg, TSqlRawBuffer *blobs)
tries to write array of objects as list of object references in streamer table, while objects itself ...
static void AddStrBrackets(TString &s, const char *quote)
adds quotes around string value and replaces some special symbols
void Add(TSQLStructure *child)
Add child structure.
void AddVersion(const TClass *cl, Int_t version=-100)
add child as version
void SetVersion(const TClass *cl, Int_t version=-100)
set structure type as kSqlVersion
void SetObjectPointer(Long64_t ptrid)
set structure type as kSqlPointer
void SetValue(const char *value, const char *tname=0)
set structure type as kSqlValue
void SetArray(Int_t sz=-1)
Set structure as array element.
static Bool_t IsNumericType(Int_t typ)
defines if value is numeric and not requires quotes when writing
Int_t GetElementNumber() const
returns number of TStremerElement in TStreamerInfo
TSQLObjectData * GetObjectData(Bool_t search=false)
searches for objects data
TStreamerInfo * GetStreamerInfo() const
return TStreamerInfo* if type is kSqlStreamerInfo
void PerformConversion(TSqlRegistry *reg, TSqlRawBuffer *blobs, const char *topname, Bool_t useblob=kFALSE)
perform conversion of structure to sql statements first tries convert it to normal form if fails,...
Bool_t StoreTObject(TSqlRegistry *reg)
store data of TObject in special table workaround custom TObject streamer
TSQLStructure * GetChild(Int_t n) const
return child structure of index n
Bool_t GetClassInfo(TClass *&cl, Version_t &version)
provides class info if structure kSqlStreamerInfo or kSqlCustomClass
void SetCustomClass(const TClass *cl, Version_t version)
set structure type as kSqlCustomClass
const char * GetValue() const
returns value for different structure kinds has different sense For kSqlVersion it version,...
static Bool_t UnpackTString(TSQLFile *f, TBufferSQL2 *buf, TSQLObjectData *data, Long64_t objid, Int_t clversion)
Unpack TString data in form, accepted by custom TString streamer.
static Int_t DefineElementColumnType(TStreamerElement *elem, TSQLFile *f)
defines which kind of column can be assigned for this element Possible cases kColSimple - basic data ...
Int_t GetRepeatCounter() const
Long64_t FindMaxObjectId()
define maximum reference id, used for objects
Bool_t StoreObjectInNormalForm(TSqlRegistry *reg)
this function verify object child elements and calls transformation to class table
void SetStreamerInfo(const TStreamerInfo *info)
set structure type as kSqlStreamerInfo
void AddObjectData(TSQLObjectData *objdata)
add element with pointer to object data
void SetArrayIndex(Int_t indx, Int_t cnt=1)
set array index for this structure
Bool_t StoreClassInNormalForm(TSqlRegistry *reg)
produces data for complete class table where not possible, raw data for some elements are created
static TString MakeArrayIndex(TStreamerElement *elem, Int_t n)
produce string with complete index like [1][2][0]
Version_t GetCustomClassVersion() const
return custom class version if strutures is kSqlCustomClass
static Bool_t UnpackTObject(TSQLFile *f, TBufferSQL2 *buf, TSQLObjectData *data, Long64_t objid, Int_t clversion)
Unpack TObject data in form, accepted by custom TObject streamer.
Bool_t StoreObject(TSqlRegistry *reg, Long64_t objid, TClass *cl, Bool_t registerobj=kTRUE)
convert object data to sql statements if normal (column-wise) representation is not possible,...
void ChangeValueOnly(const char *value)
change value of this structure used as "workaround" to keep object id in kSqlElement node
Bool_t ConvertToTables(TSQLFile *f, Long64_t keyid, TObjArray *cmds)
Convert structure to sql statements This function is called immidiately after TBufferSQL2 produces th...
void SetCustomElement(TStreamerElement *elem)
set structure type as kSqlCustomElement
const char * GetValueType() const
return value type if structure is kSqlValue
static TString DefineElementColumnName(TStreamerElement *elem, TSQLFile *f, Int_t indx=0)
returns name of the column in class table for that element
Int_t GetArrayIndex() const
void SetObjectData(TSQLObjectData *objdata)
set element to be used for object data
void SetParent(TSQLStructure *p)
void SetObjectRef(Long64_t refid, const TClass *cl)
set structure type as kSqlObject
Long64_t DefineObjectId(Bool_t recursive=kTRUE)
defines current object id, to which this structure belong make life complicated, because some objects...
TStreamerElement * GetElement() const
return TStremerElement* if type is kSqlElement
TClass * GetVersionClass() const
return class for version tag if type is kSqlVersion
void PrintLevel(Int_t level) const
print content of current structure
static const char * GetSimpleTypeName(Int_t typ)
provides name for basic types used as suffix for column name or field suffix in raw table
Bool_t StoreElementInNormalForm(TSqlRegistry *reg, TSQLTableData *columns)
tries to store element data in column
Bool_t CheckNormalClassPair(TSQLStructure *vers, TSQLStructure *info)
check if pair of two element corresponds to start of object, stored in normal form
Int_t NumChilds() const
number of child structures
virtual ~TSQLStructure()
destructor
void AddValue(const char *value, const char *tname=0)
Add child structure as value.
TClass * GetCustomClass() const
return element custom class if strutures is kSqlCustomClass
Bool_t StoreTString(TSqlRegistry *reg)
store data of TString in special table it is required when TString stored as pointer and reference to...
void SetClassStreamer(const TClass *cl)
set structure type as kSqlClassStreamer
void SetStreamerElement(const TStreamerElement *elem, Int_t number)
set structure type as kSqlElement
void ChildArrayIndex(Int_t index, Int_t cnt=1)
set array index for last child element if (cnt<=1) return;
void AddColumn(const char *name, Long64_t value)
Add INT column to list of columns.
TString DefineSQLName(const char *fullname)
produce suitable name for column, taking into account length limitation
Bool_t HasSQLName(const char *sqlname)
checks if columns list already has that sql name
const char * GetColumn(Int_t n)
return column value
Bool_t IsNumeric(Int_t n)
identifies if column has numeric value
TObjArray fColumns
! collection of columns
Int_t GetNumColumns()
returns number of columns in provided set
TObjArray * fColInfos
! array with TSQLClassColumnInfo, used later for TSQLClassInfo
TSQLTableData(TSQLFile *f=0, TSQLClassInfo *info=0)
normal constructor
virtual ~TSQLTableData()
destructor
TObjArray * TakeColInfos()
take ownership over colinfos
virtual TClass * GetClassPointer() const
Returns a pointer to the TClass of this element.
Int_t GetArrayDim() const
TMemberStreamer * GetStreamer() const
Return the local streamer object.
Int_t GetArrayLength() const
Int_t GetMaxIndex(Int_t i) const
Describe Streamer information for one class version.
@ kUChar
Equal to TDataType's kchar.
TClass * GetClass() const
Int_t GetClassVersion() const
const char * Data() const
void Resize(Ssiz_t n)
Resize the string. Truncate or add blanks as necessary.
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Long64_t Atoll() const
Return long long value of string.
static constexpr double s
static constexpr double ns
const char * cfg_UseIndexes
const char * StringsTable
const char * ObjectsTableIndex
const char * ObjectSuffix
const char * KeysTableIndex
Long64_t atol64(const char *value)
const char * TStringValue
const char * cfg_TablesType
const Int_t Ids_FirstObject
const char * ObjectRef_Arr
const Int_t Ids_StreamerInfos
const char * ParentSuffix
const char * cfg_ArrayLimit
const char * TObjectProcessId
const char * PointerSuffix
const char * IdsTableIndex
const char * cfg_UseTransactions
const char * cfg_LockingMode
const char * cfg_UseSufixes
const char * ObjectsTable
const char * cfg_ModifyCounter
const char * TObjectUniqueId
const char * LongStrPrefix