mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-22 14:43:03 +01:00
- External Engines implementation.
- Plugins API. - Feature CORE-2700 - UDR (User Defined Routines) Engine - C++ API supporting functions, triggers and stored procedures. - Feature CORE-2470 - Support for alternate format of strings literals. - Feature CORE-2310 - DDL triggers. - Feature CORE-2312 - PSQL Packages. - Feature CORE-1209 - CONTINUE statement. - Feature CORE-1180 - DDL syntax to change (not) nullable state of columns. - Feature CORE-2090 - Support OVER () clause with current aggregate functions. - Fixed CORE-2699 - Common table expression context could be used with parameters. - Introduce ODS 12.0. - Work in progress in type-safe parser. - Refactor some DDL commands (procedures and triggers) from DYN to DdlNodes. - Refactor virtual tables to use a class hierarchy instead of namespaces. This is basic thing, not based on the changes done in Vulcan. Window functions is based on this work. - Refactor COMMENT ON and DROP FUNCTION from DYN to DdlNodes. COMMENT ON do not use GDML anymore, it uses DSQL with PreparedStatement class. - Refactor EXECUTE BLOCK to StmtNodes. - Refactor the IUDF to SysFunctions. That eliminates RDB$GET_CONTEXT and RDB$SET_CONTEXT from RDB$FUNCTIONS.
This commit is contained in:
parent
638267b16a
commit
ed0e0daeb3
@ -32206,7 +32206,8 @@
|
||||
|
||||
* firebird2/src/jrd/: GlobalRWLock.cpp (1.3), cch.cpp (1.160):
|
||||
|
||||
Small NBAK performance optimization from Rom
an Simakov
|
||||
Small NBAK performance optimization from Rom
|
||||
an Simakov
|
||||
|
||||
2007-05-04 16:48 asfernandes
|
||||
|
||||
|
@ -80,6 +80,7 @@ fi
|
||||
|
||||
# If NOCONFIGURE is set, skip the call to configure
|
||||
if test "x$NOCONFIGURE" = "x"; then
|
||||
conf_flags="$conf_flags --enable-binreloc"
|
||||
echo Running $SRCDIR/configure $conf_flags "$@" ...
|
||||
rm -f config.cache config.log
|
||||
chmod a+x $SRCDIR/configure
|
||||
|
@ -4286,11 +4286,6 @@
|
||||
path = fun_proto.h;
|
||||
refType = 4;
|
||||
};
|
||||
F616C5E30200B0CF01EF0ADE = {
|
||||
isa = PBXFileReference;
|
||||
path = functions.cpp;
|
||||
refType = 4;
|
||||
};
|
||||
F616C5E40200B0CF01EF0ADE = {
|
||||
isa = PBXFileReference;
|
||||
path = gds.bas;
|
||||
@ -7498,11 +7493,6 @@
|
||||
path = example.mak;
|
||||
refType = 4;
|
||||
};
|
||||
F616C9260200B0D001EF0ADE = {
|
||||
isa = PBXFileReference;
|
||||
path = functions.c;
|
||||
refType = 4;
|
||||
};
|
||||
F616C9270200B0D001EF0ADE = {
|
||||
isa = PBXFileReference;
|
||||
path = indexoff.sql;
|
||||
|
@ -66,7 +66,7 @@ all: lib_fbudf
|
||||
lib_fbudf: $(LIBIBUTIL_SO) $(UDF)/fbudf.$(SHRLIB_EXT)
|
||||
|
||||
$(UDF)/fbudf.$(SHRLIB_EXT): $(FBUDF_Objects) $(FBUTIL_Objects)
|
||||
$(call LINK_UDF,fbudf) -o $@ $^ $(LINK_UDF_LIBS) -lfbembed
|
||||
$(call LINK_UDF,fbudf) $(LINK_EMPTY_SYMBOLS) -o $@ $^ $(LINK_UDF_LIBS) -lfbembed
|
||||
|
||||
|
||||
include $(ROOT)/gen/make.shared.targets
|
||||
|
@ -62,14 +62,14 @@ all: gbak gsplit
|
||||
gbak : $(LIBFBEMBED_SO) $(GBAK)
|
||||
|
||||
$(GBAK): $(GBAK_Objects) $(CLUMPLETS_Objects) $(FBCOMMON_Objects) $(FBCLASSES_Objects)
|
||||
$(EXE_LINK) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
$(EXE_LINK) $(LINK_EMPTY_SYMBOLS) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
|
||||
|
||||
|
||||
gsplit : $(LIBFBEMBED_SO) $(GSPLIT)
|
||||
|
||||
$(GSPLIT): $(GSPLIT_Objects)
|
||||
$(EXE_LINK) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
$(EXE_LINK) $(LINK_EMPTY_SYMBOLS) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
|
||||
include $(ROOT)/gen/make.shared.targets
|
||||
|
||||
|
@ -63,7 +63,7 @@ all: gdef
|
||||
gdef: $(GDEF)
|
||||
|
||||
$(GDEF): $(GDEF_Objects) $(CLUMPLETS_Objects) $(FBCOMMON_Objects) $(FBCLASSES_Objects)
|
||||
$(EXE_LINK) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
$(EXE_LINK) $(LINK_EMPTY_SYMBOLS) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
|
||||
|
||||
|
||||
|
@ -59,7 +59,7 @@ Dependencies = $(AllObjects:.o=.d)
|
||||
gfix : $(LIBFBEMBED_SO) $(GFIX)
|
||||
|
||||
$(GFIX): $(AllObjects)
|
||||
$(EXE_LINK) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
$(EXE_LINK) $(LINK_EMPTY_SYMBOLS) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
|
||||
|
||||
include $(ROOT)/gen/make.shared.targets
|
||||
|
@ -58,7 +58,7 @@ Dependencies = $(AllObjects:.o=.d)
|
||||
gpre : $(LIBFBEMBED_SO) $(GPRE)
|
||||
|
||||
$(GPRE): $(GPRE_Objects) $(CLUMPLETS_Objects) $(FBCOMMON_Objects) $(FBCLASSES_Objects)
|
||||
$(EXE_LINK) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
$(EXE_LINK) $(LINK_EMPTY_SYMBOLS) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
|
||||
|
||||
include $(ROOT)/gen/make.shared.targets
|
||||
|
@ -59,7 +59,7 @@ Dependencies = $(AllObjects:.o=.d)
|
||||
isql : $(LIBFBEMBED_SO) $(ISQL)
|
||||
|
||||
$(ISQL): $(ISQL_Objects) $(CLUMPLETS_Objects) $(FBCOMMON_Objects) $(FBCLASSES_Objects)
|
||||
$(EXE_LINK) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LIBEDITLINE) $(LINK_LIBS)
|
||||
$(EXE_LINK) $(LINK_EMPTY_SYMBOLS) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LIBEDITLINE) $(LINK_LIBS)
|
||||
|
||||
|
||||
include $(ROOT)/gen/make.shared.targets
|
||||
|
@ -61,7 +61,7 @@ all: qli
|
||||
qli : create_yachts $(LIBFBEMBED_SO) $(QLI)
|
||||
|
||||
$(QLI): $(QLI_Objects) $(CLUMPLETS_Objects) $(FBCOMMON_Objects) $(FBCLASSES_Objects)
|
||||
$(EXE_LINK) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
$(EXE_LINK) $(LINK_EMPTY_SYMBOLS) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
|
||||
# EKU: At this point yachts.lnk is a link to empty.fdb, but gpre will fail
|
||||
# with it. metadata.fdb is what is needed here.
|
||||
|
@ -154,68 +154,68 @@ $(CREATE_DB): $(CREATEDB_Objects) $(COMMON_Objects) $(LIBFBSTATIC_A)
|
||||
nbackup: $(LIBFBEMBED_SO) $(NBACKUP)
|
||||
|
||||
$(NBACKUP): $(NBACKUP_Objects) $(CLUMPLETS_Objects) $(COMMON_Objects)
|
||||
$(EXE_LINK) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
$(EXE_LINK) $(LINK_EMPTY_SYMBOLS) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
|
||||
|
||||
fb_lock_print: $(LIBFBEMBED_SO) $(LOCKPRINT)
|
||||
|
||||
$(LOCKPRINT): $(LOCKPRINT_Objects) $(COMMON_Objects)
|
||||
$(EXE_LINK) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
$(EXE_LINK) $(LINK_EMPTY_SYMBOLS) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
|
||||
|
||||
gstat : $(LIBFBEMBED_SO) $(GSTAT)
|
||||
|
||||
$(GSTAT): $(GSTAT_Objects) $(CLUMPLETS_Objects) $(COMMON_Objects) $(FBCONFIG_Objects)
|
||||
$(EXE_LINK) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
$(EXE_LINK) $(LINK_EMPTY_SYMBOLS) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
|
||||
|
||||
gds_drop: $(GDS_DROP)
|
||||
|
||||
$(GDS_DROP): $(DROP_Objects) $(FBCOMMON_Objects) $(FBCLASSES_Objects)
|
||||
$(EXE_LINK) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
$(EXE_LINK) $(LINK_EMPTY_SYMBOLS) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
|
||||
|
||||
fbsvcmgr: $(FBSVCMGR)
|
||||
|
||||
$(FBSVCMGR): $(FBSVCMGR_Objects) $(LIBFBEMBED_SO)
|
||||
$(EXE_LINK) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
$(EXE_LINK) $(LINK_EMPTY_SYMBOLS) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
|
||||
|
||||
fbtracemgr: $(FBTRACEMGR)
|
||||
|
||||
$(FBTRACEMGR): $(FBTRACEMGR_Objects) $(LIBFBEMBED_SO)
|
||||
$(EXE_LINK) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
$(EXE_LINK) $(LINK_EMPTY_SYMBOLS) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
|
||||
|
||||
gds_relay: $(GDS_RELAY)
|
||||
|
||||
$(GDS_RELAY): $(RELAY_Objects) $(LIBFBEMBED_SO)
|
||||
$(EXE_LINK) $(LINK_OPTS) $(RELAY_Objects) -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
$(EXE_LINK) $(LINK_EMPTY_SYMBOLS) $(LINK_OPTS) $(RELAY_Objects) -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
|
||||
|
||||
gsec: $(GSEC)
|
||||
|
||||
$(GSEC): $(GSEC_Objects) $(CLUMPLETS_Objects) $(COMMON_Objects)
|
||||
$(EXE_LINK) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
$(EXE_LINK) $(LINK_EMPTY_SYMBOLS) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
|
||||
|
||||
fbguard: $(LIBFBCLIENT_SO) $(FBGUARD)
|
||||
|
||||
$(FBGUARD): $(FBGUARD_Objects) $(FBCOMMON_Objects) $(FBCLASSES_Objects)
|
||||
$(EXE_LINK) $(LINK_OPTS) $^ -o $@ -L$(LIB) -lfbclient $(LIB_GUI) $(LINK_LIBS)
|
||||
$(EXE_LINK) $(LINK_EMPTY_SYMBOLS) $(LINK_OPTS) $^ -o $@ -L$(LIB) -lfbclient $(LIB_GUI) $(LINK_LIBS)
|
||||
|
||||
|
||||
ibmgr_bin: $(IBMGR_BIN)
|
||||
|
||||
$(IBMGR_BIN): $(IBMGR_Objects) $(LIBFBEMBED_SO)
|
||||
$(EXE_LINK) $(LINK_OPTS) $(IBMGR_Objects) -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
$(EXE_LINK) $(LINK_EMPTY_SYMBOLS) $(LINK_OPTS) $(IBMGR_Objects) -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
|
||||
# This one needs a bit of work.
|
||||
|
||||
rebuild: $(GDS_REBUILD)
|
||||
|
||||
$(GDS_REBUILD): $(REBUILD_Objects) $(LIBFBEMBED_SO)
|
||||
$(EXE_LINK) $(LINK_OPTS) $(REBUILD_Objects) -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
$(EXE_LINK) $(LINK_EMPTY_SYMBOLS) $(LINK_OPTS) $(REBUILD_Objects) -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
|
||||
include $(ROOT)/gen/make.shared.targets
|
||||
|
||||
|
@ -79,12 +79,12 @@ INTL_Sources = $(addprefix $(EXAMPLES_DEST)/, $(INTL_Files))
|
||||
EMPLOYEE_DB= $(EXAMPLES_DEST)/employee.fdb
|
||||
INTLEMP_DB= $(EXAMPLES_DEST)/intlemp.fdb
|
||||
|
||||
.PHONY: all examples
|
||||
.PHONY: all examples plugins_examples
|
||||
|
||||
all: examples
|
||||
all: examples plugins_examples
|
||||
|
||||
# examples: $(EMPLOYEE_DB) $(INTLEMP_DB) $(FIREBIRD)/examples/README
|
||||
examples: $(EMPLOYEE_DB) $(FIREBIRD)/examples/README
|
||||
examples: $(EMPLOYEE_DB) $(FIREBIRD)/examples/README plugins_examples
|
||||
|
||||
$(FIREBIRD)/examples/README:
|
||||
$(CP) $(ROOT)/examples/readme $(FIREBIRD)/examples/README
|
||||
@ -165,3 +165,6 @@ $(EXAMPLES_DEST)/%.e: $(EXAMPLES_SRC)/empbuild/%.e
|
||||
|
||||
$(EXAMPLES_DEST)/%.h: $(EXAMPLES_SRC)/common/%.h
|
||||
$(CP) $^ $@
|
||||
|
||||
plugins_examples: # plugins examples
|
||||
$(MAKE) -f $(GEN_ROOT)/examples/Makefile.plugins_examples
|
||||
|
@ -49,7 +49,7 @@ SERVER_Objects = $(addprefix $(OBJ)/, $(addsuffix .o, $(basename $(SERVER_Source
|
||||
fbserver : $(FB_SUPER_SERVER)
|
||||
|
||||
$(FB_SUPER_SERVER): $(SERVER_Objects)
|
||||
$(EXE_LINK) $(LINK_OPTS) $^ -o $@ -L$(LIB) $(LIB_GUI) $(LINK_LIBS) $(ICU_LIBS)
|
||||
$(EXE_LINK) $(LINK_EXEC_EXPORT) $(LINK_FIREBIRD_SYMBOLS) $(LINK_OPTS) $^ -o $@ -L$(LIB) $(LIB_GUI) $(LINK_LIBS) $(ICU_LIBS)
|
||||
|
||||
AllObjects = $(SERVER_Objects)
|
||||
|
||||
|
@ -298,10 +298,10 @@ security2.fdb: gdef isql # build the security database
|
||||
# database earlier, then perhaps we could build the jrdlib in one step and
|
||||
# include the security bits and pieces.
|
||||
|
||||
.PHONY: ref_databases msgs msgs_intl generated_headers intl extlib includes
|
||||
.PHONY: ref_databases msgs msgs_intl generated_headers intl extlib plugins includes
|
||||
|
||||
basic_targets: ref_databases msgs msgs_intl generated_headers \
|
||||
intl extlib includes examples_cp
|
||||
intl extlib plugins includes examples_cp
|
||||
|
||||
# hack to make code regeneration work
|
||||
generated_headers :
|
||||
@ -319,6 +319,9 @@ intl: # international lang components $(FIREBIRD)/intl/
|
||||
extlib: # external programs than can be called
|
||||
$(MAKE) -f $(GEN_ROOT)/Makefile.extlib
|
||||
|
||||
plugins: # plugins
|
||||
$(MAKE) -f $(GEN_ROOT)/Makefile.plugins
|
||||
|
||||
# distribution header include files
|
||||
includes: include_generic
|
||||
|
||||
|
72
builds/posix/Makefile.in.plugins
Normal file
72
builds/posix/Makefile.in.plugins
Normal file
@ -0,0 +1,72 @@
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
# version 2.1 of the License, or (at your option) any later version.
|
||||
# You may obtain a copy of the Licence at
|
||||
# http://www.gnu.org/licences/lgpl.html
|
||||
#
|
||||
# As a special exception this file can also be included in modules
|
||||
# with other source code as long as that source code has been
|
||||
# released under an Open Source Initiative certificed licence.
|
||||
# More information about OSI certification can be found at:
|
||||
# http://www.opensource.org
|
||||
#
|
||||
# This module is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public Licence for more details.
|
||||
#
|
||||
# This module was created by members of the firebird development
|
||||
# team. All individual contributions remain the Copyright (C) of
|
||||
# those individuals and all rights are reserved. Contributors to
|
||||
# this file are either listed below or can be obtained from a CVS
|
||||
# history command.
|
||||
#
|
||||
# Created by: Mark O'Donohue <mark.odonohue@ludwig.edu.au>
|
||||
#
|
||||
# Contributor(s):
|
||||
# Adriano dos Santos Fernandes
|
||||
#
|
||||
ROOT=..
|
||||
ObjModuleType=std
|
||||
|
||||
include $(ROOT)/gen/make.defaults
|
||||
include $(ROOT)/gen/make.platform
|
||||
include $(ROOT)/gen/make.rules
|
||||
include $(ROOT)/gen/make.shared.variables
|
||||
|
||||
@SET_MAKE@
|
||||
|
||||
PLUGINS= $(FIREBIRD)/plugins
|
||||
|
||||
|
||||
UDRENG_Files = UdrEngine.cpp
|
||||
UDRENG_Sources = $(addprefix plugins/udr_engine/, $(UDRENG_Files)) jrd/mod_loader.cpp
|
||||
UDRENG_Objects = $(addprefix $(OBJ)/, $(addsuffix .o, $(basename $(UDRENG_Sources))))
|
||||
|
||||
|
||||
AllObjects = $(UDRENG_Objects) $(FBCOMMON_Objects) $(FBCLASSES_Objects)
|
||||
Dependencies = $(AllObjects:.o=.d)
|
||||
|
||||
|
||||
.PHONY: all udr_engine
|
||||
|
||||
all: udr_engine $(PLUGINS)/udr_engine.conf
|
||||
|
||||
|
||||
udr_engine: $(PLUGINS)/udr_engine.$(SHRLIB_EXT)
|
||||
|
||||
$(PLUGINS)/udr_engine.$(SHRLIB_EXT): $(UDRENG_Objects) $(FBCOMMON_Objects) $(FBCLASSES_Objects) $(OS_SPECIFIC_Objects)
|
||||
ifeq ($(PLATFORM),DARWIN)
|
||||
$(LIB_LINK) $(LIB_BUNDLE_OPTIONS) -o $@ $^ @PTHREAD_CFLAGS@ @PTHREAD_LIBS@
|
||||
else
|
||||
$(LIB_LINK) $(LINK_UDRENG_SYMBOLS) $(LIB_LINK_OPTIONS) $(LIB_LINK_SONAME)udr_engine.$(SHRLIB_EXT) \
|
||||
$(LIB_PATH_OPTS) -o $@ $^ $(THR_LIBS) $(SO_LINK_LIBS)
|
||||
endif
|
||||
|
||||
$(PLUGINS)/udr_engine.conf: $(ROOT)/src/plugins/udr_engine/udr_engine.conf
|
||||
cp $^ $@
|
||||
|
||||
include $(ROOT)/gen/make.shared.targets
|
||||
|
||||
-include $(Dependencies)
|
71
builds/posix/Makefile.in.plugins_examples
Normal file
71
builds/posix/Makefile.in.plugins_examples
Normal file
@ -0,0 +1,71 @@
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
# version 2.1 of the License, or (at your option) any later version.
|
||||
# You may obtain a copy of the Licence at
|
||||
# http://www.gnu.org/licences/lgpl.html
|
||||
#
|
||||
# As a special exception this file can also be included in modules
|
||||
# with other source code as long as that source code has been
|
||||
# released under an Open Source Initiative certificed licence.
|
||||
# More information about OSI certification can be found at:
|
||||
# http://www.opensource.org
|
||||
#
|
||||
# This module is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public Licence for more details.
|
||||
#
|
||||
# This module was created by members of the firebird development
|
||||
# team. All individual contributions remain the Copyright (C) of
|
||||
# those individuals and all rights are reserved. Contributors to
|
||||
# this file are either listed below or can be obtained from a CVS
|
||||
# history command.
|
||||
#
|
||||
# Created by: Mark O'Donohue <mark.odonohue@ludwig.edu.au>
|
||||
#
|
||||
# Contributor(s):
|
||||
# Adriano dos Santos Fernandes
|
||||
#
|
||||
ROOT=../..
|
||||
ObjModuleType=std
|
||||
|
||||
CXXFLAGS+= -I$(ROOT)/gen/firebird/include
|
||||
|
||||
include $(ROOT)/gen/make.defaults
|
||||
include $(ROOT)/gen/make.platform
|
||||
include $(ROOT)/gen/make.rules
|
||||
include $(ROOT)/gen/make.shared.variables
|
||||
|
||||
@SET_MAKE@
|
||||
|
||||
PLUGINS= $(FIREBIRD)/plugins
|
||||
|
||||
|
||||
UDR_Files = UdrCppExample.cpp
|
||||
UDR_Sources = $(addprefix ../examples/udr/, $(UDR_Files))
|
||||
UDR_Objects = $(addprefix $(OBJ)/, $(addsuffix .o, $(basename $(UDR_Sources))))
|
||||
|
||||
|
||||
AllObjects = $(UDR_Objects)
|
||||
Dependencies = $(AllObjects:.o=.d)
|
||||
|
||||
|
||||
.PHONY: all udrcpp_example
|
||||
|
||||
all: udrcpp_example
|
||||
|
||||
|
||||
udrcpp_example: $(PLUGINS)/udr/udrcpp_example.$(SHRLIB_EXT)
|
||||
|
||||
$(PLUGINS)/udr/udrcpp_example.$(SHRLIB_EXT): $(UDR_Objects)
|
||||
ifeq ($(PLATFORM),DARWIN)
|
||||
$(LIB_LINK) $(LIB_BUNDLE_OPTIONS) -o $@ $^ @PTHREAD_CFLAGS@ @PTHREAD_LIBS@
|
||||
else
|
||||
$(LIB_LINK) $(LIB_LINK_OPTIONS) $(LIB_LINK_SONAME)udrcpp_example.$(SHRLIB_EXT) \
|
||||
$(LIB_PATH_OPTS) -o $@ $^ $(THR_LIBS) $(PLUGINS)/udr_engine.so
|
||||
endif
|
||||
|
||||
include $(ROOT)/gen/make.shared.targets
|
||||
|
||||
-include $(Dependencies)
|
@ -60,7 +60,7 @@ $(OS_SPECIFIC_Objects)
|
||||
fb_smp_server: $(FB_DAEMON)
|
||||
|
||||
$(FB_DAEMON): $(SERVER_Objects)
|
||||
$(EXE_LINK) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
$(EXE_LINK) $(LINK_EMPTY_SYMBOLS) $(LINK_OPTS) $^ -o $@ $(FBEMBED_LINK) $(LINK_LIBS)
|
||||
|
||||
AllObjects = $(SERVER_Objects)
|
||||
|
||||
|
26
builds/posix/empty.vers
Normal file
26
builds/posix/empty.vers
Normal file
@ -0,0 +1,26 @@
|
||||
# Version script to hide all symbols from executables.
|
||||
#
|
||||
# The contents of this file are subject to the Initial
|
||||
# Developer's Public License Version 1.0 (the "License");
|
||||
# you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
# http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
|
||||
#
|
||||
# Software distributed under the License is distributed AS IS,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing rights
|
||||
# and limitations under the License.
|
||||
#
|
||||
# The Original Code was created by Adriano dos Santos Fernandes
|
||||
# for the Firebird Open Source RDBMS project.
|
||||
#
|
||||
# Copyright (c) 2009 Adriano dos Santos Fernandes <adrianosf@uol.com.br>
|
||||
# and all contributors signed below.
|
||||
#
|
||||
# All Rights Reserved.
|
||||
# Contributor(s): ______________________________________.
|
||||
|
||||
{
|
||||
local:
|
||||
*;
|
||||
};
|
@ -252,12 +252,15 @@ LINK_FIREBIRD_CLIENT_SYMBOLS = $(LINK_FIREBIRD_SYMBOLS)
|
||||
LINK_TRACE_SYMBOLS = $(LIB_LINK_MAPFILE)$(ROOT)/builds/posix/fbtrace.vers
|
||||
LINK_FBINTL_SYMBOLS = $(LIB_LINK_MAPFILE)$(ROOT)/builds/posix/fbintl.vers
|
||||
LINK_IBUTIL_SYMBOLS = $(LIB_LINK_MAPFILE)$(ROOT)/builds/posix/ib_util.vers
|
||||
LINK_UDRENG_SYMBOLS = $(LIB_LINK_MAPFILE)$(ROOT)/builds/posix/udr_engine.vers
|
||||
LINK_EMPTY_SYMBOLS = $(LIB_LINK_MAPFILE)$(ROOT)/builds/posix/empty.vers
|
||||
LINK_EXEC_EXPORT=-rdynamic
|
||||
|
||||
LIB_PLATFORM_RPATH = -Wl,-rpath,$(1)
|
||||
ifeq ($(strip @BINRELOC_CFLAGS@),)
|
||||
LIB_LINK_RPATH = $(call LIB_PLATFORM_RPATH,$(if $(subst intl,,$(1)),@FB_LIBDIR@,@FB_INTLDIR@))
|
||||
else
|
||||
LIB_LINK_RPATH = $(call LIB_PLATFORM_RPATH,'$$$$ORIGIN/../$(1)')
|
||||
LIB_LINK_RPATH = $(call LIB_PLATFORM_RPATH,'$$ORIGIN/../$(1)')
|
||||
endif
|
||||
LIB_PATH_OPTS = $(call LIB_LINK_RPATH,lib) $(call LIB_LINK_RPATH,intl)
|
||||
LIB_LINK_SONAME= -Wl,-soname,$(1)
|
||||
|
@ -75,6 +75,10 @@ help.fdb:
|
||||
# Explicit dependencies on generated header
|
||||
$(OBJ)/jrd/par.o: $(SRC_ROOT)/include/gen/blrtable.h
|
||||
|
||||
# Explicit dependence on generated header (parser)
|
||||
$(SRC_ROOT)/dsql/keywords.cpp: $(SRC_ROOT)/dsql/dsql.tab.h
|
||||
$(OBJ)/dsql/Parser.h: $(SRC_ROOT)/dsql/dsql.tab.h
|
||||
|
||||
$(OBJ)/dsql/StmtNodes.o: $(SRC_ROOT)/include/gen/blrtable.h
|
||||
|
||||
# Special cases for building cpp from epp
|
||||
@ -84,6 +88,9 @@ $(OBJ)/dsql/metd.cpp: $(SRC_ROOT)/dsql/metd.epp
|
||||
$(OBJ)/dsql/DdlNodes.cpp: $(SRC_ROOT)/dsql/DdlNodes.epp
|
||||
$(GPRE_CURRENT) $(JRD_GPRE_FLAGS) $< $@
|
||||
|
||||
$(OBJ)/dsql/PackageNodes.cpp: $(SRC_ROOT)/dsql/PackageNodes.epp
|
||||
$(GPRE_CURRENT) $(JRD_GPRE_FLAGS) $< $@
|
||||
|
||||
# Rebuild blrtable.h
|
||||
$(SRC_ROOT)/include/gen/blrtable.h: $(BLRTABLE)
|
||||
$(BLRTABLE) > $(SRC_ROOT)/include/gen/blrtable.h
|
||||
|
@ -25,20 +25,21 @@ JRD_ClientSources = $(addprefix jrd/, $(JRD_ClientFiles)) common/cvt.cpp
|
||||
JRD_ServerFiles= blob_filter.cpp cvt.cpp dpm.epp dyn.epp dyn_def.epp \
|
||||
dyn_del.epp dyn_mod.epp dyn_util.epp fun.epp \
|
||||
grant.epp ini.epp met.epp pcmet.epp scl.epp \
|
||||
CharSet.cpp Collation.cpp DatabaseSnapshot.cpp VirtualTable.cpp RecordBuffer.cpp \
|
||||
CharSet.cpp Collation.cpp DatabaseSnapshot.cpp VirtualTable.cpp WindowRsb.cpp RecordBuffer.cpp \
|
||||
blb.cpp btn.cpp btr.cpp builtin.cpp \
|
||||
GlobalRWLock.cpp cch.cpp cmp.cpp cvt2.cpp \
|
||||
DataTypeUtil.cpp dfw.cpp UserManagement.cpp divorce.cpp \
|
||||
err.cpp event.cpp evl.cpp exe.cpp ext.cpp \
|
||||
execute_statement.cpp filters.cpp flu.cpp functions.cpp \
|
||||
err.cpp event.cpp ErrorImpl.cpp evl.cpp exe.cpp ext.cpp \
|
||||
execute_statement.cpp ExtEngineManager.cpp filters.cpp flu.cpp \
|
||||
idx.cpp inf.cpp intl.cpp intl_builtin.cpp IntlManager.cpp \
|
||||
IntlUtil.cpp isc_sync.cpp \
|
||||
jrd.cpp Database.cpp lck.cpp \
|
||||
mov.cpp nav.cpp opt.cpp Optimizer.cpp pag.cpp par.cpp \
|
||||
ods.cpp pwd.cpp PreparedStatement.cpp RandomGenerator.cpp \
|
||||
ods.cpp PluginManager.cpp pwd.cpp PreparedStatement.cpp RandomGenerator.cpp \
|
||||
Relation.cpp ResultSet.cpp rlck.cpp rpb_chain.cpp rse.cpp \
|
||||
sdw.cpp shut.cpp sort.cpp sqz.cpp \
|
||||
svc.cpp SysFunction.cpp TempSpace.cpp tpc.cpp tra.cpp validation.cpp vio.cpp \
|
||||
svc.cpp SysFunction.cpp TempSpace.cpp tpc.cpp tra.cpp validation.cpp \
|
||||
ValueImpl.cpp ValuesImpl.cpp vio.cpp \
|
||||
nodebug.cpp nbak.cpp sha.cpp $(Physical_IO_Module) TextType.cpp \
|
||||
unicode_util.cpp RuntimeStatistics.cpp DebugInterface.cpp \
|
||||
extds/ExtDS.cpp extds/InternalDS.cpp extds/IscDS.cpp \
|
||||
@ -71,7 +72,7 @@ DSQL_ClientFiles = array.epp blob.epp \
|
||||
DSQL_ServerFiles= metd.epp \
|
||||
ddl.cpp dsql.cpp errd.cpp gen.cpp hsh.cpp make.cpp \
|
||||
movd.cpp parse.cpp Parser.cpp pass1.cpp misc_func.cpp \
|
||||
DdlNodes.epp StmtNodes.cpp
|
||||
DdlNodes.epp PackageNodes.epp StmtNodes.cpp
|
||||
|
||||
|
||||
DSQL_Files = $(DSQL_ClientFiles) $(DSQL_ServerFiles)
|
||||
|
33
builds/posix/udr_engine.hpux.vers
Normal file
33
builds/posix/udr_engine.hpux.vers
Normal file
@ -0,0 +1,33 @@
|
||||
#
|
||||
# Version script to hide private symbols from Firebird libraries
|
||||
# GNU and Solaris linkers should understand it
|
||||
#
|
||||
# The contents of this file are subject to the Initial
|
||||
# Developer's Public License Version 1.0 (the "License");
|
||||
# you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
# http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
|
||||
#
|
||||
# Software distributed under the License is distributed AS IS,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing rights
|
||||
# and limitations under the License.
|
||||
#
|
||||
# The Original Code was created by Nickolay Samofatov
|
||||
# for the Firebird Open Source RDBMS project.
|
||||
#
|
||||
# Copyright (c) 2004 Nickolay Samofatov <nickolay@broadviewsoftware.com>
|
||||
# and all contributors signed below.
|
||||
#
|
||||
# All Rights Reserved.
|
||||
# Contributor(s): ______________________________________.
|
||||
# Adriano dos Santos Fernandes
|
||||
#
|
||||
#
|
||||
|
||||
|
||||
+e firebirdPlugin
|
||||
+e fbUdrRegFunction
|
||||
+e fbUdrRegProcedure
|
||||
+e fbUdrRegTrigger
|
||||
+e fbUdrGetFunction
|
39
builds/posix/udr_engine.vers
Normal file
39
builds/posix/udr_engine.vers
Normal file
@ -0,0 +1,39 @@
|
||||
#
|
||||
# Version script to hide private symbols from Firebird libraries
|
||||
# GNU and Solaris linkers should understand it
|
||||
#
|
||||
# The contents of this file are subject to the Initial
|
||||
# Developer's Public License Version 1.0 (the "License");
|
||||
# you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
# http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
|
||||
#
|
||||
# Software distributed under the License is distributed AS IS,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing rights
|
||||
# and limitations under the License.
|
||||
#
|
||||
# The Original Code was created by Nickolay Samofatov
|
||||
# for the Firebird Open Source RDBMS project.
|
||||
#
|
||||
# Copyright (c) 2004 Nickolay Samofatov <nickolay@broadviewsoftware.com>
|
||||
# and all contributors signed below.
|
||||
#
|
||||
# All Rights Reserved.
|
||||
# Contributor(s): ______________________________________.
|
||||
# Adriano dos Santos Fernandes
|
||||
#
|
||||
#
|
||||
|
||||
|
||||
{
|
||||
global:
|
||||
firebirdPlugin;
|
||||
fbUdrRegFunction;
|
||||
fbUdrRegProcedure;
|
||||
fbUdrRegTrigger;
|
||||
fbUdrGetFunction;
|
||||
|
||||
local:
|
||||
*;
|
||||
};
|
26
builds/win32/defs/udr_engine.def
Normal file
26
builds/win32/defs/udr_engine.def
Normal file
@ -0,0 +1,26 @@
|
||||
; The contents of this file are subject to the Initial
|
||||
; Developer's Public License Version 1.0 (the "License");
|
||||
; you may not use this file except in compliance with the
|
||||
; License. You may obtain a copy of the License at
|
||||
; http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
|
||||
;
|
||||
; Software distributed under the License is distributed AS IS,
|
||||
; WITHOUT WARRANTY OF ANY KIND, either express or implied.
|
||||
; See the License for the specific language governing rights
|
||||
; and limitations under the License.
|
||||
;
|
||||
; The Original Code was created by Adriano dos Santos Fernandes
|
||||
; for the Firebird Open Source RDBMS project.
|
||||
;
|
||||
; Copyright (c) 2008 Adriano dos Santos Fernandes <adrianosf@uol.com.br>
|
||||
; and all contributors signed below.
|
||||
;
|
||||
; All Rights Reserved.
|
||||
; Contributor(s): ______________________________________.
|
||||
|
||||
EXPORTS
|
||||
firebirdPlugin
|
||||
fbUdrRegFunction
|
||||
fbUdrRegProcedure
|
||||
fbUdrRegTrigger
|
||||
fbUdrGetFunction
|
@ -56,6 +56,7 @@ for %%v in ( icuuc30 icudt30 icuin30 ) do (
|
||||
@copy %FB_ROOT_PATH%\temp\%FB_OBJ_DIR%\firebird\udf\* %FB_OUTPUT_DIR%\udf >nul
|
||||
@copy %FB_ROOT_PATH%\temp\%FB_OBJ_DIR%\firebird\system32\* %FB_OUTPUT_DIR%\system32 >nul
|
||||
@copy %FB_ROOT_PATH%\temp\%FB_OBJ_DIR%\firebird\plugins\fbtrace.dll %FB_OUTPUT_DIR%\plugins\fbtrace.dll >nul
|
||||
@copy %FB_ROOT_PATH%\temp\%FB_OBJ_DIR%\firebird\plugins\udr_engine.dll %FB_OUTPUT_DIR%\plugins\udr_engine.dll >nul
|
||||
@copy %FB_ROOT_PATH%\temp\%FB_OBJ_DIR%\fbclient\fbclient.lib %FB_OUTPUT_DIR%\lib\fbclient_ms.lib >nul
|
||||
@copy %FB_ROOT_PATH%\temp\%FB_OBJ_DIR%\ib_util\ib_util.lib %FB_OUTPUT_DIR%\lib\ib_util_ms.lib >nul
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||
# Visual Studio 2005
|
||||
# Visual C++ Express 2005
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "alice", "alice.vcproj", "{0D616380-1A5A-4230-A80B-021360E4E669}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "burp", "burp.vcproj", "{D1507562-A363-4685-96AF-B036F5E5E47F}"
|
||||
@ -20,25 +20,25 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "engine_embed", "engine_embe
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fb_inet_server", "fb_inet_server.vcproj", "{664D4A04-36E0-48EF-8BCA-D5C331EFAA24}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{E9AAC310-465E-4384-8BCC-674F297F777C} = {E9AAC310-465E-4384-8BCC-674F297F777C}
|
||||
{213C6F21-D83F-48C7-BBB5-B35AB1B706B1} = {213C6F21-D83F-48C7-BBB5-B35AB1B706B1}
|
||||
{D1507562-A363-4685-96AF-B036F5E5E47F} = {D1507562-A363-4685-96AF-B036F5E5E47F}
|
||||
{F5746066-8613-4811-B27C-0ED70FF9F0FF} = {F5746066-8613-4811-B27C-0ED70FF9F0FF}
|
||||
{0D616380-1A5A-4230-A80B-021360E4E669} = {0D616380-1A5A-4230-A80B-021360E4E669}
|
||||
{E83187C1-AAC2-445D-B8B2-883EFC10C39A} = {E83187C1-AAC2-445D-B8B2-883EFC10C39A}
|
||||
{488199DD-D9F3-41C8-AED6-8AFFFB294CFF} = {488199DD-D9F3-41C8-AED6-8AFFFB294CFF}
|
||||
{E029E4E2-0C3F-4F7D-BC4C-D9C20F40EB4E} = {E029E4E2-0C3F-4F7D-BC4C-D9C20F40EB4E}
|
||||
{3C4993E4-946C-4029-97B8-1A111F32F4FC} = {3C4993E4-946C-4029-97B8-1A111F32F4FC}
|
||||
{EABA0FF3-1C4D-4FAB-8418-31C9061F3F0D} = {EABA0FF3-1C4D-4FAB-8418-31C9061F3F0D}
|
||||
{E9AAC310-465E-4384-8BCC-674F297F777C} = {E9AAC310-465E-4384-8BCC-674F297F777C}
|
||||
{213C6F21-D83F-48C7-BBB5-B35AB1B706B1} = {213C6F21-D83F-48C7-BBB5-B35AB1B706B1}
|
||||
{D1507562-A363-4685-96AF-B036F5E5E47F} = {D1507562-A363-4685-96AF-B036F5E5E47F}
|
||||
{F5746066-8613-4811-B27C-0ED70FF9F0FF} = {F5746066-8613-4811-B27C-0ED70FF9F0FF}
|
||||
{0D616380-1A5A-4230-A80B-021360E4E669} = {0D616380-1A5A-4230-A80B-021360E4E669}
|
||||
{E83187C1-AAC2-445D-B8B2-883EFC10C39A} = {E83187C1-AAC2-445D-B8B2-883EFC10C39A}
|
||||
{488199DD-D9F3-41C8-AED6-8AFFFB294CFF} = {488199DD-D9F3-41C8-AED6-8AFFFB294CFF}
|
||||
{3C4993E4-946C-4029-97B8-1A111F32F4FC} = {3C4993E4-946C-4029-97B8-1A111F32F4FC}
|
||||
{E029E4E2-0C3F-4F7D-BC4C-D9C20F40EB4E} = {E029E4E2-0C3F-4F7D-BC4C-D9C20F40EB4E}
|
||||
{E029E4E2-0C3F-4F7D-BC4C-D9C20F40EB4E} = {E029E4E2-0C3F-4F7D-BC4C-D9C20F40EB4E}
|
||||
{488199DD-D9F3-41C8-AED6-8AFFFB294CFF} = {488199DD-D9F3-41C8-AED6-8AFFFB294CFF}
|
||||
{488199DD-D9F3-41C8-AED6-8AFFFB294CFF} = {488199DD-D9F3-41C8-AED6-8AFFFB294CFF}
|
||||
{E83187C1-AAC2-445D-B8B2-883EFC10C39A} = {E83187C1-AAC2-445D-B8B2-883EFC10C39A}
|
||||
{E83187C1-AAC2-445D-B8B2-883EFC10C39A} = {E83187C1-AAC2-445D-B8B2-883EFC10C39A}
|
||||
{0D616380-1A5A-4230-A80B-021360E4E669} = {0D616380-1A5A-4230-A80B-021360E4E669}
|
||||
{0D616380-1A5A-4230-A80B-021360E4E669} = {0D616380-1A5A-4230-A80B-021360E4E669}
|
||||
{F5746066-8613-4811-B27C-0ED70FF9F0FF} = {F5746066-8613-4811-B27C-0ED70FF9F0FF}
|
||||
{F5746066-8613-4811-B27C-0ED70FF9F0FF} = {F5746066-8613-4811-B27C-0ED70FF9F0FF}
|
||||
{D1507562-A363-4685-96AF-B036F5E5E47F} = {D1507562-A363-4685-96AF-B036F5E5E47F}
|
||||
{D1507562-A363-4685-96AF-B036F5E5E47F} = {D1507562-A363-4685-96AF-B036F5E5E47F}
|
||||
{53F75437-15B8-4A5C-86BF-E238CC68FCBC} = {53F75437-15B8-4A5C-86BF-E238CC68FCBC}
|
||||
{213C6F21-D83F-48C7-BBB5-B35AB1B706B1} = {213C6F21-D83F-48C7-BBB5-B35AB1B706B1}
|
||||
{213C6F21-D83F-48C7-BBB5-B35AB1B706B1} = {213C6F21-D83F-48C7-BBB5-B35AB1B706B1}
|
||||
{E9AAC310-465E-4384-8BCC-674F297F777C} = {E9AAC310-465E-4384-8BCC-674F297F777C}
|
||||
{E9AAC310-465E-4384-8BCC-674F297F777C} = {E9AAC310-465E-4384-8BCC-674F297F777C}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fb_lock_print", "fb_lock_print.vcproj", "{E8397148-0E9C-449B-9F45-7FB377A08242}"
|
||||
@ -53,89 +53,83 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fbclient", "fbclient.vcproj
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fbembed", "fbembed.vcproj", "{C5A60E3D-7815-4127-B856-96277BEC1D11}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{B0833E27-BCB2-4D0D-B6D2-F4621224CFD8} = {B0833E27-BCB2-4D0D-B6D2-F4621224CFD8}
|
||||
{F55ACA54-70DF-4343-8E16-FA97C757CCF6} = {F55ACA54-70DF-4343-8E16-FA97C757CCF6}
|
||||
{D1507562-A363-4685-96AF-B036F5E5E47F} = {D1507562-A363-4685-96AF-B036F5E5E47F}
|
||||
{0D616380-1A5A-4230-A80B-021360E4E669} = {0D616380-1A5A-4230-A80B-021360E4E669}
|
||||
{E83187C1-AAC2-445D-B8B2-883EFC10C39A} = {E83187C1-AAC2-445D-B8B2-883EFC10C39A}
|
||||
{EABA0FF3-1C4D-4FAB-8418-31C9061F3F0D} = {EABA0FF3-1C4D-4FAB-8418-31C9061F3F0D}
|
||||
{B0833E27-BCB2-4D0D-B6D2-F4621224CFD8} = {B0833E27-BCB2-4D0D-B6D2-F4621224CFD8}
|
||||
{F55ACA54-70DF-4343-8E16-FA97C757CCF6} = {F55ACA54-70DF-4343-8E16-FA97C757CCF6}
|
||||
{D1507562-A363-4685-96AF-B036F5E5E47F} = {D1507562-A363-4685-96AF-B036F5E5E47F}
|
||||
{488199DD-D9F3-41C8-AED6-8AFFFB294CFF} = {488199DD-D9F3-41C8-AED6-8AFFFB294CFF}
|
||||
{E83187C1-AAC2-445D-B8B2-883EFC10C39A} = {E83187C1-AAC2-445D-B8B2-883EFC10C39A}
|
||||
{0D616380-1A5A-4230-A80B-021360E4E669} = {0D616380-1A5A-4230-A80B-021360E4E669}
|
||||
{0D616380-1A5A-4230-A80B-021360E4E669} = {0D616380-1A5A-4230-A80B-021360E4E669}
|
||||
{F5746066-8613-4811-B27C-0ED70FF9F0FF} = {F5746066-8613-4811-B27C-0ED70FF9F0FF}
|
||||
{488199DD-D9F3-41C8-AED6-8AFFFB294CFF} = {488199DD-D9F3-41C8-AED6-8AFFFB294CFF}
|
||||
{213C6F21-D83F-48C7-BBB5-B35AB1B706B1} = {213C6F21-D83F-48C7-BBB5-B35AB1B706B1}
|
||||
{D1507562-A363-4685-96AF-B036F5E5E47F} = {D1507562-A363-4685-96AF-B036F5E5E47F}
|
||||
{D1507562-A363-4685-96AF-B036F5E5E47F} = {D1507562-A363-4685-96AF-B036F5E5E47F}
|
||||
{F55ACA54-70DF-4343-8E16-FA97C757CCF6} = {F55ACA54-70DF-4343-8E16-FA97C757CCF6}
|
||||
{F55ACA54-70DF-4343-8E16-FA97C757CCF6} = {F55ACA54-70DF-4343-8E16-FA97C757CCF6}
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
{604E1144-1A22-43AF-9A3E-08650EE4EE90} = {604E1144-1A22-43AF-9A3E-08650EE4EE90}
|
||||
{53F75437-15B8-4A5C-86BF-E238CC68FCBC} = {53F75437-15B8-4A5C-86BF-E238CC68FCBC}
|
||||
{B0833E27-BCB2-4D0D-B6D2-F4621224CFD8} = {B0833E27-BCB2-4D0D-B6D2-F4621224CFD8}
|
||||
{B0833E27-BCB2-4D0D-B6D2-F4621224CFD8} = {B0833E27-BCB2-4D0D-B6D2-F4621224CFD8}
|
||||
{213C6F21-D83F-48C7-BBB5-B35AB1B706B1} = {213C6F21-D83F-48C7-BBB5-B35AB1B706B1}
|
||||
{520DF501-5775-44FD-BDC6-37753A17696A} = {520DF501-5775-44FD-BDC6-37753A17696A}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fbguard", "fbguard.vcproj", "{BBD83ED3-8A48-4FE8-B4B7-CB27730986B2}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
{492E7BDA-8948-408D-A43E-4C0A5B86AFB8} = {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fbserver", "fbserver.vcproj", "{23EC8DAA-6718-4EF3-979F-89F611C7D504}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{520DF501-5775-44FD-BDC6-37753A17696A} = {520DF501-5775-44FD-BDC6-37753A17696A}
|
||||
{E9AAC310-465E-4384-8BCC-674F297F777C} = {E9AAC310-465E-4384-8BCC-674F297F777C}
|
||||
{4BCC693D-1745-45ED-8302-E5E2F979549A} = {4BCC693D-1745-45ED-8302-E5E2F979549A}
|
||||
{604E1144-1A22-43AF-9A3E-08650EE4EE90} = {604E1144-1A22-43AF-9A3E-08650EE4EE90}
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
{F8798A49-9D20-451E-A7BD-FEB5237103B5} = {F8798A49-9D20-451E-A7BD-FEB5237103B5}
|
||||
{D1507562-A363-4685-96AF-B036F5E5E47F} = {D1507562-A363-4685-96AF-B036F5E5E47F}
|
||||
{0D616380-1A5A-4230-A80B-021360E4E669} = {0D616380-1A5A-4230-A80B-021360E4E669}
|
||||
{E83187C1-AAC2-445D-B8B2-883EFC10C39A} = {E83187C1-AAC2-445D-B8B2-883EFC10C39A}
|
||||
{4BCC693D-1745-45ED-8302-E5E2F979549A} = {4BCC693D-1745-45ED-8302-E5E2F979549A}
|
||||
{604E1144-1A22-43AF-9A3E-08650EE4EE90} = {604E1144-1A22-43AF-9A3E-08650EE4EE90}
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
{F8798A49-9D20-451E-A7BD-FEB5237103B5} = {F8798A49-9D20-451E-A7BD-FEB5237103B5}
|
||||
{D1507562-A363-4685-96AF-B036F5E5E47F} = {D1507562-A363-4685-96AF-B036F5E5E47F}
|
||||
{0D616380-1A5A-4230-A80B-021360E4E669} = {0D616380-1A5A-4230-A80B-021360E4E669}
|
||||
{E83187C1-AAC2-445D-B8B2-883EFC10C39A} = {E83187C1-AAC2-445D-B8B2-883EFC10C39A}
|
||||
{EABA0FF3-1C4D-4FAB-8418-31C9061F3F0D} = {EABA0FF3-1C4D-4FAB-8418-31C9061F3F0D}
|
||||
{520DF501-5775-44FD-BDC6-37753A17696A} = {520DF501-5775-44FD-BDC6-37753A17696A}
|
||||
{D1507562-A363-4685-96AF-B036F5E5E47F} = {D1507562-A363-4685-96AF-B036F5E5E47F}
|
||||
{F8798A49-9D20-451E-A7BD-FEB5237103B5} = {F8798A49-9D20-451E-A7BD-FEB5237103B5}
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
{604E1144-1A22-43AF-9A3E-08650EE4EE90} = {604E1144-1A22-43AF-9A3E-08650EE4EE90}
|
||||
{4BCC693D-1745-45ED-8302-E5E2F979549A} = {4BCC693D-1745-45ED-8302-E5E2F979549A}
|
||||
{53F75437-15B8-4A5C-86BF-E238CC68FCBC} = {53F75437-15B8-4A5C-86BF-E238CC68FCBC}
|
||||
{E9AAC310-465E-4384-8BCC-674F297F777C} = {E9AAC310-465E-4384-8BCC-674F297F777C}
|
||||
{520DF501-5775-44FD-BDC6-37753A17696A} = {520DF501-5775-44FD-BDC6-37753A17696A}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fbudf", "fbudf.vcproj", "{9DC67B05-AC3E-49A3-B0CC-83B25D757445}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gbak", "gbak.vcproj", "{B732F5D2-B5D9-417F-B156-D790F466CB8E}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
{492E7BDA-8948-408D-A43E-4C0A5B86AFB8} = {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gdef", "gdef.vcproj", "{E8B8E0CE-F47F-48BD-8911-C11805A711D9}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
{492E7BDA-8948-408D-A43E-4C0A5B86AFB8} = {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gfix", "gfix.vcproj", "{44A9E4AD-B932-4620-B319-431A153BB341}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
{492E7BDA-8948-408D-A43E-4C0A5B86AFB8} = {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gpre", "gpre.vcproj", "{D84F0839-28A4-40B2-B5F4-F5E1E7F48FD0}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
{492E7BDA-8948-408D-A43E-4C0A5B86AFB8} = {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gsec", "gsec.vcproj", "{7043CC61-DEC1-4C6B-86B9-0E911D1094C9}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
{492E7BDA-8948-408D-A43E-4C0A5B86AFB8} = {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gsplit", "gsplit.vcproj", "{B7F22B7F-9937-4874-9A8B-6AB4E36E74A5}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gstat", "gstat.vcproj", "{7E862973-37C4-4202-80E7-490ED4DEDA14}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
{492E7BDA-8948-408D-A43E-4C0A5B86AFB8} = {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ib_udf", "ib_udf.vcproj", "{0D4A2D8E-6461-479E-9399-F7929174E050}"
|
||||
@ -159,8 +153,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "intl", "intl.vcproj", "{DFF
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "isql", "isql.vcproj", "{DEE75AD5-F165-40E1-80B2-400E27725D5C}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
{492E7BDA-8948-408D-A43E-4C0A5B86AFB8} = {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lock", "lock.vcproj", "{604E1144-1A22-43AF-9A3E-08650EE4EE90}"
|
||||
@ -169,8 +163,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lock_classic", "lock_classi
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qli", "qli.vcproj", "{EBB8361B-49D5-43A5-8771-940DF3E308EF}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
{492E7BDA-8948-408D-A43E-4C0A5B86AFB8} = {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "remote", "remote.vcproj", "{4BCC693D-1745-45ED-8302-E5E2F979549A}"
|
||||
@ -181,8 +175,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "utilities", "utilities.vcpr
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nbackup", "nbackup.vcproj", "{01A41DFA-8908-4576-A1F1-C8BC7EAE39A1}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
{492E7BDA-8948-408D-A43E-4C0A5B86AFB8} = {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "config", "config.vcproj", "{E83187C1-AAC2-445D-B8B2-883EFC10C39A}"
|
||||
@ -200,8 +194,13 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fbrmclib", "fbrmclib.vcproj
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fbsvcmgr", "fbsvcmgr.vcproj", "{EFB07DBC-36E3-4C54-B941-3CDAFAACF47B}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
{492E7BDA-8948-408D-A43E-4C0A5B86AFB8} = {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "udr_engine", "udr_engine.vcproj", "{20DEBF08-EF0A-4C94-ADEB-FE9BBA14588B}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fbtrace", "fbtrace.vcproj", "{53F75437-15B8-4A5C-86BF-E238CC68FCBC}"
|
||||
@ -212,8 +211,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fbtrace", "fbtrace.vcproj",
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fbtracemgr", "fbtracemgr.vcproj", "{58C7E370-0EDD-4F5E-8617-3F5071170205}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
{492E7BDA-8948-408D-A43E-4C0A5B86AFB8} = {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
@ -558,6 +557,12 @@ Global
|
||||
{EFB07DBC-36E3-4C54-B941-3CDAFAACF47B}.Release|Win32.Build.0 = Release|Win32
|
||||
{EFB07DBC-36E3-4C54-B941-3CDAFAACF47B}.Release|x64.ActiveCfg = Release|x64
|
||||
{EFB07DBC-36E3-4C54-B941-3CDAFAACF47B}.Release|x64.Build.0 = Release|x64
|
||||
{20DEBF08-EF0A-4C94-ADEB-FE9BBA14588B}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{20DEBF08-EF0A-4C94-ADEB-FE9BBA14588B}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{20DEBF08-EF0A-4C94-ADEB-FE9BBA14588B}.Debug|x64.ActiveCfg = Debug|Win32
|
||||
{20DEBF08-EF0A-4C94-ADEB-FE9BBA14588B}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{20DEBF08-EF0A-4C94-ADEB-FE9BBA14588B}.Release|Win32.Build.0 = Release|Win32
|
||||
{20DEBF08-EF0A-4C94-ADEB-FE9BBA14588B}.Release|x64.ActiveCfg = Release|Win32
|
||||
{53F75437-15B8-4A5C-86BF-E238CC68FCBC}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{53F75437-15B8-4A5C-86BF-E238CC68FCBC}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{53F75437-15B8-4A5C-86BF-E238CC68FCBC}.Debug|x64.ActiveCfg = Debug|x64
|
||||
|
@ -1,9 +1,21 @@
|
||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||
# Visual Studio 2005
|
||||
# Visual C++ Express 2005
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "empbuild", "empbuild.vcproj", "{FC2859B9-56DB-40B4-86C4-2DE31ECE9144}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "intlbuild", "intlbuild.vcproj", "{9546EF04-1326-464B-A6ED-395C60DD63CC}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "udrcpp_example", "udrcpp_example.vcproj", "{FF0FD8DF-1E5C-486E-B395-A620376A4633}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{20DEBF08-EF0A-4C94-ADEB-FE9BBA14588B} = {20DEBF08-EF0A-4C94-ADEB-FE9BBA14588B}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "udr_engine", "udr_engine.vcproj", "{20DEBF08-EF0A-4C94-ADEB-FE9BBA14588B}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465} = {15605F44-BFFD-444F-AD4C-55DC9D704465}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "common.vcproj", "{15605F44-BFFD-444F-AD4C-55DC9D704465}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
@ -21,9 +33,29 @@ Global
|
||||
{FC2859B9-56DB-40B4-86C4-2DE31ECE9144}.Release|x64.ActiveCfg = Release|x64
|
||||
{FC2859B9-56DB-40B4-86C4-2DE31ECE9144}.Release|x64.Build.0 = Release|x64
|
||||
{9546EF04-1326-464B-A6ED-395C60DD63CC}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{9546EF04-1326-464B-A6ED-395C60DD63CC}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{9546EF04-1326-464B-A6ED-395C60DD63CC}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{9546EF04-1326-464B-A6ED-395C60DD63CC}.Debug|x64.Build.0 = Debug|x64
|
||||
{9546EF04-1326-464B-A6ED-395C60DD63CC}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{9546EF04-1326-464B-A6ED-395C60DD63CC}.Release|x64.ActiveCfg = Release|x64
|
||||
{FF0FD8DF-1E5C-486E-B395-A620376A4633}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{FF0FD8DF-1E5C-486E-B395-A620376A4633}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{FF0FD8DF-1E5C-486E-B395-A620376A4633}.Debug|x64.ActiveCfg = Debug|Win32
|
||||
{FF0FD8DF-1E5C-486E-B395-A620376A4633}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{FF0FD8DF-1E5C-486E-B395-A620376A4633}.Release|Win32.Build.0 = Release|Win32
|
||||
{FF0FD8DF-1E5C-486E-B395-A620376A4633}.Release|x64.ActiveCfg = Release|Win32
|
||||
{20DEBF08-EF0A-4C94-ADEB-FE9BBA14588B}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{20DEBF08-EF0A-4C94-ADEB-FE9BBA14588B}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{20DEBF08-EF0A-4C94-ADEB-FE9BBA14588B}.Debug|x64.ActiveCfg = Debug|Win32
|
||||
{20DEBF08-EF0A-4C94-ADEB-FE9BBA14588B}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{20DEBF08-EF0A-4C94-ADEB-FE9BBA14588B}.Release|Win32.Build.0 = Release|Win32
|
||||
{20DEBF08-EF0A-4C94-ADEB-FE9BBA14588B}.Release|x64.ActiveCfg = Release|Win32
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465}.Debug|x64.ActiveCfg = Debug|Win32
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465}.Release|Win32.Build.0 = Release|Win32
|
||||
{15605F44-BFFD-444F-AD4C-55DC9D704465}.Release|x64.ActiveCfg = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
@ -345,6 +345,10 @@
|
||||
RelativePath="..\..\..\src\dsql\DdlNodes.epp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\dsql\PackageNodes.epp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\dsql\metd.epp"
|
||||
>
|
||||
@ -365,6 +369,10 @@
|
||||
RelativePath="..\..\..\gen\$(PlatformName)\dsql\DdlNodes.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\gen\$(PlatformName)\dsql\PackageNodes.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\gen\$(PlatformName)\dsql\metd.cpp"
|
||||
>
|
||||
@ -404,6 +412,10 @@
|
||||
RelativePath="..\..\..\src\dsql\DdlNodes.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\dsql\PackageNodes.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\dsql\dsql.h"
|
||||
>
|
||||
|
@ -345,6 +345,10 @@
|
||||
RelativePath="..\..\..\src\dsql\DdlNodes.epp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\dsql\PackageNodes.epp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\dsql\metd.epp"
|
||||
>
|
||||
@ -365,6 +369,10 @@
|
||||
RelativePath="..\..\..\gen\$(PlatformName)\dsql\DdlNodes.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\gen\$(PlatformName)\dsql\PackageNodes.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\gen\$(PlatformName)\dsql\metd.cpp"
|
||||
>
|
||||
@ -404,6 +412,10 @@
|
||||
RelativePath="..\..\..\src\dsql\DdlNodes.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\dsql\PackageNodes.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\dsql\dsql.h"
|
||||
>
|
||||
|
@ -379,6 +379,10 @@
|
||||
RelativePath="..\..\..\src\jrd\err.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ErrorImpl.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\event.cpp"
|
||||
>
|
||||
@ -403,6 +407,10 @@
|
||||
RelativePath="..\..\..\src\jrd\extds\ExtDS.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ExtEngineManager.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\filters.cpp"
|
||||
>
|
||||
@ -415,10 +423,6 @@
|
||||
RelativePath="..\..\..\gen\$(PlatformName)\jrd\fun.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\functions.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\gds.cpp"
|
||||
>
|
||||
@ -543,6 +547,10 @@
|
||||
RelativePath="..\..\..\gen\$(PlatformName)\jrd\pcmet.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\PluginManager.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\PreparedStatement.cpp"
|
||||
>
|
||||
@ -683,6 +691,14 @@
|
||||
RelativePath="..\..\..\src\jrd\validation.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ValueImpl.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ValuesImpl.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\vio.cpp"
|
||||
>
|
||||
@ -695,6 +711,10 @@
|
||||
RelativePath="..\..\..\src\jrd\why.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\WindowRsb.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\os\win32\winnt.cpp"
|
||||
>
|
||||
@ -899,6 +919,10 @@
|
||||
RelativePath="..\..\..\src\jrd\err_proto.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ErrorImpl.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\event.h"
|
||||
>
|
||||
@ -935,6 +959,10 @@
|
||||
RelativePath="..\..\..\src\jrd\extds\ExtDS.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ExtEngineManager.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\include\fb_api_proto.h"
|
||||
>
|
||||
@ -1443,6 +1471,14 @@
|
||||
RelativePath="..\..\..\src\jrd\val_proto.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ValueImpl.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ValuesImpl.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\vio_debug.h"
|
||||
>
|
||||
@ -1459,6 +1495,10 @@
|
||||
RelativePath="..\..\..\src\jrd\why_proto.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\WindowRsb.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="GPRE files"
|
||||
|
@ -378,6 +378,10 @@
|
||||
RelativePath="..\..\..\src\jrd\err.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ErrorImpl.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\event.cpp"
|
||||
>
|
||||
@ -402,6 +406,10 @@
|
||||
RelativePath="..\..\..\src\jrd\extds\ExtDS.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ExtEngineManager.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\filters.cpp"
|
||||
>
|
||||
@ -414,10 +422,6 @@
|
||||
RelativePath="..\..\..\gen\$(PlatformName)\jrd\fun.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\functions.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\gds.cpp"
|
||||
>
|
||||
@ -542,6 +546,10 @@
|
||||
RelativePath="..\..\..\gen\$(PlatformName)\jrd\pcmet.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\PluginManager.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\PreparedStatement.cpp"
|
||||
>
|
||||
@ -682,6 +690,14 @@
|
||||
RelativePath="..\..\..\src\jrd\validation.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ValueImpl.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ValuesImpl.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\vio.cpp"
|
||||
>
|
||||
@ -694,6 +710,10 @@
|
||||
RelativePath="..\..\..\src\jrd\why.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\WindowRsb.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\os\win32\winnt.cpp"
|
||||
>
|
||||
@ -898,6 +918,10 @@
|
||||
RelativePath="..\..\..\src\jrd\err_proto.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ErrorImpl.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\event.h"
|
||||
>
|
||||
@ -934,6 +958,10 @@
|
||||
RelativePath="..\..\..\src\jrd\extds\ExtDS.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ExtEngineManager.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\include\fb_api_proto.h"
|
||||
>
|
||||
@ -1438,6 +1466,14 @@
|
||||
RelativePath="..\..\..\src\jrd\val_proto.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ValueImpl.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ValuesImpl.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\vio_debug.h"
|
||||
>
|
||||
@ -1454,6 +1490,10 @@
|
||||
RelativePath="..\..\..\src\jrd\why_proto.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\WindowRsb.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="GPRE files"
|
||||
|
@ -378,6 +378,10 @@
|
||||
RelativePath="..\..\..\src\jrd\err.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ErrorImpl.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\event.cpp"
|
||||
>
|
||||
@ -402,6 +406,10 @@
|
||||
RelativePath="..\..\..\src\jrd\extds\ExtDS.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ExtEngineManager.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\filters.cpp"
|
||||
>
|
||||
@ -414,10 +422,6 @@
|
||||
RelativePath="..\..\..\gen\$(PlatformName)\jrd\fun.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\functions.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\gds.cpp"
|
||||
>
|
||||
@ -542,6 +546,10 @@
|
||||
RelativePath="..\..\..\gen\$(PlatformName)\jrd\pcmet.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\PluginManager.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\PreparedStatement.cpp"
|
||||
>
|
||||
@ -682,6 +690,14 @@
|
||||
RelativePath="..\..\..\src\jrd\validation.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ValueImpl.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ValuesImpl.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\vio.cpp"
|
||||
>
|
||||
@ -694,6 +710,10 @@
|
||||
RelativePath="..\..\..\src\jrd\why.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\WindowRsb.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\os\win32\winnt.cpp"
|
||||
>
|
||||
@ -898,6 +918,10 @@
|
||||
RelativePath="..\..\..\src\jrd\err_proto.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ErrorImpl.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\event.h"
|
||||
>
|
||||
@ -934,6 +958,10 @@
|
||||
RelativePath="..\..\..\src\jrd\extds\ExtDS.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ExtEngineManager.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\include\fb_api_proto.h"
|
||||
>
|
||||
@ -1438,6 +1466,14 @@
|
||||
RelativePath="..\..\..\src\jrd\val_proto.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ValueImpl.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\ValuesImpl.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\vio_debug.h"
|
||||
>
|
||||
@ -1454,6 +1490,10 @@
|
||||
RelativePath="..\..\..\src\jrd\why_proto.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\WindowRsb.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="GPRE files"
|
||||
|
@ -68,83 +68,7 @@
|
||||
OutputFile="..\..\..\temp\$(PlatformName)\$(ConfigurationName)\firebird\bin\$(ProjectName).exe"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories="../../../extern/icu/$(PlatformName)/$(ConfigurationName)/lib"
|
||||
SubSystem="2"
|
||||
StackReserveSize="2097152"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
ConfigurationType="1"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops;.\firebird2.vsprops;.\firebird2debug.vsprops"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="true"
|
||||
TargetEnvironment="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="_DEBUG,_WINDOWS,WIN32,DEV_BUILD"
|
||||
BrowseInformation="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1053"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="comctl32.lib ws2_32.lib mpr.lib version.lib icuuc.lib"
|
||||
OutputFile="..\..\..\temp\$(PlatformName)\$(ConfigurationName)\firebird\bin\$(ProjectName).exe"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories="../../../extern/icu/$(PlatformName)/release/lib"
|
||||
ModuleDefinitionFile="..\defs\fbclient.def"
|
||||
SubSystem="2"
|
||||
StackReserveSize="2097152"
|
||||
/>
|
||||
@ -225,6 +149,7 @@
|
||||
OutputFile="..\..\..\temp\$(PlatformName)\$(ConfigurationName)\firebird\bin\$(ProjectName).exe"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories="../../../extern/icu/$(PlatformName)/$(ConfigurationName)/lib"
|
||||
ModuleDefinitionFile="..\defs\fbclient.def"
|
||||
SubSystem="2"
|
||||
StackReserveSize="4194304"
|
||||
TargetMachine="17"
|
||||
@ -254,6 +179,84 @@
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
ConfigurationType="1"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops;.\firebird2.vsprops;.\firebird2debug.vsprops"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="true"
|
||||
TargetEnvironment="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="_DEBUG,_WINDOWS,WIN32,DEV_BUILD"
|
||||
BrowseInformation="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1053"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="comctl32.lib ws2_32.lib mpr.lib version.lib icuuc.lib"
|
||||
OutputFile="..\..\..\temp\$(PlatformName)\$(ConfigurationName)\firebird\bin\$(ProjectName).exe"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories="../../../extern/icu/$(PlatformName)/release/lib"
|
||||
ModuleDefinitionFile="..\defs\fbclient.def"
|
||||
SubSystem="2"
|
||||
StackReserveSize="2097152"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Debug|x64"
|
||||
ConfigurationType="1"
|
||||
@ -304,6 +307,7 @@
|
||||
OutputFile="..\..\..\temp\$(PlatformName)\$(ConfigurationName)\firebird\bin\$(ProjectName).exe"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories="../../../extern/icu/$(PlatformName)/release/lib"
|
||||
ModuleDefinitionFile="..\defs\fbclient.def"
|
||||
SubSystem="2"
|
||||
StackReserveSize="4194304"
|
||||
TargetMachine="17"
|
||||
@ -352,6 +356,10 @@
|
||||
RelativePath="..\..\..\src\utilities\nbackup\nbkMain.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\perf.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\utilities\gstat\ppg.cpp"
|
||||
>
|
||||
@ -389,7 +397,7 @@
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
Name="Release|x64"
|
||||
>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
@ -397,7 +405,7 @@
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|x64"
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
@ -414,6 +422,10 @@
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<File
|
||||
RelativePath="..\defs\fbclient.def"
|
||||
>
|
||||
</File>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
|
@ -68,6 +68,7 @@
|
||||
OutputFile="..\..\..\temp\$(PlatformName)\$(ConfigurationName)\firebird\bin\$(ProjectName).exe"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories="../../../extern/icu/$(PlatformName)/$(ConfigurationName)/lib"
|
||||
ModuleDefinitionFile="..\defs\fbclient.def"
|
||||
SubSystem="2"
|
||||
StackReserveSize="2097152"
|
||||
/>
|
||||
@ -145,6 +146,7 @@
|
||||
OutputFile="..\..\..\temp\$(PlatformName)\$(ConfigurationName)\firebird\bin\$(ProjectName).exe"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories="../../../extern/icu/$(PlatformName)/release/lib"
|
||||
ModuleDefinitionFile="..\defs\fbclient.def"
|
||||
SubSystem="2"
|
||||
StackReserveSize="2097152"
|
||||
/>
|
||||
@ -225,6 +227,7 @@
|
||||
OutputFile="..\..\..\temp\$(PlatformName)\$(ConfigurationName)\firebird\bin\$(ProjectName).exe"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories="../../../extern/icu/$(PlatformName)/$(ConfigurationName)/lib"
|
||||
ModuleDefinitionFile="..\defs\fbclient.def"
|
||||
SubSystem="2"
|
||||
StackReserveSize="4194304"
|
||||
TargetMachine="17"
|
||||
@ -304,6 +307,7 @@
|
||||
OutputFile="..\..\..\temp\$(PlatformName)\$(ConfigurationName)\firebird\bin\$(ProjectName).exe"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories="../../../extern/icu/$(PlatformName)/release/lib"
|
||||
ModuleDefinitionFile="..\defs\fbclient.def"
|
||||
SubSystem="2"
|
||||
StackReserveSize="4194304"
|
||||
TargetMachine="17"
|
||||
@ -352,6 +356,10 @@
|
||||
RelativePath="..\..\..\src\utilities\nbackup\nbkMain.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\perf.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\utilities\gstat\ppg.cpp"
|
||||
>
|
||||
@ -414,6 +422,10 @@
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<File
|
||||
RelativePath="..\defs\fbclient.def"
|
||||
>
|
||||
</File>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
|
413
builds/win32/msvc8/udr_engine.vcproj
Normal file
413
builds/win32/msvc8/udr_engine.vcproj
Normal file
@ -0,0 +1,413 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="8,00"
|
||||
Name="udr_engine"
|
||||
ProjectGUID="{20DEBF08-EF0A-4C94-ADEB-FE9BBA14588B}"
|
||||
>
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"
|
||||
/>
|
||||
<Platform
|
||||
Name="x64"
|
||||
/>
|
||||
</Platforms>
|
||||
<ToolFiles>
|
||||
</ToolFiles>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
ConfigurationType="2"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops;.\firebird2.vsprops;.\firebird2debug.vsprops"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="true"
|
||||
TargetEnvironment="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="../../../src/include;../../../src/include/gen;../../../src/jrd"
|
||||
PreprocessorDefinitions="_DEBUG;_WINDOWS;_USRDLL;WINDOWS_ONLY;SUPERCLIENT;WIN32;DEV_BUILD"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1053"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="comctl32.lib ws2_32.lib mpr.lib version.lib"
|
||||
OutputFile="..\..\..\temp\$(PlatformName)\$(ConfigurationName)\firebird\plugins\$(ProjectName).dll"
|
||||
LinkIncremental="1"
|
||||
ModuleDefinitionFile="..\defs\udr_engine.def"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
ConfigurationType="2"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops;.\firebird2.vsprops;.\firebird2release.vsprops"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="true"
|
||||
TargetEnvironment="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
EnableIntrinsicFunctions="true"
|
||||
FavorSizeOrSpeed="1"
|
||||
AdditionalIncludeDirectories="../../../src/include;../../../src/include/gen;../../../src/jrd"
|
||||
PreprocessorDefinitions="NDEBUG;_WINDOWS;_USRDLL;WINDOWS_ONLY;SUPERCLIENT;WIN32"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1053"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="comctl32.lib ws2_32.lib mpr.lib version.lib"
|
||||
OutputFile="..\..\..\temp\$(PlatformName)\$(ConfigurationName)\firebird\plugins\$(ProjectName).dll"
|
||||
LinkIncremental="1"
|
||||
ModuleDefinitionFile="..\defs\udr_engine.def"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Debug|x64"
|
||||
ConfigurationType="2"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops;.\firebird2.vsprops;.\firebird2debug.vsprops"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="true"
|
||||
TargetEnvironment="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="../../../src/include;../../../src/include/gen;../../../src/jrd"
|
||||
PreprocessorDefinitions="_DEBUG;_WINDOWS;_USRDLL;WINDOWS_ONLY;SUPERCLIENT;WIN32;DEV_BUILD"
|
||||
Detect64BitPortabilityProblems="true"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1053"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="comctl32.lib ws2_32.lib mpr.lib version.lib"
|
||||
OutputFile="..\..\..\temp\$(PlatformName)\$(ConfigurationName)\firebird\plugins\$(ProjectName).dll"
|
||||
LinkIncremental="1"
|
||||
ModuleDefinitionFile="..\defs\udr_engine.def"
|
||||
TargetMachine="17"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|x64"
|
||||
ConfigurationType="2"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops;.\firebird2.vsprops;.\firebird2release.vsprops"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="true"
|
||||
TargetEnvironment="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
EnableIntrinsicFunctions="true"
|
||||
FavorSizeOrSpeed="1"
|
||||
AdditionalIncludeDirectories="../../../src/include;../../../src/include/gen;../../../src/jrd"
|
||||
PreprocessorDefinitions="NDEBUG;_WINDOWS;_USRDLL;WINDOWS_ONLY;SUPERCLIENT;WIN32"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1053"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="comctl32.lib ws2_32.lib mpr.lib version.lib"
|
||||
OutputFile="..\..\..\temp\$(PlatformName)\$(ConfigurationName)\firebird\plugins\$(ProjectName).dll"
|
||||
LinkIncremental="1"
|
||||
ModuleDefinitionFile="..\defs\udr_engine.def"
|
||||
TargetMachine="17"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source files"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\..\..\src\plugins\udr_engine\UdrEngine.cpp"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header files"
|
||||
Filter="h;hpp;hxx;hm;inl"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\..\..\src\include\FirebirdUdr.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource files"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\version.rc"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
AdditionalIncludeDirectories="..\..\..\src\jrd;$(NoInherit)"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
AdditionalIncludeDirectories="..\..\..\src\jrd;$(NoInherit)"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug|x64"
|
||||
>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
AdditionalIncludeDirectories="..\..\..\src\jrd;$(NoInherit)"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|x64"
|
||||
>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
AdditionalIncludeDirectories="..\..\..\src\jrd;$(NoInherit)"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="JRD files"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\gds.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\isc.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\os\win32\os_utils.cpp"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<File
|
||||
RelativePath="..\defs\udr_engine.def"
|
||||
>
|
||||
</File>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
389
builds/win32/msvc8/udrcpp_example.vcproj
Normal file
389
builds/win32/msvc8/udrcpp_example.vcproj
Normal file
@ -0,0 +1,389 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="8,00"
|
||||
Name="udrcpp_example"
|
||||
ProjectGUID="{FF0FD8DF-1E5C-486E-B395-A620376A4633}"
|
||||
>
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"
|
||||
/>
|
||||
<Platform
|
||||
Name="x64"
|
||||
/>
|
||||
</Platforms>
|
||||
<ToolFiles>
|
||||
</ToolFiles>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
ConfigurationType="2"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops;.\firebird2.vsprops;.\firebird2debug.vsprops"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="true"
|
||||
TargetEnvironment="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="..\..\..\src\jrd"
|
||||
PreprocessorDefinitions="_DEBUG;_WINDOWS;_USRDLL;WINDOWS_ONLY;SUPERCLIENT;WIN32;DEV_BUILD;_CRT_SECURE_NO_DEPRECATE"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1053"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="comctl32.lib ws2_32.lib mpr.lib version.lib"
|
||||
OutputFile="..\..\..\temp\$(PlatformName)\$(ConfigurationName)\firebird\plugins\udr\$(ProjectName).dll"
|
||||
LinkIncremental="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
ConfigurationType="2"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops;.\firebird2.vsprops;.\firebird2release.vsprops"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="true"
|
||||
TargetEnvironment="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
EnableIntrinsicFunctions="true"
|
||||
FavorSizeOrSpeed="1"
|
||||
AdditionalIncludeDirectories="..\..\..\src\jrd"
|
||||
PreprocessorDefinitions="NDEBUG;_WINDOWS;_USRDLL;WINDOWS_ONLY;SUPERCLIENT;WIN32;_CRT_SECURE_NO_DEPRECATE"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1053"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="comctl32.lib ws2_32.lib mpr.lib version.lib"
|
||||
OutputFile="..\..\..\temp\$(PlatformName)\$(ConfigurationName)\firebird\plugins\udr\$(ProjectName).dll"
|
||||
LinkIncremental="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Debug|x64"
|
||||
ConfigurationType="2"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops;.\firebird2.vsprops;.\firebird2debug.vsprops"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="true"
|
||||
TargetEnvironment="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="..\..\..\src\jrd"
|
||||
PreprocessorDefinitions="_DEBUG;_WINDOWS;_USRDLL;WINDOWS_ONLY;SUPERCLIENT;WIN32;DEV_BUILD;_CRT_SECURE_NO_DEPRECATE"
|
||||
Detect64BitPortabilityProblems="true"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1053"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="comctl32.lib ws2_32.lib mpr.lib version.lib"
|
||||
OutputFile="..\..\..\temp\$(PlatformName)\$(ConfigurationName)\firebird\plugins\udr\$(ProjectName).dll"
|
||||
LinkIncremental="1"
|
||||
TargetMachine="17"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|x64"
|
||||
ConfigurationType="2"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops;.\firebird2.vsprops;.\firebird2release.vsprops"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="true"
|
||||
TargetEnvironment="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
EnableIntrinsicFunctions="true"
|
||||
FavorSizeOrSpeed="1"
|
||||
AdditionalIncludeDirectories="..\..\..\src\jrd"
|
||||
PreprocessorDefinitions="NDEBUG;_WINDOWS;_USRDLL;WINDOWS_ONLY;SUPERCLIENT;WIN32;_CRT_SECURE_NO_DEPRECATE"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1053"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="comctl32.lib ws2_32.lib mpr.lib version.lib"
|
||||
OutputFile="..\..\..\temp\$(PlatformName)\$(ConfigurationName)\firebird\plugins\udr\$(ProjectName).dll"
|
||||
LinkIncremental="1"
|
||||
TargetMachine="17"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source files"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\..\..\examples\udr\UdrCppExample.cpp"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header files"
|
||||
Filter="h;hpp;hxx;hm;inl"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\..\..\src\includeFirebirdUdr.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource files"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\..\..\src\jrd\version.rc"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
AdditionalIncludeDirectories="..\..\..\src\jrd;$(NoInherit)"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
AdditionalIncludeDirectories="..\..\..\src\jrd;$(NoInherit)"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug|x64"
|
||||
>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
AdditionalIncludeDirectories="..\..\..\src\jrd;$(NoInherit)"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|x64"
|
||||
>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
AdditionalIncludeDirectories="..\..\..\src\jrd;$(NoInherit)"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
@ -55,7 +55,7 @@ goto :EOF
|
||||
@echo.
|
||||
@set GPRE=%FB_GEN_DIR%\gpre_boot -lang_internal
|
||||
@for %%i in (array, blob) do @call :PREPROCESS dsql %%i
|
||||
@for %%i in (metd, DdlNodes) do @call :PREPROCESS dsql %%i -gds_cxx
|
||||
@for %%i in (metd, DdlNodes, PackageNodes) do @call :PREPROCESS dsql %%i -gds_cxx
|
||||
@for %%i in (gpre_meta) do @call :PREPROCESS gpre %%i
|
||||
@for %%i in (backup, restore) do @call :PREPROCESS burp %%i
|
||||
@for %%i in (extract, isql, show) do @call :PREPROCESS isql %%i
|
||||
@ -64,7 +64,7 @@ goto :EOF
|
||||
@set GPRE=%FB_GEN_DIR%\gpre_boot
|
||||
@for %%i in (alice_meta) do @call :PREPROCESS alice %%i
|
||||
@for %%i in (array, blob) do @call :PREPROCESS dsql %%i
|
||||
@for %%i in (metd, DdlNodes) do @call :PREPROCESS dsql %%i -gds_cxx
|
||||
@for %%i in (metd, DdlNodes, PackageNodes) do @call :PREPROCESS dsql %%i -gds_cxx
|
||||
@for %%i in (gpre_meta) do @call :PREPROCESS gpre %%i
|
||||
@for %%i in (dfw, dpm, dyn, dyn_def, dyn_del, dyn_mod, dyn_util, fun, grant, ini, met, pcmet, scl) do @call :PREPROCESS jrd %%i -gds_cxx
|
||||
@for %%i in (stats) do @call :PREPROCESS utilities %%i
|
||||
@ -77,7 +77,7 @@ goto :EOF
|
||||
@for %%i in (backup, restore) do @call :PREPROCESS burp %%i
|
||||
@for %%i in (array, blob) do @call :PREPROCESS dsql %%i
|
||||
@for %%i in (metd) do @call :PREPROCESS dsql %%i -gds_cxx -cxx
|
||||
@for %%i in (DdlNodes) do @call :PREPROCESS dsql %%i -gds_cxx
|
||||
@for %%i in (DdlNodes, PackageNodes) do @call :PREPROCESS dsql %%i -gds_cxx
|
||||
@for %%i in (exe, extract) do @call :PREPROCESS dudley %%i
|
||||
@for %%i in (gpre_meta) do @call :PREPROCESS gpre %%i
|
||||
@for %%i in (dfw, dpm, dyn, dyn_def, dyn_del, dyn_mod, dyn_util, fun, grant, ini, met, pcmet, scl) do @call :PREPROCESS jrd %%i -gds_cxx
|
||||
|
11
configure.in
11
configure.in
@ -978,6 +978,7 @@ mkdir -p gen/jrd
|
||||
mkdir -p gen/jrd/extds
|
||||
mkdir -p gen/jrd/trace
|
||||
mkdir -p gen/msgs
|
||||
mkdir -p gen/plugins/udr_engine
|
||||
mkdir -p gen/qli
|
||||
mkdir -p gen/utilities
|
||||
mkdir -p gen/examples
|
||||
@ -999,11 +1000,13 @@ dnl # mkdir -p gen/firebird/examples/build_unix
|
||||
dnl # mkdir -p gen/firebird/examples/build_win32
|
||||
mkdir -p gen/firebird/examples/empbuild
|
||||
mkdir -p gen/firebird/examples/include
|
||||
mkdir -p gen/firebird/examples/udr
|
||||
mkdir -p gen/firebird/examples/stat
|
||||
mkdir -p gen/firebird/examples/udf
|
||||
mkdir -p gen/firebird/lib
|
||||
mkdir -p gen/firebird/misc
|
||||
mkdir -p gen/firebird/help
|
||||
mkdir -p gen/firebird/plugins/udr
|
||||
|
||||
dnl # rebuild version header if needed
|
||||
./src/misc/writeBuildNum.sh rebuildHeader
|
||||
@ -1035,6 +1038,7 @@ mkdir -p temp/boot/jrd/os/darwin
|
||||
mkdir -p temp/boot/lock
|
||||
mkdir -p temp/boot/misc
|
||||
mkdir -p temp/boot/msgs
|
||||
# mkdir -p temp/boot/plugins/udr_engine
|
||||
mkdir -p temp/boot/qli
|
||||
mkdir -p temp/boot/remote
|
||||
mkdir -p temp/boot/remote/os/win32
|
||||
@ -1077,6 +1081,7 @@ mkdir -p temp/std/jrd/os/darwin
|
||||
mkdir -p temp/std/lock
|
||||
mkdir -p temp/std/misc
|
||||
mkdir -p temp/std/msgs
|
||||
mkdir -p temp/std/plugins/udr_engine
|
||||
mkdir -p temp/std/qli
|
||||
mkdir -p temp/std/remote
|
||||
mkdir -p temp/std/remote/os/win32
|
||||
@ -1118,6 +1123,7 @@ mkdir -p temp/superclient/jrd/os/darwin
|
||||
mkdir -p temp/superclient/lock
|
||||
mkdir -p temp/superclient/misc
|
||||
mkdir -p temp/superclient/msgs
|
||||
mkdir -p temp/superclient/plugins/udr_engine
|
||||
mkdir -p temp/superclient/qli
|
||||
mkdir -p temp/superclient/remote
|
||||
mkdir -p temp/superclient/remote/os/win32
|
||||
@ -1159,6 +1165,7 @@ mkdir -p temp/superserver/jrd/os/darwin
|
||||
mkdir -p temp/superserver/lock
|
||||
mkdir -p temp/superserver/misc
|
||||
mkdir -p temp/superserver/msgs
|
||||
mkdir -p temp/superserver/plugins/udr_engine
|
||||
mkdir -p temp/superserver/qli
|
||||
mkdir -p temp/superserver/remote
|
||||
mkdir -p temp/superserver/remote/os/win32
|
||||
@ -1176,6 +1183,8 @@ mkdir -p temp/superserver/utilities/rebuild
|
||||
mkdir -p temp/superserver/utilities/ntrace
|
||||
mkdir -p temp/superserver/vulcan
|
||||
|
||||
mkdir -p temp/examples/udr
|
||||
|
||||
])
|
||||
|
||||
|
||||
@ -1349,7 +1358,9 @@ gen/Makefile.client.gsec:${MAKE_SRC_DIR}/Makefile.in.client.gsec
|
||||
gen/Makefile.intl:${MAKE_SRC_DIR}/Makefile.in.intl
|
||||
gen/Makefile.msgs:${MAKE_SRC_DIR}/Makefile.in.msgs
|
||||
gen/Makefile.extlib:${MAKE_SRC_DIR}/Makefile.in.extlib
|
||||
gen/Makefile.plugins:${MAKE_SRC_DIR}/Makefile.in.plugins
|
||||
gen/examples/Makefile.examples:${MAKE_SRC_DIR}/Makefile.in.examples
|
||||
gen/examples/Makefile.plugins_examples:${MAKE_SRC_DIR}/Makefile.in.plugins_examples
|
||||
gen/Makefile.libfbembed:${MAKE_SRC_DIR}/Makefile.in.libfbembed
|
||||
gen/Makefile.inet_server:${MAKE_SRC_DIR}/Makefile.in.inet_server
|
||||
gen/Makefile.embed.util:${MAKE_SRC_DIR}/Makefile.in.embed.util
|
||||
|
107
doc/README.external_routines.txt
Normal file
107
doc/README.external_routines.txt
Normal file
@ -0,0 +1,107 @@
|
||||
-----------------
|
||||
External Routines
|
||||
-----------------
|
||||
|
||||
Author:
|
||||
Adriano dos Santos Fernandes <adrianosf@uol.com.br>
|
||||
|
||||
Syntax:
|
||||
|
||||
{ CREATE [ OR ALTER ] | RECREATE | ALTER } PROCEDURE <name>
|
||||
[ ( <parameter list> ) ]
|
||||
[ RETURNS ( <parameter list> ) ]
|
||||
EXTERNAL NAME '<external name>' ENGINE <engine>
|
||||
|
||||
{ CREATE [ OR ALTER ] | RECREATE | ALTER } FUNCTION <name>
|
||||
[ <parameter list> ]
|
||||
RETURNS <data type>
|
||||
EXTERNAL NAME '<external name>' ENGINE <engine>
|
||||
|
||||
{ CREATE [ OR ALTER ] | RECREATE | ALTER } TRIGGER <name>
|
||||
...
|
||||
EXTERNAL NAME '<external name>' ENGINE <engine>
|
||||
|
||||
Examples:
|
||||
|
||||
create procedure gen_rows (
|
||||
start_n integer not null,
|
||||
end_n integer not null
|
||||
) returns (
|
||||
n integer not null
|
||||
) external name 'udrcpp_example!gen_rows'
|
||||
engine udr;
|
||||
|
||||
create function wait_event (
|
||||
event_name varchar(31) character set ascii
|
||||
) returns integer
|
||||
external name 'udrcpp_example!wait_event'
|
||||
engine udr;
|
||||
|
||||
create trigger persons_replicate
|
||||
after insert on persons
|
||||
external name 'udrcpp_example!replicate!ds1'
|
||||
engine udr;
|
||||
|
||||
How it works:
|
||||
|
||||
External names are opaque strings to Firebird. They are recognized by specific external engines.
|
||||
External engines are declared in config files (possibly in the same file as a plugin, like in the
|
||||
config example present below).
|
||||
|
||||
<external_engine UDR>
|
||||
plugin_module UDR_engine
|
||||
</external_engine>
|
||||
|
||||
<plugin_module UDR_engine>
|
||||
filename $(this)/udr_engine
|
||||
plugin_config UDR_config
|
||||
</plugin_module>
|
||||
|
||||
<plugin_config UDR_config>
|
||||
path $(this)/udr
|
||||
</plugin_config>
|
||||
|
||||
When Firebird wants to load an external routine (function, procedure or trigger) into its metadata
|
||||
cache, it gets (if not already done for the database*) the external engine through the plugin
|
||||
external engine factory and ask it for the routine. The plugin used is the one referenced by the
|
||||
attribute plugin_module of the external engine.
|
||||
|
||||
* This is in Super-Server. In [Super-]Classic, different attachments to one database creates
|
||||
multiple metadata caches and hence multiple external engine instances.
|
||||
|
||||
|
||||
----------------------------------
|
||||
UDR - User Defined Routines engine
|
||||
----------------------------------
|
||||
|
||||
The UDR (User Defined Routines) engine adds a layer on top of the FirebirdExternal interface with
|
||||
these objectives:
|
||||
- Establish a way to place external modules into server and make them available for usage;
|
||||
- Create an API so that external modules can register their available routines;
|
||||
- Make routines instances per-attachment, instead of per-database like the FirebirdExternal does
|
||||
in SuperServer mode.
|
||||
|
||||
External names of the UDR engine are defined as following:
|
||||
'<module name>!<routine name>!<misc info>'
|
||||
|
||||
The <module name> is used to locate the library, <routine name> is used to locate the routine
|
||||
registered by the given module, and <misc info> is an user defined string passed to the routine
|
||||
and can be read by the user. "!<misc info>" may be ommitted.
|
||||
|
||||
Modules available to the UDR engine should be in a directory listed through the path attribute of
|
||||
the correspondent plugin_config tag. By default, UDR modules should be on <fbroot>/plugins/udr,
|
||||
accordingly to its path attribute in <fbroot>/plugins/udr_engine.conf.
|
||||
|
||||
The user library should include FirebirdUdr.h (or FirebirdUdrCpp.h) and link with the udr_engine
|
||||
library. Routines are easily defined and registered using some macros, but nothing prevent you of
|
||||
doing things manually. A example routine library is implemented in examples/plugins, showing how to
|
||||
write functions, selectable procedures and triggers. Also it shows how to interact with the current
|
||||
database through the ISC API.
|
||||
|
||||
The UDR routines state (i.e., member variables) are shared between multiple invocations of the same
|
||||
routine until it's unloaded from the metadata cache. But note that it isolates the instances per
|
||||
session, different from the raw interface that shares instances by multiple sessions in SuperServer.
|
||||
|
||||
By default, UDR routines uses the same character set specified by the client. They can modify it
|
||||
overriding the getCharSet method. The chosen character set is valid for communication with the ISC
|
||||
library as well as the communications done through the FirebirdExternal API.
|
25
doc/sql.extensions/README.alternate_string_quoting.txt
Normal file
25
doc/sql.extensions/README.alternate_string_quoting.txt
Normal file
@ -0,0 +1,25 @@
|
||||
------------------------
|
||||
Alternate String Quoting
|
||||
------------------------
|
||||
|
||||
Support for alternate format of strings literals.
|
||||
|
||||
Author:
|
||||
Adriano dos Santos Fernandes <adrianosf@uol.com.br>
|
||||
|
||||
Syntax:
|
||||
|
||||
<alternate string literal> ::=
|
||||
{ q | Q } <quote> <alternate start char> [ { <char> }... ] <alternate end char> <quote>
|
||||
|
||||
Syntax rules:
|
||||
When <alternate start char> is '(', '{', '[' or '<', <alternate end char> is respectively
|
||||
')', '}', ']' and '>'. In other cases, <alternate end char> is equal to <alternate start char>.
|
||||
|
||||
Notes:
|
||||
Inside the string, i.e., <char> items, single (not escaped) quotes could be used.
|
||||
Each quote will be part of the result string.
|
||||
|
||||
Examples:
|
||||
select q'{abc{def}ghi}' from rdb$database; -- result: abc{def}ghi
|
||||
select q'!That's a string!' from rdb$database; -- result: That's a string
|
306
doc/sql.extensions/README.ddl_triggers.txt
Normal file
306
doc/sql.extensions/README.ddl_triggers.txt
Normal file
@ -0,0 +1,306 @@
|
||||
------------
|
||||
DDL triggers
|
||||
------------
|
||||
|
||||
Author:
|
||||
Adriano dos Santos Fernandes <adrianosf@uol.com.br>
|
||||
(This feature was sponsored with donations gathered in the "5th Brazilian Firebird Developers Day")
|
||||
|
||||
Syntax:
|
||||
<database-trigger> ::=
|
||||
{CREATE | RECREATE | CREATE OR ALTER}
|
||||
TRIGGER <name>
|
||||
[ACTIVE | INACTIVE]
|
||||
{BEFORE | AFTER} <ddl event>
|
||||
[POSITION <n>]
|
||||
AS
|
||||
BEGIN
|
||||
...
|
||||
END
|
||||
|
||||
<ddl event> ::=
|
||||
ANY DDL STATEMENT
|
||||
| <ddl event item> [{OR <ddl event item>}...]
|
||||
|
||||
<ddl event item> ::=
|
||||
CREATE TABLE
|
||||
| ALTER TABLE
|
||||
| DROP TABLE
|
||||
| CREATE PROCEDURE
|
||||
| ALTER PROCEDURE
|
||||
| DROP PROCEDURE
|
||||
| CREATE FUNCTION
|
||||
| ALTER FUNCTION
|
||||
| DROP FUNCTION
|
||||
| CREATE TRIGGER
|
||||
| ALTER TRIGGER
|
||||
| DROP TRIGGER
|
||||
| CREATE EXCEPTION
|
||||
| ALTER EXCEPTION
|
||||
| DROP EXCEPTION
|
||||
| CREATE VIEW
|
||||
| ALTER VIEW
|
||||
| DROP VIEW
|
||||
| CREATE DOMAIN
|
||||
| ALTER DOMAIN
|
||||
| DROP DOMAIN
|
||||
| CREATE ROLE
|
||||
| ALTER ROLE
|
||||
| DROP ROLE
|
||||
| CREATE SEQUENCE
|
||||
| ALTER SEQUENCE
|
||||
| DROP SEQUENCE
|
||||
| CREATE USER
|
||||
| ALTER USER
|
||||
| DROP USER
|
||||
| CREATE INDEX
|
||||
| ALTER INDEX
|
||||
| DROP INDEX
|
||||
| CREATE COLLATION
|
||||
| DROP COLLATION
|
||||
| ALTER CHARACTER SET
|
||||
| CREATE PACKAGE
|
||||
| ALTER PACKAGE
|
||||
| DROP PACKAGE
|
||||
| CREATE PACKAGE BODY
|
||||
| DROP PACKAGE BODY
|
||||
|
||||
|
||||
Syntax rules:
|
||||
1) DDL triggers type can't be changed.
|
||||
|
||||
Semantics:
|
||||
1) BEFORE triggers are fired before changes to system tables and AFTER triggers are fired after
|
||||
system table changes.
|
||||
2) It's possible to cancel the command raising an exception in BEFORE or in AFTER triggers.
|
||||
3) Firebird really does DDL actions only when committing the transaction that run DDL commands.
|
||||
You should pay attention to that. What you can do in AFTER triggers are exactly what you can
|
||||
do after a DDL command without autocommit. For example, you can't create a table and use it
|
||||
on the trigger.
|
||||
4) With CREATE OR ALTER statements, trigger is fired one time using the CREATE or ALTER event
|
||||
based on the previous existence of the object. With RECREATE statements, trigger is fired for
|
||||
DROP (when the object exists) and for CREATE events.
|
||||
5) ALTER and DROP events are generally not fired when the object name does not exist.
|
||||
6) As exception to rule 5, BEFORE ALTER/DROP USER triggers fires even when the user name does
|
||||
not exist. This is because these commands run on the security database and the verification
|
||||
is not done before run the command on it. This is likely to be different with embedded users,
|
||||
so do not write your code depending on this.
|
||||
7) If some exception is raised after the DDL command starts its execution and before AFTER
|
||||
triggers are fired, AFTER triggers will not be fired.
|
||||
8) Packaged procedures and triggers do not fire individual {CREATE | ALTER | DROP} {PROCEDURE |
|
||||
FUNCTION} triggers.
|
||||
|
||||
Utilities support:
|
||||
DDL triggers is a type of database triggers, so the parameters -nodbtriggers (GBAK and ISQL)
|
||||
and -T (NBACKUP) also works for them.
|
||||
These parameters could only be used by database owner and SYSDBA.
|
||||
|
||||
Permissions:
|
||||
Only database owner and SYSDBA can create/alter/drop DDL triggers.
|
||||
|
||||
DDL_TRIGGER context namespace:
|
||||
It has been introduced the DDL_TRIGGER context for usage with RDB$GET_CONTEXT. Usage of this
|
||||
namespace is valid only when DDL triggers are running. It's valid to use it in stored
|
||||
procedures called by DDL triggers.
|
||||
The DDL_TRIGGER context works like a stack. Before a DDL trigger is fired, it's pushed on that
|
||||
stack the values relative to the executed command. After the trigger finishes, the value is
|
||||
poped. So in the case of cascade DDL statements, when an user DDL command fires a DDL trigger
|
||||
and this trigger executes another DDL command with EXECUTE STATEMENT, the values of DDL_TRIGGER
|
||||
namespace are the ones relative to the command that fired the last DDL trigger on the call
|
||||
stack.
|
||||
|
||||
The context elements are:
|
||||
- DDL_EVENT: event name (<ddl event item>)
|
||||
- OBJECT_NAME: metadata object name
|
||||
- SQL_TEXT: sql statement text
|
||||
|
||||
|
||||
Example usages:
|
||||
===============
|
||||
|
||||
|
||||
1) Enforce a name consistense scheme. All procedure names should start with the prefix "SP_".
|
||||
|
||||
create exception e_invalid_sp_name 'Invalid SP name (should start with SP_)';
|
||||
|
||||
set term !;
|
||||
|
||||
create trigger trig_ddl_sp before create procedure
|
||||
as
|
||||
begin
|
||||
if (rdb$get_context('DDL_TRIGGER', 'OBJECT_NAME') not starting 'SP_') then
|
||||
exception e_invalid_sp_name;
|
||||
end!
|
||||
|
||||
-- Test
|
||||
|
||||
create procedure sp_test
|
||||
as
|
||||
begin
|
||||
end!
|
||||
|
||||
create procedure test
|
||||
as
|
||||
begin
|
||||
end!
|
||||
|
||||
-- The last command raises this exception and procedure TEST is not created
|
||||
-- Statement failed, SQLSTATE = 42000
|
||||
-- exception 1
|
||||
-- -E_INVALID_SP_NAME
|
||||
-- -Invalid SP name (should start with SP_)
|
||||
-- -At trigger 'TRIG_DDL_SP' line: 4, col: 5
|
||||
|
||||
set term ;!
|
||||
|
||||
|
||||
----------------------------------------
|
||||
|
||||
|
||||
2) Implement handy-made DDL security. Only certainly users could run DDL commands.
|
||||
|
||||
create exception e_access_denied 'Access denied';
|
||||
|
||||
set term !;
|
||||
|
||||
create trigger trig_ddl before any ddl statement
|
||||
as
|
||||
begin
|
||||
if (current_user <> 'SUPER_USER') then
|
||||
exception e_access_denied;
|
||||
end!
|
||||
|
||||
-- Test
|
||||
|
||||
create procedure sp_test
|
||||
as
|
||||
begin
|
||||
end!
|
||||
|
||||
-- The last command raises this exception and procedure SP_TEST is not created
|
||||
-- Statement failed, SQLSTATE = 42000
|
||||
-- exception 1
|
||||
-- -E_ACCESS_DENIED
|
||||
-- -Access denied
|
||||
-- -At trigger 'TRIG_DDL' line: 4, col: 5
|
||||
|
||||
set term ;!
|
||||
|
||||
|
||||
----------------------------------------
|
||||
|
||||
|
||||
3) Log DDL actions and attempts.
|
||||
|
||||
create sequence ddl_seq;
|
||||
|
||||
create table ddl_log (
|
||||
id bigint not null primary key,
|
||||
moment timestamp not null,
|
||||
user_name varchar(31) not null,
|
||||
ddl_event varchar(25) not null,
|
||||
object_name varchar(31) not null,
|
||||
sql_text blob sub_type text not null,
|
||||
ok char(1) not null
|
||||
);
|
||||
|
||||
set term !;
|
||||
|
||||
create trigger trig_ddl_log_before before any ddl statement
|
||||
as
|
||||
declare id type of column ddl_log.id;
|
||||
begin
|
||||
-- We do the changes in an AUTONOMOUS TRANSACTION, so if an exception happens and the command
|
||||
-- didn't run, the log will survive.
|
||||
in autonomous transaction do
|
||||
begin
|
||||
insert into ddl_log (id, moment, user_name, ddl_event, object_name, sql_text, ok)
|
||||
values (next value for ddl_seq, current_timestamp, current_user,
|
||||
rdb$get_context('DDL_TRIGGER', 'DDL_EVENT'),
|
||||
rdb$get_context('DDL_TRIGGER', 'OBJECT_NAME'),
|
||||
rdb$get_context('DDL_TRIGGER', 'SQL_TEXT'),
|
||||
'N')
|
||||
returning id into id;
|
||||
rdb$set_context('USER_SESSION', 'trig_ddl_log_id', id);
|
||||
end
|
||||
end!
|
||||
|
||||
-- Note: the above trigger will fire for this DDL command. It's good idea to use -nodbtriggers
|
||||
-- when working with them!
|
||||
create trigger trig_ddl_log_after after any ddl statement
|
||||
as
|
||||
begin
|
||||
-- Here we need an AUTONOMOUS TRANSACTION because the original transaction will not see the
|
||||
-- record inserted on the BEFORE trigger autonomous transaction if user transaction is not
|
||||
-- READ COMMITTED.
|
||||
in autonomous transaction do
|
||||
update ddl_log set ok = 'Y' where id = rdb$get_context('USER_SESSION', 'trig_ddl_log_id');
|
||||
end!
|
||||
|
||||
commit!
|
||||
|
||||
set term ;!
|
||||
|
||||
-- So lets delete the record about trig_ddl_log_after creation.
|
||||
delete from ddl_log;
|
||||
commit;
|
||||
|
||||
-- Test
|
||||
|
||||
-- This will be logged one time (as T1 did not exists, RECREATE acts as CREATE) with OK = Y.
|
||||
recreate table t1 (
|
||||
n1 integer,
|
||||
n2 integer
|
||||
);
|
||||
|
||||
-- This will fail as T1 already exists, so OK will be N.
|
||||
create table t1 (
|
||||
n1 integer,
|
||||
n2 integer
|
||||
);
|
||||
|
||||
-- T2 does not exists. There will be no log.
|
||||
drop table t2;
|
||||
|
||||
-- This will be logged two times (as T1 exists, RECREATE acts as DROP and CREATE) with OK = Y.
|
||||
recreate table t1 (
|
||||
n integer
|
||||
);
|
||||
|
||||
commit;
|
||||
|
||||
select id, ddl_event, object_name, sql_text, ok from ddl_log order by id;
|
||||
|
||||
ID DDL_EVENT OBJECT_NAME SQL_TEXT OK
|
||||
===================== ========================= =============================== ================= ======
|
||||
2 CREATE TABLE T1 80:3 Y
|
||||
==============================================================================
|
||||
SQL_TEXT:
|
||||
recreate table t1 (
|
||||
n1 integer,
|
||||
n2 integer
|
||||
)
|
||||
==============================================================================
|
||||
3 CREATE TABLE T1 80:2 N
|
||||
==============================================================================
|
||||
SQL_TEXT:
|
||||
create table t1 (
|
||||
n1 integer,
|
||||
n2 integer
|
||||
)
|
||||
==============================================================================
|
||||
4 DROP TABLE T1 80:6 Y
|
||||
==============================================================================
|
||||
SQL_TEXT:
|
||||
recreate table t1 (
|
||||
n integer
|
||||
)
|
||||
==============================================================================
|
||||
5 CREATE TABLE T1 80:9 Y
|
||||
==============================================================================
|
||||
SQL_TEXT:
|
||||
recreate table t1 (
|
||||
n integer
|
||||
)
|
||||
==============================================================================
|
||||
|
125
doc/sql.extensions/README.packages.txt
Normal file
125
doc/sql.extensions/README.packages.txt
Normal file
@ -0,0 +1,125 @@
|
||||
--------
|
||||
Packages
|
||||
--------
|
||||
|
||||
Author:
|
||||
Adriano dos Santos Fernandes <adrianosf@uol.com.br>
|
||||
(This feature was sponsored with donations gathered in the "5th Brazilian Firebird Developers Day")
|
||||
|
||||
Description:
|
||||
A package is a group of procedures and functions managed as one entity.
|
||||
|
||||
Syntax:
|
||||
<package_header> ::=
|
||||
{ CREATE [OR ALTER] | ALTER | RECREATE } PACKAGE <name>
|
||||
AS
|
||||
BEGIN
|
||||
[ <package_item> ... ]
|
||||
END
|
||||
|
||||
<package_item> ::=
|
||||
<function_decl> ; |
|
||||
<procedure_decl> ;
|
||||
|
||||
<function_decl> ::=
|
||||
FUNCTION <name> [( <parameters> )] RETURNS <type>
|
||||
|
||||
<procedure_decl> ::=
|
||||
PROCEDURE <name> [( <parameters> ) [RETURNS ( <parameters> )]]
|
||||
|
||||
<package_body> ::=
|
||||
{ CREATE | RECREATE } PACKAGE BODY <name>
|
||||
AS
|
||||
BEGIN
|
||||
[ <package_item> ... ]
|
||||
[ <package_body_item> ... ]
|
||||
END
|
||||
|
||||
<package_body_item> ::=
|
||||
<function_impl> ; |
|
||||
<procedure_impl> ;
|
||||
|
||||
<function_impl> ::=
|
||||
FUNCTION <name> [( <parameters> )] RETURNS <type>
|
||||
EXTERNAL NAME '<name>' ENGINE <engine>
|
||||
|
||||
<procedure_impl> ::=
|
||||
PROCEDURE <name> [( <parameters> ) [RETURNS ( <parameters> )]]
|
||||
AS
|
||||
BEGIN
|
||||
...
|
||||
END
|
||||
|
|
||||
PROCEDURE <name> [( <parameters> ) [RETURNS ( <parameters> )]]
|
||||
EXTERNAL NAME '<name>' ENGINE <engine>
|
||||
|
||||
<drop_package_header> ::=
|
||||
DROP PACKAGE <name>
|
||||
|
||||
<drop_package_body> ::=
|
||||
DROP PACKAGE BODY <name>
|
||||
|
||||
Objectives:
|
||||
- Make functional dependent code separated in logical modules like programming languages does.
|
||||
|
||||
It's well know in programming world that having code grouped in some way (for example in
|
||||
namespaces, units or classes) is a good thing. With standard procedures and functions in the
|
||||
database this is not possible. It's possible to group them in different scripts files, but
|
||||
two problems remains:
|
||||
1) The grouping is not represented in the database metadata.
|
||||
2) They all participate in a flat namespace and all routines are callable by everyone (not
|
||||
talking about security permissions here).
|
||||
|
||||
- Facilitate dependency tracking between its internal routines and between others packaged and
|
||||
unpackaged routines.
|
||||
|
||||
Firebird packages are divided in two pieces: a header (aka PACKAGE) and a body (aka
|
||||
PACKAGE BODY). This division is very similar to a Delphi unit. The header correspond to the
|
||||
interface part, and the body correspond to the implementation part.
|
||||
|
||||
The user needs first to create the header (CREATE PACKAGE) and after it the body (CREATE
|
||||
PACKAGE BODY).
|
||||
|
||||
When a packaged routine uses a determined database object, it's registered on Firebird system
|
||||
tables that the package body depends on that object. If you want to, for example, drop that
|
||||
object, you first need to remove who depends on it. As who depends on it is a package body,
|
||||
you can just drop it even if some other database object depends on this package. When the body
|
||||
is dropped, the header remains, allowing you to create its body again after change it based on
|
||||
the object removal.
|
||||
|
||||
- Facilitate permission management.
|
||||
|
||||
It's generally a good practice to create routines with a privileged database user and grant
|
||||
usage to them for users or roles. As Firebird runs the routines with the caller privileges,
|
||||
it's also necessary to grant resources usage to each routine, when these resources would not
|
||||
be directly accessible to the callers, and grant usage of each routine to users and/or roles.
|
||||
|
||||
Packaged routines do not have individual privileges. The privileges act on the package.
|
||||
Privileges granted to packages are valid for all (including private) package body routines,
|
||||
but are stored for the package header. Example usage:
|
||||
GRANT SELECT ON TABLE secret TO PACKAGE pk_secret;
|
||||
GRANT EXECUTE ON PACKAGE pk_secret TO ROLE role_secret;
|
||||
|
||||
- Introduce private scope to routines making them available only for internal usage in the
|
||||
defining package.
|
||||
|
||||
All programming languages have the notion of routine scope. But without some form of grouping,
|
||||
this is not possible. Firebird packages also works as Delphi units in this regard. If a
|
||||
routine is not declared on the package header (interface) and is implemented in the body
|
||||
(implementation), it becomes a private routine. A private routine can only be called from
|
||||
inside its package.
|
||||
|
||||
Syntax rules:
|
||||
- A package body should implement all routines declared in the header and in the body start,
|
||||
with the same signature.
|
||||
- Default value for procedure parameters could not be redefined (be informed in <package_item>
|
||||
and <package_body_item>). That means, they can be in <package_body_item> only for private
|
||||
procedures not declared.
|
||||
|
||||
Notes:
|
||||
- DROP PACKAGE drops the package body before drop its header.
|
||||
- UDFs (DECLARE EXTERNAL FUNCTION) are currently not supported inside packages.
|
||||
|
||||
Examples:
|
||||
- To come.
|
||||
|
22
extern/btyacc/output.c
vendored
22
extern/btyacc/output.c
vendored
@ -809,9 +809,17 @@ void output_defines()
|
||||
register char *s;
|
||||
FILE *dc_file;
|
||||
|
||||
/* ASF: changed to separate (_yacc_defines_keywords and _yacc_defines_yystype instead of
|
||||
_yacc_defines_h_) keyword definitions of YYSTYPE because keywords may conflict with other
|
||||
things */
|
||||
|
||||
if(dflag) {
|
||||
/***
|
||||
fprintf(defines_file, "#ifndef _yacc_defines_h_\n");
|
||||
fprintf(defines_file, "#define _yacc_defines_h_\n\n");
|
||||
***/
|
||||
fprintf(defines_file, "#ifndef _yacc_defines_keywords\n");
|
||||
fprintf(defines_file, "#define _yacc_defines_keywords\n\n");
|
||||
}
|
||||
|
||||
/* VM: Print to either code file or defines file but not to both */
|
||||
@ -847,20 +855,32 @@ void output_defines()
|
||||
++outline;
|
||||
fprintf(dc_file, "#define YYERRCODE %d\n", symbol_value[1]);
|
||||
|
||||
if(dflag) {
|
||||
fprintf(defines_file, "\n#endif /* _yacc_defines_keywords */\n\n");
|
||||
}
|
||||
|
||||
if (dflag && unionized)
|
||||
{
|
||||
fprintf(defines_file, "#ifndef _yacc_defines_yystype\n");
|
||||
fprintf(defines_file, "#define _yacc_defines_yystype\n");
|
||||
|
||||
fclose(union_file);
|
||||
union_file = fopen(union_file_name, "r");
|
||||
if (union_file == NULL) open_error(union_file_name);
|
||||
while ((c = getc(union_file)) != EOF) {
|
||||
putc(c, defines_file);
|
||||
}
|
||||
fprintf(defines_file, "extern YYSTYPE yylval;\n");
|
||||
/* ASF: we define it on the Parser class
|
||||
fprintf(defines_file, "extern YYSTYPE yylval;\n"); */
|
||||
|
||||
fprintf(defines_file, "\n#endif /* _yacc_defines_yystype */\n\n");
|
||||
}
|
||||
|
||||
/***
|
||||
if(dflag) {
|
||||
fprintf(defines_file, "\n#endif\n");
|
||||
}
|
||||
***/
|
||||
}
|
||||
|
||||
|
||||
|
@ -1386,6 +1386,10 @@ C --
|
||||
PARAMETER (GDS__eds_expl_tran_ctrl = 335544986)
|
||||
INTEGER*4 GDS__no_trusted_spb
|
||||
PARAMETER (GDS__no_trusted_spb = 335544987)
|
||||
INTEGER*4 GDS__package_name
|
||||
PARAMETER (GDS__package_name = 335544988)
|
||||
INTEGER*4 GDS__cannot_make_not_null
|
||||
PARAMETER (GDS__cannot_make_not_null = 335544989)
|
||||
INTEGER*4 GDS__gfix_db_name
|
||||
PARAMETER (GDS__gfix_db_name = 335740929)
|
||||
INTEGER*4 GDS__gfix_invalid_sw
|
||||
@ -1500,8 +1504,36 @@ C --
|
||||
PARAMETER (GDS__dsql_incompatible_trigger_type = 336003102)
|
||||
INTEGER*4 GDS__dsql_db_trigger_type_cant_change
|
||||
PARAMETER (GDS__dsql_db_trigger_type_cant_change = 336003103)
|
||||
INTEGER*4 GDS__dyn_filter_not_found
|
||||
PARAMETER (GDS__dyn_filter_not_found = 336068645)
|
||||
INTEGER*4 GDS__dyn_func_not_found
|
||||
PARAMETER (GDS__dyn_func_not_found = 336068649)
|
||||
INTEGER*4 GDS__dyn_index_not_found
|
||||
PARAMETER (GDS__dyn_index_not_found = 336068656)
|
||||
INTEGER*4 GDS__dyn_view_not_found
|
||||
PARAMETER (GDS__dyn_view_not_found = 336068662)
|
||||
INTEGER*4 GDS__dyn_domain_not_found
|
||||
PARAMETER (GDS__dyn_domain_not_found = 336068697)
|
||||
INTEGER*4 GDS__dyn_cant_modify_auto_trig
|
||||
PARAMETER (GDS__dyn_cant_modify_auto_trig = 336068717)
|
||||
INTEGER*4 GDS__dyn_dup_table
|
||||
PARAMETER (GDS__dyn_dup_table = 336068740)
|
||||
INTEGER*4 GDS__dyn_proc_not_found
|
||||
PARAMETER (GDS__dyn_proc_not_found = 336068748)
|
||||
INTEGER*4 GDS__dyn_exception_not_found
|
||||
PARAMETER (GDS__dyn_exception_not_found = 336068752)
|
||||
INTEGER*4 GDS__dyn_proc_param_not_found
|
||||
PARAMETER (GDS__dyn_proc_param_not_found = 336068754)
|
||||
INTEGER*4 GDS__dyn_trig_not_found
|
||||
PARAMETER (GDS__dyn_trig_not_found = 336068755)
|
||||
INTEGER*4 GDS__dyn_charset_not_found
|
||||
PARAMETER (GDS__dyn_charset_not_found = 336068759)
|
||||
INTEGER*4 GDS__dyn_collation_not_found
|
||||
PARAMETER (GDS__dyn_collation_not_found = 336068760)
|
||||
INTEGER*4 GDS__dyn_role_not_found
|
||||
PARAMETER (GDS__dyn_role_not_found = 336068763)
|
||||
INTEGER*4 GDS__dyn_name_longer
|
||||
PARAMETER (GDS__dyn_name_longer = 336068767)
|
||||
INTEGER*4 GDS__dyn_column_does_not_exist
|
||||
PARAMETER (GDS__dyn_column_does_not_exist = 336068784)
|
||||
INTEGER*4 GDS__dyn_role_does_not_exist
|
||||
@ -1538,12 +1570,16 @@ C --
|
||||
PARAMETER (GDS__dyn_dtype_conv_invalid = 336068818)
|
||||
INTEGER*4 GDS__dyn_zero_len_id
|
||||
PARAMETER (GDS__dyn_zero_len_id = 336068820)
|
||||
INTEGER*4 GDS__dyn_gen_not_found
|
||||
PARAMETER (GDS__dyn_gen_not_found = 336068822)
|
||||
INTEGER*4 GDS__max_coll_per_charset
|
||||
PARAMETER (GDS__max_coll_per_charset = 336068829)
|
||||
INTEGER*4 GDS__invalid_coll_attr
|
||||
PARAMETER (GDS__invalid_coll_attr = 336068830)
|
||||
INTEGER*4 GDS__dyn_wrong_gtt_scope
|
||||
PARAMETER (GDS__dyn_wrong_gtt_scope = 336068840)
|
||||
INTEGER*4 GDS__dyn_table_not_found
|
||||
PARAMETER (GDS__dyn_table_not_found = 336068849)
|
||||
INTEGER*4 GDS__dyn_scale_too_big
|
||||
PARAMETER (GDS__dyn_scale_too_big = 336068852)
|
||||
INTEGER*4 GDS__dyn_precision_too_small
|
||||
|
@ -700,6 +700,8 @@ const
|
||||
gds_out_of_temp_space = 335544985;
|
||||
gds_eds_expl_tran_ctrl = 335544986;
|
||||
gds_no_trusted_spb = 335544987;
|
||||
gds_package_name = 335544988;
|
||||
gds_cannot_make_not_null = 335544989;
|
||||
gds_gfix_db_name = 335740929;
|
||||
gds_gfix_invalid_sw = 335740930;
|
||||
gds_gfix_incmp_sw = 335740932;
|
||||
@ -757,7 +759,21 @@ const
|
||||
gds_upd_ins_with_complex_view = 336003101;
|
||||
gds_dsql_incompatible_trigger_type = 336003102;
|
||||
gds_dsql_db_trigger_type_cant_change = 336003103;
|
||||
gds_dyn_filter_not_found = 336068645;
|
||||
gds_dyn_func_not_found = 336068649;
|
||||
gds_dyn_index_not_found = 336068656;
|
||||
gds_dyn_view_not_found = 336068662;
|
||||
gds_dyn_domain_not_found = 336068697;
|
||||
gds_dyn_cant_modify_auto_trig = 336068717;
|
||||
gds_dyn_dup_table = 336068740;
|
||||
gds_dyn_proc_not_found = 336068748;
|
||||
gds_dyn_exception_not_found = 336068752;
|
||||
gds_dyn_proc_param_not_found = 336068754;
|
||||
gds_dyn_trig_not_found = 336068755;
|
||||
gds_dyn_charset_not_found = 336068759;
|
||||
gds_dyn_collation_not_found = 336068760;
|
||||
gds_dyn_role_not_found = 336068763;
|
||||
gds_dyn_name_longer = 336068767;
|
||||
gds_dyn_column_does_not_exist = 336068784;
|
||||
gds_dyn_role_does_not_exist = 336068796;
|
||||
gds_dyn_no_grant_admin_opt = 336068797;
|
||||
@ -776,9 +792,11 @@ const
|
||||
gds_dyn_invalid_dtype_conversion = 336068817;
|
||||
gds_dyn_dtype_conv_invalid = 336068818;
|
||||
gds_dyn_zero_len_id = 336068820;
|
||||
gds_dyn_gen_not_found = 336068822;
|
||||
gds_max_coll_per_charset = 336068829;
|
||||
gds_invalid_coll_attr = 336068830;
|
||||
gds_dyn_wrong_gtt_scope = 336068840;
|
||||
gds_dyn_table_not_found = 336068849;
|
||||
gds_dyn_scale_too_big = 336068852;
|
||||
gds_dyn_precision_too_small = 336068853;
|
||||
gds_dyn_miss_priv_warning = 336068855;
|
||||
|
@ -132,13 +132,14 @@ void write_exceptions();
|
||||
void write_field_dimensions();
|
||||
void write_filters();
|
||||
void write_functions();
|
||||
void write_function_args(GDS_NAME);
|
||||
void write_function_args(const GDS_NAME, GDS_NAME);
|
||||
void write_generators();
|
||||
void write_sql_roles();
|
||||
void write_mapping();
|
||||
void write_global_fields();
|
||||
void write_packages();
|
||||
void write_procedures();
|
||||
void write_procedure_prms(GDS_NAME);
|
||||
void write_procedure_prms(const GDS_NAME, const GDS_NAME);
|
||||
void write_ref_constraints();
|
||||
void write_rel_constraints();
|
||||
void write_relations();
|
||||
@ -175,9 +176,20 @@ enum backup_capabilities
|
||||
// rdb$valid_blr in rdb$procedures
|
||||
// rdb$default_value, rdb$default_source, rdb$collation_id,
|
||||
// rdb$null_flag and rdb$parameter_mechanism in rdb$procedure_parameters
|
||||
BCK_ods11_2 = 65536 // rdb$field_name and rdb$relation_name in rdb$procedure_parameters
|
||||
BCK_ods11_2 = 65536,// rdb$field_name and rdb$relation_name in rdb$procedure_parameters
|
||||
// rdb$admin system role
|
||||
// rdb$message enlarged to 1023.
|
||||
BCK_ods12_0 =131072 // rdb$engine_name and rdb$entrypoint in rdb$triggers
|
||||
// rdb$package_name in rdb$dependencies
|
||||
// rdb$engine_name, rdb$package_name and rdb$private_flag
|
||||
// in rdb$functions
|
||||
// rdb$package_name in rdb$function_arguments
|
||||
// rdb$engine_name, rdb$entry_point, rdb$package_name
|
||||
// and rdb$private_flag in rdb$procedures
|
||||
// rdb$package_name in rdb$procedure_parameters
|
||||
// rdb$package_name in mon$call_stack
|
||||
// Table rdb$packages
|
||||
// Type of rdb$triggers.rdb$trigger_type changed from SMALLINT to BIGINT
|
||||
};
|
||||
// ASF: Engine that works with ODS11.1 supports access to non-existent system fields.
|
||||
// Reads returns NULL and writes do nothing.
|
||||
@ -232,6 +244,7 @@ const rfr_tab_t rfr_table[] =
|
||||
//{"RDB$PROCEDURE_PARAMETERS", "RDB$PARAMETER_MECHANISM", BCK_ods11_1},
|
||||
{"RDB$PROCEDURE_PARAMETERS", "RDB$FIELD_NAME", BCK_ods11_2},
|
||||
//{"RDB$PROCEDURE_PARAMETERS", "RDB$RELATION_NAME", BCK_ods11_2},
|
||||
{"RDB$PROCEDURES", "RDB$ENGINE_NAME", BCK_ods12_0},
|
||||
{0, 0, 0}
|
||||
};
|
||||
|
||||
@ -386,6 +399,13 @@ int BACKUP_backup(const TEXT* dbb_file, const TEXT* file_name)
|
||||
write_collations();
|
||||
}
|
||||
|
||||
if (tdgbl->BCK_capabilities & BCK_ods12_0)
|
||||
{
|
||||
// Write packages
|
||||
BURP_verbose(336); // msg 336 writing packages
|
||||
write_packages();
|
||||
}
|
||||
|
||||
if (tdgbl->BCK_capabilities & BCK_ffmptt)
|
||||
{
|
||||
// Write functions
|
||||
@ -3046,38 +3066,82 @@ void write_functions()
|
||||
*
|
||||
**************************************/
|
||||
GDS_NAME func;
|
||||
TEXT temp[GDS_NAME_LEN];
|
||||
TEXT temp[GDS_NAME_LEN * 2];
|
||||
isc_req_handle req_handle1 = 0;
|
||||
|
||||
BurpGlobals* tdgbl = BurpGlobals::getSpecific();
|
||||
|
||||
FOR (REQUEST_HANDLE req_handle1)
|
||||
X IN RDB$FUNCTIONS WITH X.RDB$SYSTEM_FLAG MISSING OR X.RDB$SYSTEM_FLAG NE 1
|
||||
put(tdgbl, rec_function);
|
||||
const SSHORT l = PUT_TEXT (att_function_name, X.RDB$FUNCTION_NAME);
|
||||
MISC_terminate (X.RDB$FUNCTION_NAME, temp, l, sizeof(temp));
|
||||
BURP_verbose (147, temp);
|
||||
// msg 147 writing function %.*s
|
||||
put_source_blob (att_function_description2, att_function_description, X.RDB$DESCRIPTION);
|
||||
PUT_TEXT (att_function_module_name, X.RDB$MODULE_NAME);
|
||||
PUT_TEXT (att_function_entrypoint, X.RDB$ENTRYPOINT);
|
||||
put_numeric (att_function_return_arg, X.RDB$RETURN_ARGUMENT);
|
||||
put_numeric (att_function_type, X.RDB$FUNCTION_TYPE);
|
||||
PUT_TEXT (att_function_query_name, X.RDB$QUERY_NAME);
|
||||
put(tdgbl, att_end);
|
||||
COPY (X.RDB$FUNCTION_NAME, func);
|
||||
write_function_args (func);
|
||||
put(tdgbl, rec_function_end);
|
||||
END_FOR;
|
||||
ON_ERROR
|
||||
general_on_error();
|
||||
END_ERROR;
|
||||
if (tdgbl->BCK_capabilities & BCK_ods12_0)
|
||||
{
|
||||
FOR (REQUEST_HANDLE req_handle1)
|
||||
X IN RDB$FUNCTIONS WITH X.RDB$SYSTEM_FLAG MISSING OR X.RDB$SYSTEM_FLAG NE 1
|
||||
put(tdgbl, rec_function);
|
||||
|
||||
SSHORT prefixLen = 0;
|
||||
|
||||
if (!X.RDB$PACKAGE_NAME.NULL)
|
||||
{
|
||||
prefixLen = PUT_TEXT(att_function_package_name, X.RDB$PACKAGE_NAME);
|
||||
MISC_terminate(X.RDB$PACKAGE_NAME, temp, prefixLen, sizeof(temp));
|
||||
temp[prefixLen++] = '.';
|
||||
}
|
||||
|
||||
const SSHORT l = PUT_TEXT (att_function_name, X.RDB$FUNCTION_NAME);
|
||||
MISC_terminate (X.RDB$FUNCTION_NAME, temp + prefixLen, l, sizeof(temp) - prefixLen);
|
||||
BURP_verbose (147, temp);
|
||||
// msg 147 writing function %.*s
|
||||
put_source_blob (att_function_description2, att_function_description, X.RDB$DESCRIPTION);
|
||||
PUT_TEXT (att_function_module_name, X.RDB$MODULE_NAME);
|
||||
PUT_TEXT (att_function_entrypoint, X.RDB$ENTRYPOINT);
|
||||
put_numeric (att_function_return_arg, X.RDB$RETURN_ARGUMENT);
|
||||
put_numeric (att_function_type, X.RDB$FUNCTION_TYPE);
|
||||
PUT_TEXT (att_function_query_name, X.RDB$QUERY_NAME);
|
||||
|
||||
if (!X.RDB$ENGINE_NAME.NULL)
|
||||
PUT_TEXT(att_function_engine_name, X.RDB$ENGINE_NAME);
|
||||
|
||||
if (!X.RDB$PRIVATE_FLAG.NULL)
|
||||
put_numeric(att_function_private_flag, X.RDB$PRIVATE_FLAG);
|
||||
|
||||
put(tdgbl, att_end);
|
||||
COPY (X.RDB$FUNCTION_NAME, func);
|
||||
write_function_args ((X.RDB$PACKAGE_NAME.NULL ? "" : X.RDB$PACKAGE_NAME), func);
|
||||
put(tdgbl, rec_function_end);
|
||||
END_FOR;
|
||||
ON_ERROR
|
||||
general_on_error();
|
||||
END_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
FOR (REQUEST_HANDLE req_handle1)
|
||||
X IN RDB$FUNCTIONS WITH X.RDB$SYSTEM_FLAG MISSING OR X.RDB$SYSTEM_FLAG NE 1
|
||||
put(tdgbl, rec_function);
|
||||
const SSHORT l = PUT_TEXT (att_function_name, X.RDB$FUNCTION_NAME);
|
||||
MISC_terminate (X.RDB$FUNCTION_NAME, temp, l, sizeof(temp));
|
||||
BURP_verbose (147, temp);
|
||||
// msg 147 writing function %.*s
|
||||
put_source_blob (att_function_description2, att_function_description, X.RDB$DESCRIPTION);
|
||||
PUT_TEXT (att_function_module_name, X.RDB$MODULE_NAME);
|
||||
PUT_TEXT (att_function_entrypoint, X.RDB$ENTRYPOINT);
|
||||
put_numeric (att_function_return_arg, X.RDB$RETURN_ARGUMENT);
|
||||
put_numeric (att_function_type, X.RDB$FUNCTION_TYPE);
|
||||
PUT_TEXT (att_function_query_name, X.RDB$QUERY_NAME);
|
||||
put(tdgbl, att_end);
|
||||
COPY (X.RDB$FUNCTION_NAME, func);
|
||||
write_function_args ("", func);
|
||||
put(tdgbl, rec_function_end);
|
||||
END_FOR;
|
||||
ON_ERROR
|
||||
general_on_error();
|
||||
END_ERROR;
|
||||
}
|
||||
|
||||
MISC_release_request_silent(req_handle1);
|
||||
}
|
||||
|
||||
|
||||
void write_function_args( GDS_NAME funcptr)
|
||||
void write_function_args(const GDS_NAME package, GDS_NAME funcptr)
|
||||
{
|
||||
/**************************************
|
||||
*
|
||||
@ -3089,7 +3153,7 @@ void write_function_args( GDS_NAME funcptr)
|
||||
* write all arguments for a function.
|
||||
*
|
||||
**************************************/
|
||||
TEXT temp[GDS_NAME_LEN];
|
||||
TEXT temp[GDS_NAME_LEN * 2];
|
||||
|
||||
BurpGlobals* tdgbl = BurpGlobals::getSpecific();
|
||||
|
||||
@ -3099,7 +3163,48 @@ void write_function_args( GDS_NAME funcptr)
|
||||
// requests--this requires more code but it is well worth it
|
||||
// for the performance benefits, especially remotely--deej
|
||||
|
||||
if (tdgbl->BCK_capabilities & BCK_ods10)
|
||||
if (tdgbl->BCK_capabilities & BCK_ods12_0)
|
||||
{
|
||||
FOR (REQUEST_HANDLE tdgbl->handles_write_function_args_req_handle1)
|
||||
X IN RDB$FUNCTION_ARGUMENTS
|
||||
WITH X.RDB$FUNCTION_NAME EQ funcptr AND
|
||||
X.RDB$PACKAGE_NAME EQUIV NULLIF(package, '')
|
||||
|
||||
put(tdgbl, rec_function_arg);
|
||||
|
||||
SSHORT prefixLen = 0;
|
||||
|
||||
if (!X.RDB$PACKAGE_NAME.NULL)
|
||||
{
|
||||
prefixLen = PUT_TEXT(att_functionarg_package_name, X.RDB$PACKAGE_NAME);
|
||||
MISC_terminate(X.RDB$PACKAGE_NAME, temp, prefixLen, sizeof(temp));
|
||||
temp[prefixLen++] = '.';
|
||||
}
|
||||
|
||||
const SSHORT l = PUT_TEXT (att_functionarg_name, X.RDB$FUNCTION_NAME);
|
||||
MISC_terminate (X.RDB$FUNCTION_NAME, temp + prefixLen, l, sizeof(temp) - prefixLen);
|
||||
BURP_verbose (141, temp);
|
||||
// msg 141 writing argument for function %s
|
||||
|
||||
put_numeric (att_functionarg_position, X.RDB$ARGUMENT_POSITION);
|
||||
put_numeric (att_functionarg_mechanism, X.RDB$MECHANISM);
|
||||
put_numeric (att_functionarg_field_type, X.RDB$FIELD_TYPE);
|
||||
put_numeric (att_functionarg_field_scale, X.RDB$FIELD_SCALE);
|
||||
put_numeric (att_functionarg_field_length, X.RDB$FIELD_LENGTH);
|
||||
put_numeric (att_functionarg_field_sub_type, X.RDB$FIELD_SUB_TYPE);
|
||||
if (!X.RDB$CHARACTER_SET_ID.NULL)
|
||||
put_numeric (att_functionarg_character_set, X.RDB$CHARACTER_SET_ID);
|
||||
|
||||
if (!X.RDB$FIELD_PRECISION.NULL)
|
||||
put_numeric (att_functionarg_field_precision, X.RDB$FIELD_PRECISION);
|
||||
|
||||
put(tdgbl, att_end);
|
||||
END_FOR;
|
||||
ON_ERROR
|
||||
general_on_error();
|
||||
END_ERROR;
|
||||
}
|
||||
else if (tdgbl->BCK_capabilities & BCK_ods10)
|
||||
{
|
||||
FOR (REQUEST_HANDLE tdgbl->handles_write_function_args_req_handle1)
|
||||
X IN RDB$FUNCTION_ARGUMENTS WITH
|
||||
@ -3436,6 +3541,65 @@ void write_global_fields()
|
||||
}
|
||||
|
||||
|
||||
void write_packages()
|
||||
{
|
||||
/**************************************
|
||||
*
|
||||
* w r i t e _ p a c k a g e s
|
||||
*
|
||||
**************************************
|
||||
*
|
||||
* Functional description
|
||||
* write a record in the burp file for
|
||||
* each package.
|
||||
*
|
||||
**************************************/
|
||||
TEXT temp[GDS_NAME_LEN];
|
||||
isc_req_handle req_handle1 = 0;
|
||||
|
||||
BurpGlobals* tdgbl = BurpGlobals::getSpecific();
|
||||
|
||||
FOR (REQUEST_HANDLE req_handle1)
|
||||
X IN RDB$PACKAGES
|
||||
WITH X.RDB$SYSTEM_FLAG MISSING OR X.RDB$SYSTEM_FLAG NE 1
|
||||
{
|
||||
put(tdgbl, rec_package);
|
||||
const SSHORT l = PUT_TEXT(att_package_name, X.RDB$PACKAGE_NAME);
|
||||
MISC_terminate(X.RDB$PACKAGE_NAME, temp, l, sizeof(temp));
|
||||
|
||||
BURP_verbose(335, temp); // msg 335 writing package @1
|
||||
|
||||
if (!X.RDB$PACKAGE_HEADER_SOURCE.NULL)
|
||||
{
|
||||
put_source_blob(att_package_header_source, att_package_header_source,
|
||||
X.RDB$PACKAGE_HEADER_SOURCE);
|
||||
}
|
||||
|
||||
if (!X.RDB$PACKAGE_BODY_SOURCE.NULL)
|
||||
{
|
||||
put_source_blob(att_package_body_source, att_package_body_source,
|
||||
X.RDB$PACKAGE_BODY_SOURCE);
|
||||
}
|
||||
|
||||
if (!X.RDB$SECURITY_CLASS.NULL)
|
||||
PUT_TEXT(att_package_security_class, X.RDB$SECURITY_CLASS);
|
||||
if (!X.RDB$OWNER_NAME.NULL)
|
||||
PUT_TEXT(att_package_owner_name, X.RDB$OWNER_NAME);
|
||||
|
||||
if (!X.RDB$DESCRIPTION.NULL)
|
||||
put_source_blob(att_package_description, att_package_description, X.RDB$DESCRIPTION);
|
||||
|
||||
put(tdgbl, att_end);
|
||||
}
|
||||
END_FOR
|
||||
ON_ERROR
|
||||
general_on_error();
|
||||
END_ERROR
|
||||
|
||||
MISC_release_request_silent(req_handle1);
|
||||
}
|
||||
|
||||
|
||||
void write_procedures()
|
||||
{
|
||||
/**************************************
|
||||
@ -3461,18 +3625,32 @@ void write_procedures()
|
||||
X IN RDB$PROCEDURES
|
||||
WITH X.RDB$SYSTEM_FLAG MISSING OR X.RDB$SYSTEM_FLAG NE 1
|
||||
put(tdgbl, rec_procedure);
|
||||
const SSHORT l = PUT_TEXT (att_procedure_name, X.RDB$PROCEDURE_NAME);
|
||||
MISC_terminate (X.RDB$PROCEDURE_NAME, temp, l, sizeof(temp));
|
||||
|
||||
SSHORT prefixLen = 0;
|
||||
|
||||
if (!X.RDB$PACKAGE_NAME.NULL)
|
||||
{
|
||||
prefixLen = PUT_TEXT(att_procedure_package_name, X.RDB$PACKAGE_NAME);
|
||||
MISC_terminate (X.RDB$PACKAGE_NAME, temp, prefixLen, sizeof(temp));
|
||||
temp[prefixLen++] = '.';
|
||||
}
|
||||
|
||||
const SSHORT len = PUT_TEXT (att_procedure_name, X.RDB$PROCEDURE_NAME);
|
||||
MISC_terminate (X.RDB$PROCEDURE_NAME, temp + prefixLen, len, sizeof(temp) - prefixLen);
|
||||
|
||||
BURP_verbose (193, temp);
|
||||
// msg 193 writing stored procedure %.*s
|
||||
put_numeric (att_procedure_inputs, X.RDB$PROCEDURE_INPUTS);
|
||||
put_numeric (att_procedure_outputs, X.RDB$PROCEDURE_OUTPUTS);
|
||||
put_source_blob(att_procedure_description2, att_procedure_description, X.RDB$DESCRIPTION);
|
||||
put_source_blob (att_procedure_source2, att_procedure_source, X.RDB$PROCEDURE_SOURCE);
|
||||
put_blr_blob (att_procedure_blr, X.RDB$PROCEDURE_BLR);
|
||||
|
||||
if (!X.RDB$PROCEDURE_BLR.NULL)
|
||||
put_blr_blob (att_procedure_blr, X.RDB$PROCEDURE_BLR);
|
||||
|
||||
if (!X.RDB$SECURITY_CLASS.NULL)
|
||||
PUT_TEXT (att_procedure_security_class, X.RDB$SECURITY_CLASS);
|
||||
if (!X.RDB$SECURITY_CLASS.NULL)
|
||||
if (!X.RDB$OWNER_NAME.NULL)
|
||||
PUT_TEXT (att_procedure_owner_name, X.RDB$OWNER_NAME);
|
||||
if (!X.RDB$PROCEDURE_TYPE.NULL)
|
||||
put_numeric (att_procedure_type, X.RDB$PROCEDURE_TYPE);
|
||||
@ -3480,9 +3658,19 @@ void write_procedures()
|
||||
put_numeric (att_procedure_valid_blr, X.RDB$VALID_BLR);
|
||||
if (!X.RDB$DEBUG_INFO.NULL)
|
||||
put_blr_blob (att_procedure_debug_info, X.RDB$DEBUG_INFO);
|
||||
|
||||
if (!X.RDB$ENGINE_NAME.NULL)
|
||||
PUT_TEXT(att_procedure_engine_name, X.RDB$ENGINE_NAME);
|
||||
|
||||
if (!X.RDB$ENTRYPOINT.NULL)
|
||||
PUT_TEXT(att_procedure_entrypoint, X.RDB$ENTRYPOINT);
|
||||
|
||||
if (!X.RDB$PRIVATE_FLAG.NULL)
|
||||
put_numeric(att_procedure_private_flag, X.RDB$PRIVATE_FLAG);
|
||||
|
||||
put(tdgbl, att_end);
|
||||
COPY(X.RDB$PROCEDURE_NAME, proc);
|
||||
write_procedure_prms (proc);
|
||||
write_procedure_prms ((X.RDB$PACKAGE_NAME.NULL ? "" : X.RDB$PACKAGE_NAME), proc);
|
||||
put(tdgbl, rec_procedure_end);
|
||||
END_FOR;
|
||||
ON_ERROR
|
||||
@ -3509,7 +3697,7 @@ void write_procedures()
|
||||
PUT_TEXT (att_procedure_owner_name, X.RDB$OWNER_NAME);
|
||||
put(tdgbl, att_end);
|
||||
COPY(X.RDB$PROCEDURE_NAME, proc);
|
||||
write_procedure_prms (proc);
|
||||
write_procedure_prms ("", proc);
|
||||
put(tdgbl, rec_procedure_end);
|
||||
END_FOR;
|
||||
ON_ERROR
|
||||
@ -3521,7 +3709,7 @@ void write_procedures()
|
||||
}
|
||||
|
||||
|
||||
void write_procedure_prms( GDS_NAME procptr)
|
||||
void write_procedure_prms(const GDS_NAME package, const GDS_NAME procptr)
|
||||
{
|
||||
/**************************************
|
||||
*
|
||||
@ -3540,7 +3728,10 @@ void write_procedure_prms( GDS_NAME procptr)
|
||||
if (tdgbl->BCK_capabilities & BCK_ods11_1)
|
||||
{
|
||||
FOR (REQUEST_HANDLE tdgbl->handles_write_procedure_prms_req_handle1)
|
||||
X IN RDB$PROCEDURE_PARAMETERS WITH X.RDB$PROCEDURE_NAME EQ procptr
|
||||
X IN RDB$PROCEDURE_PARAMETERS
|
||||
WITH X.RDB$PROCEDURE_NAME EQ procptr AND
|
||||
X.RDB$PACKAGE_NAME EQUIV NULLIF(package, '')
|
||||
{
|
||||
put(tdgbl, rec_procedure_prm);
|
||||
const SSHORT l = PUT_TEXT (att_procedureprm_name, X.RDB$PARAMETER_NAME);
|
||||
MISC_terminate (X.RDB$PARAMETER_NAME, temp, l, sizeof(temp));
|
||||
@ -3568,6 +3759,7 @@ void write_procedure_prms( GDS_NAME procptr)
|
||||
PUT_TEXT(att_procedureprm_relation_name, X.RDB$RELATION_NAME);
|
||||
|
||||
put(tdgbl, att_end);
|
||||
}
|
||||
END_FOR;
|
||||
ON_ERROR
|
||||
general_on_error();
|
||||
@ -4037,7 +4229,12 @@ void write_triggers()
|
||||
PUT_TEXT (att_trig_relation_name, X.RDB$RELATION_NAME);
|
||||
|
||||
put_numeric (att_trig_sequence, X.RDB$TRIGGER_SEQUENCE);
|
||||
put_numeric (att_trig_type, X.RDB$TRIGGER_TYPE);
|
||||
|
||||
if (X.RDB$TRIGGER_TYPE >= SLONG_MIN && X.RDB$TRIGGER_TYPE <= SLONG_MAX)
|
||||
put_numeric (att_trig_type, (SLONG) X.RDB$TRIGGER_TYPE);
|
||||
else
|
||||
put_int64 (att_trig_type2, X.RDB$TRIGGER_TYPE);
|
||||
|
||||
put_blr_blob (att_trig_blr, X.RDB$TRIGGER_BLR);
|
||||
put_source_blob (att_trig_source2, att_trig_source, X.RDB$TRIGGER_SOURCE);
|
||||
put_source_blob (att_trig_description2, att_trig_description, X.RDB$DESCRIPTION);
|
||||
@ -4053,6 +4250,12 @@ void write_triggers()
|
||||
if (!X.RDB$DEBUG_INFO.NULL)
|
||||
put_blr_blob (att_trig_debug_info, X.RDB$DEBUG_INFO);
|
||||
|
||||
if (!X.RDB$ENGINE_NAME.NULL)
|
||||
PUT_TEXT(att_trig_engine_name, X.RDB$ENGINE_NAME);
|
||||
|
||||
if (!X.RDB$ENTRYPOINT.NULL)
|
||||
PUT_TEXT(att_trig_entrypoint, X.RDB$ENTRYPOINT);
|
||||
|
||||
put(tdgbl, att_end);
|
||||
|
||||
END_FOR;
|
||||
|
@ -114,7 +114,8 @@ enum rec_type {
|
||||
rec_charset, // Character sets
|
||||
rec_collation, // Collations
|
||||
rec_sql_roles, // SQL roles
|
||||
rec_mapping // Mapping of security names
|
||||
rec_mapping, // Mapping of security names
|
||||
rec_package // Package
|
||||
};
|
||||
|
||||
|
||||
@ -387,6 +388,9 @@ enum att_type {
|
||||
att_trig_flags,
|
||||
att_trig_valid_blr,
|
||||
att_trig_debug_info,
|
||||
att_trig_engine_name,
|
||||
att_trig_entrypoint,
|
||||
att_trig_type2,
|
||||
|
||||
// Function attributes
|
||||
|
||||
@ -399,6 +403,9 @@ enum att_type {
|
||||
att_function_query_name,
|
||||
att_function_type,
|
||||
att_function_description2,
|
||||
att_function_engine_name,
|
||||
att_function_package_name,
|
||||
att_function_private_flag,
|
||||
|
||||
// Function argument attributes
|
||||
|
||||
@ -411,6 +418,7 @@ enum att_type {
|
||||
att_functionarg_field_sub_type,
|
||||
att_functionarg_character_set,
|
||||
att_functionarg_field_precision,
|
||||
att_functionarg_package_name,
|
||||
|
||||
// TYPE relation attributes
|
||||
att_type_name = SERIES,
|
||||
@ -474,6 +482,10 @@ enum att_type {
|
||||
att_procedure_type,
|
||||
att_procedure_valid_blr,
|
||||
att_procedure_debug_info,
|
||||
att_procedure_engine_name,
|
||||
att_procedure_entrypoint,
|
||||
att_procedure_package_name,
|
||||
att_procedure_private_flag,
|
||||
|
||||
// Stored procedure parameter attributes
|
||||
|
||||
@ -551,7 +563,15 @@ enum att_type {
|
||||
att_map_os = SERIES,
|
||||
att_map_user,
|
||||
att_map_role,
|
||||
att_auto_map_role
|
||||
att_auto_map_role,
|
||||
|
||||
// Package attributes
|
||||
att_package_name = SERIES,
|
||||
att_package_header_source,
|
||||
att_package_body_source,
|
||||
att_package_security_class,
|
||||
att_package_owner_name,
|
||||
att_package_description
|
||||
};
|
||||
|
||||
|
||||
@ -655,12 +675,21 @@ enum burp_rel_flags_vals {
|
||||
REL_external = 2
|
||||
};
|
||||
|
||||
// package definition
|
||||
struct burp_pkg
|
||||
{
|
||||
burp_pkg* pkg_next;
|
||||
GDS_NAME pkg_name;
|
||||
GDS_NAME pkg_owner;
|
||||
};
|
||||
|
||||
// procedure definition - holds useful procedure type stuff
|
||||
|
||||
struct burp_prc
|
||||
{
|
||||
burp_prc* prc_next;
|
||||
//SSHORT prc_name_length; // Currently useless, but didn't want to delete it.
|
||||
GDS_NAME prc_package;
|
||||
GDS_NAME prc_name;
|
||||
GDS_NAME prc_owner; // relation owner, if not us
|
||||
};
|
||||
@ -866,6 +895,7 @@ public:
|
||||
UCHAR* io_ptr;
|
||||
int io_cnt;
|
||||
burp_rel* relations;
|
||||
burp_pkg* packages;
|
||||
burp_prc* procedures;
|
||||
SLONG BCK_capabilities;
|
||||
// Format of the backup being read on restore; gbak always creates it using the latest version
|
||||
@ -922,6 +952,7 @@ public:
|
||||
isc_req_handle handles_get_index_req_handle2;
|
||||
isc_req_handle handles_get_index_req_handle3;
|
||||
isc_req_handle handles_get_index_req_handle4;
|
||||
isc_req_handle handles_get_package_req_handle1;
|
||||
isc_req_handle handles_get_procedure_prm_req_handle1;
|
||||
isc_req_handle handles_get_procedure_req_handle1;
|
||||
isc_req_handle handles_get_ranges_req_handle1;
|
||||
|
@ -52,6 +52,7 @@
|
||||
#include "../common/classes/ClumpletWriter.h"
|
||||
#include "../common/classes/UserBlob.h"
|
||||
#include "../common/classes/SafeArg.h"
|
||||
#include "../common/utils_proto.h"
|
||||
#include "memory_routines.h"
|
||||
|
||||
using MsgFormat::SafeArg;
|
||||
@ -81,6 +82,7 @@ const int DB_VERSION_DDL10 = 100; // ods10 db, IB6, FB1, FB1.5
|
||||
const int DB_VERSION_DDL11 = 110; // ods11 db, FB2
|
||||
const int DB_VERSION_DDL11_1 = 111; // ods11.1 db, FB2.1
|
||||
const int DB_VERSION_DDL11_2 = 112; // ods11.2 db, FB2.5
|
||||
const int DB_VERSION_DDL12_0 = 120; // ods12.0 db, FB3.0
|
||||
|
||||
const int DB_VERSION_OLDEST_SUPPORTED = DB_VERSION_DDL8; // IB4.0 is ods8
|
||||
|
||||
@ -137,8 +139,9 @@ bool get_index(BurpGlobals* tdgbl, const burp_rel*);
|
||||
void get_misc_blob(BurpGlobals* tdgbl, ISC_QUAD&, bool);
|
||||
SLONG get_numeric(BurpGlobals* tdgbl);
|
||||
SINT64 get_int64(BurpGlobals* tdgbl);
|
||||
bool get_package(BurpGlobals* tdgbl);
|
||||
bool get_procedure(BurpGlobals* tdgbl);
|
||||
bool get_procedure_prm (BurpGlobals* tdgbl, GDS_NAME );
|
||||
bool get_procedure_prm (BurpGlobals* tdgbl, GDS_NAME, GDS_NAME);
|
||||
bool get_ref_constraint(BurpGlobals* tdgbl);
|
||||
bool get_rel_constraint(BurpGlobals* tdgbl);
|
||||
bool get_relation(BurpGlobals* tdgbl);
|
||||
@ -258,7 +261,7 @@ int RESTORE_restore (const TEXT* file_name, const TEXT* database_name)
|
||||
*
|
||||
**************************************/
|
||||
isc_req_handle req_handle1 = 0, req_handle2 = 0, req_handle3 = 0;
|
||||
isc_req_handle req_handle4 = 0, req_handle5 = 0;
|
||||
isc_req_handle req_handle4 = 0, req_handle5 = 0, req_handle6 = 0;
|
||||
BASED_ON RDB$INDICES.RDB$INDEX_NAME index_name;
|
||||
|
||||
BurpGlobals* tdgbl = BurpGlobals::getSpecific();
|
||||
@ -267,6 +270,7 @@ int RESTORE_restore (const TEXT* file_name, const TEXT* database_name)
|
||||
tdgbl->io_cnt = 0;
|
||||
|
||||
tdgbl->relations = NULL;
|
||||
tdgbl->packages = NULL;
|
||||
tdgbl->procedures = NULL;
|
||||
tdgbl->RESTORE_format = 0;
|
||||
tdgbl->RESTORE_ods = 0;
|
||||
@ -482,30 +486,84 @@ int RESTORE_restore (const TEXT* file_name, const TEXT* database_name)
|
||||
//
|
||||
update_view_dbkey_lengths(tdgbl);
|
||||
|
||||
// Change ownership of any procedures necessary
|
||||
// Change ownership of any packages
|
||||
for (burp_pkg* package = tdgbl->packages; package; package = package->pkg_next)
|
||||
{
|
||||
if (package->pkg_owner[0])
|
||||
{
|
||||
FOR (REQUEST_HANDLE req_handle6)
|
||||
X IN RDB$PACKAGES
|
||||
WITH X.RDB$PACKAGE_NAME EQ package->pkg_name
|
||||
{
|
||||
MODIFY X
|
||||
strcpy(X.RDB$OWNER_NAME, package->pkg_owner);
|
||||
END_MODIFY;
|
||||
ON_ERROR
|
||||
MISC_release_request_silent(req_handle6);
|
||||
general_on_error();
|
||||
END_ERROR;
|
||||
|
||||
if (!X.RDB$SECURITY_CLASS.NULL)
|
||||
restore_security_class(tdgbl, package->pkg_owner, X.RDB$SECURITY_CLASS);
|
||||
}
|
||||
END_FOR
|
||||
ON_ERROR
|
||||
MISC_release_request_silent(req_handle6);
|
||||
general_on_error ();
|
||||
END_ERROR
|
||||
}
|
||||
}
|
||||
|
||||
// Change ownership of any procedures necessary
|
||||
for (burp_prc* procedure = tdgbl->procedures; procedure; procedure = procedure->prc_next)
|
||||
{
|
||||
if (procedure->prc_owner[0])
|
||||
{
|
||||
FOR (REQUEST_HANDLE req_handle4)
|
||||
X IN RDB$PROCEDURES WITH X.RDB$PROCEDURE_NAME EQ procedure->prc_name
|
||||
if (tdgbl->RESTORE_ods >= DB_VERSION_DDL12_0)
|
||||
{
|
||||
FOR (REQUEST_HANDLE req_handle4)
|
||||
X IN RDB$PROCEDURES
|
||||
WITH X.RDB$PROCEDURE_NAME EQ procedure->prc_name AND
|
||||
X.RDB$PACKAGE_NAME EQUIV NULLIF(procedure->prc_package, '')
|
||||
{
|
||||
MODIFY X
|
||||
strcpy (X.RDB$OWNER_NAME, procedure->prc_owner);
|
||||
END_MODIFY;
|
||||
ON_ERROR
|
||||
MISC_release_request_silent(req_handle4);
|
||||
general_on_error ();
|
||||
END_ERROR
|
||||
|
||||
MODIFY X
|
||||
strcpy (X.RDB$OWNER_NAME, procedure->prc_owner);
|
||||
END_MODIFY;
|
||||
if (!X.RDB$SECURITY_CLASS.NULL)
|
||||
restore_security_class(tdgbl, procedure->prc_owner, X.RDB$SECURITY_CLASS);
|
||||
}
|
||||
END_FOR;
|
||||
ON_ERROR
|
||||
MISC_release_request_silent(req_handle4);
|
||||
general_on_error ();
|
||||
END_ERROR;
|
||||
END_ERROR
|
||||
}
|
||||
else
|
||||
{
|
||||
FOR (REQUEST_HANDLE req_handle4)
|
||||
X IN RDB$PROCEDURES WITH X.RDB$PROCEDURE_NAME EQ procedure->prc_name
|
||||
{
|
||||
MODIFY X
|
||||
strcpy (X.RDB$OWNER_NAME, procedure->prc_owner);
|
||||
END_MODIFY;
|
||||
ON_ERROR
|
||||
MISC_release_request_silent(req_handle4);
|
||||
general_on_error ();
|
||||
END_ERROR;
|
||||
|
||||
restore_security_class(tdgbl, procedure->prc_owner, X.RDB$SECURITY_CLASS);
|
||||
|
||||
END_FOR;
|
||||
ON_ERROR
|
||||
MISC_release_request_silent(req_handle4);
|
||||
general_on_error ();
|
||||
END_ERROR;
|
||||
restore_security_class(tdgbl, procedure->prc_owner, X.RDB$SECURITY_CLASS);
|
||||
}
|
||||
END_FOR
|
||||
ON_ERROR
|
||||
MISC_release_request_silent(req_handle4);
|
||||
general_on_error ();
|
||||
END_ERROR
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -847,6 +905,7 @@ void check_db_version(BurpGlobals* tdgbl)
|
||||
{"RDB$ROLES", "RDB$DESCRIPTION", DB_VERSION_DDL11}, // FB2
|
||||
{"RDB$RELATIONS", "RDB$RELATION_TYPE", DB_VERSION_DDL11_1}, // FB2.1
|
||||
{"RDB$PROCEDURE_PARAMETERS", "RDB$FIELD_NAME", DB_VERSION_DDL11_2}, // FB2.5
|
||||
{"RDB$PROCEDURES", "RDB$ENGINE_NAME", DB_VERSION_DDL12_0}, // FB3.0
|
||||
{0, 0, 0}
|
||||
};
|
||||
|
||||
@ -3523,79 +3582,175 @@ bool get_function(BurpGlobals* tdgbl)
|
||||
*
|
||||
**************************************/
|
||||
att_type attribute;
|
||||
GDS_NAME function_name;
|
||||
TEXT temp[GDS_NAME_LEN];
|
||||
///GDS_NAME function_name;
|
||||
TEXT temp[GDS_NAME_LEN * 2];
|
||||
SSHORT l;
|
||||
scan_attr_t scan_next_attr;
|
||||
|
||||
bool existFlag = false;
|
||||
|
||||
STORE (REQUEST_HANDLE tdgbl->handles_get_function_req_handle1)
|
||||
X IN RDB$FUNCTIONS
|
||||
X.RDB$SYSTEM_FLAG = 0;
|
||||
X.RDB$SYSTEM_FLAG.NULL = FALSE;
|
||||
X.RDB$DESCRIPTION.NULL = TRUE;
|
||||
if (tdgbl->RESTORE_ods >= DB_VERSION_DDL12_0)
|
||||
{
|
||||
STORE (REQUEST_HANDLE tdgbl->handles_get_function_req_handle1)
|
||||
X IN RDB$FUNCTIONS
|
||||
X.RDB$SYSTEM_FLAG = 0;
|
||||
X.RDB$SYSTEM_FLAG.NULL = FALSE;
|
||||
X.RDB$DESCRIPTION.NULL = TRUE;
|
||||
X.RDB$ENGINE_NAME.NULL = TRUE;
|
||||
X.RDB$PACKAGE_NAME.NULL = TRUE;
|
||||
X.RDB$PRIVATE_FLAG.NULL = TRUE;
|
||||
|
||||
skip_init(&scan_next_attr);
|
||||
while (skip_scan(&scan_next_attr), get_attribute(&attribute, tdgbl) != att_end)
|
||||
{
|
||||
switch (attribute)
|
||||
skip_init(&scan_next_attr);
|
||||
while (skip_scan(&scan_next_attr), get_attribute(&attribute, tdgbl) != att_end)
|
||||
{
|
||||
case att_function_name:
|
||||
l = GET_TEXT(X.RDB$FUNCTION_NAME);
|
||||
MISC_terminate (X.RDB$FUNCTION_NAME, temp, l, sizeof(temp));
|
||||
BURP_verbose (118, temp);
|
||||
// msg 118 restoring function %s
|
||||
break;
|
||||
switch (attribute)
|
||||
{
|
||||
case att_function_name:
|
||||
{
|
||||
SSHORT prefixLen = 0;
|
||||
if (!X.RDB$PACKAGE_NAME.NULL)
|
||||
{
|
||||
prefixLen = strlen(X.RDB$PACKAGE_NAME);
|
||||
memcpy(temp, X.RDB$PACKAGE_NAME, prefixLen);
|
||||
temp[prefixLen++] = '.';
|
||||
}
|
||||
|
||||
case att_function_description:
|
||||
X.RDB$DESCRIPTION.NULL = FALSE;
|
||||
get_misc_blob (tdgbl, X.RDB$DESCRIPTION, false);
|
||||
break;
|
||||
l = GET_TEXT(X.RDB$FUNCTION_NAME);
|
||||
MISC_terminate (X.RDB$FUNCTION_NAME, temp + prefixLen, l,
|
||||
sizeof(temp) - prefixLen);
|
||||
BURP_verbose (118, temp);
|
||||
// msg 118 restoring function %s
|
||||
break;
|
||||
}
|
||||
|
||||
case att_function_description2:
|
||||
X.RDB$DESCRIPTION.NULL = FALSE;
|
||||
get_source_blob (tdgbl, X.RDB$DESCRIPTION, false);
|
||||
break;
|
||||
case att_function_description:
|
||||
X.RDB$DESCRIPTION.NULL = FALSE;
|
||||
get_misc_blob (tdgbl, X.RDB$DESCRIPTION, false);
|
||||
break;
|
||||
|
||||
case att_function_module_name:
|
||||
GET_TEXT(X.RDB$MODULE_NAME);
|
||||
break;
|
||||
case att_function_description2:
|
||||
X.RDB$DESCRIPTION.NULL = FALSE;
|
||||
get_source_blob (tdgbl, X.RDB$DESCRIPTION, false);
|
||||
break;
|
||||
|
||||
case att_function_entrypoint:
|
||||
GET_TEXT(X.RDB$ENTRYPOINT);
|
||||
break;
|
||||
case att_function_module_name:
|
||||
GET_TEXT(X.RDB$MODULE_NAME);
|
||||
break;
|
||||
|
||||
case att_function_return_arg:
|
||||
X.RDB$RETURN_ARGUMENT = (USHORT) get_numeric(tdgbl);
|
||||
break;
|
||||
case att_function_entrypoint:
|
||||
GET_TEXT(X.RDB$ENTRYPOINT);
|
||||
break;
|
||||
|
||||
case att_function_query_name:
|
||||
GET_TEXT(X.RDB$QUERY_NAME);
|
||||
break;
|
||||
case att_function_return_arg:
|
||||
X.RDB$RETURN_ARGUMENT = (USHORT) get_numeric(tdgbl);
|
||||
break;
|
||||
|
||||
case att_function_type:
|
||||
X.RDB$FUNCTION_TYPE = (USHORT) get_numeric(tdgbl);
|
||||
break;
|
||||
case att_function_query_name:
|
||||
GET_TEXT(X.RDB$QUERY_NAME);
|
||||
break;
|
||||
|
||||
default:
|
||||
bad_attribute (scan_next_attr, attribute, 89);
|
||||
// msg 89 function
|
||||
break;
|
||||
case att_function_type:
|
||||
X.RDB$FUNCTION_TYPE = (USHORT) get_numeric(tdgbl);
|
||||
break;
|
||||
|
||||
case att_function_engine_name:
|
||||
GET_TEXT(X.RDB$ENGINE_NAME);
|
||||
X.RDB$ENGINE_NAME.NULL = FALSE;
|
||||
break;
|
||||
|
||||
case att_function_package_name:
|
||||
GET_TEXT(X.RDB$PACKAGE_NAME);
|
||||
fb_utils::exact_name(X.RDB$PACKAGE_NAME);
|
||||
X.RDB$PACKAGE_NAME.NULL = FALSE;
|
||||
break;
|
||||
|
||||
case att_function_private_flag:
|
||||
X.RDB$PRIVATE_FLAG = (USHORT) get_numeric(tdgbl);
|
||||
X.RDB$PRIVATE_FLAG.NULL = FALSE;
|
||||
break;
|
||||
|
||||
default:
|
||||
bad_attribute (scan_next_attr, attribute, 89);
|
||||
// msg 89 function
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
strcpy (function_name, X.RDB$FUNCTION_NAME);
|
||||
END_STORE;
|
||||
ON_ERROR
|
||||
if (gds_status[1] != isc_no_dup)
|
||||
{
|
||||
general_on_error ();
|
||||
}
|
||||
else
|
||||
{
|
||||
existFlag = true;
|
||||
}
|
||||
END_ERROR;
|
||||
|
||||
///strcpy (function_name, X.RDB$FUNCTION_NAME);
|
||||
END_STORE;
|
||||
ON_ERROR
|
||||
if (gds_status[1] != isc_no_dup)
|
||||
general_on_error ();
|
||||
else
|
||||
existFlag = true;
|
||||
END_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
STORE (REQUEST_HANDLE tdgbl->handles_get_function_req_handle1)
|
||||
X IN RDB$FUNCTIONS
|
||||
X.RDB$SYSTEM_FLAG = 0;
|
||||
X.RDB$SYSTEM_FLAG.NULL = FALSE;
|
||||
X.RDB$DESCRIPTION.NULL = TRUE;
|
||||
|
||||
skip_init(&scan_next_attr);
|
||||
while (skip_scan(&scan_next_attr), get_attribute(&attribute, tdgbl) != att_end)
|
||||
{
|
||||
switch (attribute)
|
||||
{
|
||||
case att_function_name:
|
||||
l = GET_TEXT(X.RDB$FUNCTION_NAME);
|
||||
MISC_terminate (X.RDB$FUNCTION_NAME, temp, l, sizeof(temp));
|
||||
BURP_verbose (118, temp);
|
||||
// msg 118 restoring function %s
|
||||
break;
|
||||
|
||||
case att_function_description:
|
||||
X.RDB$DESCRIPTION.NULL = FALSE;
|
||||
get_misc_blob (tdgbl, X.RDB$DESCRIPTION, false);
|
||||
break;
|
||||
|
||||
case att_function_description2:
|
||||
X.RDB$DESCRIPTION.NULL = FALSE;
|
||||
get_source_blob (tdgbl, X.RDB$DESCRIPTION, false);
|
||||
break;
|
||||
|
||||
case att_function_module_name:
|
||||
GET_TEXT(X.RDB$MODULE_NAME);
|
||||
break;
|
||||
|
||||
case att_function_entrypoint:
|
||||
GET_TEXT(X.RDB$ENTRYPOINT);
|
||||
break;
|
||||
|
||||
case att_function_return_arg:
|
||||
X.RDB$RETURN_ARGUMENT = (USHORT) get_numeric(tdgbl);
|
||||
break;
|
||||
|
||||
case att_function_query_name:
|
||||
GET_TEXT(X.RDB$QUERY_NAME);
|
||||
break;
|
||||
|
||||
case att_function_type:
|
||||
X.RDB$FUNCTION_TYPE = (USHORT) get_numeric(tdgbl);
|
||||
break;
|
||||
|
||||
default:
|
||||
bad_attribute (scan_next_attr, attribute, 89);
|
||||
// msg 89 function
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
///strcpy (function_name, X.RDB$FUNCTION_NAME);
|
||||
END_STORE;
|
||||
ON_ERROR
|
||||
if (gds_status[1] != isc_no_dup)
|
||||
general_on_error ();
|
||||
else
|
||||
existFlag = true;
|
||||
END_ERROR;
|
||||
}
|
||||
|
||||
// at the end of args for a function is the rec_function_end marker
|
||||
while (get(tdgbl) == rec_function_arg)
|
||||
@ -3618,7 +3773,7 @@ void get_function_arg(BurpGlobals* tdgbl, bool skip_arguments)
|
||||
**************************************/
|
||||
att_type attribute;
|
||||
SSHORT l;
|
||||
TEXT temp[GDS_NAME_LEN];
|
||||
TEXT temp[GDS_NAME_LEN * 2];
|
||||
scan_attr_t scan_next_attr;
|
||||
|
||||
if (skip_arguments)
|
||||
@ -3665,6 +3820,10 @@ void get_function_arg(BurpGlobals* tdgbl, bool skip_arguments)
|
||||
get_numeric(tdgbl);
|
||||
break;
|
||||
|
||||
case att_functionarg_package_name:
|
||||
GET_TEXT(buf);
|
||||
break;
|
||||
|
||||
default:
|
||||
bad_attribute (scan_next_attr, attribute, 90);
|
||||
// msg 90 function argument
|
||||
@ -3674,7 +3833,97 @@ void get_function_arg(BurpGlobals* tdgbl, bool skip_arguments)
|
||||
return;
|
||||
}
|
||||
|
||||
if (tdgbl->RESTORE_ods >= DB_VERSION_DDL10)
|
||||
if (tdgbl->RESTORE_ods >= DB_VERSION_DDL12_0)
|
||||
{
|
||||
// with RDB$FIELD_PRECISION
|
||||
STORE (REQUEST_HANDLE tdgbl->handles_get_function_arg_req_handle1)
|
||||
X IN RDB$FUNCTION_ARGUMENTS
|
||||
X.RDB$FIELD_SUB_TYPE.NULL = TRUE;
|
||||
X.RDB$CHARACTER_SET_ID.NULL = TRUE;
|
||||
X.RDB$FIELD_PRECISION.NULL = TRUE;
|
||||
X.RDB$PACKAGE_NAME.NULL = TRUE;
|
||||
|
||||
skip_init(&scan_next_attr);
|
||||
while (skip_scan(&scan_next_attr), get_attribute(&attribute, tdgbl) != att_end)
|
||||
{
|
||||
switch (attribute)
|
||||
{
|
||||
case att_functionarg_name:
|
||||
{
|
||||
SSHORT prefixLen = 0;
|
||||
if (!X.RDB$PACKAGE_NAME.NULL)
|
||||
{
|
||||
prefixLen = strlen(X.RDB$PACKAGE_NAME);
|
||||
memcpy(temp, X.RDB$PACKAGE_NAME, prefixLen);
|
||||
temp[prefixLen++] = '.';
|
||||
}
|
||||
|
||||
l = GET_TEXT(X.RDB$FUNCTION_NAME);
|
||||
MISC_terminate(X.RDB$FUNCTION_NAME, temp + prefixLen, l,
|
||||
sizeof(temp) - prefixLen);
|
||||
BURP_verbose (119, temp);
|
||||
// msg 119 restoring argument for function %s
|
||||
break;
|
||||
}
|
||||
|
||||
case att_functionarg_position:
|
||||
X.RDB$ARGUMENT_POSITION = (USHORT) get_numeric(tdgbl);
|
||||
break;
|
||||
|
||||
case att_functionarg_mechanism:
|
||||
X.RDB$MECHANISM = (USHORT) get_numeric(tdgbl);
|
||||
break;
|
||||
|
||||
case att_functionarg_field_type:
|
||||
X.RDB$FIELD_TYPE = (USHORT) get_numeric(tdgbl);
|
||||
break;
|
||||
|
||||
case att_functionarg_field_scale:
|
||||
X.RDB$FIELD_SCALE = (USHORT) get_numeric(tdgbl);
|
||||
break;
|
||||
|
||||
case att_functionarg_field_length:
|
||||
X.RDB$FIELD_LENGTH = (USHORT) get_numeric(tdgbl);
|
||||
break;
|
||||
|
||||
case att_functionarg_field_sub_type:
|
||||
X.RDB$FIELD_SUB_TYPE.NULL = FALSE;
|
||||
X.RDB$FIELD_SUB_TYPE = (USHORT) get_numeric(tdgbl);
|
||||
break;
|
||||
|
||||
case att_functionarg_character_set:
|
||||
X.RDB$CHARACTER_SET_ID.NULL = FALSE;
|
||||
X.RDB$CHARACTER_SET_ID = (USHORT) get_numeric(tdgbl);
|
||||
break;
|
||||
|
||||
case att_functionarg_field_precision:
|
||||
if (tdgbl->RESTORE_format >= 6)
|
||||
{
|
||||
X.RDB$FIELD_PRECISION.NULL = FALSE;
|
||||
X.RDB$FIELD_PRECISION = (USHORT) get_numeric(tdgbl);
|
||||
}
|
||||
else
|
||||
bad_attribute (scan_next_attr, attribute, 90);
|
||||
break;
|
||||
|
||||
case att_functionarg_package_name:
|
||||
l = GET_TEXT(X.RDB$PACKAGE_NAME);
|
||||
X.RDB$PACKAGE_NAME.NULL = FALSE;
|
||||
fb_utils::exact_name(X.RDB$PACKAGE_NAME);
|
||||
break;
|
||||
|
||||
default:
|
||||
bad_attribute (scan_next_attr, attribute, 90);
|
||||
// msg 90 function argument
|
||||
break;
|
||||
}
|
||||
}
|
||||
END_STORE;
|
||||
ON_ERROR
|
||||
general_on_error ();
|
||||
END_ERROR;
|
||||
}
|
||||
else if (tdgbl->RESTORE_ods >= DB_VERSION_DDL10)
|
||||
{
|
||||
// with RDB$FIELD_PRECISION
|
||||
STORE (REQUEST_HANDLE tdgbl->handles_get_function_arg_req_handle1)
|
||||
@ -4859,6 +5108,91 @@ SINT64 get_int64(BurpGlobals* tdgbl)
|
||||
return isc_portable_integer ((UCHAR *) value, length);
|
||||
}
|
||||
|
||||
bool get_package(BurpGlobals* tdgbl)
|
||||
{
|
||||
/**************************************
|
||||
*
|
||||
* g e t _ p a c k a g e
|
||||
*
|
||||
**************************************
|
||||
*
|
||||
* Functional description
|
||||
* Reconstruct a package.
|
||||
*
|
||||
**************************************/
|
||||
att_type attribute;
|
||||
TEXT temp[GDS_NAME_LEN];
|
||||
SSHORT len;
|
||||
scan_attr_t scan_next_attr;
|
||||
|
||||
isc_tr_handle local_trans = tdgbl->global_trans ? tdgbl->global_trans : gds_trans;
|
||||
|
||||
burp_pkg* package = (burp_pkg*) BURP_alloc_zero(sizeof(burp_pkg));
|
||||
package->pkg_next = tdgbl->packages;
|
||||
tdgbl->packages = package;
|
||||
|
||||
STORE (TRANSACTION_HANDLE local_trans REQUEST_HANDLE tdgbl->handles_get_package_req_handle1)
|
||||
X IN RDB$PACKAGES
|
||||
{
|
||||
X.RDB$PACKAGE_HEADER_SOURCE.NULL = TRUE;
|
||||
X.RDB$PACKAGE_BODY_SOURCE.NULL = TRUE;
|
||||
X.RDB$SECURITY_CLASS.NULL = TRUE;
|
||||
X.RDB$OWNER_NAME.NULL = TRUE;
|
||||
X.RDB$SYSTEM_FLAG = 0;
|
||||
X.RDB$SYSTEM_FLAG.NULL = FALSE;
|
||||
X.RDB$DESCRIPTION.NULL = TRUE;
|
||||
|
||||
skip_init(&scan_next_attr);
|
||||
while (skip_scan(&scan_next_attr), get_attribute(&attribute, tdgbl) != att_end)
|
||||
{
|
||||
switch (attribute)
|
||||
{
|
||||
case att_package_name:
|
||||
len = GET_TEXT(X.RDB$PACKAGE_NAME);
|
||||
strcpy(package->pkg_name, X.RDB$PACKAGE_NAME);
|
||||
MISC_terminate(X.RDB$PACKAGE_NAME, temp, len, sizeof(temp));
|
||||
BURP_verbose(337, temp); // msg 337 restoring package %s
|
||||
break;
|
||||
|
||||
case att_package_header_source:
|
||||
get_source_blob(tdgbl, X.RDB$PACKAGE_HEADER_SOURCE, true);
|
||||
X.RDB$PACKAGE_HEADER_SOURCE.NULL = FALSE;
|
||||
break;
|
||||
|
||||
case att_package_body_source:
|
||||
get_source_blob(tdgbl, X.RDB$PACKAGE_BODY_SOURCE, true);
|
||||
X.RDB$PACKAGE_BODY_SOURCE.NULL = FALSE;
|
||||
break;
|
||||
|
||||
case att_package_security_class:
|
||||
GET_TEXT(X.RDB$SECURITY_CLASS);
|
||||
if (strncmp(X.RDB$SECURITY_CLASS, SQL_SECCLASS_PREFIX, SQL_SECCLASS_PREFIX_LEN) != 0)
|
||||
X.RDB$SECURITY_CLASS.NULL = FALSE;
|
||||
break;
|
||||
|
||||
case att_package_owner_name:
|
||||
GET_TEXT(package->pkg_owner);
|
||||
break;
|
||||
|
||||
case att_package_description:
|
||||
get_source_blob(tdgbl, X.RDB$DESCRIPTION, true);
|
||||
X.RDB$DESCRIPTION.NULL = FALSE;
|
||||
break;
|
||||
|
||||
default:
|
||||
bad_attribute (scan_next_attr, attribute, 338); // msg 338 package
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
END_STORE
|
||||
ON_ERROR
|
||||
general_on_error();
|
||||
END_ERROR
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool get_procedure(BurpGlobals* tdgbl)
|
||||
{
|
||||
/**************************************
|
||||
@ -4875,8 +5209,9 @@ bool get_procedure(BurpGlobals* tdgbl)
|
||||
*
|
||||
**************************************/
|
||||
att_type attribute;
|
||||
GDS_NAME package_name = "";
|
||||
GDS_NAME procedure_name = "";
|
||||
TEXT temp[GDS_NAME_LEN];
|
||||
TEXT temp[GDS_NAME_LEN * 2];
|
||||
SSHORT l;
|
||||
scan_attr_t scan_next_attr;
|
||||
|
||||
@ -4901,6 +5236,11 @@ bool get_procedure(BurpGlobals* tdgbl)
|
||||
X.RDB$SYSTEM_FLAG.NULL = FALSE;
|
||||
X.RDB$VALID_BLR.NULL = TRUE;
|
||||
X.RDB$DEBUG_INFO.NULL = TRUE;
|
||||
X.RDB$PROCEDURE_BLR.NULL = TRUE;
|
||||
X.RDB$ENGINE_NAME.NULL = TRUE;
|
||||
X.RDB$ENTRYPOINT.NULL = TRUE;
|
||||
X.RDB$PACKAGE_NAME.NULL = TRUE;
|
||||
X.RDB$PRIVATE_FLAG.NULL = TRUE;
|
||||
|
||||
skip_init(&scan_next_attr);
|
||||
while (skip_scan(&scan_next_attr), get_attribute(&attribute, tdgbl) != att_end)
|
||||
@ -4908,13 +5248,25 @@ bool get_procedure(BurpGlobals* tdgbl)
|
||||
switch (attribute)
|
||||
{
|
||||
case att_procedure_name:
|
||||
{
|
||||
SSHORT prefixLen = 0;
|
||||
if (package_name[0])
|
||||
{
|
||||
prefixLen = strlen(package_name);
|
||||
memcpy(temp, package_name, prefixLen);
|
||||
temp[prefixLen++] = '.';
|
||||
}
|
||||
|
||||
l = GET_TEXT(X.RDB$PROCEDURE_NAME);
|
||||
//procedure->prc_name_length = l;
|
||||
strcpy (procedure->prc_name, X.RDB$PROCEDURE_NAME);
|
||||
MISC_terminate (X.RDB$PROCEDURE_NAME, temp, l, sizeof(temp));
|
||||
|
||||
MISC_terminate (X.RDB$PROCEDURE_NAME, temp + prefixLen, l,
|
||||
sizeof(temp) - prefixLen);
|
||||
BURP_verbose (195, temp);
|
||||
// msg 195 restoring stored procedure %s
|
||||
break;
|
||||
}
|
||||
|
||||
case att_procedure_description:
|
||||
get_misc_blob (tdgbl, X.RDB$DESCRIPTION, true);
|
||||
@ -4938,6 +5290,7 @@ bool get_procedure(BurpGlobals* tdgbl)
|
||||
|
||||
case att_procedure_blr:
|
||||
get_blr_blob (tdgbl, X.RDB$PROCEDURE_BLR, true);
|
||||
X.RDB$PROCEDURE_BLR.NULL = FALSE;
|
||||
break;
|
||||
|
||||
case att_procedure_security_class:
|
||||
@ -4989,6 +5342,29 @@ bool get_procedure(BurpGlobals* tdgbl)
|
||||
bad_attribute (scan_next_attr, attribute, 290);
|
||||
break;
|
||||
|
||||
case att_procedure_engine_name:
|
||||
GET_TEXT(X.RDB$ENGINE_NAME);
|
||||
X.RDB$ENGINE_NAME.NULL = FALSE;
|
||||
break;
|
||||
|
||||
case att_procedure_entrypoint:
|
||||
GET_TEXT(X.RDB$ENTRYPOINT);
|
||||
X.RDB$ENTRYPOINT.NULL = FALSE;
|
||||
break;
|
||||
|
||||
case att_procedure_package_name:
|
||||
GET_TEXT(X.RDB$PACKAGE_NAME);
|
||||
X.RDB$PACKAGE_NAME.NULL = FALSE;
|
||||
strcpy(procedure->prc_package, X.RDB$PACKAGE_NAME);
|
||||
strcpy(package_name, X.RDB$PACKAGE_NAME);
|
||||
fb_utils::exact_name(package_name);
|
||||
break;
|
||||
|
||||
case att_procedure_private_flag:
|
||||
X.RDB$PRIVATE_FLAG = (USHORT) get_numeric(tdgbl);
|
||||
X.RDB$PRIVATE_FLAG.NULL = FALSE;
|
||||
break;
|
||||
|
||||
default:
|
||||
bad_attribute (scan_next_attr, attribute, 290);
|
||||
// msg 290 procedure
|
||||
@ -5096,12 +5472,12 @@ bool get_procedure(BurpGlobals* tdgbl)
|
||||
// at the end of prms for a procedure is the rec_procedure_end marker
|
||||
|
||||
while (get(tdgbl) == rec_procedure_prm)
|
||||
get_procedure_prm (tdgbl, procedure_name);
|
||||
get_procedure_prm (tdgbl, package_name, procedure_name);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool get_procedure_prm (BurpGlobals* tdgbl, GDS_NAME procptr)
|
||||
bool get_procedure_prm (BurpGlobals* tdgbl, GDS_NAME package_name, GDS_NAME procptr)
|
||||
{
|
||||
/**************************************
|
||||
*
|
||||
@ -5131,6 +5507,14 @@ bool get_procedure_prm (BurpGlobals* tdgbl, GDS_NAME procptr)
|
||||
|
||||
strcpy(X.RDB$PROCEDURE_NAME, procptr);
|
||||
|
||||
if (package_name[0])
|
||||
{
|
||||
strcpy(X.RDB$PACKAGE_NAME, package_name);
|
||||
X.RDB$PACKAGE_NAME.NULL = FALSE;
|
||||
}
|
||||
else
|
||||
X.RDB$PACKAGE_NAME.NULL = TRUE;
|
||||
|
||||
X.RDB$DESCRIPTION.NULL = TRUE;
|
||||
X.RDB$DEFAULT_VALUE.NULL = TRUE;
|
||||
X.RDB$DEFAULT_SOURCE.NULL = TRUE;
|
||||
@ -6474,6 +6858,8 @@ bool get_trigger(BurpGlobals* tdgbl)
|
||||
X.RDB$FLAGS.NULL = TRUE;
|
||||
X.RDB$VALID_BLR.NULL = TRUE;
|
||||
X.RDB$DEBUG_INFO.NULL = TRUE;
|
||||
X.RDB$ENGINE_NAME.NULL = TRUE;
|
||||
X.RDB$ENTRYPOINT.NULL = TRUE;
|
||||
|
||||
skip_init(&scan_next_attr);
|
||||
while (skip_scan(&scan_next_attr), get_attribute(&attribute, tdgbl) != att_end)
|
||||
@ -6484,6 +6870,10 @@ bool get_trigger(BurpGlobals* tdgbl)
|
||||
X.RDB$TRIGGER_TYPE = (USHORT) get_numeric(tdgbl);
|
||||
break;
|
||||
|
||||
case att_trig_type2:
|
||||
X.RDB$TRIGGER_TYPE = get_int64(tdgbl);
|
||||
break;
|
||||
|
||||
case att_trig_flags:
|
||||
X.RDB$FLAGS = (USHORT) get_numeric(tdgbl);
|
||||
X.RDB$FLAGS.NULL = FALSE;
|
||||
@ -6559,6 +6949,16 @@ bool get_trigger(BurpGlobals* tdgbl)
|
||||
bad_attribute (scan_next_attr, attribute, 134);
|
||||
break;
|
||||
|
||||
case att_trig_engine_name:
|
||||
GET_TEXT(X.RDB$ENGINE_NAME);
|
||||
X.RDB$ENGINE_NAME.NULL = FALSE;
|
||||
break;
|
||||
|
||||
case att_trig_entrypoint:
|
||||
GET_TEXT(X.RDB$ENTRYPOINT);
|
||||
X.RDB$ENTRYPOINT.NULL = FALSE;
|
||||
break;
|
||||
|
||||
default:
|
||||
bad_attribute (scan_next_attr, attribute, 134);
|
||||
// msg 134 trigger
|
||||
@ -6942,10 +7342,22 @@ bool get_user_privilege(BurpGlobals* tdgbl)
|
||||
bool exists = false;
|
||||
switch (object_type)
|
||||
{
|
||||
case obj_package_header:
|
||||
{
|
||||
for (const burp_pkg* pkg = tdgbl->packages; pkg; pkg = pkg->pkg_next)
|
||||
if (strcmp(pkg->pkg_name, relation_name) == 0)
|
||||
{
|
||||
exists = true;
|
||||
local_trans = tdgbl->global_trans ? tdgbl->global_trans : gds_trans;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case obj_procedure:
|
||||
{
|
||||
for (const burp_prc* proc = tdgbl->procedures; proc; proc = proc->prc_next)
|
||||
if (!strcmp(proc->prc_name, relation_name))
|
||||
if (!proc->prc_package[0] && strcmp(proc->prc_name, relation_name) == 0)
|
||||
{
|
||||
exists = true;
|
||||
local_trans = tdgbl->global_trans ? tdgbl->global_trans : gds_trans;
|
||||
@ -6957,7 +7369,7 @@ bool get_user_privilege(BurpGlobals* tdgbl)
|
||||
case obj_relation:
|
||||
{
|
||||
for (const burp_rel* rel = tdgbl->relations; rel; rel = rel->rel_next)
|
||||
if (!strcmp(rel->rel_name, relation_name))
|
||||
if (strcmp(rel->rel_name, relation_name) == 0)
|
||||
{
|
||||
exists = true;
|
||||
if (rel->rel_flags & REL_view)
|
||||
@ -6967,9 +7379,9 @@ bool get_user_privilege(BurpGlobals* tdgbl)
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
exists = true;
|
||||
break;
|
||||
default:
|
||||
exists = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (tdgbl->RESTORE_ods <= DB_VERSION_DDL8)
|
||||
@ -7003,10 +7415,10 @@ bool get_user_privilege(BurpGlobals* tdgbl)
|
||||
if (flags & USER_PRIV_GRANT_OPTION)
|
||||
{
|
||||
X.RDB$GRANT_OPTION = grant_option;
|
||||
if (grant_option == 0)
|
||||
X.RDB$GRANT_OPTION.NULL = TRUE;
|
||||
else
|
||||
X.RDB$GRANT_OPTION.NULL = FALSE;
|
||||
if (grant_option == 0)
|
||||
X.RDB$GRANT_OPTION.NULL = TRUE;
|
||||
else
|
||||
X.RDB$GRANT_OPTION.NULL = FALSE;
|
||||
}
|
||||
|
||||
if (flags & USER_PRIV_OBJECT_NAME)
|
||||
@ -7694,6 +8106,12 @@ bool restore(BurpGlobals* tdgbl,
|
||||
flag = true;
|
||||
break;
|
||||
|
||||
case rec_package:
|
||||
if (!get_package(tdgbl))
|
||||
return false;
|
||||
flag = true;
|
||||
break;
|
||||
|
||||
case rec_procedure:
|
||||
if (!get_procedure(tdgbl))
|
||||
return false;
|
||||
|
@ -76,9 +76,13 @@ public:
|
||||
|
||||
size_t length() const { return count; }
|
||||
const char* c_str() const { return data; }
|
||||
const char* nullStr() const { return (count == 0 ? NULL : data); }
|
||||
bool isEmpty() const { return count == 0; }
|
||||
bool hasData() const { return count != 0; }
|
||||
|
||||
const char* begin() const { return data; }
|
||||
const char* end() const { return data + count; }
|
||||
|
||||
int compare(const char* s, size_t l) const;
|
||||
int compare(const char* s) const { return compare(s, s ? strlen(s) : 0); }
|
||||
int compare(const MetaName& m) const { return memcmp(data, m.data, MAX_SQL_IDENTIFIER_SIZE); }
|
||||
|
97
src/common/classes/QualifiedName.h
Normal file
97
src/common/classes/QualifiedName.h
Normal file
@ -0,0 +1,97 @@
|
||||
/*
|
||||
* PROGRAM: Client/Server Common Code
|
||||
* MODULE: QualifiedName.h
|
||||
* DESCRIPTION: Qualified metadata name holder.
|
||||
*
|
||||
* The contents of this file are subject to the Initial
|
||||
* Developer's Public License Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
* http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
|
||||
*
|
||||
* Software distributed under the License is distributed AS IS,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing rights
|
||||
* and limitations under the License.
|
||||
*
|
||||
* The Original Code was created by Adriano dos Santos Fernandes
|
||||
* for the Firebird Open Source RDBMS project.
|
||||
*
|
||||
* Copyright (c) 2009 Adriano dos Santos Fernandes <adrianosf@uol.com.br>
|
||||
* and all contributors signed below.
|
||||
*
|
||||
* All Rights Reserved.
|
||||
* Contributor(s): ______________________________________.
|
||||
*/
|
||||
|
||||
#ifndef COMMON_QUALIFIEDNAME_H
|
||||
#define COMMON_QUALIFIEDNAME_H
|
||||
|
||||
#include "MetaName.h"
|
||||
#include "array.h"
|
||||
|
||||
namespace Firebird {
|
||||
|
||||
class QualifiedName
|
||||
{
|
||||
public:
|
||||
QualifiedName(MemoryPool& p, const MetaName& aIdentifier, const MetaName& aQualifier)
|
||||
: identifier(p, aIdentifier),
|
||||
qualifier(p, aQualifier)
|
||||
{
|
||||
}
|
||||
|
||||
QualifiedName(const MetaName& aIdentifier, const MetaName& aQualifier)
|
||||
: identifier(aIdentifier),
|
||||
qualifier(aQualifier)
|
||||
{
|
||||
}
|
||||
|
||||
QualifiedName(MemoryPool& p)
|
||||
: identifier(p),
|
||||
qualifier(p)
|
||||
{
|
||||
}
|
||||
|
||||
QualifiedName()
|
||||
{
|
||||
}
|
||||
|
||||
QualifiedName(MemoryPool& p, const QualifiedName& src)
|
||||
: identifier(p, src.identifier),
|
||||
qualifier(p, src.qualifier)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
bool operator >(const QualifiedName& m) const
|
||||
{
|
||||
return qualifier > m.qualifier || (qualifier == m.qualifier && identifier > m.identifier);
|
||||
}
|
||||
|
||||
bool operator ==(const QualifiedName& m) const
|
||||
{
|
||||
return identifier == m.identifier && qualifier == m.qualifier;
|
||||
}
|
||||
|
||||
public:
|
||||
string toString() const
|
||||
{
|
||||
string s;
|
||||
if (qualifier.hasData())
|
||||
{
|
||||
s = qualifier.c_str();
|
||||
s.append(".");
|
||||
}
|
||||
s.append(identifier.c_str());
|
||||
return s;
|
||||
}
|
||||
|
||||
public:
|
||||
MetaName identifier;
|
||||
MetaName qualifier;
|
||||
};
|
||||
|
||||
} // namespace Firebird
|
||||
|
||||
#endif // COMMON_QUALIFIEDNAME_H
|
@ -32,6 +32,71 @@
|
||||
#include "firebird.h"
|
||||
|
||||
|
||||
// Do not have constructor to allow usage in unions (used in the parser).
|
||||
template <typename T> class TriStateRawType
|
||||
{
|
||||
public:
|
||||
static TriStateRawType<T> val(const T& v)
|
||||
{
|
||||
TriStateRawType<T> triState;
|
||||
triState.value = v;
|
||||
triState.specified = true;
|
||||
return triState;
|
||||
}
|
||||
|
||||
static TriStateRawType<T> empty()
|
||||
{
|
||||
TriStateRawType<T> triState;
|
||||
triState.value = (T) 0;
|
||||
triState.specified = false;
|
||||
return triState;
|
||||
}
|
||||
|
||||
void operator =(const T& newValue)
|
||||
{
|
||||
value = newValue;
|
||||
specified = true;
|
||||
}
|
||||
|
||||
bool operator ==(const TriStateRawType<T>& o) const
|
||||
{
|
||||
return (!specified && !o.specified) || (specified == o.specified && value == o.value);
|
||||
}
|
||||
|
||||
public:
|
||||
T value;
|
||||
bool specified;
|
||||
};
|
||||
|
||||
template <typename T> class TriStateType : public TriStateRawType<T>
|
||||
{
|
||||
public:
|
||||
TriStateType<T>(const T& v)
|
||||
{
|
||||
this->value = v;
|
||||
this->specified = true;
|
||||
}
|
||||
|
||||
TriStateType<T>(const TriStateType<T>& o)
|
||||
{
|
||||
this->value = o.value;
|
||||
this->specified = o.specified;
|
||||
}
|
||||
|
||||
TriStateType<T>()
|
||||
{
|
||||
this->value = 0;
|
||||
this->specified = false;
|
||||
}
|
||||
|
||||
public:
|
||||
void operator =(const TriStateRawType<T>& o)
|
||||
{
|
||||
this->value = o.value;
|
||||
this->specified = o.specified;
|
||||
}
|
||||
};
|
||||
|
||||
class TriState
|
||||
{
|
||||
public:
|
||||
|
@ -40,7 +40,7 @@ template <typename What>
|
||||
class SimpleDelete
|
||||
{
|
||||
public:
|
||||
static void clear(What *ptr)
|
||||
static void clear(What* ptr)
|
||||
{
|
||||
delete ptr;
|
||||
}
|
||||
|
@ -650,7 +650,8 @@ namespace Firebird
|
||||
|
||||
inline StringType& operator=(const StringType& v)
|
||||
{
|
||||
fb_assert(&v != this);
|
||||
if (&v == this)
|
||||
return *this;
|
||||
return assign(v);
|
||||
}
|
||||
inline StringType& operator=(const_pointer s)
|
||||
|
@ -350,7 +350,9 @@ namespace Firebird
|
||||
explicit SortedObjectsArray(MemoryPool& p) :
|
||||
ObjectsArray <ObjectValue, SortedArray<ObjectValue*,
|
||||
ObjectStorage, const ObjectKey*, ObjectKeyOfValue,
|
||||
ObjectCmp> >(p) { }
|
||||
ObjectCmp> >(p)
|
||||
{ }
|
||||
|
||||
bool find(const ObjectKey& item, size_t& pos) const
|
||||
{
|
||||
const ObjectKey* const pItem = &item;
|
||||
@ -358,11 +360,13 @@ namespace Firebird
|
||||
ObjectStorage, const ObjectKey*, ObjectKeyOfValue,
|
||||
ObjectCmp>*>(this)->find(pItem, pos);
|
||||
}
|
||||
|
||||
bool exist(const ObjectKey& item) const
|
||||
{
|
||||
size_t pos;
|
||||
size_t pos; // ignored
|
||||
return find(item, pos);
|
||||
}
|
||||
|
||||
size_t add(const ObjectValue& item)
|
||||
{
|
||||
return inherited::add(item);
|
||||
|
@ -265,12 +265,23 @@ namespace Firebird {
|
||||
class ReadLockGuard
|
||||
{
|
||||
public:
|
||||
ReadLockGuard(RWLock &alock)
|
||||
ReadLockGuard(RWLock& alock)
|
||||
: lock(&alock)
|
||||
{
|
||||
lock->beginRead();
|
||||
}
|
||||
~ReadLockGuard() { release(); }
|
||||
|
||||
ReadLockGuard(RWLock* alock)
|
||||
: lock(alock)
|
||||
{
|
||||
if (lock)
|
||||
lock->beginRead();
|
||||
}
|
||||
|
||||
~ReadLockGuard()
|
||||
{
|
||||
release();
|
||||
}
|
||||
|
||||
void release()
|
||||
{
|
||||
@ -284,19 +295,30 @@ public:
|
||||
private:
|
||||
// Forbid copy constructor
|
||||
ReadLockGuard(const ReadLockGuard& source);
|
||||
RWLock *lock;
|
||||
RWLock* lock;
|
||||
};
|
||||
|
||||
// RAII holder of write lock
|
||||
class WriteLockGuard
|
||||
{
|
||||
public:
|
||||
WriteLockGuard(RWLock &alock)
|
||||
WriteLockGuard(RWLock& alock)
|
||||
: lock(&alock)
|
||||
{
|
||||
lock->beginWrite();
|
||||
}
|
||||
~WriteLockGuard() { release(); }
|
||||
|
||||
WriteLockGuard(RWLock* alock)
|
||||
: lock(alock)
|
||||
{
|
||||
if (lock)
|
||||
lock->beginWrite();
|
||||
}
|
||||
|
||||
~WriteLockGuard()
|
||||
{
|
||||
release();
|
||||
}
|
||||
|
||||
void release()
|
||||
{
|
||||
@ -310,10 +332,9 @@ public:
|
||||
private:
|
||||
// Forbid copy constructor
|
||||
WriteLockGuard(const WriteLockGuard& source);
|
||||
RWLock *lock;
|
||||
RWLock* lock;
|
||||
};
|
||||
|
||||
} // namespace Firebird
|
||||
|
||||
#endif // #ifndef CLASSES_RWLOCK_H
|
||||
|
||||
|
@ -180,6 +180,25 @@ namespace Firebird {
|
||||
}
|
||||
}
|
||||
|
||||
// Push a element on the stack and pop when we go out of scope.
|
||||
class AutoPushPop
|
||||
{
|
||||
public:
|
||||
AutoPushPop(Stack<Object, Capacity>& s, Object& o)
|
||||
: stack(s)
|
||||
{
|
||||
stack.push(o);
|
||||
}
|
||||
|
||||
~AutoPushPop()
|
||||
{
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
private:
|
||||
Stack<Object, Capacity>& stack;
|
||||
};
|
||||
|
||||
class iterator;
|
||||
friend class iterator;
|
||||
|
||||
|
@ -271,7 +271,10 @@ Firebird::string ConfObject::expand(const char* rawValue)
|
||||
if (!changed)
|
||||
return temp;
|
||||
|
||||
return PathName::expandFilename (temp);
|
||||
// ASF: Do not try to expand relative filenames. It seems better to use $(this), or if necessary
|
||||
// a new expansion variable. Also, this function is bugged and is returning incorrect values.
|
||||
// return PathName::expandFilename (temp);
|
||||
return temp;
|
||||
}
|
||||
|
||||
Firebird::string ConfObject::getValue(const char* attributeName)
|
||||
|
@ -46,6 +46,10 @@ define trigger grant_trigger for rdb$user_privileges pre store 0
|
||||
not any prc in rdb$procedures
|
||||
with prc.rdb$procedure_name eq new.rdb$relation_name
|
||||
abort 0;
|
||||
if new.rdb$object_type = 18 /* obj_package_header */ and
|
||||
not any pkg in rdb$packages
|
||||
with pkg.rdb$package_name eq new.rdb$relation_name
|
||||
abort 0;
|
||||
|
||||
if new.rdb$user_type = 0 or new.rdb$user_type = 3 or
|
||||
new.rdb$user_type = 4 or new.rdb$user_type = 6 or
|
||||
@ -177,6 +181,28 @@ define trigger grant_trigger for rdb$user_privileges pre store 0
|
||||
else if prc.rdb$security_class not starting "SQL$"
|
||||
abort 3;
|
||||
end_for;
|
||||
else if new.rdb$object_type = 18 /* obj_package_header */
|
||||
for pkg in rdb$packages
|
||||
with pkg.rdb$package_name eq new.rdb$relation_name
|
||||
if pkg.rdb$owner_name ne UPPERCASE (rdb$user_name)
|
||||
and UPPERCASE (rdb$user_name) ne "SYSDBA"
|
||||
if not any priv in rdb$user_privileges
|
||||
with priv.rdb$relation_name eq new.rdb$relation_name and
|
||||
priv.rdb$object_type eq 18 and
|
||||
priv.rdb$privilege eq new.rdb$privilege and
|
||||
priv.rdb$user eq new.rdb$grantor and
|
||||
priv.rdb$user_type eq 8 and
|
||||
priv.rdb$grant_option ne 0 and
|
||||
(priv.rdb$field_name missing or
|
||||
priv.rdb$field_name eq new.rdb$field_name)
|
||||
abort 2;
|
||||
if pkg.rdb$security_class missing
|
||||
modify pkg
|
||||
pkg.rdb$security_class = "SQL$" | gen_id (RDB$SECURITY_CLASS, 1);
|
||||
end_modify
|
||||
else if pkg.rdb$security_class not starting "SQL$"
|
||||
abort 3;
|
||||
end_for;
|
||||
end;
|
||||
end_trigger;
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -25,18 +25,88 @@
|
||||
|
||||
#include "../jrd/common.h"
|
||||
#include "../dsql/Nodes.h"
|
||||
#include "../common/classes/array.h"
|
||||
#include "../common/classes/TriState.h"
|
||||
|
||||
namespace Jrd {
|
||||
|
||||
|
||||
class ExternalClause
|
||||
{
|
||||
public:
|
||||
explicit ExternalClause(MemoryPool& pool)
|
||||
: name(pool),
|
||||
engine(pool)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
Firebird::string name;
|
||||
Firebird::MetaName engine;
|
||||
};
|
||||
|
||||
|
||||
class TypeClause
|
||||
{
|
||||
public:
|
||||
explicit TypeClause(dsql_fld* aField, dsql_str* aCollate);
|
||||
virtual ~TypeClause() {}
|
||||
|
||||
public:
|
||||
void resolve(CompiledStatement* compiledStatement);
|
||||
|
||||
public:
|
||||
virtual void print(Firebird::string& text) const;
|
||||
|
||||
public:
|
||||
USHORT type;
|
||||
FLD_LENGTH length;
|
||||
SSHORT scale;
|
||||
SSHORT subType;
|
||||
USHORT segLength;
|
||||
USHORT precision;
|
||||
USHORT charLength;
|
||||
SSHORT charSetId;
|
||||
SSHORT collationId;
|
||||
SSHORT textType;
|
||||
bool collateSpecified;
|
||||
bool fullDomain;
|
||||
bool notNull;
|
||||
Firebird::MetaName fieldSource;
|
||||
Firebird::MetaName typeOfTable;
|
||||
Firebird::MetaName typeOfName;
|
||||
|
||||
public:
|
||||
dsql_fld* legacyField;
|
||||
dsql_str* legacyCollate;
|
||||
};
|
||||
|
||||
|
||||
class ParameterClause : public TypeClause
|
||||
{
|
||||
public:
|
||||
explicit ParameterClause(dsql_fld* field, dsql_str* collate, dsql_nod* dflt);
|
||||
|
||||
public:
|
||||
void print(Firebird::string& text) const;
|
||||
|
||||
public:
|
||||
static void fromLegacyParameterList(Firebird::Array<ParameterClause>& parameters, dsql_nod* list);
|
||||
|
||||
public:
|
||||
Firebird::MetaName name;
|
||||
dsql_nod* legacyDefault;
|
||||
};
|
||||
|
||||
|
||||
class AlterCharSetNode : public DdlNode
|
||||
{
|
||||
public:
|
||||
explicit AlterCharSetNode(MemoryPool& pool, const Firebird::MetaName& aCharSet,
|
||||
const Firebird::MetaName& aDefaultCollation)
|
||||
: DdlNode(pool),
|
||||
charSet(getPool(), aCharSet),
|
||||
defaultCollation(getPool(), aDefaultCollation)
|
||||
explicit AlterCharSetNode(MemoryPool& pool, const Firebird::string& sqlText,
|
||||
const Firebird::MetaName& aCharSet, const Firebird::MetaName& aDefaultCollation)
|
||||
: DdlNode(pool, sqlText),
|
||||
charSet(pool, aCharSet),
|
||||
defaultCollation(pool, aDefaultCollation)
|
||||
{
|
||||
}
|
||||
|
||||
@ -50,6 +120,394 @@ private:
|
||||
};
|
||||
|
||||
|
||||
class CommentOnNode : public DdlNode
|
||||
{
|
||||
public:
|
||||
explicit CommentOnNode(MemoryPool& pool, const Firebird::string& sqlText, int aObjType,
|
||||
const Firebird::MetaName& aObjName, const Firebird::MetaName& aSubName,
|
||||
const Firebird::string& aText)
|
||||
: DdlNode(pool, sqlText),
|
||||
objType(aObjType),
|
||||
objName(pool, aObjName),
|
||||
subName(pool, aSubName),
|
||||
text(pool, aText)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
||||
virtual void execute(thread_db* tdbb, jrd_tra* transaction);
|
||||
|
||||
private:
|
||||
int objType;
|
||||
Firebird::MetaName objName;
|
||||
Firebird::MetaName subName;
|
||||
Firebird::string text;
|
||||
};
|
||||
|
||||
|
||||
class CreateAlterFunctionNode : public DdlNode
|
||||
{
|
||||
public:
|
||||
explicit CreateAlterFunctionNode(MemoryPool& pool, const Firebird::string& sqlText,
|
||||
const Firebird::MetaName& aName, const TypeClause& aReturnType)
|
||||
: DdlNode(pool, sqlText),
|
||||
name(pool, aName),
|
||||
returnType(aReturnType),
|
||||
create(true),
|
||||
alter(false),
|
||||
external(NULL),
|
||||
parameters(pool),
|
||||
package(pool),
|
||||
privateScope(false),
|
||||
source(pool)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
||||
virtual void execute(thread_db* tdbb, jrd_tra* transaction);
|
||||
|
||||
private:
|
||||
void executeCreate(thread_db* tdbb, jrd_tra* transaction);
|
||||
bool executeAlter(thread_db* tdbb, jrd_tra* transaction);
|
||||
|
||||
void storeArgument(thread_db* tdbb, jrd_tra* transaction,
|
||||
unsigned pos, const TypeClause& parameter, dsql_nod* legacyDefault);
|
||||
|
||||
public:
|
||||
Firebird::MetaName name;
|
||||
TypeClause returnType;
|
||||
bool create;
|
||||
bool alter;
|
||||
ExternalClause* external;
|
||||
Firebird::Array<ParameterClause> parameters;
|
||||
Firebird::MetaName package;
|
||||
bool privateScope;
|
||||
Firebird::string source;
|
||||
};
|
||||
|
||||
|
||||
class DropFunctionNode : public DdlNode
|
||||
{
|
||||
public:
|
||||
explicit DropFunctionNode(MemoryPool& pool, const Firebird::string& sqlText,
|
||||
const Firebird::MetaName& aName)
|
||||
: DdlNode(pool, sqlText),
|
||||
name(pool, aName),
|
||||
silent(false),
|
||||
package(pool)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
||||
virtual void execute(thread_db* tdbb, jrd_tra* transaction);
|
||||
|
||||
public:
|
||||
Firebird::MetaName name;
|
||||
bool silent;
|
||||
Firebird::MetaName package;
|
||||
};
|
||||
|
||||
|
||||
class CreateAlterProcedureNode;
|
||||
|
||||
|
||||
class ProcedureNode : public DdlNode, public BlockNode
|
||||
{
|
||||
public:
|
||||
explicit ProcedureNode(MemoryPool& p, const Firebird::string& sqlText)
|
||||
: DdlNode(p, sqlText)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void genReturn();
|
||||
virtual dsql_nod* resolveVariable(const dsql_str* varName);
|
||||
|
||||
protected:
|
||||
virtual CreateAlterProcedureNode* getCreateAlterNode() = 0;
|
||||
};
|
||||
|
||||
|
||||
class CreateAlterProcedureNode : public ProcedureNode
|
||||
{
|
||||
public:
|
||||
explicit CreateAlterProcedureNode(MemoryPool& pool, const Firebird::string& sqlText,
|
||||
const Firebird::MetaName& aName)
|
||||
: ProcedureNode(pool, sqlText),
|
||||
name(pool, aName),
|
||||
create(true),
|
||||
alter(false),
|
||||
external(NULL),
|
||||
parameters(pool),
|
||||
returns(pool),
|
||||
legacyParameters(NULL),
|
||||
legacyReturns(NULL),
|
||||
source(pool),
|
||||
localDeclList(NULL),
|
||||
body(NULL),
|
||||
compiled(false),
|
||||
invalid(false),
|
||||
package(pool),
|
||||
packageOwner(pool),
|
||||
privateScope(false)
|
||||
{
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual CreateAlterProcedureNode* getCreateAlterNode()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
||||
virtual void execute(thread_db* tdbb, jrd_tra* transaction);
|
||||
|
||||
protected:
|
||||
virtual Node* internalDsqlPass();
|
||||
|
||||
private:
|
||||
void executeCreate(thread_db* tdbb, jrd_tra* transaction);
|
||||
bool executeAlter(thread_db* tdbb, jrd_tra* transaction, bool secondPass, bool runTriggers);
|
||||
void storeParameter(thread_db* tdbb, jrd_tra* transaction,
|
||||
USHORT type, unsigned pos, const ParameterClause& parameter);
|
||||
void compile(thread_db* tdbb, jrd_tra* transaction);
|
||||
|
||||
public:
|
||||
Firebird::MetaName name;
|
||||
bool create;
|
||||
bool alter;
|
||||
ExternalClause* external;
|
||||
Firebird::Array<ParameterClause> parameters;
|
||||
Firebird::Array<ParameterClause> returns;
|
||||
dsql_nod* legacyParameters;
|
||||
dsql_nod* legacyReturns;
|
||||
Firebird::string source;
|
||||
dsql_nod* localDeclList;
|
||||
dsql_nod* body;
|
||||
bool compiled;
|
||||
bool invalid;
|
||||
Firebird::MetaName package;
|
||||
Firebird::string packageOwner;
|
||||
bool privateScope;
|
||||
};
|
||||
|
||||
|
||||
class DropProcedureNode : public DdlNode
|
||||
{
|
||||
public:
|
||||
explicit DropProcedureNode(MemoryPool& pool, const Firebird::string& sqlText,
|
||||
const Firebird::MetaName& aName)
|
||||
: DdlNode(pool, sqlText),
|
||||
name(pool, aName),
|
||||
silent(false),
|
||||
package(pool)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
static void dropParameters(thread_db* tdbb, jrd_tra* transaction,
|
||||
const Firebird::MetaName& procedureName, const Firebird::MetaName& packageName);
|
||||
|
||||
public:
|
||||
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
||||
virtual void execute(thread_db* tdbb, jrd_tra* transaction);
|
||||
|
||||
protected:
|
||||
virtual Node* internalDsqlPass();
|
||||
|
||||
public:
|
||||
Firebird::MetaName name;
|
||||
bool silent;
|
||||
Firebird::MetaName package;
|
||||
};
|
||||
|
||||
|
||||
class RecreateProcedureNode : public ProcedureNode
|
||||
{
|
||||
public:
|
||||
explicit RecreateProcedureNode(MemoryPool& p, const Firebird::string& sqlText,
|
||||
CreateAlterProcedureNode* aCreateNode)
|
||||
: ProcedureNode(p, sqlText),
|
||||
createNode(aCreateNode),
|
||||
dropNode(p, sqlText, createNode->name)
|
||||
{
|
||||
dropNode.silent = true;
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual CreateAlterProcedureNode* getCreateAlterNode()
|
||||
{
|
||||
return createNode;
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
||||
virtual void execute(thread_db* tdbb, jrd_tra* transaction);
|
||||
|
||||
protected:
|
||||
virtual Node* internalDsqlPass();
|
||||
|
||||
private:
|
||||
CreateAlterProcedureNode* createNode;
|
||||
DropProcedureNode dropNode;
|
||||
};
|
||||
|
||||
|
||||
class CreateAlterTriggerNode;
|
||||
|
||||
|
||||
class TriggerNode : public DdlNode, public BlockNode
|
||||
{
|
||||
public:
|
||||
explicit TriggerNode(MemoryPool& p, const Firebird::string& sqlText)
|
||||
: DdlNode(p, sqlText)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void genReturn()
|
||||
{
|
||||
fb_assert(false);
|
||||
}
|
||||
|
||||
virtual dsql_nod* resolveVariable(const dsql_str* varName);
|
||||
|
||||
protected:
|
||||
virtual CreateAlterTriggerNode* getCreateAlterNode() = 0;
|
||||
};
|
||||
|
||||
|
||||
class CreateAlterTriggerNode : public TriggerNode
|
||||
{
|
||||
public:
|
||||
explicit CreateAlterTriggerNode(MemoryPool& p, const Firebird::string& sqlText,
|
||||
const Firebird::MetaName& aName)
|
||||
: TriggerNode(p, sqlText),
|
||||
name(p, aName),
|
||||
create(true),
|
||||
alter(false),
|
||||
relationName(p),
|
||||
external(NULL),
|
||||
source(p),
|
||||
localDeclList(NULL),
|
||||
body(NULL),
|
||||
compiled(false),
|
||||
invalid(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
protected:
|
||||
virtual CreateAlterTriggerNode* getCreateAlterNode()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
||||
virtual void execute(thread_db* tdbb, jrd_tra* transaction);
|
||||
|
||||
protected:
|
||||
virtual Node* internalDsqlPass();
|
||||
|
||||
private:
|
||||
void executeCreate(thread_db* tdbb, jrd_tra* transaction);
|
||||
bool executeAlter(thread_db* tdbb, jrd_tra* transaction, bool runTriggers);
|
||||
void compile(thread_db* tdbb, jrd_tra* transaction);
|
||||
|
||||
static inline bool hasOldContext(const unsigned value)
|
||||
{
|
||||
const unsigned val1 = ((value + 1) >> 1) & 3;
|
||||
const unsigned val2 = ((value + 1) >> 3) & 3;
|
||||
const unsigned val3 = ((value + 1) >> 5) & 3;
|
||||
return (val1 && val1 != 1) || (val2 && val2 != 1) || (val3 && val3 != 1);
|
||||
}
|
||||
|
||||
static inline bool hasNewContext(const unsigned value)
|
||||
{
|
||||
const unsigned val1 = ((value + 1) >> 1) & 3;
|
||||
const unsigned val2 = ((value + 1) >> 3) & 3;
|
||||
const unsigned val3 = ((value + 1) >> 5) & 3;
|
||||
return (val1 && val1 != 3) || (val2 && val2 != 3) || (val3 && val3 != 3);
|
||||
}
|
||||
|
||||
public:
|
||||
Firebird::MetaName name;
|
||||
bool create;
|
||||
bool alter;
|
||||
Firebird::MetaName relationName;
|
||||
TriStateType<FB_UINT64> type;
|
||||
TriStateType<bool> active;
|
||||
TriStateType<int> position;
|
||||
ExternalClause* external;
|
||||
Firebird::string source;
|
||||
dsql_nod* localDeclList;
|
||||
dsql_nod* body;
|
||||
bool compiled;
|
||||
bool invalid;
|
||||
};
|
||||
|
||||
|
||||
class DropTriggerNode : public DdlNode
|
||||
{
|
||||
public:
|
||||
explicit DropTriggerNode(MemoryPool& p, const Firebird::string& sqlText,
|
||||
const Firebird::MetaName& aName)
|
||||
: DdlNode(p, sqlText),
|
||||
name(p, aName),
|
||||
silent(false)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
||||
virtual void execute(thread_db* tdbb, jrd_tra* transaction);
|
||||
|
||||
protected:
|
||||
virtual Node* internalDsqlPass();
|
||||
|
||||
public:
|
||||
Firebird::MetaName name;
|
||||
bool silent;
|
||||
};
|
||||
|
||||
|
||||
class RecreateTriggerNode : public TriggerNode
|
||||
{
|
||||
public:
|
||||
explicit RecreateTriggerNode(MemoryPool& p, const Firebird::string& sqlText,
|
||||
CreateAlterTriggerNode* aCreateNode)
|
||||
: TriggerNode(p, sqlText),
|
||||
createNode(aCreateNode),
|
||||
dropNode(p, sqlText, createNode->name)
|
||||
{
|
||||
dropNode.silent = true;
|
||||
}
|
||||
|
||||
|
||||
protected:
|
||||
virtual CreateAlterTriggerNode* getCreateAlterNode()
|
||||
{
|
||||
return createNode;
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
||||
virtual void execute(thread_db* tdbb, jrd_tra* transaction);
|
||||
|
||||
protected:
|
||||
virtual Node* internalDsqlPass();
|
||||
|
||||
private:
|
||||
CreateAlterTriggerNode* createNode;
|
||||
DropTriggerNode dropNode;
|
||||
};
|
||||
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif // DSQL_DDL_NODES_H
|
||||
|
@ -29,6 +29,7 @@
|
||||
namespace Jrd {
|
||||
|
||||
class CompilerScratch;
|
||||
class TypeClause;
|
||||
|
||||
|
||||
class Node : public Firebird::PermanentStorage
|
||||
@ -48,14 +49,14 @@ public:
|
||||
Node* dsqlPass(CompiledStatement* aCompiledStatement)
|
||||
{
|
||||
compiledStatement = aCompiledStatement;
|
||||
return dsqlPass();
|
||||
return internalDsqlPass();
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const = 0;
|
||||
|
||||
protected:
|
||||
virtual Node* dsqlPass()
|
||||
virtual Node* internalDsqlPass()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
@ -68,13 +69,41 @@ protected:
|
||||
class DdlNode : public Node
|
||||
{
|
||||
public:
|
||||
explicit DdlNode(MemoryPool& pool)
|
||||
: Node(pool)
|
||||
explicit DdlNode(MemoryPool& pool, const Firebird::string& aSqlText)
|
||||
: Node(pool),
|
||||
sqlText(pool, aSqlText)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
const Firebird::string& getSqlText()
|
||||
{
|
||||
return sqlText;
|
||||
}
|
||||
|
||||
public:
|
||||
enum DdlTriggerWhen { DTW_BEFORE, DTW_AFTER };
|
||||
static void executeDdlTrigger(thread_db* tdbb, jrd_tra* transaction,
|
||||
DdlTriggerWhen when, int action, const Firebird::MetaName& objectName,
|
||||
const Firebird::string& sqlText);
|
||||
|
||||
public:
|
||||
static void checkEmptyName(const Firebird::MetaName& name);
|
||||
static Firebird::MetaName nameInMetaCharSet(thread_db* tdbb, const Firebird::MetaName& name);
|
||||
static Firebird::MetaName nameInUserCharSet(thread_db* tdbb, const Firebird::MetaName& name);
|
||||
static void storeTextBlob(thread_db* tdbb, jrd_tra* transaction, bid* blobId,
|
||||
const Firebird::string& text);
|
||||
static void storeBlob(thread_db* tdbb, jrd_tra* transaction, bid* blobId,
|
||||
const UCHAR* data, unsigned length);
|
||||
|
||||
protected:
|
||||
virtual Node* dsqlPass()
|
||||
void executeDdlTrigger(thread_db* tdbb, jrd_tra* transaction,
|
||||
DdlTriggerWhen when, int action, const Firebird::MetaName& objectName);
|
||||
void putType(const TypeClause& type, bool useSubType);
|
||||
void resetContextStack();
|
||||
|
||||
protected:
|
||||
virtual Node* internalDsqlPass()
|
||||
{
|
||||
compiledStatement->req_type = REQ_DDL;
|
||||
return this;
|
||||
@ -82,6 +111,9 @@ protected:
|
||||
|
||||
public:
|
||||
virtual void execute(thread_db* tdbb, jrd_tra* transaction) = 0;
|
||||
|
||||
private:
|
||||
Firebird::string sqlText;
|
||||
};
|
||||
|
||||
|
||||
@ -89,7 +121,8 @@ class DmlNode : public Node
|
||||
{
|
||||
public:
|
||||
explicit DmlNode(MemoryPool& pool)
|
||||
: Node(pool)
|
||||
: Node(pool),
|
||||
node(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
@ -117,6 +150,20 @@ public:
|
||||
};
|
||||
|
||||
|
||||
// Common node for all "code blocks" (i.e.: procedures, triggers and execute block)
|
||||
class BlockNode
|
||||
{
|
||||
public:
|
||||
virtual ~BlockNode()
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void genReturn() = 0;
|
||||
virtual dsql_nod* resolveVariable(const dsql_str* varName) = 0;
|
||||
};
|
||||
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif // DSQL_NODES_H
|
||||
|
1140
src/dsql/PackageNodes.epp
Normal file
1140
src/dsql/PackageNodes.epp
Normal file
File diff suppressed because it is too large
Load Diff
230
src/dsql/PackageNodes.h
Normal file
230
src/dsql/PackageNodes.h
Normal file
@ -0,0 +1,230 @@
|
||||
/*
|
||||
* The contents of this file are subject to the Initial
|
||||
* Developer's Public License Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
* http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
|
||||
*
|
||||
* Software distributed under the License is distributed AS IS,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing rights
|
||||
* and limitations under the License.
|
||||
*
|
||||
* The Original Code was created by Adriano dos Santos Fernandes
|
||||
* for the Firebird Open Source RDBMS project.
|
||||
*
|
||||
* Copyright (c) 2009 Adriano dos Santos Fernandes <adrianosf@uol.com.br>
|
||||
* and all contributors signed below.
|
||||
*
|
||||
* All Rights Reserved.
|
||||
* Contributor(s): ______________________________________.
|
||||
*/
|
||||
|
||||
#ifndef DSQL_PACKAGE_NODES_H
|
||||
#define DSQL_PACKAGE_NODES_H
|
||||
|
||||
#include "../jrd/common.h"
|
||||
#include "../dsql/DdlNodes.h"
|
||||
#include "../common/classes/array.h"
|
||||
|
||||
namespace Jrd {
|
||||
|
||||
|
||||
class CreateAlterPackageNode : public DdlNode
|
||||
{
|
||||
public:
|
||||
struct Item
|
||||
{
|
||||
static Item create(CreateAlterFunctionNode* function)
|
||||
{
|
||||
Item item;
|
||||
item.type = FUNCTION;
|
||||
item.function = function;
|
||||
return item;
|
||||
}
|
||||
|
||||
static Item create(CreateAlterProcedureNode* procedure)
|
||||
{
|
||||
Item item;
|
||||
item.type = PROCEDURE;
|
||||
item.procedure = procedure;
|
||||
return item;
|
||||
}
|
||||
|
||||
enum
|
||||
{
|
||||
FUNCTION,
|
||||
PROCEDURE
|
||||
} type;
|
||||
|
||||
union
|
||||
{
|
||||
CreateAlterFunctionNode* function;
|
||||
CreateAlterProcedureNode* procedure;
|
||||
};
|
||||
};
|
||||
|
||||
public:
|
||||
explicit CreateAlterPackageNode(MemoryPool& pool, const Firebird::string& sqlText,
|
||||
const Firebird::MetaName& aName)
|
||||
: DdlNode(pool, sqlText),
|
||||
name(pool, aName),
|
||||
create(true),
|
||||
alter(false),
|
||||
source(pool),
|
||||
items(NULL),
|
||||
functionNames(pool),
|
||||
procedureNames(pool),
|
||||
owner(pool)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
||||
virtual void execute(thread_db* tdbb, jrd_tra* transaction);
|
||||
|
||||
protected:
|
||||
virtual Node* internalDsqlPass();
|
||||
|
||||
private:
|
||||
void executeCreate(thread_db* tdbb, jrd_tra* transaction);
|
||||
bool executeAlter(thread_db* tdbb, jrd_tra* transaction);
|
||||
|
||||
public:
|
||||
Firebird::MetaName name;
|
||||
bool create;
|
||||
bool alter;
|
||||
Firebird::string source;
|
||||
Firebird::Array<Item>* items;
|
||||
Firebird::SortedArray<Firebird::MetaName> functionNames;
|
||||
Firebird::SortedArray<Firebird::MetaName> procedureNames;
|
||||
|
||||
private:
|
||||
Firebird::string owner;
|
||||
};
|
||||
|
||||
|
||||
class DropPackageNode : public DdlNode
|
||||
{
|
||||
public:
|
||||
explicit DropPackageNode(MemoryPool& pool, const Firebird::string& sqlText,
|
||||
const Firebird::MetaName& aName)
|
||||
: DdlNode(pool, sqlText),
|
||||
name(pool, aName),
|
||||
silent(false)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
||||
virtual void execute(thread_db* tdbb, jrd_tra* transaction);
|
||||
|
||||
public:
|
||||
Firebird::MetaName name;
|
||||
bool silent;
|
||||
};
|
||||
|
||||
|
||||
class RecreatePackageNode : public DdlNode
|
||||
{
|
||||
public:
|
||||
explicit RecreatePackageNode(MemoryPool& p, const Firebird::string& sqlText,
|
||||
CreateAlterPackageNode* aCreateNode)
|
||||
: DdlNode(p, sqlText),
|
||||
createNode(aCreateNode),
|
||||
dropNode(p, sqlText, createNode->name)
|
||||
{
|
||||
dropNode.silent = true;
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
||||
virtual void execute(thread_db* tdbb, jrd_tra* transaction);
|
||||
|
||||
protected:
|
||||
virtual Node* internalDsqlPass();
|
||||
|
||||
private:
|
||||
CreateAlterPackageNode* createNode;
|
||||
DropPackageNode dropNode;
|
||||
};
|
||||
|
||||
|
||||
class CreatePackageBodyNode : public DdlNode
|
||||
{
|
||||
public:
|
||||
explicit CreatePackageBodyNode(MemoryPool& pool, const Firebird::string& sqlText,
|
||||
const Firebird::MetaName& aName)
|
||||
: DdlNode(pool, sqlText),
|
||||
name(pool, aName),
|
||||
source(pool),
|
||||
declaredItems(NULL),
|
||||
items(NULL),
|
||||
owner(pool)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
||||
virtual void execute(thread_db* tdbb, jrd_tra* transaction);
|
||||
|
||||
protected:
|
||||
virtual Node* internalDsqlPass();
|
||||
|
||||
public:
|
||||
Firebird::MetaName name;
|
||||
Firebird::string source;
|
||||
Firebird::Array<CreateAlterPackageNode::Item>* declaredItems;
|
||||
Firebird::Array<CreateAlterPackageNode::Item>* items;
|
||||
|
||||
private:
|
||||
Firebird::string owner;
|
||||
};
|
||||
|
||||
|
||||
class DropPackageBodyNode : public DdlNode
|
||||
{
|
||||
public:
|
||||
explicit DropPackageBodyNode(MemoryPool& pool, const Firebird::string& sqlText,
|
||||
const Firebird::MetaName& aName)
|
||||
: DdlNode(pool, sqlText),
|
||||
name(pool, aName)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
||||
virtual void execute(thread_db* tdbb, jrd_tra* transaction);
|
||||
|
||||
public:
|
||||
Firebird::MetaName name;
|
||||
};
|
||||
|
||||
|
||||
class RecreatePackageBodyNode : public DdlNode
|
||||
{
|
||||
public:
|
||||
explicit RecreatePackageBodyNode(MemoryPool& p, const Firebird::string& sqlText,
|
||||
CreatePackageBodyNode* aCreateNode)
|
||||
: DdlNode(p, sqlText),
|
||||
createNode(aCreateNode),
|
||||
dropNode(p, sqlText, createNode->name)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
||||
virtual void execute(thread_db* tdbb, jrd_tra* transaction);
|
||||
|
||||
protected:
|
||||
virtual Node* internalDsqlPass();
|
||||
|
||||
private:
|
||||
CreatePackageBodyNode* createNode;
|
||||
DropPackageBodyNode dropNode;
|
||||
};
|
||||
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif // DSQL_PACKAGE_NODES_H
|
@ -31,6 +31,7 @@ using namespace Jrd;
|
||||
Parser::Parser(MemoryPool& pool, USHORT aClientDialect, USHORT aDbDialect, USHORT aParserVersion,
|
||||
const TEXT* string, USHORT length, SSHORT characterSet)
|
||||
: PermanentStorage(pool),
|
||||
compilingText(pool, string, length),
|
||||
client_dialect(aClientDialect),
|
||||
db_dialect(aDbDialect),
|
||||
parser_version(aParserVersion),
|
||||
@ -89,7 +90,7 @@ Parser::~Parser()
|
||||
}
|
||||
|
||||
|
||||
Parser::YYSTYPE Parser::parse()
|
||||
dsql_nod* Parser::parse()
|
||||
{
|
||||
if (parseAux() != 0)
|
||||
return NULL;
|
||||
|
@ -27,9 +27,14 @@
|
||||
#include "../dsql/dsql.h"
|
||||
#include "../dsql/node.h"
|
||||
#include "../dsql/DdlNodes.h"
|
||||
#include "../dsql/PackageNodes.h"
|
||||
#include "../dsql/StmtNodes.h"
|
||||
#include "../common/classes/TriState.h"
|
||||
#include "../common/classes/stack.h"
|
||||
|
||||
#define _yacc_defines_keywords
|
||||
#include "../dsql/dsql.tab.h"
|
||||
|
||||
namespace Jrd {
|
||||
|
||||
class dsql_nod;
|
||||
@ -38,7 +43,6 @@ class Parser : public Firebird::PermanentStorage
|
||||
{
|
||||
private:
|
||||
typedef int Yshort;
|
||||
typedef dsql_nod* YYSTYPE;
|
||||
typedef int YYPOSN; // user-defined text position type
|
||||
|
||||
struct yyparsestate
|
||||
@ -64,7 +68,7 @@ private:
|
||||
// This is, in fact, parser state. Not used in lexer itself
|
||||
dsql_fld* g_field;
|
||||
dsql_fil* g_file;
|
||||
YYSTYPE g_field_name;
|
||||
dsql_nod* g_field_name;
|
||||
int dsql_debug;
|
||||
|
||||
// Actual lexer state begins from here
|
||||
@ -101,7 +105,7 @@ public:
|
||||
~Parser();
|
||||
|
||||
public:
|
||||
YYSTYPE parse();
|
||||
dsql_nod* parse();
|
||||
|
||||
const Firebird::string& getTransformedString() const
|
||||
{
|
||||
@ -139,14 +143,15 @@ private:
|
||||
void yyerror_detailed(const TEXT* error_string, int yychar, YYSTYPE&, YYPOSN&);
|
||||
|
||||
const TEXT* lex_position();
|
||||
YYSTYPE make_list (YYSTYPE node);
|
||||
YYSTYPE make_parameter();
|
||||
YYSTYPE make_node(Dsql::nod_t type, int count, ...);
|
||||
YYSTYPE makeClassNode(Node* node);
|
||||
YYSTYPE make_flag_node(Dsql::nod_t type, SSHORT flag, int count, ...);
|
||||
dsql_nod* make_list (dsql_nod* node);
|
||||
dsql_nod* make_parameter();
|
||||
dsql_nod* make_node(Dsql::nod_t type, int count, ...);
|
||||
dsql_nod* makeClassNode(Node* node);
|
||||
dsql_nod* make_flag_node(Dsql::nod_t type, SSHORT flag, int count, ...);
|
||||
// end - defined in parse.y
|
||||
|
||||
private:
|
||||
Firebird::string compilingText;
|
||||
USHORT client_dialect;
|
||||
USHORT db_dialect;
|
||||
USHORT parser_version;
|
||||
@ -154,7 +159,7 @@ private:
|
||||
Firebird::string transformedString;
|
||||
Firebird::Array<IntroducerMark> introducerMarks;
|
||||
bool stmt_ambiguous;
|
||||
YYSTYPE DSQL_parse;
|
||||
dsql_nod* DSQL_parse;
|
||||
|
||||
// These value/posn are taken from the lexer
|
||||
YYSTYPE yylval;
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "firebird.h"
|
||||
#include "../jrd/common.h"
|
||||
#include "../dsql/StmtNodes.h"
|
||||
#include "../dsql/node.h"
|
||||
#include "../jrd/jrd.h"
|
||||
#include "../jrd/blr.h"
|
||||
#include "../jrd/exe.h"
|
||||
@ -29,10 +30,13 @@
|
||||
#include "../jrd/exe_proto.h"
|
||||
#include "../jrd/par_proto.h"
|
||||
#include "../jrd/tra_proto.h"
|
||||
#include "../dsql/ddl_proto.h"
|
||||
#include "../jrd/vio_proto.h"
|
||||
#include "../dsql/gen_proto.h"
|
||||
#include "../dsql/make_proto.h"
|
||||
#include "../dsql/pass1_proto.h"
|
||||
|
||||
using namespace Firebird;
|
||||
using namespace Jrd;
|
||||
|
||||
#include "gen/blrtable.h"
|
||||
@ -65,7 +69,7 @@ DmlNode* DmlNode::pass2(thread_db* tdbb, CompilerScratch* csb, jrd_nod* aNode)
|
||||
//--------------------
|
||||
|
||||
|
||||
RegisterNode<InAutonomousTransactionNode> regInAutonomousTransactionNode(blr_auto_trans);
|
||||
static RegisterNode<InAutonomousTransactionNode> regInAutonomousTransactionNode(blr_auto_trans);
|
||||
|
||||
|
||||
DmlNode* InAutonomousTransactionNode::parse(thread_db* tdbb, MemoryPool& pool,
|
||||
@ -82,7 +86,7 @@ DmlNode* InAutonomousTransactionNode::parse(thread_db* tdbb, MemoryPool& pool,
|
||||
}
|
||||
|
||||
|
||||
InAutonomousTransactionNode* InAutonomousTransactionNode::dsqlPass()
|
||||
InAutonomousTransactionNode* InAutonomousTransactionNode::internalDsqlPass()
|
||||
{
|
||||
const bool autoTrans = compiledStatement->req_flags & REQ_in_auto_trans_block;
|
||||
compiledStatement->req_flags |= REQ_in_auto_trans_block;
|
||||
@ -98,8 +102,7 @@ InAutonomousTransactionNode* InAutonomousTransactionNode::dsqlPass()
|
||||
}
|
||||
|
||||
|
||||
void InAutonomousTransactionNode::print(Firebird::string& text,
|
||||
Firebird::Array<dsql_nod*>& nodes) const
|
||||
void InAutonomousTransactionNode::print(string& text, Array<dsql_nod*>& nodes) const
|
||||
{
|
||||
text = "in autonomous transaction";
|
||||
nodes.add(dsqlAction);
|
||||
@ -176,14 +179,14 @@ jrd_nod* InAutonomousTransactionNode::execute(thread_db* tdbb, jrd_req* request)
|
||||
}
|
||||
|
||||
{ // scope
|
||||
Firebird::AutoSetRestore2<jrd_req*, thread_db> autoNullifyRequest(
|
||||
AutoSetRestore2<jrd_req*, thread_db> autoNullifyRequest(
|
||||
tdbb, &thread_db::getRequest, &thread_db::setRequest, NULL);
|
||||
TRA_commit(tdbb, transaction, false);
|
||||
} // end scope
|
||||
break;
|
||||
|
||||
case jrd_req::req_unwind:
|
||||
if (request->req_flags & req_leave)
|
||||
if (request->req_flags & (req_leave | req_continue_loop))
|
||||
{
|
||||
try
|
||||
{
|
||||
@ -201,13 +204,13 @@ jrd_nod* InAutonomousTransactionNode::execute(thread_db* tdbb, jrd_req* request)
|
||||
VIO_verb_cleanup(tdbb, transaction);
|
||||
}
|
||||
|
||||
Firebird::AutoSetRestore2<jrd_req*, thread_db> autoNullifyRequest(
|
||||
AutoSetRestore2<jrd_req*, thread_db> autoNullifyRequest(
|
||||
tdbb, &thread_db::getRequest, &thread_db::setRequest, NULL);
|
||||
TRA_commit(tdbb, transaction, false);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
request->req_flags &= ~req_leave;
|
||||
request->req_flags &= ~(req_leave | req_continue_loop);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
@ -223,7 +226,7 @@ jrd_nod* InAutonomousTransactionNode::execute(thread_db* tdbb, jrd_req* request)
|
||||
EXE_execute_db_triggers(tdbb, transaction,
|
||||
jrd_req::req_trigger_trans_rollback);
|
||||
}
|
||||
catch (const Firebird::Exception&)
|
||||
catch (const Exception&)
|
||||
{
|
||||
if (tdbb->getDatabase()->dbb_flags & DBB_bugcheck)
|
||||
{
|
||||
@ -234,7 +237,7 @@ jrd_nod* InAutonomousTransactionNode::execute(thread_db* tdbb, jrd_req* request)
|
||||
|
||||
try
|
||||
{
|
||||
Firebird::AutoSetRestore2<jrd_req*, thread_db> autoNullifyRequest(
|
||||
AutoSetRestore2<jrd_req*, thread_db> autoNullifyRequest(
|
||||
tdbb, &thread_db::getRequest, &thread_db::setRequest, NULL);
|
||||
|
||||
// undo all savepoints up to our one
|
||||
@ -248,7 +251,7 @@ jrd_nod* InAutonomousTransactionNode::execute(thread_db* tdbb, jrd_req* request)
|
||||
|
||||
TRA_rollback(tdbb, transaction, false, false);
|
||||
}
|
||||
catch (const Firebird::Exception&)
|
||||
catch (const Exception&)
|
||||
{
|
||||
if (tdbb->getDatabase()->dbb_flags & DBB_bugcheck)
|
||||
{
|
||||
@ -269,4 +272,283 @@ jrd_nod* InAutonomousTransactionNode::execute(thread_db* tdbb, jrd_req* request)
|
||||
}
|
||||
|
||||
|
||||
//--------------------
|
||||
|
||||
|
||||
ExecBlockNode* ExecBlockNode::internalDsqlPass()
|
||||
{
|
||||
compiledStatement->blockNode = this;
|
||||
|
||||
if (legacyReturns && legacyReturns->nod_count)
|
||||
compiledStatement->req_type = REQ_SELECT_BLOCK;
|
||||
else
|
||||
compiledStatement->req_type = REQ_EXEC_BLOCK;
|
||||
compiledStatement->req_flags |= REQ_block;
|
||||
|
||||
ExecBlockNode* node = FB_NEW(getPool()) ExecBlockNode(getPool());
|
||||
node->compiledStatement = compiledStatement;
|
||||
|
||||
node->legacyParameters = PASS1_node_psql(compiledStatement, legacyParameters, false);
|
||||
node->legacyReturns = legacyReturns;
|
||||
|
||||
node->localDeclList = localDeclList;
|
||||
node->body = body;
|
||||
|
||||
const size_t count = node->legacyParameters ? node->legacyParameters->nod_count : 0 +
|
||||
node->legacyReturns ? node->legacyReturns->nod_count : 0 +
|
||||
node->localDeclList ? node->localDeclList->nod_count : 0;
|
||||
|
||||
if (count)
|
||||
{
|
||||
StrArray names(*getDefaultMemoryPool(), count);
|
||||
|
||||
PASS1_check_unique_fields_names(names, node->legacyParameters);
|
||||
PASS1_check_unique_fields_names(names, node->legacyReturns);
|
||||
PASS1_check_unique_fields_names(names, node->localDeclList);
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
|
||||
void ExecBlockNode::print(string& text, Array<dsql_nod*>& nodes) const
|
||||
{
|
||||
text = "execute block";
|
||||
nodes.add(legacyParameters);
|
||||
nodes.add(legacyReturns);
|
||||
nodes.add(localDeclList);
|
||||
nodes.add(body);
|
||||
}
|
||||
|
||||
|
||||
void ExecBlockNode::genBlr()
|
||||
{
|
||||
// Update blockNode, because we have a reference to the original unprocessed node.
|
||||
compiledStatement->blockNode = this;
|
||||
|
||||
compiledStatement->begin_debug();
|
||||
|
||||
SSHORT inputs = 0, outputs = 0, locals = 0;
|
||||
dsql_nod* parameters;
|
||||
|
||||
// now do the input parameters
|
||||
if (parameters = legacyParameters)
|
||||
{
|
||||
SSHORT position = 0;
|
||||
|
||||
dsql_nod** ptr = parameters->nod_arg;
|
||||
for (const dsql_nod* const* const end = ptr + parameters->nod_count; ptr < end; ptr++)
|
||||
{
|
||||
dsql_nod* parameter = (*ptr)->nod_arg[Dsql::e_prm_val_fld];
|
||||
dsql_fld* field = (dsql_fld*) parameter->nod_arg[Dsql::e_dfl_field];
|
||||
// parameter = (*ptr)->nod_arg[Dsql::e_prm_val_val]; USELESS
|
||||
|
||||
DDL_resolve_intl_type(compiledStatement, field,
|
||||
reinterpret_cast<const dsql_str*>(parameter->nod_arg[Dsql::e_dfl_collate]));
|
||||
|
||||
*ptr = MAKE_variable(field, field->fld_name.c_str(), VAR_input, 0,
|
||||
(USHORT) (2 * position), locals);
|
||||
// ASF: do not increment locals here - CORE-2341
|
||||
position++;
|
||||
}
|
||||
inputs = position;
|
||||
}
|
||||
|
||||
// now do the output parameters
|
||||
if (parameters = legacyReturns)
|
||||
{
|
||||
SSHORT position = 0;
|
||||
dsql_nod** ptr = parameters->nod_arg;
|
||||
for (const dsql_nod* const* const end = ptr + parameters->nod_count; ptr < end; ++ptr)
|
||||
{
|
||||
dsql_fld* field = (dsql_fld*) (*ptr)->nod_arg[Dsql::e_dfl_field];
|
||||
|
||||
DDL_resolve_intl_type(compiledStatement, field,
|
||||
reinterpret_cast<const dsql_str*>((*ptr)->nod_arg[Dsql::e_dfl_collate]));
|
||||
|
||||
*ptr = MAKE_variable(field, field->fld_name.c_str(), VAR_output, 1,
|
||||
(USHORT) (2 * position), locals++);
|
||||
position++;
|
||||
}
|
||||
outputs = position;
|
||||
}
|
||||
|
||||
compiledStatement->append_uchar(blr_begin);
|
||||
|
||||
if (inputs) {
|
||||
compiledStatement->req_send->msg_parameters =
|
||||
revertParametersOrder(compiledStatement->req_send->msg_parameters, NULL);
|
||||
GEN_port(compiledStatement, compiledStatement->req_send);
|
||||
}
|
||||
else
|
||||
compiledStatement->req_send = NULL;
|
||||
|
||||
if (outputs)
|
||||
{
|
||||
SSHORT position = 0;
|
||||
parameters = legacyReturns;
|
||||
|
||||
dsql_nod** ptr = parameters->nod_arg;
|
||||
for (const dsql_nod* const* const end = ptr + parameters->nod_count; ptr < end; ptr++)
|
||||
{
|
||||
dsql_par* param = MAKE_parameter(compiledStatement->req_receive, true, true, ++position, *ptr);
|
||||
param->par_node = *ptr;
|
||||
MAKE_desc(compiledStatement, ¶m->par_desc, *ptr, NULL);
|
||||
param->par_desc.dsc_flags |= DSC_nullable;
|
||||
}
|
||||
}
|
||||
|
||||
// Set up parameter to handle EOF
|
||||
dsql_par* param = MAKE_parameter(compiledStatement->req_receive, false, false, 0, NULL);
|
||||
compiledStatement->req_eof = param;
|
||||
param->par_desc.dsc_dtype = dtype_short;
|
||||
param->par_desc.dsc_scale = 0;
|
||||
param->par_desc.dsc_length = sizeof(SSHORT);
|
||||
|
||||
compiledStatement->req_receive->msg_parameters =
|
||||
revertParametersOrder(compiledStatement->req_receive->msg_parameters, NULL);
|
||||
GEN_port(compiledStatement, compiledStatement->req_receive);
|
||||
|
||||
if (inputs) {
|
||||
compiledStatement->append_uchar(blr_receive);
|
||||
compiledStatement->append_uchar(0);
|
||||
}
|
||||
|
||||
compiledStatement->append_uchar(blr_begin);
|
||||
|
||||
if (parameters = legacyParameters)
|
||||
{
|
||||
dsql_nod** ptr = parameters->nod_arg;
|
||||
for (const dsql_nod* const* const end = ptr + parameters->nod_count; ptr < end; ptr++)
|
||||
{
|
||||
const dsql_nod* parameter = *ptr;
|
||||
const dsql_var* variable = (dsql_var*) parameter->nod_arg[Dsql::e_var_variable];
|
||||
const dsql_fld* field = variable->var_field;
|
||||
|
||||
if (field->fld_full_domain || field->fld_not_nullable)
|
||||
{
|
||||
// ASF: Validation of execute block input parameters is different than procedure
|
||||
// parameters, because we can't generate messages using the domains due to the
|
||||
// connection charset influence. So to validate, we cast them and assign to null.
|
||||
compiledStatement->append_uchar(blr_assignment);
|
||||
compiledStatement->append_uchar(blr_cast);
|
||||
DDL_put_field_dtype(compiledStatement, field, true);
|
||||
compiledStatement->append_uchar(blr_parameter2);
|
||||
compiledStatement->append_uchar(0);
|
||||
compiledStatement->append_ushort(variable->var_msg_item);
|
||||
compiledStatement->append_ushort(variable->var_msg_item + 1);
|
||||
compiledStatement->append_uchar(blr_null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (outputs)
|
||||
{
|
||||
parameters = legacyReturns;
|
||||
dsql_nod** ptr = parameters->nod_arg;
|
||||
for (const dsql_nod* const* const end = ptr + parameters->nod_count; ptr < end; ptr++)
|
||||
{
|
||||
dsql_nod* parameter = *ptr;
|
||||
dsql_var* variable = (dsql_var*) parameter->nod_arg[Dsql::e_var_variable];
|
||||
DDL_put_local_variable(compiledStatement, variable, 0, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
compiledStatement->setPsql(true);
|
||||
|
||||
DDL_put_local_variables(compiledStatement, localDeclList, locals);
|
||||
|
||||
compiledStatement->req_loop_level = 0;
|
||||
|
||||
dsql_nod* stmtNode = PASS1_statement(compiledStatement, body);
|
||||
GEN_hidden_variables(compiledStatement, false);
|
||||
|
||||
compiledStatement->append_uchar(blr_stall);
|
||||
// Put a label before body of procedure, so that
|
||||
// any exit statement can get out
|
||||
compiledStatement->append_uchar(blr_label);
|
||||
compiledStatement->append_uchar(0);
|
||||
GEN_statement(compiledStatement, stmtNode);
|
||||
if (outputs)
|
||||
compiledStatement->req_type = REQ_SELECT_BLOCK;
|
||||
else
|
||||
compiledStatement->req_type = REQ_EXEC_BLOCK;
|
||||
compiledStatement->append_uchar(blr_end);
|
||||
GEN_return(compiledStatement, legacyReturns, true);
|
||||
compiledStatement->append_uchar(blr_end);
|
||||
|
||||
compiledStatement->end_debug();
|
||||
}
|
||||
|
||||
|
||||
ExecBlockNode* ExecBlockNode::pass1(thread_db* tdbb, CompilerScratch* csb)
|
||||
{
|
||||
fb_assert(false);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
ExecBlockNode* ExecBlockNode::pass2(thread_db* tdbb, CompilerScratch* csb)
|
||||
{
|
||||
fb_assert(false);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
jrd_nod* ExecBlockNode::execute(thread_db* tdbb, jrd_req* request)
|
||||
{
|
||||
fb_assert(false);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void ExecBlockNode::genReturn()
|
||||
{
|
||||
GEN_return(compiledStatement, legacyReturns, false);
|
||||
}
|
||||
|
||||
|
||||
dsql_nod* ExecBlockNode::resolveVariable(const dsql_str* varName)
|
||||
{
|
||||
// try to resolve variable name against input and output parameters and local variables
|
||||
|
||||
dsql_nod* varNode;
|
||||
|
||||
if (localDeclList)
|
||||
{
|
||||
if (varNode = PASS1_resolve_variable_name(localDeclList, varName))
|
||||
return varNode;
|
||||
}
|
||||
|
||||
if (legacyParameters)
|
||||
{
|
||||
if (varNode = PASS1_resolve_variable_name(legacyParameters, varName))
|
||||
return varNode;
|
||||
}
|
||||
|
||||
if (legacyReturns)
|
||||
{
|
||||
if (varNode = PASS1_resolve_variable_name(legacyReturns, varName))
|
||||
return varNode;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
// Revert parameters order for EXECUTE BLOCK statement
|
||||
dsql_par* ExecBlockNode::revertParametersOrder(dsql_par* parameter, dsql_par* prev)
|
||||
{
|
||||
dsql_par* result;
|
||||
|
||||
if (parameter->par_next)
|
||||
result = revertParametersOrder(parameter->par_next, parameter);
|
||||
else
|
||||
result = parameter;
|
||||
parameter->par_next = prev;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
} // namespace Jrd
|
||||
|
@ -44,7 +44,7 @@ public:
|
||||
static DmlNode* parse(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb);
|
||||
|
||||
protected:
|
||||
virtual InAutonomousTransactionNode* dsqlPass();
|
||||
virtual InAutonomousTransactionNode* internalDsqlPass();
|
||||
|
||||
public:
|
||||
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
||||
@ -60,6 +60,43 @@ public:
|
||||
};
|
||||
|
||||
|
||||
class ExecBlockNode : public StmtNode, public BlockNode
|
||||
{
|
||||
public:
|
||||
explicit ExecBlockNode(MemoryPool& pool)
|
||||
: StmtNode(pool),
|
||||
legacyParameters(NULL),
|
||||
legacyReturns(NULL),
|
||||
localDeclList(NULL),
|
||||
body(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual ExecBlockNode* internalDsqlPass();
|
||||
|
||||
public:
|
||||
virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const;
|
||||
virtual void genBlr();
|
||||
virtual ExecBlockNode* pass1(thread_db* tdbb, CompilerScratch* csb);
|
||||
virtual ExecBlockNode* pass2(thread_db* tdbb, CompilerScratch* csb);
|
||||
virtual jrd_nod* execute(thread_db* tdbb, jrd_req* request);
|
||||
|
||||
public:
|
||||
virtual void genReturn();
|
||||
virtual dsql_nod* resolveVariable(const dsql_str* varName);
|
||||
|
||||
private:
|
||||
static dsql_par* revertParametersOrder(dsql_par* parameter, dsql_par* prev);
|
||||
|
||||
public:
|
||||
dsql_nod* legacyParameters;
|
||||
dsql_nod* legacyReturns;
|
||||
dsql_nod* localDeclList;
|
||||
dsql_nod* body;
|
||||
};
|
||||
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif // DSQL_STMT_NODES_H
|
||||
|
@ -179,19 +179,20 @@ ISC_STATUS API_ROUTINE isc_blob_lookup_desc(ISC_STATUS* status,
|
||||
handle = 0;
|
||||
|
||||
FOR (REQUEST_HANDLE handle TRANSACTION_HANDLE *trans_handle)
|
||||
X IN RDB$PROCEDURE_PARAMETERS CROSS Y IN RDB$FIELDS
|
||||
X IN RDB$PROCEDURE_PARAMETERS
|
||||
CROSS Y IN RDB$FIELDS
|
||||
WITH X.RDB$FIELD_SOURCE EQ Y.RDB$FIELD_NAME AND
|
||||
X.RDB$PROCEDURE_NAME EQ desc->blob_desc_relation_name AND
|
||||
X.RDB$PARAMETER_NAME EQ desc->blob_desc_field_name
|
||||
X.RDB$PROCEDURE_NAME EQ desc->blob_desc_relation_name AND
|
||||
X.RDB$PACKAGE_NAME MISSING AND
|
||||
X.RDB$PARAMETER_NAME EQ desc->blob_desc_field_name
|
||||
flag = true;
|
||||
|
||||
desc->blob_desc_subtype = Y.RDB$FIELD_SUB_TYPE;
|
||||
desc->blob_desc_charset = Y.RDB$CHARACTER_SET_ID;
|
||||
desc->blob_desc_segment_size = Y.RDB$SEGMENT_LENGTH;
|
||||
|
||||
if (global) {
|
||||
if (global)
|
||||
copy_exact_name((UCHAR*) Y.RDB$FIELD_NAME, global, sizeof(Y.RDB$FIELD_NAME));
|
||||
}
|
||||
END_FOR
|
||||
ON_ERROR
|
||||
ISC_STATUS_ARRAY temp_status;
|
||||
|
@ -15,6 +15,11 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "../dsql/Nodes.h"
|
||||
#include "../dsql/DdlNodes.h"
|
||||
#include "../dsql/PackageNodes.h"
|
||||
#include "../dsql/StmtNodes.h"
|
||||
#include "../common/classes/TriState.h"
|
||||
#include "dsql.tab.h"
|
||||
#include "Parser.h"
|
||||
|
||||
|
1044
src/dsql/ddl.cpp
1044
src/dsql/ddl.cpp
File diff suppressed because it is too large
Load Diff
@ -38,13 +38,38 @@ namespace Jrd {
|
||||
class dsql_str;
|
||||
};
|
||||
|
||||
const USHORT blr_dtypes[] = {
|
||||
0,
|
||||
blr_text, // dtype_text
|
||||
blr_cstring, // dtype_cstring
|
||||
blr_varying, // dtype_varying
|
||||
0,
|
||||
0,
|
||||
0, // dtype_packed
|
||||
0, // dtype_byte
|
||||
blr_short, // dtype_short
|
||||
blr_long, // dtype_long
|
||||
blr_quad, // dtype_quad
|
||||
blr_float, // dtype_real
|
||||
blr_double, // dtype_double
|
||||
blr_double, // dtype_d_float
|
||||
blr_sql_date, // dtype_sql_date
|
||||
blr_sql_time, // dtype_sql_time
|
||||
blr_timestamp, // dtype_timestamp
|
||||
blr_blob, // dtype_blob // ASF: CAST use blr_blob2 because blr_blob don't fit in UCHAR
|
||||
blr_short, // dtype_array
|
||||
blr_int64 // dtype_int64
|
||||
};
|
||||
|
||||
void DDL_execute(Jrd::dsql_req*);
|
||||
void DDL_generate(Jrd::CompiledStatement*, Jrd::dsql_nod*);
|
||||
bool DDL_ids(const Jrd::dsql_req*);
|
||||
void DDL_put_field_dtype(Jrd::CompiledStatement*, const Jrd::dsql_fld*, bool);
|
||||
void DDL_resolve_intl_type(Jrd::CompiledStatement*, Jrd::dsql_fld*, const Jrd::dsql_str*);
|
||||
void DDL_resolve_intl_type2(Jrd::CompiledStatement*, Jrd::dsql_fld*, const Jrd::dsql_str*, bool);
|
||||
void DDL_gen_block(Jrd::CompiledStatement*, Jrd::dsql_nod*);
|
||||
|
||||
void DDL_put_local_variable(Jrd::CompiledStatement*, Jrd::dsql_var*, Jrd::dsql_nod*, const Jrd::dsql_str*);
|
||||
void DDL_put_local_variables(Jrd::CompiledStatement*, Jrd::dsql_nod*, SSHORT);
|
||||
|
||||
#endif // DSQL_DDL_PROTO_H
|
||||
|
||||
|
@ -80,7 +80,7 @@ static void close_cursor(thread_db*, dsql_req*);
|
||||
static USHORT convert(SLONG, UCHAR*);
|
||||
static void execute_blob(thread_db*, dsql_req*, USHORT, const UCHAR*, USHORT, const UCHAR*,
|
||||
USHORT, UCHAR*, USHORT, UCHAR*);
|
||||
static void execute_immediate(thread_db*, Attachment*, jrd_tra**,
|
||||
static void execute_immediate(thread_db*, Jrd::Attachment*, jrd_tra**,
|
||||
USHORT, const TEXT*, USHORT,
|
||||
USHORT, const UCHAR*, /*USHORT,*/ USHORT, const UCHAR*,
|
||||
USHORT, UCHAR*, /*USHORT,*/ USHORT, UCHAR*);
|
||||
@ -90,7 +90,7 @@ static SSHORT filter_sub_type(const dsql_nod*);
|
||||
static bool get_indices(SLONG*, const UCHAR**, SLONG*, SCHAR**);
|
||||
static USHORT get_request_info(thread_db*, dsql_req*, SLONG, UCHAR*);
|
||||
static bool get_rsb_item(SLONG*, const UCHAR**, SLONG*, SCHAR**, USHORT*, USHORT*);
|
||||
static dsql_dbb* init(Attachment*);
|
||||
static dsql_dbb* init(Jrd::Attachment*);
|
||||
static void map_in_out(dsql_req*, dsql_msg*, USHORT, const UCHAR*, USHORT, UCHAR*, const UCHAR* = 0);
|
||||
static USHORT parse_blr(USHORT, const UCHAR*, const USHORT, dsql_par*);
|
||||
static dsql_req* prepare(thread_db*, dsql_dbb*, jrd_tra*, USHORT, const TEXT*, USHORT, USHORT);
|
||||
@ -174,7 +174,7 @@ dsql_dbb::~dsql_dbb()
|
||||
@param attachment
|
||||
|
||||
**/
|
||||
dsql_req* DSQL_allocate_statement(thread_db* tdbb, Attachment* attachment)
|
||||
dsql_req* DSQL_allocate_statement(thread_db* tdbb, Jrd::Attachment* attachment)
|
||||
{
|
||||
SET_TDBB(tdbb);
|
||||
|
||||
@ -315,7 +315,7 @@ void DSQL_execute(thread_db* tdbb,
|
||||
|
||||
**/
|
||||
void DSQL_execute_immediate(thread_db* tdbb,
|
||||
Attachment* attachment,
|
||||
Jrd::Attachment* attachment,
|
||||
jrd_tra** tra_handle,
|
||||
USHORT length, const TEXT* string, USHORT dialect,
|
||||
USHORT in_blr_length, const UCHAR* in_blr,
|
||||
@ -473,7 +473,7 @@ ISC_STATUS DSQL_fetch(thread_db* tdbb,
|
||||
dsql_msg* message = (dsql_msg*) request->req_receive;
|
||||
|
||||
// Set up things for tracing this call
|
||||
Attachment* att = request->req_dbb->dbb_attachment;
|
||||
Jrd::Attachment* att = request->req_dbb->dbb_attachment;
|
||||
TraceDSQLFetch trace(att, request);
|
||||
|
||||
// Insure that the blr for the message is parsed, regardless of
|
||||
@ -893,7 +893,7 @@ static void close_cursor(thread_db* tdbb, dsql_req* request)
|
||||
{
|
||||
SET_TDBB(tdbb);
|
||||
|
||||
Attachment* attachment = request->req_dbb->dbb_attachment;
|
||||
Jrd::Attachment* attachment = request->req_dbb->dbb_attachment;
|
||||
if (request->req_request)
|
||||
{
|
||||
ThreadStatusGuard status_vector(tdbb);
|
||||
@ -1081,7 +1081,7 @@ static void execute_blob(thread_db* tdbb,
|
||||
|
||||
**/
|
||||
static void execute_immediate(thread_db* tdbb,
|
||||
Attachment* attachment,
|
||||
Jrd::Attachment* attachment,
|
||||
jrd_tra** tra_handle,
|
||||
USHORT length, const TEXT* string, USHORT dialect,
|
||||
USHORT in_blr_length, const UCHAR* in_blr,
|
||||
@ -2055,7 +2055,7 @@ static bool get_rsb_item(SLONG* explain_length_ptr,
|
||||
@param db_handle
|
||||
|
||||
**/
|
||||
static dsql_dbb* init(Attachment* attachment)
|
||||
static dsql_dbb* init(Jrd::Attachment* attachment)
|
||||
{
|
||||
thread_db* tdbb = JRD_get_thread_data();
|
||||
|
||||
@ -2840,7 +2840,7 @@ static void release_request(thread_db* tdbb, dsql_req* request, bool drop)
|
||||
close_cursor(tdbb, request);
|
||||
}
|
||||
|
||||
Attachment* att = request->req_dbb->dbb_attachment;
|
||||
Jrd::Attachment* att = request->req_dbb->dbb_attachment;
|
||||
const bool need_trace_free = request->req_traced && TraceManager::need_dsql_free(att);
|
||||
if (need_trace_free)
|
||||
{
|
||||
|
@ -72,6 +72,7 @@ namespace Jrd
|
||||
class blb;
|
||||
struct bid;
|
||||
|
||||
class BlockNode;
|
||||
class dsql_ctx;
|
||||
class dsql_str;
|
||||
class dsql_nod;
|
||||
@ -103,9 +104,10 @@ class dsql_str : public pool_alloc_rpt<char, dsql_type_str>
|
||||
public:
|
||||
enum Type
|
||||
{
|
||||
TYPE_SIMPLE = 0,
|
||||
TYPE_HEXA,
|
||||
TYPE_DELIMITED
|
||||
TYPE_SIMPLE = 0, // '...'
|
||||
TYPE_ALTERNATE, // q'{...}'
|
||||
TYPE_HEXA, // x'...'
|
||||
TYPE_DELIMITED // "..."
|
||||
};
|
||||
|
||||
public:
|
||||
@ -131,8 +133,10 @@ class dsql_dbb : public pool_alloc<dsql_type_dbb>
|
||||
{
|
||||
public:
|
||||
class dsql_rel* dbb_relations; // known relations in database
|
||||
class dsql_prc* dbb_procedures; // known procedures in database
|
||||
class dsql_udf* dbb_functions; // known functions in database
|
||||
Firebird::GenericMap<Firebird::Pair<Firebird::Left<
|
||||
Firebird::QualifiedName, class dsql_prc*> > > dbb_procedures; // known procedures in database
|
||||
Firebird::GenericMap<Firebird::Pair<Firebird::Left<
|
||||
Firebird::QualifiedName, class dsql_udf*> > > dbb_functions; // known functions in database
|
||||
MemoryPool& dbb_pool; // The current pool for the dbb
|
||||
Database* dbb_database;
|
||||
Attachment* dbb_attachment;
|
||||
@ -149,7 +153,10 @@ public:
|
||||
Firebird::Mutex dbb_cache_mutex; // mutex protecting the DSQL metadata cache
|
||||
|
||||
explicit dsql_dbb(MemoryPool& p) :
|
||||
dbb_pool(p), dbb_charsets_by_id(p, 16)
|
||||
dbb_procedures(p),
|
||||
dbb_functions(p),
|
||||
dbb_pool(p),
|
||||
dbb_charsets_by_id(p, 16)
|
||||
{}
|
||||
|
||||
~dsql_dbb();
|
||||
@ -268,17 +275,16 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
dsql_prc* prc_next; // Next relation in database
|
||||
dsql_sym* prc_symbol; // Hash symbol for procedure
|
||||
dsql_fld* prc_inputs; // Input parameters
|
||||
dsql_fld* prc_outputs; // Output parameters
|
||||
Firebird::MetaName prc_name; // Name of procedure
|
||||
Firebird::QualifiedName prc_name; // Name of procedure
|
||||
Firebird::MetaName prc_owner; // Owner of procedure
|
||||
SSHORT prc_in_count;
|
||||
SSHORT prc_def_count; // number of inputs with default values
|
||||
SSHORT prc_out_count;
|
||||
USHORT prc_id; // Procedure id
|
||||
USHORT prc_flags;
|
||||
bool prc_private; // Packaged private procedure
|
||||
};
|
||||
|
||||
// prc_flags bits
|
||||
@ -297,8 +303,6 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
dsql_udf* udf_next;
|
||||
dsql_sym* udf_symbol; // Hash symbol for udf
|
||||
USHORT udf_dtype;
|
||||
SSHORT udf_scale;
|
||||
SSHORT udf_sub_type;
|
||||
@ -306,8 +310,9 @@ public:
|
||||
SSHORT udf_character_set_id;
|
||||
//USHORT udf_character_length;
|
||||
USHORT udf_flags;
|
||||
Firebird::MetaName udf_name;
|
||||
Firebird::QualifiedName udf_name;
|
||||
Firebird::Array<dsc> udf_arguments;
|
||||
bool udf_private; // Packaged private function
|
||||
};
|
||||
|
||||
// udf_flags bits
|
||||
@ -397,6 +402,7 @@ public:
|
||||
dsql_dbb* req_dbb; // DSQL attachment
|
||||
jrd_tra* req_transaction; // JRD transaction
|
||||
dsql_nod* req_ddl_node; // Store metadata request
|
||||
BlockNode* blockNode;
|
||||
class dsql_blb* req_blob; // Blob info for blob requests
|
||||
jrd_req* req_request; // JRD request
|
||||
//dsql_str* req_blr_string; // String block during BLR generation
|
||||
@ -451,6 +457,7 @@ public:
|
||||
req_labels(p),
|
||||
req_cursors(p),
|
||||
req_hidden_vars(p),
|
||||
req_package(p),
|
||||
req_curr_ctes(p),
|
||||
req_ctes(p),
|
||||
req_cte_aliases(p)
|
||||
@ -544,7 +551,6 @@ public:
|
||||
psql = value;
|
||||
}
|
||||
|
||||
dsql_nod* req_blk_node; // exec_block node
|
||||
dsql_rel* req_relation; // relation created by this request (for DDL)
|
||||
dsql_prc* req_procedure; // procedure created by this request (for DDL)
|
||||
Firebird::HalfStaticArray<BLOB_PTR, 128> req_debug_data;
|
||||
@ -573,6 +579,7 @@ public:
|
||||
dsql_str* req_alias_relation_prefix; // prefix for every relation-alias.
|
||||
DsqlNodStack req_hidden_vars; // hidden variables
|
||||
USHORT req_hidden_vars_number; // next hidden variable number
|
||||
Firebird::MetaName req_package; // package being defined
|
||||
|
||||
DsqlNodStack req_curr_ctes; // current processing CTE's
|
||||
class dsql_ctx* req_recursive_ctx; // context of recursive CTE
|
||||
@ -793,9 +800,24 @@ enum
|
||||
{
|
||||
ddl_database, ddl_domain, ddl_relation, ddl_view, ddl_procedure, ddl_trigger,
|
||||
ddl_udf, ddl_blob_filter, ddl_exception, ddl_generator, ddl_index, ddl_role,
|
||||
ddl_charset, ddl_collation//, ddl_sec_class
|
||||
ddl_charset, ddl_collation, ddl_package//, ddl_sec_class
|
||||
};
|
||||
|
||||
class CStrCmp
|
||||
{
|
||||
public:
|
||||
static int greaterThan(const char* s1, const char* s2)
|
||||
{
|
||||
return strcmp(s1, s2) > 0;
|
||||
}
|
||||
};
|
||||
|
||||
typedef Firebird::SortedArray<const char*,
|
||||
Firebird::EmptyStorage<const char*>, const char*,
|
||||
Firebird::DefaultKeyValue<const char*>,
|
||||
CStrCmp>
|
||||
StrArray;
|
||||
|
||||
} // namespace
|
||||
|
||||
// macros for error generation
|
||||
|
122
src/dsql/gen.cpp
122
src/dsql/gen.cpp
@ -38,6 +38,7 @@
|
||||
#include <stdio.h>
|
||||
#include "../dsql/dsql.h"
|
||||
#include "../dsql/node.h"
|
||||
#include "../dsql/DdlNodes.h"
|
||||
#include "../dsql/StmtNodes.h"
|
||||
#include "../jrd/ibase.h"
|
||||
#include "../jrd/align.h"
|
||||
@ -92,7 +93,6 @@ static void stuff_context(CompiledStatement*, const dsql_ctx*);
|
||||
static void stuff_cstring(CompiledStatement*, const char*);
|
||||
static void stuff_meta_string(CompiledStatement*, const char*);
|
||||
static void stuff_string(CompiledStatement*, const char*, int);
|
||||
static void stuff_string(CompiledStatement* statement, const Firebird::MetaName& name);
|
||||
static void stuff_word(CompiledStatement*, USHORT);
|
||||
|
||||
// STUFF is defined in dsql.h for use in common with ddl.c
|
||||
@ -360,6 +360,10 @@ void GEN_expr(CompiledStatement* statement, dsql_nod* node)
|
||||
blr_operator = blr_agg_max;
|
||||
break;
|
||||
|
||||
case nod_window:
|
||||
GEN_expr(statement, node->nod_arg[0]);
|
||||
return;
|
||||
|
||||
case nod_agg_average:
|
||||
blr_operator = (node->nod_flags & NOD_AGG_DISTINCT) ?
|
||||
blr_agg_average_distinct : blr_agg_average;
|
||||
@ -708,7 +712,7 @@ void GEN_expr(CompiledStatement* statement, dsql_nod* node)
|
||||
void GEN_port(CompiledStatement* statement, dsql_msg* message)
|
||||
{
|
||||
thread_db* tdbb = JRD_get_thread_data();
|
||||
Attachment* att = tdbb->getAttachment();
|
||||
Jrd::Attachment* att = tdbb->getAttachment();
|
||||
|
||||
// if (statement->req_blr_string) {
|
||||
stuff(statement, blr_message);
|
||||
@ -726,10 +730,10 @@ void GEN_port(CompiledStatement* statement, dsql_msg* message)
|
||||
|
||||
const USHORT fromCharSet = parameter->par_desc.getCharSet();
|
||||
const USHORT toCharSet = (fromCharSet == CS_NONE || fromCharSet == CS_BINARY) ?
|
||||
fromCharSet : att->att_charset;
|
||||
fromCharSet : tdbb->getCharSet();
|
||||
|
||||
if (parameter->par_desc.dsc_dtype <= dtype_any_text &&
|
||||
att->att_charset != CS_NONE && att->att_charset != CS_BINARY)
|
||||
tdbb->getCharSet() != CS_NONE && tdbb->getCharSet() != CS_BINARY)
|
||||
{
|
||||
USHORT adjust = 0;
|
||||
if (parameter->par_desc.dsc_dtype == dtype_varying)
|
||||
@ -754,7 +758,7 @@ void GEN_port(CompiledStatement* statement, dsql_msg* message)
|
||||
statement->req_dbb->dbb_minor_version) >= ODS_11_1 &&
|
||||
parameter->par_desc.dsc_dtype == dtype_blob &&
|
||||
parameter->par_desc.dsc_sub_type == isc_blob_text &&
|
||||
att->att_charset != CS_NONE && att->att_charset != CS_BINARY)
|
||||
tdbb->getCharSet() != CS_NONE && tdbb->getCharSet() != CS_BINARY)
|
||||
{
|
||||
if (fromCharSet != toCharSet)
|
||||
parameter->par_desc.setTextType(toCharSet);
|
||||
@ -1093,13 +1097,12 @@ void GEN_statement( CompiledStatement* statement, dsql_nod* node)
|
||||
stuff(statement, blr_end);
|
||||
return;
|
||||
|
||||
case nod_exec_block:
|
||||
DDL_gen_block(statement, node);
|
||||
return;
|
||||
|
||||
case nod_class_node:
|
||||
reinterpret_cast<StmtNode*>(node->nod_arg[0])->genBlr();
|
||||
{
|
||||
StmtNode* stmtNode = reinterpret_cast<StmtNode*>(node->nod_arg[0]);
|
||||
stmtNode->genBlr();
|
||||
return;
|
||||
}
|
||||
|
||||
case nod_for_select:
|
||||
gen_for_select(statement, node);
|
||||
@ -1198,13 +1201,8 @@ void GEN_statement( CompiledStatement* statement, dsql_nod* node)
|
||||
return;
|
||||
|
||||
case nod_return:
|
||||
if ( (temp = node->nod_arg[e_rtn_procedure]) )
|
||||
{
|
||||
if (temp->nod_type == nod_exec_block)
|
||||
GEN_return(statement, temp->nod_arg[e_exe_blk_outputs], false);
|
||||
else
|
||||
GEN_return(statement, temp->nod_arg[e_prc_outputs], false);
|
||||
}
|
||||
if (node->nod_arg[e_rtn_procedure])
|
||||
((BlockNode*) node->nod_arg[e_rtn_procedure])->genReturn();
|
||||
return;
|
||||
|
||||
case nod_exit:
|
||||
@ -1214,7 +1212,12 @@ void GEN_statement( CompiledStatement* statement, dsql_nod* node)
|
||||
|
||||
case nod_breakleave:
|
||||
stuff(statement, blr_leave);
|
||||
stuff(statement, (int) (IPTR) node->nod_arg[e_breakleave_label]->nod_arg[e_label_number]);
|
||||
stuff(statement, (int)(IPTR) node->nod_arg[e_breakleave_label]->nod_arg[e_label_number]);
|
||||
return;
|
||||
|
||||
case nod_continue:
|
||||
stuff(statement, blr_continue_loop);
|
||||
stuff(statement, (int)(IPTR) node->nod_arg[e_continue_label]->nod_arg[e_label_number]);
|
||||
return;
|
||||
|
||||
case nod_abort:
|
||||
@ -1400,26 +1403,35 @@ void GEN_statement( CompiledStatement* statement, dsql_nod* node)
|
||||
**/
|
||||
static void gen_aggregate( CompiledStatement* statement, const dsql_nod* node)
|
||||
{
|
||||
const dsql_ctx* context = (dsql_ctx*) node->nod_arg[e_agg_context];
|
||||
stuff(statement, blr_aggregate);
|
||||
dsql_ctx* context = (dsql_ctx*) node->nod_arg[e_agg_context];
|
||||
bool window = (node->nod_flags & NOD_AGG_WINDOW);
|
||||
stuff(statement, (window ? blr_window : blr_aggregate));
|
||||
stuff_context(statement, context);
|
||||
gen_rse(statement, node->nod_arg[e_agg_rse]);
|
||||
|
||||
// Handle GROUP BY clause
|
||||
// Handle PARTITION BY and GROUP BY clause
|
||||
|
||||
stuff(statement, blr_group_by);
|
||||
if (window)
|
||||
{
|
||||
stuff(statement, blr_partition_by);
|
||||
stuff(statement, 0); // partition by expression count
|
||||
}
|
||||
else
|
||||
{
|
||||
stuff(statement, blr_group_by);
|
||||
|
||||
dsql_nod* list = node->nod_arg[e_agg_group];
|
||||
if (list != NULL) {
|
||||
stuff(statement, list->nod_count);
|
||||
dsql_nod** ptr = list->nod_arg;
|
||||
for (const dsql_nod* const* end = ptr + list->nod_count; ptr < end; ptr++)
|
||||
{
|
||||
GEN_expr(statement, *ptr);
|
||||
dsql_nod* list = node->nod_arg[e_agg_group];
|
||||
if (list != NULL) {
|
||||
stuff(statement, list->nod_count);
|
||||
dsql_nod** ptr = list->nod_arg;
|
||||
for (const dsql_nod* const* end = ptr + list->nod_count; ptr < end; ptr++)
|
||||
{
|
||||
GEN_expr(statement, *ptr);
|
||||
}
|
||||
}
|
||||
else
|
||||
stuff(statement, 0);
|
||||
}
|
||||
else
|
||||
stuff(statement, 0);
|
||||
|
||||
// Generate value map
|
||||
|
||||
@ -2297,13 +2309,24 @@ static void gen_relation( CompiledStatement* statement, dsql_ctx* context)
|
||||
}
|
||||
else if (procedure)
|
||||
{
|
||||
if (DDL_ids(statement)) {
|
||||
if (DDL_ids(statement))
|
||||
{
|
||||
stuff(statement, blr_pid);
|
||||
stuff_word(statement, procedure->prc_id);
|
||||
}
|
||||
else {
|
||||
stuff(statement, blr_procedure);
|
||||
stuff_meta_string(statement, procedure->prc_name.c_str());
|
||||
else
|
||||
{
|
||||
if (procedure->prc_name.qualifier.hasData())
|
||||
{
|
||||
stuff(statement, blr_procedure2);
|
||||
stuff_meta_string(statement, procedure->prc_name.qualifier.c_str());
|
||||
stuff_meta_string(statement, procedure->prc_name.identifier.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
stuff(statement, blr_procedure);
|
||||
stuff_meta_string(statement, procedure->prc_name.identifier.c_str());
|
||||
}
|
||||
}
|
||||
stuff_context(statement, context);
|
||||
|
||||
@ -2919,7 +2942,14 @@ static void gen_statement(CompiledStatement* statement, const dsql_nod* node)
|
||||
break;
|
||||
|
||||
case nod_exec_procedure:
|
||||
stuff(statement, blr_exec_proc);
|
||||
if (node->nod_arg[e_exe_package])
|
||||
{
|
||||
stuff(statement, blr_exec_proc2);
|
||||
stuff_meta_string(statement, ((dsql_str*) node->nod_arg[e_exe_package])->str_data);
|
||||
}
|
||||
else
|
||||
stuff(statement, blr_exec_proc);
|
||||
|
||||
name = (dsql_str*) node->nod_arg[e_exe_procedure];
|
||||
stuff_meta_string(statement, name->str_data);
|
||||
|
||||
@ -3054,11 +3084,19 @@ static void gen_table_lock( CompiledStatement* statement, const dsql_nod* tbl_lo
|
||||
static void gen_udf( CompiledStatement* statement, const dsql_nod* node)
|
||||
{
|
||||
const dsql_udf* userFunc = (dsql_udf*) node->nod_arg[0];
|
||||
stuff(statement, blr_function);
|
||||
stuff_string(statement, userFunc->udf_name);
|
||||
|
||||
if (userFunc->udf_name.qualifier.isEmpty())
|
||||
stuff(statement, blr_function);
|
||||
else
|
||||
{
|
||||
stuff(statement, blr_function2);
|
||||
stuff_meta_string(statement, userFunc->udf_name.qualifier.c_str());
|
||||
}
|
||||
|
||||
stuff_meta_string(statement, userFunc->udf_name.identifier.c_str());
|
||||
|
||||
const dsql_nod* list;
|
||||
if ((node->nod_count == 2) && (list = node->nod_arg[1]))
|
||||
if ((node->nod_count == 3) && (list = node->nod_arg[2]))
|
||||
{
|
||||
stuff(statement, list->nod_count);
|
||||
dsql_nod* const* ptr = list->nod_arg;
|
||||
@ -3210,12 +3248,6 @@ static void stuff_string(CompiledStatement* statement, const char* string, int l
|
||||
}
|
||||
|
||||
|
||||
static void stuff_string(CompiledStatement* statement, const Firebird::MetaName& name)
|
||||
{
|
||||
stuff_string(statement, name.c_str(), name.length());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
|
||||
stuff_word
|
||||
|
@ -315,8 +315,6 @@ void HSHD_set_flag(const void* database,
|
||||
switch (type)
|
||||
{
|
||||
case SYM_relation:
|
||||
case SYM_procedure:
|
||||
case SYM_udf:
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
@ -351,20 +349,6 @@ void HSHD_set_flag(const void* database,
|
||||
sym_rel->rel_flags |= flag;
|
||||
break;
|
||||
}
|
||||
|
||||
case SYM_procedure:
|
||||
{
|
||||
dsql_prc* sym_prc = (dsql_prc*) homonym->sym_object;
|
||||
sym_prc->prc_flags |= flag;
|
||||
break;
|
||||
}
|
||||
|
||||
case SYM_udf:
|
||||
{
|
||||
dsql_udf* sym_udf = (dsql_udf*) homonym->sym_object;
|
||||
sym_udf->udf_flags |= flag;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -30,6 +30,11 @@
|
||||
#include <string.h>
|
||||
#endif
|
||||
|
||||
#include "../dsql/Nodes.h"
|
||||
#include "../dsql/DdlNodes.h"
|
||||
#include "../dsql/PackageNodes.h"
|
||||
#include "../dsql/StmtNodes.h"
|
||||
#include "../common/classes/TriState.h"
|
||||
#include "dsql.tab.h"
|
||||
#include "keywords.h"
|
||||
|
||||
@ -92,6 +97,7 @@ static const TOK tokens[] =
|
||||
{BIT_LENGTH, "BIT_LENGTH", 2, false},
|
||||
{BLOB, "BLOB", 1, false},
|
||||
{BLOCK, "BLOCK", 2, true},
|
||||
{BODY, "BODY", 2, true},
|
||||
{BOTH, "BOTH", 2, false},
|
||||
{KW_BREAK, "BREAK", 2, true},
|
||||
{BY, "BY", 1, false},
|
||||
@ -121,6 +127,7 @@ static const TOK tokens[] =
|
||||
{CONNECT, "CONNECT", 2, false},
|
||||
{CONSTRAINT, "CONSTRAINT", 1, false},
|
||||
{CONTAINING, "CONTAINING", 1, false},
|
||||
{CONTINUE, "CONTINUE", 2, true},
|
||||
{COS, "COS", 2, false},
|
||||
{COSH, "COSH", 2, false},
|
||||
{COT, "COT", 2, false},
|
||||
@ -143,6 +150,7 @@ static const TOK tokens[] =
|
||||
{DATEADD, "DATEADD", 2, false},
|
||||
{DATEDIFF, "DATEDIFF", 2, false},
|
||||
{DAY, "DAY", 2, false},
|
||||
{DDL, "DDL", 2, false},
|
||||
{KW_DEC, "DEC", 1, false},
|
||||
{DECIMAL, "DECIMAL", 1, false},
|
||||
{DECLARE, "DECLARE", 1, false},
|
||||
@ -162,6 +170,7 @@ static const TOK tokens[] =
|
||||
{DROP, "DROP", 1, false},
|
||||
{ELSE, "ELSE", 1, false},
|
||||
{END, "END", 1, false},
|
||||
{ENGINE, "ENGINE", 2, false},
|
||||
{ENTRY_POINT, "ENTRY_POINT", 1, false},
|
||||
{ESCAPE, "ESCAPE", 1, false},
|
||||
{EXCEPTION, "EXCEPTION", 1, false},
|
||||
@ -247,6 +256,7 @@ static const TOK tokens[] =
|
||||
{MOD, "MOD", 2, false},
|
||||
{MODULE_NAME, "MODULE_NAME", 1, false},
|
||||
{MONTH, "MONTH", 2, false},
|
||||
{NAME, "NAME", 2, false},
|
||||
{NAMES, "NAMES", 1, false},
|
||||
{NATIONAL, "NATIONAL", 1, false},
|
||||
{NATURAL, "NATURAL", 1, false},
|
||||
@ -269,8 +279,10 @@ static const TOK tokens[] =
|
||||
{OS_NAME, "OS_NAME", 2, false},
|
||||
{OUTER, "OUTER", 1, false},
|
||||
{OUTPUT_TYPE, "OUTPUT_TYPE", 1, false},
|
||||
{OVER, "OVER", 2, false},
|
||||
{OVERFLOW, "OVERFLOW", 1, false},
|
||||
{OVERLAY, "OVERLAY", 2, false},
|
||||
{PACKAGE, "PACKAGE", 2, true},
|
||||
{PAD, "PAD", 2, true},
|
||||
{PAGE, "PAGE", 1, false},
|
||||
{PAGES, "PAGES", 1, false},
|
||||
@ -291,6 +303,8 @@ static const TOK tokens[] =
|
||||
{PROTECTED, "PROTECTED", 1, false},
|
||||
{RAND, "RAND", 2, false},
|
||||
{DB_KEY, "RDB$DB_KEY", 1, false},
|
||||
{RDB_GET_CONTEXT, "RDB$GET_CONTEXT", 2, false},
|
||||
{RDB_SET_CONTEXT, "RDB$SET_CONTEXT", 2, false},
|
||||
{READ, "READ", 1, false},
|
||||
{REAL, "REAL", 1, false},
|
||||
{VERSION, "RECORD_VERSION", 1, false},
|
||||
|
@ -443,6 +443,7 @@ void MAKE_desc(CompiledStatement* statement, dsc* desc, dsql_nod* node, dsql_nod
|
||||
|
||||
case nod_agg_min:
|
||||
case nod_agg_max:
|
||||
case nod_window:
|
||||
MAKE_desc(statement, desc, node->nod_arg[0], null_replacement);
|
||||
desc->dsc_flags = DSC_nullable;
|
||||
return;
|
||||
@ -1804,27 +1805,6 @@ dsql_str* MAKE_tagged_string(const char* strvar, size_t length, const char* char
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
|
||||
MAKE_trigger_type
|
||||
|
||||
@brief Make a trigger type
|
||||
|
||||
|
||||
@param prefix_node
|
||||
@param suffix_node
|
||||
|
||||
**/
|
||||
dsql_nod* MAKE_trigger_type(dsql_nod* prefix_node, dsql_nod* suffix_node)
|
||||
{
|
||||
const SLONG prefix = prefix_node->getSlong();
|
||||
const SLONG suffix = suffix_node->getSlong();
|
||||
delete prefix_node;
|
||||
delete suffix_node;
|
||||
return MAKE_const_slong(prefix + suffix - 1);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
|
||||
MAKE_variable
|
||||
@ -2024,7 +2004,7 @@ static void make_parameter_names(dsql_par* parameter, const dsql_nod* item)
|
||||
case nod_udf:
|
||||
{
|
||||
dsql_udf* userFunc = (dsql_udf*) item->nod_arg[0];
|
||||
name_alias = userFunc->udf_name.c_str();
|
||||
name_alias = userFunc->udf_name.identifier.c_str();
|
||||
break;
|
||||
}
|
||||
case nod_sys_function:
|
||||
@ -2196,7 +2176,7 @@ static void make_parameter_names(dsql_par* parameter, const dsql_nod* item)
|
||||
}
|
||||
else if (context->ctx_procedure)
|
||||
{
|
||||
parameter->par_rel_name = context->ctx_procedure->prc_name.c_str();
|
||||
parameter->par_rel_name = context->ctx_procedure->prc_name.identifier.c_str();
|
||||
parameter->par_owner_name = context->ctx_procedure->prc_owner.c_str();
|
||||
}
|
||||
|
||||
|
@ -71,7 +71,6 @@ Jrd::dsql_par* MAKE_parameter(Jrd::dsql_msg*, bool, bool, USHORT, const Jrd::dsq
|
||||
Jrd::dsql_str* MAKE_string(const char*, int);
|
||||
Jrd::dsql_sym* MAKE_symbol(Jrd::dsql_dbb*, const TEXT*, USHORT, Jrd::sym_type, Jrd::dsql_req*);
|
||||
Jrd::dsql_str* MAKE_tagged_string(const char* str, size_t length, const char* charset);
|
||||
Jrd::dsql_nod* MAKE_trigger_type(Jrd::dsql_nod*, Jrd::dsql_nod*);
|
||||
Jrd::dsql_nod* MAKE_variable(Jrd::dsql_fld*, const TEXT*, const Jrd::dsql_var_type type, USHORT,
|
||||
USHORT, USHORT);
|
||||
|
||||
|
@ -72,7 +72,6 @@ static const UCHAR blr_bpb[] =
|
||||
};
|
||||
|
||||
static void convert_dtype(dsql_fld*, SSHORT);
|
||||
static void free_procedure(dsql_prc*);
|
||||
static void free_relation(dsql_rel*);
|
||||
static void insert_symbol(dsql_sym*);
|
||||
static dsql_sym* lookup_symbol(dsql_dbb*, USHORT, const char*, const SYM_TYPE, USHORT = 0);
|
||||
@ -172,7 +171,7 @@ void METD_drop_collation(dsql_req* request, const dsql_str* name)
|
||||
}
|
||||
|
||||
|
||||
void METD_drop_function(dsql_req* request, const dsql_str* name)
|
||||
void METD_drop_function(dsql_req* request, const dsql_str* name, const MetaName& packageName)
|
||||
{
|
||||
/**************************************
|
||||
*
|
||||
@ -190,25 +189,24 @@ void METD_drop_function(dsql_req* request, const dsql_str* name)
|
||||
* accessing it.
|
||||
*
|
||||
**************************************/
|
||||
thread_db* tdbb = JRD_get_thread_data();
|
||||
|
||||
MutexHolder holder(request);
|
||||
|
||||
// If the symbol wasn't defined, we've got nothing to do
|
||||
QualifiedName metaName(MetaName(name->str_data, name->str_length), packageName);
|
||||
dsql_udf* function;
|
||||
|
||||
dsql_sym* symbol = lookup_symbol(request->req_dbb, name, SYM_udf);
|
||||
|
||||
if (symbol) {
|
||||
dsql_udf* userFunc = (dsql_udf*) symbol->sym_object;
|
||||
userFunc->udf_flags |= UDF_dropped;
|
||||
if (request->req_dbb->dbb_functions.get(metaName, function))
|
||||
{
|
||||
MET_dsql_cache_use(tdbb, SYM_udf, metaName.identifier, metaName.qualifier);
|
||||
function->udf_flags |= UDF_dropped;
|
||||
request->req_dbb->dbb_functions.remove(metaName);
|
||||
}
|
||||
|
||||
// mark other potential candidates as maybe dropped
|
||||
|
||||
HSHD_set_flag(request->req_dbb, name->str_data, name->str_length, SYM_udf, UDF_dropped);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void METD_drop_procedure(dsql_req* request, const dsql_str* name)
|
||||
void METD_drop_procedure(dsql_req* request, const dsql_str* name, const MetaName& packageName)
|
||||
{
|
||||
/**************************************
|
||||
*
|
||||
@ -226,21 +224,19 @@ void METD_drop_procedure(dsql_req* request, const dsql_str* name)
|
||||
* accessing it.
|
||||
*
|
||||
**************************************/
|
||||
thread_db* tdbb = JRD_get_thread_data();
|
||||
|
||||
MutexHolder holder(request);
|
||||
|
||||
// If the symbol wasn't defined, we've got nothing to do
|
||||
QualifiedName metaName(MetaName(name->str_data, name->str_length), packageName);
|
||||
dsql_prc* procedure;
|
||||
|
||||
dsql_sym* symbol = lookup_symbol(request->req_dbb, name, SYM_procedure);
|
||||
|
||||
if (symbol) {
|
||||
dsql_prc* procedure = (dsql_prc*) symbol->sym_object;
|
||||
if (request->req_dbb->dbb_procedures.get(metaName, procedure))
|
||||
{
|
||||
MET_dsql_cache_use(tdbb, SYM_procedure, metaName.identifier, metaName.qualifier);
|
||||
procedure->prc_flags |= PRC_dropped;
|
||||
request->req_dbb->dbb_procedures.remove(metaName);
|
||||
}
|
||||
|
||||
// mark other potential candidates as maybe dropped
|
||||
|
||||
HSHD_set_flag(request->req_dbb, name->str_data, name->str_length, SYM_procedure, PRC_dropped);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -575,7 +571,7 @@ USHORT METD_get_charset_bpc(dsql_req* request, SSHORT charset_id)
|
||||
dsql_dbb* dbb = request->req_dbb;
|
||||
|
||||
if (charset_id == CS_dynamic)
|
||||
charset_id = tdbb->getAttachment()->att_charset;
|
||||
charset_id = tdbb->getCharSet();
|
||||
|
||||
dsql_intlsym* cs_sym = 0;
|
||||
size_t pos = 0;
|
||||
@ -610,10 +606,10 @@ MetaName METD_get_charset_name(dsql_req* request, SSHORT charset_id)
|
||||
**************************************/
|
||||
thread_db* tdbb = JRD_get_thread_data();
|
||||
|
||||
dsql_dbb* dbb = request->req_dbb;
|
||||
dsql_dbb* dbb = request->req_dbb;
|
||||
|
||||
if (charset_id == CS_dynamic)
|
||||
charset_id = tdbb->getAttachment()->att_charset;
|
||||
if (charset_id == CS_dynamic)
|
||||
charset_id = tdbb->getCharSet();
|
||||
|
||||
size_t pos = 0;
|
||||
if (dbb->dbb_charsets_by_id.find(charset_id, pos))
|
||||
@ -907,7 +903,8 @@ bool METD_get_exception(dsql_req* request, const dsql_str* name)
|
||||
}
|
||||
|
||||
|
||||
dsql_udf* METD_get_function(dsql_req* request, const dsql_str* name)
|
||||
dsql_udf* METD_get_function(CompiledStatement* statement, const dsql_str* name,
|
||||
const dsql_str* package)
|
||||
{
|
||||
/**************************************
|
||||
*
|
||||
@ -921,48 +918,69 @@ dsql_udf* METD_get_function(dsql_req* request, const dsql_str* name)
|
||||
*
|
||||
**************************************/
|
||||
thread_db* tdbb = JRD_get_thread_data();
|
||||
dsql_dbb* dbb = statement->req_dbb;
|
||||
QualifiedName metaName(MetaName(name->str_data, name->str_length),
|
||||
(package ? MetaName(package->str_data, package->str_length) : NULL));
|
||||
|
||||
MutexHolder holder(request);
|
||||
MutexHolder holder(statement);
|
||||
|
||||
bool maybeUnqualified = statement->req_package.hasData() && metaName.qualifier.isEmpty();
|
||||
if (maybeUnqualified)
|
||||
metaName.qualifier = statement->req_package;
|
||||
|
||||
// Start by seeing if symbol is already defined
|
||||
|
||||
dsql_sym* symbol = lookup_symbol(request->req_dbb, name, SYM_udf);
|
||||
if (symbol)
|
||||
return (dsql_udf*) symbol->sym_object;
|
||||
dsql_udf* userFunc = NULL;
|
||||
if (dbb->dbb_functions.get(metaName, userFunc))
|
||||
{
|
||||
if (userFunc->udf_private && metaName.qualifier != statement->req_package)
|
||||
return NULL;
|
||||
|
||||
if (MET_dsql_cache_use(tdbb, SYM_udf, metaName.identifier, metaName.qualifier))
|
||||
userFunc->udf_flags |= UDF_dropped;
|
||||
|
||||
return userFunc;
|
||||
}
|
||||
|
||||
// Now see if it is in the database
|
||||
|
||||
validateTransaction(request);
|
||||
validateTransaction(statement);
|
||||
|
||||
dsql_dbb* dbb = request->req_dbb;
|
||||
dsql_udf* userFunc = NULL;
|
||||
USHORT return_arg = 0;
|
||||
|
||||
jrd_req* handle1 = CMP_find_request(tdbb, irq_function, IRQ_REQUESTS);
|
||||
while (!userFunc)
|
||||
{
|
||||
jrd_req* handle1 = CMP_find_request(tdbb, irq_function, IRQ_REQUESTS);
|
||||
|
||||
FOR(REQUEST_HANDLE handle1 TRANSACTION_HANDLE request->req_transaction)
|
||||
X IN RDB$FUNCTIONS WITH
|
||||
X.RDB$FUNCTION_NAME EQ name->str_data
|
||||
FOR(REQUEST_HANDLE handle1 TRANSACTION_HANDLE statement->req_transaction)
|
||||
X IN RDB$FUNCTIONS WITH
|
||||
X.RDB$FUNCTION_NAME EQ name->str_data AND
|
||||
X.RDB$PACKAGE_NAME EQUIV NULLIF(metaName.qualifier.c_str(), '')
|
||||
|
||||
if (!DSQL_REQUEST(irq_function))
|
||||
DSQL_REQUEST(irq_function) = handle1;
|
||||
|
||||
userFunc = FB_NEW(dbb->dbb_pool) dsql_udf(dbb->dbb_pool);
|
||||
userFunc->udf_name = metaName;
|
||||
userFunc->udf_private = !X.RDB$PRIVATE_FLAG.NULL && X.RDB$PRIVATE_FLAG != 0;
|
||||
|
||||
return_arg = X.RDB$RETURN_ARGUMENT;
|
||||
|
||||
END_FOR
|
||||
|
||||
if (!DSQL_REQUEST(irq_function))
|
||||
DSQL_REQUEST(irq_function) = handle1;
|
||||
|
||||
userFunc = FB_NEW(dbb->dbb_pool) dsql_udf(dbb->dbb_pool);
|
||||
// Moved below as still can't say for sure it will be stored.
|
||||
// Following the same logic for MET_get_procedure and MET_get_relation
|
||||
// userFunc->udf_next = dbb->dbb_functions;
|
||||
// dbb->dbb_functions = userFunc;
|
||||
|
||||
userFunc->udf_name = name->str_data;
|
||||
return_arg = X.RDB$RETURN_ARGUMENT;
|
||||
|
||||
END_FOR
|
||||
|
||||
if (!DSQL_REQUEST(irq_function))
|
||||
DSQL_REQUEST(irq_function) = handle1;
|
||||
|
||||
if (!userFunc) {
|
||||
return NULL;
|
||||
if (!userFunc)
|
||||
{
|
||||
if (maybeUnqualified)
|
||||
{
|
||||
maybeUnqualified = false;
|
||||
metaName.qualifier = "";
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// Note: The following two requests differ in the fields which are
|
||||
@ -973,9 +991,10 @@ dsql_udf* METD_get_function(dsql_req* request, const dsql_str* name)
|
||||
|
||||
jrd_req* handle2 = CMP_find_request(tdbb, irq_func_return, IRQ_REQUESTS);
|
||||
|
||||
FOR(REQUEST_HANDLE handle2 TRANSACTION_HANDLE request->req_transaction)
|
||||
FOR(REQUEST_HANDLE handle2 TRANSACTION_HANDLE statement->req_transaction)
|
||||
X IN RDB$FUNCTION_ARGUMENTS WITH
|
||||
X.RDB$FUNCTION_NAME EQ name->str_data
|
||||
X.RDB$FUNCTION_NAME EQ name->str_data AND
|
||||
X.RDB$PACKAGE_NAME EQUIV NULLIF(metaName.qualifier.c_str(), '')
|
||||
SORTED BY X.RDB$ARGUMENT_POSITION
|
||||
|
||||
if (!DSQL_REQUEST(irq_func_return))
|
||||
@ -1059,27 +1078,12 @@ dsql_udf* METD_get_function(dsql_req* request, const dsql_str* name)
|
||||
else if (userFunc->udf_dtype == dtype_varying)
|
||||
userFunc->udf_length += sizeof(USHORT);
|
||||
|
||||
if ((symbol = lookup_symbol(request->req_dbb, name, SYM_udf)))
|
||||
{
|
||||
// Get rid of all the stuff we just read in. Use existing one
|
||||
delete userFunc;
|
||||
return (dsql_udf*) symbol->sym_object;
|
||||
}
|
||||
dbb->dbb_functions.put(userFunc->udf_name, userFunc);
|
||||
|
||||
// Add udf in the front of the list.
|
||||
userFunc->udf_next = dbb->dbb_functions;
|
||||
dbb->dbb_functions = userFunc;
|
||||
if (userFunc->udf_private && metaName.qualifier != statement->req_package)
|
||||
return NULL;
|
||||
|
||||
// Store in the symbol table
|
||||
// The UDF_new_udf flag is not used, so nothing extra to check.
|
||||
|
||||
symbol = userFunc->udf_symbol = FB_NEW_RPT(dbb->dbb_pool, 0) dsql_sym;
|
||||
symbol->sym_object = userFunc;
|
||||
symbol->sym_string = userFunc->udf_name.c_str();
|
||||
symbol->sym_length = userFunc->udf_name.length();
|
||||
symbol->sym_type = SYM_udf;
|
||||
symbol->sym_dbb = dbb;
|
||||
insert_symbol(symbol);
|
||||
MET_dsql_cache_use(tdbb, SYM_udf, userFunc->udf_name.identifier, userFunc->udf_name.qualifier);
|
||||
|
||||
return userFunc;
|
||||
}
|
||||
@ -1133,7 +1137,8 @@ dsql_nod* METD_get_primary_key(dsql_req* request, const dsql_str* relation_name)
|
||||
}
|
||||
|
||||
|
||||
dsql_prc* METD_get_procedure(CompiledStatement* statement, const dsql_str* name)
|
||||
dsql_prc* METD_get_procedure(CompiledStatement* statement, const dsql_str* name,
|
||||
const dsql_str* package)
|
||||
{
|
||||
/**************************************
|
||||
*
|
||||
@ -1150,53 +1155,102 @@ dsql_prc* METD_get_procedure(CompiledStatement* statement, const dsql_str* name)
|
||||
thread_db* tdbb = JRD_get_thread_data();
|
||||
|
||||
dsql_dbb* dbb = statement->req_dbb;
|
||||
QualifiedName metaName(MetaName(name->str_data, name->str_length),
|
||||
(package ? MetaName(package->str_data, package->str_length) : ""));
|
||||
|
||||
// see if the procedure is the one currently being defined in this statement
|
||||
|
||||
dsql_prc* temp = statement->req_procedure;
|
||||
if (temp != NULL && temp->prc_name == name->str_data)
|
||||
{
|
||||
return temp;
|
||||
}
|
||||
// ASF: I've removed the code where we verify if the procedure being looked up is the one being
|
||||
// defined (statement->req_procedure). This code is totally incorrect, not considering
|
||||
// transactions and savepoints, hence being incompatible with packages).
|
||||
// Example (with autocommit off):
|
||||
//
|
||||
// SQL> create procedure p1 as begin end!
|
||||
// SQL> create procedure p2 as begin execute procedure p1; end!
|
||||
// SQL> rollback!
|
||||
// SQL> execute procedure p2!
|
||||
// Statement failed, SQLSTATE = 42000
|
||||
// Dynamic SQL Error
|
||||
// -SQL error code = -204
|
||||
// -Procedure unknown
|
||||
// -P2
|
||||
// SQL> execute procedure p1!
|
||||
// Statement failed, SQLSTATE = 42000
|
||||
// invalid request BLR at offset 5
|
||||
// -procedure P1 is not defined
|
||||
//
|
||||
// The side effect is that this occur in more cases now:
|
||||
//
|
||||
// SQL> create procedure p as begin execute procedure p; execute procedure p2; end!
|
||||
// Statement failed, SQLSTATE = 42000
|
||||
// Dynamic SQL Error
|
||||
// -SQL error code = -204
|
||||
// -Procedure unknown
|
||||
// -P2
|
||||
// SQL> execute procedure p!
|
||||
// Statement failed, SQLSTATE = 42000
|
||||
// invalid request BLR at offset 4
|
||||
// -procedure P is not defined
|
||||
//
|
||||
// I hope for a solution, involving savepoint logic.
|
||||
|
||||
MutexHolder holder(statement);
|
||||
|
||||
bool maybeUnqualified = statement->req_package.hasData() && metaName.qualifier.isEmpty();
|
||||
if (maybeUnqualified)
|
||||
metaName.qualifier = statement->req_package;
|
||||
|
||||
// Start by seeing if symbol is already defined
|
||||
|
||||
dsql_sym* symbol = lookup_symbol(statement->req_dbb, name, SYM_procedure);
|
||||
if (symbol)
|
||||
return (dsql_prc*) symbol->sym_object;
|
||||
dsql_prc* procedure = NULL;
|
||||
if (dbb->dbb_procedures.get(metaName, procedure))
|
||||
{
|
||||
if (procedure->prc_private && metaName.qualifier != statement->req_package)
|
||||
return NULL;
|
||||
|
||||
if (MET_dsql_cache_use(tdbb, SYM_procedure, metaName.identifier, metaName.qualifier))
|
||||
procedure->prc_flags |= PRC_dropped;
|
||||
|
||||
return procedure;
|
||||
}
|
||||
|
||||
// now see if it is in the database
|
||||
|
||||
validateTransaction(statement);
|
||||
|
||||
dsql_prc* procedure = NULL;
|
||||
while (!procedure)
|
||||
{
|
||||
jrd_req* handle1 = CMP_find_request(tdbb, irq_procedure, IRQ_REQUESTS);
|
||||
|
||||
jrd_req* handle1 = CMP_find_request(tdbb, irq_procedure, IRQ_REQUESTS);
|
||||
FOR(REQUEST_HANDLE handle1 TRANSACTION_HANDLE statement->req_transaction)
|
||||
X IN RDB$PROCEDURES
|
||||
WITH X.RDB$PROCEDURE_NAME EQ name->str_data AND
|
||||
X.RDB$PACKAGE_NAME EQUIV NULLIF(metaName.qualifier.c_str(), '')
|
||||
|
||||
FOR(REQUEST_HANDLE handle1 TRANSACTION_HANDLE statement->req_transaction)
|
||||
X IN RDB$PROCEDURES WITH
|
||||
X.RDB$PROCEDURE_NAME EQ name->str_data
|
||||
if (!DSQL_REQUEST(irq_procedure))
|
||||
DSQL_REQUEST(irq_procedure) = handle1;
|
||||
|
||||
fb_utils::exact_name(X.RDB$OWNER_NAME);
|
||||
|
||||
procedure = FB_NEW(dbb->dbb_pool) dsql_prc(dbb->dbb_pool);
|
||||
procedure->prc_id = X.RDB$PROCEDURE_ID;
|
||||
procedure->prc_name = metaName;
|
||||
procedure->prc_owner = X.RDB$OWNER_NAME;
|
||||
procedure->prc_private = !X.RDB$PRIVATE_FLAG.NULL && X.RDB$PRIVATE_FLAG != 0;
|
||||
|
||||
END_FOR
|
||||
|
||||
if (!DSQL_REQUEST(irq_procedure))
|
||||
DSQL_REQUEST(irq_procedure) = handle1;
|
||||
|
||||
fb_utils::exact_name(X.RDB$OWNER_NAME);
|
||||
|
||||
procedure = FB_NEW(dbb->dbb_pool) dsql_prc(dbb->dbb_pool);
|
||||
procedure->prc_id = X.RDB$PROCEDURE_ID;
|
||||
|
||||
procedure->prc_name = name->str_data;
|
||||
procedure->prc_owner = X.RDB$OWNER_NAME;
|
||||
|
||||
END_FOR
|
||||
|
||||
if (!DSQL_REQUEST(irq_procedure))
|
||||
DSQL_REQUEST(irq_procedure) = handle1;
|
||||
|
||||
if (!procedure) {
|
||||
return NULL;
|
||||
if (!procedure)
|
||||
{
|
||||
if (maybeUnqualified)
|
||||
{
|
||||
maybeUnqualified = false;
|
||||
metaName.qualifier = "";
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// Lookup parameter stuff
|
||||
@ -1213,12 +1267,13 @@ dsql_prc* METD_get_procedure(CompiledStatement* statement, const dsql_str* name)
|
||||
|
||||
jrd_req* handle2 = CMP_find_request(tdbb, irq_parameters, IRQ_REQUESTS);
|
||||
|
||||
FOR(REQUEST_HANDLE handle2 TRANSACTION_HANDLE statement->req_transaction)
|
||||
PR IN RDB$PROCEDURE_PARAMETERS CROSS
|
||||
FLD IN RDB$FIELDS
|
||||
WITH FLD.RDB$FIELD_NAME EQ PR.RDB$FIELD_SOURCE
|
||||
AND PR.RDB$PROCEDURE_NAME EQ name->str_data
|
||||
AND PR.RDB$PARAMETER_TYPE = type
|
||||
FOR (REQUEST_HANDLE handle2 TRANSACTION_HANDLE statement->req_transaction)
|
||||
PR IN RDB$PROCEDURE_PARAMETERS
|
||||
CROSS FLD IN RDB$FIELDS
|
||||
WITH FLD.RDB$FIELD_NAME EQ PR.RDB$FIELD_SOURCE AND
|
||||
PR.RDB$PROCEDURE_NAME EQ name->str_data AND
|
||||
PR.RDB$PARAMETER_TYPE = type AND
|
||||
PR.RDB$PACKAGE_NAME EQUIV NULLIF(metaName.qualifier.c_str(), '')
|
||||
SORTED BY DESCENDING PR.RDB$PARAMETER_NUMBER
|
||||
|
||||
if (!DSQL_REQUEST(irq_parameters))
|
||||
@ -1235,9 +1290,12 @@ dsql_prc* METD_get_procedure(CompiledStatement* statement, const dsql_str* name)
|
||||
{
|
||||
jrd_req* handle3 = CMP_find_request(tdbb, irq_parameters2, IRQ_REQUESTS);
|
||||
|
||||
MetaName packageName(PR.RDB$PACKAGE_NAME.NULL ? NULL : PR.RDB$PACKAGE_NAME);
|
||||
|
||||
FOR(REQUEST_HANDLE handle3 TRANSACTION_HANDLE statement->req_transaction)
|
||||
PR2 IN RDB$PROCEDURE_PARAMETERS
|
||||
WITH PR2.RDB$PROCEDURE_NAME EQ PR.RDB$PROCEDURE_NAME AND
|
||||
PR2.RDB$PACKAGE_NAME EQUIV NULLIF(packageName.c_str(), '') AND
|
||||
PR2.RDB$PARAMETER_NAME EQ PR.RDB$PARAMETER_NAME
|
||||
|
||||
if (!DSQL_REQUEST(irq_parameters2))
|
||||
@ -1322,34 +1380,13 @@ dsql_prc* METD_get_procedure(CompiledStatement* statement, const dsql_str* name)
|
||||
}
|
||||
}
|
||||
|
||||
// Since we could give up control due to the THREAD_EXIT and THEAD_ENTER
|
||||
// calls, another thread may have added the same procedure in the mean time
|
||||
dbb->dbb_procedures.put(procedure->prc_name, procedure);
|
||||
|
||||
if ((symbol = lookup_symbol(statement->req_dbb, name, SYM_procedure)))
|
||||
{
|
||||
// Get rid of all the stuff we just read in. Use existing one
|
||||
free_procedure(procedure);
|
||||
return (dsql_prc*) symbol->sym_object;
|
||||
}
|
||||
if (procedure->prc_private && metaName.qualifier != statement->req_package)
|
||||
return NULL;
|
||||
|
||||
// store in the symbol table unless the procedure is not yet committed
|
||||
// CVC: This is strange, because PRC_new_procedure is never set.
|
||||
|
||||
if (!(procedure->prc_flags & PRC_new_procedure))
|
||||
{
|
||||
// add procedure in the front of the list
|
||||
|
||||
procedure->prc_next = dbb->dbb_procedures;
|
||||
dbb->dbb_procedures = procedure;
|
||||
|
||||
symbol = procedure->prc_symbol = FB_NEW_RPT(dbb->dbb_pool, 0) dsql_sym;
|
||||
symbol->sym_object = procedure;
|
||||
symbol->sym_string = procedure->prc_name.c_str();
|
||||
symbol->sym_length = procedure->prc_name.length();
|
||||
symbol->sym_type = SYM_procedure;
|
||||
symbol->sym_dbb = dbb;
|
||||
insert_symbol(symbol);
|
||||
}
|
||||
MET_dsql_cache_use(tdbb, SYM_procedure, procedure->prc_name.identifier,
|
||||
procedure->prc_name.qualifier);
|
||||
|
||||
return procedure;
|
||||
}
|
||||
@ -1911,6 +1948,7 @@ static void convert_dtype(dsql_fld* field, SSHORT field_type)
|
||||
}
|
||||
|
||||
|
||||
#ifdef NOT_USED_OR_REPLACED
|
||||
static void free_procedure(dsql_prc* procedure)
|
||||
{
|
||||
/**************************************
|
||||
@ -1943,6 +1981,7 @@ static void free_procedure(dsql_prc* procedure)
|
||||
|
||||
delete procedure;
|
||||
}
|
||||
#endif // NOT_USED_OR_REPLACED
|
||||
|
||||
|
||||
static void free_relation(dsql_rel* relation)
|
||||
@ -2036,21 +2075,11 @@ static dsql_sym* lookup_symbol(dsql_dbb* dbb, USHORT length, const char* name,
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if (type == SYM_procedure && (procedure = (dsql_prc*) symbol->sym_object) &&
|
||||
!(procedure->prc_flags & PRC_dropped))
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if (type == SYM_relation && (relation = (dsql_rel*) symbol->sym_object) &&
|
||||
!(relation->rel_flags & REL_dropped))
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if (type == SYM_udf && (userFunc = (dsql_udf*) symbol->sym_object) &&
|
||||
!(userFunc->udf_flags & UDF_dropped))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -2067,18 +2096,10 @@ static dsql_sym* lookup_symbol(dsql_dbb* dbb, USHORT length, const char* name,
|
||||
intlSym->intlsym_flags |= INTLSYM_dropped;
|
||||
break;
|
||||
|
||||
case SYM_procedure:
|
||||
procedure->prc_flags |= PRC_dropped;
|
||||
break;
|
||||
|
||||
case SYM_relation:
|
||||
relation->rel_flags |= REL_dropped;
|
||||
break;
|
||||
|
||||
case SYM_udf:
|
||||
userFunc->udf_flags |= UDF_dropped;
|
||||
break;
|
||||
|
||||
default:
|
||||
return symbol;
|
||||
}
|
||||
|
@ -30,11 +30,11 @@
|
||||
#include "../common/classes/MetaName.h"
|
||||
#include "../common/classes/fb_pair.h"
|
||||
|
||||
typedef Firebird::Pair<Firebird::Full<Firebird::MetaName, Firebird::MetaName> > MetaNamePair;
|
||||
typedef Firebird::GenericMap<MetaNamePair> MetaNamePairMap;
|
||||
|
||||
// forward declarations
|
||||
namespace Jrd {
|
||||
typedef Firebird::Pair<Firebird::Full<Firebird::MetaName, Firebird::MetaName> > MetaNamePair;
|
||||
typedef Firebird::GenericMap<MetaNamePair> MetaNamePairMap;
|
||||
|
||||
class dsql_req;
|
||||
class dsql_str;
|
||||
class CompiledStatement;
|
||||
@ -42,8 +42,8 @@ namespace Jrd {
|
||||
|
||||
void METD_drop_charset(Jrd::dsql_req*, const Firebird::MetaName&);
|
||||
void METD_drop_collation(Jrd::dsql_req*, const Jrd::dsql_str*);
|
||||
void METD_drop_function(Jrd::dsql_req*, const Jrd::dsql_str*);
|
||||
void METD_drop_procedure(Jrd::dsql_req*, const Jrd::dsql_str*);
|
||||
void METD_drop_function(Jrd::dsql_req*, const Jrd::dsql_str*, const Firebird::MetaName&);
|
||||
void METD_drop_procedure(Jrd::dsql_req*, const Jrd::dsql_str*, const Firebird::MetaName&);
|
||||
void METD_drop_relation(Jrd::dsql_req*, const Jrd::dsql_str*);
|
||||
|
||||
Jrd::dsql_intlsym* METD_get_charset(Jrd::dsql_req*, USHORT, const char* name); // UTF-8
|
||||
@ -55,15 +55,15 @@ Jrd::dsql_str* METD_get_default_charset(Jrd::dsql_req*);
|
||||
bool METD_get_domain(Jrd::dsql_req*, class Jrd::dsql_fld*, const char* name); // UTF-8
|
||||
USHORT METD_get_domain_default(Jrd::dsql_req*, const TEXT*, bool*, UCHAR*, USHORT);
|
||||
bool METD_get_exception(Jrd::dsql_req*, const Jrd::dsql_str*);
|
||||
Jrd::dsql_udf* METD_get_function(Jrd::dsql_req*, const Jrd::dsql_str*);
|
||||
Jrd::dsql_udf* METD_get_function(Jrd::CompiledStatement*, const Jrd::dsql_str*, const Jrd::dsql_str*);
|
||||
Jrd::dsql_nod* METD_get_primary_key(Jrd::dsql_req*, const Jrd::dsql_str*);
|
||||
Jrd::dsql_prc* METD_get_procedure(Jrd::CompiledStatement*, const Jrd::dsql_str*);
|
||||
Jrd::dsql_prc* METD_get_procedure(Jrd::CompiledStatement*, const Jrd::dsql_str*, const Jrd::dsql_str*);
|
||||
Jrd::dsql_rel* METD_get_relation(Jrd::CompiledStatement*, const Jrd::dsql_str*);
|
||||
bool METD_get_trigger(Jrd::dsql_req*, const Jrd::dsql_str*, Jrd::dsql_str**, USHORT*);
|
||||
bool METD_get_type(Jrd::dsql_req*, const Jrd::dsql_str*, const char*, SSHORT*);
|
||||
Jrd::dsql_rel* METD_get_view_base(Jrd::CompiledStatement* request,
|
||||
const char* view_name, // UTF-8
|
||||
MetaNamePairMap& fields);
|
||||
Jrd::MetaNamePairMap& fields);
|
||||
Jrd::dsql_rel* METD_get_view_relation(Jrd::CompiledStatement* request,
|
||||
const char* view_name, // UTF-8
|
||||
const char* relation_or_alias); // UTF-8
|
||||
|
@ -47,6 +47,9 @@ namespace Dsql {
|
||||
|
||||
enum nod_t
|
||||
{
|
||||
// ASF: 1) These commented numbers are not all correct now;
|
||||
// 2) They are going to continue been deleted;
|
||||
// 3) There is no sense to numerate them.
|
||||
nod_unknown_type = 0,
|
||||
nod_commit = 1, // Commands, not executed.
|
||||
nod_rollback,
|
||||
@ -68,15 +71,6 @@ enum nod_t
|
||||
nod_del_index,
|
||||
nod_def_view,
|
||||
nod_def_constraint, // 20
|
||||
nod_def_trigger,
|
||||
nod_mod_trigger,
|
||||
nod_del_trigger,
|
||||
// nod_def_trigger_msg,
|
||||
// nod_mod_trigger_msg,
|
||||
// nod_del_trigger_msg,
|
||||
nod_def_procedure,
|
||||
nod_mod_procedure,
|
||||
nod_del_procedure,
|
||||
nod_def_exception,
|
||||
nod_mod_exception,
|
||||
nod_del_exception,
|
||||
@ -302,15 +296,12 @@ enum nod_t
|
||||
nod_redef_relation, // allows silent creation/overwriting of a relation.
|
||||
nod_udf_param, // there should be a way to signal a param by descriptor!
|
||||
nod_limit, // limit support
|
||||
nod_redef_procedure, // allows silent creation/overwriting of a procedure.
|
||||
nod_exec_sql, // EXECUTE STATEMENT
|
||||
nod_internal_info, // internal engine info
|
||||
nod_searched_case, // 230 // searched CASE function
|
||||
nod_simple_case, // simple CASE function
|
||||
nod_coalesce, // COALESCE function
|
||||
nod_mod_view, // ALTER VIEW
|
||||
nod_replace_procedure, // CREATE OR ALTER PROCEDURE
|
||||
nod_replace_trigger, // CREATE OR ALTER TRIGGER
|
||||
nod_replace_view, // CREATE OR ALTER VIEW
|
||||
nod_redef_view, // allows silent creation/overwriting of a view
|
||||
nod_for_update, // FOR UPDATE clause
|
||||
@ -330,14 +321,12 @@ enum nod_t
|
||||
nod_cursor_fetch,
|
||||
nod_cursor_close,
|
||||
nod_fetch_seek,
|
||||
nod_exec_block, // EXECUTE BLOCK support
|
||||
nod_param_val, // default value for SP parameters support
|
||||
nod_rows, // ROWS support
|
||||
nod_query_spec,
|
||||
nod_equiv, // IS DISTINCT FROM
|
||||
nod_redef_exception, // RECREATE EXCEPTION
|
||||
nod_replace_exception, // 260 // CREATE OR ALTER EXCEPTION
|
||||
nod_comment,
|
||||
nod_mod_udf,
|
||||
nod_def_collation,
|
||||
nod_del_collation,
|
||||
@ -348,7 +337,6 @@ enum nod_t
|
||||
nod_strlen,
|
||||
nod_trim, // 270
|
||||
nod_returning,
|
||||
nod_redef_trigger,
|
||||
nod_tra_misc,
|
||||
nod_lock_timeout,
|
||||
nod_agg_list,
|
||||
@ -375,8 +363,15 @@ enum nod_t
|
||||
nod_tran_params,
|
||||
nod_named_param,
|
||||
nod_dfl_collate,
|
||||
nod_trg_act,
|
||||
nod_trg_ext,
|
||||
nod_class_node,
|
||||
nod_hidden_var // 300
|
||||
nod_hidden_var, // 300
|
||||
nod_package_name,
|
||||
nod_package_obj,
|
||||
nod_window,
|
||||
nod_mod_field_null_flag,
|
||||
nod_continue
|
||||
};
|
||||
|
||||
/* enumerations of the arguments to a node, offsets
|
||||
@ -520,26 +515,12 @@ enum node_args {
|
||||
e_cur_number,
|
||||
e_cur_count,
|
||||
|
||||
e_prc_name = 0, // nod_procedure
|
||||
e_prc_inputs,
|
||||
e_prc_outputs,
|
||||
e_prc_dcls,
|
||||
e_prc_body,
|
||||
e_prc_source,
|
||||
e_prc_count,
|
||||
|
||||
e_exe_procedure = 0, // nod_exec_procedure
|
||||
e_exe_inputs,
|
||||
e_exe_outputs,
|
||||
e_exe_package,
|
||||
e_exe_count,
|
||||
|
||||
e_exe_blk = 0, // nod_exec_block
|
||||
e_exe_blk_inputs = 0,
|
||||
e_exe_blk_outputs,
|
||||
e_exe_blk_dcls,
|
||||
e_exe_blk_body,
|
||||
e_exe_blk_count,
|
||||
|
||||
e_prm_val_fld = 0,
|
||||
e_prm_val_val,
|
||||
e_prm_val_count,
|
||||
@ -667,6 +648,7 @@ enum node_args {
|
||||
e_rpn_name = 0, // nod_rel_proc_name
|
||||
e_rpn_alias,
|
||||
e_rpn_inputs,
|
||||
e_rpn_package,
|
||||
e_rpn_count,
|
||||
|
||||
e_join_left_rel = 0, // nod_join
|
||||
@ -763,19 +745,6 @@ enum node_args {
|
||||
e_cnstr_source,
|
||||
e_cnstr_count,
|
||||
|
||||
e_trg_name = 0, // nod_mod_trigger and nod_def_trigger
|
||||
e_trg_table,
|
||||
e_trg_active,
|
||||
e_trg_type,
|
||||
e_trg_position,
|
||||
e_trg_actions,
|
||||
e_trg_source,
|
||||
e_trg_count,
|
||||
|
||||
e_trg_act_dcls = 0,
|
||||
e_trg_act_body,
|
||||
e_trg_act_count,
|
||||
|
||||
e_abrt_number = 0, // nod_abort
|
||||
e_abrt_count,
|
||||
|
||||
@ -952,12 +921,6 @@ enum node_args {
|
||||
e_agg_function_scope_level,
|
||||
e_agg_function_count,
|
||||
|
||||
e_comment_obj_type = 0,
|
||||
e_comment_object,
|
||||
e_comment_part,
|
||||
e_comment_string,
|
||||
e_comment_count,
|
||||
|
||||
e_mod_udf_name = 0, // nod_mod_udf
|
||||
e_mod_udf_entry_pt,
|
||||
e_mod_udf_module,
|
||||
@ -1012,7 +975,17 @@ enum node_args {
|
||||
|
||||
e_hidden_var_expr = 0, // nod_hidden_var
|
||||
e_hidden_var_var,
|
||||
e_hidden_var_count
|
||||
e_hidden_var_count,
|
||||
|
||||
e_window_expr = 0,
|
||||
e_window_count,
|
||||
|
||||
e_mod_fld_null_flag_field = 0, // nod_mod_field_null_flag
|
||||
e_mod_fld_null_flag_value,
|
||||
e_mod_fld_null_flag_count,
|
||||
|
||||
e_continue_label = 0, // nod_continue
|
||||
e_continue_count,
|
||||
};
|
||||
|
||||
} // namespace
|
||||
@ -1109,7 +1082,9 @@ enum nod_flags_vals {
|
||||
NOD_TRAN_AUTONOMOUS = 1, // nod_exec_stmt
|
||||
NOD_TRAN_COMMON = 2,
|
||||
NOD_TRAN_2PC = 3,
|
||||
NOD_TRAN_DEFAULT = NOD_TRAN_COMMON
|
||||
NOD_TRAN_DEFAULT = NOD_TRAN_COMMON,
|
||||
|
||||
NOD_AGG_WINDOW = 1 // nod_aggregate
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
2259
src/dsql/parse.y
2259
src/dsql/parse.y
File diff suppressed because it is too large
Load Diff
1072
src/dsql/pass1.cpp
1072
src/dsql/pass1.cpp
File diff suppressed because it is too large
Load Diff
@ -24,8 +24,11 @@
|
||||
#ifndef DSQL_PASS1_PROTO_H
|
||||
#define DSQL_PASS1_PROTO_H
|
||||
|
||||
void PASS1_check_unique_fields_names(Jrd::StrArray& names, const Jrd::dsql_nod* fields);
|
||||
Jrd::dsql_ctx* PASS1_make_context(Jrd::CompiledStatement* statement, const Jrd::dsql_nod* relation_node);
|
||||
Jrd::dsql_nod* PASS1_node(Jrd::CompiledStatement*, Jrd::dsql_nod*);
|
||||
Jrd::dsql_nod* PASS1_node_psql(Jrd::CompiledStatement*, Jrd::dsql_nod*, bool);
|
||||
Jrd::dsql_nod* PASS1_resolve_variable_name(const Jrd::dsql_nod* var_nodes, const Jrd::dsql_str* var_name);
|
||||
Jrd::dsql_nod* PASS1_rse(Jrd::CompiledStatement*, Jrd::dsql_nod*, Jrd::dsql_nod*);
|
||||
Jrd::dsql_nod* PASS1_statement(Jrd::CompiledStatement*, Jrd::dsql_nod*);
|
||||
|
||||
|
@ -2972,7 +2972,7 @@ static void get_triggers( DBB databaseL)
|
||||
trigger->trg_relation = (DUDLEY_REL) rel_name->sym_object;
|
||||
else
|
||||
trigger->trg_relation = (DUDLEY_REL) get_symbol(SYM_relation, T.RDB$RELATION_NAME, NULL);
|
||||
trigger->trg_type = (TRG_T) T.RDB$TRIGGER_TYPE;
|
||||
trigger->trg_type = (TRG_T)(SINT64) T.RDB$TRIGGER_TYPE;
|
||||
trigger->trg_inactive = T.RDB$TRIGGER_INACTIVE;
|
||||
trigger->trg_sequence = T.RDB$TRIGGER_SEQUENCE;
|
||||
END_FOR;
|
||||
|
@ -1354,34 +1354,20 @@ static void extract_triggers()
|
||||
if (T.RDB$TRIGGER_INACTIVE)
|
||||
fprintf(output_file, "\tinactive\n");
|
||||
|
||||
switch (T.RDB$TRIGGER_TYPE) {
|
||||
case trg_store:
|
||||
if (T.RDB$TRIGGER_TYPE == (SSHORT) trg_store)
|
||||
fprintf(output_file, "\tpre store");
|
||||
break;
|
||||
|
||||
case trg_post_store:
|
||||
else if (T.RDB$TRIGGER_TYPE == (SSHORT) trg_post_store)
|
||||
fprintf(output_file, "\tpost store");
|
||||
break;
|
||||
|
||||
case trg_modify:
|
||||
else if (T.RDB$TRIGGER_TYPE == (SSHORT) trg_modify)
|
||||
fprintf(output_file, "\tpre modify");
|
||||
break;
|
||||
|
||||
case trg_post_modify:
|
||||
else if (T.RDB$TRIGGER_TYPE == (SSHORT) trg_post_modify)
|
||||
fprintf(output_file, "\tpost modify");
|
||||
break;
|
||||
|
||||
case trg_pre_erase:
|
||||
else if (T.RDB$TRIGGER_TYPE == (SSHORT) trg_pre_erase)
|
||||
fprintf(output_file, "\tpre erase");
|
||||
break;
|
||||
|
||||
case trg_erase:
|
||||
else if (T.RDB$TRIGGER_TYPE == (SSHORT) trg_erase)
|
||||
fprintf(output_file, "\tpost erase");
|
||||
break;
|
||||
|
||||
default:
|
||||
else
|
||||
put_comment(261); /* msg 261: ***** trigger type not understood **** */
|
||||
}
|
||||
|
||||
fprintf(output_file, " %d:\n", T.RDB$TRIGGER_SEQUENCE);
|
||||
if (T.RDB$TRIGGER_SOURCE.NULL) {
|
||||
|
227
src/include/FirebirdApi.h
Normal file
227
src/include/FirebirdApi.h
Normal file
@ -0,0 +1,227 @@
|
||||
/*
|
||||
* The contents of this file are subject to the Initial
|
||||
* Developer's Public License Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
* http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
|
||||
*
|
||||
* Software distributed under the License is distributed AS IS,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing rights
|
||||
* and limitations under the License.
|
||||
*
|
||||
* The Original Code was created by Adriano dos Santos Fernandes
|
||||
* for the Firebird Open Source RDBMS project, based on previous work done
|
||||
* by Eugeney Putilin <evgeneyputilin at mail.ru>,
|
||||
* Vlad Khorsun <hvlad at users.sourceforge.net> and
|
||||
* Roman Rokytskyy <roman at rokytskyy.de>.
|
||||
*
|
||||
* Copyright (c) 2008 Adriano dos Santos Fernandes <adrianosf@uol.com.br>
|
||||
* and all contributors signed below.
|
||||
*
|
||||
* All Rights Reserved.
|
||||
* Contributor(s): ______________________________________.
|
||||
* Eugeney Putilin <evgeneyputilin at mail.ru>
|
||||
* Vlad Khorsun <hvlad at users.sourceforge.net>
|
||||
* Roman Rokytskyy <roman at rokytskyy.de>
|
||||
*/
|
||||
|
||||
#ifndef FIREBIRD_API_H
|
||||
#define FIREBIRD_API_H
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header // disable warning about non-existent virtual destructor
|
||||
#endif
|
||||
|
||||
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
|
||||
# define FB_CALL __stdcall
|
||||
#else
|
||||
# define FB_CALL
|
||||
#endif
|
||||
|
||||
#define FB_NULL 0L
|
||||
|
||||
|
||||
namespace Firebird {
|
||||
|
||||
|
||||
typedef unsigned int uint;
|
||||
typedef short int16;
|
||||
typedef int int32;
|
||||
|
||||
#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__)) && !defined(__GNUC__)
|
||||
typedef __int64 int64;
|
||||
#else
|
||||
typedef long long int int64;
|
||||
#endif
|
||||
|
||||
typedef char Utf8; // Utf8* used as nul-terminated string
|
||||
|
||||
// ISC compatible handle
|
||||
#if defined(_LP64) || defined(__LP64__) || defined(__arch64__) || defined(_WIN64)
|
||||
typedef unsigned int Handle;
|
||||
#else
|
||||
typedef void* Handle;
|
||||
#endif
|
||||
|
||||
|
||||
struct Date
|
||||
{
|
||||
int year;
|
||||
int month;
|
||||
int day;
|
||||
};
|
||||
|
||||
|
||||
struct Time
|
||||
{
|
||||
int hours;
|
||||
int minutes;
|
||||
int seconds;
|
||||
int fractions;
|
||||
};
|
||||
|
||||
|
||||
struct DateTime //// FIXME: rename to TimeStamp
|
||||
{
|
||||
Date date;
|
||||
Time time;
|
||||
};
|
||||
|
||||
|
||||
class Error
|
||||
{
|
||||
public:
|
||||
virtual bool FB_CALL addCode(int32 code) = 0;
|
||||
virtual bool FB_CALL addString(const char* str, uint strLength) = 0;
|
||||
};
|
||||
|
||||
|
||||
// Interface used in cases which an instance is created by one layer and released by another one.
|
||||
class Disposable
|
||||
{
|
||||
public:
|
||||
// Disposes the object.
|
||||
virtual void FB_CALL dispose(Error* error) = 0;
|
||||
};
|
||||
|
||||
|
||||
class Attachment : public Disposable
|
||||
{
|
||||
public:
|
||||
// Get an ISC compatible attachment handle.
|
||||
virtual Handle FB_CALL getHandle(Error* error) const = 0;
|
||||
|
||||
virtual const char* FB_CALL getUserName() const = 0;
|
||||
virtual const char* FB_CALL getDatabaseName() const = 0;
|
||||
};
|
||||
|
||||
|
||||
class Transaction
|
||||
{
|
||||
public:
|
||||
// Get an ISC compatible transaction handle.
|
||||
virtual Handle FB_CALL getHandle(Error* error) const = 0;
|
||||
};
|
||||
|
||||
|
||||
// Represents a parameter or column.
|
||||
class Value
|
||||
{
|
||||
public:
|
||||
// data types
|
||||
enum Type
|
||||
{
|
||||
TYPE_SMALLINT = 1,
|
||||
TYPE_INTEGER,
|
||||
TYPE_BIGINT,
|
||||
TYPE_DOUBLE,
|
||||
TYPE_CHAR,
|
||||
TYPE_VARCHAR,
|
||||
TYPE_BLOB,
|
||||
TYPE_DATE,
|
||||
TYPE_TIME,
|
||||
TYPE_TIMESTAMP
|
||||
};
|
||||
|
||||
public:
|
||||
// Get parameter or column name.
|
||||
virtual const char* FB_CALL getName(Error* error) const = 0;
|
||||
|
||||
virtual Type FB_CALL getType(Error* error) const = 0;
|
||||
virtual const char* FB_CALL getCharSet(Error* error) const = 0;
|
||||
|
||||
// Get BLOB sub-type.
|
||||
virtual int FB_CALL getSubType(Error* error) const = 0;
|
||||
|
||||
// Get numeric precision or maximum string length.
|
||||
virtual int FB_CALL getPrecision(Error* error) const = 0;
|
||||
|
||||
virtual int FB_CALL getScale(Error* error) const = 0;
|
||||
virtual bool FB_CALL isNullable(Error* error) const = 0;
|
||||
|
||||
virtual bool FB_CALL isNull() const = 0;
|
||||
virtual void FB_CALL setNull(Error* error) = 0;
|
||||
|
||||
virtual void FB_CALL copyFrom(Error* error, const Value* from) = 0;
|
||||
|
||||
virtual int16 FB_CALL getSmallInt(Error* error, int scale = 0, bool* isNull = FB_NULL) const = 0;
|
||||
virtual void FB_CALL setSmallInt(Error* error, int16 value, int scale = 0) = 0;
|
||||
|
||||
virtual int32 FB_CALL getInt(Error* error, int scale = 0, bool* isNull = FB_NULL) const = 0;
|
||||
virtual void FB_CALL setInt(Error* error, int32 value, int scale = 0) = 0;
|
||||
|
||||
virtual int64 FB_CALL getBigInt(Error* error, int scale = 0, bool* isNull = FB_NULL) const = 0;
|
||||
virtual void FB_CALL setBigInt(Error* error, int64 value, int scale = 0) = 0;
|
||||
|
||||
virtual double FB_CALL getDouble(Error* error, bool* isNull = FB_NULL) const = 0;
|
||||
virtual void FB_CALL setDouble(Error* error, double value) = 0;
|
||||
|
||||
virtual const char* FB_CALL getString(Error* error, uint* strLength = FB_NULL,
|
||||
bool* isNull = FB_NULL) const = 0;
|
||||
virtual void FB_CALL setString(Error* error, const char* str, uint strLength) = 0;
|
||||
|
||||
virtual int64 FB_CALL getBlobId(Error* error, bool* isNull = FB_NULL) const = 0;
|
||||
virtual void FB_CALL setBlobId(Error* error, int64 value) = 0;
|
||||
|
||||
virtual void FB_CALL getDate(Error* error, Date* value, bool* isNull = FB_NULL) const = 0;
|
||||
virtual void FB_CALL setDate(Error* error, const Date* value) = 0;
|
||||
|
||||
virtual void FB_CALL getTime(Error* error, Time* value, bool* isNull = FB_NULL) const = 0;
|
||||
virtual void FB_CALL setTime(Error* error, const Time* value) = 0;
|
||||
|
||||
virtual void FB_CALL getTimeStamp(Error* error, DateTime* value, bool* isNull = FB_NULL) const = 0;
|
||||
virtual void FB_CALL setTimeStamp(Error* error, const DateTime* value) = 0;
|
||||
};
|
||||
|
||||
|
||||
// A queue associated with a Values. Could be used for batching processing.
|
||||
class ValuesQueue : public Disposable
|
||||
{
|
||||
public:
|
||||
virtual void FB_CALL enqueue(Error* error) = 0; // Enqueue the current Values.
|
||||
virtual bool FB_CALL dequeue(Error* error) = 0; // Dequeue in Values.
|
||||
};
|
||||
|
||||
|
||||
// Represents a group of parameters or columns.
|
||||
class Values
|
||||
{
|
||||
public:
|
||||
virtual uint FB_CALL getCount() const = 0;
|
||||
virtual uint FB_CALL getIndexByName(Error* error, const char* name) const = 0;
|
||||
|
||||
// Get a given value. The first value is at index 1.
|
||||
virtual Value* FB_CALL getValue(Error* error, uint index) const = 0;
|
||||
|
||||
virtual Value* FB_CALL getValueByName(Error* error, const char* name) const = 0;
|
||||
|
||||
// Creates a queue associated with this Values.
|
||||
virtual ValuesQueue* FB_CALL createQueue(Error* error) = 0;
|
||||
};
|
||||
|
||||
|
||||
} // namespace Firebird
|
||||
|
||||
|
||||
#endif // FIREBIRD_API_H
|
189
src/include/FirebirdExternalApi.h
Normal file
189
src/include/FirebirdExternalApi.h
Normal file
@ -0,0 +1,189 @@
|
||||
/*
|
||||
* The contents of this file are subject to the Initial
|
||||
* Developer's Public License Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
* http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
|
||||
*
|
||||
* Software distributed under the License is distributed AS IS,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing rights
|
||||
* and limitations under the License.
|
||||
*
|
||||
* The Original Code was created by Adriano dos Santos Fernandes
|
||||
* for the Firebird Open Source RDBMS project, based on previous work done
|
||||
* by Eugeney Putilin <evgeneyputilin at mail.ru>,
|
||||
* Vlad Khorsun <hvlad at users.sourceforge.net> and
|
||||
* Roman Rokytskyy <roman at rokytskyy.de>.
|
||||
*
|
||||
* Copyright (c) 2008 Adriano dos Santos Fernandes <adrianosf@uol.com.br>
|
||||
* and all contributors signed below.
|
||||
*
|
||||
* All Rights Reserved.
|
||||
* Contributor(s): ______________________________________.
|
||||
* Eugeney Putilin <evgeneyputilin at mail.ru>
|
||||
* Vlad Khorsun <hvlad at users.sourceforge.net>
|
||||
* Roman Rokytskyy <roman at rokytskyy.de>
|
||||
*/
|
||||
|
||||
#ifndef FIREBIRD_EXTERNAL_API_H
|
||||
#define FIREBIRD_EXTERNAL_API_H
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header // disable warning about non-existent virtual destructor
|
||||
#endif
|
||||
|
||||
#include "FirebirdApi.h"
|
||||
|
||||
|
||||
namespace Firebird {
|
||||
|
||||
class ExternalEngine;
|
||||
|
||||
|
||||
const int EXTERNAL_VERSION_1 = 1;
|
||||
|
||||
|
||||
// Connection to current database in external engine.
|
||||
// Context passed to ExternalEngine has SYSDBA privileges.
|
||||
// Context passed to ExternalFunction, ExternalProcedure and ExternalTrigger
|
||||
// has user privileges.
|
||||
// There is one ExternalContext per attachment. The privileges and character
|
||||
// set properties are changed during the calls.
|
||||
class ExternalContext
|
||||
{
|
||||
public:
|
||||
// Gets the ExternalEngine associated with this context.
|
||||
virtual ExternalEngine* FB_CALL getEngine(Error* error) = 0;
|
||||
|
||||
// Gets the Attachment associated with this context.
|
||||
virtual Attachment* FB_CALL getAttachment(Error* error) = 0;
|
||||
|
||||
// Obtained transaction is valid only before control is returned to the engine
|
||||
// or in ExternalResultSet::fetch calls of correspondent ExternalProcedure::open.
|
||||
virtual Transaction* FB_CALL getTransaction(Error* error) = 0;
|
||||
|
||||
// Get user attachment character set.
|
||||
virtual const Utf8* FB_CALL getClientCharSet() = 0;
|
||||
|
||||
// Misc info associated with a context. The pointers are never accessed or freed by Firebird.
|
||||
|
||||
// Obtains an unique (across all contexts) code to associate plugin and/or user information.
|
||||
virtual int FB_CALL obtainInfoCode() = 0;
|
||||
// Gets a value associated with this code or FB_NULL if no value was set.
|
||||
virtual void* FB_CALL getInfo(int code) = 0;
|
||||
// Sets a value associated with this code and returns the last value.
|
||||
virtual void* FB_CALL setInfo(int code, void* value) = 0;
|
||||
};
|
||||
|
||||
|
||||
// To return set of rows in selectable procedures.
|
||||
class ExternalResultSet : public Disposable
|
||||
{
|
||||
public:
|
||||
virtual bool FB_CALL fetch(Error* error) = 0;
|
||||
};
|
||||
|
||||
|
||||
class ExternalFunction : public Disposable
|
||||
{
|
||||
public:
|
||||
// This method is called just before execute and informs the engine our requested character
|
||||
// set for data exchange inside that method.
|
||||
// During this call, the context uses the character set obtained from ExternalEngine::getCharSet.
|
||||
virtual void FB_CALL getCharSet(Error* error, ExternalContext* context,
|
||||
Utf8* name, uint nameSize) = 0;
|
||||
|
||||
virtual void FB_CALL execute(Error* error, ExternalContext* context, Values* params,
|
||||
Value* result) = 0;
|
||||
};
|
||||
|
||||
|
||||
class ExternalProcedure : public Disposable
|
||||
{
|
||||
public:
|
||||
// This method is called just before open and informs the engine our requested character
|
||||
// set for data exchange inside that method and ExternalResultSet::fetch.
|
||||
// During this call, the context uses the character set obtained from ExternalEngine::getCharSet.
|
||||
virtual void FB_CALL getCharSet(Error* error, ExternalContext* context,
|
||||
Utf8* name, uint nameSize) = 0;
|
||||
|
||||
// Returns a ExternalResultSet for selectable procedures.
|
||||
// Returning NULL results in a result set of one record.
|
||||
// Procedures without output parameters should return NULL.
|
||||
virtual ExternalResultSet* FB_CALL open(Error* error, ExternalContext* context,
|
||||
Values* params, Values* results) = 0;
|
||||
};
|
||||
|
||||
|
||||
class ExternalTrigger : public Disposable
|
||||
{
|
||||
public:
|
||||
enum Type
|
||||
{
|
||||
TYPE_BEFORE = 1,
|
||||
TYPE_AFTER,
|
||||
TYPE_DATABASE
|
||||
};
|
||||
|
||||
enum Action
|
||||
{
|
||||
ACTION_INSERT = 1,
|
||||
ACTION_UPDATE,
|
||||
ACTION_DELETE,
|
||||
ACTION_CONNECT,
|
||||
ACTION_DISCONNECT,
|
||||
ACTION_TRANS_START,
|
||||
ACTION_TRANS_COMMIT,
|
||||
ACTION_TRANS_ROLLBACK,
|
||||
ACTION_DDL
|
||||
};
|
||||
|
||||
public:
|
||||
// This method is called just before execute and informs the engine our requested character
|
||||
// set for data exchange inside that method.
|
||||
// During this call, the context uses the character set obtained from ExternalEngine::getCharSet.
|
||||
virtual void FB_CALL getCharSet(Error* error, ExternalContext* context,
|
||||
Utf8* name, uint nameSize) = 0;
|
||||
|
||||
virtual void FB_CALL execute(Error* error, ExternalContext* context,
|
||||
Action action, const Values* oldValues, Values* newValues) = 0;
|
||||
};
|
||||
|
||||
|
||||
// In SuperServer, shared by all attachments to one database and disposed when last (non-external)
|
||||
// user attachment to the database is closed.
|
||||
class ExternalEngine : public Disposable
|
||||
{
|
||||
public:
|
||||
virtual int FB_CALL getVersion(Error* error) = 0;
|
||||
|
||||
// This method is called once (per ExternalEngine instance) before any following methods.
|
||||
// The requested character set for data exchange inside methods of this interface should
|
||||
// be copied to charSet parameter.
|
||||
// During this call, the context uses the UTF-8 character set.
|
||||
virtual void FB_CALL open(Error* error, ExternalContext* context,
|
||||
Utf8* charSet, uint charSetSize) = 0;
|
||||
|
||||
// Attachment is being opened.
|
||||
virtual void FB_CALL openAttachment(Error* error, ExternalContext* context) = 0;
|
||||
|
||||
// Attachment is being closed.
|
||||
virtual void FB_CALL closeAttachment(Error* error, ExternalContext* context) = 0;
|
||||
|
||||
// Called when engine wants to load object in the cache. Objects are disposed when
|
||||
// going out of the cache.
|
||||
virtual ExternalFunction* FB_CALL makeFunction(Error* error, ExternalContext* context,
|
||||
const char* package, const char* name, const char* entryPoint, const char* body) = 0;
|
||||
virtual ExternalProcedure* FB_CALL makeProcedure(Error* error, ExternalContext* context,
|
||||
const char* package, const char* name, const char* entryPoint, const char* body) = 0;
|
||||
virtual ExternalTrigger* FB_CALL makeTrigger(Error* error, ExternalContext* context,
|
||||
const char* name, const char* entryPoint, const char* body,
|
||||
const char* table, ExternalTrigger::Type type) = 0;
|
||||
};
|
||||
|
||||
|
||||
} // namespace Firebird
|
||||
|
||||
|
||||
#endif // FIREBIRD_EXTERNAL_API_H
|
123
src/include/FirebirdPluginApi.h
Normal file
123
src/include/FirebirdPluginApi.h
Normal file
@ -0,0 +1,123 @@
|
||||
/*
|
||||
* The contents of this file are subject to the Initial
|
||||
* Developer's Public License Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
* http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
|
||||
*
|
||||
* Software distributed under the License is distributed AS IS,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing rights
|
||||
* and limitations under the License.
|
||||
*
|
||||
* The Original Code was created by Adriano dos Santos Fernandes
|
||||
* for the Firebird Open Source RDBMS project.
|
||||
*
|
||||
* Copyright (c) 2008 Adriano dos Santos Fernandes <adrianosf@uol.com.br>
|
||||
* and all contributors signed below.
|
||||
*
|
||||
* All Rights Reserved.
|
||||
* Contributor(s): ______________________________________.
|
||||
*/
|
||||
|
||||
/*
|
||||
* When Firebird is initializing, it opens all *.conf files from <fbroot>/plugins.
|
||||
* For each plugin_module tag found, it constructs a Plugin object, reads the corresponding
|
||||
* plugin_config tag and inserts all config information in the object.
|
||||
*
|
||||
* When requested, the engine gets the attribute value of plugin_module/filename, load it as a
|
||||
* dynamic (shared) library and calls the exported function firebirdPlugin (FB_PLUGIN_ENTRY_POINT
|
||||
* definition, InitPluginEntryPoint prototype) passing the Plugin object as parameter.
|
||||
*
|
||||
* The plugin library may save the plugin object and call they methods later. The object and all
|
||||
* pointers returned by it are valid until the plugin is unloaded (done through OS unload of the
|
||||
* dynamic library) when Firebird is shutting down.
|
||||
*
|
||||
* Inside the plugin entry point (firebirdPlugin), the plugin may register extra functionality that
|
||||
* may be obtained by Firebird when required. Currently only External Engines may be registered
|
||||
* through Plugin::setExternalEngineFactory.
|
||||
*
|
||||
* Example plugin configuration file:
|
||||
*
|
||||
* <external_engine UDR>
|
||||
* plugin_module UDR_engine
|
||||
* </external_engine>
|
||||
*
|
||||
* <plugin_module UDR_engine>
|
||||
* filename $(this)/udr_engine
|
||||
* plugin_config UDR_config
|
||||
* </plugin_module>
|
||||
*
|
||||
* <plugin_config UDR_config>
|
||||
* path $(this)/udr
|
||||
* </plugin_config>
|
||||
*
|
||||
* Note that the external_engine tag is ignored at this stage. Only plugin_module and plugin_config
|
||||
* are read. The dynamic library extension may be ommitted, and $(this) expands to the directory of
|
||||
* the .conf file.
|
||||
*
|
||||
* Plugins may access Firebird API through the client library read from Plugin::getLibraryName
|
||||
* method. This method may return different filenames depending on the server architecture, and may
|
||||
* even return NULL. Currently it returns values as the table below, but this is implementation
|
||||
* detail and portable plugins should just expect a filename or NULL.
|
||||
*
|
||||
* Architecture File
|
||||
* --------------- ------------------------------------------------------
|
||||
* Embedded The embedded library
|
||||
* Windows SS fbserver executable
|
||||
* Windows CS/SC fb_inet_server executable
|
||||
* POSIX CS/SC The embedded library
|
||||
* POSIX SS NULL [application should open it through dlopen(NULL)]
|
||||
*/
|
||||
|
||||
#ifndef FIREBIRD_PLUGIN_API_H
|
||||
#define FIREBIRD_PLUGIN_API_H
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header // disable warning about non-existent virtual destructor
|
||||
#endif
|
||||
|
||||
#include "FirebirdApi.h"
|
||||
|
||||
#define FB_PLUGIN_ENTRY_POINT firebirdPlugin
|
||||
|
||||
|
||||
namespace Firebird {
|
||||
|
||||
class ExternalEngine;
|
||||
|
||||
|
||||
const int PLUGIN_VERSION_1 = 1;
|
||||
|
||||
|
||||
class ExternalEngineFactory
|
||||
{
|
||||
public:
|
||||
// Strings passed to error->addString during this call are assumed to be UTF-8.
|
||||
virtual ExternalEngine* FB_CALL createEngine(Error* error, int version,
|
||||
const char* name) = 0;
|
||||
};
|
||||
|
||||
|
||||
// Passed to plugin library through entry point FB_PLUGIN_ENTRY_POINT in Firebird initialization.
|
||||
class Plugin
|
||||
{
|
||||
public:
|
||||
virtual int FB_CALL getVersion() = 0;
|
||||
virtual const char* FB_CALL getName() = 0;
|
||||
virtual const char* FB_CALL getLibraryName() = 0;
|
||||
virtual uint FB_CALL getConfigInfoCount() = 0;
|
||||
virtual void FB_CALL getConfigInfo(Error* error, uint index, // first index is 0
|
||||
const char** key, const char** value) = 0;
|
||||
|
||||
virtual void FB_CALL setExternalEngineFactory(ExternalEngineFactory* factory) = 0;
|
||||
};
|
||||
|
||||
|
||||
typedef void (*PluginEntryPoint)(Error* error, Plugin* plugin);
|
||||
|
||||
|
||||
} // namespace Firebird
|
||||
|
||||
|
||||
#endif // FIREBIRD_PLUGIN_API_H
|
95
src/include/FirebirdUdr.h
Normal file
95
src/include/FirebirdUdr.h
Normal file
@ -0,0 +1,95 @@
|
||||
/*
|
||||
* The contents of this file are subject to the Initial
|
||||
* Developer's Public License Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
* http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
|
||||
*
|
||||
* Software distributed under the License is distributed AS IS,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing rights
|
||||
* and limitations under the License.
|
||||
*
|
||||
* The Original Code was created by Adriano dos Santos Fernandes
|
||||
* for the Firebird Open Source RDBMS project.
|
||||
*
|
||||
* Copyright (c) 2008 Adriano dos Santos Fernandes <adrianosf@uol.com.br>
|
||||
* and all contributors signed below.
|
||||
*
|
||||
* All Rights Reserved.
|
||||
* Contributor(s): ______________________________________.
|
||||
*/
|
||||
|
||||
#ifndef FIREBIRD_UDR_H
|
||||
#define FIREBIRD_UDR_H
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header // disable warning about non-existent virtual destructor
|
||||
#endif
|
||||
|
||||
#include "FirebirdApi.h"
|
||||
#include "FirebirdExternalApi.h"
|
||||
|
||||
|
||||
namespace Firebird
|
||||
{
|
||||
namespace Udr
|
||||
{
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
// Metadata information passed from the UDR engine to user's routines factories when asking to
|
||||
// create routines instances.
|
||||
struct MetaInfo
|
||||
{
|
||||
const char* package; // package name - NULL from triggers
|
||||
const char* name; // metadata object name
|
||||
const char* entryPoint; // external routine's name
|
||||
const char* info; // misc. info encoded on the external name
|
||||
const char* body; // body text
|
||||
};
|
||||
|
||||
struct TriggerMetaInfo : public MetaInfo
|
||||
{
|
||||
ExternalTrigger::Type type; // trigger type
|
||||
const char* table; // table name
|
||||
};
|
||||
|
||||
|
||||
// Factory classes. They should be singletons instances created by user's modules and
|
||||
// registered. When UDR engine is going to load a routine, it calls newItem.
|
||||
|
||||
class FunctionFactory
|
||||
{
|
||||
public:
|
||||
virtual const char* FB_CALL getName() = 0;
|
||||
virtual ExternalFunction* FB_CALL newItem(MetaInfo* metaInfo) = 0;
|
||||
};
|
||||
|
||||
class ProcedureFactory
|
||||
{
|
||||
public:
|
||||
virtual const char* FB_CALL getName() = 0;
|
||||
virtual ExternalProcedure* FB_CALL newItem(MetaInfo* metaInfo) = 0;
|
||||
};
|
||||
|
||||
class TriggerFactory
|
||||
{
|
||||
public:
|
||||
virtual const char* FB_CALL getName() = 0;
|
||||
virtual ExternalTrigger* FB_CALL newItem(TriggerMetaInfo* metaInfo) = 0;
|
||||
};
|
||||
|
||||
|
||||
// Routine registration functions.
|
||||
extern "C" void fbUdrRegFunction(FunctionFactory* factory);
|
||||
extern "C" void fbUdrRegProcedure(ProcedureFactory* factory);
|
||||
extern "C" void fbUdrRegTrigger(TriggerFactory* factory);
|
||||
extern "C" void* fbUdrGetFunction(const char* symbol);
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
} // namespace Udr
|
||||
} // namespace Firebird
|
||||
|
||||
#endif // FIREBIRD_UDR_H
|
634
src/include/FirebirdUdrCpp.h
Normal file
634
src/include/FirebirdUdrCpp.h
Normal file
@ -0,0 +1,634 @@
|
||||
/*
|
||||
* The contents of this file are subject to the Initial
|
||||
* Developer's Public License Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
* http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
|
||||
*
|
||||
* Software distributed under the License is distributed AS IS,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing rights
|
||||
* and limitations under the License.
|
||||
*
|
||||
* The Original Code was created by Adriano dos Santos Fernandes
|
||||
* for the Firebird Open Source RDBMS project.
|
||||
*
|
||||
* Copyright (c) 2008 Adriano dos Santos Fernandes <adrianosf@uol.com.br>
|
||||
* and all contributors signed below.
|
||||
*
|
||||
* All Rights Reserved.
|
||||
* Contributor(s): ______________________________________.
|
||||
*/
|
||||
|
||||
#ifndef FIREBIRD_PLUGIN_UDR_CPP
|
||||
#define FIREBIRD_PLUGIN_UDR_CPP
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header // disable warning about non-existent virtual destructor
|
||||
#endif
|
||||
|
||||
#include "FirebirdApi.h"
|
||||
#include "FirebirdExternalApi.h"
|
||||
#include "FirebirdUdr.h"
|
||||
#include "ibase.h"
|
||||
#include <string.h>
|
||||
|
||||
|
||||
namespace Firebird
|
||||
{
|
||||
namespace Udr
|
||||
{
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#define FB_UDR_FUNCTION(name) Func##name
|
||||
#define FB_UDR_PROCEDURE(name) Proc##name
|
||||
#define FB_UDR_TRIGGER(name) Trig##name
|
||||
|
||||
|
||||
#define FB_UDR_BEGIN_DECLARE_FUNCTION(name) \
|
||||
class FB_UDR_FUNCTION(name) : public ::Firebird::Udr::Function \
|
||||
{ \
|
||||
public: \
|
||||
virtual void FB_CALL execute(::Firebird::Error* error, ::Firebird::ExternalContext* context, \
|
||||
::Firebird::Values* params, ::Firebird::Value* result); \
|
||||
private:
|
||||
|
||||
#define FB_UDR_END_DECLARE_FUNCTION(name) \
|
||||
};
|
||||
|
||||
#define FB_UDR_DECLARE_FUNCTION(name) \
|
||||
FB_UDR_BEGIN_DECLARE_FUNCTION(name) \
|
||||
FB_UDR_END_DECLARE_FUNCTION(name)
|
||||
|
||||
#define FB_UDR_BEGIN_FUNCTION(name) \
|
||||
void FB_CALL FB_UDR_FUNCTION(name)::execute(::Firebird::Error* error, \
|
||||
::Firebird::ExternalContext* context, ::Firebird::Values* params, ::Firebird::Value* result) \
|
||||
{ \
|
||||
try \
|
||||
{
|
||||
|
||||
#define FB_UDR_END_FUNCTION(name) \
|
||||
} \
|
||||
catch (const ::Firebird::Udr::ThrowError::Exception& e) \
|
||||
{ \
|
||||
e.stuff(error); \
|
||||
} \
|
||||
catch (...) \
|
||||
{ \
|
||||
error->addCode(isc_arg_gds); \
|
||||
error->addCode(isc_random); \
|
||||
error->addString( \
|
||||
FB_UDR_UNRECOGNIZED_EXCEPTION, \
|
||||
strlen(FB_UDR_UNRECOGNIZED_EXCEPTION)); \
|
||||
} \
|
||||
} \
|
||||
::Firebird::Udr::FunctionFactoryImpl<FB_UDR_FUNCTION(name)> FuncFactory##name(#name);
|
||||
|
||||
|
||||
#define FB_UDR_BEGIN_DECLARE_PROCEDURE(name) \
|
||||
class FB_UDR_PROCEDURE(name) : public ::Firebird::Udr::Procedure \
|
||||
{ \
|
||||
public: \
|
||||
virtual ::Firebird::ExternalResultSet* FB_CALL open(::Firebird::Error* error, \
|
||||
::Firebird::ExternalContext* context, ::Firebird::Values* params, \
|
||||
::Firebird::Values* results); \
|
||||
|
||||
#define FB_UDR_END_DECLARE_PROCEDURE(name) \
|
||||
};
|
||||
|
||||
#define FB_UDR_DECLARE_PROCEDURE(name) \
|
||||
FB_UDR_BEGIN_DECLARE_PROCEDURE(name) \
|
||||
FB_UDR_END_DECLARE_PROCEDURE(name)
|
||||
|
||||
#define FB_UDR_BEGIN_DECLARE_FETCH_PROCEDURE(name) \
|
||||
class ResultSet##name : public ::Firebird::Udr::ResultSet \
|
||||
{ \
|
||||
public: \
|
||||
ResultSet##name(::Firebird::Error* error, ::Firebird::ExternalContext* context, \
|
||||
::Firebird::Values* params, ::Firebird::Values* results); \
|
||||
\
|
||||
public: \
|
||||
virtual bool FB_CALL fetch(::Firebird::Error* error); \
|
||||
\
|
||||
private:
|
||||
|
||||
#define FB_UDR_END_DECLARE_FETCH_PROCEDURE(name) \
|
||||
};
|
||||
|
||||
#define FB_UDR_DECLARE_FETCH_PROCEDURE(name) \
|
||||
FB_UDR_BEGIN_DECLARE_FETCH_PROCEDURE(name) \
|
||||
FB_UDR_END_DECLARE_FETCH_PROCEDURE(name)
|
||||
|
||||
#define FB_UDR_DECLARE_PROCEDURE(name) \
|
||||
FB_UDR_BEGIN_DECLARE_PROCEDURE(name) \
|
||||
FB_UDR_END_DECLARE_PROCEDURE(name)
|
||||
|
||||
#define FB_UDR_BEGIN_PROCEDURE(name) \
|
||||
::Firebird::ExternalResultSet* FB_CALL Proc##name::open(::Firebird::Error* error, \
|
||||
::Firebird::ExternalContext* context, ::Firebird::Values* params, \
|
||||
::Firebird::Values* results) \
|
||||
{ \
|
||||
return new ResultSet##name(error, context, params, results); \
|
||||
} \
|
||||
\
|
||||
ResultSet##name::ResultSet##name(::Firebird::Error* error, ::Firebird::ExternalContext* context, \
|
||||
::Firebird::Values* params, ::Firebird::Values* results) \
|
||||
: ResultSet(context, params, results) \
|
||||
{ \
|
||||
try \
|
||||
{
|
||||
|
||||
#define FB_UDR_FETCH_PROCEDURE(name) \
|
||||
} \
|
||||
catch (const ::Firebird::Udr::ThrowError::Exception& e) \
|
||||
{ \
|
||||
e.stuff(error); \
|
||||
} \
|
||||
catch (...) \
|
||||
{ \
|
||||
error->addCode(isc_arg_gds); \
|
||||
error->addCode(isc_random); \
|
||||
error->addString( \
|
||||
FB_UDR_UNRECOGNIZED_EXCEPTION, \
|
||||
strlen(FB_UDR_UNRECOGNIZED_EXCEPTION)); \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
bool FB_CALL ResultSet##name::fetch(::Firebird::Error* error) \
|
||||
{ \
|
||||
try \
|
||||
{
|
||||
|
||||
#define FB_UDR_END_PROCEDURE(name) \
|
||||
} \
|
||||
catch (const ::Firebird::Udr::ThrowError::Exception& e) \
|
||||
{ \
|
||||
e.stuff(error); \
|
||||
} \
|
||||
catch (...) \
|
||||
{ \
|
||||
error->addCode(isc_arg_gds); \
|
||||
error->addCode(isc_random); \
|
||||
error->addString( \
|
||||
FB_UDR_UNRECOGNIZED_EXCEPTION, \
|
||||
strlen(FB_UDR_UNRECOGNIZED_EXCEPTION)); \
|
||||
} \
|
||||
return false; \
|
||||
} \
|
||||
::Firebird::Udr::ProcedureFactoryImpl<FB_UDR_PROCEDURE(name)> ProcFactory##name(#name);
|
||||
|
||||
|
||||
#define FB_UDR_BEGIN_DECLARE_TRIGGER(name) \
|
||||
class FB_UDR_TRIGGER(name) : public ::Firebird::Udr::Trigger \
|
||||
{ \
|
||||
public: \
|
||||
virtual void FB_CALL execute(::Firebird::Error* error, ::Firebird::ExternalContext* context, \
|
||||
::Firebird::ExternalTrigger::Action action, const ::Firebird::Values* oldValues, \
|
||||
::Firebird::Values* newValues); \
|
||||
private:
|
||||
|
||||
#define FB_UDR_END_DECLARE_TRIGGER(name) \
|
||||
};
|
||||
|
||||
#define FB_UDR_DECLARE_TRIGGER(name) \
|
||||
FB_UDR_BEGIN_DECLARE_TRIGGER(name) \
|
||||
FB_UDR_END_DECLARE_TRIGGER(name)
|
||||
|
||||
#define FB_UDR_BEGIN_TRIGGER(name) \
|
||||
void FB_CALL FB_UDR_TRIGGER(name)::execute(::Firebird::Error* error, \
|
||||
::Firebird::ExternalContext* context, ::Firebird::ExternalTrigger::Action action, \
|
||||
const ::Firebird::Values* oldValues, ::Firebird::Values* newValues) \
|
||||
{ \
|
||||
try \
|
||||
{
|
||||
|
||||
#define FB_UDR_END_TRIGGER(name) \
|
||||
} \
|
||||
catch (const ::Firebird::Udr::ThrowError::Exception& e) \
|
||||
{ \
|
||||
e.stuff(error); \
|
||||
} \
|
||||
catch (...) \
|
||||
{ \
|
||||
error->addCode(isc_arg_gds); \
|
||||
error->addCode(isc_random); \
|
||||
error->addString( \
|
||||
FB_UDR_UNRECOGNIZED_EXCEPTION, \
|
||||
strlen(FB_UDR_UNRECOGNIZED_EXCEPTION)); \
|
||||
} \
|
||||
} \
|
||||
::Firebird::Udr::TriggerFactoryImpl<FB_UDR_TRIGGER(name)> TrigFactory##name(#name);
|
||||
|
||||
|
||||
#define FB_UDR_UNRECOGNIZED_EXCEPTION "Unrecognized C++ exception"
|
||||
|
||||
|
||||
class ThrowError : public Error
|
||||
{
|
||||
private:
|
||||
struct Info
|
||||
{
|
||||
Info()
|
||||
: next(FB_NULL),
|
||||
str(FB_NULL)
|
||||
{
|
||||
}
|
||||
|
||||
~Info()
|
||||
{
|
||||
if (str)
|
||||
delete [] str;
|
||||
}
|
||||
|
||||
static void free(Info* info)
|
||||
{
|
||||
while (info)
|
||||
{
|
||||
Info* p = info;
|
||||
info = info->next;
|
||||
delete p;
|
||||
}
|
||||
}
|
||||
|
||||
enum { TYPE_CODE, TYPE_STR } type;
|
||||
|
||||
Info* next;
|
||||
int32 code;
|
||||
char* str;
|
||||
int strLength;
|
||||
};
|
||||
|
||||
public:
|
||||
class Exception
|
||||
{
|
||||
public:
|
||||
Exception(Info* aInfo)
|
||||
: info(aInfo)
|
||||
{
|
||||
}
|
||||
|
||||
Exception(const Exception& e)
|
||||
: info(FB_NULL)
|
||||
{
|
||||
Info* end = FB_NULL;
|
||||
|
||||
for (Info* p = e.info; p; p = p->next)
|
||||
{
|
||||
Info* newInfo = new Info;
|
||||
newInfo->type = p->type;
|
||||
newInfo->code = p->code;
|
||||
|
||||
if (p->str)
|
||||
{
|
||||
newInfo->str = new char[p->strLength];
|
||||
memcpy(newInfo->str, p->str, p->strLength);
|
||||
newInfo->strLength = p->strLength;
|
||||
}
|
||||
|
||||
if (end)
|
||||
end->next = newInfo;
|
||||
|
||||
end = newInfo;
|
||||
|
||||
if (!info)
|
||||
info = newInfo;
|
||||
}
|
||||
}
|
||||
|
||||
~Exception()
|
||||
{
|
||||
Info::free(info);
|
||||
}
|
||||
|
||||
public:
|
||||
void stuff(Error* error) const
|
||||
{
|
||||
for (Info* p = info; p; p = p->next)
|
||||
{
|
||||
if (p->type == Info::TYPE_CODE)
|
||||
error->addCode(p->code);
|
||||
else if (p->type == Info::TYPE_STR)
|
||||
error->addString(p->str, p->strLength);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
Info* info;
|
||||
};
|
||||
|
||||
public:
|
||||
ThrowError()
|
||||
: start(FB_NULL),
|
||||
end(FB_NULL)
|
||||
{
|
||||
}
|
||||
|
||||
virtual ~ThrowError()
|
||||
{
|
||||
raise();
|
||||
Info::free(start);
|
||||
}
|
||||
|
||||
public:
|
||||
static void check(ISC_STATUS status, const ISC_STATUS* vector)
|
||||
{
|
||||
if (status == 0)
|
||||
return;
|
||||
|
||||
ThrowError error;
|
||||
|
||||
while (*vector != isc_arg_end)
|
||||
{
|
||||
switch (*vector)
|
||||
{
|
||||
case isc_arg_warning:
|
||||
case isc_arg_gds:
|
||||
case isc_arg_number:
|
||||
case isc_arg_interpreted:
|
||||
case isc_arg_vms:
|
||||
case isc_arg_unix:
|
||||
case isc_arg_win32:
|
||||
error.addCode(*vector++);
|
||||
error.addCode(*vector++);
|
||||
break;
|
||||
|
||||
case isc_arg_string:
|
||||
error.addString((const char*) vector[1], strlen((const char*) vector[1]));
|
||||
vector += 2;
|
||||
break;
|
||||
|
||||
case isc_arg_cstring:
|
||||
error.addString((const char*) vector[2], vector[1]);
|
||||
vector += 3;
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void check(const ISC_STATUS* vector)
|
||||
{
|
||||
check(vector[1], vector);
|
||||
}
|
||||
|
||||
public:
|
||||
inline operator Firebird::Error* ()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
public:
|
||||
virtual bool FB_CALL addCode(Firebird::int32 code)
|
||||
{
|
||||
Info* info = new Info;
|
||||
info->type = Info::TYPE_CODE;
|
||||
info->code = code;
|
||||
|
||||
if (end)
|
||||
end->next = info;
|
||||
|
||||
end = info;
|
||||
|
||||
if (!start)
|
||||
start = info;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool FB_CALL addString(const char* str, uint strLength)
|
||||
{
|
||||
Info* info = new Info;
|
||||
info->type = Info::TYPE_STR;
|
||||
info->str = new char[strLength];
|
||||
memcpy(info->str, str, strLength);
|
||||
info->strLength = strLength;
|
||||
|
||||
if (end)
|
||||
end->next = info;
|
||||
|
||||
end = info;
|
||||
|
||||
if (!start)
|
||||
start = info;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
void raise()
|
||||
{
|
||||
if (start)
|
||||
throw Exception(start);
|
||||
}
|
||||
|
||||
protected:
|
||||
Info* start;
|
||||
Info* end;
|
||||
};
|
||||
|
||||
|
||||
class Helper
|
||||
{
|
||||
public:
|
||||
static isc_db_handle getIscDbHandle(ExternalContext* context)
|
||||
{
|
||||
Attachment* att = context->getAttachment(ThrowError());
|
||||
return att->getHandle(ThrowError());
|
||||
}
|
||||
|
||||
static isc_tr_handle getIscTrHandle(ExternalContext* context)
|
||||
{
|
||||
Transaction* tra = context->getTransaction(ThrowError());
|
||||
return tra->getHandle(ThrowError());
|
||||
}
|
||||
|
||||
static void* getEntryPoint(ExternalContext* context, const char* entryPoint)
|
||||
{
|
||||
return fbUdrGetFunction(entryPoint);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class ResultSet : public ExternalResultSet, public Helper
|
||||
{
|
||||
public:
|
||||
ResultSet(Firebird::ExternalContext* aContext, Firebird::Values* aParams,
|
||||
Firebird::Values* aResults)
|
||||
: context(aContext),
|
||||
params(aParams),
|
||||
results(aResults)
|
||||
{
|
||||
}
|
||||
|
||||
virtual ~ResultSet()
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void FB_CALL dispose(Firebird::Error* error)
|
||||
{
|
||||
delete this;
|
||||
}
|
||||
|
||||
protected:
|
||||
Firebird::ExternalContext* context;
|
||||
Firebird::Values* params;
|
||||
Firebird::Values* results;
|
||||
};
|
||||
|
||||
|
||||
class Function : public ExternalFunction, public Helper
|
||||
{
|
||||
public:
|
||||
virtual ~Function()
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void FB_CALL dispose(Error* error)
|
||||
{
|
||||
delete this;
|
||||
}
|
||||
|
||||
void FB_CALL getCharSet(Error* error, ExternalContext* context, Utf8* name, uint nameSize)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
MetaInfo* metaInfo;
|
||||
};
|
||||
|
||||
|
||||
class Procedure : public ExternalProcedure, public Helper
|
||||
{
|
||||
public:
|
||||
virtual ~Procedure()
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void FB_CALL dispose(Error* error)
|
||||
{
|
||||
delete this;
|
||||
}
|
||||
|
||||
void FB_CALL getCharSet(Error* error, ExternalContext* context, Utf8* name, uint nameSize)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
MetaInfo* metaInfo;
|
||||
};
|
||||
|
||||
|
||||
class Trigger : public ExternalTrigger, public Helper
|
||||
{
|
||||
public:
|
||||
virtual ~Trigger()
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
virtual void FB_CALL dispose(Error* error)
|
||||
{
|
||||
delete this;
|
||||
}
|
||||
|
||||
void FB_CALL getCharSet(Error* error, ExternalContext* context, Utf8* name, uint nameSize)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
TriggerMetaInfo* metaInfo;
|
||||
};
|
||||
|
||||
|
||||
template <typename T> class FunctionFactoryImpl : public FunctionFactory
|
||||
{
|
||||
public:
|
||||
FunctionFactoryImpl(const char* aName)
|
||||
: name(aName)
|
||||
{
|
||||
fbUdrRegFunction(this);
|
||||
}
|
||||
|
||||
public:
|
||||
virtual const char* FB_CALL getName()
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
virtual ExternalFunction* FB_CALL newItem(MetaInfo* metaInfo)
|
||||
{
|
||||
Function* function = new T();
|
||||
function->metaInfo = metaInfo;
|
||||
return function;
|
||||
}
|
||||
|
||||
private:
|
||||
const char* name;
|
||||
};
|
||||
|
||||
|
||||
template <typename T> class ProcedureFactoryImpl : public ProcedureFactory
|
||||
{
|
||||
public:
|
||||
ProcedureFactoryImpl(const char* aName)
|
||||
: name(aName)
|
||||
{
|
||||
fbUdrRegProcedure(this);
|
||||
}
|
||||
|
||||
public:
|
||||
virtual const char* FB_CALL getName()
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
virtual ExternalProcedure* FB_CALL newItem(MetaInfo* metaInfo)
|
||||
{
|
||||
Procedure* procedure = new T();
|
||||
procedure->metaInfo = metaInfo;
|
||||
return procedure;
|
||||
}
|
||||
|
||||
private:
|
||||
const char* name;
|
||||
};
|
||||
|
||||
|
||||
template <typename T> class TriggerFactoryImpl : public TriggerFactory
|
||||
{
|
||||
public:
|
||||
TriggerFactoryImpl(const char* aName)
|
||||
: name(aName)
|
||||
{
|
||||
fbUdrRegTrigger(this);
|
||||
}
|
||||
|
||||
public:
|
||||
virtual const char* FB_CALL getName()
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
virtual ExternalTrigger* FB_CALL newItem(TriggerMetaInfo* metaInfo)
|
||||
{
|
||||
Trigger* trigger = new T();
|
||||
trigger->metaInfo = metaInfo;
|
||||
return trigger;
|
||||
}
|
||||
|
||||
private:
|
||||
const char* name;
|
||||
};
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
} // namespace Udr
|
||||
} // namespace Firebird
|
||||
|
||||
#endif // FIREBIRD_PLUGIN_UDR_CPP
|
@ -619,6 +619,7 @@
|
||||
#define isc_dyn_prm_name 137
|
||||
#define isc_dyn_sql_object 196
|
||||
#define isc_dyn_fld_character_set_name 174
|
||||
#define isc_dyn_pkg_name 247
|
||||
|
||||
/********************************/
|
||||
/* Relation specific attributes */
|
||||
@ -670,6 +671,8 @@
|
||||
#define isc_dyn_fld_character_set 203
|
||||
#define isc_dyn_del_computed 242
|
||||
|
||||
#define isc_dyn_def_engine 245
|
||||
|
||||
/***********************************/
|
||||
/* Local field specific attributes */
|
||||
/***********************************/
|
||||
@ -717,6 +720,9 @@
|
||||
#define isc_dyn_grant_user_group 205
|
||||
#define isc_dyn_grant_role 218
|
||||
#define isc_dyn_grant_grantor 245
|
||||
#define isc_dyn_grant_package 248
|
||||
|
||||
#define isc_dyn_fld_null 249
|
||||
|
||||
|
||||
/**********************************/
|
||||
@ -891,7 +897,7 @@
|
||||
/****************************/
|
||||
/* Last $dyn value assigned */
|
||||
/****************************/
|
||||
#define isc_dyn_last_dyn_value 247
|
||||
#define isc_dyn_last_dyn_value 250
|
||||
|
||||
/******************************************/
|
||||
/* Array slice description language (SDL) */
|
||||
|
@ -87,7 +87,7 @@ using namespace NAMESPACE;
|
||||
// Comment this definition to build without priority scheduler
|
||||
// OR:
|
||||
// Uncomment this definition to build with priority scheduler
|
||||
#define THREAD_PSCHED
|
||||
//#define THREAD_PSCHED
|
||||
#endif
|
||||
|
||||
#if defined(WIN_NT)
|
||||
|
@ -689,6 +689,8 @@ static const struct {
|
||||
{"out_of_temp_space", 335544985},
|
||||
{"eds_expl_tran_ctrl", 335544986},
|
||||
{"no_trusted_spb", 335544987},
|
||||
{"package_name", 335544988},
|
||||
{"cannot_make_not_null", 335544989},
|
||||
{"gfix_db_name", 335740929},
|
||||
{"gfix_invalid_sw", 335740930},
|
||||
{"gfix_incmp_sw", 335740932},
|
||||
@ -746,7 +748,21 @@ static const struct {
|
||||
{"upd_ins_with_complex_view", 336003101},
|
||||
{"dsql_incompatible_trigger_type", 336003102},
|
||||
{"dsql_db_trigger_type_cant_change", 336003103},
|
||||
{"dyn_filter_not_found", 336068645},
|
||||
{"dyn_func_not_found", 336068649},
|
||||
{"dyn_index_not_found", 336068656},
|
||||
{"dyn_view_not_found", 336068662},
|
||||
{"dyn_domain_not_found", 336068697},
|
||||
{"dyn_cant_modify_auto_trig", 336068717},
|
||||
{"dyn_dup_table", 336068740},
|
||||
{"dyn_proc_not_found", 336068748},
|
||||
{"dyn_exception_not_found", 336068752},
|
||||
{"dyn_proc_param_not_found", 336068754},
|
||||
{"dyn_trig_not_found", 336068755},
|
||||
{"dyn_charset_not_found", 336068759},
|
||||
{"dyn_collation_not_found", 336068760},
|
||||
{"dyn_role_not_found", 336068763},
|
||||
{"dyn_name_longer", 336068767},
|
||||
{"dyn_column_does_not_exist", 336068784},
|
||||
{"dyn_role_does_not_exist", 336068796},
|
||||
{"dyn_no_grant_admin_opt", 336068797},
|
||||
@ -765,9 +781,11 @@ static const struct {
|
||||
{"dyn_invalid_dtype_conversion", 336068817},
|
||||
{"dyn_dtype_conv_invalid", 336068818},
|
||||
{"dyn_zero_len_id", 336068820},
|
||||
{"dyn_gen_not_found", 336068822},
|
||||
{"max_coll_per_charset", 336068829},
|
||||
{"invalid_coll_attr", 336068830},
|
||||
{"dyn_wrong_gtt_scope", 336068840},
|
||||
{"dyn_table_not_found", 336068849},
|
||||
{"dyn_scale_too_big", 336068852},
|
||||
{"dyn_precision_too_small", 336068853},
|
||||
{"dyn_miss_priv_warning", 336068855},
|
||||
|
@ -723,6 +723,8 @@ const ISC_STATUS isc_instance_conflict = 335544984L;
|
||||
const ISC_STATUS isc_out_of_temp_space = 335544985L;
|
||||
const ISC_STATUS isc_eds_expl_tran_ctrl = 335544986L;
|
||||
const ISC_STATUS isc_no_trusted_spb = 335544987L;
|
||||
const ISC_STATUS isc_package_name = 335544988L;
|
||||
const ISC_STATUS isc_cannot_make_not_null = 335544989L;
|
||||
const ISC_STATUS isc_gfix_db_name = 335740929L;
|
||||
const ISC_STATUS isc_gfix_invalid_sw = 335740930L;
|
||||
const ISC_STATUS isc_gfix_incmp_sw = 335740932L;
|
||||
@ -780,7 +782,21 @@ const ISC_STATUS isc_upd_ins_doesnt_match_matching = 336003100L;
|
||||
const ISC_STATUS isc_upd_ins_with_complex_view = 336003101L;
|
||||
const ISC_STATUS isc_dsql_incompatible_trigger_type = 336003102L;
|
||||
const ISC_STATUS isc_dsql_db_trigger_type_cant_change = 336003103L;
|
||||
const ISC_STATUS isc_dyn_filter_not_found = 336068645L;
|
||||
const ISC_STATUS isc_dyn_func_not_found = 336068649L;
|
||||
const ISC_STATUS isc_dyn_index_not_found = 336068656L;
|
||||
const ISC_STATUS isc_dyn_view_not_found = 336068662L;
|
||||
const ISC_STATUS isc_dyn_domain_not_found = 336068697L;
|
||||
const ISC_STATUS isc_dyn_cant_modify_auto_trig = 336068717L;
|
||||
const ISC_STATUS isc_dyn_dup_table = 336068740L;
|
||||
const ISC_STATUS isc_dyn_proc_not_found = 336068748L;
|
||||
const ISC_STATUS isc_dyn_exception_not_found = 336068752L;
|
||||
const ISC_STATUS isc_dyn_proc_param_not_found = 336068754L;
|
||||
const ISC_STATUS isc_dyn_trig_not_found = 336068755L;
|
||||
const ISC_STATUS isc_dyn_charset_not_found = 336068759L;
|
||||
const ISC_STATUS isc_dyn_collation_not_found = 336068760L;
|
||||
const ISC_STATUS isc_dyn_role_not_found = 336068763L;
|
||||
const ISC_STATUS isc_dyn_name_longer = 336068767L;
|
||||
const ISC_STATUS isc_dyn_column_does_not_exist = 336068784L;
|
||||
const ISC_STATUS isc_dyn_role_does_not_exist = 336068796L;
|
||||
const ISC_STATUS isc_dyn_no_grant_admin_opt = 336068797L;
|
||||
@ -799,9 +815,11 @@ const ISC_STATUS isc_dyn_char_fld_too_small = 336068816L;
|
||||
const ISC_STATUS isc_dyn_invalid_dtype_conversion = 336068817L;
|
||||
const ISC_STATUS isc_dyn_dtype_conv_invalid = 336068818L;
|
||||
const ISC_STATUS isc_dyn_zero_len_id = 336068820L;
|
||||
const ISC_STATUS isc_dyn_gen_not_found = 336068822L;
|
||||
const ISC_STATUS isc_max_coll_per_charset = 336068829L;
|
||||
const ISC_STATUS isc_invalid_coll_attr = 336068830L;
|
||||
const ISC_STATUS isc_dyn_wrong_gtt_scope = 336068840L;
|
||||
const ISC_STATUS isc_dyn_table_not_found = 336068849L;
|
||||
const ISC_STATUS isc_dyn_scale_too_big = 336068852L;
|
||||
const ISC_STATUS isc_dyn_precision_too_small = 336068853L;
|
||||
const ISC_STATUS isc_dyn_miss_priv_warning = 336068855L;
|
||||
@ -1016,7 +1034,7 @@ const ISC_STATUS isc_fbsvcmgr_fp_open = 336986160L;
|
||||
const ISC_STATUS isc_fbsvcmgr_fp_read = 336986161L;
|
||||
const ISC_STATUS isc_fbsvcmgr_fp_empty = 336986162L;
|
||||
const ISC_STATUS isc_utl_trusted_switch = 337051649L;
|
||||
const ISC_STATUS isc_err_max = 960;
|
||||
const ISC_STATUS isc_err_max = 978;
|
||||
|
||||
#else /* c definitions */
|
||||
|
||||
@ -1709,6 +1727,8 @@ const ISC_STATUS isc_err_max = 960;
|
||||
#define isc_out_of_temp_space 335544985L
|
||||
#define isc_eds_expl_tran_ctrl 335544986L
|
||||
#define isc_no_trusted_spb 335544987L
|
||||
#define isc_package_name 335544988L
|
||||
#define isc_cannot_make_not_null 335544989L
|
||||
#define isc_gfix_db_name 335740929L
|
||||
#define isc_gfix_invalid_sw 335740930L
|
||||
#define isc_gfix_incmp_sw 335740932L
|
||||
@ -1766,7 +1786,21 @@ const ISC_STATUS isc_err_max = 960;
|
||||
#define isc_upd_ins_with_complex_view 336003101L
|
||||
#define isc_dsql_incompatible_trigger_type 336003102L
|
||||
#define isc_dsql_db_trigger_type_cant_change 336003103L
|
||||
#define isc_dyn_filter_not_found 336068645L
|
||||
#define isc_dyn_func_not_found 336068649L
|
||||
#define isc_dyn_index_not_found 336068656L
|
||||
#define isc_dyn_view_not_found 336068662L
|
||||
#define isc_dyn_domain_not_found 336068697L
|
||||
#define isc_dyn_cant_modify_auto_trig 336068717L
|
||||
#define isc_dyn_dup_table 336068740L
|
||||
#define isc_dyn_proc_not_found 336068748L
|
||||
#define isc_dyn_exception_not_found 336068752L
|
||||
#define isc_dyn_proc_param_not_found 336068754L
|
||||
#define isc_dyn_trig_not_found 336068755L
|
||||
#define isc_dyn_charset_not_found 336068759L
|
||||
#define isc_dyn_collation_not_found 336068760L
|
||||
#define isc_dyn_role_not_found 336068763L
|
||||
#define isc_dyn_name_longer 336068767L
|
||||
#define isc_dyn_column_does_not_exist 336068784L
|
||||
#define isc_dyn_role_does_not_exist 336068796L
|
||||
#define isc_dyn_no_grant_admin_opt 336068797L
|
||||
@ -1785,9 +1819,11 @@ const ISC_STATUS isc_err_max = 960;
|
||||
#define isc_dyn_invalid_dtype_conversion 336068817L
|
||||
#define isc_dyn_dtype_conv_invalid 336068818L
|
||||
#define isc_dyn_zero_len_id 336068820L
|
||||
#define isc_dyn_gen_not_found 336068822L
|
||||
#define isc_max_coll_per_charset 336068829L
|
||||
#define isc_invalid_coll_attr 336068830L
|
||||
#define isc_dyn_wrong_gtt_scope 336068840L
|
||||
#define isc_dyn_table_not_found 336068849L
|
||||
#define isc_dyn_scale_too_big 336068852L
|
||||
#define isc_dyn_precision_too_small 336068853L
|
||||
#define isc_dyn_miss_priv_warning 336068855L
|
||||
@ -2002,7 +2038,7 @@ const ISC_STATUS isc_err_max = 960;
|
||||
#define isc_fbsvcmgr_fp_read 336986161L
|
||||
#define isc_fbsvcmgr_fp_empty 336986162L
|
||||
#define isc_utl_trusted_switch 337051649L
|
||||
#define isc_err_max 960
|
||||
#define isc_err_max 978
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -171,6 +171,8 @@
|
||||
const USHORT f_trg_flags = 9;
|
||||
const USHORT f_trg_valid_blr = 10;
|
||||
const USHORT f_trg_debug_info = 11;
|
||||
const USHORT f_trg_engine_name = 12;
|
||||
const USHORT f_trg_entry = 13;
|
||||
|
||||
|
||||
const USHORT f_dpd_name = 0;
|
||||
@ -178,6 +180,7 @@
|
||||
const USHORT f_dpd_f_name = 2;
|
||||
const USHORT f_dpd_type = 3;
|
||||
const USHORT f_dpd_o_type = 4;
|
||||
const USHORT f_dpd_pkg_name = 5;
|
||||
|
||||
|
||||
const USHORT f_fun_name = 0;
|
||||
@ -188,6 +191,10 @@
|
||||
const USHORT f_fun_entry = 5;
|
||||
const USHORT f_fun_ret_arg = 6;
|
||||
const USHORT f_fun_sys_flag = 7;
|
||||
const USHORT f_fun_engine_name = 8;
|
||||
const USHORT f_fun_pkg_name = 9;
|
||||
const USHORT f_fun_private_flag = 10;
|
||||
const USHORT f_fun_source = 11;
|
||||
|
||||
|
||||
const USHORT f_arg_fun_name = 0;
|
||||
@ -200,6 +207,7 @@
|
||||
const USHORT f_arg_charset_id = 7;
|
||||
const USHORT f_arg_precision = 8;
|
||||
const USHORT f_arg_char_length = 9;
|
||||
const USHORT f_arg_pkg_name = 10;
|
||||
|
||||
|
||||
const USHORT f_flt_name = 0;
|
||||
@ -285,6 +293,10 @@
|
||||
const USHORT f_prc_type = 11;
|
||||
const USHORT f_prc_valid_blr = 12;
|
||||
const USHORT f_prc_debug_info = 13;
|
||||
const USHORT f_prc_engine_name = 14;
|
||||
const USHORT f_prc_entry = 15;
|
||||
const USHORT f_prc_pkg_name = 16;
|
||||
const USHORT f_prc_private_flag = 17;
|
||||
|
||||
|
||||
const USHORT f_prm_name = 0;
|
||||
@ -301,6 +313,7 @@
|
||||
const USHORT f_prm_mech = 11;
|
||||
const USHORT f_prm_fname = 12;
|
||||
const USHORT f_prm_rname = 13;
|
||||
const USHORT f_prm_pkg_name = 14;
|
||||
|
||||
|
||||
const USHORT f_cs_cs_name = 0;
|
||||
@ -419,6 +432,7 @@
|
||||
const USHORT f_mon_call_src_line = 6;
|
||||
const USHORT f_mon_call_src_column = 7;
|
||||
const USHORT f_mon_call_stat_id = 8;
|
||||
const USHORT f_mon_call_pkg_name = 9;
|
||||
|
||||
|
||||
const USHORT f_mon_io_stat_id = 0;
|
||||
@ -455,3 +469,15 @@
|
||||
const USHORT f_mon_mem_max_alloc = 5;
|
||||
|
||||
|
||||
// Continue persistent tables
|
||||
|
||||
|
||||
const USHORT f_pkg_name = 0;
|
||||
const USHORT f_pkg_header_source = 1;
|
||||
const USHORT f_pkg_body_source = 2;
|
||||
const USHORT f_pkg_class = 3;
|
||||
const USHORT f_pkg_owner = 4;
|
||||
const USHORT f_pkg_sys_flag = 5;
|
||||
const USHORT f_pkg_desc = 6;
|
||||
|
||||
|
||||
|
@ -252,7 +252,7 @@ static const struct {
|
||||
{335544548, "Attempt to define a second PRIMARY KEY for the same table"}, /* 228, primary_key_exists */
|
||||
{335544549, "cannot modify or erase a system trigger"}, /* 229, systrig_update */
|
||||
{335544550, "only the owner of a table may reassign ownership"}, /* 230, not_rel_owner */
|
||||
{335544551, "could not find table/procedure for GRANT"}, /* 231, grant_obj_notfound */
|
||||
{335544551, "could not find table/procedure/package for GRANT"}, /* 231, grant_obj_notfound */
|
||||
{335544552, "could not find column for GRANT"}, /* 232, grant_fld_notfound */
|
||||
{335544553, "user does not have GRANT privileges for operation"}, /* 233, grant_nopriv */
|
||||
{335544554, "table/procedure has non-SQL security class defined"}, /* 234, nonsql_security_rel */
|
||||
@ -523,11 +523,11 @@ static const struct {
|
||||
{335544819, "File exceeded maximum size of 2GB. Add another database file or use a 64 bit I/O version of Firebird."}, /* 499, io_32bit_exceeded_err */
|
||||
{335544820, "Unable to find savepoint with name @1 in transaction context"}, /* 500, invalid_savepoint */
|
||||
{335544821, "Invalid column position used in the @1 clause"}, /* 501, dsql_column_pos_err */
|
||||
{335544822, "Cannot use an aggregate function in a WHERE clause, use HAVING instead"}, /* 502, dsql_agg_where_err */
|
||||
{335544823, "Cannot use an aggregate function in a GROUP BY clause"}, /* 503, dsql_agg_group_err */
|
||||
{335544822, "Cannot use an aggregate or window function in a WHERE clause, use HAVING (for aggregate only) instead"}, /* 502, dsql_agg_where_err */
|
||||
{335544823, "Cannot use an aggregate or window function in a GROUP BY clause"}, /* 503, dsql_agg_group_err */
|
||||
{335544824, "Invalid expression in the @1 (not contained in either an aggregate function or the GROUP BY clause)"}, /* 504, dsql_agg_column_err */
|
||||
{335544825, "Invalid expression in the @1 (neither an aggregate function nor a part of the GROUP BY clause)"}, /* 505, dsql_agg_having_err */
|
||||
{335544826, "Nested aggregate functions are not allowed"}, /* 506, dsql_agg_nested_err */
|
||||
{335544826, "Nested aggregate and window functions are not allowed"}, /* 506, dsql_agg_nested_err */
|
||||
{335544827, "Invalid argument in EXECUTE STATEMENT - cannot convert to string"}, /* 507, exec_sql_invalid_arg */
|
||||
{335544828, "Wrong request type in EXECUTE STATEMENT '@1'"}, /* 508, exec_sql_invalid_req */
|
||||
{335544829, "Variable type (position @1) in EXECUTE STATEMENT '@2' INTO does not match returned column type"}, /* 509, exec_sql_invalid_var */
|
||||
@ -692,298 +692,316 @@ Data source : @4"}, /* 606, eds_statement */
|
||||
{335544985, "No free space found in temporary directories"}, /* 665, out_of_temp_space */
|
||||
{335544986, "Explicit transaction control is not allowed"}, /* 666, eds_expl_tran_ctrl */
|
||||
{335544987, "Use of TRUSTED switches in spb_command_line is prohibited"}, /* 667, no_trusted_spb */
|
||||
{335740929, "data base file name (@1) already given"}, /* 668, gfix_db_name */
|
||||
{335740930, "invalid switch @1"}, /* 669, gfix_invalid_sw */
|
||||
{335740932, "incompatible switch combination"}, /* 670, gfix_incmp_sw */
|
||||
{335740933, "replay log pathname required"}, /* 671, gfix_replay_req */
|
||||
{335740934, "number of page buffers for cache required"}, /* 672, gfix_pgbuf_req */
|
||||
{335740935, "numeric value required"}, /* 673, gfix_val_req */
|
||||
{335740936, "positive numeric value required"}, /* 674, gfix_pval_req */
|
||||
{335740937, "number of transactions per sweep required"}, /* 675, gfix_trn_req */
|
||||
{335740940, "\"full\" or \"reserve\" required"}, /* 676, gfix_full_req */
|
||||
{335740941, "user name required"}, /* 677, gfix_usrname_req */
|
||||
{335740942, "password required"}, /* 678, gfix_pass_req */
|
||||
{335740943, "subsystem name"}, /* 679, gfix_subs_name */
|
||||
{335740944, "\"wal\" required"}, /* 680, gfix_wal_req */
|
||||
{335740945, "number of seconds required"}, /* 681, gfix_sec_req */
|
||||
{335740946, "numeric value between 0 and 32767 inclusive required"}, /* 682, gfix_nval_req */
|
||||
{335740947, "must specify type of shutdown"}, /* 683, gfix_type_shut */
|
||||
{335740948, "please retry, specifying an option"}, /* 684, gfix_retry */
|
||||
{335740951, "please retry, giving a database name"}, /* 685, gfix_retry_db */
|
||||
{335740991, "internal block exceeds maximum size"}, /* 686, gfix_exceed_max */
|
||||
{335740992, "corrupt pool"}, /* 687, gfix_corrupt_pool */
|
||||
{335740993, "virtual memory exhausted"}, /* 688, gfix_mem_exhausted */
|
||||
{335740994, "bad pool id"}, /* 689, gfix_bad_pool */
|
||||
{335740995, "Transaction state @1 not in valid range."}, /* 690, gfix_trn_not_valid */
|
||||
{335741012, "unexpected end of input"}, /* 691, gfix_unexp_eoi */
|
||||
{335741018, "failed to reconnect to a transaction in database @1"}, /* 692, gfix_recon_fail */
|
||||
{335741036, "Transaction description item unknown"}, /* 693, gfix_trn_unknown */
|
||||
{335741038, "\"read_only\" or \"read_write\" required"}, /* 694, gfix_mode_req */
|
||||
{335741042, "positive or zero numeric value required"}, /* 695, gfix_pzval_req */
|
||||
{336003074, "Cannot SELECT RDB$DB_KEY from a stored procedure."}, /* 696, dsql_dbkey_from_non_table */
|
||||
{336003075, "Precision 10 to 18 changed from DOUBLE PRECISION in SQL dialect 1 to 64-bit scaled integer in SQL dialect 3"}, /* 697, dsql_transitional_numeric */
|
||||
{336003076, "Use of @1 expression that returns different results in dialect 1 and dialect 3"}, /* 698, dsql_dialect_warning_expr */
|
||||
{336003077, "Database SQL dialect @1 does not support reference to @2 datatype"}, /* 699, sql_db_dialect_dtype_unsupport */
|
||||
{336003079, "DB dialect @1 and client dialect @2 conflict with respect to numeric precision @3."}, /* 700, isc_sql_dialect_conflict_num */
|
||||
{336003080, "WARNING: Numeric literal @1 is interpreted as a floating-point"}, /* 701, dsql_warning_number_ambiguous */
|
||||
{336003081, "value in SQL dialect 1, but as an exact numeric value in SQL dialect 3."}, /* 702, dsql_warning_number_ambiguous1 */
|
||||
{336003082, "WARNING: NUMERIC and DECIMAL fields with precision 10 or greater are stored"}, /* 703, dsql_warn_precision_ambiguous */
|
||||
{336003083, "as approximate floating-point values in SQL dialect 1, but as 64-bit"}, /* 704, dsql_warn_precision_ambiguous1 */
|
||||
{336003084, "integers in SQL dialect 3."}, /* 705, dsql_warn_precision_ambiguous2 */
|
||||
{336003085, "Ambiguous field name between @1 and @2"}, /* 706, dsql_ambiguous_field_name */
|
||||
{336003086, "External function should have return position between 1 and @1"}, /* 707, dsql_udf_return_pos_err */
|
||||
{336003087, "Label @1 @2 in the current scope"}, /* 708, dsql_invalid_label */
|
||||
{336003088, "Datatypes @1are not comparable in expression @2"}, /* 709, dsql_datatypes_not_comparable */
|
||||
{336003089, "Empty cursor name is not allowed"}, /* 710, dsql_cursor_invalid */
|
||||
{336003090, "Statement already has a cursor @1 assigned"}, /* 711, dsql_cursor_redefined */
|
||||
{336003091, "Cursor @1 is not found in the current context"}, /* 712, dsql_cursor_not_found */
|
||||
{336003092, "Cursor @1 already exists in the current context"}, /* 713, dsql_cursor_exists */
|
||||
{336003093, "Relation @1 is ambiguous in cursor @2"}, /* 714, dsql_cursor_rel_ambiguous */
|
||||
{336003094, "Relation @1 is not found in cursor @2"}, /* 715, dsql_cursor_rel_not_found */
|
||||
{336003095, "Cursor is not open"}, /* 716, dsql_cursor_not_open */
|
||||
{336003096, "Data type @1 is not supported for EXTERNAL TABLES. Relation '@2', field '@3'"}, /* 717, dsql_type_not_supp_ext_tab */
|
||||
{336003097, "Feature not supported on ODS version older than @1.@2"}, /* 718, dsql_feature_not_supported_ods */
|
||||
{336003098, "Primary key required on table @1"}, /* 719, primary_key_required */
|
||||
{336003099, "UPDATE OR INSERT field list does not match primary key of table @1"}, /* 720, upd_ins_doesnt_match_pk */
|
||||
{336003100, "UPDATE OR INSERT field list does not match MATCHING clause"}, /* 721, upd_ins_doesnt_match_matching */
|
||||
{336003101, "UPDATE OR INSERT without MATCHING could not be used with views based on more than one table"}, /* 722, upd_ins_with_complex_view */
|
||||
{336003102, "Incompatible trigger type"}, /* 723, dsql_incompatible_trigger_type */
|
||||
{336003103, "Database trigger type can't be changed"}, /* 724, dsql_db_trigger_type_cant_change */
|
||||
{336068740, "Table @1 already exists"}, /* 725, dyn_dup_table */
|
||||
{336068784, "column @1 does not exist in table/view @2"}, /* 726, dyn_column_does_not_exist */
|
||||
{336068796, "SQL role @1 does not exist"}, /* 727, dyn_role_does_not_exist */
|
||||
{336068797, "user @1 has no grant admin option on SQL role @2"}, /* 728, dyn_no_grant_admin_opt */
|
||||
{336068798, "user @1 is not a member of SQL role @2"}, /* 729, dyn_user_not_role_member */
|
||||
{336068799, "@1 is not the owner of SQL role @2"}, /* 730, dyn_delete_role_failed */
|
||||
{336068800, "@1 is a SQL role and not a user"}, /* 731, dyn_grant_role_to_user */
|
||||
{336068801, "user name @1 could not be used for SQL role"}, /* 732, dyn_inv_sql_role_name */
|
||||
{336068802, "SQL role @1 already exists"}, /* 733, dyn_dup_sql_role */
|
||||
{336068803, "keyword @1 can not be used as a SQL role name"}, /* 734, dyn_kywd_spec_for_role */
|
||||
{336068804, "SQL roles are not supported in on older versions of the database. A backup and restore of the database is required."}, /* 735, dyn_roles_not_supported */
|
||||
{336068812, "Cannot rename domain @1 to @2. A domain with that name already exists."}, /* 736, dyn_domain_name_exists */
|
||||
{336068813, "Cannot rename column @1 to @2. A column with that name already exists in table @3."}, /* 737, dyn_field_name_exists */
|
||||
{336068814, "Column @1 from table @2 is referenced in @3"}, /* 738, dyn_dependency_exists */
|
||||
{336068815, "Cannot change datatype for column @1. Changing datatype is not supported for BLOB or ARRAY columns."}, /* 739, dyn_dtype_invalid */
|
||||
{336068816, "New size specified for column @1 must be at least @2 characters."}, /* 740, dyn_char_fld_too_small */
|
||||
{336068817, "Cannot change datatype for @1. Conversion from base type @2 to @3 is not supported."}, /* 741, dyn_invalid_dtype_conversion */
|
||||
{336068818, "Cannot change datatype for column @1 from a character type to a non-character type."}, /* 742, dyn_dtype_conv_invalid */
|
||||
{336068820, "Zero length identifiers are not allowed"}, /* 743, dyn_zero_len_id */
|
||||
{336068829, "Maximum number of collations per character set exceeded"}, /* 744, max_coll_per_charset */
|
||||
{336068830, "Invalid collation attributes"}, /* 745, invalid_coll_attr */
|
||||
{336068840, "@1 cannot reference @2"}, /* 746, dyn_wrong_gtt_scope */
|
||||
{336068852, "New scale specified for column @1 must be at most @2."}, /* 747, dyn_scale_too_big */
|
||||
{336068853, "New precision specified for column @1 must be at least @2."}, /* 748, dyn_precision_too_small */
|
||||
{336068855, "Warning: @1 on @2 is not granted to @3."}, /* 749, dyn_miss_priv_warning */
|
||||
{336068856, "Feature '@1' is not supported in ODS @2.@3"}, /* 750, dyn_ods_not_supp_feature */
|
||||
{336068857, "Cannot add or remove COMPUTED from column @1"}, /* 751, dyn_cannot_addrem_computed */
|
||||
{336068858, "Password should not be empty string"}, /* 752, dyn_no_empty_pw */
|
||||
{336068859, "Index @1 already exists"}, /* 753, dyn_dup_index */
|
||||
{336330753, "found unknown switch"}, /* 754, gbak_unknown_switch */
|
||||
{336330754, "page size parameter missing"}, /* 755, gbak_page_size_missing */
|
||||
{336330755, "Page size specified (@1) greater than limit (16384 bytes)"}, /* 756, gbak_page_size_toobig */
|
||||
{336330756, "redirect location for output is not specified"}, /* 757, gbak_redir_ouput_missing */
|
||||
{336330757, "conflicting switches for backup/restore"}, /* 758, gbak_switches_conflict */
|
||||
{336330758, "device type @1 not known"}, /* 759, gbak_unknown_device */
|
||||
{336330759, "protection is not there yet"}, /* 760, gbak_no_protection */
|
||||
{336330760, "page size is allowed only on restore or create"}, /* 761, gbak_page_size_not_allowed */
|
||||
{336330761, "multiple sources or destinations specified"}, /* 762, gbak_multi_source_dest */
|
||||
{336330762, "requires both input and output filenames"}, /* 763, gbak_filename_missing */
|
||||
{336330763, "input and output have the same name. Disallowed."}, /* 764, gbak_dup_inout_names */
|
||||
{336330764, "expected page size, encountered \"@1\""}, /* 765, gbak_inv_page_size */
|
||||
{336330765, "REPLACE specified, but the first file @1 is a database"}, /* 766, gbak_db_specified */
|
||||
{336330766, "database @1 already exists. To replace it, use the -REP switch"}, /* 767, gbak_db_exists */
|
||||
{336330767, "device type not specified"}, /* 768, gbak_unk_device */
|
||||
{336330772, "gds_$blob_info failed"}, /* 769, gbak_blob_info_failed */
|
||||
{336330773, "do not understand BLOB INFO item @1"}, /* 770, gbak_unk_blob_item */
|
||||
{336330774, "gds_$get_segment failed"}, /* 771, gbak_get_seg_failed */
|
||||
{336330775, "gds_$close_blob failed"}, /* 772, gbak_close_blob_failed */
|
||||
{336330776, "gds_$open_blob failed"}, /* 773, gbak_open_blob_failed */
|
||||
{336330777, "Failed in put_blr_gen_id"}, /* 774, gbak_put_blr_gen_id_failed */
|
||||
{336330778, "data type @1 not understood"}, /* 775, gbak_unk_type */
|
||||
{336330779, "gds_$compile_request failed"}, /* 776, gbak_comp_req_failed */
|
||||
{336330780, "gds_$start_request failed"}, /* 777, gbak_start_req_failed */
|
||||
{336330781, "gds_$receive failed"}, /* 778, gbak_rec_failed */
|
||||
{336330782, "gds_$release_request failed"}, /* 779, gbak_rel_req_failed */
|
||||
{336330783, "gds_$database_info failed"}, /* 780, gbak_db_info_failed */
|
||||
{336330784, "Expected database description record"}, /* 781, gbak_no_db_desc */
|
||||
{336330785, "failed to create database @1"}, /* 782, gbak_db_create_failed */
|
||||
{336330786, "RESTORE: decompression length error"}, /* 783, gbak_decomp_len_error */
|
||||
{336330787, "cannot find table @1"}, /* 784, gbak_tbl_missing */
|
||||
{336330788, "Cannot find column for BLOB"}, /* 785, gbak_blob_col_missing */
|
||||
{336330789, "gds_$create_blob failed"}, /* 786, gbak_create_blob_failed */
|
||||
{336330790, "gds_$put_segment failed"}, /* 787, gbak_put_seg_failed */
|
||||
{336330791, "expected record length"}, /* 788, gbak_rec_len_exp */
|
||||
{336330792, "wrong length record, expected @1 encountered @2"}, /* 789, gbak_inv_rec_len */
|
||||
{336330793, "expected data attribute"}, /* 790, gbak_exp_data_type */
|
||||
{336330794, "Failed in store_blr_gen_id"}, /* 791, gbak_gen_id_failed */
|
||||
{336330795, "do not recognize record type @1"}, /* 792, gbak_unk_rec_type */
|
||||
{336330796, "Expected backup version 1..9. Found @1"}, /* 793, gbak_inv_bkup_ver */
|
||||
{336330797, "expected backup description record"}, /* 794, gbak_missing_bkup_desc */
|
||||
{336330798, "string truncated"}, /* 795, gbak_string_trunc */
|
||||
{336330799, "warning -- record could not be restored"}, /* 796, gbak_cant_rest_record */
|
||||
{336330800, "gds_$send failed"}, /* 797, gbak_send_failed */
|
||||
{336330801, "no table name for data"}, /* 798, gbak_no_tbl_name */
|
||||
{336330802, "unexpected end of file on backup file"}, /* 799, gbak_unexp_eof */
|
||||
{336330803, "database format @1 is too old to restore to"}, /* 800, gbak_db_format_too_old */
|
||||
{336330804, "array dimension for column @1 is invalid"}, /* 801, gbak_inv_array_dim */
|
||||
{336330807, "Expected XDR record length"}, /* 802, gbak_xdr_len_expected */
|
||||
{336330817, "cannot open backup file @1"}, /* 803, gbak_open_bkup_error */
|
||||
{336330818, "cannot open status and error output file @1"}, /* 804, gbak_open_error */
|
||||
{336330934, "blocking factor parameter missing"}, /* 805, gbak_missing_block_fac */
|
||||
{336330935, "expected blocking factor, encountered \"@1\""}, /* 806, gbak_inv_block_fac */
|
||||
{336330936, "a blocking factor may not be used in conjunction with device CT"}, /* 807, gbak_block_fac_specified */
|
||||
{336330940, "user name parameter missing"}, /* 808, gbak_missing_username */
|
||||
{336330941, "password parameter missing"}, /* 809, gbak_missing_password */
|
||||
{336330952, " missing parameter for the number of bytes to be skipped"}, /* 810, gbak_missing_skipped_bytes */
|
||||
{336330953, "expected number of bytes to be skipped, encountered \"@1\""}, /* 811, gbak_inv_skipped_bytes */
|
||||
{336330965, "character set"}, /* 812, gbak_err_restore_charset */
|
||||
{336330967, "collation"}, /* 813, gbak_err_restore_collation */
|
||||
{336330972, "Unexpected I/O error while reading from backup file"}, /* 814, gbak_read_error */
|
||||
{336330973, "Unexpected I/O error while writing to backup file"}, /* 815, gbak_write_error */
|
||||
{336330985, "could not drop database @1 (database might be in use)"}, /* 816, gbak_db_in_use */
|
||||
{336330990, "System memory exhausted"}, /* 817, gbak_sysmemex */
|
||||
{336331002, "SQL role"}, /* 818, gbak_restore_role_failed */
|
||||
{336331005, "SQL role parameter missing"}, /* 819, gbak_role_op_missing */
|
||||
{336331010, "page buffers parameter missing"}, /* 820, gbak_page_buffers_missing */
|
||||
{336331011, "expected page buffers, encountered \"@1\""}, /* 821, gbak_page_buffers_wrong_param */
|
||||
{336331012, "page buffers is allowed only on restore or create"}, /* 822, gbak_page_buffers_restore */
|
||||
{336331014, "size specification either missing or incorrect for file @1"}, /* 823, gbak_inv_size */
|
||||
{336331015, "file @1 out of sequence"}, /* 824, gbak_file_outof_sequence */
|
||||
{336331016, "can't join -- one of the files missing"}, /* 825, gbak_join_file_missing */
|
||||
{336331017, " standard input is not supported when using join operation"}, /* 826, gbak_stdin_not_supptd */
|
||||
{336331018, "standard output is not supported when using split operation"}, /* 827, gbak_stdout_not_supptd */
|
||||
{336331019, "backup file @1 might be corrupt"}, /* 828, gbak_bkup_corrupt */
|
||||
{336331020, "database file specification missing"}, /* 829, gbak_unk_db_file_spec */
|
||||
{336331021, "can't write a header record to file @1"}, /* 830, gbak_hdr_write_failed */
|
||||
{336331022, "free disk space exhausted"}, /* 831, gbak_disk_space_ex */
|
||||
{336331023, "file size given (@1) is less than minimum allowed (@2)"}, /* 832, gbak_size_lt_min */
|
||||
{336331025, "service name parameter missing"}, /* 833, gbak_svc_name_missing */
|
||||
{336331026, "Cannot restore over current database, must be SYSDBA or owner of the existing database."}, /* 834, gbak_not_ownr */
|
||||
{336331031, "\"read_only\" or \"read_write\" required"}, /* 835, gbak_mode_req */
|
||||
{336331033, "just data ignore all constraints etc."}, /* 836, gbak_just_data */
|
||||
{336331034, "restoring data only ignoring foreign key, unique, not null & other constraints"}, /* 837, gbak_data_only */
|
||||
{336397205, "ODS versions before ODS@1 are not supported"}, /* 838, dsql_too_old_ods */
|
||||
{336397206, "Table @1 does not exist"}, /* 839, dsql_table_not_found */
|
||||
{336397207, "View @1 does not exist"}, /* 840, dsql_view_not_found */
|
||||
{336397208, "At line @1, column @2"}, /* 841, dsql_line_col_error */
|
||||
{336397209, "At unknown line and column"}, /* 842, dsql_unknown_pos */
|
||||
{336397210, "Column @1 cannot be repeated in @2 statement"}, /* 843, dsql_no_dup_name */
|
||||
{336397211, "Too many values (more than @1) in member list to match against"}, /* 844, dsql_too_many_values */
|
||||
{336397212, "Array and BLOB data types not allowed in computed field"}, /* 845, dsql_no_array_computed */
|
||||
{336397213, "Implicit domain name @1 not allowed in user created domain"}, /* 846, dsql_implicit_domain_name */
|
||||
{336397214, "scalar operator used on field @1 which is not an array"}, /* 847, dsql_only_can_subscript_array */
|
||||
{336397215, "cannot sort on more than 255 items"}, /* 848, dsql_max_sort_items */
|
||||
{336397216, "cannot group on more than 255 items"}, /* 849, dsql_max_group_items */
|
||||
{336397217, "Cannot include the same field (@1.@2) twice in the ORDER BY clause with conflicting sorting options"}, /* 850, dsql_conflicting_sort_field */
|
||||
{336397218, "column list from derived table @1 has more columns than the number of items in its SELECT statement"}, /* 851, dsql_derived_table_more_columns */
|
||||
{336397219, "column list from derived table @1 has less columns than the number of items in its SELECT statement"}, /* 852, dsql_derived_table_less_columns */
|
||||
{336397220, "no column name specified for column number @1 in derived table @2"}, /* 853, dsql_derived_field_unnamed */
|
||||
{336397221, "column @1 was specified multiple times for derived table @2"}, /* 854, dsql_derived_field_dup_name */
|
||||
{336397222, "Internal dsql error: alias type expected by pass1_expand_select_node"}, /* 855, dsql_derived_alias_select */
|
||||
{336397223, "Internal dsql error: alias type expected by pass1_field"}, /* 856, dsql_derived_alias_field */
|
||||
{336397224, "Internal dsql error: column position out of range in pass1_union_auto_cast"}, /* 857, dsql_auto_field_bad_pos */
|
||||
{336397225, "Recursive CTE member (@1) can refer itself only in FROM clause"}, /* 858, dsql_cte_wrong_reference */
|
||||
{336397226, "CTE '@1' has cyclic dependencies"}, /* 859, dsql_cte_cycle */
|
||||
{336397227, "Recursive member of CTE can't be member of an outer join"}, /* 860, dsql_cte_outer_join */
|
||||
{336397228, "Recursive member of CTE can't reference itself more than once"}, /* 861, dsql_cte_mult_references */
|
||||
{336397229, "Recursive CTE (@1) must be an UNION"}, /* 862, dsql_cte_not_a_union */
|
||||
{336397230, "CTE '@1' defined non-recursive member after recursive"}, /* 863, dsql_cte_nonrecurs_after_recurs */
|
||||
{336397231, "Recursive member of CTE '@1' has @2 clause"}, /* 864, dsql_cte_wrong_clause */
|
||||
{336397232, "Recursive members of CTE (@1) must be linked with another members via UNION ALL"}, /* 865, dsql_cte_union_all */
|
||||
{336397233, "Non-recursive member is missing in CTE '@1'"}, /* 866, dsql_cte_miss_nonrecursive */
|
||||
{336397234, "WITH clause can't be nested"}, /* 867, dsql_cte_nested_with */
|
||||
{336397235, "column @1 appears more than once in USING clause"}, /* 868, dsql_col_more_than_once_using */
|
||||
{336397236, "feature is not supported in dialect @1"}, /* 869, dsql_unsupp_feature_dialect */
|
||||
{336397237, "CTE \"@1\" is not used in query"}, /* 870, dsql_cte_not_used */
|
||||
{336397238, "column @1 appears more than once in ALTER VIEW"}, /* 871, dsql_col_more_than_once_view */
|
||||
{336397239, "@1 is not supported inside IN AUTONOMOUS TRANSACTION block"}, /* 872, dsql_unsupported_in_auto_trans */
|
||||
{336397240, "Unknown node type @1 in dsql/GEN_expr"}, /* 873, dsql_eval_unknode */
|
||||
{336397241, "Argument for @1 in dialect 1 must be string or numeric"}, /* 874, dsql_agg_wrongarg */
|
||||
{336397242, "Argument for @1 in dialect 3 must be numeric"}, /* 875, dsql_agg2_wrongarg */
|
||||
{336397243, "Strings cannot be added to or subtracted from DATE or TIME types"}, /* 876, dsql_nodateortime_pm_string */
|
||||
{336397244, "Invalid data type for subtraction involving DATE, TIME or TIMESTAMP types"}, /* 877, dsql_invalid_datetime_subtract */
|
||||
{336397245, "Adding two DATE values or two TIME values is not allowed"}, /* 878, dsql_invalid_dateortime_add */
|
||||
{336397246, "DATE value cannot be subtracted from the provided data type"}, /* 879, dsql_invalid_type_minus_date */
|
||||
{336397247, "Strings cannot be added or subtracted in dialect 3"}, /* 880, dsql_nostring_addsub_dial3 */
|
||||
{336397248, "Invalid data type for addition or subtraction in dialect 3"}, /* 881, dsql_invalid_type_addsub_dial3 */
|
||||
{336397249, "Invalid data type for multiplication in dialect 1"}, /* 882, dsql_invalid_type_multip_dial1 */
|
||||
{336397250, "Strings cannot be multiplied in dialect 3"}, /* 883, dsql_nostring_multip_dial3 */
|
||||
{336397251, "Invalid data type for multiplication in dialect 3"}, /* 884, dsql_invalid_type_multip_dial3 */
|
||||
{336397252, "Division in dialect 1 must be between numeric data types"}, /* 885, dsql_mustuse_numeric_div_dial1 */
|
||||
{336397253, "Strings cannot be divided in dialect 3"}, /* 886, dsql_nostring_div_dial3 */
|
||||
{336397254, "Invalid data type for division in dialect 3"}, /* 887, dsql_invalid_type_div_dial3 */
|
||||
{336397255, "Strings cannot be negated (applied the minus operator) in dialect 3"}, /* 888, dsql_nostring_neg_dial3 */
|
||||
{336397256, "Invalid data type for negation (minus operator)"}, /* 889, dsql_invalid_type_neg */
|
||||
{336397257, "Cannot have more than 255 items in DISTINCT list"}, /* 890, dsql_max_distinct_items */
|
||||
{336723983, "unable to open database"}, /* 891, gsec_cant_open_db */
|
||||
{336723984, "error in switch specifications"}, /* 892, gsec_switches_error */
|
||||
{336723985, "no operation specified"}, /* 893, gsec_no_op_spec */
|
||||
{336723986, "no user name specified"}, /* 894, gsec_no_usr_name */
|
||||
{336723987, "add record error"}, /* 895, gsec_err_add */
|
||||
{336723988, "modify record error"}, /* 896, gsec_err_modify */
|
||||
{336723989, "find/modify record error"}, /* 897, gsec_err_find_mod */
|
||||
{336723990, "record not found for user: @1"}, /* 898, gsec_err_rec_not_found */
|
||||
{336723991, "delete record error"}, /* 899, gsec_err_delete */
|
||||
{336723992, "find/delete record error"}, /* 900, gsec_err_find_del */
|
||||
{336723996, "find/display record error"}, /* 901, gsec_err_find_disp */
|
||||
{336723997, "invalid parameter, no switch defined"}, /* 902, gsec_inv_param */
|
||||
{336723998, "operation already specified"}, /* 903, gsec_op_specified */
|
||||
{336723999, "password already specified"}, /* 904, gsec_pw_specified */
|
||||
{336724000, "uid already specified"}, /* 905, gsec_uid_specified */
|
||||
{336724001, "gid already specified"}, /* 906, gsec_gid_specified */
|
||||
{336724002, "project already specified"}, /* 907, gsec_proj_specified */
|
||||
{336724003, "organization already specified"}, /* 908, gsec_org_specified */
|
||||
{336724004, "first name already specified"}, /* 909, gsec_fname_specified */
|
||||
{336724005, "middle name already specified"}, /* 910, gsec_mname_specified */
|
||||
{336724006, "last name already specified"}, /* 911, gsec_lname_specified */
|
||||
{336724008, "invalid switch specified"}, /* 912, gsec_inv_switch */
|
||||
{336724009, "ambiguous switch specified"}, /* 913, gsec_amb_switch */
|
||||
{336724010, "no operation specified for parameters"}, /* 914, gsec_no_op_specified */
|
||||
{336724011, "no parameters allowed for this operation"}, /* 915, gsec_params_not_allowed */
|
||||
{336724012, "incompatible switches specified"}, /* 916, gsec_incompat_switch */
|
||||
{336724044, "Invalid user name (maximum 31 bytes allowed)"}, /* 917, gsec_inv_username */
|
||||
{336724045, "Warning - maximum 8 significant bytes of password used"}, /* 918, gsec_inv_pw_length */
|
||||
{336724046, "database already specified"}, /* 919, gsec_db_specified */
|
||||
{336724047, "database administrator name already specified"}, /* 920, gsec_db_admin_specified */
|
||||
{336724048, "database administrator password already specified"}, /* 921, gsec_db_admin_pw_specified */
|
||||
{336724049, "SQL role name already specified"}, /* 922, gsec_sql_role_specified */
|
||||
{336789504, "The license file does not exist or could not be opened for read"}, /* 923, license_no_file */
|
||||
{336789523, "operation already specified"}, /* 924, license_op_specified */
|
||||
{336789524, "no operation specified"}, /* 925, license_op_missing */
|
||||
{336789525, "invalid switch"}, /* 926, license_inv_switch */
|
||||
{336789526, "invalid switch combination"}, /* 927, license_inv_switch_combo */
|
||||
{336789527, "illegal operation/switch combination"}, /* 928, license_inv_op_combo */
|
||||
{336789528, "ambiguous switch"}, /* 929, license_amb_switch */
|
||||
{336789529, "invalid parameter, no switch specified"}, /* 930, license_inv_parameter */
|
||||
{336789530, "switch does not take any parameter"}, /* 931, license_param_specified */
|
||||
{336789531, "switch requires a parameter"}, /* 932, license_param_req */
|
||||
{336789532, "syntax error in command line"}, /* 933, license_syntx_error */
|
||||
{336789534, "The certificate was not added. A duplicate ID exists in the license file."}, /* 934, license_dup_id */
|
||||
{336789535, "The certificate was not added. Invalid certificate ID / Key combination."}, /* 935, license_inv_id_key */
|
||||
{336789536, "The certificate was not removed. The key does not exist or corresponds to a temporary evaluation license."}, /* 936, license_err_remove */
|
||||
{336789537, "An error occurred updating the license file. Operation cancelled."}, /* 937, license_err_update */
|
||||
{336789538, "The certificate could not be validated based on the information given. Please recheck the ID and key information."}, /* 938, license_err_convert */
|
||||
{336789539, "Operation failed. An unknown error occurred."}, /* 939, license_err_unk */
|
||||
{336789540, "Add license operation failed, KEY: @1 ID: @2"}, /* 940, license_svc_err_add */
|
||||
{336789541, "Remove license operation failed, KEY: @1"}, /* 941, license_svc_err_remove */
|
||||
{336789563, "The evaluation license has already been used on this server. You need to purchase a non-evaluation license."}, /* 942, license_eval_exists */
|
||||
{336920577, "found unknown switch"}, /* 943, gstat_unknown_switch */
|
||||
{336920578, "please retry, giving a database name"}, /* 944, gstat_retry */
|
||||
{336920579, "Wrong ODS version, expected @1, encountered @2"}, /* 945, gstat_wrong_ods */
|
||||
{336920580, "Unexpected end of database file."}, /* 946, gstat_unexpected_eof */
|
||||
{336920605, "Can't open database file @1"}, /* 947, gstat_open_err */
|
||||
{336920606, "Can't read a database page"}, /* 948, gstat_read_err */
|
||||
{336920607, "System memory exhausted"}, /* 949, gstat_sysmemex */
|
||||
{336986113, "Wrong value for access mode"}, /* 950, fbsvcmgr_bad_am */
|
||||
{336986114, "Wrong value for write mode"}, /* 951, fbsvcmgr_bad_wm */
|
||||
{336986115, "Wrong value for reserve space"}, /* 952, fbsvcmgr_bad_rs */
|
||||
{336986116, "Unknown tag (@1) in info_svr_db_info block after isc_svc_query()"}, /* 953, fbsvcmgr_info_err */
|
||||
{336986117, "Unknown tag (@1) in isc_svc_query() results"}, /* 954, fbsvcmgr_query_err */
|
||||
{336986118, "Unknown switch \"@1\""}, /* 955, fbsvcmgr_switch_unknown */
|
||||
{336986159, "Wrong value for shutdown mode"}, /* 956, fbsvcmgr_bad_sm */
|
||||
{336986160, "could not open file @1"}, /* 957, fbsvcmgr_fp_open */
|
||||
{336986161, "could not read file @1"}, /* 958, fbsvcmgr_fp_read */
|
||||
{336986162, "empty file @1"}, /* 959, fbsvcmgr_fp_empty */
|
||||
{337051649, "Switches trusted_svc and trusted_role are not supported from command line"}, /* 960, utl_trusted_switch */
|
||||
{335544988, "PACKAGE @1"}, /* 668, package_name */
|
||||
{335544989, "Cannot make field @1 NOT NULL because there are NULLs present"}, /* 669, cannot_make_not_null */
|
||||
{335740929, "data base file name (@1) already given"}, /* 670, gfix_db_name */
|
||||
{335740930, "invalid switch @1"}, /* 671, gfix_invalid_sw */
|
||||
{335740932, "incompatible switch combination"}, /* 672, gfix_incmp_sw */
|
||||
{335740933, "replay log pathname required"}, /* 673, gfix_replay_req */
|
||||
{335740934, "number of page buffers for cache required"}, /* 674, gfix_pgbuf_req */
|
||||
{335740935, "numeric value required"}, /* 675, gfix_val_req */
|
||||
{335740936, "positive numeric value required"}, /* 676, gfix_pval_req */
|
||||
{335740937, "number of transactions per sweep required"}, /* 677, gfix_trn_req */
|
||||
{335740940, "\"full\" or \"reserve\" required"}, /* 678, gfix_full_req */
|
||||
{335740941, "user name required"}, /* 679, gfix_usrname_req */
|
||||
{335740942, "password required"}, /* 680, gfix_pass_req */
|
||||
{335740943, "subsystem name"}, /* 681, gfix_subs_name */
|
||||
{335740944, "\"wal\" required"}, /* 682, gfix_wal_req */
|
||||
{335740945, "number of seconds required"}, /* 683, gfix_sec_req */
|
||||
{335740946, "numeric value between 0 and 32767 inclusive required"}, /* 684, gfix_nval_req */
|
||||
{335740947, "must specify type of shutdown"}, /* 685, gfix_type_shut */
|
||||
{335740948, "please retry, specifying an option"}, /* 686, gfix_retry */
|
||||
{335740951, "please retry, giving a database name"}, /* 687, gfix_retry_db */
|
||||
{335740991, "internal block exceeds maximum size"}, /* 688, gfix_exceed_max */
|
||||
{335740992, "corrupt pool"}, /* 689, gfix_corrupt_pool */
|
||||
{335740993, "virtual memory exhausted"}, /* 690, gfix_mem_exhausted */
|
||||
{335740994, "bad pool id"}, /* 691, gfix_bad_pool */
|
||||
{335740995, "Transaction state @1 not in valid range."}, /* 692, gfix_trn_not_valid */
|
||||
{335741012, "unexpected end of input"}, /* 693, gfix_unexp_eoi */
|
||||
{335741018, "failed to reconnect to a transaction in database @1"}, /* 694, gfix_recon_fail */
|
||||
{335741036, "Transaction description item unknown"}, /* 695, gfix_trn_unknown */
|
||||
{335741038, "\"read_only\" or \"read_write\" required"}, /* 696, gfix_mode_req */
|
||||
{335741042, "positive or zero numeric value required"}, /* 697, gfix_pzval_req */
|
||||
{336003074, "Cannot SELECT RDB$DB_KEY from a stored procedure."}, /* 698, dsql_dbkey_from_non_table */
|
||||
{336003075, "Precision 10 to 18 changed from DOUBLE PRECISION in SQL dialect 1 to 64-bit scaled integer in SQL dialect 3"}, /* 699, dsql_transitional_numeric */
|
||||
{336003076, "Use of @1 expression that returns different results in dialect 1 and dialect 3"}, /* 700, dsql_dialect_warning_expr */
|
||||
{336003077, "Database SQL dialect @1 does not support reference to @2 datatype"}, /* 701, sql_db_dialect_dtype_unsupport */
|
||||
{336003079, "DB dialect @1 and client dialect @2 conflict with respect to numeric precision @3."}, /* 702, isc_sql_dialect_conflict_num */
|
||||
{336003080, "WARNING: Numeric literal @1 is interpreted as a floating-point"}, /* 703, dsql_warning_number_ambiguous */
|
||||
{336003081, "value in SQL dialect 1, but as an exact numeric value in SQL dialect 3."}, /* 704, dsql_warning_number_ambiguous1 */
|
||||
{336003082, "WARNING: NUMERIC and DECIMAL fields with precision 10 or greater are stored"}, /* 705, dsql_warn_precision_ambiguous */
|
||||
{336003083, "as approximate floating-point values in SQL dialect 1, but as 64-bit"}, /* 706, dsql_warn_precision_ambiguous1 */
|
||||
{336003084, "integers in SQL dialect 3."}, /* 707, dsql_warn_precision_ambiguous2 */
|
||||
{336003085, "Ambiguous field name between @1 and @2"}, /* 708, dsql_ambiguous_field_name */
|
||||
{336003086, "External function should have return position between 1 and @1"}, /* 709, dsql_udf_return_pos_err */
|
||||
{336003087, "Label @1 @2 in the current scope"}, /* 710, dsql_invalid_label */
|
||||
{336003088, "Datatypes @1are not comparable in expression @2"}, /* 711, dsql_datatypes_not_comparable */
|
||||
{336003089, "Empty cursor name is not allowed"}, /* 712, dsql_cursor_invalid */
|
||||
{336003090, "Statement already has a cursor @1 assigned"}, /* 713, dsql_cursor_redefined */
|
||||
{336003091, "Cursor @1 is not found in the current context"}, /* 714, dsql_cursor_not_found */
|
||||
{336003092, "Cursor @1 already exists in the current context"}, /* 715, dsql_cursor_exists */
|
||||
{336003093, "Relation @1 is ambiguous in cursor @2"}, /* 716, dsql_cursor_rel_ambiguous */
|
||||
{336003094, "Relation @1 is not found in cursor @2"}, /* 717, dsql_cursor_rel_not_found */
|
||||
{336003095, "Cursor is not open"}, /* 718, dsql_cursor_not_open */
|
||||
{336003096, "Data type @1 is not supported for EXTERNAL TABLES. Relation '@2', field '@3'"}, /* 719, dsql_type_not_supp_ext_tab */
|
||||
{336003097, "Feature not supported on ODS version older than @1.@2"}, /* 720, dsql_feature_not_supported_ods */
|
||||
{336003098, "Primary key required on table @1"}, /* 721, primary_key_required */
|
||||
{336003099, "UPDATE OR INSERT field list does not match primary key of table @1"}, /* 722, upd_ins_doesnt_match_pk */
|
||||
{336003100, "UPDATE OR INSERT field list does not match MATCHING clause"}, /* 723, upd_ins_doesnt_match_matching */
|
||||
{336003101, "UPDATE OR INSERT without MATCHING could not be used with views based on more than one table"}, /* 724, upd_ins_with_complex_view */
|
||||
{336003102, "Incompatible trigger type"}, /* 725, dsql_incompatible_trigger_type */
|
||||
{336003103, "Database trigger type can't be changed"}, /* 726, dsql_db_trigger_type_cant_change */
|
||||
{336068645, "BLOB Filter @1 not found"}, /* 727, dyn_filter_not_found */
|
||||
{336068649, "Function @1 not found"}, /* 728, dyn_func_not_found */
|
||||
{336068656, "Index not found"}, /* 729, dyn_index_not_found */
|
||||
{336068662, "View @1 not found"}, /* 730, dyn_view_not_found */
|
||||
{336068697, "Domain not found"}, /* 731, dyn_domain_not_found */
|
||||
{336068717, "Triggers created automatically cannot be modified"}, /* 732, dyn_cant_modify_auto_trig */
|
||||
{336068740, "Table @1 already exists"}, /* 733, dyn_dup_table */
|
||||
{336068748, "Procedure @1 not found"}, /* 734, dyn_proc_not_found */
|
||||
{336068752, "Exception not found"}, /* 735, dyn_exception_not_found */
|
||||
{336068754, "Parameter @1 in procedure @2 not found"}, /* 736, dyn_proc_param_not_found */
|
||||
{336068755, "Trigger @1 not found"}, /* 737, dyn_trig_not_found */
|
||||
{336068759, "Character set @1 not found"}, /* 738, dyn_charset_not_found */
|
||||
{336068760, "Collation @1 not found"}, /* 739, dyn_collation_not_found */
|
||||
{336068763, "Role @1 not found"}, /* 740, dyn_role_not_found */
|
||||
{336068767, "Name longer than database column size"}, /* 741, dyn_name_longer */
|
||||
{336068784, "column @1 does not exist in table/view @2"}, /* 742, dyn_column_does_not_exist */
|
||||
{336068796, "SQL role @1 does not exist"}, /* 743, dyn_role_does_not_exist */
|
||||
{336068797, "user @1 has no grant admin option on SQL role @2"}, /* 744, dyn_no_grant_admin_opt */
|
||||
{336068798, "user @1 is not a member of SQL role @2"}, /* 745, dyn_user_not_role_member */
|
||||
{336068799, "@1 is not the owner of SQL role @2"}, /* 746, dyn_delete_role_failed */
|
||||
{336068800, "@1 is a SQL role and not a user"}, /* 747, dyn_grant_role_to_user */
|
||||
{336068801, "user name @1 could not be used for SQL role"}, /* 748, dyn_inv_sql_role_name */
|
||||
{336068802, "SQL role @1 already exists"}, /* 749, dyn_dup_sql_role */
|
||||
{336068803, "keyword @1 can not be used as a SQL role name"}, /* 750, dyn_kywd_spec_for_role */
|
||||
{336068804, "SQL roles are not supported in on older versions of the database. A backup and restore of the database is required."}, /* 751, dyn_roles_not_supported */
|
||||
{336068812, "Cannot rename domain @1 to @2. A domain with that name already exists."}, /* 752, dyn_domain_name_exists */
|
||||
{336068813, "Cannot rename column @1 to @2. A column with that name already exists in table @3."}, /* 753, dyn_field_name_exists */
|
||||
{336068814, "Column @1 from table @2 is referenced in @3"}, /* 754, dyn_dependency_exists */
|
||||
{336068815, "Cannot change datatype for column @1. Changing datatype is not supported for BLOB or ARRAY columns."}, /* 755, dyn_dtype_invalid */
|
||||
{336068816, "New size specified for column @1 must be at least @2 characters."}, /* 756, dyn_char_fld_too_small */
|
||||
{336068817, "Cannot change datatype for @1. Conversion from base type @2 to @3 is not supported."}, /* 757, dyn_invalid_dtype_conversion */
|
||||
{336068818, "Cannot change datatype for column @1 from a character type to a non-character type."}, /* 758, dyn_dtype_conv_invalid */
|
||||
{336068820, "Zero length identifiers are not allowed"}, /* 759, dyn_zero_len_id */
|
||||
{336068822, "Generator @1 not found"}, /* 760, dyn_gen_not_found */
|
||||
{336068829, "Maximum number of collations per character set exceeded"}, /* 761, max_coll_per_charset */
|
||||
{336068830, "Invalid collation attributes"}, /* 762, invalid_coll_attr */
|
||||
{336068840, "@1 cannot reference @2"}, /* 763, dyn_wrong_gtt_scope */
|
||||
{336068849, "Table @1 not found"}, /* 764, dyn_table_not_found */
|
||||
{336068852, "New scale specified for column @1 must be at most @2."}, /* 765, dyn_scale_too_big */
|
||||
{336068853, "New precision specified for column @1 must be at least @2."}, /* 766, dyn_precision_too_small */
|
||||
{336068855, "Warning: @1 on @2 is not granted to @3."}, /* 767, dyn_miss_priv_warning */
|
||||
{336068856, "Feature '@1' is not supported in ODS @2.@3"}, /* 768, dyn_ods_not_supp_feature */
|
||||
{336068857, "Cannot add or remove COMPUTED from column @1"}, /* 769, dyn_cannot_addrem_computed */
|
||||
{336068858, "Password should not be empty string"}, /* 770, dyn_no_empty_pw */
|
||||
{336068859, "Index @1 already exists"}, /* 771, dyn_dup_index */
|
||||
{336330753, "found unknown switch"}, /* 772, gbak_unknown_switch */
|
||||
{336330754, "page size parameter missing"}, /* 773, gbak_page_size_missing */
|
||||
{336330755, "Page size specified (@1) greater than limit (16384 bytes)"}, /* 774, gbak_page_size_toobig */
|
||||
{336330756, "redirect location for output is not specified"}, /* 775, gbak_redir_ouput_missing */
|
||||
{336330757, "conflicting switches for backup/restore"}, /* 776, gbak_switches_conflict */
|
||||
{336330758, "device type @1 not known"}, /* 777, gbak_unknown_device */
|
||||
{336330759, "protection is not there yet"}, /* 778, gbak_no_protection */
|
||||
{336330760, "page size is allowed only on restore or create"}, /* 779, gbak_page_size_not_allowed */
|
||||
{336330761, "multiple sources or destinations specified"}, /* 780, gbak_multi_source_dest */
|
||||
{336330762, "requires both input and output filenames"}, /* 781, gbak_filename_missing */
|
||||
{336330763, "input and output have the same name. Disallowed."}, /* 782, gbak_dup_inout_names */
|
||||
{336330764, "expected page size, encountered \"@1\""}, /* 783, gbak_inv_page_size */
|
||||
{336330765, "REPLACE specified, but the first file @1 is a database"}, /* 784, gbak_db_specified */
|
||||
{336330766, "database @1 already exists. To replace it, use the -REP switch"}, /* 785, gbak_db_exists */
|
||||
{336330767, "device type not specified"}, /* 786, gbak_unk_device */
|
||||
{336330772, "gds_$blob_info failed"}, /* 787, gbak_blob_info_failed */
|
||||
{336330773, "do not understand BLOB INFO item @1"}, /* 788, gbak_unk_blob_item */
|
||||
{336330774, "gds_$get_segment failed"}, /* 789, gbak_get_seg_failed */
|
||||
{336330775, "gds_$close_blob failed"}, /* 790, gbak_close_blob_failed */
|
||||
{336330776, "gds_$open_blob failed"}, /* 791, gbak_open_blob_failed */
|
||||
{336330777, "Failed in put_blr_gen_id"}, /* 792, gbak_put_blr_gen_id_failed */
|
||||
{336330778, "data type @1 not understood"}, /* 793, gbak_unk_type */
|
||||
{336330779, "gds_$compile_request failed"}, /* 794, gbak_comp_req_failed */
|
||||
{336330780, "gds_$start_request failed"}, /* 795, gbak_start_req_failed */
|
||||
{336330781, "gds_$receive failed"}, /* 796, gbak_rec_failed */
|
||||
{336330782, "gds_$release_request failed"}, /* 797, gbak_rel_req_failed */
|
||||
{336330783, "gds_$database_info failed"}, /* 798, gbak_db_info_failed */
|
||||
{336330784, "Expected database description record"}, /* 799, gbak_no_db_desc */
|
||||
{336330785, "failed to create database @1"}, /* 800, gbak_db_create_failed */
|
||||
{336330786, "RESTORE: decompression length error"}, /* 801, gbak_decomp_len_error */
|
||||
{336330787, "cannot find table @1"}, /* 802, gbak_tbl_missing */
|
||||
{336330788, "Cannot find column for BLOB"}, /* 803, gbak_blob_col_missing */
|
||||
{336330789, "gds_$create_blob failed"}, /* 804, gbak_create_blob_failed */
|
||||
{336330790, "gds_$put_segment failed"}, /* 805, gbak_put_seg_failed */
|
||||
{336330791, "expected record length"}, /* 806, gbak_rec_len_exp */
|
||||
{336330792, "wrong length record, expected @1 encountered @2"}, /* 807, gbak_inv_rec_len */
|
||||
{336330793, "expected data attribute"}, /* 808, gbak_exp_data_type */
|
||||
{336330794, "Failed in store_blr_gen_id"}, /* 809, gbak_gen_id_failed */
|
||||
{336330795, "do not recognize record type @1"}, /* 810, gbak_unk_rec_type */
|
||||
{336330796, "Expected backup version 1..9. Found @1"}, /* 811, gbak_inv_bkup_ver */
|
||||
{336330797, "expected backup description record"}, /* 812, gbak_missing_bkup_desc */
|
||||
{336330798, "string truncated"}, /* 813, gbak_string_trunc */
|
||||
{336330799, "warning -- record could not be restored"}, /* 814, gbak_cant_rest_record */
|
||||
{336330800, "gds_$send failed"}, /* 815, gbak_send_failed */
|
||||
{336330801, "no table name for data"}, /* 816, gbak_no_tbl_name */
|
||||
{336330802, "unexpected end of file on backup file"}, /* 817, gbak_unexp_eof */
|
||||
{336330803, "database format @1 is too old to restore to"}, /* 818, gbak_db_format_too_old */
|
||||
{336330804, "array dimension for column @1 is invalid"}, /* 819, gbak_inv_array_dim */
|
||||
{336330807, "Expected XDR record length"}, /* 820, gbak_xdr_len_expected */
|
||||
{336330817, "cannot open backup file @1"}, /* 821, gbak_open_bkup_error */
|
||||
{336330818, "cannot open status and error output file @1"}, /* 822, gbak_open_error */
|
||||
{336330934, "blocking factor parameter missing"}, /* 823, gbak_missing_block_fac */
|
||||
{336330935, "expected blocking factor, encountered \"@1\""}, /* 824, gbak_inv_block_fac */
|
||||
{336330936, "a blocking factor may not be used in conjunction with device CT"}, /* 825, gbak_block_fac_specified */
|
||||
{336330940, "user name parameter missing"}, /* 826, gbak_missing_username */
|
||||
{336330941, "password parameter missing"}, /* 827, gbak_missing_password */
|
||||
{336330952, " missing parameter for the number of bytes to be skipped"}, /* 828, gbak_missing_skipped_bytes */
|
||||
{336330953, "expected number of bytes to be skipped, encountered \"@1\""}, /* 829, gbak_inv_skipped_bytes */
|
||||
{336330965, "character set"}, /* 830, gbak_err_restore_charset */
|
||||
{336330967, "collation"}, /* 831, gbak_err_restore_collation */
|
||||
{336330972, "Unexpected I/O error while reading from backup file"}, /* 832, gbak_read_error */
|
||||
{336330973, "Unexpected I/O error while writing to backup file"}, /* 833, gbak_write_error */
|
||||
{336330985, "could not drop database @1 (database might be in use)"}, /* 834, gbak_db_in_use */
|
||||
{336330990, "System memory exhausted"}, /* 835, gbak_sysmemex */
|
||||
{336331002, "SQL role"}, /* 836, gbak_restore_role_failed */
|
||||
{336331005, "SQL role parameter missing"}, /* 837, gbak_role_op_missing */
|
||||
{336331010, "page buffers parameter missing"}, /* 838, gbak_page_buffers_missing */
|
||||
{336331011, "expected page buffers, encountered \"@1\""}, /* 839, gbak_page_buffers_wrong_param */
|
||||
{336331012, "page buffers is allowed only on restore or create"}, /* 840, gbak_page_buffers_restore */
|
||||
{336331014, "size specification either missing or incorrect for file @1"}, /* 841, gbak_inv_size */
|
||||
{336331015, "file @1 out of sequence"}, /* 842, gbak_file_outof_sequence */
|
||||
{336331016, "can't join -- one of the files missing"}, /* 843, gbak_join_file_missing */
|
||||
{336331017, " standard input is not supported when using join operation"}, /* 844, gbak_stdin_not_supptd */
|
||||
{336331018, "standard output is not supported when using split operation"}, /* 845, gbak_stdout_not_supptd */
|
||||
{336331019, "backup file @1 might be corrupt"}, /* 846, gbak_bkup_corrupt */
|
||||
{336331020, "database file specification missing"}, /* 847, gbak_unk_db_file_spec */
|
||||
{336331021, "can't write a header record to file @1"}, /* 848, gbak_hdr_write_failed */
|
||||
{336331022, "free disk space exhausted"}, /* 849, gbak_disk_space_ex */
|
||||
{336331023, "file size given (@1) is less than minimum allowed (@2)"}, /* 850, gbak_size_lt_min */
|
||||
{336331025, "service name parameter missing"}, /* 851, gbak_svc_name_missing */
|
||||
{336331026, "Cannot restore over current database, must be SYSDBA or owner of the existing database."}, /* 852, gbak_not_ownr */
|
||||
{336331031, "\"read_only\" or \"read_write\" required"}, /* 853, gbak_mode_req */
|
||||
{336331033, "just data ignore all constraints etc."}, /* 854, gbak_just_data */
|
||||
{336331034, "restoring data only ignoring foreign key, unique, not null & other constraints"}, /* 855, gbak_data_only */
|
||||
{336397205, "ODS versions before ODS@1 are not supported"}, /* 856, dsql_too_old_ods */
|
||||
{336397206, "Table @1 does not exist"}, /* 857, dsql_table_not_found */
|
||||
{336397207, "View @1 does not exist"}, /* 858, dsql_view_not_found */
|
||||
{336397208, "At line @1, column @2"}, /* 859, dsql_line_col_error */
|
||||
{336397209, "At unknown line and column"}, /* 860, dsql_unknown_pos */
|
||||
{336397210, "Column @1 cannot be repeated in @2 statement"}, /* 861, dsql_no_dup_name */
|
||||
{336397211, "Too many values (more than @1) in member list to match against"}, /* 862, dsql_too_many_values */
|
||||
{336397212, "Array and BLOB data types not allowed in computed field"}, /* 863, dsql_no_array_computed */
|
||||
{336397213, "Implicit domain name @1 not allowed in user created domain"}, /* 864, dsql_implicit_domain_name */
|
||||
{336397214, "scalar operator used on field @1 which is not an array"}, /* 865, dsql_only_can_subscript_array */
|
||||
{336397215, "cannot sort on more than 255 items"}, /* 866, dsql_max_sort_items */
|
||||
{336397216, "cannot group on more than 255 items"}, /* 867, dsql_max_group_items */
|
||||
{336397217, "Cannot include the same field (@1.@2) twice in the ORDER BY clause with conflicting sorting options"}, /* 868, dsql_conflicting_sort_field */
|
||||
{336397218, "column list from derived table @1 has more columns than the number of items in its SELECT statement"}, /* 869, dsql_derived_table_more_columns */
|
||||
{336397219, "column list from derived table @1 has less columns than the number of items in its SELECT statement"}, /* 870, dsql_derived_table_less_columns */
|
||||
{336397220, "no column name specified for column number @1 in derived table @2"}, /* 871, dsql_derived_field_unnamed */
|
||||
{336397221, "column @1 was specified multiple times for derived table @2"}, /* 872, dsql_derived_field_dup_name */
|
||||
{336397222, "Internal dsql error: alias type expected by pass1_expand_select_node"}, /* 873, dsql_derived_alias_select */
|
||||
{336397223, "Internal dsql error: alias type expected by pass1_field"}, /* 874, dsql_derived_alias_field */
|
||||
{336397224, "Internal dsql error: column position out of range in pass1_union_auto_cast"}, /* 875, dsql_auto_field_bad_pos */
|
||||
{336397225, "Recursive CTE member (@1) can refer itself only in FROM clause"}, /* 876, dsql_cte_wrong_reference */
|
||||
{336397226, "CTE '@1' has cyclic dependencies"}, /* 877, dsql_cte_cycle */
|
||||
{336397227, "Recursive member of CTE can't be member of an outer join"}, /* 878, dsql_cte_outer_join */
|
||||
{336397228, "Recursive member of CTE can't reference itself more than once"}, /* 879, dsql_cte_mult_references */
|
||||
{336397229, "Recursive CTE (@1) must be an UNION"}, /* 880, dsql_cte_not_a_union */
|
||||
{336397230, "CTE '@1' defined non-recursive member after recursive"}, /* 881, dsql_cte_nonrecurs_after_recurs */
|
||||
{336397231, "Recursive member of CTE '@1' has @2 clause"}, /* 882, dsql_cte_wrong_clause */
|
||||
{336397232, "Recursive members of CTE (@1) must be linked with another members via UNION ALL"}, /* 883, dsql_cte_union_all */
|
||||
{336397233, "Non-recursive member is missing in CTE '@1'"}, /* 884, dsql_cte_miss_nonrecursive */
|
||||
{336397234, "WITH clause can't be nested"}, /* 885, dsql_cte_nested_with */
|
||||
{336397235, "column @1 appears more than once in USING clause"}, /* 886, dsql_col_more_than_once_using */
|
||||
{336397236, "feature is not supported in dialect @1"}, /* 887, dsql_unsupp_feature_dialect */
|
||||
{336397237, "CTE \"@1\" is not used in query"}, /* 888, dsql_cte_not_used */
|
||||
{336397238, "column @1 appears more than once in ALTER VIEW"}, /* 889, dsql_col_more_than_once_view */
|
||||
{336397239, "@1 is not supported inside IN AUTONOMOUS TRANSACTION block"}, /* 890, dsql_unsupported_in_auto_trans */
|
||||
{336397240, "Unknown node type @1 in dsql/GEN_expr"}, /* 891, dsql_eval_unknode */
|
||||
{336397241, "Argument for @1 in dialect 1 must be string or numeric"}, /* 892, dsql_agg_wrongarg */
|
||||
{336397242, "Argument for @1 in dialect 3 must be numeric"}, /* 893, dsql_agg2_wrongarg */
|
||||
{336397243, "Strings cannot be added to or subtracted from DATE or TIME types"}, /* 894, dsql_nodateortime_pm_string */
|
||||
{336397244, "Invalid data type for subtraction involving DATE, TIME or TIMESTAMP types"}, /* 895, dsql_invalid_datetime_subtract */
|
||||
{336397245, "Adding two DATE values or two TIME values is not allowed"}, /* 896, dsql_invalid_dateortime_add */
|
||||
{336397246, "DATE value cannot be subtracted from the provided data type"}, /* 897, dsql_invalid_type_minus_date */
|
||||
{336397247, "Strings cannot be added or subtracted in dialect 3"}, /* 898, dsql_nostring_addsub_dial3 */
|
||||
{336397248, "Invalid data type for addition or subtraction in dialect 3"}, /* 899, dsql_invalid_type_addsub_dial3 */
|
||||
{336397249, "Invalid data type for multiplication in dialect 1"}, /* 900, dsql_invalid_type_multip_dial1 */
|
||||
{336397250, "Strings cannot be multiplied in dialect 3"}, /* 901, dsql_nostring_multip_dial3 */
|
||||
{336397251, "Invalid data type for multiplication in dialect 3"}, /* 902, dsql_invalid_type_multip_dial3 */
|
||||
{336397252, "Division in dialect 1 must be between numeric data types"}, /* 903, dsql_mustuse_numeric_div_dial1 */
|
||||
{336397253, "Strings cannot be divided in dialect 3"}, /* 904, dsql_nostring_div_dial3 */
|
||||
{336397254, "Invalid data type for division in dialect 3"}, /* 905, dsql_invalid_type_div_dial3 */
|
||||
{336397255, "Strings cannot be negated (applied the minus operator) in dialect 3"}, /* 906, dsql_nostring_neg_dial3 */
|
||||
{336397256, "Invalid data type for negation (minus operator)"}, /* 907, dsql_invalid_type_neg */
|
||||
{336397257, "Cannot have more than 255 items in DISTINCT list"}, /* 908, dsql_max_distinct_items */
|
||||
{336723983, "unable to open database"}, /* 909, gsec_cant_open_db */
|
||||
{336723984, "error in switch specifications"}, /* 910, gsec_switches_error */
|
||||
{336723985, "no operation specified"}, /* 911, gsec_no_op_spec */
|
||||
{336723986, "no user name specified"}, /* 912, gsec_no_usr_name */
|
||||
{336723987, "add record error"}, /* 913, gsec_err_add */
|
||||
{336723988, "modify record error"}, /* 914, gsec_err_modify */
|
||||
{336723989, "find/modify record error"}, /* 915, gsec_err_find_mod */
|
||||
{336723990, "record not found for user: @1"}, /* 916, gsec_err_rec_not_found */
|
||||
{336723991, "delete record error"}, /* 917, gsec_err_delete */
|
||||
{336723992, "find/delete record error"}, /* 918, gsec_err_find_del */
|
||||
{336723996, "find/display record error"}, /* 919, gsec_err_find_disp */
|
||||
{336723997, "invalid parameter, no switch defined"}, /* 920, gsec_inv_param */
|
||||
{336723998, "operation already specified"}, /* 921, gsec_op_specified */
|
||||
{336723999, "password already specified"}, /* 922, gsec_pw_specified */
|
||||
{336724000, "uid already specified"}, /* 923, gsec_uid_specified */
|
||||
{336724001, "gid already specified"}, /* 924, gsec_gid_specified */
|
||||
{336724002, "project already specified"}, /* 925, gsec_proj_specified */
|
||||
{336724003, "organization already specified"}, /* 926, gsec_org_specified */
|
||||
{336724004, "first name already specified"}, /* 927, gsec_fname_specified */
|
||||
{336724005, "middle name already specified"}, /* 928, gsec_mname_specified */
|
||||
{336724006, "last name already specified"}, /* 929, gsec_lname_specified */
|
||||
{336724008, "invalid switch specified"}, /* 930, gsec_inv_switch */
|
||||
{336724009, "ambiguous switch specified"}, /* 931, gsec_amb_switch */
|
||||
{336724010, "no operation specified for parameters"}, /* 932, gsec_no_op_specified */
|
||||
{336724011, "no parameters allowed for this operation"}, /* 933, gsec_params_not_allowed */
|
||||
{336724012, "incompatible switches specified"}, /* 934, gsec_incompat_switch */
|
||||
{336724044, "Invalid user name (maximum 31 bytes allowed)"}, /* 935, gsec_inv_username */
|
||||
{336724045, "Warning - maximum 8 significant bytes of password used"}, /* 936, gsec_inv_pw_length */
|
||||
{336724046, "database already specified"}, /* 937, gsec_db_specified */
|
||||
{336724047, "database administrator name already specified"}, /* 938, gsec_db_admin_specified */
|
||||
{336724048, "database administrator password already specified"}, /* 939, gsec_db_admin_pw_specified */
|
||||
{336724049, "SQL role name already specified"}, /* 940, gsec_sql_role_specified */
|
||||
{336789504, "The license file does not exist or could not be opened for read"}, /* 941, license_no_file */
|
||||
{336789523, "operation already specified"}, /* 942, license_op_specified */
|
||||
{336789524, "no operation specified"}, /* 943, license_op_missing */
|
||||
{336789525, "invalid switch"}, /* 944, license_inv_switch */
|
||||
{336789526, "invalid switch combination"}, /* 945, license_inv_switch_combo */
|
||||
{336789527, "illegal operation/switch combination"}, /* 946, license_inv_op_combo */
|
||||
{336789528, "ambiguous switch"}, /* 947, license_amb_switch */
|
||||
{336789529, "invalid parameter, no switch specified"}, /* 948, license_inv_parameter */
|
||||
{336789530, "switch does not take any parameter"}, /* 949, license_param_specified */
|
||||
{336789531, "switch requires a parameter"}, /* 950, license_param_req */
|
||||
{336789532, "syntax error in command line"}, /* 951, license_syntx_error */
|
||||
{336789534, "The certificate was not added. A duplicate ID exists in the license file."}, /* 952, license_dup_id */
|
||||
{336789535, "The certificate was not added. Invalid certificate ID / Key combination."}, /* 953, license_inv_id_key */
|
||||
{336789536, "The certificate was not removed. The key does not exist or corresponds to a temporary evaluation license."}, /* 954, license_err_remove */
|
||||
{336789537, "An error occurred updating the license file. Operation cancelled."}, /* 955, license_err_update */
|
||||
{336789538, "The certificate could not be validated based on the information given. Please recheck the ID and key information."}, /* 956, license_err_convert */
|
||||
{336789539, "Operation failed. An unknown error occurred."}, /* 957, license_err_unk */
|
||||
{336789540, "Add license operation failed, KEY: @1 ID: @2"}, /* 958, license_svc_err_add */
|
||||
{336789541, "Remove license operation failed, KEY: @1"}, /* 959, license_svc_err_remove */
|
||||
{336789563, "The evaluation license has already been used on this server. You need to purchase a non-evaluation license."}, /* 960, license_eval_exists */
|
||||
{336920577, "found unknown switch"}, /* 961, gstat_unknown_switch */
|
||||
{336920578, "please retry, giving a database name"}, /* 962, gstat_retry */
|
||||
{336920579, "Wrong ODS version, expected @1, encountered @2"}, /* 963, gstat_wrong_ods */
|
||||
{336920580, "Unexpected end of database file."}, /* 964, gstat_unexpected_eof */
|
||||
{336920605, "Can't open database file @1"}, /* 965, gstat_open_err */
|
||||
{336920606, "Can't read a database page"}, /* 966, gstat_read_err */
|
||||
{336920607, "System memory exhausted"}, /* 967, gstat_sysmemex */
|
||||
{336986113, "Wrong value for access mode"}, /* 968, fbsvcmgr_bad_am */
|
||||
{336986114, "Wrong value for write mode"}, /* 969, fbsvcmgr_bad_wm */
|
||||
{336986115, "Wrong value for reserve space"}, /* 970, fbsvcmgr_bad_rs */
|
||||
{336986116, "Unknown tag (@1) in info_svr_db_info block after isc_svc_query()"}, /* 971, fbsvcmgr_info_err */
|
||||
{336986117, "Unknown tag (@1) in isc_svc_query() results"}, /* 972, fbsvcmgr_query_err */
|
||||
{336986118, "Unknown switch \"@1\""}, /* 973, fbsvcmgr_switch_unknown */
|
||||
{336986159, "Wrong value for shutdown mode"}, /* 974, fbsvcmgr_bad_sm */
|
||||
{336986160, "could not open file @1"}, /* 975, fbsvcmgr_fp_open */
|
||||
{336986161, "could not read file @1"}, /* 976, fbsvcmgr_fp_read */
|
||||
{336986162, "empty file @1"}, /* 977, fbsvcmgr_fp_empty */
|
||||
{337051649, "Switches trusted_svc and trusted_role are not supported from command line"}, /* 978, utl_trusted_switch */
|
||||
{0, NULL}
|
||||
};
|
||||
|
@ -688,6 +688,8 @@ static const struct {
|
||||
{335544985, -901}, /* 665 out_of_temp_space */
|
||||
{335544986, -901}, /* 666 eds_expl_tran_ctrl */
|
||||
{335544987, -902}, /* 667 no_trusted_spb */
|
||||
{335544988, -901}, /* 668 package_name */
|
||||
{335544989, -901}, /* 669 cannot_make_not_null */
|
||||
{335740929, -901}, /* 1 gfix_db_name */
|
||||
{335740930, -901}, /* 2 gfix_invalid_sw */
|
||||
{335740932, -901}, /* 4 gfix_incmp_sw */
|
||||
@ -745,7 +747,21 @@ static const struct {
|
||||
{336003101, -817}, /* 29 upd_ins_with_complex_view */
|
||||
{336003102, -817}, /* 30 dsql_incompatible_trigger_type */
|
||||
{336003103, -817}, /* 31 dsql_db_trigger_type_cant_change */
|
||||
{336068645, -901}, /* 37 dyn_filter_not_found */
|
||||
{336068649, -901}, /* 41 dyn_func_not_found */
|
||||
{336068656, -901}, /* 48 dyn_index_not_found */
|
||||
{336068662, -901}, /* 54 dyn_view_not_found */
|
||||
{336068697, -901}, /* 89 dyn_domain_not_found */
|
||||
{336068717, -901}, /* 109 dyn_cant_modify_auto_trig */
|
||||
{336068740, -901}, /* 132 dyn_dup_table */
|
||||
{336068748, -901}, /* 140 dyn_proc_not_found */
|
||||
{336068752, -901}, /* 144 dyn_exception_not_found */
|
||||
{336068754, -901}, /* 146 dyn_proc_param_not_found */
|
||||
{336068755, -901}, /* 147 dyn_trig_not_found */
|
||||
{336068759, -901}, /* 151 dyn_charset_not_found */
|
||||
{336068760, -901}, /* 152 dyn_collation_not_found */
|
||||
{336068763, -901}, /* 155 dyn_role_not_found */
|
||||
{336068767, -901}, /* 159 dyn_name_longer */
|
||||
{336068784, -901}, /* 176 dyn_column_does_not_exist */
|
||||
{336068796, -901}, /* 188 dyn_role_does_not_exist */
|
||||
{336068797, -901}, /* 189 dyn_no_grant_admin_opt */
|
||||
@ -764,9 +780,11 @@ static const struct {
|
||||
{336068817, -829}, /* 209 dyn_invalid_dtype_conversion */
|
||||
{336068818, -829}, /* 210 dyn_dtype_conv_invalid */
|
||||
{336068820, -901}, /* 212 dyn_zero_len_id */
|
||||
{336068822, -901}, /* 214 dyn_gen_not_found */
|
||||
{336068829, -829}, /* 221 max_coll_per_charset */
|
||||
{336068830, -829}, /* 222 invalid_coll_attr */
|
||||
{336068840, -901}, /* 232 dyn_wrong_gtt_scope */
|
||||
{336068849, -901}, /* 241 dyn_table_not_found */
|
||||
{336068852, -829}, /* 244 dyn_scale_too_big */
|
||||
{336068853, -829}, /* 245 dyn_precision_too_small */
|
||||
{336068855, 106}, /* 247 dyn_miss_priv_warning */
|
||||
|
@ -688,6 +688,8 @@ static const struct {
|
||||
{335544985, "HY000"}, // 665 out_of_temp_space
|
||||
{335544986, "42000"}, // 666 eds_expl_tran_ctrl
|
||||
{335544987, "28000"}, // 667 no_trusted_spb
|
||||
{335544988, "42000"}, // 668 package_name
|
||||
{335544989, "22006"}, // 669 cannot_make_not_null
|
||||
{335740929, "00000"}, // 1 gfix_db_name
|
||||
{335740930, "00000"}, // 2 gfix_invalid_sw
|
||||
{335740932, "00000"}, // 4 gfix_incmp_sw
|
||||
@ -745,7 +747,21 @@ static const struct {
|
||||
{336003101, "54001"}, // 29 upd_ins_with_complex_view
|
||||
{336003102, "42000"}, // 30 dsql_incompatible_trigger_type
|
||||
{336003103, "42000"}, // 31 dsql_db_trigger_type_cant_change
|
||||
{336068645, "42000"}, // 37 dyn_filter_not_found
|
||||
{336068649, "42000"}, // 41 dyn_func_not_found
|
||||
{336068656, "42000"}, // 48 dyn_index_not_found
|
||||
{336068662, "42000"}, // 54 dyn_view_not_found
|
||||
{336068697, "42000"}, // 89 dyn_domain_not_found
|
||||
{336068717, "42000"}, // 109 dyn_cant_modify_auto_trig
|
||||
{336068740, "42S01"}, // 132 dyn_dup_table
|
||||
{336068748, "42000"}, // 140 dyn_proc_not_found
|
||||
{336068752, "42000"}, // 144 dyn_exception_not_found
|
||||
{336068754, "42000"}, // 146 dyn_proc_param_not_found
|
||||
{336068755, "42000"}, // 147 dyn_trig_not_found
|
||||
{336068759, "42000"}, // 151 dyn_charset_not_found
|
||||
{336068760, "42000"}, // 152 dyn_collation_not_found
|
||||
{336068763, "42000"}, // 155 dyn_role_not_found
|
||||
{336068767, "42000"}, // 159 dyn_name_longer
|
||||
{336068784, "42S22"}, // 176 dyn_column_does_not_exist
|
||||
{336068796, "28000"}, // 188 dyn_role_does_not_exist
|
||||
{336068797, "28000"}, // 189 dyn_no_grant_admin_opt
|
||||
@ -764,9 +780,11 @@ static const struct {
|
||||
{336068817, "42000"}, // 209 dyn_invalid_dtype_conversion
|
||||
{336068818, "42000"}, // 210 dyn_dtype_conv_invalid
|
||||
{336068820, "42000"}, // 212 dyn_zero_len_id
|
||||
{336068822, "42000"}, // 214 dyn_gen_not_found
|
||||
{336068829, "2C000"}, // 221 max_coll_per_charset
|
||||
{336068830, "HY000"}, // 222 invalid_coll_attr
|
||||
{336068840, "HY000"}, // 232 dyn_wrong_gtt_scope
|
||||
{336068849, "42000"}, // 241 dyn_table_not_found
|
||||
{336068852, "42000"}, // 244 dyn_scale_too_big
|
||||
{336068853, "42000"}, // 245 dyn_precision_too_small
|
||||
{336068855, "42000"}, // 247 dyn_miss_priv_warning
|
||||
|
@ -5496,6 +5496,9 @@ static processing_state get_statement(TEXT* const statement,
|
||||
in_double_quoted_string
|
||||
} state = normal;
|
||||
|
||||
char lastChar = '\0';
|
||||
char altQuoteChar = '\0';
|
||||
|
||||
while (!done)
|
||||
{
|
||||
SSHORT c = getNextInputChar();
|
||||
@ -5624,10 +5627,36 @@ static processing_state get_statement(TEXT* const statement,
|
||||
switch (state)
|
||||
{
|
||||
case normal:
|
||||
if (lastChar == 'q' || lastChar == 'Q')
|
||||
{
|
||||
*p++ = lastChar = c;
|
||||
count++;
|
||||
altQuoteChar = c = getNextInputChar();
|
||||
|
||||
switch (altQuoteChar)
|
||||
{
|
||||
case '{':
|
||||
altQuoteChar = '}';
|
||||
break;
|
||||
case '(':
|
||||
altQuoteChar = ')';
|
||||
break;
|
||||
case '[':
|
||||
altQuoteChar = ']';
|
||||
break;
|
||||
case '<':
|
||||
altQuoteChar = '>';
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
altQuoteChar = '\0';
|
||||
|
||||
state = in_single_quoted_string;
|
||||
break;
|
||||
case in_single_quoted_string:
|
||||
state = normal;
|
||||
if (!altQuoteChar || lastChar == altQuoteChar)
|
||||
state = normal;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@ -5673,7 +5702,7 @@ static processing_state get_statement(TEXT* const statement,
|
||||
}
|
||||
}
|
||||
|
||||
*p++ = c;
|
||||
*p++ = lastChar = c;
|
||||
count++;
|
||||
|
||||
if (count > bufsize && !done)
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user