Files correlati : Commento : - Creazione nuova cartella per contenere tutte le librerie esterne - Aggiunta nuova libreria sqlapi per interfacciare campo a vari DB git-svn-id: svn://10.65.10.50/branches/R_10_00@24149 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			374 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			374 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* Copyright (c) 1994, 2006, Oracle. All rights reserved.  */
 | 
						|
 | 
						|
/*
 | 
						|
  Author:             Tin Nguyen
 | 
						|
  Date:               02/07/94
 | 
						|
  Source documents:   "Functional Specification for C Object Interface, Object
 | 
						|
                       Management Subsystem", "Oracle C Coding Standards
 | 
						|
                       version 2.2", and the header file template
 | 
						|
  Rule sets:          the generic and .h file rule sets
 | 
						|
  Quality status:     not exited
 | 
						|
  Identification tag: [ one or more letters to identify the .h file ] 
 | 
						|
  Revision code:      [ date of the last revision of the .h file ]
 | 
						|
 | 
						|
  Note to the user of this header file:
 | 
						|
 | 
						|
    Anything in this header file that is marked private is not supported and
 | 
						|
    must not be used.  Private sections are included in the header file to 
 | 
						|
    improve internal maintenance.
 | 
						|
 | 
						|
  NAME
 | 
						|
 | 
						|
    ORID - Oracle Object Interface for Dynamic Data Access
 | 
						|
 | 
						|
  DESCRIPTION
 | 
						|
 | 
						|
    This file contains declarations for C object interface functions including
 | 
						|
    the dynamic object data access operations that allow callers to dynamically
 | 
						|
    access and manipulate objects; these operations include getting and setting
 | 
						|
    attributes of an object.  These dynamic object operations are for accessing
 | 
						|
    and manipulation objects whose types are not known at compile-time.
 | 
						|
 | 
						|
  RELATED DOCUMENTS
 | 
						|
  
 | 
						|
     Functional Specification for C Object Interface / Object Management System
 | 
						|
 | 
						|
  PUBLIC FUNCTIONS
 | 
						|
 | 
						|
    OCIObjectSetAttr - ORID SET attribute value
 | 
						|
    OCIObjectGetAttr - ORID GET attribute value
 | 
						|
 | 
						|
  PRIVATE FUNCTIONS
 | 
						|
 | 
						|
    None
 | 
						|
 | 
						|
  EXAMPLES 
 | 
						|
 | 
						|
    EXAMPLE 1
 | 
						|
 | 
						|
    /o
 | 
						|
     o This example illustrates how an interative program can use the dynamic
 | 
						|
     o attribute access to display and modify attributes of an ADT instance.
 | 
						|
     o The interactive program does not know the type of the object at 
 | 
						|
     o compile time.
 | 
						|
     o/
 | 
						|
 | 
						|
    void display(adt_ref, object, null_struct, names, names_count, 
 | 
						|
                          names_length, indexes, indexes_count)
 | 
						|
    {
 | 
						|
      /o Pin the ADT o/
 | 
						|
      if (OCIObjectPin(env, &adt_ref, OROOPOCUR, OROOPDTRA, OROOLMNON, &adt) 
 | 
						|
            != OROSTASUC)
 | 
						|
         /o error handling code o/ 
 | 
						|
 | 
						|
      /o 
 | 
						|
       o Call the type manager to obtain all the attributes in the object.
 | 
						|
       o Display the content of each attribute in the ADT instance. If the 
 | 
						|
       o attribute is an array, display each element of the array. If the
 | 
						|
       o attribute is an ADT instance, recursively call this routine to
 | 
						|
       o display the embedded ADT instance.
 | 
						|
       o/ 
 | 
						|
      numAttrs = OCITypeAttrs(env, adt);
 | 
						|
      for (i= 1; i <= numAttrs; i++)
 | 
						|
      {
 | 
						|
         /o get attribute descriptor o/
 | 
						|
         if (ortgabp(env, adt, i, &ado_ref, &ado) != OROSTASUC)
 | 
						|
           /o error handling code o/ 
 | 
						|
 | 
						|
         /o get attribute name o/
 | 
						|
         names[names_count] = OCITypeElemName(env, ado, 
 | 
						|
                   &names_length[names_count]);
 | 
						|
      
 | 
						|
         /o dynamically get the attr o/
 | 
						|
         if (OCIObjectGetAttr(env, object, null_struct, 0, adt_ref, names, 
 | 
						|
                     names_length, names_count+1, indexes, indexes_count, 0, 
 | 
						|
                     &null, &null_info, &attr) != OROSTASUC)
 | 
						|
            /o error handling code o/  
 | 
						|
 | 
						|
         /o check if attribute is null o/
 | 
						|
         if (null) continue;
 | 
						|
 | 
						|
         /o get typecode of attribute o/
 | 
						|
         typecode = OCITypeElemTypeCode(env, ado);
 | 
						|
 | 
						|
         /o if attribute is a varray, display each element in varray o/
 | 
						|
         if (typecode == OCI_TYPECODE_VARRAY)
 | 
						|
         {
 | 
						|
            /o get the reference to the type of the element of the array o/ 
 | 
						|
            if (OCITypeElemParameterizedTyper(env, ado, &attr_type_ref) 
 | 
						|
               != OROSTASUC)
 | 
						|
               /o error handling code o/ 
 | 
						|
 | 
						|
            /o get the size of array o/
 | 
						|
            if (orlasiz(env, &attr_type_ref, (orlva *)attr,  
 | 
						|
                         &numElm) != OROSTASUC)
 | 
						|
               /o error handling code o/  
 | 
						|
 | 
						|
            /o get the typecode of the element of the array o/
 | 
						|
            if (ortty2r(env, attr_type_ref, &typecode) != OROSTASUC)
 | 
						|
               /o error handling code o/  
 | 
						|
 | 
						|
            /o iterate the array o/
 | 
						|
            for (j=0; j < numElm; j++)
 | 
						|
            {
 | 
						|
              /o get an element in the array o/
 | 
						|
              if (OCIObjectGetAttr(env, attr, null_info, j+1, attr_type_ref,
 | 
						|
                  names, names_length, 0, indexes, 0, 0, &null, &null_info, 
 | 
						|
                  &element) != OROSTASUC)
 | 
						|
                  /o error handling code o/  
 | 
						|
 | 
						|
              /o check if element is null o/
 | 
						|
              if (null) continue;
 | 
						|
 | 
						|
              /o if attr is an ADT instance, recursively call this routine o/
 | 
						|
              if (typecode == OCI_TYPECODE_ADT || typecode == 
 | 
						|
                  OCI_TYPECODE_UNNAMEDADT) 
 | 
						|
              {
 | 
						|
                /o display the element as an adt o/
 | 
						|
                display(attr_type_ref, element, null_info, names, lengths, 
 | 
						|
                   0, indexes, 0);
 | 
						|
              }
 | 
						|
      
 | 
						|
              /o if attribute is scalar, print the value to the screen o/
 | 
						|
              else output_to_screen(element, typecode);
 | 
						|
            }
 | 
						|
         }
 | 
						|
 | 
						|
         /o if attribute is an ADT instance, recursively call this routine o/
 | 
						|
         else if (typecode == OCI_TYPECODE_ADT || typecode == 
 | 
						|
              OCI_TYPECODE_UNNAMEDADT)
 | 
						|
         {
 | 
						|
            /o get the type ref of the attribute o/
 | 
						|
            if (ortgarf(env, ado, &attr_type_ref) != OROSTASUC)
 | 
						|
               /o error handling code o/ 
 | 
						|
 | 
						|
             display(attr_type_ref, attr, null_info, 0, names, 0, names_length,
 | 
						|
                      indexes, 0);
 | 
						|
         }
 | 
						|
 | 
						|
         /o if attribute is scalar, print the value to the screen o/
 | 
						|
         else output_to_screen(attr, typecode);
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    /o ******** main routine *********** o/
 | 
						|
    .... 
 | 
						|
 | 
						|
    /o 
 | 
						|
     o Allocate the arrays for storing the path expression 
 | 
						|
     o/
 | 
						|
 | 
						|
    /o get the tdo of type 'long' o/
 | 
						|
    if (orttypget(&env, con, "SYS", sizeof("SYS"), "SINT32", sizeof("SINT32"), 
 | 
						|
          OROOPDSES, &long_ref, &long_tdo) != OROSTASUC)
 | 
						|
          /o error handling code o/
 | 
						|
 | 
						|
    /o get the tdo of type 'varchar' o/
 | 
						|
    if (orttypget(&env, con, "SYS", sizeof("SYS"), "SQL_VARCHAR2", 
 | 
						|
          sizeof("SQL_VARCHAR2"), OROOPDSES, &vchar_ref, &vchar_tdo) 
 | 
						|
          != OROSTASUC)
 | 
						|
          /o error handling code o/
 | 
						|
 | 
						|
    /o allocate the varrays for the path expression o/ 
 | 
						|
    if (orlalloc(env, &vchar_ref, MAX_ARR_SIZE, &attr_names) != OROSTASUC)
 | 
						|
       /o error handling code o/ 
 | 
						|
 | 
						|
    if (orlalloc(env, &long_ref, MAX_ARR_SIZE, &attr_name_lengths) 
 | 
						|
                != OROSTASUC)
 | 
						|
       /o error handling code o/ 
 | 
						|
 | 
						|
    if (orlalloc(env, &long_ref, MAX_ARR_SIZE, &attr_name_indexes) 
 | 
						|
                != OROSTASUC)
 | 
						|
       /o error handling code o/ 
 | 
						|
 | 
						|
    /o 
 | 
						|
     o Get an ADT instance. The ref to the ADT instance can be obtained
 | 
						|
     o by through ORI or OSCI. 
 | 
						|
     o/
 | 
						|
    if (OCIObjectPin(env, &obj_ref, OROOPOCUR, OROOPDTRA, OROOLMUPD, &object) 
 | 
						|
          != OROSTASUC)
 | 
						|
       /o error handling code o/ 
 | 
						|
 | 
						|
    /o get the null structure of the ADT instance o/
 | 
						|
    if (OCIObjectGetInd(gp, object, &null_struct) != OROSTASUC)
 | 
						|
       /o error handling code o/ 
 | 
						|
 | 
						|
    /o 
 | 
						|
     o Get the type of the ADT instance
 | 
						|
     o/
 | 
						|
 | 
						|
    /o find out the type of the ADT instance o/
 | 
						|
    if (oriogto(env, object, &adt_ref) != OROSTASUC)
 | 
						|
       /o error handling code o/ 
 | 
						|
 | 
						|
    /o display the object o/
 | 
						|
    display(adt_ref, object, null_struct, attr_names, 0, attr_names_lengths,
 | 
						|
                     attr_names_indexes, 0);
 | 
						|
 | 
						|
    /o After the object is displayed, the program waits for the user to 
 | 
						|
     o respond.  The user modifies the values of an attribute and the
 | 
						|
     o program generates a path expression for the attribute and calls 
 | 
						|
     o OCIObjectSetAttr() to set the value. 
 | 
						|
     o/
 | 
						|
 | 
						|
    if (OCIObjectSetAttr(env, object, null_struct, adt_ref, 
 | 
						|
                (text **)attr_names, (ub4 *)attr_name_lengths, 
 | 
						|
                attr_names_count, (ub4 *)attr_array_indexes, 
 | 
						|
                attr_array_indexes_count, 
 | 
						|
                (void *)0, FALSE, (void *)value) != OROSTASUC)
 | 
						|
       /o error handling code o/ 
 | 
						|
 | 
						|
    END OF EXAMPLE 1
 | 
						|
 | 
						|
  NOTES
 | 
						|
 | 
						|
    This file has been subsetted to contain only the routines that will
 | 
						|
    be in the first release.
 | 
						|
 | 
						|
  MODIFIED
 | 
						|
    dmukhin    06/29/05  - ANSI prototypes; miscellaneous cleanup 
 | 
						|
    srseshad   03/12/03  - convert oci public api to ansi
 | 
						|
    aahluwal   06/03/02  - bug 2360115
 | 
						|
    bpalaval   02/09/01  - Change text to oratext.
 | 
						|
    whe        09/01/99 -  976457:check __cplusplus for C++ code
 | 
						|
    sthakur    09/18/97 -  collection indexing not supported
 | 
						|
    cxcheng    08/05/97 -  fix compile with short names
 | 
						|
    skrishna   03/18/97 -  fix ifdef for supporting ansi and k&r proto-types
 | 
						|
    cxcheng    02/06/97 -  take out short name support except with SLSHORTNAME
 | 
						|
    cxcheng    10/17/96 -  final renaming of functions
 | 
						|
    jboonleu   10/07/96 -  beautify with OCI long names
 | 
						|
    cxcheng    10/07/96 -  change short names to long names for readability
 | 
						|
    jboonleu   09/27/96 -  fix lint
 | 
						|
    jwijaya    07/03/96 -  add ANSI prototypes
 | 
						|
    jboonleu   04/13/95 -  new interface
 | 
						|
    jwijaya    10/11/94 -  fix the sccs header and add namespace
 | 
						|
    tanguyen   08/22/94 -  fix example 
 | 
						|
    tanguyen   08/09/94 -  remove Sccsid declaration 
 | 
						|
    tanguyen   07/20/94 -  fix OCIObjectSetAttr and OCIObjectGetAttr to 
 | 
						|
                           use position descriptor 
 | 
						|
    tanguyen   07/18/94 -  change 'object' type to become ptr to object 
 | 
						|
    tanguyen   06/30/94 -  Fix the ORID_ORACLE ifdef 
 | 
						|
    tanguyen   06/27/94 -  update to template format 
 | 
						|
    skotsovo   05/12/94 -  replace ado with attribute position 
 | 
						|
    jweisz     05/11/94 -  test new checkin facility 
 | 
						|
    jwijaya    05/05/94 - orienv/ref/typ -> oroenv/ref/typ
 | 
						|
    jwijaya    02/07/94 - Creation
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
#ifndef ORATYPES
 | 
						|
#include <oratypes.h>
 | 
						|
#endif
 | 
						|
#ifndef ORO_ORACLE
 | 
						|
#include <oro.h>
 | 
						|
#endif
 | 
						|
#ifndef OCI_ORACLE
 | 
						|
#include <oci.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef ORID_ORACLE
 | 
						|
#define ORID_ORACLE
 | 
						|
 | 
						|
#ifdef SLSHORTNAME
 | 
						|
 | 
						|
#define OCIObjectSetAttr oridset
 | 
						|
#define OCIObjectGetAttr oridget
 | 
						|
 | 
						|
#endif /* SLSHORTNAME */
 | 
						|
 | 
						|
