Belle II Software development
DBObject Class Reference
Inheritance diagram for DBObject:
AbstractDBObject Serializable

Classes

struct  NameValue
 

Public Types

typedef std::vector< DBObjectDBObjectList
 
typedef std::map< std::string, void * > FieldValueList
 
typedef std::map< std::string, std::string > FieldTextList
 
typedef std::map< std::string, DBObjectList > FieldObjectList
 
typedef std::vector< NameValueNameValueList
 

Public Member Functions

 DBObject (const std::string &path)
 
 DBObject (const DBObject &obj)
 
const DBObjectoperator= (const DBObject &obj)
 
int getNObjects (const std::string &name) const
 
DBObjectList & getObjects (const std::string &name)
 
const DBObjectList & getObjects (const std::string &name) const
 
DBObjectgetObject (const std::string &name, int i=0)
 
const DBObjectgetObject (const std::string &name, int i=0) const
 
void addObjects (const std::string &name, const DBObjectList &obj)
 
void addObject (const std::string &name, const DBObject &obj)
 
DBObjectoperator() (const std::string &name, int index=0)
 
const DBObjectoperator() (const std::string &name, int index=0) const
 
StringList getNameList (bool isfull) const
 
void print (bool isfull=true) const
 
const std::string sprint (bool isfull) const
 
void printHTML (bool isfull=true) const
 
const std::string printSQL (const std::string &table, int id) const
 
void search (NameValueList &map, const std::string &name="", bool isfull=true) const
 
int getDate () const
 
void setDate (const Date &date)
 
void setDate (int date)
 
const void * getValue (const std::string &name) const override
 
const std::string & getText (const std::string &name) const override
 
void addText (const std::string &name, const std::string &value) override
 
void addValue (const std::string &name, const void *value, DBField::Type type, int length) override
 
void setValue (const std::string &name, const void *value, int length) override
 
void readObject (Reader &reader) override
 
void writeObject (Writer &writer) const override
 
const std::string & getPath () const
 
void setPath (const std::string &path)
 
int getId () const
 
void setId (int id)
 
const std::string & getName () const
 
void setName (const std::string &name)
 
int getIndex () const
 
void setIndex (int index)
 
DBField::NameList & getFieldNames ()
 
const DBField::NameList & getFieldNames () const
 
DBField::Property getProperty (const std::string &name) const
 
bool hasField (const std::string &name) const
 
bool hasValue (const std::string &name) const
 
bool hasText (const std::string &name) const
 
bool hasObject (const std::string &name) const
 
void add (const std::string &name, DBField::Property pro)
 
void setValue (const std::string &name, const std::string &value)
 
void setText (const std::string &name, const std::string &value)
 
bool getBool (const std::string &name, int index=0) const
 
char getChar (const std::string &name, int index=0) const
 
short getShort (const std::string &name, int index=0) const
 
int getInt (const std::string &name, int index=0) const
 
long long getLong (const std::string &name, int index=0) const
 
float getFloat (const std::string &name, int index=0) const
 
double getDouble (const std::string &name, int index=0) const
 
void addBool (const std::string &name, bool value)
 
void addChar (const std::string &name, char value)
 
void addShort (const std::string &name, short value)
 
void addInt (const std::string &name, int value)
 
void addLong (const std::string &name, long long value)
 
void addFloat (const std::string &name, float value)
 
void addDouble (const std::string &name, double value)
 
void setBool (const std::string &name, bool value, int index=0)
 
void setChar (const std::string &name, int value, int index=0)
 
void setShort (const std::string &name, int value, int index=0)
 
void setInt (const std::string &name, int value, int index=0)
 
void setLong (const std::string &name, long long value, int index=0)
 
void setFloat (const std::string &name, float value, int index=0)
 
void setDouble (const std::string &name, double value, int index=0)
 
const std::string getValueText (const std::string &name) const
 
virtual void setValueText (const std::string &name, const std::string &value)
 

Protected Member Functions

void reset () override
 

Private Member Functions

void copy (const DBObject &obj)
 
template<typename T >
getD (const std::string &name, int index=0) const
 

Private Attributes

FieldValueList m_value_m
 
FieldTextList m_text_m
 
FieldObjectList m_obj_v_m
 
std::string m_empty
 
int m_date
 
int m_index
 
std::string m_path
 
int m_id
 
std::string m_name
 
DBField::NameList m_name_v
 
DBField::PropertyList m_pro_m
 

Detailed Description

Definition at line 21 of file DBObject.h.

