char* DBCFileLoader::AutoProduceData(const char* format, uint32& records, char**& indexTable, uint32 sqlRecordCount, uint32 sqlHighestIndex, char*& sqlDataTable) { /* format STRING, NA, FLOAT, NA, INT <=> struct{ char* field0, float field1, int field2 }entry; this func will generate entry[rows] data; */ typedef char* ptr; if (strlen(format) != fieldCount) return NULL; //get struct size and index pos int32 i; uint32 recordsize = GetFormatRecordSize(format, &i); if (i >= 0) { uint32 maxi = 0; //find max index for (uint32 y = 0; y < recordCount; ++y) { uint32 ind = getRecord(y).getUInt(i); if (ind > maxi) maxi = ind; } // If higher index avalible from sql - use it instead of dbcs if (sqlHighestIndex > maxi) maxi = sqlHighestIndex; ++maxi; records = maxi; indexTable = new ptr[maxi]; memset(indexTable, 0, maxi * sizeof(ptr)); } else { records = recordCount + sqlRecordCount; indexTable = new ptr[recordCount+ sqlRecordCount]; } char* dataTable = new char[(recordCount + sqlRecordCount)*recordsize]; uint32 offset = 0; for (uint32 y = 0; y < recordCount; ++y) { if (i >= 0) indexTable[getRecord(y).getUInt(i)] = &dataTable[offset]; else indexTable[y] = &dataTable[offset]; for (uint32 x = 0; x < fieldCount; ++x) { switch (format[x]) { case FT_FLOAT: *((float*)(&dataTable[offset])) = getRecord(y).getFloat(x); offset += sizeof(float); break; case FT_IND: case FT_INT: *((uint32*)(&dataTable[offset])) = getRecord(y).getUInt(x); offset += sizeof(uint32); break; case FT_BYTE: *((uint8*)(&dataTable[offset])) = getRecord(y).getUInt8(x); offset += sizeof(uint8); break; case FT_STRING: *((char**)(&dataTable[offset])) = NULL; // will replace non-empty or "" strings in AutoProduceStrings offset += sizeof(char*); break; case FT_LOGIC: ASSERT(false && "Attempted to load DBC files that do not have field types that match what is in the core. Check DBCfmt.h or your DBC files."); break; case FT_NA: case FT_NA_BYTE: case FT_SORT: break; default: ASSERT(false && "Unknown field format character in DBCfmt.h"); break; } } } sqlDataTable = dataTable + offset; return dataTable; }
char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char**& indexTable) { /* format STRING, NA, FLOAT, NA, INT <=> struct{ char* field0, float field1, int field2 }entry; this func will generate entry[rows] data; */ typedef char * ptr; if (strlen(format) != fieldCount) return NULL; //get struct size and index pos int32 i; uint32 recordsize=GetFormatRecordSize(format, &i); if (i >= 0) { uint32 maxi = 0; //find max index for (uint32 y = 0; y < recordCount; y++) { uint32 ind=getRecord(y).getUInt(i); if (ind>maxi) maxi = ind; } ++maxi; records = maxi; indexTable = new ptr[maxi]; memset(indexTable, 0, maxi * sizeof(ptr)); } else { records = recordCount; indexTable = new ptr[recordCount]; } char* dataTable = new char[recordCount * recordsize]; uint32 offset=0; for (uint32 y =0; y < recordCount; y++) { if (i>=0) { indexTable[getRecord(y).getUInt(i)] = &dataTable[offset]; } else indexTable[y] = &dataTable[offset]; for (uint32 x = 0; x < fieldCount; x++) { switch(format[x]) { case FT_FLOAT: *((float*)(&dataTable[offset])) = getRecord(y).getFloat(x); offset += 4; break; case FT_IND: case FT_INT: *((uint32*)(&dataTable[offset])) = getRecord(y).getUInt(x); offset += 4; break; case FT_BYTE: *((uint8*)(&dataTable[offset])) = getRecord(y).getUInt8(x); offset += 1; break; case FT_STRING: *((char**)(&dataTable[offset])) = NULL; // will be replaces non-empty or "" strings in AutoProduceStrings offset += sizeof(char*); break; } } } return dataTable; }