/* * Motif * * Copyright (c) 1987-2012, The Open Group. All rights reserved. * * These libraries and programs are free software; you can * redistribute them and/or modify them under the terms of the GNU * Lesser General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) * any later version. * * These libraries and programs are distributed in the hope that * they will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public * License along with these librararies and programs; if not, write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301 USA */ /* * HISTORY */ #ifdef HAVE_CONFIG_H #include #endif #ifdef REV_INFO #ifndef lint static char rcsid[] = "$XConsortium: MrmItopw.c /main/13 1996/11/13 13:59:22 drk $" #endif #endif /* (c) Copyright 1989, 1990, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */ /* *++ * FACILITY: * * UIL Resource Manager (URM): IDB facility * * ABSTRACT: * * This module contains the publicly accessible top-level * IDB write routines. * *-- */ /* * * INCLUDE FILES * */ #include #include #include /* * * TABLE OF CONTENTS * * UrmIdbOpenFileWrite Open a file for write access * * UrmIdbPutIndexedResource Put indexed resource to file * * UrmIdbPutRIDResource Put resource id'ed resource in file * */ /* *++ * * PROCEDURE DESCRIPTION: * * IdbOpenFileWrite creates a new IDB database file, with null index * structures. This call creates the file and initializes the file * header. * * FORMAL PARAMETERS: * * name A system-dependent string specifying the IDB * file to be opened. * os_ext An operating-system specific structure which * supports using specific file system features * creator Identifies the database creator (application) * creator_version Creator version * module Identifies the UIL module * module_version Module version * file_id_return returns the IDB file id * fname_return returns the name of the file actually opened * (via strcpy). Should be at least 256 chars. * * IMPLICIT INPUTS: * * IMPLICIT OUTPUTS: * * FUNCTION VALUE: * * MrmSUCCESS operation succeeded * MrmFAILURE operation failed, no further reason * * SIDE EFFECTS: * * 1. Acquires memory for the file descriptor * *-- */ Cardinal UrmIdbOpenFileWrite (String name , MrmOsOpenParamPtr os_ext , String creator , String creator_version , String module , String module_version , IDBFile *file_id_return , char *fname_return ) { /* * Local variables */ Cardinal result ; /* function results */ IDBLowLevelFilePtr fileid ; /* low-level id for file */ IDBFile filedesc ; /* new file descriptor */ int ndx ; /* loop index */ /* * An OS extension block must be present for Unix, and by default * specifies that existing files are over-written. */ MrmOsOpenParam osext ; /* to delete file on open */ osext.version = MrmOsOpenParamVersion ; osext.nam_flg.clobber_flg = TRUE ; if ( os_ext == NULL ) os_ext = &osext ; /* * Attempt to open the file. For now, pay no attention to temporary naming * issues. */ result = Idb__FU_OpenFile(name, URMWriteAccess, os_ext, &fileid, fname_return); if ( result != MrmCREATE_NEW ) return result ; /* * File successfully opened. Acquire a file descriptor and initialize it. */ filedesc = (IDBFile) XtMalloc (sizeof(IDBOpenFile)) ; filedesc->validation = IDBOpenFileValid ; filedesc->access = URMWriteAccess ; filedesc->lowlevel_id = fileid ; filedesc->last_record = 0 ; filedesc->last_data_record = 0 ; filedesc->get_count = 0 ; filedesc->put_count = 0 ; filedesc->byte_swapped = FALSE ; filedesc->in_memory = FALSE ; filedesc->uid_buffer = NULL ; for ( ndx=IDBrtMin ; ndx<=IDBrtMax ; ndx++ ) filedesc->rt_counts[ndx] = 0 ; /* * Make sure all variables are initialized that aren't initialized elsewhere */ filedesc->index_root = 0; filedesc->timer = 0; filedesc->class_ctable = (UidCompressionTablePtr)NULL; filedesc->resource_ctable = (UidCompressionTablePtr)NULL; filedesc->user1 = 0; filedesc->user2 = 0; for ( ndx=0 ; ndx<=IDBhsVersion ; ndx++ ) { filedesc->db_version[ndx] = 0 ; filedesc->creator_version[ndx] = 0 ; filedesc->module_version[ndx] = 0 ; }; for ( ndx=0 ; ndx<=IDBhsCreator ; ndx++ ) filedesc->creator[ndx] = 0 ; for ( ndx=0 ; ndx<=IDBhsDate ; ndx++ ) filedesc->creation_date[ndx] = 0 ; for ( ndx=0 ; ndx<=IDBhsModule ; ndx++ ) filedesc->module[ndx] = 0 ; /* * Write a new file header for this file */ result = Idb__HDR_InitHeader (filedesc, creator, creator_version, module, module_version) ; if ( result != MrmSUCCESS ) { UrmIdbCloseFile (filedesc, TRUE) ; return result ; } /* * File successfully opened */ *file_id_return = filedesc ; return MrmSUCCESS ; } /* *++ * * PROCEDURE DESCRIPTION: * * IdbPutIndexedResource creates a resource record holding the * group, type, and resource data in the resource context, and saves it * under the given index. The group and type must not be null, and the * index must not be currently entered in the database index. The * resource record is marked public or private depending on the value * of the access parameter. * * FORMAL PARAMETERS: * * file_id The IDB file id returned by IdbOpenFile * index case-sensitive index for the new entry, must * not match any existing entry * context_id URM resource context containing data block * for entry * * IMPLICIT INPUTS: * * IMPLICIT OUTPUTS: * * FUNCTION VALUE: * * MrmSUCCESS operation succeeded * MrmEXISTS operation failed, index already exists * MrmNUL_GROUP operation failed, null group parameter * MrmNUL_TYPE operation failed, null type parameter * MrmFAILURE operation failed, no further reason * * SIDE EFFECTS: * *-- */ Cardinal UrmIdbPutIndexedResource (IDBFile file_id, String index, URMResourceContextPtr context_id) { /* * Local variables */ Cardinal result ; /* function results */ IDBRecordBufferPtr bufptr ; /* not used */ MrmCount recno ; /* not used */ IDBDataHandle data_entry ; /* return new data entry */ MrmCode group ; /* the entry's group code */ if ( (result=Idb__FIL_Valid(file_id)) != MrmSUCCESS ) return result ; /* * Validity check on group and type, and make sure entry doesn't * currently exist. */ if ( UrmRCGroup(context_id) == URMgNul ) return MrmNUL_GROUP ; if ( UrmRCType(context_id) == URMtNul) return MrmNUL_TYPE ; result = Idb__INX_FindIndex (file_id, index, &bufptr, &recno) ; if ( result == MrmSUCCESS) return MrmEXISTS ; /* * Create the data entry for this item */ result = Idb__DB_PutDataEntry (file_id, context_id, &data_entry) ; if ( result != MrmSUCCESS ) return result ; /* * Enter the data entry under the index */ result = Idb__INX_EnterItem (file_id, index, data_entry) ; if ( result != MrmSUCCESS ) return result ; file_id->num_indexed++ ; group = UrmRCGroup (context_id) ; if ( group>=URMgMin && group<=URMgMax ) file_id->group_counts[group]++ ; /* * item successfully entered */ return MrmSUCCESS ; } /* *++ * * PROCEDURE DESCRIPTION: * * IdbPutRIDResource creates a resource record holding the group, type, * and resource data, and saves under the given resource id. The group * and type must not be null, and the resource must currently have no * resource record associated with it. Access is always URMaPrivate * regardless of the data context access field. * * FORMAL PARAMETERS: * * file_id The IDB file id returned by IdbOpenFile * resource_id resource id for the new entry, should * currently have no existing resource record * context_id URM resource context holding data block. * * IMPLICIT INPUTS: * * IMPLICIT OUTPUTS: * * FUNCTION VALUE: * * MrmSUCCESS operation succeeded * MrmEXISTS operation failed, index already exists * MrmNUL_GROUP operation failed, null group parameter * MrmNUL_TYPE operation failed, null type parameter * MrmFAILURE operation failed, no further reason * * SIDE EFFECTS: * *-- */ Cardinal UrmIdbPutRIDResource (IDBFile file_id , MrmResource_id resource_id , URMResourceContextPtr context_id ) { /* * Local variables */ Cardinal result ; /* function results */ IDBDataHandle data_entry ; /* new data entry */ MrmCode group ; /* the entry's group code */ if ( (result=Idb__FIL_Valid(file_id)) != MrmSUCCESS ) return result ; /* * Validity check on group and type, and make sure entry doesn't * currently exist. */ if ( UrmRCGroup(context_id) == URMgNul ) return MrmNUL_GROUP ; if ( UrmRCType(context_id) == URMtNul) return MrmNUL_TYPE ; result = Idb__RID_ReturnItem (file_id, resource_id, FALSE, &data_entry) ; if ( result == MrmSUCCESS) return MrmEXISTS ; /* * Create the data entry for this item */ result = Idb__DB_PutDataEntry (file_id, context_id, &data_entry) ; if ( result != MrmSUCCESS ) return result ; /* * Enter the data entry under the resource id */ result = Idb__RID_EnterItem (file_id, resource_id, data_entry) ; if ( result != MrmSUCCESS ) return result ; file_id->num_RID++ ; group = UrmRCGroup (context_id) ; if ( group>=URMgMin && group<=URMgMax ) file_id->group_counts[group]++ ; /* * item successfully entered */ return MrmSUCCESS ; }