Member Typedef Documentation

◆ DBObjectList

typedef std::vector<DBObject> DBObjectList

Definition at line 24 of file DBObject.h.

◆ FieldObjectList

typedef std::map<std::string, DBObjectList> FieldObjectList

Definition at line 27 of file DBObject.h.

◆ FieldTextList

typedef std::map<std::string, std::string> FieldTextList

Definition at line 26 of file DBObject.h.

◆ FieldValueList

typedef std::map<std::string, void*> FieldValueList

Definition at line 25 of file DBObject.h.

◆ NameValueList

typedef std::vector<NameValue> NameValueList

Definition at line 36 of file DBObject.h.

Constructor & Destructor Documentation

◆ DBObject() [1/3]

DBObject ( )

Definition at line 21 of file DBObject.cc.

22{
23 setDate(0);
24}

◆ DBObject() [2/3]

DBObject ( const std::string &  path)

Definition at line 26 of file DBObject.cc.

27{
28 setDate(0);
29 setPath(path);
30}

◆ DBObject() [3/3]

DBObject ( const DBObject obj)

Definition at line 32 of file DBObject.cc.

33 : AbstractDBObject(obj)
34{
35 copy(obj);
36}

◆ ~DBObject()

~DBObject ( )
virtual

Definition at line 71 of file DBObject.cc.

72{
73 reset();
74}

Member Function Documentation

◆ add()

void add ( const std::string &  name,
DBField::Property  pro 
)
inherited

Definition at line 88 of file AbstractDBObject.cc.

89{
90 if (!hasField(name)) {
91 m_name_v.push_back(name);
92 m_pro_m.insert(DBField::PropertyList::value_type(name, pro));
93 }
94}

◆ addObject()

void addObject ( const std::string &  name,
const DBObject obj 
)

Definition at line 262 of file DBObject.cc.

264{
265 if (!hasField(name)) {
266 add(name, DBField::Property(DBField::OBJECT, 0));
267 m_obj_v_m.insert(FieldObjectList::value_type(name, DBObjectList()));
268 }
269 m_obj_v_m[name].push_back(obj);
270 getProperty(name).setLength(m_obj_v_m[name].size());
271}

◆ addObjects()

void addObjects ( const std::string &  name,
const DBObjectList &  obj 
)

Definition at line 273 of file DBObject.cc.

275{
276 if (!hasField(name)) {
277 add(name, DBField::Property(DBField::OBJECT, obj_v.size()));
278 m_obj_v_m.insert(FieldObjectList::value_type(name, obj_v));
279 } else {
280 m_obj_v_m[name] = obj_v;
281 }
282}

◆ addText()

void addText ( const std::string &  name,
const std::string &  value 
)
overridevirtual

Implements AbstractDBObject.

Definition at line 251 of file DBObject.cc.

253{
254 if (!hasField(name)) {
255 add(name, DBField::Property(DBField::TEXT, 0));
256 m_text_m.insert(FieldTextList::value_type(name, value));
257 } else {
258 m_text_m[name] = value;
259 }
260}

◆ addValue()

void addValue ( const std::string &  name,
const void *  value,
DBField::Type  type,
int  length 
)
overridevirtual

Implements AbstractDBObject.

Definition at line 225 of file DBObject.cc.

227{
228 DBField::Property pro(type, 0, 0);
229 int size = pro.getTypeSize();
230 if (size <= 0) return;
231 if (!hasValue(name)) {
232 add(name, pro);
233 void* v = malloc(size);
234 memcpy(v, value, size);
235 m_value_m.insert(FieldValueList::value_type(name, v));
236 } else {
237 memcpy(m_value_m[name], value, size);
238 }
239}

◆ copy()

void copy ( const DBObject obj)
private

Definition at line 44 of file DBObject.cc.

45{
46 reset();
47 setDate(obj.getDate());
48 setIndex(obj.getIndex());
49 setId(obj.getId());
50 setPath(obj.getPath());
51 setName(obj.getName());
52 for (DBField::NameList::const_iterator it = obj.getFieldNames().begin();
53 it != obj.getFieldNames().end(); ++it) {
54 const std::string& name(*it);
55 DBField::Type type = obj.getProperty(name).getType();
56 switch (type) {
57 case DBField::BOOL: addBool(name, obj.getBool(name)); break;
58 case DBField::CHAR: addChar(name, obj.getChar(name)); break;
59 case DBField::SHORT: addShort(name, obj.getShort(name)); break;
60 case DBField::INT: addInt(name, obj.getInt(name)); break;
61 case DBField::LONG: addLong(name, obj.getLong(name)); break;
62 case DBField::FLOAT: addFloat(name, obj.getFloat(name)); break;
63 case DBField::DOUBLE: addDouble(name, obj.getDouble(name)); break;
64 case DBField::TEXT: addText(name, obj.getText(name)); break;
65 case DBField::OBJECT: addObjects(name, obj.getObjects(name)); break;
66 default: break;
67 }
68 }
69}

