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 */
 |