virtual void requestBlobsForAttrib(const String& attr, Vector<String>& out ) { String sql = "SELECT " + attr + " FROM " + _srcName; IDBResult res = _db.executeSQL(sql.c_str()); for ( ;!res.isEnd();res.next()) { out.push_back( /*common::CFilePath::join( RHODESAPP().getBlobsDirPath(), */res.getStringByIdx(0)/*)*/ ); } }
unsigned long rhom_make_object(IDBResult& res1, int nSrcID, bool isSchemaSrc) { unsigned long item = 0; if ( res1.isEnd() ) return item; item = rho_connectclient_hash_create(); rho_connectclient_hash_put(item, "source_id", convertToStringA(nSrcID).c_str() ); if (!isSchemaSrc) { for ( ; !res1.isEnd(); res1.next() ) { if ( !res1.isNullByIdx(1) ) rho_connectclient_hash_put(item, res1.getStringByIdx(0).c_str(), res1.getStringByIdx(1).c_str() ); } }else { for (int i = 0; i < res1.getColCount(); i++ ) { if ( !res1.isNullByIdx(i)) rho_connectclient_hash_put(item, res1.getColName(i).c_str(), res1.getStringByIdx(i).c_str() ); } } return item; }
int CSyncThread::getLastPollInterval() { uint64 nowTime = CLocalTime().toULong(); uint64 latestTimeUpdated = 0; Vector<String> arPartNames = db::CDBAdapter::getDBAllPartitionNames(); for( int i = 0; i < (int)arPartNames.size(); i++ ) { db::CDBAdapter& dbPart = db::CDBAdapter::getDB(arPartNames.elementAt(i).c_str()); IDBResult res = dbPart.executeSQL("SELECT last_updated from sources"); for ( ; !res.isEnd(); res.next() ) { uint64 timeUpdated = res.getUInt64ByIdx(0); if ( latestTimeUpdated < timeUpdated ) latestTimeUpdated = timeUpdated; } } return latestTimeUpdated > 0 ? (int)(nowTime-latestTimeUpdated) : 0; }
Vector<String> CDBRequestHelper::requestBlobs( ) { Vector<String> list; IDBResult res = _db.executeSQL("SELECT source_id, name, schema FROM sources"); for ( ;!res.isEnd();res.next() ) { int srcId = res.getIntByIdx(0); String srcName = res.getStringByIdx(1); boolean isSchemaSource = res.getStringByIdx(2).length() > 0; common::CAutoPtr<BlobsRequest> request; if (isSchemaSource) { request = new FixedSchemaBlobsRequest(_db,srcId,srcName); } else { request = new PropertyBagBlobsRequest(_db,srcId); } request->getBlobs(list); } return list; }
/*static*/void CDBAttrManager::loadAttrs(CDBAdapter& db, HashtablePtr< int, Hashtable<String,int>* >& mapAttrs, String strDBAttr) { mapAttrs.clear(); String strSql = "SELECT source_id,"; strSql += strDBAttr + " from sources"; IDBResult res = db.executeSQL(strSql.c_str()); for ( ; !res.isEnd(); res.next() ) { int nSrcID = res.getIntByIdx(0); String strAttribs = res.getStringByIdx(1); if ( strAttribs.length() == 0 ) continue; CTokenizer oTokenizer( strAttribs, "," ); Hashtable<String,int>* pmapAttr = new Hashtable<String,int>(); String strAttr = ""; while (oTokenizer.hasMoreTokens()) { String tok = oTokenizer.nextToken(); if (tok.length() == 0) continue; if ( strAttr.length() > 0 ) { int nCounter = 0; convertFromStringA(tok.c_str(),nCounter); pmapAttr->put(strAttr, nCounter); strAttr = ""; }else strAttr = tok; } mapAttrs.put(nSrcID,pmapAttr); } }
void CDBAttrManager::loadBlobAttrs(CDBAdapter& db) { loadAttrs(db, m_mapBlobAttrs, "blob_attribs"); String strTriggerPrefix = "rhoSchemaTrigger_"; IDBResult res = db.executeSQL( "SELECT name FROM sqlite_master WHERE type='trigger'" ); Hashtable<String,int> mapTriggers; for ( ; !res.isEnd(); res.next() ) { String strName = res.getStringByIdx(0); if ( !String_startsWith(strName, strTriggerPrefix) ) continue; mapTriggers[strName.substr(strTriggerPrefix.length())] = 0; } for ( HashtablePtr< int, Hashtable<String,int>* >::iterator it = m_mapBlobAttrs.begin(); it != m_mapBlobAttrs.end(); ++it ) { int nSrcID = it->first; IDBResult res = db.executeSQL("SELECT name FROM sources WHERE source_id=?", nSrcID); if ( res.isEnd() ) continue; String strName = res.getStringByIdx(0); if ( !db.isTableExist(strName) ) continue; Hashtable<String,int>& hashAttribs = *it->second; for ( Hashtable<String,int>::iterator itAttr = hashAttribs.begin(); itAttr != hashAttribs.end(); ++itAttr ) { String strTriggerName = strName + "_" + itAttr->first; if ( !mapTriggers.containsKey(strTriggerName + "_delete") ) { String strTrigger = String("CREATE TRIGGER ") + strTriggerPrefix + strTriggerName + "_delete BEFORE DELETE ON \"" + strName + "\" FOR EACH ROW \r\n" " BEGIN \r\n" " SELECT rhoOnDeleteSchemaRecord( OLD." + itAttr->first + ");\r\n" " END;\r\n" ";"; db.createTrigger(strTrigger); }else mapTriggers[strTriggerName + "_delete"] = 1; if ( !mapTriggers.containsKey(strTriggerName + "_update") ) { String strTrigger = String("CREATE TRIGGER ") + strTriggerPrefix + strTriggerName + "_update BEFORE UPDATE ON \"" + strName + "\" FOR EACH ROW\r\n" " BEGIN \r\n" " SELECT rhoOnUpdateSchemaRecord( OLD." + itAttr->first + ", NEW." + itAttr->first + ");\r\n" " END;\r\n" ";"; db.createTrigger(strTrigger); }else mapTriggers[strTriggerName + "_update"] = 1; } } //Remove outdated triggers for ( Hashtable<String,int>::iterator itTriggers = mapTriggers.begin(); itTriggers != mapTriggers.end(); ++itTriggers ) { if ( !itTriggers->second ) { db.dropTrigger(strTriggerPrefix+itTriggers->first); } } }
virtual void requestBlobsForAttrib(const String& attr, Vector<String>& out ) { IDBResult res = _db.executeSQL( "SELECT value FROM object_values WHERE source_id=? AND attrib=?", _srcID, attr.c_str() ); for ( ;!res.isEnd();res.next()) { out.push_back( /*common::CFilePath::join( RHODESAPP().getBlobsDirPath(), */res.getStringByIdx(0)/*)*/ ); } }