void CValuables::thingUpdated(const hacc::TDBID & thingID) { QSqlQuery q = HACC_DB->query("select " "transactions_things.id " "from transactions_things " "where transactions_things.thing_id=?", QVariantList() << thingID); while(q.next()) { hacc::TDBID transactionID = HACC_DB_2_DBID(q, 0); QSqlQuery inq = HACC_DB->query("select id from valuables where transaction_id=?", QVariantList() << transactionID); hacc::TDBID valID = HACC_QUERY_DATA_AVIALABLE(inq) ? HACC_DB_2_DBID(inq, 0) : 0; if(HACC_THINGS->tagAttached(HACC_TAG_ID_OBJECT, thingID)) { if(!valID) { hacc::TDBID newID = nextID(); HACC_DB->exec("insert into valuables (id,transaction_id,serial_number) values (?,?,?)", QVariantList() << newID << transactionID << idToSerial(newID)); emit created(newID); } } else { if(valID) { execRemove("transaction_id=?", QVariantList() << transactionID); } } } }
void WriteBatchExecutor::bulkExecute( const BatchedCommandRequest& request, std::vector<BatchedUpsertDetail*>* upsertedIds, std::vector<WriteErrorDetail*>* errors ) { if ( request.getBatchType() == BatchedCommandRequest::BatchType_Insert ) { execInserts( request, errors ); } else if ( request.getBatchType() == BatchedCommandRequest::BatchType_Update ) { for ( size_t i = 0; i < request.sizeWriteOps(); i++ ) { WriteErrorDetail* error = NULL; BSONObj upsertedId; execUpdate( BatchItemRef( &request, i ), &upsertedId, &error ); if ( !upsertedId.isEmpty() ) { BatchedUpsertDetail* batchUpsertedId = new BatchedUpsertDetail; batchUpsertedId->setIndex( i ); batchUpsertedId->setUpsertedID( upsertedId ); upsertedIds->push_back( batchUpsertedId ); } if ( error ) { errors->push_back( error ); if ( request.getOrdered() ) break; } } } else { dassert( request.getBatchType() == BatchedCommandRequest::BatchType_Delete ); for ( size_t i = 0; i < request.sizeWriteOps(); i++ ) { WriteErrorDetail* error = NULL; execRemove( BatchItemRef( &request, i ), &error ); if ( error ) { errors->push_back( error ); if ( request.getOrdered() ) break; } } } // Fill in stale version errors for unordered batches (update/delete can't do this on own) if ( !errors->empty() && !request.getOrdered() ) { const WriteErrorDetail* finalError = errors->back(); if ( finalError->getErrCode() == ErrorCodes::StaleShardVersion ) { for ( size_t i = finalError->getIndex() + 1; i < request.sizeWriteOps(); i++ ) { WriteErrorDetail* dupStaleError = new WriteErrorDetail; finalError->cloneTo( dupStaleError ); errors->push_back( dupStaleError ); } } } }
void CValuables::thingRemoved(const hacc::TDBID & thingID) { QSqlQuery q = HACC_DB->query("select " "transactions_things.id " "from transactions_things " "where transactions_things.thing_id=?", QVariantList() << thingID); while(q.next()) { execRemove("transaction_id=?", QVariantList() << HACC_DB_2_DBID(q, 0)); } }