!6566 GMS_XMLGEN高级包兼容

Merge pull request !6566 from 梅程/GMS_XMLGEN
This commit is contained in:
opengauss_bot
2024-11-07 08:48:21 +00:00
committed by Gitee
18 changed files with 6166 additions and 3 deletions

View File

@ -107,6 +107,7 @@ install:
@if test -d contrib/gms_stats; then $(MAKE) -C contrib/gms_stats $@; fi
@if test -d contrib/gms_tcp; then $(MAKE) -C contrib/gms_tcp $@; fi
@if test -d contrib/gms_profiler; then $(MAKE) -C contrib/gms_profiler $@; fi
@if test -d contrib/gms_xmlgen; then $(MAKE) -C contrib/gms_xmlgen $@; fi
@if test -d contrib/gms_output; then $(MAKE) -C contrib/gms_output $@; fi
@if test -d contrib/timescaledb; then (./contrib/timescaledb/run_to_build.sh && $(MAKE) -C contrib/timescaledb/build $@); fi
@if test -d contrib/chparser; then \

View File

@ -133,6 +133,8 @@
./share/postgresql/extension/gms_profiler.control
./share/postgresql/extension/gms_sql--1.0.sql
./share/postgresql/extension/gms_sql.control
./share/postgresql/extension/gms_xmlgen--1.0.sql
./share/postgresql/extension/gms_xmlgen.control
./share/postgresql/timezone/GB-Eire
./share/postgresql/timezone/Turkey
./share/postgresql/timezone/Kwajalein
@ -838,6 +840,7 @@
./lib/postgresql/gms_tcp.so
./lib/postgresql/gms_profiler.so
./lib/postgresql/gms_sql.so
./lib/postgresql/gms_xmlgen.so
./lib/libpljava.so
./lib/libpq.a
./lib/libpq.so

View File

@ -121,6 +121,8 @@
./share/postgresql/extension/gms_sql.control
./share/postgresql/extension/gms_tcp--1.0.sql
./share/postgresql/extension/gms_tcp.control
./share/postgresql/extension/gms_xmlgen--1.0.sql
./share/postgresql/extension/gms_xmlgen.control
./share/postgresql/timezone/GB-Eire
./share/postgresql/timezone/Turkey
./share/postgresql/timezone/Kwajalein
@ -808,6 +810,7 @@
./lib/postgresql/gms_profiler.so
./lib/postgresql/gms_sql.so
./lib/postgresql/gms_tcp.so
./lib/postgresql/gms_xmlgen.so
./lib/libpljava.so
./lib/libpq.a
./lib/libpq.so

View File

@ -133,6 +133,8 @@
./share/postgresql/extension/gms_profiler.control
./share/postgresql/extension/gms_sql--1.0.sql
./share/postgresql/extension/gms_sql.control
./share/postgresql/extension/gms_xmlgen--1.0.sql
./share/postgresql/extension/gms_xmlgen.control
./share/postgresql/timezone/GB-Eire
./share/postgresql/timezone/Turkey
./share/postgresql/timezone/Kwajalein
@ -838,6 +840,7 @@
./lib/postgresql/gms_output.so
./lib/postgresql/gms_profiler.so
./lib/postgresql/gms_sql.so
./lib/postgresql/gms_xmlgen.so
./lib/libpljava.so
./lib/libpq.a
./lib/libpq.so

View File

@ -34,6 +34,13 @@ set(CMAKE_MODULE_PATH
${CMAKE_CURRENT_SOURCE_DIR}/gms_tcp
)
if("${USE_LIBXML}" STREQUAL "ON")
INCLUDE_DIRECTORIES(${LIBXML_INCLUDE_PATH}/libxml2)
INCLUDE_DIRECTORIES(${LIBXML_LIB_PATH})
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/gms_xmlgen)
add_subdirectory(gms_xmlgen)
endif()
add_subdirectory(hstore)
add_subdirectory(test_decoding)
add_subdirectory(mppdb_decoding)
@ -67,5 +74,4 @@ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/chparser)
add_subdirectory(chparser)
endif()
add_subdirectory(gms_profiler)
add_subdirectory(gms_lob)

View File

@ -70,8 +70,10 @@ endif
ifeq ($(with_libxml),yes)
SUBDIRS += xml2
SUBDIRS += gms_xmlgen
else
ALWAYS_SUBDIRS += xml2
ALWAYS_SUBDIRS += gms_xmlgen
endif
ifeq ($(with_selinux),yes)

View File

