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