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