@ -0,0 +1,21 @@
#This is the main CMAKE for build all gms_xmlgen.
# gms_xmlgen
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} TGT_gms_xmlgen_SRC)
set(TGT_gms_xmlgen_INC
${PROJECT_OPENGS_DIR}/contrib/gms_xmlgen
${PROJECT_OPENGS_DIR}/contrib
)
set(gms_xmlgen_DEF_OPTIONS ${MACRO_OPTIONS})
set(gms_xmlgen_COMPILE_OPTIONS ${OPTIMIZE_OPTIONS} ${OS_OPTIONS} ${PROTECT_OPTIONS} ${WARNING_OPTIONS} ${LIB_SECURE_OPTIONS} ${CHECK_OPTIONS})
set(gms_xmlgen_LINK_OPTIONS ${LIB_LINK_OPTIONS})
add_shared_libtarget(gms_xmlgen TGT_gms_xmlgen_SRC TGT_gms_xmlgen_INC "${gms_xmlgen_DEF_OPTIONS}" "${gms_xmlgen_COMPILE_OPTIONS}" "${gms_xmlgen_LINK_OPTIONS}")
set_target_properties(gms_xmlgen PROPERTIES PREFIX "")
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gms_xmlgen.control
DESTINATION share/postgresql/extension/
)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gms_xmlgen--1.0.sql
DESTINATION share/postgresql/extension/
)
install(TARGETS gms_xmlgen DESTINATION lib/postgresql)

View File

@ -0,0 +1,25 @@
# contrib/gms_xmlgen/Makefile
MODULE_big = gms_xmlgen
OBJS = gms_xmlgen.o
EXTENSION = gms_xmlgen
DATA = gms_xmlgen--1.0.sql
exclude_option = -fPIE
top_builddir = ../..
include $(top_builddir)/src/Makefile.global
override CPPFLAGS := -fstack-protector-strong $(filter-out $(exclude_option),$(CPPFLAGS)) -I$(LIBXML_INCLUDE_PATH)/libxml2
REGRESS = gms_xmlgen
ifdef USE_PGXS
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
else
subdir = contrib/gms_xmlgen
regress_home = $(top_builddir)/src/test/regress
REGRESS_OPTS = -c 0 -d 1 -r 1 -p 25633 --single_node -w --keep_last_data=false \
--regconf=$(regress_home)/regress.conf \
--temp-config=$(regress_home)/make_fastcheck_postgresql.conf
include $(top_srcdir)/contrib/contrib-global.mk
endif

View File