/*---------------------------------------------------------------------------*/
 | 
						|
/*                           PUBLIC FUNCTIONS                                */
 | 
						|
/*---------------------------------------------------------------------------*/
 | 
						|
 | 
						|
/*-------------------------- OCIObjectSetAttr ----------------------------*/
 | 
						|
sword OCIObjectSetAttr(    OCIEnv *env, OCIError *err, void  *instance, 
 | 
						|
                  void  *null_struct, struct OCIType *tdo, 
 | 
						|
                  const oratext **names, const ub4 *lengths, 
 | 
						|
                  const ub4 name_count, const ub4 *indexes, 
 | 
						|
                  const ub4 index_count, const OCIInd null_status, 
 | 
						|
                  const void  *attr_null_struct, const void  *attr_value    );
 | 
						|
/*
 | 
						|
   NAME: OCIObjectSetAttr - ORID SET value
 | 
						|
   PARAMETERS:
 | 
						|
        env  (IN) - OCI environment handle initialized in object mode
 | 
						|
        err  (IN) - error handle. If there is an error, it is
 | 
						|
                        recorded in 'err' and this function returns OCI_ERROR.
 | 
						|
                        The error recorded in 'err' can be retrieved by calling
 | 
						|
                        OCIErrorGet().
 | 
						|
        instance    (IN) - pointer to an ADT instance
 | 
						|
        null_struct (IN) - the null structure of the ADT instance or array
 | 
						|
        tdo         (IN) - pointer to the TDO
 | 
						|
        names       (IN) - array of attribute names. This is used to specify
 | 
						|
                           the names of the attributes in the path expression.
 | 
						|
        lengths     (IN) - array of lengths of attribute names.
 | 
						|
        name_count  (IN) - number of element in the array 'names'.
 | 
						|
        indexes     (IN) [OPTIONAL] - currently NOT SUPPORTED, pass (ub4 *)0.
 | 
						|
        index_count (IN) [OPTIONAL] - currently NOT SUPPORTED, pass (ub4)0.
 | 
						|
        attr_null_status (IN) - the null status of the attribute if the type of
 | 
						|
                                 attribute is primitive.
 | 
						|
        attr_null_struct (IN) - the null structure of an ADT or collection
 | 
						|
                                 attribute.
 | 
						|
        attr_value       (IN) - pointer to the attribute value.
 | 
						|
   REQUIRES:
 | 
						|
   DESCRIPTION:
 | 
						|
        This function set the attribute of the given object with the given 
 | 
						|
        value.  The position of the attribute is specified as a path 
 | 
						|
        expression which is an array of names and an array of indexes. 
 | 
						|
   RETURNS:
 | 
						|
        one of OROSTA*
 | 
						|
   EXAMPLES:
 | 
						|
        For path expression stanford.cs.stu[5].addr, the arrays will look like
 | 
						|
          names = {"stanford", "cs", "stu", "addr"} 
 | 
						|
          lengths = {8, 2, 3, 4}
 | 
						|
          indexes = {5}
 | 
						|
        
 | 
						|
        Also see the above example.
 | 
						|
 */
 | 
						|
 | 
						|
