Example #1
0
// --------------------------------------------------------------------------
void Property::load(const FileGroupPtr &db, const BitArray &objMask) {
    // Open the chunk specified by "P$" + mChunkName
    FilePtr fprop;

    string pchn = "P$" + mChunkName;

    try {
        fprop = db->getFile(pchn);

        const DarkDBChunkHeader &hdr = db->getFileHeader(pchn);

        // compare the versions, log differences
        if (hdr.version_high != mVerMaj || hdr.version_low != mVerMin) {
            LOG_ERROR("Property %s version mismatch : %d.%d expected, %d.%d "
                      "encountered",
                      pchn.c_str(), mVerMaj, mVerMin, hdr.version_high,
                      hdr.version_low);
        }
    } catch (const BasicException &) {
        LOG_ERROR("Property::load : Could not find the property chunk %s",
                  pchn.c_str());
        return;
    }

    // Can't calculate the count of the properties, as they can have any size
    // load. Each record has: OID, size (32 bit uint's)
    int id = 0xDEADBABE;

    while (!fprop->eof()) {
        // load the id
        fprop->readElem(&id, sizeof(uint32_t));

        // if the object is not in the mask, skip the property
        if (!objMask[id]) {
            LOG_DEBUG("Property::load: skipping object %d, not in bitmap", id);
            // prop has length and data - so skip according to that
            uint32_t size;
            fprop->read(&size, sizeof(uint32_t));
            fprop->seek(size, File::FSEEK_CUR);
            continue;
        }

        // Use property storage to load the property
        if (mPropertyStorage->readFromFile(fprop, id, true)) {
            _addProperty(id);
        } else {
            LOG_ERROR("There was an error loading property %s for object %d. "
                      "Property was not loaded",
                      mName.c_str(), id);
        }
    }
}
	// --------------------------------------------------------------------------
	bool StructuredDataStorage::readFromFile(FilePtr& file, int objID, bool sizeStored) {
		DTypePtr pd = getDataForObject(objID);
		
		if (pd.isNull()) {
			uint32_t size;
			
			// Read the size
			if (sizeStored)
				file->readElem(&size, sizeof(uint32_t));
			else
				size = mTypeDef->size();
			
			// compare sizes
			if (size != mTypeDef->size())
				LOG_ERROR("Data size mismatch: %d definition, %d file source", mTypeDef->size(), size);
			
			// create a new data
			pd = _create(objID);

			pd->read(file, size);
			
			mDataMap.insert(std::make_pair(objID, pd));
			
			return true;
		} else {
			// still have to at least skip the data
			uint32_t size;
			
			// Read the size
			file->readElem(&size, sizeof(uint32_t));
			
			file->seek(size, File::FSEEK_CUR);
			
			LOG_ERROR("Data already defined for object %d", objID);
		}
		
		return false;
	}
//------------------------------------------------------
uint32_t DatabaseService::getFileType(const FileGroupPtr &db) {
    // TODO: load FILE_TYPE for the first parameter
    FilePtr fttag = db->getFile("FILE_TYPE");

    if (!fttag) {
        // TODO: Exception, rather
        LOG_FATAL("Database file did not contain FILE_TYPE tag");
        return 0;
    }

    if (fttag->size() < sizeof(uint32_t)) {
        // TODO: Exception, rather
        LOG_FATAL("Database file did contain an invalid FILE_TYPE tag");
        return 0;
    }

    uint32_t filetype;

    fttag->readElem(&filetype, sizeof(uint32_t));

    return filetype;
}