Blame lib/Mrm/MrmIheader.c

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