bool MongodbClient::SaveBinary(const String &key, uint8 *data, int32 dataSize)
{
    int32 status = MONGO_ERROR;
    if(IsConnected())
    {
        MongodbObject * binary = new MongodbObject();
        DVASSERT(binary);
        
        binary->SetObjectName(key);
        binary->AddInt32(String("DataSize").c_str(), dataSize);
        binary->AddData(String("Data").c_str(), data, dataSize);
        binary->Finish();
        
        
        MongodbObject *foundObject = FindObjectByKey(key);
        if(foundObject)
        {
            status = mongo_update(clientData->connection, namespaceName.c_str(), (bson *)foundObject->InternalObject(), (bson *)binary->InternalObject(), 0, NULL);
            if(MONGO_OK != status)
            {
                LogError(String("SaveBinary, update"), clientData->connection->err);
            }
            
            SafeRelease(foundObject);
        }
        else 
        {
            status = mongo_insert(clientData->connection, namespaceName.c_str(), (bson *)binary->InternalObject(), NULL);
            if(MONGO_OK != status)
            {
                LogError(String("SaveBinary, insert"), clientData->connection->err);
            }
        }
        
        SafeRelease(binary);
    }
    
    return (MONGO_OK == status);
}
Esempio n. 2
0
bool GameCore::FlushToDB(const String & levelName, const Map<String, String> &results, const String &imagePath)
{
	if(!dbClient)
		return false;

    Logger::Debug("Sending results to DB...");
    
    MongodbObject *testResultObject = new MongodbObject();
    if(testResultObject)
    {
        testResultObject->SetObjectName(levelName);
        
        Map<String, String>::const_iterator it = results.begin();
        for(; it != results.end(); it++)
        {
            testResultObject->AddString((*it).first, (*it).second);
        }
        
        File * imageFile = File::Create(imagePath, File::READ | File::OPEN);
        if(imageFile)
        {
            uint32 fileSize = imageFile->GetSize();
            uint8 * data = new uint8[fileSize];
            imageFile->Read(data, fileSize);
            testResultObject->AddData("ResultImagePNG", data, fileSize);
            
            SafeDelete(data);
            SafeRelease(imageFile);
        }
        else
        {
            Logger::Debug("Can't read result level sprite!");
        }
        
        testResultObject->Finish();
        
		MongodbObject * currentRunObject = dbClient->FindObjectByKey(Format("%d", currentRunId));
		MongodbObject * newRunObject = new MongodbObject();
		if(newRunObject)
		{
			if(currentRunObject)
			{
				newRunObject->Copy(currentRunObject);
			}
			else
			{
				newRunObject->SetObjectName(Format("%d", currentRunId));
				newRunObject->AddString("DeviceDescription", DeviceInfo::Instance()->GetDeviceDescription());
			}

			newRunObject->AddObject(levelName, testResultObject);
			newRunObject->Finish();
			dbClient->SaveObject(newRunObject, currentRunObject);
			SafeRelease(newRunObject);
		}
		else
		{
			Logger::Debug("Can't create test result object in DB");
			return false;
		}

		SafeRelease(currentRunObject);
		SafeRelease(testResultObject);
    }
    else
    {
        Logger::Debug("Can't create tests results object");
        return false;
    }
    
    Logger::Debug("Results successful sent to DB");
    
    return true;
}