00001 #ifndef SQLUDR_H
00002 #define SQLUDR_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #define SQLUDR_LIBFUNC
00034
00035 #include <stdint.h>
00036
00037
00038 typedef char SQLUDR_CHAR;
00039
00040 typedef int8_t SQLUDR_INT8;
00041 typedef uint8_t SQLUDR_UINT8;
00042
00043 typedef int16_t SQLUDR_INT16;
00044 typedef uint16_t SQLUDR_UINT16;
00045
00046 typedef int32_t SQLUDR_INT32;
00047 typedef uint32_t SQLUDR_UINT32;
00048
00049 typedef int64_t SQLUDR_INT64;
00050 typedef uint64_t SQLUDR_UINT64;
00051
00052 typedef float SQLUDR_REAL;
00053 typedef double SQLUDR_DOUBLE;
00054
00055
00056 #define SQLUDR_SUCCESS ( 0)
00057 #define SQLUDR_SUCCESS_WITH_WARNING ( 1)
00058 #define SQLUDR_ERROR (-1)
00059
00060
00061 #define SQLUDR_NULL (-1)
00062 #define SQLUDR_NOTNULL ( 0)
00063
00064
00065 #define SQLUDR_GETNULLIND(null_indicator) \
00066 ((((char*)(null_indicator))[1] && 0x0080) ? SQLUDR_NULL : SQLUDR_NOTNULL)
00067
00068
00069 #define SQLUDR_SETNULLIND(null_indicator) \
00070 (*((short *)(null_indicator)) = -1)
00071
00072
00073 #define SQLUDR_CLEARNULLIND(null_indicator) \
00074 (*((short *)(null_indicator)) = 0)
00075
00076
00077 #define SQLUDR_CALLTYPE_INITIAL ( 1)
00078 #define SQLUDR_CALLTYPE_NORMAL ( 2)
00079 #define SQLUDR_CALLTYPE_FINAL ( 3)
00080
00081
00082
00083 #define SQLUDR_SQLSTATE_SIZE ( 6)
00084 #define SQLUDR_MSGTEXT_SIZE (256)
00085
00086
00087 enum SQLUDR_PARAMSTYLE
00088 {
00089 SQLUDR_PARAMSTYLE_SQL = 1,
00090 SQLUDR_PARAMSTYLE_SQLROW = 2
00091 };
00092
00093
00094 enum SQLUDR_ROWFORMAT
00095 {
00096 SQLUDR_ROWFORMAT_EXPLODED = 1
00097 };
00098
00099
00100 enum SQLUDR_COLLATION
00101 {
00102 SQLUDR_COLLATION_UNKNOWN = 0,
00103 SQLUDR_COLLATION_DEFAULT = 1,
00104 SQLUDR_COLLATION_CZECH = 2,
00105 SQLUDR_COLLATION_CZECH_CI = 3,
00106 SQLUDR_COLLATION_SJIS = 4
00107 };
00108
00109
00110 typedef struct
00111 {
00112
00113 SQLUDR_UINT32 length;
00114 SQLUDR_INT32 reserved1;
00115
00116
00117 SQLUDR_CHAR *data;
00118 SQLUDR_INT32 reserved2;
00119
00120 } SQLUDR_BUFFER;
00121
00122
00123 #define SQLUDR_STATEAREA_CURRENT_VERSION ( 1)
00124 #define SQLUDR_STATEAREA_BUFFER_SIZE (4096)
00125 typedef struct
00126 {
00127
00128 SQLUDR_UINT16 version;
00129 SQLUDR_UINT16 reserved1;
00130 SQLUDR_UINT32 reserved2;
00131
00132
00133
00134 SQLUDR_BUFFER host_data;
00135
00136
00137
00138 SQLUDR_BUFFER stmt_data;
00139
00140 SQLUDR_INT64 reserved3;
00141 SQLUDR_INT64 reserved4;
00142
00143 } SQLUDR_STATEAREA;
00144
00145
00146 typedef struct
00147 {
00148
00149 SQLUDR_UINT32 length;
00150 SQLUDR_INT32 reserved1;
00151
00152
00153 char *data;
00154 SQLUDR_INT32 reserved2;
00155
00156 } SQLUDR_VC_STRUCT ;
00157
00158
00159 #define SQLUDR_PARAM_CURRENT_VERSION 1
00160 typedef struct
00161 {
00162
00163 SQLUDR_UINT16 version;
00164
00165
00166
00167 SQLUDR_INT16 datatype;
00168
00169 union
00170 {
00171
00172
00173 SQLUDR_INT16 scale;
00174
00175
00176
00177
00178 SQLUDR_INT16 character_set;
00179
00180
00181
00182
00183 SQLUDR_INT16 datetime_code;
00184
00185
00186
00187
00188
00189
00190 SQLUDR_INT16 interval_code;
00191 } u1;
00192
00193 union
00194 {
00195
00196
00197
00198 SQLUDR_INT16 precision;
00199
00200
00201
00202
00203 SQLUDR_INT16 collation;
00204 } u2;
00205
00206
00207 SQLUDR_CHAR *name;
00208 SQLUDR_INT32 reserved1;
00209
00210
00211 SQLUDR_UINT32 data_len;
00212
00213
00214
00215 SQLUDR_UINT32 data_offset;
00216
00217
00218
00219 SQLUDR_UINT32 ind_offset;
00220
00221
00222
00223
00224 SQLUDR_UINT32 vc_ind_offset;
00225 SQLUDR_UINT8 vc_ind_len;
00226
00227 SQLUDR_INT8 reserved2;
00228 SQLUDR_INT16 reserved3;
00229 SQLUDR_INT32 reserved4;
00230 SQLUDR_INT64 reserved5;
00231
00232 } SQLUDR_PARAM;
00233
00234 #define SQLUDR_ASCENDING 1
00235 #define SQLUDR_DESCENDING -1
00236 #define SQLUDR_ZERO 0
00237
00238 typedef struct
00239 {
00240 SQLUDR_UINT32 num_cols;
00241 SQLUDR_UINT32 *cols_list;
00242 SQLUDR_INT8 *direction;
00243 }
00244 SQLUDR_COLS_LIST;
00245
00246 #define SQLUDR_UNIQUE_CONSTRAINT 1
00247 typedef struct
00248 {
00249 SQLUDR_INT8 constraint_type;
00250 SQLUDR_COLS_LIST constraint_cols;
00251 } SQLUDR_CONSTRAINT;
00252
00253
00254
00255 typedef struct
00256 {
00257 SQLUDR_CHAR *table_name;
00258 SQLUDR_UINT32 num_params ;
00259 SQLUDR_PARAM *params;
00260 SQLUDR_COLS_LIST part_params;
00261 SQLUDR_COLS_LIST order_params;
00262 SQLUDR_UINT32 row_length;
00263
00264
00265 SQLUDR_COLS_LIST pred_push_down_params;
00266 SQLUDR_UINT32 num_rows;
00267 SQLUDR_UINT32 *param_uecs;
00268
00269
00270
00271 SQLUDR_UINT32 num_constraints;
00272 SQLUDR_CONSTRAINT *constraints;
00273
00274 SQLUDR_DOUBLE cost_per_row;
00275 } SQLUDR_TABLE_PARAM;
00276
00277
00278 #define SQLUDR_UDRINFO_CURRENT_VERSION (1)
00279 typedef struct
00280 {
00281
00282 SQLUDR_UINT16 version;
00283
00284
00285 SQLUDR_UINT16 sql_version;
00286
00287
00288
00289 SQLUDR_UINT16 param_style;
00290
00291
00292 SQLUDR_UINT16 param_style_version;
00293
00294
00295
00296 SQLUDR_UINT16 row_format;
00297
00298 SQLUDR_UINT16 reserved1;
00299 SQLUDR_UINT16 reserved2;
00300 SQLUDR_UINT16 reserved3;
00301
00302
00303 SQLUDR_CHAR *routine_name;
00304 SQLUDR_INT32 reserved4;
00305
00306
00307
00308 SQLUDR_INT64 reserved5;
00309 SQLUDR_INT64 reserved6;
00310
00311
00312 SQLUDR_CHAR *uudr_action;
00313 SQLUDR_INT32 reserved7;
00314
00315
00316 SQLUDR_UINT32 num_pass_through;
00317 SQLUDR_INT32 reserved8;
00318 SQLUDR_BUFFER *pass_through;
00319 SQLUDR_INT32 reserved9;
00320
00321
00322 SQLUDR_CHAR *current_user_name;
00323 SQLUDR_INT32 reserved10;
00324
00325
00326 SQLUDR_CHAR *session_user_name;
00327 SQLUDR_INT32 reserved11;
00328
00329
00330 SQLUDR_CHAR *current_role_name;
00331 SQLUDR_INT32 reserved12;
00332
00333
00334 SQLUDR_CHAR *query_id;
00335 SQLUDR_INT32 reserved13;
00336
00337
00338
00339 SQLUDR_UINT32 in_row_length;
00340 SQLUDR_UINT32 out_row_length;
00341
00342
00343 SQLUDR_UINT32 num_inputs;
00344 SQLUDR_UINT32 num_return_values;
00345 SQLUDR_PARAM *inputs;
00346 SQLUDR_INT32 reserved14;
00347 SQLUDR_PARAM *return_values;
00348 SQLUDR_INT32 reserved15;
00349
00350 SQLUDR_INT64 reserved16;
00351 SQLUDR_INT64 reserved17;
00352 SQLUDR_INT64 reserved18;
00353 SQLUDR_INT64 reserved19;
00354 SQLUDR_INT64 reserved20;
00355 SQLUDR_INT64 reserved21;
00356 SQLUDR_INT64 reserved22;
00357 SQLUDR_INT64 reserved23;
00358
00359
00360 SQLUDR_UINT32 instance_total;
00361 SQLUDR_UINT32 instance_current;
00362
00363
00364 SQLUDR_UINT32 num_table_inputs ;
00365 SQLUDR_TABLE_PARAM *table_inputs;
00366
00367 } SQLUDR_UDRINFO;
00368
00369
00370 #define SQLUDR_TMUDFINFO_CURRENT_VERSION (1)
00371 typedef struct
00372 {
00373
00374 SQLUDR_UINT16 version;
00375
00376
00377 SQLUDR_UINT16 sql_version;
00378
00379
00380 SQLUDR_CHAR *routine_name;
00381
00382
00383 SQLUDR_UINT32 num_pass_through;
00384 SQLUDR_BUFFER *pass_through;
00385
00386
00387 SQLUDR_UINT32 num_inputs;
00388 SQLUDR_PARAM *inputs;
00389
00390 SQLUDR_UINT32 num_table_inputs ;
00391 SQLUDR_TABLE_PARAM *table_inputs;
00392
00393 SQLUDR_TABLE_PARAM output_info;
00394 } SQLUDR_TMUDFINFO;
00395
00396
00397 #define SQLUDR_TRAIL_ARGS \
00398 SQLUDR_CHAR sqlstate[SQLUDR_SQLSTATE_SIZE], \
00399 SQLUDR_CHAR msgtext[SQLUDR_MSGTEXT_SIZE], \
00400 SQLUDR_INT32 calltype, \
00401 SQLUDR_STATEAREA *statearea, \
00402 SQLUDR_UDRINFO *udrinfo
00403
00404
00405 #define PASS_ON_SQLUDR_TRAIL_ARGS \
00406 sqlstate, msgtext, calltype, statearea, udrinfo
00407
00408
00409
00410
00411 typedef enum SQLUDR_Q_STATE
00412 {
00413 SQLUDR_Q_MORE = 1,
00414 SQLUDR_Q_EOD,
00415 SQLUDR_Q_CANCEL
00416 }SQLUDR_Q_STATE;
00417
00418
00419 typedef void (*SQLUDR_GetNextRow)(char *rowData,
00420 int tableIndex,
00421 SQLUDR_Q_STATE *queue_state
00422 );
00423
00424 typedef void (*SQLUDR_EmitRow) (char *rowData,
00425 int tableIndex,
00426 SQLUDR_Q_STATE *queue_state
00427 );
00428
00429 #define SQLUDR_TMUDF_TRAIL_ARGS \
00430 SQLUDR_CHAR *rowDataSpace1,\
00431 SQLUDR_CHAR *rowDataSpace2,\
00432 SQLUDR_GetNextRow getRow,\
00433 SQLUDR_EmitRow emitRow,\
00434 SQLUDR_TRAIL_ARGS
00435
00436
00437 #define PASS_ON_SQLUDR_TMUDF_TRAIL_ARGS \
00438 rowDataSpace1, rowDataSpace2, getRow, emitRow, PASS_ON_SQLUDR_TRAIL_ARGS
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00471
00472
00473
00474
00475
00476 #ifdef __cplusplus
00477
00478 #include <string>
00479 #include <vector>
00480
00481
00482
00483
00484 class TMUDFInternalSetup;
00485 class SPInfo;
00486 class LmLanguageManagerC;
00487 class LmLanguageManagerJava;
00488 class LmRoutineCppObj;
00489
00490 namespace tmudr
00491 {
00492
00493 class TableInfo;
00494
00495
00496 typedef char * Bytes;
00497 typedef const char * ConstBytes;
00498
00499
00511 class UDRException
00512 {
00513 public:
00514
00515 UDRException(int sqlState, const char *printf_format, ...);
00516 UDRException(const char * sqlState, const char *printf_format, ...);
00517 const char *getSQLState() const;
00518 const std::string &getMessage() const;
00519 const std::string &getText() const;
00520
00521 private:
00522
00523 char sqlState_[6];
00524 std::string text_;
00525 };
00526
00527
00528
00529
00530 class TMUDRSerializableObject
00531 {
00532 public:
00533
00534 enum Endianness
00535 {
00536 UNKNOWN_ENDIANNESS = 0,
00537 IS_LITTLE_ENDIAN = 1,
00538 IS_BIG_ENDIAN = 2
00539 };
00540
00541 enum TMUDRObjectType
00542 {
00543 UNKNOWN_OBJECT_TYPE = 0,
00544 TYPE_INFO_OBJ = 100,
00545 PARAMETER_INFO_OBJ = 200,
00546 COLUMN_INFO_OBJ = 400,
00547 CARDINALITY_CONSTRAINT_INFO_OBJ = 510,
00548 UNIQUE_CONSTRAINT_INFO_OBJ = 520,
00549 COMP_PREDICATE_INFO_OBJ = 710,
00550 PARTITION_INFO_OBJ = 800,
00551 ORDER_INFO_OBJ = 900,
00552 TUPLE_INFO_OBJ = 1000,
00553 TABLE_INFO_OBJ = 1100,
00554 PARAMETER_LIST_INFO_OBJ = 1200,
00555 UDR_INVOCATION_INFO_OBJ = 1300,
00556 UDR_PLAN_INFO_OBJ = 1400
00557 };
00558
00559 TMUDRSerializableObject(
00560 TMUDRObjectType objectType,
00561 unsigned short version = 1,
00562 unsigned short endianness = IS_LITTLE_ENDIAN);
00563
00564 TMUDRObjectType getObjectType() const;
00565 unsigned short getVersion() const;
00566 Endianness getEndianness() const;
00567 virtual int serializedLength();
00568 virtual int serialize(Bytes &outputBuffer,
00569 int &outputBufferLength);
00570 virtual int deserialize(ConstBytes &inputBuffer,
00571 int &inputBufferLength);
00572
00573 void validateObjectType(TMUDRObjectType o);
00574 void validateSerializedLength(int l);
00575 void validateDeserializedLength(int l);
00576
00577
00578
00579 int serializedLengthOfInt();
00580 int serializedLengthOfLong();
00581 int serializedLengthOfString(const char *s);
00582 int serializedLengthOfString(int stringLength);
00583 int serializedLengthOfString(const std::string &s);
00584 int serializedLengthOfBinary(int binaryLength);
00585
00586 int serializeInt(int i,
00587 Bytes &outputBuffer,
00588 int &outputBufferLength);
00589 int serializeLong(long i,
00590 Bytes &outputBuffer,
00591 int &outputBufferLength);
00592 int serializeString(const char *s,
00593 Bytes &outputBuffer,
00594 int &outputBufferLength);
00595 int serializeString(const char *s,
00596 int len,
00597 Bytes &outputBuffer,
00598 int &outputBufferLength);
00599 int serializeString(const std::string &s,
00600 Bytes &outputBuffer,
00601 int &outputBufferLength);
00602 int serializeBinary(const void *b,
00603 int len,
00604 Bytes &outputBuffer,
00605 int &outputBufferLength);
00606
00607 int deserializeInt(int &i,
00608 ConstBytes &inputBuffer,
00609 int &inputBufferLength);
00610 int deserializeLong(long &i,
00611 ConstBytes &inputBuffer,
00612 int &inputBufferLength);
00613 int deserializeString(const char *&s,
00614 int &stringLength,
00615 bool makeACopy,
00616 ConstBytes &inputBuffer,
00617 int &inputBufferLength);
00618 int deserializeString(std::string &s,
00619 ConstBytes &inputBuffer,
00620 int &inputBufferLength);
00621 int deserializeBinary(const void **b,
00622 int &binaryLength,
00623 bool makeACopy,
00624 ConstBytes &inputBuffer,
00625 int &inputBufferLength);
00626 TMUDRObjectType getNextObjectType(ConstBytes inputBuffer,
00627 int inputBufferLength);
00628
00629 private:
00630
00631 struct headerFields {
00632 int objectType_;
00633 int totalLength_;
00634 unsigned short version_;
00635 unsigned short endianness_;
00636 int flags_;
00637 int filler_;
00638 } v_;
00639 };
00640
00649 class TypeInfo : public TMUDRSerializableObject
00650 {
00651 public:
00652
00654 enum SQLTypeCode
00655 {
00656 UNDEFINED_SQL_TYPE,
00657 SMALLINT,
00658 INT,
00659 LARGEINT,
00660 NUMERIC,
00661 DECIMAL_LSE,
00662 SMALLINT_UNSIGNED,
00663 INT_UNSIGNED,
00664 NUMERIC_UNSIGNED,
00665 DECIMAL_UNSIGNED,
00666 REAL,
00667 DOUBLE_PRECISION,
00668 CHAR,
00669 VARCHAR,
00670 DATE,
00671 TIME,
00672 TIMESTAMP,
00673 INTERVAL,
00674 BLOB,
00675 CLOB
00676 };
00677
00679 enum SQLTypeClassCode
00680 {
00681 CHARACTER_TYPE,
00682 NUMERIC_TYPE,
00683 DATETIME_TYPE,
00684 INTERVAL_TYPE,
00685 LOB_TYPE,
00686 UNDEFINED_TYPE_CLASS
00687 };
00688
00690 enum SQLTypeSubClassCode
00691 {
00692 FIXED_CHAR_TYPE,
00693 VAR_CHAR_TYPE,
00694 EXACT_NUMERIC_TYPE,
00695 APPROXIMATE_NUMERIC_TYPE,
00696 DATE_TYPE,
00697 TIME_TYPE,
00698 TIMESTAMP_TYPE,
00699
00700 YEAR_MONTH_INTERVAL_TYPE,
00701 DAY_SECOND_INTERVAL_TYPE,
00702
00703 LOB_SUB_CLASS,
00704 UNDEFINED_TYPE_SUB_CLASS
00705 };
00706
00708 enum SQLCharsetCode
00709 {
00710 UNDEFINED_CHARSET,
00711 CHARSET_ISO88591,
00712 CHARSET_UTF8,
00713 CHARSET_UCS2
00714 };
00715
00717 enum SQLCollationCode
00718 {
00719 UNDEFINED_COLLATION,
00720 SYSTEM_COLLATION
00721
00722
00723 };
00724
00726
00727 enum SQLIntervalCode
00728 {
00729 UNDEFINED_INTERVAL_CODE = 0,
00730 INTERVAL_YEAR = 1,
00731 INTERVAL_MONTH = 2,
00732 INTERVAL_DAY = 3,
00733 INTERVAL_HOUR = 4,
00734 INTERVAL_MINUTE = 5,
00735 INTERVAL_SECOND = 6,
00736 INTERVAL_YEAR_MONTH = 7,
00737 INTERVAL_DAY_HOUR = 8,
00738 INTERVAL_DAY_MINUTE = 9,
00739 INTERVAL_DAY_SECOND = 10,
00740 INTERVAL_HOUR_MINUTE = 11,
00741 INTERVAL_HOUR_SECOND = 12,
00742 INTERVAL_MINUTE_SECOND = 13
00743 };
00744
00745 TypeInfo(const TypeInfo &type);
00746 TypeInfo(SQLTypeCode sqltype = UNDEFINED_SQL_TYPE,
00747 int length = 0,
00748 bool nullable = false,
00749 int scale = 0,
00750 SQLCharsetCode charset = CHARSET_UTF8,
00751 SQLIntervalCode intervalCode = UNDEFINED_INTERVAL_CODE,
00752 int precision = 0,
00753 SQLCollationCode collation = SYSTEM_COLLATION);
00754
00755 TypeInfo(SQLTypeCode sqltype,
00756 bool nullable,
00757 int scale,
00758 SQLCharsetCode charset,
00759 SQLIntervalCode intervalCode,
00760 int precision,
00761 SQLCollationCode collation,
00762 int length);
00763
00764 SQLTypeCode getSQLType() const;
00765 SQLTypeClassCode getSQLTypeClass() const;
00766 SQLTypeSubClassCode getSQLTypeSubClass() const;
00767 bool getIsNullable() const;
00768 int getScale() const;
00769 SQLCharsetCode getCharset() const;
00770 SQLIntervalCode getIntervalCode() const;
00771 int getPrecision() const;
00772 SQLCollationCode getCollation() const;
00773 int getByteLength() const;
00774 int getMaxCharLength() const;
00775
00776
00777 void setNullable(bool nullable);
00778
00779
00780
00781 int getInt(const char *row, bool &wasNull) const;
00782 long getLong(const char *row, bool &wasNull) const;
00783 double getDouble(const char *row, bool &wasNull) const;
00784 time_t getTime(const char *row, bool &wasNull) const;
00785 const char * getRaw(const char *row,
00786 bool &wasNull,
00787 int &byteLen) const;
00788 bool isAvailable() const;
00789
00790 void setInt(int val, char *row) const;
00791 void setLong(long val, char *row) const;
00792 void setDouble(double val, char *row) const;
00793 void setTime(time_t val, char *row) const;
00794 void setString(const char *val, int stringLen, char *row) const;
00795 void setNull(char *row) const;
00796
00797 int minBytesPerChar() const;
00798 int convertToBinaryPrecision(int decimalPrecision) const;
00799 void toString(std::string &s, bool longForm) const;
00800 inline static unsigned short getCurrentVersion() { return 1; }
00801 virtual int serializedLength();
00802 virtual int serialize(Bytes &outputBuffer,
00803 int &outputBufferLength);
00804 virtual int deserialize(ConstBytes &inputBuffer,
00805 int &inputBufferLength);
00806 void setOffsets(int dataOffset, int indOffset, int vcOffset);
00807
00808 private:
00809
00810
00811 enum {
00812 TYPE_FLAG_4_BYTE_VC_LEN = 0x00000001
00813 };
00814
00815 struct {
00816 int sqlType_;
00817 int nullable_;
00818 int scale_;
00819
00820 int charset_;
00821 int intervalCode_;
00822 int precision_;
00823
00824 int collation_;
00825 int length_;
00826 int dataOffset_;
00827 int nullIndOffset_;
00828 int vcLenIndOffset_;
00829 int flags_;
00830 int fillers_[4];
00831 } d_;
00832
00833
00834 friend class ::TMUDFInternalSetup;
00835 };
00836
00850 class ProvenanceInfo
00851 {
00852 public:
00853
00854 ProvenanceInfo();
00855 ProvenanceInfo(int inputTableNum,
00856 int inputColNum);
00857 int getInputTableNum() const;
00858 int getInputColumnNum() const;
00859 bool isFromInputTable(int inputTableNum = -1) const;
00860
00861 private:
00862 int inputTableNum_;
00863 int inputColNum_;
00864 };
00865
00874 class ColumnInfo : public TMUDRSerializableObject
00875 {
00876 public:
00877
00879 enum ColumnUseCode
00880 {
00881 UNKNOWN,
00882 USED,
00883
00884 NOT_USED,
00885
00886
00887
00888 NOT_PRODUCED
00889
00890 };
00891
00892 ColumnInfo();
00893 ColumnInfo(const char *name,
00894 const TypeInfo &type);
00895
00896 const std::string &getColName() const;
00897 const TypeInfo &getType() const;
00898 long getEstimatedUniqueEntries() const;
00899 ColumnUseCode getUsage() const;
00900 const ProvenanceInfo &getProvenance() const;
00901
00902
00903 TypeInfo &getType();
00904 void setColName(const char *name);
00905 void setType(TypeInfo &type);
00906 void setEstimatedUniqueEntries(long uniqueEntries);
00907 void setUsage(ColumnUseCode usage);
00908 void setProvenance(const ProvenanceInfo &provenance);
00909
00910
00911 void toString(std::string &s, bool longForm = false) const;
00912
00913
00914 inline static unsigned short getCurrentVersion() { return 1; }
00915 virtual int serializedLength();
00916 virtual int serialize(Bytes &outputBuffer,
00917 int &outputBufferLength);
00918 virtual int deserialize(ConstBytes &inputBuffer,
00919 int &inputBufferLength);
00920
00921 private:
00922
00923 std::string name_;
00924 TypeInfo type_;
00925 ColumnUseCode usage_;
00926 long estimatedUniqueEntries_;
00927 ProvenanceInfo provenance_;
00928
00929 friend class ::TMUDFInternalSetup;
00930 };
00931
00939 class ConstraintInfo : public TMUDRSerializableObject
00940 {
00941 public:
00942
00944 enum ConstraintTypeCode
00945 {
00946 CARDINALITY,
00947 UNIQUE
00948 };
00949
00950
00951 ConstraintTypeCode getType() const;
00952
00953
00954 virtual void toString(const TableInfo &ti, std::string &s) = 0;
00955 inline static unsigned short getCurrentVersion() { return 1; }
00956 virtual int serializedLength();
00957 virtual int serialize(Bytes &outputBuffer,
00958 int &outputBufferLength);
00959 virtual int deserialize(ConstBytes &inputBuffer,
00960 int &inputBufferLength);
00961
00962 protected:
00963 ConstraintInfo(ConstraintTypeCode constraintType,
00964 unsigned short version);
00965
00966 private:
00967 ConstraintTypeCode constraintType_;
00968 };
00969
00979 class CardinalityConstraintInfo : public ConstraintInfo
00980 {
00981 public:
00982 CardinalityConstraintInfo(long minNumRows = 0,
00983 long maxNumRows = -1);
00984
00985 long getMinNumRows() const;
00986 long getMaxNumRows() const;
00987
00988
00989 virtual void toString(const TableInfo &ti, std::string &s);
00990 inline static unsigned short getCurrentVersion() { return 1; }
00991 virtual int serializedLength();
00992 virtual int serialize(Bytes &outputBuffer,
00993 int &outputBufferLength);
00994 virtual int deserialize(ConstBytes &inputBuffer,
00995 int &inputBufferLength);
00996
00997 private:
00998
00999 long minNumRows_;
01000 long maxNumRows_;
01001 };
01002
01009 class UniqueConstraintInfo : public ConstraintInfo
01010 {
01011 public:
01012 UniqueConstraintInfo();
01013 int getNumUniqueColumns() const;
01014 int getUniqueColumn(int i) const;
01015 void addColumn(int c);
01016
01017
01018 virtual void toString(const TableInfo &ti, std::string &s);
01019 inline static unsigned short getCurrentVersion() { return 1; }
01020 virtual int serializedLength();
01021 virtual int serialize(Bytes &outputBuffer,
01022 int &outputBufferLength);
01023 virtual int deserialize(ConstBytes &inputBuffer,
01024 int &inputBufferLength);
01025
01026 private:
01027
01028 std::vector<int> uniqueColumns_;
01029 };
01030
01038 class PredicateInfo : public TMUDRSerializableObject
01039 {
01040 public:
01041
01049 enum EvaluationCode
01050 {
01051 UNKNOWN_EVAL = 0,
01052
01053 EVALUATE_ON_RESULT = 0x1,
01054
01055
01056 EVALUATE_IN_UDF = 0x2,
01057
01058 EVALUATE_IN_CHILD = 0x4
01059
01060
01061 };
01062
01064 enum PredOperator
01065 {
01066 UNKNOWN_OP,
01067 EQUAL,
01068 NOT_EQUAL,
01069 LESS,
01070 LESS_EQUAL,
01071 GREATER,
01072 GREATER_EQUAL,
01073 IN,
01074 NOT_IN
01075 };
01076
01077
01078 EvaluationCode getEvaluationCode() const;
01079 PredOperator getOperator() const;
01080 bool isAComparisonPredicate() const;
01081
01082
01083 PredicateInfo(TMUDRSerializableObject::TMUDRObjectType t);
01084 void setOperator(PredOperator op);
01085 void setEvaluationCode(EvaluationCode c);
01086 virtual void mapColumnNumbers(const std::vector<int> &map) = 0;
01087 virtual void toString(std::string &s,
01088 const TableInfo &ti) const = 0;
01089
01090 inline static unsigned short getCurrentVersion() { return 1; }
01091 virtual int serializedLength();
01092 virtual int serialize(Bytes &outputBuffer,
01093 int &outputBufferLength);
01094 virtual int deserialize(ConstBytes &inputBuffer,
01095 int &inputBufferLength);
01096
01097 private:
01098
01099 int evalCode_;
01100 PredOperator operator_;
01101
01102 };
01103
01112 class ComparisonPredicateInfo : public PredicateInfo
01113 {
01114 public:
01115
01116 int getColumnNumber() const;
01117 bool hasAConstantValue() const;
01118 std::string getConstValue() const;
01119
01120
01121 ComparisonPredicateInfo();
01122 void setColumnNumber(int columnNumber);
01123 void setValue(const char *value);
01124 virtual void mapColumnNumbers(const std::vector<int> &map);
01125 virtual void toString(std::string &s,
01126 const TableInfo &ti) const;
01127
01128 inline static unsigned short getCurrentVersion() { return 1; }
01129 virtual int serializedLength();
01130 virtual int serialize(Bytes &outputBuffer,
01131 int &outputBufferLength);
01132 virtual int deserialize(ConstBytes &inputBuffer,
01133 int &inputBufferLength);
01134
01135 private:
01136
01137 int columnNumber_;
01138 std::string value_;
01139
01140 };
01141
01142
01156 class PartitionInfo
01157 {
01158 public:
01159
01161 enum PartitionTypeCode
01162 {
01163 UNKNOWN,
01164 ANY,
01165
01166
01167 SERIAL,
01168
01169 PARTITION,
01170
01171 REPLICATE
01172 };
01173
01174
01175 PartitionInfo();
01176 PartitionTypeCode getType() const;
01177
01178
01179 int getNumEntries() const;
01180 int getColumnNum(int i) const;
01181
01182
01183 void setType(PartitionTypeCode type);
01184 void addEntry(int colNum);
01185 void clear();
01186
01187
01188 void mapColumnNumbers(const std::vector<int> &map);
01189
01190 private:
01191
01192 PartitionTypeCode type_;
01193 std::vector<int> partCols_;
01194 };
01195
01203 class OrderInfo
01204 {
01205 public:
01206
01216 enum OrderTypeCode
01217 {
01218 NO_ORDER,
01219 ASCENDING,
01220 DESCENDING
01221 };
01222
01223
01224 int getNumEntries() const;
01225 int getColumnNum(int i) const;
01226 OrderTypeCode getOrderType(int i) const;
01227
01228
01229 void addEntry(int colNum, OrderTypeCode orderType = ASCENDING);
01230 void addEntryAt(int pos,
01231 int colNum,
01232 OrderTypeCode orderType = ASCENDING);
01233 void clear();
01234
01235
01236 void mapColumnNumbers(const std::vector<int> &map);
01237
01238 private:
01239 std::vector<int> columnNumbers_;
01240 std::vector<OrderTypeCode> orderTypes_;
01241 };
01242
01243
01251 class TupleInfo : public TMUDRSerializableObject
01252 {
01253 public:
01254
01255
01256 int getNumColumns() const;
01257 int getColNum(const char *colName) const;
01258 int getColNum(const std::string &colName) const;
01259 const ColumnInfo &getColumn(int colNum) const;
01260 const ColumnInfo &getColumn(const std::string &colName) const;
01261 const TypeInfo &getType(int colNum) const;
01262 TypeInfo::SQLTypeClassCode getSQLTypeClass(int colNum) const;
01263
01264
01265
01266 int getInt(int colNum) const;
01267 int getInt(const std::string &colName) const;
01268 long getLong(int colNum) const;
01269 long getLong(const std::string &colName) const;
01270 double getDouble(int colNum) const;
01271 double getDouble(const std::string &colName) const;
01272 std::string getString(int colNum) const;
01273 std::string getString(const std::string &colName) const;
01274 const char * getRaw(int colNum, int &byteLen) const;
01275 time_t getTime(int colNum) const;
01276 bool isAvailable(int colNum) const;
01277 void getDelimitedRow(std::string &row,
01278 char delim='|',
01279 bool quote = false,
01280 char quoteSymbol = '"',
01281 int firstColumn = 0,
01282 int lastColumn = -1) const;
01283 bool wasNull() const;
01284
01285
01286 void setInt(int colNum, int val) const;
01287 void setLong(int colNum, long val) const;
01288 void setDouble(int colNum, double val) const;
01289 void setString(int colNum, const char *val) const;
01290 void setString(int colNum, const char *val, int stringLen) const;
01291 void setString(int colNum, const std::string &val) const;
01292 void setTime(int colNum, time_t val) const;
01293 const char * setFromDelimitedRow(const char *row,
01294 char delim='|',
01295 bool quote = false,
01296 char quoteSymbol = '"',
01297 int firstColumnToSet = 0,
01298 int lastColumnToSet = -1,
01299 int numDelimColsToSkip = 0) const;
01300 void setNull(int colNum) const;
01301
01302
01303 ColumnInfo &getColumn(int colNum);
01304 ColumnInfo &getColumn(const std::string &colName);
01305 void addColumn(const ColumnInfo &column);
01306
01307
01308 void addIntColumn(const char *colName, bool isNullable = false);
01309 void addLongColumn(const char *colName, bool isNullable = false);
01310 void addCharColumn(
01311 const char *colName,
01312 int length,
01313 bool isNullable = false,
01314 TypeInfo::SQLCharsetCode charset = TypeInfo::CHARSET_UTF8,
01315 TypeInfo::SQLCollationCode collation = TypeInfo::SYSTEM_COLLATION);
01316 void addVarCharColumn(
01317 const char *colName,
01318 int length,
01319 bool isNullable = false,
01320 TypeInfo::SQLCharsetCode charset = TypeInfo::CHARSET_UTF8,
01321 TypeInfo::SQLCollationCode collation = TypeInfo::SYSTEM_COLLATION);
01322
01323 void addColumns(const std::vector<ColumnInfo *> &columns);
01324 void addColumnAt(const ColumnInfo &column, int position);
01325 void deleteColumn(int i);
01326 void deleteColumn(const std::string &name);
01327
01328
01329 int getRecordLength() const;
01330
01331
01332 void print();
01333
01334
01335 TupleInfo(TMUDRObjectType objType, int version);
01336 ~TupleInfo();
01337 inline static unsigned short getCurrentVersion() { return 1; }
01338 virtual int serializedLength();
01339 virtual int serialize(Bytes &outputBuffer,
01340 int &outputBufferLength);
01341 virtual int deserialize(ConstBytes &inputBuffer,
01342 int &inputBufferLength);
01343 char *getRowPtr() const;
01344
01345 protected:
01346
01347 void setRecordLength(int len);
01348 void setRowPtr(char *ptr);
01349
01350
01351
01352
01353
01354 std::vector<ColumnInfo *> columns_;
01355 int recordLength_;
01356 char * rowPtr_;
01357 bool wasNull_;
01358
01359
01360 friend class ::TMUDFInternalSetup;
01361 friend class ::LmRoutineCppObj;
01362 };
01363
01368 class TableInfo : public TupleInfo
01369 {
01370 public:
01371
01372
01373 long getEstimatedNumRows() const;
01374 long getEstimatedNumPartitions() const;
01375 const PartitionInfo &getQueryPartitioning() const;
01376 const OrderInfo &getQueryOrdering() const;
01377 bool isStream() const;
01378 int getNumConstraints() const;
01379 const ConstraintInfo &getConstraint(int i) const;
01380
01381
01382 void setEstimatedNumRows(long rows);
01383 void addCardinalityConstraint(const CardinalityConstraintInfo &constraint);
01384 void addUniquenessConstraint(const UniqueConstraintInfo &constraint);
01385 void setIsStream(bool stream);
01386
01387
01388 void print();
01389
01390
01391 TableInfo();
01392 ~TableInfo();
01393 inline static unsigned short getCurrentVersion() { return 1; }
01394 PartitionInfo &getQueryPartitioning();
01395 OrderInfo &getQueryOrdering();
01396 void setQueryPartitioning(const PartitionInfo &partInfo);
01397 void setQueryOrdering(const OrderInfo &orderInfo);
01398 virtual int serializedLength();
01399 virtual int serialize(Bytes &outputBuffer,
01400 int &outputBufferLength);
01401 virtual int deserialize(ConstBytes &inputBuffer,
01402 int &inputBufferLength);
01403
01404 private:
01405
01406
01407
01408
01409 long estimatedNumRows_;
01410 long estimatedNumPartitions_;
01411 PartitionInfo queryPartitioning_;
01412 OrderInfo queryOrdering_;
01413 std::vector<ConstraintInfo *> constraints_;
01414
01415
01416 friend class ::TMUDFInternalSetup;
01417 };
01418
01428 class ParameterListInfo : public TupleInfo
01429 {
01430 public:
01431
01432 ParameterListInfo();
01433 virtual ~ParameterListInfo();
01434
01435
01436 inline static unsigned short getCurrentVersion() { return 1; }
01437 virtual int serializedLength();
01438 virtual int serialize(Bytes &outputBuffer,
01439 int &outputBufferLength);
01440 virtual int deserialize(ConstBytes &inputBuffer,
01441 int &inputBufferLength);
01442 };
01443
01454 class UDRWriterCompileTimeData
01455 {
01456 public:
01457
01458 UDRWriterCompileTimeData();
01459 virtual ~UDRWriterCompileTimeData();
01460
01461
01462 virtual void print();
01463
01464 };
01465
01477 class UDRInvocationInfo : public TMUDRSerializableObject
01478 {
01479 public:
01480
01484 enum FuncType
01485 {
01486 GENERIC,
01487
01488 MAPPER,
01489
01490
01491
01492
01493
01494
01495 REDUCER
01496
01497
01498
01499
01500
01501
01502 };
01503
01507 enum SQLAccessType
01508 {
01509 CONTAINS_NO_SQL,
01510 READS_SQL,
01511 MODIFIES_SQL
01512 };
01513
01517 enum SQLTransactionType
01518 {
01519 REQUIRES_NO_TRANSACTION,
01520 REQUIRES_SQL_TRANSACTION
01521 };
01522
01529 enum SQLRightsType
01530 {
01531 INVOKERS_RIGHTS,
01532 DEFINERS_RIGHTS
01533 };
01534
01538 enum IsolationType
01539 {
01540 ISOLATED,
01541 TRUSTED
01542 };
01543
01551 enum CallPhase
01552 {
01553 UNKNOWN_CALL_PHASE = 0,
01554
01555
01556
01557 DEBUG_LOOP_CALL = 4,
01558 GET_ROUTINE_CALL = 6,
01559
01560
01561 COMPILER_INITIAL_CALL = 10,
01562 COMPILER_DATAFLOW_CALL = 20,
01563 COMPILER_CONSTRAINTS_CALL = 30,
01564 COMPILER_STATISTICS_CALL = 40,
01565 COMPILER_DOP_CALL = 50,
01566 COMPILER_PLAN_CALL = 60,
01567 COMPILER_COMPLETION_CALL = 70,
01568 RUNTIME_WORK_CALL = 110
01569 };
01570
01579 enum DebugFlags
01580 {
01581 DEBUG_INITIAL_RUN_TIME_LOOP_ONE = 0x00000001,
01582 DEBUG_INITIAL_RUN_TIME_LOOP_ALL = 0x00000002,
01583 DEBUG_INITIAL_COMPILE_TIME_LOOP = 0x00000004,
01584 DEBUG_LOAD_MSG_LOOP = 0x00000008,
01585 TRACE_ROWS = 0x00000010,
01586 PRINT_INVOCATION_INFO_INITIAL = 0x00000020,
01587 PRINT_INVOCATION_INFO_END_COMPILE = 0x00000040,
01588 PRINT_INVOCATION_INFO_AT_RUN_TIME = 0x00000080,
01589 VALIDATE_WALLS = 0x00000100
01590 };
01591
01592
01593
01594
01595 const std::string &getUDRName() const;
01596 int getNumTableInputs() const;
01597 const TableInfo &in(int childNum = 0) const;
01598 const TableInfo &out() const;
01599 CallPhase getCallPhase() const;
01600 const std::string &getCurrentUser() const;
01601 const std::string &getSessionUser() const;
01602 const std::string &getCurrentRole() const;
01603 SQLAccessType getSQLAccessType() const;
01604 SQLTransactionType getSQLTransactionType() const;
01605 SQLRightsType getSQLRights() const;
01606 IsolationType getIsolationType() const;
01607 bool isCompileTime() const;
01608 bool isRunTime() const;
01609 int getDebugFlags() const;
01610 FuncType getFuncType() const;
01611 const ParameterListInfo &getFormalParameters() const;
01612 const ParameterListInfo &par() const;
01613 int getNumPredicates() const;
01614 const PredicateInfo &getPredicate(int i) const;
01615 bool isAComparisonPredicate(int i) const;
01616 const ComparisonPredicateInfo &getComparisonPredicate(int i) const;
01617
01618
01619
01620
01621 TableInfo &out();
01622 void addFormalParameter(const ColumnInfo ¶m);
01623 void setFuncType(FuncType type);
01624 void addPassThruColumns(int inputTableNum = 0,
01625 int startInputColNum = 0,
01626 int endInputColNum = -1);
01627 void setChildPartitioning(int inputTableNum,
01628 const PartitionInfo &partInfo);
01629 void setChildOrdering(int inputTableNum,
01630 const OrderInfo &orderInfo);
01631
01632
01633 void setChildColumnUsage(int inputTableNum,
01634 int inputColumnNum,
01635 ColumnInfo::ColumnUseCode usage);
01636 void setUnusedPassthruColumns();
01637 void setPredicateEvaluationCode(int predicateNum,
01638 PredicateInfo::EvaluationCode c);
01639 void pushPredicatesOnPassthruColumns(int startPredNum = 0,
01640 int lastPredNum = -1);
01641
01642
01643 void propagateConstraintsFor1To1UDFs(bool exactlyOneRowPerInput);
01644
01645
01646 UDRWriterCompileTimeData *getUDRWriterCompileTimeData();
01647 void setUDRWriterCompileTimeData(UDRWriterCompileTimeData *compileTimeData);
01648
01649
01650 void copyPassThruData(int inputTableNum = 0,
01651 int startInputColNum = 0,
01652 int endInputColNum = -1);
01653 const std::string &getQueryId() const;
01654 int getNumParallelInstances() const;
01655 int getMyInstanceNum() const;
01656
01657
01658 void print();
01659
01660
01661 inline static unsigned short getCurrentVersion() { return 1; }
01662 virtual int serializedLength();
01663 void serializeObj(Bytes outputBuffer, int outputBufferLength);
01664 void deserializeObj(ConstBytes inputBuffer, int inputBufferLength);
01665 virtual int serialize(Bytes &outputBuffer,
01666 int &outputBufferLength);
01667 virtual int deserialize(ConstBytes &inputBuffer,
01668 int &inputBufferLength);
01669 static const char *callPhaseToString(CallPhase c);
01670
01671 private:
01672
01673 UDRInvocationInfo();
01674 ~UDRInvocationInfo();
01675 ParameterListInfo &nonConstFormalParameters();
01676 ParameterListInfo &nonConstActualParameters();
01677 void validateCallPhase(CallPhase start,
01678 CallPhase end,
01679 const char *callee) const;
01680 void setQueryId(const char *qid);
01681 void setTotalNumInstances(int i);
01682 void setMyInstanceNum(int i);
01683
01684 static const int MAX_INPUT_TABLES = 2;
01685
01686 std::string name_;
01687 int numTableInputs_;
01688 CallPhase callPhase_;
01689 std::string currentUser_;
01690 std::string sessionUser_;
01691 std::string currentRole_;
01692 std::string queryId_;
01693 SQLAccessType sqlAccessType_;
01694 SQLTransactionType sqlTransactionType_;
01695 SQLRightsType sqlRights_;
01696 IsolationType isolationType_;
01697 TableInfo inputTableInfo_[MAX_INPUT_TABLES];
01698 TableInfo outputTableInfo_;
01699 int debugFlags_;
01700 FuncType funcType_;
01701 ParameterListInfo formalParameterInfo_;
01702 ParameterListInfo actualParameterInfo_;
01703 std::vector<PredicateInfo *> predicates_;
01704 UDRWriterCompileTimeData *udrWriterCompileTimeData_;
01705 int totalNumInstances_;
01706 int myInstanceNum_;
01707
01708 friend class UDRPlanInfo;
01709
01710 friend class ::TMUDFInternalSetup;
01711 friend class ::SPInfo;
01712 friend class ::LmLanguageManagerC;
01713 friend class ::LmLanguageManagerJava;
01714 friend class ::LmRoutineCppObj;
01715 };
01716
01725 class UDRPlanInfo : public TMUDRSerializableObject
01726 {
01727 public:
01734 enum SpecialDegreeOfParallelism
01735 {
01736 ANY_DEGREE_OF_PARALLELISM = 0,
01737 DEFAULT_DEGREE_OF_PARALLELISM = -1,
01738
01739 MAX_DEGREE_OF_PARALLELISM = -2,
01740
01741
01742 ONE_INSTANCE_PER_NODE = -3
01743
01744
01745
01746 };
01747
01748
01749 int getPlanNum() const;
01750 long getCostPerRow() const;
01751 int getDesiredDegreeOfParallelism() const;
01752
01753
01754
01755 void setCostPerRow(long nanoseconds);
01756
01757
01758 void setDesiredDegreeOfParallelism(int dop);
01759
01760 UDRWriterCompileTimeData *getUDRWriterCompileTimeData();
01761 void setUDRWriterCompileTimeData(UDRWriterCompileTimeData *compileTimeData);
01762
01763
01764 void addPlanData(const char *planData,
01765 int planDataLength);
01766 const char *getPlanData(int &planDataLength);
01767
01768
01769 void print();
01770
01771
01772 inline static unsigned short getCurrentVersion() { return 1; }
01773 virtual int serializedLength();
01774 void serializeObj(Bytes outputBuffer, int outputBufferLength);
01775 void deserializeObj(ConstBytes inputBuffer, int inputBufferLength);
01776 virtual int serialize(Bytes &outputBuffer,
01777 int &outputBufferLength);
01778 virtual int deserialize(ConstBytes &inputBuffer,
01779 int &inputBufferLength);
01780
01781 private:
01782
01783 UDRPlanInfo(UDRInvocationInfo *invocationInfo, int planNum);
01784 ~UDRPlanInfo();
01785
01786 UDRInvocationInfo *invocationInfo_;
01787 int planNum_;
01788 long costPerRow_;
01789 int degreeOfParallelism_;
01790 UDRWriterCompileTimeData *udrWriterCompileTimeData_;
01791 const char *planData_;
01792 int planDataLength_;
01793
01794
01795 friend class ::TMUDFInternalSetup;
01796 friend class ::SPInfo;
01797 friend class ::LmLanguageManagerC;
01798 friend class ::LmRoutineCppObj;
01799 };
01800
01872 class UDR
01873 {
01874 public:
01875
01876 UDR();
01877 virtual ~UDR();
01878
01879
01880 virtual void describeParamsAndColumns(UDRInvocationInfo &info);
01881 virtual void describeDataflowAndPredicates(UDRInvocationInfo &info);
01882 virtual void describeConstraints(UDRInvocationInfo &info);
01883 virtual void describeStatistics(UDRInvocationInfo &info);
01884 virtual void describeDesiredDegreeOfParallelism(UDRInvocationInfo &info,
01885 UDRPlanInfo &plan);
01886 virtual void describePlanProperties(UDRInvocationInfo &info,
01887 UDRPlanInfo &plan);
01888 virtual void completeDescription(UDRInvocationInfo &info,
01889 UDRPlanInfo &plan);
01890
01891
01892 virtual void processData(UDRInvocationInfo &info,
01893 UDRPlanInfo &plan);
01894
01895
01896
01897
01898 bool getNextRow(UDRInvocationInfo &info, int tableIndex = 0);
01899
01900 void emitRow(UDRInvocationInfo &info);
01901
01902
01903 virtual void debugLoop();
01904
01905
01906 inline static unsigned short getCurrentVersion() { return 1; }
01907 virtual int getFeaturesSupportedByUDF();
01908
01909 friend class ::LmRoutineCppObj;
01910
01911 private:
01912
01913 SQLUDR_GetNextRow getNextRowPtr_;
01914 SQLUDR_EmitRow emitRowPtr_;
01915
01916 };
01917
01921 typedef UDR * (*CreateInterfaceObjectFunc) ();
01922
01923 }
01924
01925
01926 #endif
01927
01928
01929 #endif