static void StreamUnFmtIn( void ) { //=============================== ftnfile *fcb; fcb = IOCB->fileinfo; for(;;) { IOCB->typ = IOTypeRtn(); if( IOCB->typ == PT_NOTYPE ) break; if( IOCB->typ == PT_CHAR ) { IUnStream( IORslt.string.strptr, IORslt.string.len ); } else if( IOCB->typ == PT_ARRAY ) { uint elmt_size; if( IORslt.arr_desc.typ == PT_CHAR ) { elmt_size = IORslt.arr_desc.elmt_size; } else { elmt_size = SizeVars[ IORslt.arr_desc.typ ]; } IUnStream( IORslt.arr_desc.data, IORslt.arr_desc.num_elmts * elmt_size ); } else { fcb->len = SizeVars[ IOCB->typ ]; if( fcb->len > fcb->bufflen ) { IOErr( IO_UNFMT_RECL ); } NextRec(); UnFmtItem( fcb->buffer ); } } }
static void RecordUnFmtIn( void ) { //=============================== ftnfile *fcb; int len; fcb = IOCB->fileinfo; NextRec(); for(;;) { IOCB->typ = IOTypeRtn(); if( IOCB->typ == PT_NOTYPE ) break; if( fcb->col == fcb->len ) { NextUnFmtRec(); } if( IOCB->typ == PT_CHAR ) { IUnString(); } else if( IOCB->typ == PT_ARRAY ) { IUnArray(); } else { len = SizeVars[ IOCB->typ ]; if( fcb->col + len > fcb->len ) { IOErr( IO_UNFMT_RECL ); } UnFmtItem( fcb->buffer + fcb->col ); fcb->col += len; } } }
int RM_FileScan::GetNextRec(RM_Record &rec, RID &rid) { RM_Record nextrec; int result = NextRec(nextrec, rid); if(result != 0) return result; Bytes get_data = new char[filehandle->GetRsize()]; memcpy(get_data,nextrec.GetRdata(),filehandle->GetRsize()); rec.SetSize(filehandle->GetRsize()); rec.SetData(get_data); return 0; }
static void NextUnFmtRec( void ) { //================================ if( _LogicalRecordOrganization( IOCB->fileinfo ) ) { if( CheckLogicalRecord( IOCB->fileinfo ) ) { NextRec(); return; } } IOErr( IO_UNFMT_RECL ); }
void R_NewRec( void ) { //================== if( IOCB->flags & IOF_OUTPT ) { IOCB->fileinfo->col = IOCB->fmtlen; CheckCCtrl(); SendEOR(); IOCB->fmtlen = IOCB->fileinfo->col; } else { NextRec(); } }
void CheckEor( void ) { //================== ftnfile *fcb; fcb = IOCB->fileinfo; while( fcb->col >= fcb->len ) { NextRec(); if( IOCB->typ != PT_CHAR ) { Blanks(); } } }
static void IUnStream( char HPGM *dst, unsigned long len ) { //============================================================== uint amt; ftnfile *fcb; fcb = IOCB->fileinfo; for(;;) { amt = fcb->bufflen; if( amt > len ) { amt = len; } fcb->len = amt; NextRec(); pgm_memput( dst, fcb->buffer, fcb->len ); len -= amt; if( len == 0 ) break; dst += amt; } }
int RM_FileScan::GetNextRec(RID &rid) { RM_Record nextrec; return NextRec(nextrec, rid); }
void FreeIn( void ) { //================ NextRec(); DoFreeIn(); }
int main() { printf("******************************************\n"); printf("* Record Manager Application *\n"); printf("* Xinyi He *\n"); printf("******************************************\n"); char c; do { printf("\n"); printf("a. Open database\n"); printf("b. Get first record\n"); printf("c. Get next record \n"); printf("d. Get previous record\n"); printf("e. Get Nth record\n"); printf("f. Insert record\n"); printf("g. Bulk insert records in file\n"); printf("h. Delete record\n"); printf("i. Update record\n"); printf("j. Find record with first attribute value\n"); printf("k. Show catalog file\n"); printf("l. Get first page\n"); printf("m. Get next page\n"); printf("n. Show buf stats\n"); printf("o. Commit changes\n"); printf("p. Exit\n"); printf("Please press letter to choose an action.\n"); c = getchar(); fflush(stdin); char filename[100]; switch (c) { //a. Open database case 'a': { printf("Please input the database name (don't include extension): "); gets(filename); OpenStore(filename); break; } //b. Get first record case 'b': { Output(FirstRec()); break; } //c. Get next record case 'c': { Output(NextRec()); break; } //d. Get previous record case 'd': { Output(PriorRec()); break; } //e. Get Nth record case 'e': { printf("\nInput N: "); int n; scanf("%d", &n); Output(NRec(n)); fflush(stdin); break; } //f. Insert record case 'f': { printf("\nInput a comma-delimited Record:\n"); char statement[100]; scanf("%s", &statement); fflush(stdin); InsertRec(statement); break; } //g. Bulk insert records in file case 'g': { printf("\nInput the filename(include extension): "); char file[100]; scanf("%s", &file); InsertRecFromFile(file); fflush(stdin); break; } //h. Delete record case 'h': { DeleteRec(); break; } //i. Update record case 'i': { printf("\nInput a comma-delimited Record:\n"); char statement[100]; scanf("%s", &statement); fflush(stdin); UpdateRec(statement); break; } //j. Find record with first attribute value case 'j': { printf("\nInput value:\n"); char statement[100]; scanf("%s", &statement); fflush(stdin); SearchRec(statement); break; } //k. Show catalog file case 'k': { DisplyCatFile(filename); break; } //l. Get first page case 'l': { GetPage(0); break; } //m. Get next page case 'm': { GetPage(1); break; } //n. Show buf stats case 'n': { ShowBuf(); break; } //o. Commit changes case 'o': { Commit(filename); break; } //p. Exit case 'p': { CloseStore(filename); } }; }while(c != 'p'); return 0; }