◆ getD()

T getD ( const std::string &  name,
int  index = 0 
) const
inlineprivateinherited

Definition at line 103 of file AbstractDBObject.h.

104 {
105 const void* value = getValue(name);
106 if (value == NULL/* || index >= getProperty(name).getLength()*/) {
107 throw (std::out_of_range(name + " not found"));
108 }
109 DBField::Type type(getProperty(name).getType());
110 if (type == DBField::INT) return (T)(((int*)value)[index]);
111 if (type == DBField::FLOAT) return (T)(((float*)value)[index]);
112 if (type == DBField::DOUBLE) return (T)(((double*)value)[index]);
113 if (type == DBField::SHORT) return (T)(((short*)value)[index]);
114 if (type == DBField::CHAR) return (T)(((char*)value)[index]);
115 if (type == DBField::LONG) return (T)(((long*)value)[index]);
116 return ((T*)value)[index];
117 }

◆ getDate()

int getDate ( ) const
inline

Definition at line 71 of file DBObject.h.

71{ return m_date; }

◆ getFieldNames() [1/2]

DBField::NameList & getFieldNames ( )
inlineinherited

Definition at line 46 of file AbstractDBObject.h.

46{ return m_name_v; }

◆ getFieldNames() [2/2]

const DBField::NameList & getFieldNames ( ) const
inlineinherited

Definition at line 47 of file AbstractDBObject.h.

47{ return m_name_v; }

◆ getId()

int getId ( ) const
inlineinherited

Definition at line 40 of file AbstractDBObject.h.

40{ return m_id; }

◆ getIndex()

int getIndex ( ) const
inlineinherited

Definition at line 44 of file AbstractDBObject.h.

44{ return m_index; }

◆ getName()

const std::string & getName ( ) const
inlineinherited

Definition at line 42 of file AbstractDBObject.h.

42{ return m_name; }

◆ getNameList()

StringList getNameList ( bool  isfull) const

Definition at line 391 of file DBObject.cc.

392{
393 const std::string& name_in = "";
394 NameValueList map;
395 search(map, name_in, isfull);
396 StringList str;
397 for (NameValueList::iterator it = map.begin();
398 it != map.end(); ++it) {
399 str.push_back(it->name);
400 }
401 return str;
402}

◆ getNObjects()

int getNObjects ( const std::string &  name) const

Definition at line 76 of file DBObject.cc.

77{
78 FieldObjectList::const_iterator it = m_obj_v_m.find(name);
79 if (it != m_obj_v_m.end()) return it->second.size();
80 return 0;
81}

◆ getObject() [1/2]

DBObject & getObject ( const std::string &  name,
int  i = 0 
)

Definition at line 101 of file DBObject.cc.

102{
103 FieldObjectList::iterator it = m_obj_v_m.find(name);
104 if (it != m_obj_v_m.end()) return it->second[i];
105 else throw (std::out_of_range(StringUtil::form("%s not found in %s (%s:%d)",
106 name.c_str(), getName().c_str(),
107 __FILE__, __LINE__)));
108}

◆ getObject() [2/2]

const DBObject & getObject ( const std::string &  name,
int  i = 0 
) const

Definition at line 110 of file DBObject.cc.

111{
112 FieldObjectList::const_iterator it = m_obj_v_m.find(name);
113 if (it != m_obj_v_m.end()) return it->second[i];
114 else throw (std::out_of_range(StringUtil::form("%s not found in %s (%s:%d)",
115 name.c_str(), getName().c_str(),
116 __FILE__, __LINE__)));
117}

◆ getObjects() [1/2]

DBObjectList & getObjects ( const std::string &  name)

Definition at line 83 of file DBObject.cc.

84{
85 FieldObjectList::iterator it = m_obj_v_m.find(name);
86 if (it != m_obj_v_m.end()) return it->second;
87 else throw (std::out_of_range(StringUtil::form("%s not found in %s (%s:%d)",
88 name.c_str(), getName().c_str(),
89 __FILE__, __LINE__)));
90}

