Blame lib/Mrm/MrmItopw.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: MrmItopw.c /main/13 1996/11/13 13:59:22 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
 *  FACILITY:
Packit b099d7
 *
Packit b099d7
 *      UIL Resource Manager (URM): IDB facility
Packit b099d7
 *
Packit b099d7
 *  ABSTRACT:
Packit b099d7
 *
Packit b099d7
 *      This module contains the publicly accessible top-level 
Packit b099d7
 *	IDB write routines.
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 <Mrm/MrmAppl.h>
Packit b099d7
#include <Mrm/Mrm.h>
Packit b099d7
#include <Mrm/IDB.h>
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *
Packit b099d7
 *  TABLE OF CONTENTS
Packit b099d7
 *
Packit b099d7
 *	UrmIdbOpenFileWrite		Open a file for write access
Packit b099d7
 *
Packit b099d7
 *	UrmIdbPutIndexedResource		Put indexed resource to file
Packit b099d7
 *
Packit b099d7
 *	UrmIdbPutRIDResource		Put resource id'ed resource in file
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	IdbOpenFileWrite creates a new IDB database file, with null index
Packit b099d7
 *	structures. This call creates the file and initializes the file
Packit b099d7
 *	header.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	name			A system-dependent string specifying the IDB
Packit b099d7
 *				file to be opened.
Packit b099d7
 *	os_ext			An operating-system specific structure which
Packit b099d7
 *				supports using specific file system features
Packit b099d7
 *	creator			Identifies the database creator (application)
Packit b099d7
 *	creator_version		Creator version
Packit b099d7
 *	module			Identifies the UIL module
Packit b099d7
 *	module_version		Module version
Packit b099d7
 *	file_id_return		returns the IDB file id
Packit b099d7
 *	fname_return		returns the name of the file actually opened
Packit b099d7
 *				(via strcpy). Should be at least 256 chars.
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	operation failed, no further reason
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *      1. Acquires memory for the file descriptor
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
UrmIdbOpenFileWrite (String			name ,
Packit b099d7
		     MrmOsOpenParamPtr		os_ext ,
Packit b099d7
		     String			creator ,
Packit b099d7
		     String			creator_version ,
Packit b099d7
		     String			module ,
Packit b099d7
		     String			module_version ,
Packit b099d7
		     IDBFile			*file_id_return ,
Packit b099d7
		     char			*fname_return )
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result ;	/* function results */
Packit b099d7
  IDBLowLevelFilePtr	fileid ;	/* low-level id for file */
Packit b099d7
  IDBFile		filedesc ;	/* new file descriptor */
Packit b099d7
  int			ndx ;		/* loop index */
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * An OS extension block must be present for Unix, and by default
Packit b099d7
   * specifies that existing files are over-written.
Packit b099d7
   */
Packit b099d7
  MrmOsOpenParam	osext ;		/* to delete file on open */
Packit b099d7
Packit b099d7
  osext.version = MrmOsOpenParamVersion ;
Packit b099d7
  osext.nam_flg.clobber_flg = TRUE ;
Packit b099d7
  if ( os_ext == NULL ) os_ext = &osext ;
Packit b099d7
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Attempt to open the file. For now, pay no attention to temporary naming
Packit b099d7
   * issues.
Packit b099d7
   */
Packit b099d7
  result = 
Packit b099d7
    Idb__FU_OpenFile(name, URMWriteAccess, os_ext, &fileid, fname_return);
Packit b099d7
  if ( result != MrmCREATE_NEW ) return result ;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * File successfully opened. Acquire a file descriptor and initialize it.
Packit b099d7
   */
Packit b099d7
  filedesc = (IDBFile) XtMalloc (sizeof(IDBOpenFile)) ;
Packit b099d7
  filedesc->validation = IDBOpenFileValid ;
Packit b099d7
  filedesc->access = URMWriteAccess ;
Packit b099d7
  filedesc->lowlevel_id = fileid ;
Packit b099d7
  filedesc->last_record = 0 ;
Packit b099d7
  filedesc->last_data_record = 0 ;
Packit b099d7
  filedesc->get_count = 0 ;
Packit b099d7
  filedesc->put_count = 0 ;
