|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Motif
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Copyright (c) 1987-2012, The Open Group. All rights reserved.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are free software; you can
|
|
Packit |
b099d7 |
* redistribute them and/or modify them under the terms of the GNU
|
|
Packit |
b099d7 |
* Lesser General Public License as published by the Free Software
|
|
Packit |
b099d7 |
* Foundation; either version 2 of the License, or (at your option)
|
|
Packit |
b099d7 |
* any later version.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are distributed in the hope that
|
|
Packit |
b099d7 |
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
Packit |
b099d7 |
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
Packit |
b099d7 |
* PURPOSE. See the GNU Lesser General Public License for more
|
|
Packit |
b099d7 |
* details.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
b099d7 |
* License along with these librararies and programs; if not, write
|
|
Packit |
b099d7 |
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
Packit |
b099d7 |
* Floor, Boston, MA 02110-1301 USA
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* HISTORY
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
b099d7 |
#include <config.h>
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef REV_INFO
|
|
Packit |
b099d7 |
#ifndef lint
|
|
Packit |
b099d7 |
static char rcsid[] = "$XConsortium: MrmIheader.c /main/16 1996/11/13 13:56:56 drk $"
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* (c) Copyright 1989, 1990, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
*++
|
|
Packit |
b099d7 |
* FACILITY:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* UIL Resource Manager (URM): IDB facility
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* ABSTRACT:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These routines transfer header information between a file and the
|
|
Packit |
b099d7 |
* in-memory file header struct. All IDB routines maintain the in-memory
|
|
Packit |
b099d7 |
* file header; the on-disk header is only updated when the header is
|
|
Packit |
b099d7 |
* initialized or the file is closed. These routines assume that all
|
|
Packit |
b099d7 |
* information required in the header is continuously up-to-date in
|
|
Packit |
b099d7 |
* the open file struct.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* All header information must be updated at the time a record is
|
|
Packit |
b099d7 |
* modified, not written.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*--
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* INCLUDE FILES
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include <stdio.h>
|
|
Packit |
b099d7 |
#include <Mrm/MrmAppl.h>
|
|
Packit |
b099d7 |
#include <Mrm/Mrm.h>
|
|
Packit |
b099d7 |
#include <Mrm/IDB.h>
|
|
Packit |
b099d7 |
#include "MrmMsgI.h"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* TABLE OF CONTENTS
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Idb__HDR_GetHeader - Read a file header to memory
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Idb__HDR_InitHeader - Initialize a file header
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Idb__HDR_PutHeader - Write the header to disk
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* DEFINE and MACRO DEFINITIONS
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Macros which validate index records in buffers
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
#define Idb__HDR_ValidRecord(buffer) \
|
|
Packit |
b099d7 |
(_IdbBufferRecordType(buffer)==IDBrtHeader)
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* OWN VARIABLE DECLARATIONS
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* The following defines the database version written into all
|
|
Packit |
b099d7 |
* header records.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XmConst char *idb__database_version = URMversion;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
*++
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* PROCEDURE DESCRIPTION:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Idb__HDR_GetHeader reads the file's header record into a buffer,
|
|
Packit |
b099d7 |
* copies the information into the in-memory header.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* This routine is called as part of InitHeader to move the contents
|
|
Packit |
b099d7 |
* of the initialized header to memory. This usage expects the
|
|
Packit |
b099d7 |
* the record to be in the buffer pool, of course.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FORMAL PARAMETERS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* file_id Partially initialized in-memory file header struct; the
|
|
Packit |
b099d7 |
* file is open and the low-level file id is saved.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT INPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT OUTPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FUNCTION VALUE:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* MrmSUCCESS operation succeeded
|
|
Packit |
b099d7 |
* MrmNOT_FOUND header record not found
|
|
Packit |
b099d7 |
* MrmNOT_VALID database version mismatch
|
|
Packit |
b099d7 |
* MrmBAD_RECORD not the header record
|
|
Packit |
b099d7 |
* MrmFAILURE some other failure
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SIDE EFFECTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*--
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Cardinal
|
|
Packit |
b099d7 |
Idb__HDR_GetHeader (IDBFile file_id)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Local variables
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
Cardinal result; /* function results */
|
|
Packit |
b099d7 |
IDBRecordBufferPtr hdrbuf; /* header record buffer */
|
|
Packit |
b099d7 |
IDBHeaderRecordPtr recptr; /* header record in buffer */
|
|
Packit |
b099d7 |
IDBHeaderHdrPtr hdrptr; /* record header */
|
|
Packit |
b099d7 |
int ndx; /* loop index */
|
|
Packit |
b099d7 |
char errmsg[300];
|
|
Packit |
b099d7 |
int file_major, file_minor; /* version numbers of file */
|
|
Packit |
b099d7 |
int db_major, db_minor; /* version nums of database */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Get the header record
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
result = Idb__BM_GetRecord (file_id, IDBHeaderRecordNumber, &hdrbuf);
|
|
Packit |
b099d7 |
if ( result != MrmSUCCESS ) return result;
|
|
Packit |
b099d7 |
if ( ! Idb__HDR_ValidRecord(hdrbuf) )
|
|
Packit |
b099d7 |
return Urm__UT_Error ("Idb__HDR_GetHeader", _MrmMMsg_0010,
|
|
Packit |
b099d7 |
file_id, NULL, MrmBAD_RECORD);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Read the header contents into memory, acquiring buffers as necessary
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
recptr = (IDBHeaderRecordPtr) hdrbuf->IDB_record;
|
|
Packit |
b099d7 |
hdrptr = (IDBHeaderHdrPtr) &recptr->header_hdr;
|
|
Packit |
b099d7 |
file_id->index_root = hdrptr->index_root;
|
|
Packit |
b099d7 |
file_id->num_indexed = hdrptr->num_indexed;
|
|
Packit |
b099d7 |
file_id->num_RID = hdrptr->num_RID;
|
|
Packit |
b099d7 |
file_id->next_RID = hdrptr->next_RID;
|
|
Packit |
b099d7 |
file_id->last_record = hdrptr->last_record;
|
|
Packit |
b099d7 |
file_id->last_data_record = hdrptr->last_data_record;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for ( ndx=IDBrtMin ; ndx<=IDBrtMax ; ndx++ )
|
|
Packit |
b099d7 |
file_id->rt_counts[ndx] = hdrptr->rt_counts[ndx];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for ( ndx=URMgMin ; ndx<=URMgMax ; ndx++ )
|
|
Packit |
b099d7 |
file_id->group_counts[ndx] = hdrptr->group_counts[ndx];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
strcpy (file_id->db_version, hdrptr->db_version);
|
|
Packit |
b099d7 |
strcpy (file_id->creator, hdrptr->creator);
|
|
Packit |
b099d7 |
strcpy (file_id->creator_version, hdrptr->creator_version);
|
|
Packit |
b099d7 |
strcpy (file_id->creation_date, hdrptr->creation_date);
|
|
Packit |
b099d7 |
strcpy (file_id->module, hdrptr->module);
|
|
Packit |
b099d7 |
strcpy (file_id->module_version, hdrptr->module_version);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Header successfully read. Leave the buffer committed in case data
|
|
Packit |
b099d7 |
* will be read from it.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Compare version in header against compiled-in version, flagging
|
|
Packit |
b099d7 |
* mismatch if found.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if (sscanf(hdrptr->db_version, "URM %d.%d", &file_major, &file_minor) != 2)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
sprintf(errmsg, _MrmMMsg_0117, hdrptr->db_version);
|
|
Packit |
b099d7 |
return Urm__UT_Error ("Idb__HDR_GetHeader", errmsg,
|
|
Packit |
b099d7 |
file_id, NULL, MrmNOT_VALID);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* sscanf() may call ungetc(), which would write the XmConst string. */
|
|
Packit |
b099d7 |
char *buf = XtMalloc(strlen(idb__database_version) + 1);
|
|
Packit |
b099d7 |
strcpy(buf, idb__database_version);
|
|
Packit |
b099d7 |
sscanf(buf, "URM %d.%d", &db_major, &db_minor);
|
|
Packit |
b099d7 |
XtFree(buf);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((file_major > db_major) ||
|
|
Packit |
b099d7 |
((file_major == db_major) && (file_minor > db_minor)))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
sprintf (errmsg, _MrmMMsg_0011, hdrptr->db_version, idb__database_version);
|
|
Packit |
b099d7 |
return Urm__UT_Error ("Idb__HDR_GetHeader", errmsg,
|
|
Packit |
b099d7 |
file_id, NULL, MrmNOT_VALID);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (db_major > file_major)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
sprintf(errmsg, _MrmMMsg_0118, idb__database_version, hdrptr->db_version);
|
|
Packit |
b099d7 |
return Urm__UT_Error ("Idb__HDR_GetHeader", errmsg,
|
|
Packit |
b099d7 |
file_id, NULL, MrmNOT_VALID);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return MrmSUCCESS;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
*++
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* PROCEDURE DESCRIPTION:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Idb__HDR_InitHeader initializes a header record for a new file. The
|
|
Packit |
b099d7 |
* information in the routine arguments is combined with information
|
|
Packit |
b099d7 |
* derived by the routine (database version, dates and times) and
|
|
Packit |
b099d7 |
* written into the file header record. Then the buffer is
|
|
Packit |
b099d7 |
* decommitted.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FORMAL PARAMETERS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* creator Creator id for the file
|
|
Packit |
b099d7 |
* creator_version Creator version string
|
|
Packit |
b099d7 |
* module Module id for the file
|
|
Packit |
b099d7 |
* module_version Module version string
|
|
Packit |
b099d7 |
* file_id To return new in-memory file header for the file.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT INPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT OUTPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FUNCTION VALUE:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* MrmSUCCESS operation succeeded
|
|
Packit |
b099d7 |
* MrmFAILURE some other failure
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SIDE EFFECTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*--
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Cardinal
|
|
Packit |
b099d7 |
Idb__HDR_InitHeader (IDBFile file_id,
|
|
Packit |
b099d7 |
String creator,
|
|
Packit |
b099d7 |
String creator_version,
|
|
Packit |
b099d7 |
String module,
|
|
Packit |
b099d7 |
String module_version)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Local variables
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
Cardinal result; /* function results */
|
|
Packit |
b099d7 |
IDBRecordBufferPtr hdrbuf; /* header record buffer */
|
|
Packit |
b099d7 |
IDBHeaderRecordPtr recptr; /* header record in buffer */
|
|
Packit |
b099d7 |
IDBHeaderHdrPtr hdrptr; /* record header */
|
|
Packit |
b099d7 |
int ndx; /* loop index */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Acquire a buffer for the header, initialize it, and set pointers
|
|
Packit |
b099d7 |
* into it.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
result = Idb__BM_InitRecord (file_id, IDBHeaderRecordNumber,
|
|
Packit |
b099d7 |
IDBrtHeader, &hdrbuf);
|
|
Packit |
b099d7 |
if ( result != MrmSUCCESS ) return result;
|
|
Packit |
b099d7 |
recptr = (IDBHeaderRecordPtr) hdrbuf->IDB_record;
|
|
Packit |
b099d7 |
hdrptr = (IDBHeaderHdrPtr) &recptr->header_hdr;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Initialize the record contents, first the ones which occur only in
|
|
Packit |
b099d7 |
* the file header, then those in common with the in-memory file struct.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
strcpy ( hdrptr->db_version, "" );
|
|
Packit |
b099d7 |
strncat (hdrptr->db_version, idb__database_version, IDBhsVersion);
|
|
Packit |
b099d7 |
strcpy ( hdrptr->creator, "" );
|
|
Packit |
b099d7 |
strncat (hdrptr->creator, creator, IDBhsCreator);
|
|
Packit |
b099d7 |
strcpy ( hdrptr->creator_version, "" );
|
|
Packit |
b099d7 |
strncat (hdrptr->creator_version, creator_version, IDBhsVersion);
|
|
Packit |
b099d7 |
Urm__UT_Time (hdrptr->creation_date);
|
|
Packit |
b099d7 |
strcpy ( hdrptr->module, "" );
|
|
Packit |
b099d7 |
strncat (hdrptr->module, module, IDBhsModule);
|
|
Packit |
b099d7 |
strcpy ( hdrptr->module_version, "" );
|
|
Packit |
b099d7 |
strncat (hdrptr->module_version, module_version, IDBhsVersion);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
hdrptr->index_root = 0;
|
|
Packit |
b099d7 |
hdrptr->num_indexed = 0;
|
|
Packit |
b099d7 |
hdrptr->num_RID = 0;
|
|
Packit |
b099d7 |
hdrptr->next_RID.internal_id.map_rec = hdrptr->header.record_num;
|
|
Packit |
b099d7 |
hdrptr->next_RID.internal_id.res_index = 0;
|
|
Packit |
b099d7 |
hdrptr->last_data_record = 0;
|
|
Packit |
b099d7 |
for ( ndx=IDBrtMin ; ndx<=IDBrtMax ; ndx++ )
|
|
Packit |
b099d7 |
hdrptr->rt_counts[ndx] = file_id->rt_counts[ndx];
|
|
Packit |
b099d7 |
for ( ndx=URMgMin ; ndx<=URMgMax ; ndx++ )
|
|
Packit |
b099d7 |
hdrptr->group_counts[ndx] = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for ( ndx=0 ; ndx
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
recptr->RID_pointers[ndx].internal_id.rec_no = 0;
|
|
Packit |
b099d7 |
recptr->RID_pointers[ndx].internal_id.item_offs = 0;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
recptr->num_entry = 0;
|
|
Packit |
b099d7 |
recptr->last_entry = 0;
|
|
Packit |
b099d7 |
recptr->free_ptr = 0;
|
|
Packit |
b099d7 |
recptr->free_count = IDBHeaderFreeMax;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Idb__BM_MarkModified (hdrbuf);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Set the file structure in memory
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
file_id->index_root = hdrptr->index_root;
|
|
Packit |
b099d7 |
file_id->num_indexed = hdrptr->num_indexed;
|
|
Packit |
b099d7 |
file_id->num_RID = hdrptr->num_RID;
|
|
Packit |
b099d7 |
file_id->next_RID = hdrptr->next_RID;
|
|
Packit |
b099d7 |
file_id->last_data_record = hdrptr->last_data_record;
|
|
Packit |
b099d7 |
for ( ndx=URMgMin ; ndx<=URMgMax ; ndx++ )
|
|
Packit |
b099d7 |
file_id->group_counts[ndx] = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Header successfully initialized
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
return MrmSUCCESS;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
*++
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* PROCEDURE DESCRIPTION:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Idb__Hdr_PutHeader copies all dynamic information from the in-memory
|
|
Packit |
b099d7 |
* file header into the on-disk file header. This routine is called
|
|
Packit |
b099d7 |
* before the final DecommitAll on a file as it is being closed. It
|
|
Packit |
b099d7 |
* is required that no information be placed in the header as a result
|
|
Packit |
b099d7 |
* of the DecommitAll; thus all header modifications take place as
|
|
Packit |
b099d7 |
* records are modified, not written.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* This routine updates the header, then decommits it.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FORMAL PARAMETERS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IDBFile file_id;
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT INPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT OUTPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FUNCTION VALUE:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* MrmSUCCESS operation succeeded
|
|
Packit |
b099d7 |
* MrmFAILURE some other failure
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SIDE EFFECTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*--
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Cardinal
|
|
Packit |
b099d7 |
Idb__HDR_PutHeader (IDBFile file_id)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Local variables
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
Cardinal result; /* function results */
|
|
Packit |
b099d7 |
IDBRecordBufferPtr hdrbuf; /* header record buffer */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
result = Idb__HDR_UpdateHeader (file_id, &hdrbuf);
|
|
Packit |
b099d7 |
if ( result != MrmSUCCESS ) return result;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Header successfully written
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
return Idb__BM_Decommit (hdrbuf);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
*++
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* PROCEDURE DESCRIPTION:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Idb__Hdr_UpdateHeader copies all dynamic information from the
|
|
Packit |
b099d7 |
* in-memory file header into the on-disk file header.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FORMAL PARAMETERS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* file_id Open IDB file
|
|
Packit |
b099d7 |
* buffer To return pointer to buffer containing header record
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT INPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT OUTPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FUNCTION VALUE:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* MrmSUCCESS operation succeeded
|
|
Packit |
b099d7 |
* MrmBAD_RECORD not the header record
|
|
Packit |
b099d7 |
* MrmFAILURE some other failure
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SIDE EFFECTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*--
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Cardinal
|
|
Packit |
b099d7 |
Idb__HDR_UpdateHeader (IDBFile file_id,
|
|
Packit |
b099d7 |
IDBRecordBufferPtr *buffer)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Local variables
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
Cardinal result; /* function results */
|
|
Packit |
b099d7 |
IDBHeaderRecordPtr recptr; /* header record in buffer */
|
|
Packit |
b099d7 |
IDBHeaderHdrPtr hdrptr; /* record header */
|
|
Packit |
b099d7 |
int ndx; /* loop index */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Get the header record
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
result = Idb__BM_GetRecord (file_id, IDBHeaderRecordNumber, buffer);
|
|
Packit |
b099d7 |
if ( result != MrmSUCCESS ) return result;
|
|
Packit |
b099d7 |
if ( ! Idb__HDR_ValidRecord(*buffer) )
|
|
Packit |
b099d7 |
return Urm__UT_Error("Idb__HDR_PutHeader", _MrmMMsg_0010,
|
|
Packit |
b099d7 |
file_id, NULL, MrmBAD_RECORD);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Set up pointers into the record, then copy from the memory structure
|
|
Packit |
b099d7 |
* into it.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
recptr = (IDBHeaderRecordPtr) (*buffer)->IDB_record;
|
|
Packit |
b099d7 |
hdrptr = (IDBHeaderHdrPtr) &recptr->header_hdr;
|
|
Packit |
b099d7 |
hdrptr->index_root = file_id->index_root;
|
|
Packit |
b099d7 |
hdrptr->num_indexed = file_id->num_indexed;
|
|
Packit |
b099d7 |
hdrptr->num_RID = file_id->num_RID;
|
|
Packit |
b099d7 |
hdrptr->next_RID = file_id->next_RID;
|
|
Packit |
b099d7 |
hdrptr->last_record = file_id->last_record;
|
|
Packit |
b099d7 |
hdrptr->last_data_record = file_id->last_data_record;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for ( ndx=IDBrtMin ; ndx<=IDBrtMax ; ndx++ )
|
|
Packit |
b099d7 |
hdrptr->rt_counts[ndx] = file_id->rt_counts[ndx];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for ( ndx=URMgMin ; ndx<=URMgMax ; ndx++ )
|
|
Packit |
b099d7 |
hdrptr->group_counts[ndx] = file_id->group_counts[ndx];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Header successfully written
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
Idb__BM_MarkModified (*buffer);
|
|
Packit |
b099d7 |
return MrmSUCCESS;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
*++
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* PROCEDURE DESCRIPTION:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Idb__HDR_EnterItem is the analog of Idb__RID_EnterItem for entering
|
|
Packit |
b099d7 |
* a resource id in the header record.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FORMAL PARAMETERS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* file_id Open IDB file in which to write entry
|
|
Packit |
b099d7 |
* resource_id Resource ID under which to enter entry
|
|
Packit |
b099d7 |
* data_entry Data entry pointer for data
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT INPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT OUTPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FUNCTION VALUE:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* MrmSUCCESS operation succeeded
|
|
Packit |
b099d7 |
* MrmFAILURE some other failure
|
|
Packit |
b099d7 |
* MrmOUT_OF_RANGE Record number out of range
|
|
Packit |
b099d7 |
* MrmBAD_RECORD not the header record
|
|
Packit |
b099d7 |
* URMBadDataindex Data index out of range
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SIDE EFFECTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*--
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Cardinal
|
|
Packit |
b099d7 |
Idb__HDR_EnterItem (IDBFile file_id,
|
|
Packit |
b099d7 |
IDBResource resource_id,
|
|
Packit |
b099d7 |
IDBDataHandle data_entry)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Local variables
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
Cardinal result; /* function results */
|
|
Packit |
b099d7 |
IDBRecordBufferPtr bufptr; /* header record buffer */
|
|
Packit |
b099d7 |
IDBHeaderRecordPtr recptr; /* header record in buffer */
|
|
Packit |
b099d7 |
IDBridDesc resid; /* CAST resource id */
|
|
Packit |
b099d7 |
IDBResourceIndex resndx; /* to check resource index */
|
|
Packit |
b099d7 |
IDBRecordNumber recno; /* Map record record number */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Get the header record.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
resid.external_id = resource_id;
|
|
Packit |
b099d7 |
recno = resid.internal_id.map_rec;
|
|
Packit |
b099d7 |
resndx = resid.internal_id.res_index;
|
|
Packit |
b099d7 |
if ( recno != IDBHeaderRecordNumber )
|
|
Packit |
b099d7 |
return Urm__UT_Error("Idb__HDR_EnterItem", _MrmMMsg_0012,
|
|
Packit |
b099d7 |
file_id, NULL, MrmOUT_OF_RANGE);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
result = Idb__BM_GetRecord (file_id, recno, &bufptr);
|
|
Packit |
b099d7 |
if ( result != MrmSUCCESS ) return result;
|
|
Packit |
b099d7 |
if ( ! Idb__HDR_ValidRecord(bufptr) )
|
|
Packit |
b099d7 |
return Urm__UT_Error("Idb__HDR_EnterItem", _MrmMMsg_0010,
|
|
Packit |
b099d7 |
file_id, NULL, MrmBAD_RECORD);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
recptr = (IDBHeaderRecordPtr) bufptr->IDB_record;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Set the data item.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if ( resndx >= IDBHeaderRIDMax )
|
|
Packit |
b099d7 |
return Urm__UT_Error("Idb__HDR_EnterItem", _MrmMMsg_0013,
|
|
Packit |
b099d7 |
file_id, NULL, MrmBAD_DATA_INDEX);
|
|
Packit |
b099d7 |
recptr->RID_pointers[resndx].internal_id.rec_no = data_entry.rec_no;
|
|
Packit |
b099d7 |
recptr->RID_pointers[resndx].internal_id.item_offs = data_entry.item_offs;
|
|
Packit |
b099d7 |
Idb__BM_MarkActivity (bufptr);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* successful entry
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
Idb__BM_MarkModified (bufptr);
|
|
Packit |
b099d7 |
return MrmSUCCESS;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
*++
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* PROCEDURE DESCRIPTION:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Idb__HDR_ReturnItem returns the data entry pointer for an item
|
|
Packit |
b099d7 |
* entered under a resource ID maintained in the header record. It
|
|
Packit |
b099d7 |
* is an analog of Idb__RID_ReturnItem.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FORMAL PARAMETERS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* file_id Open IDB file in which to write entry
|
|
Packit |
b099d7 |
* resource_id Entry's resource id
|
|
Packit |
b099d7 |
* signal_null if TRUE, signal error on null data entry
|
|
Packit |
b099d7 |
* entry_return To return data pointer for data
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT INPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT OUTPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FUNCTION VALUE:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* MrmSUCCESS operation succeeded
|
|
Packit |
b099d7 |
* MrmOUT_OF_RANGE Record number out of range
|
|
Packit |
b099d7 |
* MrmBAD_RECORD not the data record
|
|
Packit |
b099d7 |
* MrmNULL_DATA no data for resource id
|
|
Packit |
b099d7 |
* MrmFAILURE some other failure
|
|
Packit |
b099d7 |
* URMBadDataindex Data index out of range
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SIDE EFFECTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*--
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Cardinal
|
|
Packit |
b099d7 |
Idb__HDR_ReturnItem (IDBFile file_id,
|
|
Packit |
b099d7 |
IDBResource resource_id,
|
|
Packit |
b099d7 |
Boolean signal_null,
|
|
Packit |
b099d7 |
IDBDataHandle *entry_return)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Local variables
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
Cardinal result; /* function results */
|
|
Packit |
b099d7 |
IDBRecordBufferPtr bufptr; /* RID map record buffer */
|
|
Packit |
b099d7 |
IDBHeaderRecordPtr recptr; /* RID map record in buffer */
|
|
Packit |
b099d7 |
IDBridDesc resid; /* CAST resource id */
|
|
Packit |
b099d7 |
IDBResourceIndex resndx; /* to check resource index */
|
|
Packit |
b099d7 |
IDBRecordNumber recno; /* Map record record number */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Get the header record
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
resid.external_id = resource_id;
|
|
Packit |
b099d7 |
recno = resid.internal_id.map_rec;
|
|
Packit |
b099d7 |
resndx = resid.internal_id.res_index;
|
|
Packit |
b099d7 |
if ( recno != IDBHeaderRecordNumber )
|
|
Packit |
b099d7 |
return Urm__UT_Error("Idb__HDR_ReturnItem", _MrmMMsg_0012,
|
|
Packit |
b099d7 |
file_id, NULL, MrmOUT_OF_RANGE);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
result = Idb__BM_GetRecord (file_id, recno, &bufptr);
|
|
Packit |
b099d7 |
if ( result != MrmSUCCESS ) return result;
|
|
Packit |
b099d7 |
if ( ! Idb__HDR_ValidRecord(bufptr) )
|
|
Packit |
b099d7 |
return Urm__UT_Error("Idb__HDR_ReturnItem", _MrmMMsg_0010,
|
|
Packit |
b099d7 |
file_id, NULL, MrmBAD_RECORD);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
recptr = (IDBHeaderRecordPtr) bufptr->IDB_record;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Retrieve the data item.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if ( resndx >= IDBHeaderRIDMax )
|
|
Packit |
b099d7 |
return Urm__UT_Error("Idb__HDR_ReturnItem", _MrmMMsg_0013,
|
|
Packit |
b099d7 |
file_id, NULL, MrmBAD_DATA_INDEX);
|
|
Packit |
b099d7 |
if (( recptr->RID_pointers[resndx].internal_id.rec_no == 0) &&
|
|
Packit |
b099d7 |
( recptr->RID_pointers[resndx].internal_id.item_offs == 0))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if ( signal_null )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return Urm__UT_Error("Idb__HDR_ReturnItem", _MrmMMsg_0014,
|
|
Packit |
b099d7 |
file_id, NULL, MrmNULL_DATA);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return MrmNULL_DATA;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
entry_return->rec_no = recptr->RID_pointers[resndx].internal_id.rec_no;
|
|
Packit |
b099d7 |
entry_return->item_offs = recptr->RID_pointers[resndx].internal_id.item_offs;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Successful retrieval
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
Idb__BM_MarkActivity (bufptr);
|
|
Packit |
b099d7 |
return MrmSUCCESS;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
*++
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* PROCEDURE DESCRIPTION:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Idb__HDR_NextRID returns the next available resource ID in the
|
|
Packit |
b099d7 |
* header record, if there is one. It is an analog of Idb__RID_NextRID,
|
|
Packit |
b099d7 |
* and serves it.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FORMAL PARAMETERS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* file_id Open IDB file in which to write entry
|
|
Packit |
b099d7 |
* res_id_return To return new resource id
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT INPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT OUTPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FUNCTION VALUE:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* MrmSUCCESS operation succeeded
|
|
Packit |
b099d7 |
* MrmBAD_RECORD not the header record
|
|
Packit |
b099d7 |
* MrmFAILURE some other failure. Use an RID record.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SIDE EFFECTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*--
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Cardinal
|
|
Packit |
b099d7 |
Idb__HDR_NextRID (IDBFile file_id,
|
|
Packit |
b099d7 |
IDBResource *res_id_return)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Local variables
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
IDBResourceIndex resndx; /* to check resource index */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* use the next available ID, or fail.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
resndx = file_id->next_RID.internal_id.res_index;
|
|
Packit |
b099d7 |
if ( file_id->next_RID.internal_id.map_rec != IDBHeaderRecordNumber )
|
|
Packit |
b099d7 |
return Urm__UT_Error("Idb__HDR_NextRID", _MrmMMsg_0012,
|
|
Packit |
b099d7 |
file_id, NULL, MrmBAD_RECORD);
|
|
Packit |
b099d7 |
if ( resndx >= IDBHeaderRIDMax )
|
|
Packit |
b099d7 |
return MrmFAILURE;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Increment resource index, returning current value.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
*res_id_return = (IDBResource) file_id->next_RID.external_id;
|
|
Packit |
b099d7 |
file_id->next_RID.internal_id.res_index++;
|
|
Packit |
b099d7 |
return MrmSUCCESS;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
*++
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* PROCEDURE DESCRIPTION:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Idb__HDR_GetDataEntry is the analog to Idb__HDR_GetDataEntry for
|
|
Packit |
b099d7 |
* retrieving data entries from the header record.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FORMAL PARAMETERS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* file_id Open ID file
|
|
Packit |
b099d7 |
* data_entry Data entry to be fetched
|
|
Packit |
b099d7 |
* context_id To receive data block for data entry
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT INPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT OUTPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FUNCTION VALUE:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* MrmSUCCESS operation succeeded
|
|
Packit |
b099d7 |
* MrmBAD_RECORD not the header record
|
|
Packit |
b099d7 |
* MrmFAILURE some other failure
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SIDE EFFECTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*--
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Cardinal
|
|
Packit |
b099d7 |
Idb__HDR_GetDataEntry (IDBFile file_id,
|
|
Packit |
b099d7 |
IDBDataHandle data_entry,
|
|
Packit |
b099d7 |
URMResourceContextPtr context_id)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Local variables
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
Cardinal result; /* return status */
|
|
Packit |
b099d7 |
IDBRecordNumber record_number; /* Record to be read in */
|
|
Packit |
b099d7 |
IDBDataEntryHdrPtr datahdr; /* Header part of entry */
|
|
Packit |
b099d7 |
IDBSimpleDataPtr sim_data; /* Simple data entry */
|
|
Packit |
b099d7 |
IDBHeaderRecordPtr recptr; /* pointer data record */
|
|
Packit |
b099d7 |
IDBRecordBufferPtr bufptr; /* temp buffer for record */
|
|
Packit |
b099d7 |
char *buff_ptr; /* ptr into context buffer */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Check and see if the context is valid
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if (! UrmRCValid (context_id))
|
|
Packit |
b099d7 |
return Urm__UT_Error("Idb__HDR_GetDataEntry", _MrmMMsg_0006,
|
|
Packit |
b099d7 |
NULL, NULL, MrmBAD_CONTEXT);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Make the data entry accessible as a data pointer.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
record_number = data_entry.rec_no;
|
|
Packit |
b099d7 |
if ( record_number != IDBHeaderRecordNumber )
|
|
Packit |
b099d7 |
return Urm__UT_Error("Idb__HDR_GetDataEntry", _MrmMMsg_0012,
|
|
Packit |
b099d7 |
NULL, NULL, MrmBAD_RECORD);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Get the record that contains this data, get to the correct offset in
|
|
Packit |
b099d7 |
* that record.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
result = Idb__BM_GetRecord (file_id, record_number, &bufptr);
|
|
Packit |
b099d7 |
if ( result != MrmSUCCESS ) return result;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Point to the header in the data entry, set the context data. The context
|
|
Packit |
b099d7 |
* is resized if necessary. Note that all context info except the
|
|
Packit |
b099d7 |
* actual data can be set now regardless of the entry type.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
recptr = (IDBHeaderRecordPtr) bufptr->IDB_record;
|
|
Packit |
b099d7 |
datahdr =
|
|
Packit |
b099d7 |
(IDBDataEntryHdrPtr) &recptr->data[data_entry.item_offs];
|
|
Packit |
b099d7 |
if ((datahdr->validation != IDBDataEntryValid) && ( file_id->byte_swapped ))
|
|
Packit |
b099d7 |
SwapIDBDataEntryHdr(datahdr) ;
|
|
Packit |
b099d7 |
if (datahdr->validation != IDBDataEntryValid)
|
|
Packit |
b099d7 |
return Urm__UT_Error("Idb__HDR_GetDataEntry", _MrmMMsg_0007,
|
|
Packit |
b099d7 |
NULL, context_id, MrmNOT_VALID);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ( datahdr->entry_size > UrmRCSize(context_id) )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
result = UrmResizeResourceContext (context_id, datahdr->entry_size);
|
|
Packit |
b099d7 |
if ( result != MrmSUCCESS ) return result;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
UrmRCSetSize (context_id, datahdr->entry_size);
|
|
Packit |
b099d7 |
UrmRCSetGroup (context_id, datahdr->resource_group);
|
|
Packit |
b099d7 |
UrmRCSetType (context_id, datahdr->resource_type);
|
|
Packit |
b099d7 |
UrmRCSetAccess (context_id, datahdr->access);
|
|
Packit |
b099d7 |
UrmRCSetLock (context_id, datahdr->lock);
|
|
Packit |
b099d7 |
UrmRCSetByteSwap (context_id, file_id->byte_swapped) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Read the data into the context. It must always be a simple type in
|
|
Packit |
b099d7 |
* the header record.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
buff_ptr = (char *) UrmRCBuffer(context_id);
|
|
Packit |
b099d7 |
switch ( datahdr->entry_type )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
case IDBdrSimple:
|
|
Packit |
b099d7 |
sim_data = (IDBSimpleDataPtr) datahdr;
|
|
Packit |
b099d7 |
UrmBCopy (sim_data->data, buff_ptr, datahdr->entry_size);
|
|
Packit |
b099d7 |
return MrmSUCCESS;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case IDBdrOverflow:
|
|
Packit |
b099d7 |
return Urm__UT_Error("Idb__HDR_GetDAtaEntry", _MrmMMsg_0015,
|
|
Packit |
b099d7 |
file_id, NULL, MrmFAILURE);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
return Urm__UT_Error("Idb__HDR_GetDataEntry", _MrmMMsg_0009,
|
|
Packit |
b099d7 |
NULL, context_id, MrmFAILURE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
*++
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* PROCEDURE DESCRIPTION:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Idb_DB_PutDataEntry stores the resource described in the resource
|
|
Packit |
b099d7 |
* context into the database, returning the resulting data entry pointer.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FORMAL PARAMETERS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* file_id Open IDB file
|
|
Packit |
b099d7 |
* context_id contains data block to be stored
|
|
Packit |
b099d7 |
* one_entry To return data entry for newly stored entry
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT INPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT OUTPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FUNCTION VALUE:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* MrmSUCCESS operation succeeded
|
|
Packit |
b099d7 |
* MrmFAILURE some other failure
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SIDE EFFECTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*--
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Cardinal
|
|
Packit |
b099d7 |
Idb__HDR_PutDataEntry (IDBFile file_id,
|
|
Packit |
b099d7 |
URMResourceContextPtr context_id,
|
|
Packit |
b099d7 |
IDBDataHandle *data_entry)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Local variables
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
Cardinal result; /* returned status */
|
|
Packit |
b099d7 |
IDBSimpleDataPtr simpledata; /* simple data entry ptr */
|
|
Packit |
b099d7 |
IDBHeaderRecordPtr recptr; /* pointer data record */
|
|
Packit |
b099d7 |
IDBRecordBufferPtr bufptr; /* current record buffer pointer */
|
|
Packit |
b099d7 |
int entsiz; /* Number of bytes for new entry */
|
|
Packit |
b099d7 |
MrmOffset entoffs; /* Entry offset in buffer */
|
|
Packit |
b099d7 |
char *dataptr; /* pointer to data in context */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Consistency check
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if (! UrmRCValid (context_id))
|
|
Packit |
b099d7 |
return Urm__UT_Error("Idb__HDR_PutDataEntry", _MrmMMsg_0006,
|
|
Packit |
b099d7 |
NULL, NULL, MrmBAD_CONTEXT);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Acquire the header record and pointers to it
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
result = Idb__BM_GetRecord (file_id, IDBHeaderRecordNumber, &bufptr);
|
|
Packit |
b099d7 |
if ( result != MrmSUCCESS ) return result;
|
|
Packit |
b099d7 |
recptr = (IDBHeaderRecordPtr) bufptr->IDB_record;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* See if the entry will fit. Simple failure if not, use a regular data
|
|
Packit |
b099d7 |
* record.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
entsiz = (int) (IDBSimpleDataHdrSize + UrmRCSize(context_id));
|
|
Packit |
b099d7 |
entsiz = _FULLWORD (entsiz);
|
|
Packit |
b099d7 |
if ( entsiz > (int) recptr->free_count )
|
|
Packit |
b099d7 |
return MrmFAILURE;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Acquire a simple data entry, and put this entry into it.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
entoffs = recptr->free_ptr;
|
|
Packit |
b099d7 |
simpledata = (IDBSimpleDataPtr) &recptr->data[entoffs];
|
|
Packit |
b099d7 |
simpledata->header.validation = IDBDataEntryValid;
|
|
Packit |
b099d7 |
simpledata->header.entry_type = IDBdrSimple;
|
|
Packit |
b099d7 |
simpledata->header.resource_group = UrmRCGroup(context_id);
|
|
Packit |
b099d7 |
simpledata->header.resource_type = UrmRCType(context_id);
|
|
Packit |
b099d7 |
simpledata->header.access = UrmRCAccess(context_id);
|
|
Packit |
b099d7 |
simpledata->header.entry_size = UrmRCSize(context_id);
|
|
Packit |
b099d7 |
simpledata->header.lock = UrmRCLock(context_id);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
dataptr = (char *) UrmRCBuffer(context_id);
|
|
Packit |
b099d7 |
UrmBCopy (dataptr, simpledata->data, UrmRCSize(context_id));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Set the return value to the data pointer for this entry
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
data_entry->rec_no = _IdbBufferRecordNumber (bufptr);
|
|
Packit |
b099d7 |
data_entry->item_offs = recptr->free_ptr;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Update the entry chain, mark the buffer, and return.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
simpledata->header.prev_entry = recptr->last_entry;
|
|
Packit |
b099d7 |
recptr->num_entry++;
|
|
Packit |
b099d7 |
recptr->last_entry = entoffs;
|
|
Packit |
b099d7 |
recptr->free_ptr += entsiz;
|
|
Packit |
b099d7 |
recptr->free_count -= entsiz;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Idb__BM_MarkModified (bufptr);
|
|
Packit |
b099d7 |
return MrmSUCCESS;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
*++
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* PROCEDURE DESCRIPTION:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* This routine checks if a data entry matchs a set of filters.
|
|
Packit |
b099d7 |
* It reads the record containing the header for the data entry,
|
|
Packit |
b099d7 |
* then does the filter match. If both filters are NUL, then
|
|
Packit |
b099d7 |
* the test becomes merely one of confirming the data entry
|
|
Packit |
b099d7 |
* can be read.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FORMAL PARAMETERS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* file_id Open ID file
|
|
Packit |
b099d7 |
* data_entry Data entry to be matched
|
|
Packit |
b099d7 |
* group_filter if not null, entry found must match this group
|
|
Packit |
b099d7 |
* type_filter if not null, entry found must match this type
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT INPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IMPLICIT OUTPUTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FUNCTION VALUE:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* TRUE Match is good
|
|
Packit |
b099d7 |
* FALSE match not good.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SIDE EFFECTS:
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*--
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Boolean
|
|
Packit |
b099d7 |
Idb__HDR_MatchFilter (IDBFile file_id,
|
|
Packit |
b099d7 |
IDBDataHandle data_entry,
|
|
Packit |
b099d7 |
MrmCode group_filter,
|
|
Packit |
b099d7 |
MrmCode type_filter)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Local variables
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
Cardinal result; /* return status */
|
|
Packit |
b099d7 |
IDBRecordNumber record_number; /* Record to be read in */
|
|
Packit |
b099d7 |
IDBRecordBufferPtr bufptr; /* buffer for data record */
|
|
Packit |
b099d7 |
IDBHeaderRecordPtr recptr; /* pointer data record */
|
|
Packit |
b099d7 |
IDBDataEntryHdrPtr datahdr; /* Header part of entry */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Get the header record and get to the correct offset in
|
|
Packit |
b099d7 |
* that record. Immediately decommit the buffer, since it won't be
|
|
Packit |
b099d7 |
* compromised by this read.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
record_number = data_entry.rec_no;
|
|
Packit |
b099d7 |
if ( record_number != IDBHeaderRecordNumber )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Urm__UT_Error("Idb__HDR_MatchFilter", _MrmMMsg_0012,
|
|
Packit |
b099d7 |
file_id, NULL, MrmBAD_RECORD);
|
|
Packit |
b099d7 |
return FALSE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
result = Idb__BM_GetRecord (file_id, record_number, &bufptr);
|
|
Packit |
b099d7 |
if ( result != MrmSUCCESS ) return FALSE;
|
|
Packit |
b099d7 |
Idb__BM_Decommit (bufptr);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Point to the header in the entry, and check the filters.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
recptr = (IDBHeaderRecordPtr) bufptr->IDB_record;
|
|
Packit |
b099d7 |
datahdr =
|
|
Packit |
b099d7 |
(IDBDataEntryHdrPtr) &recptr->data[data_entry.item_offs];
|
|
Packit |
b099d7 |
if (datahdr->validation != IDBDataEntryValid)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Urm__UT_Error("Idb__HDR_GetDataEntry", _MrmMMsg_0007,
|
|
Packit |
b099d7 |
NULL, NULL, MrmNOT_VALID);
|
|
Packit |
b099d7 |
return FALSE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ( group_filter!=URMgNul && group_filter!=datahdr->resource_group )
|
|
Packit |
b099d7 |
return FALSE;
|
|
Packit |
b099d7 |
if ( type_filter!=URMtNul && type_filter!=datahdr->resource_type )
|
|
Packit |
b099d7 |
return FALSE;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return TRUE;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|