◆ getObjects() [2/2]

const DBObjectList & getObjects ( const std::string &  name) const

Definition at line 92 of file DBObject.cc.

93{
94 FieldObjectList::const_iterator it = m_obj_v_m.find(name);
95 if (it != m_obj_v_m.end()) return it->second;
96 else throw (std::out_of_range(StringUtil::form("%s not found in %s (%s:%d)",
97 name.c_str(), getName().c_str(),
98 __FILE__, __LINE__)));
99}

◆ getPath()

const std::string & getPath ( ) const
inlineinherited

Definition at line 38 of file AbstractDBObject.h.

38{ return m_path; }

◆ getProperty()

DBField::Property getProperty ( const std::string &  name) const
inherited

Definition at line 54 of file AbstractDBObject.cc.

55{
56 DBField::PropertyList::const_iterator it = m_pro_m.find(name);
57 if (it != m_pro_m.end()) return it->second;
58 return DBField::Property();
59}

◆ getText()

const std::string & getText ( const std::string &  name) const
overridevirtual

Implements AbstractDBObject.

Definition at line 217 of file DBObject.cc.

218{
219 if (!hasText(name)) return m_empty;
220 FieldTextList::const_iterator it = m_text_m.find(name);
221 if (it != m_text_m.end()) return it->second;
222 else throw (std::out_of_range(StringUtil::form("text %s not found", name.c_str())));
223}

◆ getValue()

const void * getValue ( const std::string &  name) const
overridevirtual

Implements AbstractDBObject.

Definition at line 209 of file DBObject.cc.

210{
211 if (!hasValue(name)) return NULL;
212 FieldValueList::const_iterator it = m_value_m.find(name);
213 if (it != m_value_m.end()) return it->second;
214 else throw (std::out_of_range(StringUtil::form("value %s not found", name.c_str())));
215}

◆ getValueText()

const std::string getValueText ( const std::string &  name) const
inherited

Definition at line 96 of file AbstractDBObject.cc.

98{
99 const static int double_precision = std::numeric_limits<double>::digits10 + 2;
100
101 if (hasField(name)) {
102 switch (getProperty(name).getType()) {
103 case DBField::BOOL: return getBool(name) ? "true" : "false";
104 case DBField::CHAR: return StringUtil::form("%d", (int)getChar(name));
105 case DBField::SHORT: return StringUtil::form("%d", (int)getShort(name));
106 case DBField::INT: return StringUtil::form("%d", (int)getInt(name));
107 case DBField::LONG: return StringUtil::form("%ld", getLong(name));
108 case DBField::FLOAT: return StringUtil::form("%f", getFloat(name));
109 case DBField::DOUBLE: return StringUtil::form("%.*e", double_precision, getDouble(name));
110 case DBField::TEXT: return getText(name);
111 default: break;
112 }
113 }
114 throw (std::out_of_range(name + " not found"));
115}

◆ hasField()

bool hasField ( const std::string &  name) const
inherited

Definition at line 61 of file AbstractDBObject.cc.

62{
63 DBField::PropertyList::const_iterator it = m_pro_m.find(name);
64 return (it != m_pro_m.end());
65}

◆ hasObject()

bool hasObject ( const std::string &  name) const
inherited

Definition at line 81 of file AbstractDBObject.cc.

82{
83 DBField::PropertyList::const_iterator it = m_pro_m.find(name);
84 return hasField(name) &&
85 it->second.getType() == DBField::OBJECT;
86}

◆ hasText()

bool hasText ( const std::string &  name) const
inherited

Definition at line 75 of file AbstractDBObject.cc.

76{
77 DBField::PropertyList::const_iterator it = m_pro_m.find(name);
78 return hasField(name) && it->second.getType() == DBField::TEXT;
79}

◆ hasValue()

bool hasValue ( const std::string &  name) const
inherited

Definition at line 67 of file AbstractDBObject.cc.

68{
69 DBField::PropertyList::const_iterator it = m_pro_m.find(name);
70 return hasField(name) &&
71 it->second.getType() != DBField::TEXT &&
72 it->second.getType() != DBField::OBJECT;
73}

◆ operator()() [1/2]

DBObject & operator() ( const std::string &  name,
int  index = 0 
)
inline

Definition at line 55 of file DBObject.h.

56 {
57 return getObject(name, index);
58 }

◆ operator()() [2/2]

const DBObject & operator() ( const std::string &  name,
int  index = 0 
) const
inline

Definition at line 59 of file DBObject.h.

60 {
61 return getObject(name, index);
62 }