Packit b099d7
  filedesc->byte_swapped = FALSE ;
Packit b099d7
  filedesc->in_memory = FALSE ;
Packit b099d7
  filedesc->uid_buffer = NULL ;
Packit b099d7
  for ( ndx=IDBrtMin ; ndx<=IDBrtMax ; ndx++ )
Packit b099d7
    filedesc->rt_counts[ndx] = 0 ;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Make sure all variables are initialized that aren't initialized elsewhere
Packit b099d7
   */
Packit b099d7
  filedesc->index_root = 0;
Packit b099d7
  filedesc->timer = 0;
Packit b099d7
  filedesc->class_ctable = (UidCompressionTablePtr)NULL;
Packit b099d7
  filedesc->resource_ctable = (UidCompressionTablePtr)NULL;
Packit b099d7
  filedesc->user1 = 0;
Packit b099d7
  filedesc->user2 = 0;
Packit b099d7
Packit b099d7
  for ( ndx=0 ; ndx<=IDBhsVersion ; ndx++ )
Packit b099d7
    {
Packit b099d7
      filedesc->db_version[ndx] = 0 ;
Packit b099d7
      filedesc->creator_version[ndx] = 0 ;
Packit b099d7
      filedesc->module_version[ndx] = 0 ;
Packit b099d7
    };
Packit b099d7
  for ( ndx=0 ; ndx<=IDBhsCreator ; ndx++ )
Packit b099d7
    filedesc->creator[ndx] = 0 ;
Packit b099d7
  for ( ndx=0 ; ndx<=IDBhsDate ; ndx++ )
Packit b099d7
    filedesc->creation_date[ndx] = 0 ;
Packit b099d7
  for ( ndx=0 ; ndx<=IDBhsModule ; ndx++ )
Packit b099d7
    filedesc->module[ndx] = 0 ;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Write a new file header for this file
Packit b099d7
   */
Packit b099d7
  result = Idb__HDR_InitHeader (filedesc, creator, creator_version,
Packit b099d7
				module, module_version) ;
Packit b099d7
  if ( result != MrmSUCCESS )