/*-------------------------- OCIObjectGetAttr ----------------------------*/
 | 
						|
sword OCIObjectGetAttr(    OCIEnv *env, OCIError *err, void  *instance, 
 | 
						|
                  void  *null_struct, struct OCIType *tdo, 
 | 
						|
                  const oratext **names, const ub4 *lengths, 
 | 
						|
                  const ub4 name_count, const ub4 *indexes, 
 | 
						|
                  const ub4 index_count, OCIInd *attr_null_status, 
 | 
						|
                  void  **attr_null_struct, void  **attr_value, 
 | 
						|
                  struct OCIType **attr_tdo    );
 | 
						|
/*
 | 
						|
   NAME: OCIObjectGetAttr - ORID GET value
 | 
						|
   PARAMETERS:
 | 
						|
        env  (IN) - OCI environment handle initialized in object mode
 | 
						|
        err  (IN) - error handle. If there is an error, it is
 | 
						|
                        recorded in 'err' and this function returns OCI_ERROR.
 | 
						|
                        The error recorded in 'err' can be retrieved by calling
 | 
						|
                        OCIErrorGet().
 | 
						|
        instance    (IN) - pointer to an ADT instance 
 | 
						|
        null_struct (IN) - the null structure of the ADT instance or array
 | 
						|
        tdo         (IN) - pointer to the TDO 
 | 
						|
        names       (IN) - array of attribute names. This is used to specify
 | 
						|
                           the names of the attributes in the path expression.
 | 
						|
        lengths     (IN) - array of lengths of attribute names. 
 | 
						|
        name_count  (IN) - number of element in the array 'names'.
 | 
						|
        indexes     (IN) [OPTIONAL] - currently NOT SUPPORTED, pass (ub4 *)0.
 | 
						|
        index_count (IN) [OPTIONAL] - currently NOT SUPPORTED, pass (ub4)0.
 | 
						|
        attr_null_status (OUT) - the null status of the attribute if the type 
 | 
						|
                                 of attribute is primitive. 
 | 
						|
        attr_null_struct (OUT) - the null structure of an ADT or collection
 | 
						|
                                 attribute.
 | 
						|
        attr_value       (OUT) - pointer to the attribute value.
 | 
						|
        attr_tdo         (OUT) - pointer to the TDO of the attribute.
 | 
						|
   REQUIRES:
 | 
						|
      - a valid OCI environment handle must be given.
 | 
						|
   DESCRIPTION:
 | 
						|
        This function gets a value from an ADT instance or from an array.
 | 
						|
        If the parameter 'instance' points to an ADT instance, then the path
 | 
						|
        expression specifies the location of the attribute in the ADT. 
 | 
						|
        It is assumed that the object is pinned and that the value returned 
 | 
						|
        is valid until the object is unpinned.
 | 
						|
   RETURNS:
 | 
						|
        one of OROSTA*
 | 
						|
   EXAMPLES:
 | 
						|
        See example in OCIObjectSetAttr(). Also see the above example.
 | 
						|
 */
 | 
						|
 | 
						|
#endif /* ORID_ORACLE */
 |