◆ operator=()

const DBObject & operator= ( const DBObject obj)

Definition at line 38 of file DBObject.cc.

39{
40 copy(obj);
41 return *this;
42}

◆ print()

void print ( bool  isfull = true) const

Definition at line 284 of file DBObject.cc.

285{
286 const std::string& name_in = "";
287 NameValueList map;
288 search(map, name_in, isfull);
289 size_t length = 0;
290 for (NameValueList::iterator it = map.begin();
291 it != map.end(); ++it) {
292 if (it->name.size() > length) length = it->name.size();
293 }
294 printf("#\n");
295 printf("# DB object (confname = %s) stored at %s\n", getName().c_str(), Date(getDate()).toString());
296 printf("#\n");
297 printf("\n");
298 StringList s = StringUtil::split(getName(), '@');
299 if (s.size() > 1) {
300 printf("%*s : %s\n", int(-length), "nodename", s[0].c_str());
301 printf("%*s : %s\n", int(-length), "config", s[1].c_str());
302 } else {
303 printf("%*s : %s\n", int(-length), "config", getName().c_str());
304 }
305 printf("\n");
306 for (NameValueList::iterator it = map.begin();
307 it != map.end(); ++it) {
308 printf("%*s : %s\n", int(-length), it->name.c_str(), it->value.c_str());
309 }
310 printf("\n");
311 printf("#\n");
312 printf("#\n");
313 printf("#\n");
314}

◆ printHTML()

void printHTML ( bool  isfull = true) const

Definition at line 354 of file DBObject.cc.

355{
356 const std::string& name_in = "";
357 NameValueList map;
358 search(map, name_in, isfull);
359 printf("<table>\n");
360 printf("<caption><strong>%s</strong></caption>\n", getName().c_str());
361 printf("<thead><tr><th>Name</th><th>Value</th>\n</tr></thead>\n");
362 printf("<tbody>\n");
363 StringList s = StringUtil::split(getName(), '@');
364 if (s.size() > 1) {
365 printf("<tr><td>nodename</td><td>%s</td>\n", s[0].c_str());
366 printf("<tr><td>config</td><td>%s</td>\n", s[1].c_str());
367 } else {
368 printf("<tr><td>config</td><td>%s</td>\n", getName().c_str());
369 }
370 std::string rcconfig, dbtable, nodename;
371 for (NameValueList::iterator it = map.begin();
372 it != map.end(); ++it) {
373 if (it->name.find("name") != std::string::npos) {
374 nodename = it->value;
375 printf("<tr><td>%s</td><td>%s</td>\n", it->name.c_str(), it->value.c_str());
376 } else if (it->name.find("rcconfig") != std::string::npos) {
377 rcconfig = it->value;
378 } else if (it->name.find("dbtable") != std::string::npos) {
379 dbtable = it->value;
380 printf("<tr><td>%s</td><td><a href=\"./daqconfig.php?db=%s&config=%s@%s\" >%s/%s</a></td>\n",
381 it->name.c_str(), dbtable.c_str(), nodename.c_str(), rcconfig.c_str(),
382 dbtable.c_str(), rcconfig.c_str());
383 } else {
384 printf("<tr><td>%s</td><td>%s</td>\n", it->name.c_str(), it->value.c_str());
385 }
386 }
387 printf("</tbody>\n");
388 printf("</table>\n");
389}

◆ printSQL()

const std::string printSQL ( const std::string &  table,
int  id 
) const

Definition at line 475 of file DBObject.cc.

