RCODE CSPDB::RegisterField(HFDB hFlaim, FLMUNICODE *pFieldName, FLMUINT flmType, FLMUINT* pFieldId) { RCODE rc = FERR_OK; FlmRecord *pRec = NULL; void *pvField = 0; pRec = new FlmRecord(); if (pRec != NULL) { rc = pRec->insertLast(0, FLM_FIELD_TAG, FLM_TEXT_TYPE, &pvField); if (RC_OK(rc)) { rc = pRec->setUnicode(pvField, (FLMUNICODE*)pFieldName); if (RC_OK(rc)) { rc = pRec->insert(pvField, INSERT_LAST_CHILD, FLM_TYPE_TAG, FLM_TEXT_TYPE, &pvField); if (RC_OK(rc)) { if (flmType != FLM_UNDEFINED_TYPE) { rc = pRec->setUnicode(pvField, (FLMUNICODE*)cs_flaim_type_name[flmType]); if (RC_OK(rc)) { rc = FlmRecordAdd(hFlaim, FLM_DICT_CONTAINER, pFieldId, pRec, 0); if (RC_OK(rc)) { rc = m_NameTable.addTag((FLMUNICODE*)pFieldName, 0, *pFieldId, 0, 0, TRUE); } } } else { rc = FERR_BAD_FIELD_TYPE; } } } } pRec->Release(); } else { rc = FERR_MEM; } return (rc); } // CSPDB::registerField()
RCODE CSPDB::AddIndex(HFDB hFlaim, FLMUNICODE *pFieldName, FLMUINT fieldId) { RCODE rc = FERR_OK; FlmRecord *pRec = NULL; void *pvIndex; void *pvField = 0; void *pvKey = 0; FLMUNICODE* pIndexName; int nameLen; int buffLen; FLMUINT indexId = 0; pRec = new FlmRecord(); if (pRec != NULL) { // Add the index. rc = pRec->insertLast(0, FLM_INDEX_TAG, FLM_TEXT_TYPE, &pvIndex); if (RC_OK(rc)) { // Create the index name. nameLen = f_unilen(pFieldName); buffLen = nameLen + sizeof(nameSuffex) + 1; pIndexName = new FLMUNICODE[buffLen]; if (pIndexName) { f_unicpy(pIndexName, pFieldName); f_unicpy(pIndexName + nameLen, (FLMUNICODE*)nameSuffex); rc = pRec->setUnicode(pvIndex, (FLMUNICODE*)pIndexName); if (RC_OK(rc)) { // Add the key. rc = pRec->insert(pvIndex, INSERT_LAST_CHILD, FLM_KEY_TAG, FLM_TEXT_TYPE, &pvKey); if (RC_OK(rc)) { // Add the collection rc = pRec->insert(pvKey, INSERT_LAST_CHILD, FLM_FIELD_TAG, FLM_NUMBER_TYPE, &pvField); if (RC_OK(rc)) { rc = pRec->setINT(pvField, CS_Id_CollectionId); } // Add the field. rc = pRec->insert(pvKey, INSERT_FIRST_CHILD, FLM_FIELD_TAG, FLM_NUMBER_TYPE, &pvField); if (RC_OK(rc)) { rc = pRec->setINT(pvField, fieldId); if (RC_OK(rc)) { rc = FlmRecordAdd(hFlaim, FLM_DICT_CONTAINER, &indexId, pRec, 0); if (RC_OK(rc)) { rc = m_NameTable.addTag((FLMUNICODE*)pIndexName, 0, indexId, 0, 0, TRUE); } } } else { rc = FERR_BAD_FIELD_TYPE; } } } delete [] pIndexName; } } pRec->Release(); } else { rc = FERR_MEM; } return (rc); } // CSPDB::AddIndex()
/******************************************************************** Desc: ? *********************************************************************/ FLMINT ViewGetKey( void) { RCODE rc = FERR_OK; FlmRecord * pKey = NULL; void * pvFld; char Prompt [80]; FLMUINT Num; FLMUINT ValEntered; FLMUINT Len; char TempBuf [80]; FLMUINT NumFields; FLMUINT i; FLMINT GetOK; FLMBYTE FieldName [80]; FLMBYTE FieldType [16]; FLMINT KeyEntered = FALSE; FLMBYTE LFH[ LFH_SIZE]; FLMUINT FileOffset; LFILE * pLFile = NULL; IXD * pIxd; IFD * pIfd; FLMUINT uiRootBlkAddress; FLMBOOL bTruncated; if (!gv_bViewHdrRead) ViewReadHdr(); /* See if we can get dictionary information. */ ViewGetDictInfo(); if (gv_bViewHaveDictInfo) { /* Find the logical file */ if ((RC_BAD( fdictGetIndex( ((FDB *)gv_hViewDb)->pDict, ((FDB *)gv_hViewDb)->pFile->bInLimitedMode, gv_uiViewSearchLfNum, &pLFile, NULL))) && (RC_BAD( fdictGetContainer( ((FDB *)gv_hViewDb)->pDict, gv_uiViewSearchLfNum, &pLFile)))) { pLFile = NULL; } } /* See if we have a valid logical file */ if ((gv_uiViewSearchLfNum == FLM_DATA_CONTAINER) || (gv_uiViewSearchLfNum == FLM_DICT_CONTAINER) || (pLFile)) { /* Get the LFH information for the logical file */ if (!ViewGetLFH( gv_uiViewSearchLfNum, LFH, &FileOffset)) { ViewShowError( "Could not get LFH for logical file"); return( FALSE); } uiRootBlkAddress = FB2UD( &LFH [LFH_ROOT_BLK_OFFSET]); if (uiRootBlkAddress == 0xFFFFFFFF) { ViewShowError( "Logical file is empty"); return( FALSE); } } else { ViewShowError( "Logical file not defined"); return( FALSE); } if ((gv_uiViewSearchLfNum == FLM_DATA_CONTAINER) || (gv_uiViewSearchLfNum == FLM_DICT_CONTAINER) || ((pLFile) && (pLFile->uiLfType == LF_CONTAINER))) { if (gv_uiViewSearchLfNum == FLM_DICT_CONTAINER) f_strcpy( TempBuf, "Enter Dictionary Record Number: "); else if (gv_uiViewSearchLfNum == FLM_DATA_CONTAINER) f_strcpy( TempBuf, "Enter Data Container Record Number: "); else f_sprintf( (char *)TempBuf, "Enter Record Number For Container %u: ", (unsigned)gv_uiViewSearchLfNum); if ((!ViewGetNum( TempBuf, &Num, FALSE, 4, 0xFFFFFFFF, &ValEntered)) || (!ValEntered)) return( FALSE); f_UINT32ToBigEndian( (FLMUINT32)Num, gv_ucViewSearchKey); gv_uiViewSearchKeyLen = 4; return( TRUE); } /* At this point, we are dealing with an index. */ if (gv_uiViewSearchLfNum == FLM_DICT_INDEX) { FLMUINT wTagType = 0; FLMUINT wElmLen; while (!wTagType) { if ((!ViewEditText( "Enter Type:", TempBuf, sizeof( TempBuf), &ValEntered)) || (!ValEntered)) return( FALSE); else if ((f_stricmp( TempBuf, "F") == 0) || (f_stricmp( TempBuf, "FIELD") == 0)) { wTagType = FLM_FIELD_TAG; } else if ((f_stricmp( TempBuf, "I") == 0) || (f_stricmp( TempBuf, "INDEX") == 0)) { wTagType = FLM_INDEX_TAG; } else if ((f_stricmp( TempBuf, "C") == 0) || (f_stricmp( TempBuf, "CONTAINER") == 0)) { wTagType = FLM_CONTAINER_TAG; } else if ((f_stricmp( TempBuf, "A") == 0) || (f_stricmp( TempBuf, "AREA") == 0)) { wTagType = FLM_AREA_TAG; } else { ViewShowError( "Illegal type, must be F)ield, I)ndex, C)ontainer, R)ecord, or A)rea"); wTagType = 0; } } gv_ucViewSearchKey [0] = KY_CONTEXT_PREFIX; f_UINT16ToBigEndian( (FLMUINT16)wTagType, &gv_ucViewSearchKey [1]); gv_uiViewSearchKeyLen += KY_CONTEXT_LEN; gv_ucViewSearchKey [gv_uiViewSearchKeyLen++] = COMPOUND_MARKER; if (!ViewEditText( "Enter Name:", TempBuf, sizeof( TempBuf), &ValEntered)) return( FALSE); /* Collate the name. */ wElmLen = MAX_KEY_SIZ - gv_uiViewSearchKeyLen; if (RC_BAD( rc = KYCollateValue( &gv_ucViewSearchKey [gv_uiViewSearchKeyLen], &wElmLen, (const FLMBYTE *)TempBuf, (FLMUINT)f_strlen( TempBuf), FLM_TEXT_TYPE, MAX_KEY_SIZ, NULL, NULL, gv_ViewHdrInfo.FileHdr.uiDefaultLanguage, FALSE, FALSE, FALSE, &bTruncated))) { ViewShowRCError( "collating name", rc); return( FALSE); } gv_uiViewSearchKeyLen += wElmLen; return( TRUE); } else if (!pLFile) { ViewShowError( "Cannot get logical file information"); return( FALSE); } else if (RC_BAD( fdictGetIndex( ((FDB *)gv_hViewDb)->pDict, ((FDB *)gv_hViewDb)->pFile->bInLimitedMode, gv_uiViewSearchLfNum, &pLFile, &pIxd))) { ViewShowError( "Cannot get index field information"); return( FALSE); } else { pIfd = pIxd->pFirstIfd; NumFields = pIxd->uiNumFlds; if (!(pIfd->uiFlags & IFD_COMPOUND)) { NumFields = 1; } if( (pKey = f_new FlmRecord) == NULL) { rc = RC_SET( FERR_MEM); ViewShowRCError( "creating key", rc); goto Exit_False; } if (RC_BAD( rc = pKey->insertLast( 0, FLM_KEY_TAG, FLM_CONTEXT_TYPE, &pvFld))) { ViewShowRCError( "adding key tag", rc); goto Exit_False; } /* Ask for data for each field and link into key tree */ i = 0; while (i < NumFields) { /* Get the name of the field and its type */ f_sprintf( (char *)FieldName, "FIELD %u", (unsigned)pIfd->uiFldNum); switch( IFD_GET_FIELD_TYPE( pIfd)) { case FLM_TEXT_TYPE: f_strcpy( (char *)FieldType, "TEXT"); break; case FLM_NUMBER_TYPE: f_strcpy( (char *)FieldType, "NUMBER"); break; case FLM_BINARY_TYPE: f_strcpy( (char *)FieldType, "BINARY"); break; case FLM_CONTEXT_TYPE: f_strcpy( (char *)FieldType, "CONTEXT"); break; default: f_sprintf( (char *)FieldType, "UNK: %u!", (unsigned)IFD_GET_FIELD_TYPE( pIfd)); break; } if (pIfd->uiFlags & IFD_OPTIONAL) f_sprintf( (char *)Prompt, "%s (%s-OPTIONAL): ", FieldName, FieldType); else f_sprintf( (char *)Prompt, "%s (%s-REQUIRED): ", FieldName, FieldType); switch( IFD_GET_FIELD_TYPE( pIfd)) { case FLM_TEXT_TYPE: if (!ViewEditText( Prompt, TempBuf, sizeof( TempBuf), &ValEntered)) goto Exit_False; break; case FLM_NUMBER_TYPE: case FLM_CONTEXT_TYPE: if (!ViewGetNum( Prompt, &Num, FALSE, 4, 0xFFFFFFFF, &ValEntered)) goto Exit_False; break; case FLM_BINARY_TYPE: Len = sizeof( TempBuf); if (!ViewEditBinary( Prompt, TempBuf, &Len, &ValEntered)) goto Exit_False; break; } if (!ValEntered) { i++; } else { FLMUINT uiDataType; /* See if the entered data can be converted to the */ /* correct type */ uiDataType = IFD_GET_FIELD_TYPE( pIfd); if (RC_BAD( rc = pKey->insertLast( 1, pIfd->uiFldNum, uiDataType, &pvFld))) { ViewShowRCError( "creating field", rc); } else { switch( IFD_GET_FIELD_TYPE( pIfd)) { case FLM_TEXT_TYPE: rc = pKey->setNative( pvFld, TempBuf); break; case FLM_NUMBER_TYPE: rc = pKey->setUINT( pvFld, Num); break; case FLM_CONTEXT_TYPE: rc = pKey->setRecPointer( pvFld, Num); break; case FLM_BINARY_TYPE: rc = pKey->setBinary( pvFld, TempBuf, Len); break; } if (RC_BAD( rc)) { ViewShowRCError( "putting data in field", rc); } } if (RC_OK(rc)) { i++; pIfd++; KeyEntered = TRUE; } } } // If index is on all containers, prompt for container number. if (!pIxd->uiContainerNum) { f_strcpy( Prompt, "CONTAINER: "); if (!ViewGetNum( Prompt, &Num, FALSE, sizeof( Num), 0xFFFF, &ValEntered)) { goto Exit_False; } if (ValEntered) { pKey->setContainerID( Num); KeyEntered = TRUE; } } /* Convert the key to binary format */ if (!KeyEntered) goto Exit_False; if ((rc = FlmKeyBuild( gv_hViewDb, gv_uiViewSearchLfNum, pKey->getContainerID(), pKey, 0, gv_ucViewSearchKey, &gv_uiViewSearchKeyLen)) != FERR_OK) ViewShowRCError( "building key", rc); else { GetOK = TRUE; goto Exit_GetKey; } } Exit_False: GetOK = FALSE; Exit_GetKey: if (pKey) { pKey->Release(); } return( GetOK); }
/******************************************************************** Desc: *********************************************************************/ RCODE gigaMakeNewRecord( FlmRecord ** ppRecord) { RCODE rc = NE_FLM_OK; FlmRecord * pRecord = NULL; void * pvField; if( *ppRecord && !(*ppRecord)->isReadOnly()) { f_assert( (*ppRecord)->getRefCount() == 1); pRecord = *ppRecord; *ppRecord = NULL; pRecord->clear(); } else { if( (pRecord = f_new FlmRecord) == NULL) { rc = RC_SET( NE_FLM_MEM); goto Exit; } } if( RC_BAD( rc = pRecord->insertLast( 0, PERSON_TAG, FLM_TEXT_TYPE, NULL))) { goto Exit; } if( RC_BAD( rc = pRecord->insertLast( 1, FIRST_NAME_TAG, FLM_TEXT_TYPE, &pvField))) { goto Exit; } if( RC_BAD( rc = pRecord->setNative( pvField, *gv_ppszCurrGiven))) { goto Exit; } if( RC_BAD( rc = pRecord->insertLast( 1, LAST_NAME_TAG, FLM_TEXT_TYPE, &pvField))) { goto Exit; } if( RC_BAD( rc = pRecord->setNative( pvField, *gv_ppszCurrFamily))) { goto Exit; } if( RC_BAD( rc = pRecord->insertLast( 1, AGE_TAG, FLM_NUMBER_TYPE, &pvField))) { goto Exit; } if( RC_BAD( rc = pRecord->setUINT( pvField, f_getRandomUINT32( 1, 100)))) { goto Exit; } if( *ppRecord) { (*ppRecord)->Release(); } *ppRecord = pRecord; pRecord = NULL; gv_ppszCurrGiven++; if( *gv_ppszCurrGiven == NULL) { gv_ppszCurrGiven = &gv_pszGivenNames [0]; gv_ppszCurrFamily++; if (*gv_ppszCurrFamily == NULL) { gv_ppszCurrFamily = &gv_pszFamilyNames[0]; } } Exit: if( pRecord) { pRecord->Release(); } return( rc); }