@ -0,0 +1 @@
The openGauss regression needs this file to run.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,192 @@
/* contrib/gms_xmlgen/gms_xmlgen--1.0.sql */
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION gms_xmlgen" to load this file. \quit
CREATE SCHEMA gms_xmlgen;
GRANT USAGE ON SCHEMA gms_xmlgen TO PUBLIC;
-- create fake type gms_xmlgen.ctxhandle
create domain gms_xmlgen.ctxhandle as number;
-- gms_xmlgen.closecontext
CREATE OR REPLACE FUNCTION gms_xmlgen.close_context(ctx IN gms_xmlgen.ctxhandle)
RETURNS void
AS 'MODULE_PATHNAME', 'close_context'
LANGUAGE C STRICT IMMUTABLE;
CREATE OR REPLACE PROCEDURE gms_xmlgen.closecontext(ctx IN gms_xmlgen.ctxhandle)
AS
BEGIN
gms_xmlgen.close_context(ctx);
END;
-- gms_xmlgen.convert
CREATE OR REPLACE FUNCTION gms_xmlgen.convert(xmlData IN VARCHAR2, flag IN NUMBER := 0)
RETURNS VARCHAR2 PACKAGE
AS 'MODULE_PATHNAME', 'convert_xml'
LANGUAGE C IMMUTABLE;
CREATE OR REPLACE FUNCTION gms_xmlgen.convert(xmlData IN CLOB, flag IN NUMBER := 0)
RETURNS CLOB PACKAGE
AS 'MODULE_PATHNAME', 'convert_clob'
LANGUAGE C IMMUTABLE;
-- gms_xmlgen.getnumrowsprocessed
CREATE OR REPLACE FUNCTION gms_xmlgen.getnumrowsprocessed(ctx IN gms_xmlgen.ctxhandle)
RETURNS NUMBER
AS 'MODULE_PATHNAME', 'get_num_rows_processed'
LANGUAGE C STRICT VOLATILE;
-- gms_xmlgen.getxml
CREATE OR REPLACE FUNCTION gms_xmlgen.getxml(sqlQuery IN VARCHAR2, dtdOrSchema IN NUMBER := 0)
RETURNS CLOB PACKAGE
AS 'MODULE_PATHNAME', 'get_xml_by_query'
LANGUAGE C VOLATILE;
CREATE OR REPLACE FUNCTION gms_xmlgen.getxml(ctx IN gms_xmlgen.ctxhandle, dtdOrSchema IN NUMBER := 0)
RETURNS CLOB PACKAGE
AS 'MODULE_PATHNAME', 'get_xml_by_ctx_id'
LANGUAGE C VOLATILE;
CREATE OR REPLACE PROCEDURE gms_xmlgen.getxml(ctx IN gms_xmlgen.ctxhandle, tmpclob INOUT CLOB, dtdOrSchema IN NUMBER := 0)
PACKAGE
AS
BEGIN
tmpclob := gms_xmlgen.getxml(ctx, dtdOrSchema);
END;
-- gms_xmlgen.getxmltype
CREATE OR REPLACE FUNCTION gms_xmlgen.getxmltype(ctx IN gms_xmlgen.ctxhandle, dtdOrSchema IN NUMBER := 0)
RETURNS xmltype PACKAGE
AS $$
select xmltype(gms_xmlgen.getxml(ctx, dtdOrSchema))::xmltype;
$$
LANGUAGE SQL VOLATILE;
CREATE OR REPLACE FUNCTION gms_xmlgen.getxmltype(sqlQuery IN VARCHAR2, dtdOrSchema IN NUMBER := 0)
RETURNS xmltype PACKAGE
AS $$
select xmltype(gms_xmlgen.getxml(sqlQuery, dtdOrSchema))::xmltype;
$$
LANGUAGE SQL VOLATILE;
-- gms_xmlgen.newcontext
CREATE OR REPLACE FUNCTION gms_xmlgen.newcontext(queryString IN VARCHAR2)
RETURNS gms_xmlgen.ctxhandle PACKAGE
AS 'MODULE_PATHNAME', 'new_context_by_query'
LANGUAGE C VOLATILE;
CREATE OR REPLACE FUNCTION gms_xmlgen.newcontext(queryString IN SYS_REFCURSOR)
RETURNS gms_xmlgen.ctxhandle PACKAGE
AS 'MODULE_PATHNAME', 'new_context_by_cursor'
LANGUAGE C VOLATILE;
-- gms_xmlgen.newcontextfromhierarchy
CREATE OR REPLACE FUNCTION gms_xmlgen.newcontextfromhierarchy(queryString IN VARCHAR2)
RETURNS gms_xmlgen.ctxhandle
AS 'MODULE_PATHNAME', 'new_context_from_hierarchy'
LANGUAGE C VOLATILE;
-- gms_xmlgen.restartquery
CREATE OR REPLACE FUNCTION gms_xmlgen.restart_query(ctx IN gms_xmlgen.ctxhandle)
RETURNS gms_xmlgen.ctxhandle
AS 'MODULE_PATHNAME', 'restart_query'
LANGUAGE C STRICT VOLATILE;
CREATE OR REPLACE PROCEDURE gms_xmlgen.restartquery(ctx IN gms_xmlgen.ctxhandle)
AS
BEGIN
gms_xmlgen.restart_query(ctx);
END;
-- gms_xmlgen.setconvertspecialchars
CREATE OR REPLACE FUNCTION gms_xmlgen.set_convert_special_chars(ctx IN gms_xmlgen.ctxhandle, is_convert IN boolean)
RETURNS void
AS 'MODULE_PATHNAME', 'set_convert_special_chars'
LANGUAGE C STRICT IMMUTABLE;
CREATE OR REPLACE PROCEDURE gms_xmlgen.setconvertspecialchars(ctx IN gms_xmlgen.ctxhandle, is_convert IN boolean)
AS
BEGIN
gms_xmlgen.set_convert_special_chars(ctx, is_convert);
END;
-- gms_xmlgen.setmaxrows
CREATE OR REPLACE FUNCTION gms_xmlgen.set_max_rows(ctx IN gms_xmlgen.ctxhandle, maxrows IN NUMBER)
RETURNS void
AS 'MODULE_PATHNAME', 'set_max_rows'
LANGUAGE C STRICT IMMUTABLE;
CREATE OR REPLACE PROCEDURE gms_xmlgen.setmaxrows(ctx IN gms_xmlgen.ctxhandle, maxrows IN NUMBER)
AS
BEGIN
gms_xmlgen.set_max_rows(ctx, maxrows);
END;
-- gms_xmlgen.setnullhandling
CREATE OR REPLACE FUNCTION gms_xmlgen.set_null_handling(ctx IN gms_xmlgen.ctxhandle, flag IN NUMBER)
RETURNS void
AS 'MODULE_PATHNAME', 'set_null_handling'
LANGUAGE C STRICT IMMUTABLE;
CREATE OR REPLACE PROCEDURE gms_xmlgen.setnullhandling(ctx IN gms_xmlgen.ctxhandle, flag IN NUMBER)
AS
BEGIN
gms_xmlgen.set_null_handling(ctx, flag);
END;
-- gms_xmlgen.setrowsettag
CREATE OR REPLACE FUNCTION gms_xmlgen.set_row_set_tag(ctx IN gms_xmlgen.ctxhandle, rowSetTagName IN VARCHAR2)
RETURNS void
AS 'MODULE_PATHNAME', 'set_row_set_tag'
LANGUAGE C IMMUTABLE;
CREATE OR REPLACE PROCEDURE gms_xmlgen.setrowsettag(ctx IN gms_xmlgen.ctxhandle, rowSetTagName IN VARCHAR2)
AS
BEGIN
gms_xmlgen.set_row_set_tag(ctx, rowSetTagName);
END;
-- gms_xmlgen.setrowtag
CREATE OR REPLACE FUNCTION gms_xmlgen.set_row_tag(ctx IN gms_xmlgen.ctxhandle, rowTagName IN VARCHAR2)
RETURNS void
AS 'MODULE_PATHNAME', 'set_row_tag'
LANGUAGE C IMMUTABLE;
CREATE OR REPLACE PROCEDURE gms_xmlgen.setrowtag(ctx IN gms_xmlgen.ctxhandle, rowTagName IN VARCHAR2)
AS
BEGIN
gms_xmlgen.set_row_tag(ctx, rowTagName);
END;
-- gms_xmlgen.setskiprows
CREATE OR REPLACE FUNCTION gms_xmlgen.set_skip_rows(ctx IN gms_xmlgen.ctxhandle, skipRows IN NUMBER)
RETURNS void
AS 'MODULE_PATHNAME', 'set_skip_rows'
LANGUAGE C STRICT IMMUTABLE;
CREATE OR REPLACE PROCEDURE gms_xmlgen.setskiprows(ctx IN gms_xmlgen.ctxhandle, skipRows IN NUMBER)
AS
BEGIN
gms_xmlgen.set_skip_rows(ctx, skipRows);
END;
-- gms_xmlgen.useitemtagsforcoll
CREATE OR REPLACE FUNCTION gms_xmlgen.use_item_tags_for_coll(ctx IN gms_xmlgen.ctxhandle)
RETURNS void
AS 'MODULE_PATHNAME', 'use_item_tags_for_coll'
LANGUAGE C STRICT IMMUTABLE;
CREATE OR REPLACE PROCEDURE gms_xmlgen.useitemtagsforcoll(ctx IN gms_xmlgen.ctxhandle)
AS
BEGIN
gms_xmlgen.use_item_tags_for_coll(ctx);
END;
-- gms_xmlgen.usenullattributeindicator
CREATE OR REPLACE PROCEDURE gms_xmlgen.usenullattributeindicator(ctx IN gms_xmlgen.ctxhandle, attrind IN BOOLEAN := TRUE)
AS
BEGIN
gms_xmlgen.set_null_handling(ctx, 1);
END;