476{
477 std::stringstream ss;
478
479 const std::string& name_in = "";
480 NameValueList map;
481 bool isfull = false;
482 search(map, name_in, isfull);
483 for (NameValueList::iterator it = map.begin();
484 it != map.end(); ++it) {
485 NameValue& nv(*it);
486 std::string value = nv.value;
487 std::string::size_type pos = value.find_first_of("(");
488 DBField::Type type = DBField::TEXT;
489 if (pos != std::string::npos) {
490 std::string type_s = value.substr(0, pos);
491 if (type_s == "bool") type = DBField::BOOL;
492 else if (type_s == "char") type = DBField::CHAR;
493 else if (type_s == "short") type = DBField::SHORT;
494 else if (type_s == "int") type = DBField::INT;
495 else if (type_s == "float") type = DBField::FLOAT;
496 else if (type_s == "double") type = DBField::DOUBLE;
497 else if (type_s == "object") type = DBField::OBJECT;
498 if (type != DBField::TEXT) {
499 value = StringUtil::replace(value.substr(pos + 1), ")", "");
500 }
501 }
502
503 switch (nv.type) {
504 case DBField::BOOL:
505 ss << "insert into " << table << " (pid,name,value_b) values "
506 << "(" << id << ",'" << nv.name << "'," << value << ");" << std::endl;
507 break;
508 case DBField::INT:
509 ss << "insert into " << table << " (pid,name,value_i) values "
510 << "(" << id << ",'" << nv.name << "'," << value << ");" << std::endl;
511 break;
512 case DBField::FLOAT:
513 case DBField::DOUBLE:
514 ss << "insert into " << table << " (pid,name,value_f) values "
515 << "(" << id << ",'" << nv.name << "'," << value << ");" << std::endl;
516 break;
517 case DBField::TEXT:
518 ss << "insert into " << table << " (pid,name,value_t) values "
519 << "(" << id << ",'" << nv.name << "','" << value << "');" << std::endl;
520 break;
521 default : break;
522 }
523 }
524 return ss.str();
525}

◆ readObject()

void readObject ( Reader reader)
overridevirtual

Implements Serializable.

Definition at line 139 of file DBObject.cc.

140{
141 reset();
142 setPath(reader.readString());
143 setName(reader.readString());
144 setDate(reader.readInt());
145 int npar = reader.readInt();
146 for (int i = 0; i < npar; i++) {
147 std::string name = reader.readString();
148 DBField::Type type = (DBField::Type)reader.readInt();
149 switch (type) {
150 case DBField::BOOL: addBool(name, reader.readBool()); break;
151 case DBField::CHAR: addChar(name, reader.readChar()); break;
152 case DBField::SHORT: addShort(name, reader.readShort()); break;
153 case DBField::INT: addInt(name, reader.readInt()); break;
154 case DBField::LONG: addLong(name, reader.readLong()); break;
155 case DBField::FLOAT: addFloat(name, reader.readFloat()); break;
156 case DBField::DOUBLE: addDouble(name, reader.readDouble()); break;
157 case DBField::TEXT: addText(name, reader.readString()); break;
158 case DBField::OBJECT: {
159 DBObjectList obj_v;
160 int nobj = reader.readInt();
161 for (int n = 0; n < nobj; n++) {
162 DBObject obj;
163 obj.readObject(reader);
164 obj.setIndex(n);
165 obj_v.push_back(obj);
166 }
167 addObjects(name, obj_v);
168 }; break;
169 default: break;
170 }
171 }
172}

◆ reset()

void reset ( )
overrideprotectedvirtual

Reimplemented from AbstractDBObject.

Definition at line 119 of file DBObject.cc.

120{
121 const DBField::NameList& name_v(getFieldNames());
122 for (size_t ii = 0; ii < name_v.size(); ii++) {
123 const std::string& name(name_v[ii]);
124 if (hasObject(name)) {
125 size_t nobj = getNObjects(name);
126 for (size_t i = 0; i < nobj; i++) getObject(name, i).reset();
127 }
128 }
129 for (FieldValueList::iterator it = m_value_m.begin();
130 it != m_value_m.end(); ++it) {
131 free(it->second);
132 }
133 m_value_m = FieldValueList();
134 m_text_m = FieldTextList();
135 m_obj_v_m = FieldObjectList();
136 AbstractDBObject::reset();
137}

◆ search()

void search ( NameValueList &  map,
const std::string &  name = "",
bool  isfull = true 
) const

Definition at line 404 of file DBObject.cc.

