/* CreateObject * This is the first time you have * access to the editdata, so it * needs to be initialized with * default values. Just be aware * that if the user chooses to * create your object from a file, * CreateFromFile will be called * instead of this function. */ int MMF2Func CreateObject(mv *mV, LO *lo, SerializedED *SED) { #ifndef RUN_ONLY if(IS_COMPATIBLE(mV)) //Make sure MMF2 hasn't changed in a way that makes your extension incompatible { Edif::Init(mV, SED); EditData().Serialize(mV, SED); //create & store the default editdata return 0; } #endif return -1; }
t_rc INXM_IndexHandle::FindAndAppend(int rootPageID, void *key, const REM_RecordID &rid) { t_rc rc; STORM_PageHandle leafPageHandle; rc = FindLeaf(rootPageID, key, leafPageHandle); if (rc != OK) { return rc; } INXM_InitPageHeader initPageHeader; rc = LoadInitHeaders(leafPageHandle, initPageHeader); if (rc != OK) { return rc; } INXM_Node node; int i; for (i=0; i < initPageHeader.nItems; i++) { rc = ReadNode(leafPageHandle, i, node); if (rc != OK) { return rc; } if (KeyCmp(key, node.key) == 0) { break; } } if (i == initPageHeader.nItems) { return(INXM_KEY_NOT_FOUND); } else { int slotOfNewData; STORM_PageHandle lastDataPageHandle; rc = this->sfh.GetPage(this->inxmFileHeader.lastDataPage, lastDataPageHandle); if (rc != OK) { return rc; } /* Check if last data page has room. */ INXM_InitPageHeader initPageHeader; rc = LoadInitHeaders(lastDataPageHandle, initPageHeader); if (rc != OK) { return rc; } int room = PAGE_DATA_SIZE-(INXM_INITPAGEHEADER_SIZE+(initPageHeader.nItems+1)*INXM_DATA_SIZE); /* If no room. Reserve new last data page. */ if (room < 0 ) { CreateLastDataPage(lastDataPageHandle); /* Write last data. */ WriteData(lastDataPageHandle, rid, slotOfNewData); } else if (room == 0) { /* Write last data. */ WriteData(lastDataPageHandle, rid, slotOfNewData); CreateLastDataPage(lastDataPageHandle); } else { /* Write last data. */ WriteData(lastDataPageHandle, rid, slotOfNewData); } /* Update last-1 link data. */ STORM_PageHandle listDataPageHandle; this->sfh.GetPage(node.left, listDataPageHandle); INXM_Data data; ReadData(listDataPageHandle, node.slot, data); int fromWhere = node.slot; while (data.nextPageID != 0) { this->sfh.GetPage(data.nextPageID, listDataPageHandle); fromWhere = data.nextSlot; ReadData(listDataPageHandle, data.nextSlot, data); } data.nextPageID=this->inxmFileHeader.lastDataPage; data.nextSlot=slotOfNewData; /* Write updated last-1 data of list. */ EditData(listDataPageHandle, fromWhere, data); return(OK); } }