/ src / core / dump.cc
dump.cc
  1  #include "dump.h"
  2  #include "version.h"
  3  #include "osutils.h"
  4  
  5  #include <time.h>
  6  #include <stdlib.h>
  7  #include <unistd.h>
  8  #include <sys/types.h>
  9  
 10  #ifdef SQLITE
 11  
 12  using namespace std;
 13  using namespace sqlite;
 14  
 15  static bool createtables(database & db)
 16  {
 17    try {
 18      db.execute("CREATE TABLE IF NOT EXISTS META(key TEXT PRIMARY KEY COLLATE NOCASE, value BLOB)");
 19      statement stm(db, "INSERT OR IGNORE INTO META (key,value) VALUES(?,?)");
 20  
 21      stm.bind(1, "schema");
 22      stm.bind(2, 1.0);
 23      stm.execute();
 24  
 25      stm.reset();
 26      stm.bind(1, "application");
 27      stm.bind(2, "org.ezix.lshw");
 28      stm.execute();
 29  
 30      stm.reset();
 31      stm.bind(1, "creator");
 32      stm.bind(2, "lshw/" + string(getpackageversion()));
 33      stm.execute();
 34  
 35      stm.reset();
 36      stm.bind(1, "OS");
 37      stm.bind(2, operating_system());
 38      stm.execute();
 39  
 40      stm.reset();
 41      stm.bind(1, "platform");
 42      stm.bind(2, platform());
 43      stm.execute();
 44  
 45      db.execute("CREATE TABLE IF NOT EXISTS nodes(path TEXT PRIMARY KEY, id TEXT NOT NULL COLLATE NOCASE, parent TEXT COLLATE NOCASE, class TEXT NOT NULL COLLATE NOCASE, enabled BOOL, claimed BOOL, description TEXT, vendor TEXT, product TEXT, version TEXT, serial TEXT, businfo TEXT, physid TEXT, slot TEXT, size INTEGER, capacity INTEGER, clock INTEGER, width INTEGER, dev TEXT)");
 46      db.execute("CREATE TABLE IF NOT EXISTS logicalnames(logicalname TEXT NOT NULL, node TEXT NOT NULL COLLATE NOCASE)");
 47      db.execute("CREATE TABLE IF NOT EXISTS capabilities(capability TEXT NOT NULL COLLATE NOCASE, node TEXT NOT NULL COLLATE NOCASE, description TEXT, UNIQUE (capability,node))");
 48      db.execute("CREATE TABLE IF NOT EXISTS configuration(config TEXT NOT NULL COLLATE NOCASE, node TEXT NOT NULL COLLATE NOCASE, value TEXT, UNIQUE (config,node))");
 49      db.execute("CREATE TABLE IF NOT EXISTS hints(hint TEXT NOT NULL COLLATE NOCASE, node TEXT NOT NULL COLLATE NOCASE, value TEXT, UNIQUE (hint,node))");
 50      db.execute("CREATE TABLE IF NOT EXISTS resources(node TEXT NOT NULL COLLATE NOCASE, type TEXT NOT NULL COLLATE NOCASE, resource TEXT NOT NULL, UNIQUE(node,type,resource))");
 51      db.execute("CREATE VIEW IF NOT EXISTS unclaimed AS SELECT * FROM nodes WHERE NOT claimed");
 52      db.execute("CREATE VIEW IF NOT EXISTS disabled AS SELECT * FROM nodes WHERE NOT enabled");
 53    }
 54    catch(exception & e)
 55    {
 56      return false;
 57    }
 58  
 59    return true;
 60  }
 61  
 62  bool dump(hwNode & n, database & db, const string & path, bool recurse)
 63  {
 64    if(!createtables(db))
 65      return false;
 66  
 67    try {
 68      unsigned i = 0;
 69      statement stm(db, "INSERT OR REPLACE INTO nodes (id,class,product,vendor,description,size,capacity,width,version,serial,enabled,claimed,slot,clock,businfo,physid,path,parent,dev) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
 70      string mypath = path+(path=="/"?"":"/")+n.getPhysId();
 71  
 72      stm.bind(1, n.getId());
 73      stm.bind(2, n.getClassName());
 74      if(n.getProduct() != "") stm.bind(3, n.getProduct());
 75      if(n.getVendor() != "") stm.bind(4, n.getVendor());
 76      if(n.getDescription() != "") stm.bind(5, n.getDescription());
 77      if(n.getSize()) stm.bind(6, (long long int)n.getSize());
 78      if(n.getCapacity()) stm.bind(7, (long long int)n.getCapacity());
 79      if(n.getWidth()) stm.bind(8, (long long int)n.getWidth());
 80      if(n.getVersion() != "") stm.bind(9, n.getVersion());
 81      if(n.getSerial() != "") stm.bind(10, n.getSerial());
 82      stm.bind(11, (long long int)n.enabled());
 83      stm.bind(12, (long long int)n.claimed());
 84      if(n.getSlot() != "") stm.bind(13, n.getSlot());
 85      if(n.getClock()) stm.bind(14, (long long int)n.getClock());
 86      if(n.getBusInfo() != "") stm.bind(15, n.getBusInfo());
 87      if(n.getPhysId() != "") stm.bind(16, n.getPhysId());
 88      stm.bind(17, mypath);
 89      if(path != "") stm.bind(18, path);
 90      if(n.getDev() != "") stm.bind(19, n.getDev());
 91      stm.execute();
 92  
 93      stm.prepare("INSERT OR REPLACE INTO logicalnames (node,logicalname) VALUES(?,?)");
 94      vector<string> keys = n.getLogicalNames();
 95      for(i=0; i<keys.size(); i++)
 96      {
 97        stm.reset();
 98        stm.bind(1, mypath);
 99        stm.bind(2, keys[i]);
100        stm.execute();
101      }
102  
103      stm.prepare("INSERT OR REPLACE INTO capabilities (capability,node,description) VALUES(?,?,?)");
104      keys = n.getCapabilitiesList();
105      for(i=0; i<keys.size(); i++)
106      {
107        stm.reset();
108        stm.bind(1, keys[i]);
109        stm.bind(2, mypath);
110        stm.bind(3, n.getCapabilityDescription(keys[i]));
111        stm.execute();
112      }
113      
114      stm.prepare("INSERT OR REPLACE INTO configuration (config,node,value) VALUES(?,?,?)");
115      keys = n.getConfigKeys();
116      for(i=0; i<keys.size(); i++)
117      {
118        stm.reset();
119        stm.bind(1, keys[i]);
120        stm.bind(2, mypath);
121        stm.bind(3, n.getConfig(keys[i]));
122        stm.execute();
123      }
124  
125      stm.prepare("INSERT OR IGNORE INTO resources (type,node,resource) VALUES(?,?,?)");
126      keys = n.getResources(":");
127      for(i=0; i<keys.size(); i++)
128      {
129        string type = keys[i].substr(0, keys[i].find_first_of(':'));
130        string resource = keys[i].substr(keys[i].find_first_of(':')+1);
131        stm.reset();
132        stm.bind(1, type);
133        stm.bind(2, mypath);
134        stm.bind(3, resource);
135        stm.execute();
136      }
137  
138      stm.prepare("INSERT OR REPLACE INTO hints (hint,node,value) VALUES(?,?,?)");
139      keys = n.getHints();
140      for(i=0; i<keys.size(); i++)
141      {
142        stm.reset();
143        stm.bind(1, keys[i]);
144        stm.bind(2, mypath);
145        stm.bind(3, n.getHint(keys[i]).asString());
146        stm.execute();
147      }
148  
149      stm.reset();
150      stm.bind(1,"run.root");
151      stm.bind(2,"");
152      stm.bind(3,(long long int)(geteuid() == 0));
153      stm.execute();
154      stm.reset();
155      stm.bind(1,"run.time");
156      stm.bind(2,"");
157      stm.bind(3,(long long int)time(NULL));
158      stm.execute();
159      stm.reset();
160      stm.bind(1,"run.language");
161      stm.bind(2,"");
162      stm.bind(3,getenv("LANG"));
163      stm.execute();
164  
165      if(recurse)
166        for(i=0; i<n.countChildren(); i++)
167          dump(*(n.getChild(i)), db, mypath, recurse);
168    }
169    catch(exception & e)
170    {
171      return false;
172    }
173  
174    return true;
175  }
176  
177  #endif