void EntitiesEntity::getChildsStatement(const shared_ptr<IPortalDatabase> &database, const ObjectsTypes &types, const RangeUint32 &range, bool count, bool includeSystem, bool includeInvisible, shared_ptr<DbSqlSelect> &statement) const { OS_LOCK(m_cs); // Nota: qui bisogna specificare sempre la tabella perch dall'esterno la select pu essere messa in join con altre tabelle shared_ptr<DbSqlSelect> select(OS_NEW DbSqlSelect(DBTABLES::SNAPSHOT_OBJECTS_TABLE)); if(count) select->count = true; else select->fields.add(DbSqlField(DBTABLES::SNAPSHOT_OBJECTS::ENTITY, DBTABLES::SNAPSHOT_OBJECTS_TABLE)); database->getPortal()->getSnapshotManager()->ensureChilds(database, getEntityID()); select->where.add(DbSqlField(DBTABLES::SNAPSHOT_OBJECTS::PARENT, DBTABLES::SNAPSHOT_OBJECTS_TABLE), Convert::toSQL(getEntityID())); // Genera il filtro sui tipi di figli StringList childsTypes; for(ObjectsTypes::const_iterator i = types.begin(); i != types.end(); ++i) { if((*i) != portalObjectTypeUnknown) childsTypes.push_back(Convert::toSQL(static_cast<uint32>(*i))); } // Se stato specificato un filtro sul tipo di figli lo applica if(childsTypes.empty() == false) { select->where.add(DbSqlField(DBTABLES::SNAPSHOT_OBJECTS::TYPE, DBTABLES::SNAPSHOT_OBJECTS_TABLE), childsTypes); } // Includi le sezioni di sistema (virtuali)? // Sono figlie della root, per cui la condizione ha senso solo in quel caso if(getEntityID() == ObjectsSystem::instance()->getRootID()) { if(includeSystem == true) { // Salta la root stessa select->where.add(DbSqlField(DBTABLES::SNAPSHOT_OBJECTS::ENTITY, DBTABLES::SNAPSHOT_OBJECTS_TABLE), Convert::toSQL(ObjectsSystem::instance()->getRootID()), DbSqlCondition::cfDifferent | DbSqlCondition::cfAnd); } else { // VERYURGENT: Le classi statement non hanno una "not in"... poco male, ma userebbe meglio l'indice. select->where.add(DbSqlField(DBTABLES::SNAPSHOT_OBJECTS::INSERT_DATE, DBTABLES::SNAPSHOT_OBJECTS_TABLE), Convert::toSQL(DateTime::EMPTY), DbSqlCondition::cfDifferent | DbSqlCondition::cfAnd); } } if(includeInvisible == false) select->where.add(DbSqlField(DBTABLES::SNAPSHOT_OBJECTS::VISIBLE, DBTABLES::SNAPSHOT_OBJECTS_TABLE), Convert::toSQL(true)); uint32 size = range.size(); if(size != 0) select->limit.setCount(size); uint32 start = range.start(); if(start != 0) select->limit.setOffset(start); statement = select; }
bool IExtensionsExtension::isExtensionRegistered(shared_ptr<Portal> portal, shared_ptr<IPortalDatabase> db, Version &version) const { OS_ASSERT(portal != nullptr); OS_EXCEPT_IF(db == nullptr, "Invalid database"); shared_ptr<DbSqlSelect> select(OS_NEW DbSqlSelect(DBTABLES::EXTENSIONS_TABLE)); select->fields.add(DbSqlField(DBTABLES::EXTENSIONS::VERSION)); select->where.add(DBTABLES::EXTENSIONS::ID, Convert::toSQL(getID().toUTF16())); select->limit.setCount(1); DataTable result; if(db->execute(select, result) == false) return false; if(result.rows() == 0) return false; version.fromString(static_cast<String>(*result[0][0]).to_ascii()); return true; }
bool P2pMachine::load(const String &id) { try { shared_ptr<IDbConnection> connection = Engine::instance()->createSystemConnection(); shared_ptr<DbSqlSelect> select(OS_NEW DbSqlSelect(_S("os_machines"))); select->where.add(_S("id"), Convert::toSQL(id)); select->limit.setCount(1); DataTable result; connection->query(select, result); if(result.rows() == 1) { DataTableRow row = result[0]; DbValue<String> id; id.read(row, _S("id")); if(m_id.fromHex(id->to_ascii()) == false) { OS_ASSERTFALSE(); return false; } DbValue<Buffer> public_key; public_key.read(row, _S("public_key")); m_publicKey = public_key; return true; } } catch(std::exception &e) { OS_LOG_ERROR(e.what()); } return false; }