/* 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);
	}
	
}