@ -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 \
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
21
contrib/gms_xmlgen/CMakeLists.txt
Normal file
21
contrib/gms_xmlgen/CMakeLists.txt
Normal 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)
|
||||
25
contrib/gms_xmlgen/Makefile
Normal file
25
contrib/gms_xmlgen/Makefile
Normal 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
|
||||
1
contrib/gms_xmlgen/data/dummy.txt
Normal file
1
contrib/gms_xmlgen/data/dummy.txt
Normal file
@ -0,0 +1 @@
|
||||
The openGauss regression needs this file to run.
|
||||
3260
contrib/gms_xmlgen/expected/gms_xmlgen.out
Normal file
3260
contrib/gms_xmlgen/expected/gms_xmlgen.out
Normal file
File diff suppressed because it is too large
Load Diff
192
contrib/gms_xmlgen/gms_xmlgen--1.0.sql
Normal file
192
contrib/gms_xmlgen/gms_xmlgen--1.0.sql
Normal 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;
|
||||
5
contrib/gms_xmlgen/gms_xmlgen.control
Normal file
5
contrib/gms_xmlgen/gms_xmlgen.control
Normal 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
|
||||
1381
contrib/gms_xmlgen/gms_xmlgen.cpp
Normal file
1381
contrib/gms_xmlgen/gms_xmlgen.cpp
Normal file
File diff suppressed because it is too large
Load Diff
77
contrib/gms_xmlgen/gms_xmlgen.h
Normal file
77
contrib/gms_xmlgen/gms_xmlgen.h
Normal 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
|
||||
1182
contrib/gms_xmlgen/sql/gms_xmlgen.sql
Normal file
1182
contrib/gms_xmlgen/sql/gms_xmlgen.sql
Normal file
File diff suppressed because it is too large
Load Diff
@ -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);
|
||||
}
|
||||
|
||||
@ -99,6 +99,7 @@ static void DropExtensionInListIsSupported(List* objname)
|
||||
"gms_stats",
|
||||
"gms_output",
|
||||
"gms_profiler",
|
||||
"gms_xmlgen",
|
||||
"gms_lob",
|
||||
"gms_sql"
|
||||
#endif
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user