406{
407 const DBField::NameList& name_v(getFieldNames());
408 for (DBField::NameList::const_iterator it = name_v.begin();
409 it != name_v.end(); ++it) {
410 const std::string& name(*it);
411 const DBField::Property& pro(getProperty(name));
412 std::string name_out = name_in;
413 if (name_in.size() > 0) name_out += ".";
414 name_out += name;
415 std::string ptype;
416 switch (pro.getType()) {
417 case DBField::BOOL: ptype = "bool"; break;
418 case DBField::INT: ptype = "int"; break;
419 case DBField::FLOAT: ptype = "float"; break;
420 case DBField::DOUBLE: ptype = "double"; break;
421 default : break;
422 }
423 if (pro.getType() == DBField::OBJECT) {
424 int length = getNObjects(name);
425 if (!isfull && getObject(name).getPath().size() > 0) {
426 const DBObjectList& objs(getObjects(name));
427 if (length == 1 || objs[1].getPath().size() == 0 || objs[0].getPath() == objs[1].getPath()) {
428 std::string value = objs[0].getPath();
429 value = "object(" + value + ")";
430 NameValue nv;
431 nv.name = name_out.c_str();
432 nv.value = value;
433 nv.type = pro.getType();
434 map.push_back(nv);
435 } else {
436 for (int i = 0; i < length; i++) {
437 std::string value = objs[i].getPath();
438 value = "object(" + value + ")";
439 NameValue nv;
440 nv.name = StringUtil::form("%s[%d].%s", name.c_str(), i, name_out.c_str());
441 nv.value = value;
442 nv.type = pro.getType();
443 map.push_back(nv);
444 }
445 }
446 } else {
447 size_t lengthCur = getNObjects(name);
448 if (lengthCur > 1) {
449 const DBObjectList& objs(getObjects(name));
450 for (size_t i = 0; i < lengthCur; i++) {
451 objs[i].search(map, StringUtil::form("%s[%d]", name_out.c_str(), i), isfull);
452 }
453 } else {
454 const DBObject& obj(getObject(name));
455 obj.search(map, name_out, isfull);
456 }
457 }
458 } else {
459 std::string value = getValueText(name);
460 if (ptype.size() > 0) value = ptype + "(" + value + ")";
461 NameValue nv;
462 nv.name = name_out;
463 nv.value = value;
464 nv.type = pro.getType();
465 if (pro.getType() != DBField::TEXT) {
466 nv.buf = (void*)getValue(name);
467 } else {
468 nv.buf = (void*)&getText(name);
469 }
470 map.push_back(nv);
471 }
472 }
473}

◆ setDate() [1/2]

void setDate ( const Date date)
inline

Definition at line 72 of file DBObject.h.

72{ m_date = date.get(); }

◆ setDate() [2/2]

void setDate ( int  date)
inline

Definition at line 73 of file DBObject.h.

73{ m_date = date; }

◆ setId()

void setId ( int  id)
inlineinherited

Definition at line 41 of file AbstractDBObject.h.

41{ m_id = id; }

◆ setIndex()

void setIndex ( int  index)
inlineinherited

Definition at line 45 of file AbstractDBObject.h.

45{ m_index = index; }

◆ setName()

void setName ( const std::string &  name)
inlineinherited

Definition at line 43 of file AbstractDBObject.h.

43{ m_name = name; }

◆ setPath()

void setPath ( const std::string &  path)
inlineinherited

Definition at line 39 of file AbstractDBObject.h.

39{ m_path = path; }

◆ setText()

void setText ( const std::string &  name,
const std::string &  value 
)
inlineinherited

Definition at line 55 of file AbstractDBObject.h.

55{ addText(name, value); }

◆ setValue()

void setValue ( const std::string &  name,
const void *  value,
int  length 
)
overridevirtual

Implements AbstractDBObject.

Definition at line 241 of file DBObject.cc.

243{
244 const DBField::Property& pro(getProperty(name));
245 int size = pro.getTypeSize();
246 if (hasField(name) && size > 0) {
247 memcpy(m_value_m[name], value, size);
248 }
249}

◆ setValueText()

void setValueText ( const std::string &  name,
const std::string &  value 
)
virtualinherited

Definition at line 117 of file AbstractDBObject.cc.

119{
120 if (hasField(name)) {
121 switch (getProperty(name).getType()) {
122 case DBField::BOOL: setBool(name, value == "true" || value == "t"); break;
123 case DBField::CHAR: {
124 if (StringUtil::find(value, "0x"))
125 setChar(name, (char)strtol(value.c_str(), NULL, 0));
126 else
127 setChar(name, (char)atoi(value.c_str()));
128 } break;
129 case DBField::SHORT: {
130 if (StringUtil::find(value, "0x"))
131 setShort(name, (short)strtol(value.c_str(), NULL, 0));
132 else
133 setShort(name, (short)atoi(value.c_str()));
134 } break;
135 case DBField::INT: {
136 if (StringUtil::find(value, "0x"))
137 setInt(name, (int)strtol(value.c_str(), NULL, 0));
138 else
139 setInt(name, (int)atoi(value.c_str()));
140 } break;
141 case DBField::LONG: setLong(name, (long long)atoi(value.c_str())); break;
142 case DBField::FLOAT: setFloat(name, atof(value.c_str())); break;
143 case DBField::DOUBLE: setDouble(name, atof(value.c_str())); break;
144 case DBField::TEXT: setText(name, value); break;
145 default: break;
146 }
147 return;
148 }
149 throw (std::out_of_range(name + " not found"));
150}