View File

@ -0,0 +1,5 @@
# gms_xmlgen extension
comment = 'Converting the results of a SQL query to a canonical XML format'
default_version = '1.0'
module_pathname = '$libdir/gms_xmlgen'
relocatable = true

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,77 @@
#ifndef GMS_XMLGEN_H
#define GMS_XMLGEN_H
#ifdef USE_LIBXML
#define CHECK_XML_SUPPORT()
#else
#define CHECK_XML_SUPPORT() \
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("unsupported XML feature"), \
errdetail("This functionality requires the server to be built with libxml support.")))
#endif
// non-negative number between 0 ~ 4294967295
#define check_uint_valid(ctx_id) \
((ctx_id < 0 || ctx_id > UINT_MAX) \
? ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("value is out of range."))) \
: (void)0)
#define SPACE_PER_INDENTATION 2
#define NULL_FLAG_NULL_ATTR 1
#define NULL_FLAG_EMPTY_TAG 2
#define MAX_DEPTH 65535
#define XMLTYPE_STR "xmltype"
#define XML_HEADER "<?xml version=\"1.0\"?>\n"
#define XML_XSI_ATTR "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
typedef struct XMLGenContext {
MemoryContext memctx; // xmlgen memory context
int64 ctx_id; // context id for XMLGenContext
bool is_query; // is a query or not
bool is_cursor; // is a cursor or not
char *query_string; // query for xmlgen
bool is_from_hierarchy; // is in a hierarchy context
bool is_hierarchy_set_row_set_tag; // is set row_set_tag_name in a hierarchy context
bool is_convert_special_chars; // is need to encode special chars
int64 max_rows; // max row for the xml
int64 null_flag; // empty fields display, 0 for null, 1 for nil, 2 for self-close. default 0.
char *row_tag_name; // element tag name for root
char *row_set_tag_name; // element tag name for each row
int64 skip_rows; // skip the first n lines of the query result. default 0.
int64 processed_rows; // processed rows when generate xml data.
int64 current_row; // gen xml from current_row. default 0.
char *item_tag_name; // element tag name suffix for array items
} XMLGenContext;
typedef struct XMLGenTopContext {
MemoryContext memctx;
List *xmlgen_context_list;
int64 xmlgen_context_id;
} XMLGenTopContext;
static int64 new_xmlgen_context(char *query_str, bool is_from_hierarchy = false, bool is_cursor = false);
static char *map_sql_value_to_xml(Datum value, Oid type, bool xml_escape_strings, char *array_tag_suffix = "",
int indent_level = 0);
extern "C" Datum ctxhandle_in(PG_FUNCTION_ARGS);
extern "C" Datum ctxhandle_out(PG_FUNCTION_ARGS);
extern "C" Datum close_context(PG_FUNCTION_ARGS);
extern "C" Datum convert_xml(PG_FUNCTION_ARGS);
extern "C" Datum convert_clob(PG_FUNCTION_ARGS);
extern "C" Datum get_num_rows_processed(PG_FUNCTION_ARGS);
extern "C" Datum get_xml_by_ctx_id(PG_FUNCTION_ARGS);
extern "C" Datum get_xml_by_query(PG_FUNCTION_ARGS);
extern "C" Datum new_context_by_query(PG_FUNCTION_ARGS);
extern "C" Datum new_context_by_cursor(PG_FUNCTION_ARGS);
extern "C" Datum new_context_from_hierarchy(PG_FUNCTION_ARGS);
extern "C" Datum restart_query(PG_FUNCTION_ARGS);
extern "C" Datum set_convert_special_chars(PG_FUNCTION_ARGS);
extern "C" Datum set_max_rows(PG_FUNCTION_ARGS);
extern "C" Datum set_null_handling(PG_FUNCTION_ARGS);
extern "C" Datum set_row_set_tag(PG_FUNCTION_ARGS);
extern "C" Datum set_row_tag(PG_FUNCTION_ARGS);
extern "C" Datum set_skip_rows(PG_FUNCTION_ARGS);
extern "C" Datum use_item_tags_for_coll(PG_FUNCTION_ARGS);
extern "C" void set_extension_index(uint32 index);
extern "C" void init_session_vars(void);
#endif // GMS_XMLGEN_H

File diff suppressed because it is too large Load Diff

View File

@ -364,7 +364,7 @@ static void appendStringInfoText(StringInfo str, const text* t)
}
#endif
static xmltype* stringinfo_to_xmltype(StringInfo buf)
xmltype* stringinfo_to_xmltype(StringInfo buf)
{
return (xmltype*)cstring_to_text_with_len(buf->data, buf->len);
}

View File

@ -99,6 +99,7 @@ static void DropExtensionInListIsSupported(List* objname)
"gms_stats",
"gms_output",
"gms_profiler",
"gms_xmlgen",
"gms_lob",
"gms_sql"
#endif

View File

@ -80,7 +80,7 @@ extern char* escape_xml(const char* str);
extern char* map_sql_identifier_to_xml_name(char* ident, bool fully_escaped, bool escape_period);
extern char* map_xml_name_to_sql_identifier(char* name);
extern char* map_sql_value_to_xml_value(Datum value, Oid type, bool xml_escape_strings);
extern xmltype* stringinfo_to_xmltype(StringInfo buf);
/* xmltype functions */
extern Datum xmltype_extract(PG_FUNCTION_ARGS);
extern Datum xmltype_extractvalue(PG_FUNCTION_ARGS);