//****************************************************************** // // AUTHOR : ZhaoTiger // // FUNCTION : 通用SQL解析器头文件,定义重要结构 // // TIME : 2003.10.08 // // HISTORY : 从胡泊的公式解析器改造而来 // Datetime Action Author Reason // ----------------------------------------------------------------- // 2003.10.08 Creation ZhaoTiger // //****************************************************************** #ifndef __SQL_INTREPRETER_STRUCT_H__ #define __SQL_INTREPRETER_STRUCT_H__ #ifdef _WINDOWS32 #ifdef SQL_ANALYSER_EXPORTS #define SQL_ANALYSER_API __declspec(dllexport) #else #define SQL_ANALYSER_API __declspec(dllimport) #endif #else #define SQL_ANALYSER_API #endif #include "db_api/odb_struct.h" #include #include using namespace std; namespace SQL_ANALYSER { // 域的相关信息,这些信息从调用该语法分析模块的程序传入 // 这样可以使语法分析模块相对独立,不会因为是商用数据库 // 还是实时数据库产生代码上的依赖 typedef struct SQL_ANALYSER_API { char col_name[MAX_SYMBOL_LEN]; // 域名 short col_type; // 域数据类型 } TAnalysColumnInfo; // 用于WHERE表达式处理时返回的一些信息 typedef struct SQL_ANALYSER_API { short typ; //值的类型,如果为NULL常量,类型为INTPRE_DATATYPE_NULL bool can_like; //是否可以在其后跟上LIKE操作,LIKE之前只能是一个域名 } ITEM_STRU; // 定义常量UNION typedef union SQL_ANALYSER_API { //int int_value; // 整型值数据,包括UCHAR、SHORT、INT、DATETIME类型 long int_value; // 整型值数据,包括UCHAR、SHORT、INT、LONG、DATETIME类型 float real_value; // 浮点值数据,包括FLOAT、DOUBLE类型 char string_value[MAX_CONSTANT_STRING_LEN]; // 字符串数据,包括CHAR(n)、STRING(n)类型 char binary_value[MAX_CONSTANT_BINARY_LEN]; // 二进制数据,BINARY(n)类型 _RTDB_KEY_STRU rtdbkey_value; _RTDB_KEY_STRU measrtdbkey_value; _APP_KEY_STRU apprtdbkey_value; } UConstValueInfo; // 定义常量结构 typedef struct SQL_ANALYSER_API { bool is_null; // TRUE表示NULL常量,FALSE表示非NULL常量 short const_type; // 非NULL常量的数据类型 UConstValueInfo const_value; // 常量的数值,根据const_type来确认使用何分量 } TConstInfo; // 定义WHERE子句的逆波兰结构 typedef struct SQL_ANALYSER_API { unsigned char code_type; // CODE_TYPE_IDENTIFIER, CODE_TYPE_OPERATOR, CODE_TYPE_CONSTANT union { char iden_name[MAX_SYMBOL_LEN]; int operator_code; TConstInfo const_info; } code_info; } TWhereAntiPorland; // 定义语法分析结果 typedef struct SQL_ANALYSER_API { int sql_type; // SQL语句的类型 string table_name; // FROM 子句的表名称 vector column_name_vec; // 域定义序列,适用于 INSERT / UPDATE / SELECT vector column_value_vec; // 域值序列,适用于 INSERT / UPDATE vector order_name_vec; // ORDER BY 后的域名序列,适用于 SELECT vector where_code_vec; // 指向WHERE子句逆波兰结构的指针,适用于 DELETE / UPDATE / SELECT } TSqlAnlsResult; // 词法分析传出的结构 typedef struct SQL_ANALYSER_API { int word_id; /*本次取到的单词的类型若为关键字,则值为关键字在关键字表中的位置(从0开始的正数); 本次取到的单词的类型若为运算符,则值为运算符对应的id (从100开始的正数); 本次取到的单词的类型若为标识符,则值为IDENTIFIER; 本次取到的单词的类型若为整型数字(长整型),则值为INTEGER_VALUE; 本次取到的单词的类型若为实型数字,则值为REAL_VALUE; 本次取到的单词的类型若为字符串,则值为STRING_VALUE; 本次取到的单词的类型若为二进制,则值为BINARY_VALUE; 本次取单词时若为非法字符,则值为UNRECOGNIZED_TOKEN; 本次取单词时若代码已结束,则值为END_OF_PROGRAM; */ union { char ident[MAX_SYMBOL_LEN]; //若本次取到的单词的类型为标识符,其名称利用ident传出 float real_value; //若本次取到的单词的类型为实型数字,其值利用real_value传出 //int int_value; //若本次取到的单词的类型为整型数字,其值利用int_value传出 long int_value; //若本次取到的单词的类型为整型(包括长整型)数字,其值利用int_value传出 char string_value[MAX_CONSTANT_STRING_LEN]; //若本次取到的单词的类型为字符串,其值利用string_value传出 char binary_value[MAX_CONSTANT_BINARY_LEN]; //若本次取到的单词的类型为二进制,其值利用binary_value传出 } value_union; char rtdbkey_value[MAX_CONSTANT_STRING_LEN]; } LEXICAL_RET_RES_STRU; } #endif