◆ sprint()

const std::string sprint ( bool  isfull) const

Definition at line 316 of file DBObject.cc.

317{
318 std::stringstream ss;
319 const std::string& name_in = "";
320 NameValueList map;
321 search(map, name_in, isfull);
322 size_t length = 0;
323 for (NameValueList::iterator it = map.begin();
324 it != map.end(); ++it) {
325 if (it->name.size() > length) length = it->name.size();
326 }
327 ss << "#" << std::endl;
328 ss << "# DB object (confname = " << getName() << ")" << std::endl;
329 ss << "#" << std::endl;
330 ss << "" << std::endl;
331 StringList s = StringUtil::split(getName(), '@');
332 if (s.size() > 1) {
333 ss << StringUtil::form("%*s : %s\n", -length, "nodename", s[0].c_str())
334 << std:: endl;
335 ss << StringUtil::form("%*s : %s\n", -length, "config", s[1].c_str())
336 << std:: endl;
337 } else {
338 ss << StringUtil::form("%*s : %s\n", -length, "config", getName().c_str())
339 << std:: endl;
340 }
341 ss << "" << std::endl;
342 for (NameValueList::iterator it = map.begin();
343 it != map.end(); ++it) {
344 ss << StringUtil::form("%*s : %s\n", -length, it->name.c_str(), it->value.c_str())
345 << std::endl;
346 }
347 ss << "" << std::endl;
348 ss << "#" << std::endl;
349 ss << "#" << std::endl;
350 ss << "#" << std::endl;
351 return ss.str();
352}

◆ writeObject()

void writeObject ( Writer writer) const
overridevirtual

Implements Serializable.

Definition at line 174 of file DBObject.cc.

175{
176 writer.writeString(getPath());
177 writer.writeString(getName());
178 writer.writeInt(getDate());
179 const DBField::NameList& name_v(getFieldNames());
180 writer.writeInt(name_v.size());
181 for (DBField::NameList::const_iterator iname = name_v.begin();
182 iname != name_v.end(); ++iname) {
183 const std::string name = *iname;
184 DBField::Type type = getProperty(name).getType();
185 writer.writeString(name);
186 writer.writeInt(type);
187 switch (type) {
188 case DBField::BOOL: writer.writeBool(getBool(name)); break;
189 case DBField::CHAR: writer.writeChar(getChar(name)); break;
190 case DBField::SHORT: writer.writeShort(getShort(name)); break;
191 case DBField::INT: writer.writeInt(getInt(name)); break;
192 case DBField::LONG: writer.writeLong(getLong(name)); break;
193 case DBField::FLOAT: writer.writeFloat(getFloat(name)); break;
194 case DBField::DOUBLE: writer.writeDouble(getDouble(name)); break;
195 case DBField::TEXT: writer.writeString(getText(name)); break;
196 case DBField::OBJECT: {
197 const DBObjectList& obj_v(getObjects(name));
198 writer.writeInt(obj_v.size());
199 for (DBObjectList::const_iterator iobj = obj_v.begin();
200 iobj != obj_v.end(); ++iobj) {
201 iobj->writeObject(writer);
202 }
203 }; break;
204 default: break;
205 }
206 }
207}

Member Data Documentation

◆ m_date

int m_date
private

Definition at line 92 of file DBObject.h.

◆ m_empty

std::string m_empty
private

Definition at line 91 of file DBObject.h.

◆ m_id

int m_id
privateinherited

Definition at line 96 of file AbstractDBObject.h.

◆ m_index

int m_index
privateinherited

Definition at line 94 of file AbstractDBObject.h.

◆ m_name

std::string m_name
privateinherited

Definition at line 97 of file AbstractDBObject.h.

◆ m_name_v

DBField::NameList m_name_v
privateinherited

Definition at line 98 of file AbstractDBObject.h.

◆ m_obj_v_m

FieldObjectList m_obj_v_m
private

Definition at line 90 of file DBObject.h.

◆ m_path

std::string m_path
privateinherited

Definition at line 95 of file AbstractDBObject.h.

◆ m_pro_m

DBField::PropertyList m_pro_m
privateinherited

Definition at line 99 of file AbstractDBObject.h.

◆ m_text_m

FieldTextList m_text_m
private

Definition at line 89 of file DBObject.h.

◆ m_value_m

FieldValueList m_value_m
private

Definition at line 88 of file DBObject.h.


The documentation for this class was generated from the following files: