void DBVPolyIF::FourColoring () { char nameStr [DBStringLength]; DBInt symbol, maxSymbol = 0, line, index; DBObjRecord *polyRec,*searchPoly, *neighborPolyRec, *lineRec, *symRec; for (polyRec = FirstItem ();polyRec != (DBObjRecord *) NULL;polyRec = NextItem ()) SymbolFLD->Record (polyRec,(DBObjRecord *) NULL); ListSort (LineNumFLD); for (searchPoly = FirstItem ();searchPoly != (DBObjRecord *) NULL;searchPoly = NextItem ()) { if (((DBInt) (SymbolFLD->Record (searchPoly) - (DBObjRecord *) NULL)) != 0) continue; DBPause (searchPoly->RowID () * 100 / ItemNum ()); symbol = 1; Restart: for (polyRec = ItemTable->First (&index);polyRec != (DBObjRecord *) NULL;polyRec = ItemTable->Next (&index)) { if (strcmp (polyRec->Name (),searchPoly->Name ()) != 0) continue; lineRec = FirstLine (polyRec); for (line = 0;line <= LineNum (polyRec);++line) { if (LineRightPoly (lineRec) == polyRec) { neighborPolyRec = LineLeftPoly (lineRec); lineRec = LineNextLine (lineRec); } else { neighborPolyRec = LineRightPoly (lineRec); lineRec = LinePrevLine (lineRec); } if (neighborPolyRec == (DBObjRecord *) NULL) continue; if (SymbolFLD->Record (neighborPolyRec) == (DBObjRecord *) symbol) { symbol++; goto Restart; } } } for (polyRec = ItemTable->First (&index);polyRec != (DBObjRecord *) NULL;polyRec = ItemTable->Next (&index)) if (strcmp (polyRec->Name (),searchPoly->Name ()) == 0) SymbolFLD->Record (polyRec,(DBObjRecord *) symbol); maxSymbol = maxSymbol > symbol ? maxSymbol : symbol; } while (maxSymbol < SymbolTable->ItemNum ()) SymbolTable->Remove (SymbolTable->ItemNum () - 1); while (maxSymbol > SymbolTable->ItemNum ()) SymbolTable->Add (); for (symbol = 0;symbol < SymbolTable->ItemNum ();++symbol) { symRec = SymbolTable->Item (symbol); sprintf (nameStr,"Symbol:%2d",symbol); symRec->Name (nameStr); StyleFLD->Int (symRec,0); ForegroundFLD->Int (symRec,1); BackgroundFLD->Int (symRec,0); } for (polyRec = FirstItem ();polyRec != (DBObjRecord *) NULL;polyRec = NextItem ()) SymbolFLD->Record (polyRec,SymbolTable->Item ((DBInt) (SymbolFLD->Record (polyRec) - (DBObjRecord *) NULL) - 1)); ListReset (); }
int DBObjTable::Write(FILE *file) { DBInt id; DBObjRecord *obj; DBObjRecord *record; DBObjTableField *field; if (DBObjectLIST<DBObjRecord>::Write(file) != DBSuccess) return (DBFault); if (FieldPTR->Write(file) != DBSuccess) return (DBFault); for (id = 0; id < FieldPTR->ItemNum(); ++id) if (FieldPTR->WriteItem(file, id) == DBFault) return (DBFault); for (id = 0; id < ItemNum(); ++id) { record = Item(id); for (field = FieldPTR->First(); field != (DBObjTableField *) NULL; field = FieldPTR->Next()) switch (field->Type()) { case DBTableFieldTableRec: case DBTableFieldDataRec: if ((obj = field->Record(record)) != (DBObjRecord *) NULL) field->Record(record, (DBObjRecord *) ((char *) NULL + obj->RowID())); else field->Record(record, (DBObjRecord *) DBFault); break; } if (WriteItem(file, id) == DBFault) return (DBFault); } if (MethodPTR->Write(file) != DBSuccess) return (DBFault); for (id = 0; id < MethodPTR->ItemNum(); ++id) if (MethodPTR->WriteItem(file, id) == DBFault) return (DBFault); return (DBSuccess); }
void DBObjTable::AddField(DBObjTableField *field) { DBInt recID; DBObjRecord *record; field->StartByte(RecordLengthVAR); FieldPTR->Add(field); RecordLengthVAR += field->Length(); for (recID = 0; recID < ItemNum(); recID++) { record = Item(recID); record->Realloc(RecordLengthVAR); switch (field->Type()) { case DBTableFieldString: field->String(record, ""); break; case DBTableFieldInt: field->Int(record, field->IntNoData()); break; case DBTableFieldFloat: field->Float(record, field->FloatNoData()); break; case DBTableFieldDate: field->Date(record, field->DateNoData()); break; } } }
void DBObjTable::RedefineField(DBObjTableField *field, DBObjTableField *newField) { DBInt recID, fieldID; DBObjRecord *record, *oldRecord; DBObjTableField *tmpField; newField->StartByte(field->StartByte()); if (field->Length() != newField->Length()) { RecordLengthVAR += (newField->Length() - field->Length()); for (fieldID = field->RowID() + 1; fieldID < FieldNum(); ++fieldID) { tmpField = Field(fieldID); tmpField->StartByte(tmpField->StartByte() + newField->Length() - field->Length()); } } for (recID = 0; recID < ItemNum(); recID++) { record = Item(recID); oldRecord = new DBObjRecord(*record); if (field->Length() != newField->Length()) { record->Realloc(RecordLengthVAR); if (newField->StartByte() + newField->Length() < RecordLengthVAR) memcpy(((char *) record->Data()) + newField->StartByte() + newField->Length(), ((char *) oldRecord->Data()) + field->StartByte() + field->Length(), RecordLengthVAR - (newField->StartByte() + newField->Length())); } switch (newField->Type()) { case DBTableFieldString: newField->String(record, field->String(oldRecord)); break; case DBTableFieldInt: newField->Int(record, field->Int(oldRecord)); break; case DBTableFieldFloat: newField->Float(record, field->Float(oldRecord)); break; case DBTableFieldDate: newField->Date(record, field->Date(oldRecord)); break; case DBTableFieldCoord: newField->Coordinate(record, field->Coordinate(oldRecord)); break; case DBTableFieldRegion: newField->Region(record, field->Region(oldRecord)); break; case DBTableFieldPosition: newField->Position(record, field->Position(oldRecord)); break; case DBTableFieldTableRec: case DBTableFieldDataRec: newField->Record(record, field->Record(oldRecord)); break; } delete oldRecord; } if (strcmp(field->Name(), newField->Name()) != 0) field->Name(newField->Name()); if (field->Type() != newField->Type()) field->Type(newField->Type()); if (field->FormatWidth() != newField->FormatWidth()) field->FormatWidth(newField->FormatWidth()); if ((field->Type() == DBTableFieldFloat) && (field->FormatDecimals() != field->FormatDecimals())) field->FormatDecimals(newField->FormatDecimals()); if (field->Length() != newField->Length()) field->Length(newField->Length()); }
void DBObjTable::DeleteField(DBObjTableField *delField) { DBInt i, recID, fieldID; DBObjRecord *record; DBObjTableField *field; unsigned char *data; for (fieldID = 0; fieldID < FieldPTR->ItemNum(); ++fieldID) { field = FieldPTR->Item(fieldID); if (field->StartByte() > delField->StartByte()) field->StartByte(field->StartByte() - delField->Length()); } for (recID = 0; recID < ItemNum(); ++recID) { record = Item(recID); data = (unsigned char *) record->Data() + delField->StartByte(); for (i = 0; i < RecordLengthVAR - delField->StartByte() - delField->Length(); ++i) data[i] = data[i + delField->Length()]; record->Realloc(RecordLengthVAR - delField->Length()); } FieldPTR->Remove(delField); RecordLengthVAR -= delField->Length(); delete delField; }
int DBObjTable::Read(FILE *file, int swap) { DBInt id; DBDate date; DBCoordinate coord; DBRegion region; DBPosition pos; DBUShort row, col; DBObjRecord *record; DBObjTableField *field; if (DBObjectLIST<DBObjRecord>::Read(file, swap) != DBSuccess) return (DBFault); if (FieldPTR->Read(file, swap) != DBSuccess) return (DBFault); for (id = 0; id < FieldPTR->ItemNum(); ++id) if (FieldPTR->ReadItem(file, id, swap) == DBFault) return (DBFault); RecordLengthVAR = 0; for (field = FieldPTR->First(); field != (DBObjTableField *) NULL; field = FieldPTR->Next()) RecordLengthVAR = RecordLengthVAR > field->StartByte() + field->Length() ? RecordLengthVAR : field->StartByte() + field->Length(); for (id = 0; id < ItemNum(); ++id) { if (ReadItem(file, id, swap) == DBFault) return (DBFault); record = Item(id); if (swap == false) continue; for (field = FieldPTR->First(); field != (DBObjTableField *) NULL; field = FieldPTR->Next()) switch (field->Type()) { case DBTableFieldInt: case DBTableFieldFloat: case DBTableFieldTableRec: case DBTableFieldDataRec: switch (field->Length()) { case 2: DBByteOrderSwapHalfWord((char *) record->Data() + field->StartByte()); break; case 4: DBByteOrderSwapWord((char *) record->Data() + field->StartByte()); break; case 8: DBByteOrderSwapLongWord((char *) record->Data() + field->StartByte()); break; } break; case DBTableFieldDate: date = field->Date(record); date.Swap(); field->Date(record, date); break; case DBTableFieldCoord: coord = field->Coordinate(record); coord.Swap(); field->Coordinate(record, coord); break; case DBTableFieldRegion: region = field->Region(record); region.Swap(); field->Region(record, region); break; case DBTableFieldPosition: pos = field->Position(record); switch (field->Length()) { case sizeof(DBPosition): pos.Swap(); break; default: row = pos.Row; col = pos.Col; DBByteOrderSwapHalfWord(&row); DBByteOrderSwapHalfWord(&col); pos.Row = row; pos.Col = col; break; } field->Position(record, pos); break; default: break; } } if (MethodPTR->Read(file, swap) != DBSuccess) return (DBFault); for (id = 0; id < MethodPTR->ItemNum(); ++id) if (MethodPTR->ReadItem(file, id, swap) == DBFault) return (DBFault); return (DBSuccess); }