Packit b099d7
    {
Packit b099d7
      UrmIdbCloseFile (filedesc, TRUE) ;
Packit b099d7
      return result ;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * File successfully opened
Packit b099d7
   */
Packit b099d7
  *file_id_return = filedesc ;
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
 *	IdbPutIndexedResource creates a resource record holding the
Packit b099d7
 *	group, type, and resource data in the resource context, and saves it
Packit b099d7
 *	under the given index. The group and type must not be null, and the
Packit b099d7
 *	index must not be currently entered in the database index. The
Packit b099d7
 *	resource record is marked public or private depending on the value
Packit b099d7
 *	of the access parameter.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	file_id		The IDB file id returned by IdbOpenFile
Packit b099d7
 *	index		case-sensitive index for the new entry, must
Packit b099d7
 *			not match any existing entry
Packit b099d7
 *	context_id	URM resource context containing data block
Packit b099d7
 *			for 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
 *	MrmEXISTS	operation failed, index already exists
Packit b099d7
 *	MrmNUL_GROUP	operation failed, null group parameter
Packit b099d7
 *	MrmNUL_TYPE	operation failed, null type parameter
Packit b099d7
 *	MrmFAILURE	operation failed, no further reason
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
UrmIdbPutIndexedResource (IDBFile		file_id,
Packit b099d7
			  String		index,
Packit b099d7
			  URMResourceContextPtr	context_id)
Packit b099d7
Packit b099d7
{
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result ;	/* function results */
Packit b099d7
  IDBRecordBufferPtr	bufptr ;	/* not used */
Packit b099d7
  MrmCount		recno ;		/* not used */
Packit b099d7
  IDBDataHandle		data_entry ;	/* return new data entry */
Packit b099d7
  MrmCode		group ;		/* the entry's group code */
Packit b099d7
Packit b099d7
Packit b099d7
  if ( (result=Idb__FIL_Valid(file_id)) != MrmSUCCESS ) return result ;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Validity check on group and type, and make sure entry doesn't
Packit b099d7
   * currently exist.
Packit b099d7
   */
Packit b099d7
  if ( UrmRCGroup(context_id) == URMgNul ) return MrmNUL_GROUP ;
Packit b099d7
  if ( UrmRCType(context_id) == URMtNul) return MrmNUL_TYPE ;
Packit b099d7
  result = Idb__INX_FindIndex (file_id, index, &bufptr, &recno) ;
Packit b099d7
  if ( result == MrmSUCCESS) return MrmEXISTS ;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Create the data entry for this item
Packit b099d7
   */
Packit b099d7
  result = Idb__DB_PutDataEntry (file_id, context_id, &data_entry) ;
Packit b099d7
  if ( result != MrmSUCCESS ) return result ;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Enter the data entry under the index
Packit b099d7
   */
Packit b099d7
  result = Idb__INX_EnterItem (file_id, index, data_entry) ;
Packit b099d7
  if ( result != MrmSUCCESS ) return result ;
Packit b099d7
  file_id->num_indexed++ ;
Packit b099d7
Packit b099d7
  group = UrmRCGroup (context_id) ;
Packit b099d7
  if ( group>=URMgMin && group<=URMgMax )
Packit b099d7
    file_id->group_counts[group]++ ;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * item successfully entered
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
 *	IdbPutRIDResource creates a resource record holding the group, type,
Packit b099d7
 *	and resource data, and saves under the given resource id. The group
Packit b099d7
 *	and type must not be null, and the resource must currently have no
Packit b099d7
 *	resource record associated with it. Access is always URMaPrivate
Packit b099d7
 *	regardless of the data context access field.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	file_id		The IDB file id returned by IdbOpenFile
Packit b099d7
 *	resource_id	resource id for the new entry, should
Packit b099d7
 *			currently have no existing resource record
Packit b099d7
 *	context_id	URM resource context holding data block.
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
 *	MrmEXISTS	operation failed, index already exists
Packit b099d7
 *	MrmNUL_GROUP	operation failed, null group parameter
Packit b099d7
 *	MrmNUL_TYPE	operation failed, null type parameter
Packit b099d7
 *	MrmFAILURE	operation failed, no further reason
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal
Packit b099d7
UrmIdbPutRIDResource (IDBFile			file_id ,
Packit b099d7
		      MrmResource_id		resource_id ,
Packit b099d7
		      URMResourceContextPtr	context_id )
Packit b099d7
{
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result ;	/* function results */
Packit b099d7
  IDBDataHandle		data_entry ;	/* new data entry */
Packit b099d7
  MrmCode		group ;		/* the entry's group code */
Packit b099d7
Packit b099d7
Packit b099d7
  if ( (result=Idb__FIL_Valid(file_id)) != MrmSUCCESS ) return result ;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Validity check on group and type, and make sure entry doesn't
Packit b099d7
   * currently exist.
Packit b099d7
   */
Packit b099d7
  if ( UrmRCGroup(context_id) == URMgNul ) return MrmNUL_GROUP ;
Packit b099d7
  if ( UrmRCType(context_id) == URMtNul) return MrmNUL_TYPE ;
Packit b099d7
  result = Idb__RID_ReturnItem (file_id, resource_id, FALSE, &data_entry) ;
Packit b099d7
  if ( result == MrmSUCCESS) return MrmEXISTS ;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Create the data entry for this item
Packit b099d7
   */
Packit b099d7
  result = Idb__DB_PutDataEntry (file_id, context_id, &data_entry) ;
Packit b099d7
  if ( result != MrmSUCCESS ) return result ;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Enter the data entry under the resource id
Packit b099d7
   */
Packit b099d7
  result = Idb__RID_EnterItem (file_id, resource_id, data_entry) ;
Packit b099d7
  if ( result != MrmSUCCESS ) return result ;
Packit b099d7
  file_id->num_RID++ ;
Packit b099d7
Packit b099d7
  group = UrmRCGroup (context_id) ;
Packit b099d7
  if ( group>=URMgMin && group<=URMgMax )
Packit b099d7
    file_id->group_counts[group]++ ;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * item successfully entered
Packit b099d7
   */
Packit b099d7
  return MrmSUCCESS ;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7