From: <asf...@us...> - 2010-06-04 23:15:50
|
Revision: 51203 http://firebird.svn.sourceforge.net/firebird/?rev=51203&view=rev Author: asfernandes Date: 2010-06-04 23:14:48 +0000 (Fri, 04 Jun 2010) Log Message: ----------- Set svn:eol-style to native Modified Paths: -------------- firebird/trunk/ChangeLog firebird/trunk/builds/install/arch-specific/darwin/License.txt firebird/trunk/extern/editline/configure firebird/trunk/extern/icu/as_is/os390/unpax-icu.sh firebird/trunk/extern/icu/source/extra/uconv/samples/iso8859-1.txt firebird/trunk/extern/icu/source/extra/uconv/samples/utf8/greek.txt firebird/trunk/extern/icu/source/test/unalignedtest/unaligned.c Property Changed: ---------------- firebird/trunk/ChangeLog firebird/trunk/Makefile.in firebird/trunk/acx_pthread.m4 firebird/trunk/autogen.sh firebird/trunk/binreloc.m4 firebird/trunk/builds/install/arch-specific/aix/Makefile.in firebird/trunk/builds/install/arch-specific/aix/classic/makeInstallImage.sh.in firebird/trunk/builds/install/arch-specific/aix/classic/rpmfiles.txt.in firebird/trunk/builds/install/arch-specific/aix/classic/rpmheader.txt.in firebird/trunk/builds/install/arch-specific/aix/misc/aixLibrary.sh.in firebird/trunk/builds/install/arch-specific/aix/misc/firebird.init.d.aix.in firebird/trunk/builds/install/arch-specific/aix/misc/postinstall.sh.in firebird/trunk/builds/install/arch-specific/aix/misc/postuninstall.sh.in firebird/trunk/builds/install/arch-specific/aix/misc/preinstall.sh.in firebird/trunk/builds/install/arch-specific/aix/misc/preuninstall.sh.in firebird/trunk/builds/install/arch-specific/aix/misc/rc.config.firebird.aix.in firebird/trunk/builds/install/arch-specific/aix/misc/tarinstall.sh.in firebird/trunk/builds/install/arch-specific/aix/misc/tarmaininstall.sh.in firebird/trunk/builds/install/arch-specific/aix/misc/tarmainuninstall.sh.in firebird/trunk/builds/install/arch-specific/aix/misc/taruninstall.sh.in firebird/trunk/builds/install/arch-specific/darwin/Description.plist firebird/trunk/builds/install/arch-specific/darwin/FB.info firebird/trunk/builds/install/arch-specific/darwin/Firebird.startupitem/Firebird firebird/trunk/builds/install/arch-specific/darwin/Firebird.startupitem/Resources/English.lproj/Localizable.strings firebird/trunk/builds/install/arch-specific/darwin/Firebird.startupitem/StartupParameters.plist firebird/trunk/builds/install/arch-specific/darwin/FrameworkInfo.plist firebird/trunk/builds/install/arch-specific/darwin/Info.plist firebird/trunk/builds/install/arch-specific/darwin/License.txt firebird/trunk/builds/install/arch-specific/darwin/Makefile.in firebird/trunk/builds/install/arch-specific/darwin/PkgInfo firebird/trunk/builds/install/arch-specific/darwin/Readme.txt firebird/trunk/builds/install/arch-specific/darwin/Welcome.txt firebird/trunk/builds/install/arch-specific/darwin/aliases.conf.in firebird/trunk/builds/install/arch-specific/darwin/buildno.c firebird/trunk/builds/install/arch-specific/darwin/buildsuffix.c firebird/trunk/builds/install/arch-specific/darwin/changeMultiConnectMode firebird/trunk/builds/install/arch-specific/darwin/fullvers.c firebird/trunk/builds/install/arch-specific/darwin/install-script firebird/trunk/builds/install/arch-specific/darwin/launchd.org.firebird.gds.plist firebird/trunk/builds/install/arch-specific/darwin/majorvers.c firebird/trunk/builds/install/arch-specific/darwin/minorvers.c firebird/trunk/builds/install/arch-specific/darwin/preinstall-script firebird/trunk/builds/install/arch-specific/darwin/preupgrade-script firebird/trunk/builds/install/arch-specific/darwin/revno.c firebird/trunk/builds/install/arch-specific/freebsd/Makefile.in firebird/trunk/builds/install/arch-specific/freebsd/freebsdLibrary.sh.in firebird/trunk/builds/install/arch-specific/freebsd/install.sh.in firebird/trunk/builds/install/arch-specific/hpux/Makefile.in firebird/trunk/builds/install/arch-specific/hpux/classic/firebirdCS.psf.in firebird/trunk/builds/install/arch-specific/hpux/classic/makeinstallImage.sh.in firebird/trunk/builds/install/arch-specific/hpux/classic/postInstall.sh.in firebird/trunk/builds/install/arch-specific/hpux/classic/postUninstall.sh.in firebird/trunk/builds/install/arch-specific/hpux/classic/preInstall.sh.in firebird/trunk/builds/install/arch-specific/hpux/classic/preUninstall.sh.in firebird/trunk/builds/install/arch-specific/hpux/classic/tarInstall.sh.in firebird/trunk/builds/install/arch-specific/hpux/classic/tarUninstall.sh.in firebird/trunk/builds/install/arch-specific/hpux/classic/tarmainInstall.sh.in firebird/trunk/builds/install/arch-specific/hpux/classic/tarmainUninstall.sh.in firebird/trunk/builds/install/arch-specific/hpux/misc/changedbaPassword.sh.in firebird/trunk/builds/install/arch-specific/hpux/misc/changegdslibrarycompatibleLink.sh.in firebird/trunk/builds/install/arch-specific/hpux/misc/createaliasDB.sh.in firebird/trunk/builds/install/arch-specific/hpux/misc/firebird.init.d.hpux.in firebird/trunk/builds/install/arch-specific/hpux/misc/hpuxLibrary.sh.in firebird/trunk/builds/install/arch-specific/hpux/misc/rc.config.firebird.hpux.in firebird/trunk/builds/install/arch-specific/hpux/super/makeinstallImage.sh.in firebird/trunk/builds/install/arch-specific/hpux/super/postInstall.sh.in firebird/trunk/builds/install/arch-specific/hpux/super/postUninstall.sh.in firebird/trunk/builds/install/arch-specific/hpux/super/preInstall.sh.in firebird/trunk/builds/install/arch-specific/hpux/super/preUninstall.sh.in firebird/trunk/builds/install/arch-specific/hpux/super/tarInstall.sh.in firebird/trunk/builds/install/arch-specific/hpux/super/tarUninstall.sh.in firebird/trunk/builds/install/arch-specific/hpux/super/tarmainInstall.sh.in firebird/trunk/builds/install/arch-specific/hpux/super/tarmainUninstall.sh.in firebird/trunk/builds/install/arch-specific/linux/Makefile.in firebird/trunk/builds/install/arch-specific/linux/classic/rpmfiles.txt.in firebird/trunk/builds/install/arch-specific/linux/classic/rpmheader.txt.in firebird/trunk/builds/install/arch-specific/linux/misc/README firebird/trunk/builds/install/arch-specific/linux/misc/firebird.init.d.debian.in firebird/trunk/builds/install/arch-specific/linux/misc/firebird.init.d.generic.in firebird/trunk/builds/install/arch-specific/linux/misc/firebird.init.d.gentoo.in firebird/trunk/builds/install/arch-specific/linux/misc/firebird.init.d.mandrake.in firebird/trunk/builds/install/arch-specific/linux/misc/firebird.init.d.slackware.in firebird/trunk/builds/install/arch-specific/linux/misc/firebird.init.d.suse.in firebird/trunk/builds/install/arch-specific/linux/misc/firebird.xinetd.in firebird/trunk/builds/install/arch-specific/linux/misc/linuxLibrary.sh.in firebird/trunk/builds/install/arch-specific/linux/misc/makeInstallImage.sh.in firebird/trunk/builds/install/arch-specific/linux/misc/postinstall.sh.in firebird/trunk/builds/install/arch-specific/linux/misc/postuninstall.sh.in firebird/trunk/builds/install/arch-specific/linux/misc/preinstall.sh.in firebird/trunk/builds/install/arch-specific/linux/misc/preuninstall.sh.in firebird/trunk/builds/install/arch-specific/linux/misc/rc.config.firebird.in firebird/trunk/builds/install/arch-specific/linux/misc/tarMainInstall.sh.in firebird/trunk/builds/install/arch-specific/linux/misc/tarMainUninstall.sh.in firebird/trunk/builds/install/arch-specific/linux/misc/tarinstall.sh.in firebird/trunk/builds/install/arch-specific/linux/misc/taruninstall.sh.in firebird/trunk/builds/install/arch-specific/linux/super/rpmfiles.txt.in firebird/trunk/builds/install/arch-specific/linux/super/rpmheader.txt.in firebird/trunk/builds/install/arch-specific/mingw/Makefile.in firebird/trunk/builds/install/arch-specific/mingw/super/Readme.txt firebird/trunk/builds/install/arch-specific/netbsd/Makefile.in firebird/trunk/builds/install/arch-specific/netbsd/install.sh.in firebird/trunk/builds/install/arch-specific/solaris/CS/gds_db-tcp.xml firebird/trunk/builds/install/arch-specific/solaris/CS/pkginfo.in firebird/trunk/builds/install/arch-specific/solaris/CS/postinstall.in firebird/trunk/builds/install/arch-specific/solaris/CS/postremove.in firebird/trunk/builds/install/arch-specific/solaris/CS/preinstall.in firebird/trunk/builds/install/arch-specific/solaris/CS/prototype.icu.in firebird/trunk/builds/install/arch-specific/solaris/CS/prototype.in firebird/trunk/builds/install/arch-specific/solaris/Makefile.in firebird/trunk/builds/install/arch-specific/solaris/SS/gds_db-tcp.xml firebird/trunk/builds/install/arch-specific/solaris/SS/pkginfo.in firebird/trunk/builds/install/arch-specific/solaris/SS/postinstall.in firebird/trunk/builds/install/arch-specific/solaris/SS/postremove.in firebird/trunk/builds/install/arch-specific/solaris/SS/preinstall.in firebird/trunk/builds/install/arch-specific/solaris/SS/prototype.icu.in firebird/trunk/builds/install/arch-specific/solaris/SS/prototype.in firebird/trunk/builds/install/arch-specific/solaris/libgcc/pkginfolg.in firebird/trunk/builds/install/arch-specific/solaris/libgcc/prototypelg.in firebird/trunk/builds/install/arch-specific/solx86/Makefile.in firebird/trunk/builds/install/arch-specific/win32/After_Installation.url firebird/trunk/builds/install/arch-specific/win32/BuildExecutableInstall.bat firebird/trunk/builds/install/arch-specific/win32/FirebirdInstallEnvironmentChecks.inc firebird/trunk/builds/install/arch-specific/win32/FirebirdInstallSupportFunctions.inc firebird/trunk/builds/install/arch-specific/win32/FirebirdInstall_20.iss firebird/trunk/builds/install/arch-specific/win32/Readme.txt firebird/trunk/builds/install/arch-specific/win32/ba/Instalacija_ProcitajMe.txt firebird/trunk/builds/install/arch-specific/win32/ba/ProcitajMe.txt firebird/trunk/builds/install/arch-specific/win32/ba/custom_messages_ba.inc firebird/trunk/builds/install/arch-specific/win32/custom_messages.inc firebird/trunk/builds/install/arch-specific/win32/de/custom_messages_de.inc firebird/trunk/builds/install/arch-specific/win32/de/installation_liesmich.txt firebird/trunk/builds/install/arch-specific/win32/de/liesmich.txt firebird/trunk/builds/install/arch-specific/win32/es/custom_messages_es.inc firebird/trunk/builds/install/arch-specific/win32/es/leame.txt firebird/trunk/builds/install/arch-specific/win32/es/leame_instalacion.txt firebird/trunk/builds/install/arch-specific/win32/firebirdsql.org.url firebird/trunk/builds/install/arch-specific/win32/fr/custom_messages_fr.inc firebird/trunk/builds/install/arch-specific/win32/fr/documents-en-francais.txt firebird/trunk/builds/install/arch-specific/win32/fr/installation_lisezmoi.txt firebird/trunk/builds/install/arch-specific/win32/fr/lisezmoi.txt firebird/trunk/builds/install/arch-specific/win32/hu/custom_messages_hu.inc firebird/trunk/builds/install/arch-specific/win32/hu/olvass_el.txt firebird/trunk/builds/install/arch-specific/win32/hu/telepitesi_segedlet.txt firebird/trunk/builds/install/arch-specific/win32/i18n_readme.txt firebird/trunk/builds/install/arch-specific/win32/install_classic.bat firebird/trunk/builds/install/arch-specific/win32/install_super.bat firebird/trunk/builds/install/arch-specific/win32/installation_readme.txt firebird/trunk/builds/install/arch-specific/win32/installation_scripted.txt firebird/trunk/builds/install/arch-specific/win32/it/custom_messages_it.inc firebird/trunk/builds/install/arch-specific/win32/it/leggimi.txt firebird/trunk/builds/install/arch-specific/win32/it/leggimi_installazione.txt firebird/trunk/builds/install/arch-specific/win32/pl/custom_messages_pl.inc firebird/trunk/builds/install/arch-specific/win32/pl/czytajto.txt firebird/trunk/builds/install/arch-specific/win32/pl/instalacja_czytajto.txt firebird/trunk/builds/install/arch-specific/win32/pt/custom_messages_pt.inc firebird/trunk/builds/install/arch-specific/win32/pt/instalacao_leia-me.txt firebird/trunk/builds/install/arch-specific/win32/pt/leia-me.txt firebird/trunk/builds/install/arch-specific/win32/readme_snapshot.txt firebird/trunk/builds/install/arch-specific/win32/si/custom_messages_si.inc firebird/trunk/builds/install/arch-specific/win32/si/instalacija_precitajMe.txt firebird/trunk/builds/install/arch-specific/win32/strip_comments.sed firebird/trunk/builds/install/arch-specific/win32/uninstall.bat firebird/trunk/builds/install/misc/IDPLicense.txt firebird/trunk/builds/install/misc/IPLicense.txt firebird/trunk/builds/install/misc/aliases.conf.in firebird/trunk/builds/install/misc/changeDBAPassword.sh.in firebird/trunk/builds/install/misc/changeGdsLibraryCompatibleLink.sh.in firebird/trunk/builds/install/misc/changeMultiConnectMode.sh.in firebird/trunk/builds/install/misc/changeRunUser.sh.in firebird/trunk/builds/install/misc/classicLibrary.sh.in firebird/trunk/builds/install/misc/createAliasDB.sh.in firebird/trunk/builds/install/misc/fb_config.in firebird/trunk/builds/install/misc/fbintl.conf firebird/trunk/builds/install/misc/firebird.conf.in firebird/trunk/builds/install/misc/firebird.init.d.Solaris.in firebird/trunk/builds/install/misc/firebird.init.d.generic.in firebird/trunk/builds/install/misc/firebird.init.d.mandrake.in firebird/trunk/builds/install/misc/posixLibrary.sh.in firebird/trunk/builds/install/misc/restoreRootRunUser.sh.in firebird/trunk/builds/install/misc/superLibrary.sh.in firebird/trunk/builds/mac_os_x/CS/CS.pbproj/project.pbxproj firebird/trunk/builds/mac_os_x/CS/Helpers.make firebird/trunk/builds/mac_os_x/CS/gpre_wrapper.sh firebird/trunk/builds/mac_os_x/CS/make_wrapper.sh firebird/trunk/builds/mac_os_x/CS/stlport_vars.cpp firebird/trunk/builds/mac_os_x/CS/stub.c firebird/trunk/builds/make.new/config/install-sh firebird/trunk/builds/old_prefixes/README.txt firebird/trunk/builds/old_prefixes/prefix.aix firebird/trunk/builds/old_prefixes/prefix.aix_ppc firebird/trunk/builds/old_prefixes/prefix.darwin firebird/trunk/builds/old_prefixes/prefix.freebsd firebird/trunk/builds/old_prefixes/prefix.hp10 firebird/trunk/builds/old_prefixes/prefix.hp9.0 firebird/trunk/builds/old_prefixes/prefix.linux firebird/trunk/builds/old_prefixes/prefix.mu firebird/trunk/builds/old_prefixes/prefix.ncr3000 firebird/trunk/builds/old_prefixes/prefix.netbsd firebird/trunk/builds/old_prefixes/prefix.sco firebird/trunk/builds/old_prefixes/prefix.sco_ev firebird/trunk/builds/old_prefixes/prefix.solaris firebird/trunk/builds/old_prefixes/prefix.solaris_mt firebird/trunk/builds/old_prefixes/prefix.solx86 firebird/trunk/builds/old_prefixes/prefix.sun4 firebird/trunk/builds/old_prefixes/prefix.sun4_acc firebird/trunk/builds/old_prefixes/prefix.win_nt firebird/trunk/builds/old_prefixes/prefix.win_nts firebird/trunk/builds/posix/Makefile.in.boot.gpre firebird/trunk/builds/posix/Makefile.in.client.fbudf firebird/trunk/builds/posix/Makefile.in.client.gbak firebird/trunk/builds/posix/Makefile.in.client.gfix firebird/trunk/builds/posix/Makefile.in.client.gpre firebird/trunk/builds/posix/Makefile.in.client.gsec firebird/trunk/builds/posix/Makefile.in.client.isql firebird/trunk/builds/posix/Makefile.in.client.qli firebird/trunk/builds/posix/Makefile.in.client.util firebird/trunk/builds/posix/Makefile.in.codes firebird/trunk/builds/posix/Makefile.in.embed.fbudf firebird/trunk/builds/posix/Makefile.in.embed.gbak firebird/trunk/builds/posix/Makefile.in.embed.gfix firebird/trunk/builds/posix/Makefile.in.embed.gpre firebird/trunk/builds/posix/Makefile.in.embed.isql firebird/trunk/builds/posix/Makefile.in.embed.qli firebird/trunk/builds/posix/Makefile.in.embed.util firebird/trunk/builds/posix/Makefile.in.examples firebird/trunk/builds/posix/Makefile.in.extern.editline firebird/trunk/builds/posix/Makefile.in.extern.icu firebird/trunk/builds/posix/Makefile.in.extlib firebird/trunk/builds/posix/Makefile.in.fbserver firebird/trunk/builds/posix/Makefile.in.fbtrace firebird/trunk/builds/posix/Makefile.in.firebird firebird/trunk/builds/posix/Makefile.in.intl firebird/trunk/builds/posix/Makefile.in.libfbclient firebird/trunk/builds/posix/Makefile.in.libfbembed firebird/trunk/builds/posix/Makefile.in.libfbstatic firebird/trunk/builds/posix/Makefile.in.msgs firebird/trunk/builds/posix/Makefile.in.plugins firebird/trunk/builds/posix/Makefile.in.plugins_examples firebird/trunk/builds/posix/Makefile.in.refDatabases firebird/trunk/builds/posix/Makefile.in.smp_server firebird/trunk/builds/posix/Makefile.in.static.gbak firebird/trunk/builds/posix/Makefile.in.static.gpre firebird/trunk/builds/posix/Makefile.in.static.isql firebird/trunk/builds/posix/darwin.defaults firebird/trunk/builds/posix/empty.vers firebird/trunk/builds/posix/fbintl.vers firebird/trunk/builds/posix/fbtrace.vers firebird/trunk/builds/posix/firebird.vers firebird/trunk/builds/posix/ib_util.vers firebird/trunk/builds/posix/make.defaults firebird/trunk/builds/posix/make.platform.solaris.examples firebird/trunk/builds/posix/make.rules firebird/trunk/builds/posix/make.shared.targets firebird/trunk/builds/posix/make.shared.variables firebird/trunk/builds/posix/postfix.darwin firebird/trunk/builds/posix/prefix.aix_powerpc firebird/trunk/builds/posix/prefix.aix_powerpc_xlc firebird/trunk/builds/posix/prefix.darwin_i386 firebird/trunk/builds/posix/prefix.darwin_powerpc firebird/trunk/builds/posix/prefix.darwin_ppc64 firebird/trunk/builds/posix/prefix.darwin_x86_64 firebird/trunk/builds/posix/prefix.example firebird/trunk/builds/posix/prefix.freebsd firebird/trunk/builds/posix/prefix.freebsd_amd64 firebird/trunk/builds/posix/prefix.hpux firebird/trunk/builds/posix/prefix.hpux_aCC firebird/trunk/builds/posix/prefix.hpux_ia64 firebird/trunk/builds/posix/prefix.linux firebird/trunk/builds/posix/prefix.linux_amd64 firebird/trunk/builds/posix/prefix.linux_arm firebird/trunk/builds/posix/prefix.linux_generic firebird/trunk/builds/posix/prefix.linux_ia64 firebird/trunk/builds/posix/prefix.linux_mips firebird/trunk/builds/posix/prefix.linux_mipsel firebird/trunk/builds/posix/prefix.linux_powerpc firebird/trunk/builds/posix/prefix.linux_s390x firebird/trunk/builds/posix/prefix.linux_sparc32 firebird/trunk/builds/posix/prefix.mingw firebird/trunk/builds/posix/prefix.netbsd firebird/trunk/builds/posix/prefix.solaris firebird/trunk/builds/posix/prefix.solaris-64gcc firebird/trunk/builds/posix/prefix.solx86 firebird/trunk/builds/posix/prefix.solx86gcc firebird/trunk/builds/posix/prefix.solx86gcc_64 firebird/trunk/builds/posix/udr_engine.hpux.vers firebird/trunk/builds/posix/udr_engine.vers firebird/trunk/builds/posix/vers.sh.in firebird/trunk/builds/win32/adjust_vc7_files.cmd firebird/trunk/builds/win32/blrtable.bat firebird/trunk/builds/win32/clean_all.bat firebird/trunk/builds/win32/compile.bat firebird/trunk/builds/win32/create_msgs.bat firebird/trunk/builds/win32/defs/build.def firebird/trunk/builds/win32/defs/burp.def firebird/trunk/builds/win32/defs/burp32.def firebird/trunk/builds/win32/defs/dsql.def firebird/trunk/builds/win32/defs/fbclient.def firebird/trunk/builds/win32/defs/fbclient_s.def firebird/trunk/builds/win32/defs/fbrmclib.def firebird/trunk/builds/win32/defs/gds32.def firebird/trunk/builds/win32/defs/ib_udf.def firebird/trunk/builds/win32/defs/ib_util.def firebird/trunk/builds/win32/defs/intl.def firebird/trunk/builds/win32/defs/isql.def firebird/trunk/builds/win32/defs/iutls.def firebird/trunk/builds/win32/defs/jrd.def firebird/trunk/builds/win32/defs/remote.def firebird/trunk/builds/win32/defs/udr_engine.def firebird/trunk/builds/win32/defs/utls.def firebird/trunk/builds/win32/make_all.bat firebird/trunk/builds/win32/make_boot.bat firebird/trunk/builds/win32/make_examples.bat firebird/trunk/builds/win32/make_icu.bat firebird/trunk/builds/win32/msvc7/Firebird2.sln firebird/trunk/builds/win32/msvc7/Firebird2Boot.sln firebird/trunk/builds/win32/msvc7/Firebird2_Examples.sln firebird/trunk/builds/win32/msvc7/alice.vcproj firebird/trunk/builds/win32/msvc7/btyacc.vcproj firebird/trunk/builds/win32/msvc7/build_msg.vcproj firebird/trunk/builds/win32/msvc7/burp.vcproj firebird/trunk/builds/win32/msvc7/codes.vcproj firebird/trunk/builds/win32/msvc7/common.vcproj firebird/trunk/builds/win32/msvc7/common_classic.vcproj firebird/trunk/builds/win32/msvc7/common_static.vcproj firebird/trunk/builds/win32/msvc7/config.vcproj firebird/trunk/builds/win32/msvc7/dsql_server.vcproj firebird/trunk/builds/win32/msvc7/dsql_server_classic.vcproj firebird/trunk/builds/win32/msvc7/empbuild.vcproj firebird/trunk/builds/win32/msvc7/engine.vcproj firebird/trunk/builds/win32/msvc7/engine_classic.vcproj firebird/trunk/builds/win32/msvc7/engine_embed.vcproj firebird/trunk/builds/win32/msvc7/fb2control.vcproj firebird/trunk/builds/win32/msvc7/fb_inet_server.vcproj firebird/trunk/builds/win32/msvc7/fb_lock_print.vcproj firebird/trunk/builds/win32/msvc7/fbclient.vcproj firebird/trunk/builds/win32/msvc7/fbclient_static.vcproj firebird/trunk/builds/win32/msvc7/fbembed.vcproj firebird/trunk/builds/win32/msvc7/fbguard.vcproj firebird/trunk/builds/win32/msvc7/fbrmclib.vcproj firebird/trunk/builds/win32/msvc7/fbserver.vcproj firebird/trunk/builds/win32/msvc7/fbsvcmgr.vcproj firebird/trunk/builds/win32/msvc7/fbtrace.vcproj firebird/trunk/builds/win32/msvc7/fbtracemgr.vcproj firebird/trunk/builds/win32/msvc7/fbudf.vcproj firebird/trunk/builds/win32/msvc7/gbak.vcproj firebird/trunk/builds/win32/msvc7/gbak_embed.vcproj firebird/trunk/builds/win32/msvc7/gds32.vcproj firebird/trunk/builds/win32/msvc7/gfix.vcproj firebird/trunk/builds/win32/msvc7/gpre.vcproj firebird/trunk/builds/win32/msvc7/gpre_boot.vcproj firebird/trunk/builds/win32/msvc7/gpre_embed.vcproj firebird/trunk/builds/win32/msvc7/gpre_static.vcproj firebird/trunk/builds/win32/msvc7/gsec.vcproj firebird/trunk/builds/win32/msvc7/gsplit.vcproj firebird/trunk/builds/win32/msvc7/gstat.vcproj firebird/trunk/builds/win32/msvc7/ib_udf.vcproj firebird/trunk/builds/win32/msvc7/ib_util.vcproj firebird/trunk/builds/win32/msvc7/instclient.vcproj firebird/trunk/builds/win32/msvc7/instreg.vcproj firebird/trunk/builds/win32/msvc7/instsvc.vcproj firebird/trunk/builds/win32/msvc7/intl.vcproj firebird/trunk/builds/win32/msvc7/intlbuild.vcproj firebird/trunk/builds/win32/msvc7/isql.vcproj firebird/trunk/builds/win32/msvc7/isql_embed.vcproj firebird/trunk/builds/win32/msvc7/lock.vcproj firebird/trunk/builds/win32/msvc7/lock_classic.vcproj firebird/trunk/builds/win32/msvc7/nbackup.vcproj firebird/trunk/builds/win32/msvc7/qli.vcproj firebird/trunk/builds/win32/msvc7/remote.vcproj firebird/trunk/builds/win32/msvc7/remote_classic.vcproj firebird/trunk/builds/win32/msvc7/utilities.vcproj firebird/trunk/builds/win32/msvc7/utilities_embed.vcproj firebird/trunk/builds/win32/msvc7/v5_examples.vcproj firebird/trunk/builds/win32/msvc8/DllNoEmbedManifest.vsprops firebird/trunk/builds/win32/msvc8/Firebird2.sln firebird/trunk/builds/win32/msvc8/Firebird2Boot.sln firebird/trunk/builds/win32/msvc8/Firebird2_Examples.sln firebird/trunk/builds/win32/msvc8/VCCRT_Shared_Body.wxi firebird/trunk/builds/win32/msvc8/VCCRT_Shared_Header.wxi firebird/trunk/builds/win32/msvc8/VCCRT_Win32.wxi firebird/trunk/builds/win32/msvc8/VCCRT_Win32.wxs firebird/trunk/builds/win32/msvc8/VCCRT_x64.wxi firebird/trunk/builds/win32/msvc8/VCCRT_x64.wxs firebird/trunk/builds/win32/msvc8/alice.vcproj firebird/trunk/builds/win32/msvc8/asInvoker.manifest firebird/trunk/builds/win32/msvc8/asInvokerManifest.vsprops firebird/trunk/builds/win32/msvc8/btyacc.vcproj firebird/trunk/builds/win32/msvc8/build_msg.vcproj firebird/trunk/builds/win32/msvc8/burp.vcproj firebird/trunk/builds/win32/msvc8/codes.vcproj firebird/trunk/builds/win32/msvc8/common.vcproj firebird/trunk/builds/win32/msvc8/common_classic.vcproj firebird/trunk/builds/win32/msvc8/common_static.vcproj firebird/trunk/builds/win32/msvc8/config.vcproj firebird/trunk/builds/win32/msvc8/dsql_server.vcproj firebird/trunk/builds/win32/msvc8/dsql_server_classic.vcproj firebird/trunk/builds/win32/msvc8/empbuild.vcproj firebird/trunk/builds/win32/msvc8/engine.vcproj firebird/trunk/builds/win32/msvc8/engine_classic.vcproj firebird/trunk/builds/win32/msvc8/engine_embed.vcproj firebird/trunk/builds/win32/msvc8/fb2control.vcproj firebird/trunk/builds/win32/msvc8/fb_inet_server.vcproj firebird/trunk/builds/win32/msvc8/fb_lock_print.vcproj firebird/trunk/builds/win32/msvc8/fbclient.vcproj firebird/trunk/builds/win32/msvc8/fbclient_static.vcproj firebird/trunk/builds/win32/msvc8/fbembed.vcproj firebird/trunk/builds/win32/msvc8/fbguard.vcproj firebird/trunk/builds/win32/msvc8/fbrmclib.vcproj firebird/trunk/builds/win32/msvc8/fbserver.vcproj firebird/trunk/builds/win32/msvc8/fbsvcmgr.vcproj firebird/trunk/builds/win32/msvc8/fbtrace.vcproj firebird/trunk/builds/win32/msvc8/fbtracemgr.vcproj firebird/trunk/builds/win32/msvc8/fbudf.vcproj firebird/trunk/builds/win32/msvc8/firebird2.vsprops firebird/trunk/builds/win32/msvc8/firebird2debug.vsprops firebird/trunk/builds/win32/msvc8/firebird2release.vsprops firebird/trunk/builds/win32/msvc8/gbak.vcproj firebird/trunk/builds/win32/msvc8/gbak_embed.vcproj firebird/trunk/builds/win32/msvc8/gds32.vcproj firebird/trunk/builds/win32/msvc8/gfix.vcproj firebird/trunk/builds/win32/msvc8/gpre.vcproj firebird/trunk/builds/win32/msvc8/gpre_boot.vcproj firebird/trunk/builds/win32/msvc8/gpre_embed.vcproj firebird/trunk/builds/win32/msvc8/gpre_static.vcproj firebird/trunk/builds/win32/msvc8/gsec.vcproj firebird/trunk/builds/win32/msvc8/gsplit.vcproj firebird/trunk/builds/win32/msvc8/gstat.vcproj firebird/trunk/builds/win32/msvc8/ib_udf.vcproj firebird/trunk/builds/win32/msvc8/ib_util.vcproj firebird/trunk/builds/win32/msvc8/instclient.vcproj firebird/trunk/builds/win32/msvc8/instreg.vcproj firebird/trunk/builds/win32/msvc8/instsvc.vcproj firebird/trunk/builds/win32/msvc8/intl.vcproj firebird/trunk/builds/win32/msvc8/intlbuild.vcproj firebird/trunk/builds/win32/msvc8/isql.vcproj firebird/trunk/builds/win32/msvc8/isql_embed.vcproj firebird/trunk/builds/win32/msvc8/lock.vcproj firebird/trunk/builds/win32/msvc8/lock_classic.vcproj firebird/trunk/builds/win32/msvc8/nbackup.vcproj firebird/trunk/builds/win32/msvc8/qli.vcproj firebird/trunk/builds/win32/msvc8/remote.vcproj firebird/trunk/builds/win32/msvc8/remote_classic.vcproj firebird/trunk/builds/win32/msvc8/requireAdministrator.manifest firebird/trunk/builds/win32/msvc8/requireAdministratorManifest.vsprops firebird/trunk/builds/win32/msvc8/udr_engine.vcproj firebird/trunk/builds/win32/msvc8/udrcpp_example.vcproj firebird/trunk/builds/win32/msvc8/utilities.vcproj firebird/trunk/builds/win32/msvc8/utilities_embed.vcproj firebird/trunk/builds/win32/msvc8/v5_examples.vcproj firebird/trunk/builds/win32/msvc9/DllNoEmbedManifest.vsprops firebird/trunk/builds/win32/msvc9/Firebird2.sln firebird/trunk/builds/win32/msvc9/Firebird2Boot.sln firebird/trunk/builds/win32/msvc9/Firebird2_Examples.sln firebird/trunk/builds/win32/msvc9/alice.vcproj firebird/trunk/builds/win32/msvc9/btyacc.vcproj firebird/trunk/builds/win32/msvc9/build_msg.vcproj firebird/trunk/builds/win32/msvc9/burp.vcproj firebird/trunk/builds/win32/msvc9/codes.vcproj firebird/trunk/builds/win32/msvc9/common.vcproj firebird/trunk/builds/win32/msvc9/common_classic.vcproj firebird/trunk/builds/win32/msvc9/common_static.vcproj firebird/trunk/builds/win32/msvc9/config.vcproj firebird/trunk/builds/win32/msvc9/dsql_server.vcproj firebird/trunk/builds/win32/msvc9/dsql_server_classic.vcproj firebird/trunk/builds/win32/msvc9/empbuild.vcproj firebird/trunk/builds/win32/msvc9/engine.vcproj firebird/trunk/builds/win32/msvc9/engine_classic.vcproj firebird/trunk/builds/win32/msvc9/engine_embed.vcproj firebird/trunk/builds/win32/msvc9/fb2control.vcproj firebird/trunk/builds/win32/msvc9/fb_inet_server.vcproj firebird/trunk/builds/win32/msvc9/fb_lock_print.vcproj firebird/trunk/builds/win32/msvc9/fbclient.vcproj firebird/trunk/builds/win32/msvc9/fbembed.vcproj firebird/trunk/builds/win32/msvc9/fbguard.vcproj firebird/trunk/builds/win32/msvc9/fbrmclib.vcproj firebird/trunk/builds/win32/msvc9/fbserver.vcproj firebird/trunk/builds/win32/msvc9/fbsvcmgr.vcproj firebird/trunk/builds/win32/msvc9/fbtrace.vcproj firebird/trunk/builds/win32/msvc9/fbtracemgr.vcproj firebird/trunk/builds/win32/msvc9/fbudf.vcproj firebird/trunk/builds/win32/msvc9/firebird2.vsprops firebird/trunk/builds/win32/msvc9/firebird2debug.vsprops firebird/trunk/builds/win32/msvc9/firebird2release.vsprops firebird/trunk/builds/win32/msvc9/gbak.vcproj firebird/trunk/builds/win32/msvc9/gbak_embed.vcproj firebird/trunk/builds/win32/msvc9/gfix.vcproj firebird/trunk/builds/win32/msvc9/gpre.vcproj firebird/trunk/bu... [truncated message content] |
From: <pau...@us...> - 2010-06-08 14:44:51
|
Revision: 51232 http://firebird.svn.sourceforge.net/firebird/?rev=51232&view=rev Author: paulbeach Date: 2010-06-08 14:44:45 +0000 (Tue, 08 Jun 2010) Log Message: ----------- Grand Central Dispatch - 10.6 Darwin only Modified Paths: -------------- firebird/trunk/builds/posix/postfix.darwin firebird/trunk/builds/posix/prefix.darwin_i386 firebird/trunk/builds/posix/prefix.darwin_x86_64 firebird/trunk/extern/icu/source/config/mh-darwin Modified: firebird/trunk/builds/posix/postfix.darwin =================================================================== --- firebird/trunk/builds/posix/postfix.darwin 2010-06-08 13:35:46 UTC (rev 51231) +++ firebird/trunk/builds/posix/postfix.darwin 2010-06-08 14:44:45 UTC (rev 51232) @@ -81,7 +81,6 @@ cp ../gen/firebird/bin/gpre $(FB_FW)/Resources/bin cp ../gen/firebird/bin/qli $(FB_FW)/Resources/bin cp ../gen/firebird/bin/fb_lock_print $(FB_FW)/Resources/bin - cp ../gen/firebird/bin/gds_drop $(FB_FW)/Resources/bin cp ../gen/firebird/bin/gsec $(FB_FW)/Resources/bin cp ../gen/firebird/bin/gstat $(FB_FW)/Resources/bin cp ../gen/firebird/bin/nbackup $(FB_FW)/Resources/bin @@ -146,7 +145,6 @@ cp ../gen/firebird/bin/isql $(FB_FW)/Resources/bin cp ../gen/firebird/bin/gpre $(FB_FW)/Resources/bin cp ../gen/firebird/bin/fb_lock_print $(FB_FW)/Resources/bin - #cp ../gen/firebird/bin/gds_drop $(FB_FW)/Resources/bin #cp ../gen/firebird/bin/gds_relay $(FB_FW)/Resources/bin cp ../gen/firebird/bin/gsec $(FB_FW)/Resources/bin cp ../gen/firebird/bin/gstat $(FB_FW)/Resources/bin Modified: firebird/trunk/builds/posix/prefix.darwin_i386 =================================================================== --- firebird/trunk/builds/posix/prefix.darwin_i386 2010-06-08 13:35:46 UTC (rev 51231) +++ firebird/trunk/builds/posix/prefix.darwin_i386 2010-06-08 14:44:45 UTC (rev 51232) @@ -22,27 +22,27 @@ # 2. dnl the CPU_TYPE # 3. edit extern/icu/source/config and set the right 32bit flags (-arch i386) # 4. for CFLAGS, CXXFLAGS. LDFLAGS export '-m32 -arch i386' -# 5. export MACOSX_DEPLOYMENT_TARGET=10.4 +# 5. export MACOSX_DEPLOYMENT_TARGET=10.6 DYLD_LIBRARY_PATH=$(FIREBIRD)/lib export DYLD_LIBRARY_PATH -MACOSX_DEPLOYMENT_TARGET=10.4 +MACOSX_DEPLOYMENT_TARGET=10.6 export MACOSX_DEPLOYMENT_TARGET OS_ServerFiles=inet_server.cpp -PROD_FLAGS=-O3 -DDARWIN -pipe -p -MMD -fPIC -fno-common -arch i386 -mmacosx-version-min=10.4 -DEV_FLAGS=-ggdb -DDARWIN -pipe -p -MMD -fPIC -fno-common -Wall -arch i386 -mmacosx-version-min=10.4 -Wno-non-virtual-dtor +PROD_FLAGS=-O3 -DDARWIN -pipe -p -MMD -fPIC -fno-common -arch i386 -mmacosx-version-min=10.6 +DEV_FLAGS=-ggdb -DDARWIN -pipe -p -MMD -fPIC -fno-common -Wall -arch i386 -mmacosx-version-min=10.6 -Wno-non-virtual-dtor CXXFLAGS:=$(CXXFLAGS) -fvisibility-inlines-hidden -fvisibility=hidden -fno-weak -EMBED_UTIL_TARGETS=gstat gds_drop gds_relay gsec fbguard nbackup fb_lock_print fbsvcmgr fbtracemgr -CLIENT_UTIL_TARGETS=gds_drop gds_relay gstat gsec fbguard fbmgr_bin nbackup fb_lock_print fbsvcmgr \ +EMBED_UTIL_TARGETS=gstat gds_relay gsec fbguard nbackup fb_lock_print fbsvcmgr fbtracemgr +CLIENT_UTIL_TARGETS=gds_relay gstat gsec fbguard fbmgr_bin nbackup fb_lock_print fbsvcmgr \ fbtracemgr Physical_IO_Module=os/posix/unix.cpp PLATFORM_PATH=os/darwin LINK_OPTS:=-m32 -LD_FLAGS+=-m32 -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk +LD_FLAGS+=-m32 -arch i386 include $(ROOT)/gen/darwin.defaults Modified: firebird/trunk/builds/posix/prefix.darwin_x86_64 =================================================================== --- firebird/trunk/builds/posix/prefix.darwin_x86_64 2010-06-08 13:35:46 UTC (rev 51231) +++ firebird/trunk/builds/posix/prefix.darwin_x86_64 2010-06-08 14:44:45 UTC (rev 51232) @@ -22,16 +22,16 @@ DYLD_LIBRARY_PATH=$(FIREBIRD)/lib export DYLD_LIBRARY_PATH -MACOSX_DEPLOYMENT_TARGET=10.5 +MACOSX_DEPLOYMENT_TARGET=10.6 export MACOSX_DEPLOYMENT_TARGET OS_ServerFiles=inet_server.cpp -PROD_FLAGS=-O3 -DDARWIN -pipe -p -MMD -fPIC -fno-common -mmacosx-version-min=10.5 -DEV_FLAGS=-ggdb -DDARWIN -pipe -p -MMD -fPIC -fno-common -Wall -mmacosx-version-min=10.5 -Wno-non-virtual-dtor +PROD_FLAGS=-O3 -DDARWIN -pipe -p -MMD -fPIC -fno-common -mmacosx-version-min=10.6 +DEV_FLAGS=-ggdb -DDARWIN -pipe -p -MMD -fPIC -fno-common -Wall -mmacosx-version-min=10.6 -Wno-non-virtual-dtor CXXFLAGS:=$(CXXFLAGS) -fvisibility-inlines-hidden -fvisibility=hidden -fno-weak -EMBED_UTIL_TARGETS=gstat gds_drop gds_relay gsec fbguard nbackup fb_lock_print fbsvcmgr fbtracemgr -CLIENT_UTIL_TARGETS=gds_drop gds_relay gstat gsec fbguard fbmgr_bin nbackup fb_lock_print fbsvcmgr \ +EMBED_UTIL_TARGETS=gstat gds_relay gsec fbguard nbackup fb_lock_print fbsvcmgr fbtracemgr +CLIENT_UTIL_TARGETS=gds_relay gstat gsec fbguard fbmgr_bin nbackup fb_lock_print fbsvcmgr \ fbtracemgr Physical_IO_Module=os/posix/unix.cpp Modified: firebird/trunk/extern/icu/source/config/mh-darwin =================================================================== --- firebird/trunk/extern/icu/source/config/mh-darwin 2010-06-08 13:35:46 UTC (rev 51231) +++ firebird/trunk/extern/icu/source/config/mh-darwin 2010-06-08 14:44:45 UTC (rev 51232) @@ -17,9 +17,9 @@ # Set CFLAGS and CXXFLAGS for relevant MacOS architecture # and backwards compatibility. Set accordingly before building. -# Default 64 bit Leopard/Snow Leopard - intel (MacOS 10.5+) -CFLAGS += -arch x86_64 -CXXFLAGS += -arch x86_64 +# Default 64 bit Snow Leopard - intel (MacOS 10.6+) +CFLAGS += -arch x86_64 -mmacosx-version-min=10.6 +CXXFLAGS += -arch x86_64 -mmacosx-version-min=10.6 # 64 bit powerpc #CFLAGS += -arch ppc64 -mmacosx-version-min=10.5 @@ -27,8 +27,8 @@ # 32bit intel default # DARWIN flag added because of problem with putil.c -#CFLAGS += -arch i386 -mmacosx-version-min=10.4 -DDARWIN -#CXXFLAGS += -arch i386 -mmacosx-version-min=10.4 +#CFLAGS += -arch i386 -mmacosx-version-min=10.6 -DDARWIN +#CXXFLAGS += -arch i386 -mmacosx-version-min=10.6 # 32 bit powerpc #CFLAGS += -arch ppc -mmacosx-version-min=10.2 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <asf...@us...> - 2010-06-17 01:18:47
|
Revision: 51259 http://firebird.svn.sourceforge.net/firebird/?rev=51259&view=rev Author: asfernandes Date: 2010-06-17 01:18:40 +0000 (Thu, 17 Jun 2010) Log Message: ----------- Created class BlrWriter and reorganization (move BLR generation from statement to scratch) Modified Paths: -------------- firebird/trunk/builds/posix/make.shared.variables firebird/trunk/builds/win32/msvc9/dsql_server.vcproj firebird/trunk/builds/win32/msvc9/dsql_server_classic.vcproj firebird/trunk/src/dsql/AggNodes.cpp firebird/trunk/src/dsql/DdlNodes.epp firebird/trunk/src/dsql/ExprNodes.cpp firebird/trunk/src/dsql/Nodes.h firebird/trunk/src/dsql/StmtNodes.cpp firebird/trunk/src/dsql/ddl.cpp firebird/trunk/src/dsql/dsql.cpp firebird/trunk/src/dsql/dsql.h firebird/trunk/src/dsql/gen.cpp firebird/trunk/src/dsql/gen_proto.h firebird/trunk/src/dsql/pass1.cpp Added Paths: ----------- firebird/trunk/src/dsql/BlrWriter.cpp firebird/trunk/src/dsql/BlrWriter.h Modified: firebird/trunk/builds/posix/make.shared.variables =================================================================== --- firebird/trunk/builds/posix/make.shared.variables 2010-06-16 16:28:09 UTC (rev 51258) +++ firebird/trunk/builds/posix/make.shared.variables 2010-06-17 01:18:40 UTC (rev 51259) @@ -81,7 +81,7 @@ DSQL_ServerFiles= metd.epp DSqlDataTypeUtil.cpp \ 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 PackageNodes.epp AggNodes.cpp ExprNodes.cpp StmtNodes.cpp WinNodes.cpp + DdlNodes.epp PackageNodes.epp AggNodes.cpp BlrWriter.cpp ExprNodes.cpp StmtNodes.cpp WinNodes.cpp DSQL_Files = $(DSQL_ClientFiles) $(DSQL_ServerFiles) Modified: firebird/trunk/builds/win32/msvc9/dsql_server.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc9/dsql_server.vcproj 2010-06-16 16:28:09 UTC (rev 51258) +++ firebird/trunk/builds/win32/msvc9/dsql_server.vcproj 2010-06-17 01:18:40 UTC (rev 51259) @@ -271,6 +271,10 @@ > </File> <File + RelativePath="..\..\..\src\dsql\BlrWriter.cpp" + > + </File> + <File RelativePath="..\..\..\src\dsql\ddl.cpp" > </File> @@ -422,6 +426,10 @@ > </File> <File + RelativePath="..\..\..\src\dsql\BlrWriter.h" + > + </File> + <File RelativePath="..\..\..\src\dsql\chars.h" > </File> Modified: firebird/trunk/builds/win32/msvc9/dsql_server_classic.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc9/dsql_server_classic.vcproj 2010-06-16 16:28:09 UTC (rev 51258) +++ firebird/trunk/builds/win32/msvc9/dsql_server_classic.vcproj 2010-06-17 01:18:40 UTC (rev 51259) @@ -271,6 +271,10 @@ > </File> <File + RelativePath="..\..\..\src\dsql\BlrWriter.cpp" + > + </File> + <File RelativePath="..\..\..\src\dsql\ddl.cpp" > </File> @@ -422,6 +426,10 @@ > </File> <File + RelativePath="..\..\..\src\dsql\BlrWriter.h" + > + </File> + <File RelativePath="..\..\..\src\dsql\chars.h" > </File> Modified: firebird/trunk/src/dsql/AggNodes.cpp =================================================================== --- firebird/trunk/src/dsql/AggNodes.cpp 2010-06-16 16:28:09 UTC (rev 51258) +++ firebird/trunk/src/dsql/AggNodes.cpp 2010-06-17 01:18:40 UTC (rev 51259) @@ -277,11 +277,11 @@ DsqlCompiledStatement* statement = dsqlScratch->getStatement(); if (aggInfo.blr) // Is this a standard aggregate function? - stuff(statement, (distinct ? aggInfo.distinctBlr : aggInfo.blr)); + dsqlScratch->appendUChar((distinct ? aggInfo.distinctBlr : aggInfo.blr)); else // This is a new window function. { - stuff(statement, blr_agg_function); - stuff_cstring(statement, aggInfo.name); + dsqlScratch->appendUChar(blr_agg_function); + dsqlScratch->appendNullString(aggInfo.name); unsigned count = 0; for (dsql_nod*** i = dsqlChildNodes.begin(); i != dsqlChildNodes.end(); ++i) @@ -290,7 +290,7 @@ ++count; } - stuff(statement, UCHAR(count)); + dsqlScratch->appendUChar(UCHAR(count)); } for (dsql_nod*** i = dsqlChildNodes.begin(); i != dsqlChildNodes.end(); ++i) @@ -795,7 +795,7 @@ if (dsqlArg) AggNode::genBlr(); else - dsqlScratch->getStatement()->append_uchar(blr_agg_count); + dsqlScratch->appendUChar(blr_agg_count); } void CountAggNode::getDesc(thread_db* tdbb, CompilerScratch* /*csb*/, dsc* desc) Added: firebird/trunk/src/dsql/BlrWriter.cpp =================================================================== --- firebird/trunk/src/dsql/BlrWriter.cpp (rev 0) +++ firebird/trunk/src/dsql/BlrWriter.cpp 2010-06-17 01:18:40 UTC (rev 51259) @@ -0,0 +1,207 @@ +/* + * The contents of this file are subject to the Interbase 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.Inprise.com/IPL.html + * + * Software distributed under the License is distributed on an + * "AS IS" basis, 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 Inprise Corporation + * and its predecessors. Portions created by Inprise Corporation are + * Copyright (C) Inprise Corporation. + * + * All Rights Reserved. + * Contributor(s): ______________________________________. + * Adriano dos Santos Fernandes - refactored from others modules. + */ + +#include "firebird.h" +#include "consts_pub.h" +#include "dyn_consts.h" +#include "gen/iberror.h" +#include "../dsql/BlrWriter.h" +#include "../jrd/common.h" +#include "../jrd/blr.h" +#include "../dsql/errd_proto.h" + +using namespace Firebird; + +namespace Jrd { + + +// Write out a string valued attribute. +void BlrWriter::appendString(UCHAR verb, const char* string, USHORT length) +{ + // TMN: Doesn't this look pretty awkward? If we are given + // a verb, the length is a ushort, else it's uchar. + if (verb) + { + appendUChar(verb); + appendUShort(length); + } + else + { + fb_assert(length <= MAX_UCHAR); + appendUChar(length); + } + + if (string) + appendBytes(reinterpret_cast<const UCHAR*>(string), length); +} + +// Input +// blr_ptr: current position of blr being generated +// verb: blr byte of which number is an argument +// number: value to be written to blr +// Function +// Write out a numeric valued attribute. +void BlrWriter::appendNumber(UCHAR verb, SSHORT number) +{ + if (verb) + appendUChar(verb); + + appendUShortWithLength(number); +} + +void BlrWriter::appendUShortWithLength(USHORT val) +{ + // append an USHORT value, prepended with the USHORT length of an USHORT + appendUShort(2); + appendUShort(val); +} + +void BlrWriter::appendULongWithLength(ULONG val) +{ + // append an ULONG value, prepended with the USHORT length of an ULONG + appendUShort(4); + appendULong(val); +} + +void BlrWriter::appendFileLength(ULONG length) +{ + appendUChar(isc_dyn_file_length); + appendULongWithLength(length); +} + +void BlrWriter::appendFileStart(ULONG start) +{ + appendUChar(isc_dyn_file_start); + appendULongWithLength(start); +} + +// Write out a string of blr as part of a ddl string, as in a view or computed field definition. +void BlrWriter::beginBlr(UCHAR verb) +{ + if (verb) + appendUChar(verb); + + baseOffset = blrData.getCount(); + + // put in a place marker for the size of the blr, since it is unknown + appendUShort(0); + appendUChar(isVersion4() ? blr_version4 : blr_version5); +} + +// Complete the stuffing of a piece of blr by going back and inserting the length. +void BlrWriter::endBlr() +{ + appendUChar(blr_eoc); + + // go back and stuff in the proper length + + UCHAR* blr_base = &blrData[baseOffset]; + const ULONG length = (blrData.getCount() - baseOffset) - 2; + + if (length > 0xFFFF) + ERRD_post(Arg::Gds(isc_too_big_blr) << Arg::Num(length) << Arg::Num(0xFFFF)); + + *blr_base++ = (UCHAR) length; + *blr_base = (UCHAR) (length >> 8); +} + +void BlrWriter::beginDebug() +{ + fb_assert(debugData.isEmpty()); + + debugData.add(fb_dbg_version); + debugData.add(1); +} + +void BlrWriter::endDebug() +{ + debugData.add(fb_dbg_end); +} + +void BlrWriter::putDebugSrcInfo(USHORT line, USHORT col) +{ + debugData.add(fb_dbg_map_src2blr); + + debugData.add(line); + debugData.add(line >> 8); + + debugData.add(col); + debugData.add(col >> 8); + + ULONG offset = (blrData.getCount() - baseOffset); + + // for DDL statements we store BLR's length at the first 2 bytes + if (isDdlDyn()) + offset -= 2; + + debugData.add(offset); + debugData.add(offset >> 8); +} + +void BlrWriter::putDebugVariable(USHORT number, const TEXT* name) +{ + fb_assert(name); + + debugData.add(fb_dbg_map_varname); + + debugData.add(number); + debugData.add(number >> 8); + + USHORT len = strlen(name); + if (len > MAX_UCHAR) + len = MAX_UCHAR; + debugData.add(len); + + debugData.add(reinterpret_cast<const UCHAR*>(name), len); +} + +void BlrWriter::putDebugArgument(UCHAR type, USHORT number, const TEXT* name) +{ + fb_assert(name); + + debugData.add(fb_dbg_map_argument); + + debugData.add(type); + debugData.add(number); + debugData.add(number >> 8); + + USHORT len = strlen(name); + if (len > MAX_UCHAR) + len = MAX_UCHAR; + debugData.add(len); + + debugData.add(reinterpret_cast<const UCHAR*>(name), len); +} + +void BlrWriter::appendDebugInfo() +{ + endDebug(); + + const size_t len = blrData.getCount() + debugData.getCount(); + if (len + 4 < MAX_USHORT) + { + appendUChar(isc_dyn_debug_info); + appendUShort(debugData.getCount()); + appendBytes(debugData.begin(), debugData.getCount()); + } +} + + +} // namespace Jrd Property changes on: firebird/trunk/src/dsql/BlrWriter.cpp ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: firebird/trunk/src/dsql/BlrWriter.h =================================================================== --- firebird/trunk/src/dsql/BlrWriter.h (rev 0) +++ firebird/trunk/src/dsql/BlrWriter.h 2010-06-17 01:18:40 UTC (rev 51259) @@ -0,0 +1,148 @@ +/* + * The contents of this file are subject to the Interbase 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.Inprise.com/IPL.html + * + * Software distributed under the License is distributed on an + * "AS IS" basis, 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 Inprise Corporation + * and its predecessors. Portions created by Inprise Corporation are + * Copyright (C) Inprise Corporation. + * + * All Rights Reserved. + * Contributor(s): ______________________________________. + * Adriano dos Santos Fernandes - refactored from others modules. + */ + +#ifndef DSQL_BLR_WRITER_H +#define DSQL_BLR_WRITER_H + +#include "../jrd/common.h" +#include "../common/classes/alloc.h" +#include "../common/classes/array.h" +#include "../common/classes/fb_string.h" +#include "../common/classes/MetaName.h" + +namespace Jrd { + +class dsql_nod; + + +// BLR/DYN writer. +class BlrWriter : public Firebird::PermanentStorage +{ +public: + explicit BlrWriter(MemoryPool& p) + : PermanentStorage(p), + blrData(p), + debugData(p), + baseOffset(0) + { + } + + void appendUChar(const UCHAR byte) + { + blrData.add(byte); + } + + // Cram a word into the blr buffer. + void appendUShort(USHORT word) + { + appendUChar(word); + appendUChar(word >> 8); + } + + void appendULong(ULONG val) + { + appendUShort(val); + appendUShort(val >> 16); + } + + void appendUCharRepeated(UCHAR byte, int count) + { + for (int i = 0; i < count; ++i) + appendUChar(byte); + } + + void appendBytes(const UCHAR* string, USHORT len) + { + blrData.add(string, len); + } + + // Write out a string with one byte of length. + void appendNullString(const char* string) + { + size_t len = strlen(string); + + // CVC: Maybe the Release version should truncate "len" to 255? + fb_assert(len >= 0 && len <= 255); + + appendUChar(len); + appendBytes(reinterpret_cast<const UCHAR*>(string), len); + } + + // Write out a string valued attribute. + void appendNullString(UCHAR verb, const char* string) + { + const USHORT length = string ? strlen(string) : 0; + appendString(verb, string, length); + } + + // Write out a string in metadata charset with one byte of length. + void appendMetaString(const char* string) + { + appendString(0, string, strlen(string)); + } + + void appendString(UCHAR verb, const char* string, USHORT len); + + void appendString(UCHAR verb, const Firebird::MetaName& name) + { + appendString(verb, name.c_str(), name.length()); + } + + void appendString(UCHAR verb, const Firebird::string& name) + { + appendString(verb, name.c_str(), name.length()); + } + + void appendNumber(UCHAR verb, SSHORT number); + void appendUShortWithLength(USHORT val); + void appendULongWithLength(ULONG val); + void appendFileLength(ULONG length); + void appendFileStart(ULONG start); + + void beginBlr(UCHAR verb); + void endBlr(); + + void beginDebug(); + void endDebug(); + void putDebugSrcInfo(USHORT, USHORT); + void putDebugVariable(USHORT, const TEXT*); + void putDebugArgument(UCHAR, USHORT, const TEXT*); + void appendDebugInfo(); + + Firebird::HalfStaticArray<UCHAR, 1024>& getBlrData() { return blrData; } + Firebird::HalfStaticArray<UCHAR, 128>& getDebugData() { return debugData; } + + ULONG getBaseOffset() const { return baseOffset; } + void setBaseOffset(ULONG value) { baseOffset = value; } + +protected: + virtual bool isVersion4() = 0; + virtual bool isDdlDyn() = 0; + +private: + Firebird::HalfStaticArray<UCHAR, 1024> blrData; + Firebird::HalfStaticArray<UCHAR, 128> debugData; + ULONG baseOffset; // place to go back and stuff in blr length +}; + + +} // namespace + +#endif // DSQL_BLR_WRITER_H Property changes on: firebird/trunk/src/dsql/BlrWriter.h ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Modified: firebird/trunk/src/dsql/DdlNodes.epp =================================================================== --- firebird/trunk/src/dsql/DdlNodes.epp 2010-06-16 16:28:09 UTC (rev 51258) +++ firebird/trunk/src/dsql/DdlNodes.epp 2010-06-17 01:18:40 UTC (rev 51259) @@ -132,7 +132,7 @@ DsqlCompiledStatement* statement = dsqlScratch->getStatement(); if (type.notNull) - statement->append_uchar(blr_not_nullable); + dsqlScratch->appendUChar(blr_not_nullable); if (type.typeOfName.hasData()) { @@ -140,34 +140,34 @@ { if (type.collateSpecified) { - statement->append_uchar(blr_column_name2); - statement->append_uchar(type.fullDomain ? blr_domain_full : blr_domain_type_of); - statement->append_meta_string(type.typeOfTable.c_str()); - statement->append_meta_string(type.typeOfName.c_str()); - statement->append_ushort(type.textType); + dsqlScratch->appendUChar(blr_column_name2); + dsqlScratch->appendUChar(type.fullDomain ? blr_domain_full : blr_domain_type_of); + dsqlScratch->appendMetaString(type.typeOfTable.c_str()); + dsqlScratch->appendMetaString(type.typeOfName.c_str()); + dsqlScratch->appendUShort(type.textType); } else { - statement->append_uchar(blr_column_name); - statement->append_uchar(type.fullDomain ? blr_domain_full : blr_domain_type_of); - statement->append_meta_string(type.typeOfTable.c_str()); - statement->append_meta_string(type.typeOfName.c_str()); + dsqlScratch->appendUChar(blr_column_name); + dsqlScratch->appendUChar(type.fullDomain ? blr_domain_full : blr_domain_type_of); + dsqlScratch->appendMetaString(type.typeOfTable.c_str()); + dsqlScratch->appendMetaString(type.typeOfName.c_str()); } } else { if (type.collateSpecified) { - statement->append_uchar(blr_domain_name2); - statement->append_uchar(type.fullDomain ? blr_domain_full : blr_domain_type_of); - statement->append_meta_string(type.typeOfName.c_str()); - statement->append_ushort(type.textType); + dsqlScratch->appendUChar(blr_domain_name2); + dsqlScratch->appendUChar(type.fullDomain ? blr_domain_full : blr_domain_type_of); + dsqlScratch->appendMetaString(type.typeOfName.c_str()); + dsqlScratch->appendUShort(type.textType); } else { - statement->append_uchar(blr_domain_name); - statement->append_uchar(type.fullDomain ? blr_domain_full : blr_domain_type_of); - statement->append_meta_string(type.typeOfName.c_str()); + dsqlScratch->appendUChar(blr_domain_name); + dsqlScratch->appendUChar(type.fullDomain ? blr_domain_full : blr_domain_type_of); + dsqlScratch->appendMetaString(type.typeOfName.c_str()); } } @@ -181,39 +181,39 @@ case dtype_varying: case dtype_blob: if (!useSubType) - statement->append_uchar(blr_dtypes[type.type]); + dsqlScratch->appendUChar(blr_dtypes[type.type]); else if (type.type == dtype_varying) { - statement->append_uchar(blr_varying2); - statement->append_ushort(type.textType); + dsqlScratch->appendUChar(blr_varying2); + dsqlScratch->appendUShort(type.textType); } else if (type.type == dtype_cstring) { - statement->append_uchar(blr_cstring2); - statement->append_ushort(type.textType); + dsqlScratch->appendUChar(blr_cstring2); + dsqlScratch->appendUShort(type.textType); } else if (type.type == dtype_blob) { - statement->append_uchar(blr_blob2); - statement->append_ushort(type.subType); - statement->append_ushort(type.textType); + dsqlScratch->appendUChar(blr_blob2); + dsqlScratch->appendUShort(type.subType); + dsqlScratch->appendUShort(type.textType); } else { - statement->append_uchar(blr_text2); - statement->append_ushort(type.textType); + dsqlScratch->appendUChar(blr_text2); + dsqlScratch->appendUShort(type.textType); } if (type.type == dtype_varying) - statement->append_ushort(type.length - sizeof(USHORT)); + dsqlScratch->appendUShort(type.length - sizeof(USHORT)); else if (type.type != dtype_blob) - statement->append_ushort(type.length); + dsqlScratch->appendUShort(type.length); break; default: - statement->append_uchar(blr_dtypes[type.type]); + dsqlScratch->appendUChar(blr_dtypes[type.type]); if (DTYPE_IS_EXACT(type.type) || dtype_quad == type.type) - statement->append_uchar(type.scale); + dsqlScratch->appendUChar(type.scale); break; } } @@ -959,13 +959,13 @@ { FUN.RDB$FUNCTION_BLR.NULL = FALSE; attachment->storeBinaryBlob(tdbb, transaction, &FUN.RDB$FUNCTION_BLR, - statement->getBlrData().begin(), - statement->getBlrData().getCount()); + dsqlScratch->getBlrData().begin(), + dsqlScratch->getBlrData().getCount()); FUN.RDB$DEBUG_INFO.NULL = FALSE; attachment->storeBinaryBlob(tdbb, transaction, &FUN.RDB$DEBUG_INFO, - statement->getDebugData().begin(), - statement->getDebugData().getCount()); + dsqlScratch->getDebugData().begin(), + dsqlScratch->getDebugData().getCount()); } } @@ -1110,20 +1110,20 @@ string defaultSource = string(defaultString->str_data, defaultString->str_length); attachment->storeMetaDataBlob(tdbb, transaction, &ARG.RDB$DEFAULT_SOURCE, defaultSource); - statement->getBlrData().clear(); + dsqlScratch->getBlrData().clear(); if (statement->getFlags() & DsqlCompiledStatement::FLAG_BLR_VERSION4) - statement->append_uchar(blr_version4); + dsqlScratch->appendUChar(blr_version4); else - statement->append_uchar(blr_version5); + dsqlScratch->appendUChar(blr_version5); GEN_expr(dsqlScratch, parameter.legacyDefault->nod_arg[e_dft_default]); - statement->append_uchar(blr_eoc); + dsqlScratch->appendUChar(blr_eoc); attachment->storeBinaryBlob(tdbb, transaction, &ARG.RDB$DEFAULT_VALUE, - statement->getBlrData().begin(), - statement->getBlrData().getCount()); + dsqlScratch->getBlrData().begin(), + dsqlScratch->getBlrData().getCount()); } } END_STORE @@ -1145,49 +1145,49 @@ if (body) { - statement->beginDebug(); - statement->getBlrData().clear(); + dsqlScratch->beginDebug(); + dsqlScratch->getBlrData().clear(); if (statement->getFlags() & DsqlCompiledStatement::FLAG_BLR_VERSION4) - statement->append_uchar(blr_version4); + dsqlScratch->appendUChar(blr_version4); else - statement->append_uchar(blr_version5); + dsqlScratch->appendUChar(blr_version5); - statement->append_uchar(blr_begin); + dsqlScratch->appendUChar(blr_begin); if (parameters.getCount() != 0) { fb_assert(parameters.getCount() < size_t(MAX_USHORT / 2)); - statement->append_uchar(blr_message); - statement->append_uchar(0); - statement->append_ushort(2 * parameters.getCount()); + dsqlScratch->appendUChar(blr_message); + dsqlScratch->appendUChar(0); + dsqlScratch->appendUShort(2 * parameters.getCount()); for (unsigned i = 0; i < parameters.getCount(); ++i) { ParameterClause& parameter = parameters[i]; - statement->put_debug_argument(fb_dbg_arg_input, i, + dsqlScratch->putDebugArgument(fb_dbg_arg_input, i, parameter.name.c_str()); putType(parameter, true); // add slot for null flag (parameter2) - statement->append_uchar(blr_short); - statement->append_uchar(0); + dsqlScratch->appendUChar(blr_short); + dsqlScratch->appendUChar(0); variables.add(MAKE_variable(parameter.legacyField, parameter.name.c_str(), VAR_input, 0, (USHORT) (2 * i), 0)); } } - statement->append_uchar(blr_message); - statement->append_uchar(1); - statement->append_ushort(2); + dsqlScratch->appendUChar(blr_message); + dsqlScratch->appendUChar(1); + dsqlScratch->appendUShort(2); - statement->put_debug_argument(fb_dbg_arg_output, 0, ""); + dsqlScratch->putDebugArgument(fb_dbg_arg_output, 0, ""); putType(returnType, true); // add slot for null flag (parameter2) - statement->append_uchar(blr_short); - statement->append_uchar(0); + dsqlScratch->appendUChar(blr_short); + dsqlScratch->appendUChar(0); dsql_nod* const var = MAKE_variable(returnType.legacyField, "", VAR_output, 1, 0, 0); variables.add(var); @@ -1195,11 +1195,11 @@ if (parameters.getCount() != 0) { - statement->append_uchar(blr_receive); - statement->append_uchar(0); + dsqlScratch->appendUChar(blr_receive); + dsqlScratch->appendUChar(0); } - statement->append_uchar(blr_begin); + dsqlScratch->appendUChar(blr_begin); for (unsigned i = 0; i < parameters.getCount(); ++i) { @@ -1209,12 +1209,12 @@ { // ASF: To validate input parameters we need only to read its value. // Assigning it to null is an easy way to do this. - statement->append_uchar(blr_assignment); - statement->append_uchar(blr_parameter2); - statement->append_uchar(0); // input - statement->append_ushort(i * 2); - statement->append_ushort(i * 2 + 1); - statement->append_uchar(blr_null); + dsqlScratch->appendUChar(blr_assignment); + dsqlScratch->appendUChar(blr_parameter2); + dsqlScratch->appendUChar(0); // input + dsqlScratch->appendUShort(i * 2); + dsqlScratch->appendUShort(i * 2 + 1); + dsqlScratch->appendUChar(blr_null); } } @@ -1227,24 +1227,24 @@ putLocalVariables(dsqlScratch, localDeclList, 1); - statement->append_uchar(blr_stall); + dsqlScratch->appendUChar(blr_stall); // put a label before body of procedure, // so that any EXIT statement can get out - statement->append_uchar(blr_label); - statement->append_uchar(0); + dsqlScratch->appendUChar(blr_label); + dsqlScratch->appendUChar(0); dsqlScratch->loopLevel = 0; dsqlScratch->cursorNumber = 0; GEN_statement(dsqlScratch, PASS1_statement(dsqlScratch, body)); statement->setType(DsqlCompiledStatement::TYPE_DDL); - statement->append_uchar(blr_end); - genReturn(statement, false); + dsqlScratch->appendUChar(blr_end); + genReturn(dsqlScratch, false); - statement->append_uchar(blr_end); - statement->append_uchar(blr_eoc); + dsqlScratch->appendUChar(blr_end); + dsqlScratch->appendUChar(blr_eoc); - statement->endDebug(); + dsqlScratch->endDebug(); } invalid = false; @@ -1761,13 +1761,13 @@ { P.RDB$PROCEDURE_BLR.NULL = FALSE; attachment->storeBinaryBlob(tdbb, transaction, &P.RDB$PROCEDURE_BLR, - statement->getBlrData().begin(), - statement->getBlrData().getCount()); + dsqlScratch->getBlrData().begin(), + dsqlScratch->getBlrData().getCount()); P.RDB$DEBUG_INFO.NULL = FALSE; attachment->storeBinaryBlob(tdbb, transaction, &P.RDB$DEBUG_INFO, - statement->getDebugData().begin(), - statement->getDebugData().getCount()); + dsqlScratch->getDebugData().begin(), + dsqlScratch->getDebugData().getCount()); P.RDB$PROCEDURE_TYPE.NULL = FALSE; P.RDB$PROCEDURE_TYPE = (USHORT) @@ -1914,20 +1914,20 @@ DsqlCompiledStatement* statement = dsqlScratch->getStatement(); - statement->getBlrData().clear(); + dsqlScratch->getBlrData().clear(); if (statement->getFlags() & DsqlCompiledStatement::FLAG_BLR_VERSION4) - statement->append_uchar(blr_version4); + dsqlScratch->appendUChar(blr_version4); else - statement->append_uchar(blr_version5); + dsqlScratch->appendUChar(blr_version5); GEN_expr(dsqlScratch, parameter.legacyDefault->nod_arg[e_dft_default]); - statement->append_uchar(blr_eoc); + dsqlScratch->appendUChar(blr_eoc); attachment->storeBinaryBlob(tdbb, transaction, &PRM.RDB$DEFAULT_VALUE, - statement->getBlrData().begin(), - statement->getBlrData().getCount()); + dsqlScratch->getBlrData().begin(), + dsqlScratch->getBlrData().getCount()); } } END_STORE @@ -1951,32 +1951,32 @@ DsqlCompiledStatement* statement = dsqlScratch->getStatement(); - statement->beginDebug(); - statement->getBlrData().clear(); + dsqlScratch->beginDebug(); + dsqlScratch->getBlrData().clear(); if (statement->getFlags() & DsqlCompiledStatement::FLAG_BLR_VERSION4) - statement->append_uchar(blr_version4); + dsqlScratch->appendUChar(blr_version4); else - statement->append_uchar(blr_version5); + dsqlScratch->appendUChar(blr_version5); - statement->append_uchar(blr_begin); + dsqlScratch->appendUChar(blr_begin); if (parameters.getCount() != 0) { fb_assert(parameters.getCount() < MAX_USHORT / 2); - statement->append_uchar(blr_message); - statement->append_uchar(0); - statement->append_ushort(2 * parameters.getCount()); + dsqlScratch->appendUChar(blr_message); + dsqlScratch->appendUChar(0); + dsqlScratch->appendUShort(2 * parameters.getCount()); for (unsigned i = 0; i < parameters.getCount(); ++i) { ParameterClause& parameter = parameters[i]; - statement->put_debug_argument(fb_dbg_arg_input, i, parameter.name.c_str()); + dsqlScratch->putDebugArgument(fb_dbg_arg_input, i, parameter.name.c_str()); putType(parameter, true); // add slot for null flag (parameter2) - statement->append_uchar(blr_short); - statement->append_uchar(0); + dsqlScratch->appendUChar(blr_short); + dsqlScratch->appendUChar(0); variables.add(MAKE_variable(parameter.legacyField, parameter.name.c_str(), VAR_input, 0, (USHORT) (2 * i), 0)); @@ -1984,21 +1984,21 @@ } fb_assert(returns.getCount() < MAX_USHORT / 2); - statement->append_uchar(blr_message); - statement->append_uchar(1); - statement->append_ushort(2 * returns.getCount() + 1); + dsqlScratch->appendUChar(blr_message); + dsqlScratch->appendUChar(1); + dsqlScratch->appendUShort(2 * returns.getCount() + 1); if (returns.getCount() != 0) { for (unsigned i = 0; i < returns.getCount(); ++i) { ParameterClause& parameter = returns[i]; - statement->put_debug_argument(fb_dbg_arg_output, i, parameter.name.c_str()); + dsqlScratch->putDebugArgument(fb_dbg_arg_output, i, parameter.name.c_str()); putType(parameter, true); // add slot for null flag (parameter2) - statement->append_uchar(blr_short); - statement->append_uchar(0); + dsqlScratch->appendUChar(blr_short); + dsqlScratch->appendUChar(0); dsql_nod* const var = MAKE_variable(parameter.legacyField, parameter.name.c_str(), VAR_output, 1, (USHORT) (2 * i), i); @@ -2009,16 +2009,16 @@ } // add slot for EOS - statement->append_uchar(blr_short); - statement->append_uchar(0); + dsqlScratch->appendUChar(blr_short); + dsqlScratch->appendUChar(0); if (parameters.getCount() != 0) { - statement->append_uchar(blr_receive); - statement->append_uchar(0); + dsqlScratch->appendUChar(blr_receive); + dsqlScratch->appendUChar(0); } - statement->append_uchar(blr_begin); + dsqlScratch->appendUChar(blr_begin); for (unsigned i = 0; i < parameters.getCount(); ++i) { @@ -2028,12 +2028,12 @@ { // ASF: To validate an input parameter we need only to read its value. // Assigning it to null is an easy way to do this. - statement->append_uchar(blr_assignment); - statement->append_uchar(blr_parameter2); - statement->append_uchar(0); // input - statement->append_ushort(i * 2); - statement->append_ushort(i * 2 + 1); - statement->append_uchar(blr_null); + dsqlScratch->appendUChar(blr_assignment); + dsqlScratch->appendUChar(blr_parameter2); + dsqlScratch->appendUChar(0); // input + dsqlScratch->appendUShort(i * 2); + dsqlScratch->appendUShort(i * 2 + 1); + dsqlScratch->appendUChar(blr_null); } } @@ -2050,24 +2050,24 @@ putLocalVariables(dsqlScratch, localDeclList, returns.getCount()); - statement->append_uchar(blr_stall); + dsqlScratch->appendUChar(blr_stall); // put a label before body of procedure, // so that any EXIT statement can get out - statement->append_uchar(blr_label); - statement->append_uchar(0); + dsqlScratch->appendUChar(blr_label); + dsqlScratch->appendUChar(0); dsqlScratch->loopLevel = 0; dsqlScratch->cur... [truncated message content] |
From: <asf...@us...> - 2010-06-26 01:52:14
|
Revision: 51288 http://firebird.svn.sourceforge.net/firebird/?rev=51288&view=rev Author: asfernandes Date: 2010-06-26 01:52:06 +0000 (Sat, 26 Jun 2010) Log Message: ----------- Refactor CREATE/DROP COLLATION Modified Paths: -------------- firebird/trunk/lang_helpers/gds_codes.ftn firebird/trunk/lang_helpers/gds_codes.pas firebird/trunk/src/dsql/DdlNodes.epp firebird/trunk/src/dsql/DdlNodes.h firebird/trunk/src/dsql/ddl.cpp firebird/trunk/src/dsql/node.h firebird/trunk/src/dsql/parse.y firebird/trunk/src/dsql/pass1.cpp firebird/trunk/src/include/gen/codetext.h firebird/trunk/src/include/gen/iberror.h firebird/trunk/src/include/gen/msgs.h firebird/trunk/src/include/gen/sql_code.h firebird/trunk/src/include/gen/sql_state.h firebird/trunk/src/jrd/Attachment.cpp firebird/trunk/src/jrd/Attachment.h firebird/trunk/src/jrd/drq.h firebird/trunk/src/jrd/dyn.epp firebird/trunk/src/jrd/dyn.h firebird/trunk/src/jrd/dyn_def.epp firebird/trunk/src/jrd/dyn_del.epp firebird/trunk/src/jrd/dyn_df_proto.h firebird/trunk/src/jrd/dyn_dl_proto.h firebird/trunk/src/msgs/messages2.sql firebird/trunk/src/msgs/system_errors2.sql Modified: firebird/trunk/lang_helpers/gds_codes.ftn =================================================================== --- firebird/trunk/lang_helpers/gds_codes.ftn 2010-06-26 01:24:31 UTC (rev 51287) +++ firebird/trunk/lang_helpers/gds_codes.ftn 2010-06-26 01:52:06 UTC (rev 51288) @@ -1638,8 +1638,18 @@ PARAMETER (GDS__invalid_coll_attr = 336068830) INTEGER*4 GDS__dyn_wrong_gtt_scope PARAMETER (GDS__dyn_wrong_gtt_scope = 336068840) + INTEGER*4 GDS__dyn_coll_used_table + PARAMETER (GDS__dyn_coll_used_table = 336068843) + INTEGER*4 GDS__dyn_coll_used_domain + PARAMETER (GDS__dyn_coll_used_domain = 336068844) + INTEGER*4 GDS__dyn_cannot_del_syscoll + PARAMETER (GDS__dyn_cannot_del_syscoll = 336068845) + INTEGER*4 GDS__dyn_cannot_del_def_coll + PARAMETER (GDS__dyn_cannot_del_def_coll = 336068846) INTEGER*4 GDS__dyn_table_not_found PARAMETER (GDS__dyn_table_not_found = 336068849) + INTEGER*4 GDS__dyn_coll_used_procedure + PARAMETER (GDS__dyn_coll_used_procedure = 336068851) INTEGER*4 GDS__dyn_scale_too_big PARAMETER (GDS__dyn_scale_too_big = 336068852) INTEGER*4 GDS__dyn_precision_too_small Modified: firebird/trunk/lang_helpers/gds_codes.pas =================================================================== --- firebird/trunk/lang_helpers/gds_codes.pas 2010-06-26 01:24:31 UTC (rev 51287) +++ firebird/trunk/lang_helpers/gds_codes.pas 2010-06-26 01:52:06 UTC (rev 51288) @@ -826,7 +826,12 @@ gds_max_coll_per_charset = 336068829; gds_invalid_coll_attr = 336068830; gds_dyn_wrong_gtt_scope = 336068840; + gds_dyn_coll_used_table = 336068843; + gds_dyn_coll_used_domain = 336068844; + gds_dyn_cannot_del_syscoll = 336068845; + gds_dyn_cannot_del_def_coll = 336068846; gds_dyn_table_not_found = 336068849; + gds_dyn_coll_used_procedure = 336068851; gds_dyn_scale_too_big = 336068852; gds_dyn_precision_too_small = 336068853; gds_dyn_miss_priv_warning = 336068855; Modified: firebird/trunk/src/dsql/DdlNodes.epp =================================================================== --- firebird/trunk/src/dsql/DdlNodes.epp 2010-06-26 01:24:31 UTC (rev 51287) +++ firebird/trunk/src/dsql/DdlNodes.epp 2010-06-26 01:52:06 UTC (rev 51288) @@ -30,6 +30,7 @@ #include "../jrd/msg_encode.h" #include "../jrd/obj.h" #include "../jrd/tra.h" +#include "../jrd/IntlManager.h" #include "../jrd/PreparedStatement.h" #include "../jrd/blb_proto.h" #include "../jrd/cmp_proto.h" @@ -2757,6 +2758,360 @@ //---------------------- +void CreateCollationNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const +{ + text.printf( + "CreateCollationNode\n" + " name: '%s'\n" + " forCharSet: '%s'\n" + " fromName: '%s'\n" + " fromExternal: '%s'\n" + " attributesOn: %x\n" + " attributesOff: %x\n", + name.c_str(), forCharSet.c_str(), fromName.c_str(), fromExternal.c_str(), + attributesOn, attributesOff); +} + +void CreateCollationNode::execute(thread_db* tdbb, jrd_tra* transaction) +{ + Attachment* attachment = transaction->tra_attachment; + + // run all statements under savepoint control + AutoSavePoint savePoint(tdbb, transaction); + + executeDdlTrigger(tdbb, transaction, DTW_BEFORE, DDL_TRIGGER_CREATE_COLLATION, name); + + bool endStore = false; + + try + { + AutoCacheRequest request(tdbb, drq_s_colls, DYN_REQUESTS); + + STORE(REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + X IN RDB$COLLATIONS + { + X.RDB$CHARACTER_SET_ID = forCharSetId; + strcpy(X.RDB$COLLATION_NAME, name.c_str()); + X.RDB$SYSTEM_FLAG = 0; + + X.RDB$SPECIFIC_ATTRIBUTES.NULL = TRUE; + X.RDB$BASE_COLLATION_NAME.NULL = TRUE; + + CharSet* cs = INTL_charset_lookup(tdbb, forCharSetId); + SubtypeInfo info; + + if (fromName.hasData()) + { + if (MET_get_char_coll_subtype_info(tdbb, + INTL_CS_COLL_TO_TTYPE(forCharSetId, fromCollationId), &info) && + info.specificAttributes.hasData()) + { + UCharBuffer temp; + ULONG size = info.specificAttributes.getCount() * cs->maxBytesPerChar(); + + size = INTL_convert_bytes(tdbb, forCharSetId, temp.getBuffer(size), size, + CS_METADATA, info.specificAttributes.begin(), + info.specificAttributes.getCount(), status_exception::raise); + temp.shrink(size); + info.specificAttributes = temp; + } + + strcpy(X.RDB$BASE_COLLATION_NAME, info.baseCollationName.c_str()); + X.RDB$BASE_COLLATION_NAME.NULL = FALSE; + } + else if (fromExternal.hasData()) + { + strcpy(X.RDB$BASE_COLLATION_NAME, fromExternal.c_str()); + X.RDB$BASE_COLLATION_NAME.NULL = FALSE; + } + + if (specificAttributes.hasData()) + { + UCharBuffer temp; + ULONG size = specificAttributes.getCount() * cs->maxBytesPerChar(); + + size = INTL_convert_bytes(tdbb, forCharSetId, temp.getBuffer(size), size, + attachment->att_charset, specificAttributes.begin(), + specificAttributes.getCount(), status_exception::raise); + temp.shrink(size); + specificAttributes = temp; + } + + info.charsetName = forCharSet.c_str(); + info.collationName = name; + if (X.RDB$BASE_COLLATION_NAME.NULL) + info.baseCollationName = info.collationName; + else + info.baseCollationName = X.RDB$BASE_COLLATION_NAME; + info.ignoreAttributes = false; + + if (!IntlManager::collationInstalled(info.baseCollationName.c_str(), + info.charsetName.c_str())) + { + // msg: 223: "Collation @1 not installed for character set @2" + status_exception::raise( + Arg::Gds(isc_no_meta_update) << + Arg::Gds(ENCODE_ISC_MSG(223, DYN_MSG_FAC)) << + info.baseCollationName << info.charsetName); + } + + IntlUtil::SpecificAttributesMap map; + + if (!IntlUtil::parseSpecificAttributes( + cs, info.specificAttributes.getCount(), info.specificAttributes.begin(), &map) || + !IntlUtil::parseSpecificAttributes( + cs, specificAttributes.getCount(), specificAttributes.begin(), &map)) + { + // msg: 222: "Invalid collation attributes" + status_exception::raise( + Arg::Gds(isc_no_meta_update) << + Arg::Gds(ENCODE_ISC_MSG(222, DYN_MSG_FAC))); + } + + const string s = IntlUtil::generateSpecificAttributes(cs, map); + string newSpecificAttributes; + + if (!IntlManager::setupCollationAttributes( + info.baseCollationName.c_str(), info.charsetName.c_str(), s, + newSpecificAttributes)) + { + // msg: 222: "Invalid collation attributes" + status_exception::raise( + Arg::Gds(isc_no_meta_update) << + Arg::Gds(ENCODE_ISC_MSG(222, DYN_MSG_FAC))); + } + + memcpy(info.specificAttributes.getBuffer(newSpecificAttributes.length()), + newSpecificAttributes.begin(), newSpecificAttributes.length()); + + if (info.specificAttributes.hasData()) + { + X.RDB$SPECIFIC_ATTRIBUTES.NULL = FALSE; + attachment->storeMetaDataBlob(tdbb, transaction, &X.RDB$SPECIFIC_ATTRIBUTES, + string(info.specificAttributes.begin(), info.specificAttributes.getCount()), + forCharSetId); + } + + info.attributes = (info.attributes | attributesOn) & (~attributesOff); + X.RDB$COLLATION_ATTRIBUTES = info.attributes; + + // Do not allow invalid attributes here. + if (!INTL_texttype_validate(tdbb, &info)) + { + // msg: 222: "Invalid collation attributes" + status_exception::raise( + Arg::Gds(isc_no_meta_update) << + Arg::Gds(ENCODE_ISC_MSG(222, DYN_MSG_FAC))); + } + + // ASF: User collations are created with the last number available, + // to minimize the possibility of conflicts with future system collations. + // The greater available number is 126 to avoid signed/unsigned problems. + + X.RDB$COLLATION_ID.NULL = TRUE; + X.RDB$COLLATION_ID = 126; + + AutoCacheRequest request2(tdbb, drq_l_max_coll_id, DYN_REQUESTS); + + FOR(REQUEST_HANDLE request2) + Y IN RDB$COLLATIONS + WITH Y.RDB$CHARACTER_SET_ID = forCharSetId AND + Y.RDB$COLLATION_ID NOT MISSING + SORTED BY DESCENDING Y.RDB$COLLATION_ID + { + if (Y.RDB$COLLATION_ID + 1 <= X.RDB$COLLATION_ID) + { + X.RDB$COLLATION_ID.NULL = FALSE; + break; + } + else + X.RDB$COLLATION_ID = Y.RDB$COLLATION_ID - 1; + } + END_FOR + + if (X.RDB$COLLATION_ID.NULL) + { + status_exception::raise( + Arg::Gds(isc_no_meta_update) << + Arg::Gds(isc_max_coll_per_charset)); + } + + endStore = true; + } + END_STORE + } + catch (const status_exception& ex) + { + // DEFINE COLLATION failed + rethrowMetaException(ex, ENCODE_ISC_MSG(219, DYN_MSG_FAC), endStore); + } + + executeDdlTrigger(tdbb, transaction, DTW_AFTER, DDL_TRIGGER_CREATE_COLLATION, name); + + savePoint.release(); // everything is ok + + // Update DSQL cache + AutoPtr<dsql_str> str(MAKE_string(name.c_str(), name.length())); + METD_drop_collation(transaction, str); + MET_dsql_cache_release(tdbb, SYM_intlsym_collation, str->str_data); +} + +DdlNode* CreateCollationNode::internalDsqlPass() +{ + const dsql_intlsym* resolvedCharSet = METD_get_charset( + dsqlScratch->getTransaction(), forCharSet.length(), forCharSet.c_str()); + + if (!resolvedCharSet) + { + // specified character set not found + ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-504) << + Arg::Gds(isc_charset_not_found) << forCharSet); + } + + forCharSetId = resolvedCharSet->intlsym_charset_id; + + if (fromName.hasData()) + { + AutoPtr<dsql_str> str(MAKE_string(fromName.c_str(), fromName.length())); + const dsql_intlsym* resolvedCollation = METD_get_collation( + dsqlScratch->getTransaction(), str, forCharSetId); + + if (!resolvedCollation) + { + // Specified collation not found + ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-204) << + Arg::Gds(isc_collation_not_found) << fromName << forCharSet); + } + + fromCollationId = resolvedCollation->intlsym_collate_id; + } + + return DdlNode::internalDsqlPass(); +} + + +//---------------------- + + +void DropCollationNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const +{ + text.printf( + "DropCollationNode\n" + " name: '%s'\n", + name.c_str()); +} + +void DropCollationNode::execute(thread_db* tdbb, jrd_tra* transaction) +{ + // run all statements under savepoint control + AutoSavePoint savePoint(tdbb, transaction); + + bool found = false; + AutoCacheRequest request(tdbb, drq_e_colls, DYN_REQUESTS); + + FOR (REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + COLL IN RDB$COLLATIONS + CROSS CS IN RDB$CHARACTER_SETS + WITH COLL.RDB$COLLATION_NAME EQ name.c_str() AND + CS.RDB$CHARACTER_SET_ID EQ COLL.RDB$CHARACTER_SET_ID + { + executeDdlTrigger(tdbb, transaction, DTW_BEFORE, DDL_TRIGGER_DROP_COLLATION, name); + + if (!COLL.RDB$SYSTEM_FLAG.NULL && COLL.RDB$SYSTEM_FLAG) + { + status_exception::raise(Arg::Gds(isc_no_meta_update) << + Arg::Gds(isc_dyn_cannot_del_syscoll)); + } + + if (COLL.RDB$COLLATION_ID == 0 || + (!CS.RDB$DEFAULT_COLLATE_NAME.NULL && + MetaName(COLL.RDB$COLLATION_NAME) == MetaName(CS.RDB$DEFAULT_COLLATE_NAME))) + { + fb_utils::exact_name_limit(CS.RDB$CHARACTER_SET_NAME, + sizeof(CS.RDB$CHARACTER_SET_NAME)); + + status_exception::raise(Arg::Gds(isc_no_meta_update) << + Arg::Gds(isc_dyn_cannot_del_def_coll) << CS.RDB$CHARACTER_SET_NAME); + } + + found = true; + fb_utils::exact_name_limit(COLL.RDB$COLLATION_NAME, sizeof(COLL.RDB$COLLATION_NAME)); + + AutoCacheRequest request2(tdbb, drq_l_rfld_coll, DYN_REQUESTS); + + FOR (REQUEST_HANDLE request2 TRANSACTION_HANDLE transaction) + RF IN RDB$RELATION_FIELDS CROSS F IN RDB$FIELDS + WITH RF.RDB$FIELD_SOURCE EQ F.RDB$FIELD_NAME AND + F.RDB$CHARACTER_SET_ID EQ COLL.RDB$CHARACTER_SET_ID AND + RF.RDB$COLLATION_ID EQ COLL.RDB$COLLATION_ID + { + fb_utils::exact_name_limit(RF.RDB$RELATION_NAME, sizeof(RF.RDB$RELATION_NAME)); + fb_utils::exact_name_limit(RF.RDB$FIELD_NAME, sizeof(RF.RDB$FIELD_NAME)); + + status_exception::raise(Arg::Gds(isc_no_meta_update) << + Arg::Gds(isc_dyn_coll_used_table) << COLL.RDB$COLLATION_NAME << + RF.RDB$RELATION_NAME << RF.RDB$FIELD_NAME); + } + END_FOR + + request2.reset(tdbb, drq_l_prm_coll, DYN_REQUESTS); + + FOR (REQUEST_HANDLE request2 TRANSACTION_HANDLE transaction) + PRM IN RDB$PROCEDURE_PARAMETERS CROSS F IN RDB$FIELDS + WITH PRM.RDB$FIELD_SOURCE EQ F.RDB$FIELD_NAME AND + F.RDB$CHARACTER_SET_ID EQ COLL.RDB$CHARACTER_SET_ID AND + PRM.RDB$COLLATION_ID EQ COLL.RDB$COLLATION_ID + { + fb_utils::exact_name_limit(PRM.RDB$PARAMETER_NAME, sizeof(PRM.RDB$PARAMETER_NAME)); + + status_exception::raise(Arg::Gds(isc_no_meta_update) << + Arg::Gds(isc_dyn_coll_used_procedure) << + COLL.RDB$COLLATION_NAME << + QualifiedName(PRM.RDB$PROCEDURE_NAME, + (PRM.RDB$PACKAGE_NAME.NULL ? NULL : PRM.RDB$PACKAGE_NAME)).toString().c_str() << + PRM.RDB$PARAMETER_NAME); + } + END_FOR + + request2.reset(tdbb, drq_l_fld_coll, DYN_REQUESTS); + + FOR (REQUEST_HANDLE request2 TRANSACTION_HANDLE transaction) + F IN RDB$FIELDS + WITH F.RDB$CHARACTER_SET_ID EQ COLL.RDB$CHARACTER_SET_ID AND + F.RDB$COLLATION_ID EQ COLL.RDB$COLLATION_ID + { + fb_utils::exact_name_limit(F.RDB$FIELD_NAME, sizeof(F.RDB$FIELD_NAME)); + + status_exception::raise(Arg::Gds(isc_no_meta_update) << + Arg::Gds(isc_dyn_coll_used_domain) << COLL.RDB$COLLATION_NAME << F.RDB$FIELD_NAME); + } + END_FOR + + ERASE COLL; + } + END_FOR + + if (found) + executeDdlTrigger(tdbb, transaction, DTW_AFTER, DDL_TRIGGER_DROP_COLLATION, name); + else + { + status_exception::raise( + Arg::Gds(isc_no_meta_update) << + Arg::Gds(isc_dyn_collation_not_found) << Arg::Str(name)); + } + + savePoint.release(); // everything is ok + + // Update DSQL cache + AutoPtr<dsql_str> str(MAKE_string(name.c_str(), name.length())); + METD_drop_collation(transaction, str); + MET_dsql_cache_release(tdbb, SYM_intlsym_collation, str->str_data); +} + + +//---------------------- + + void CreateSequenceNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const { text.printf( Modified: firebird/trunk/src/dsql/DdlNodes.h =================================================================== --- firebird/trunk/src/dsql/DdlNodes.h 2010-06-26 01:24:31 UTC (rev 51287) +++ firebird/trunk/src/dsql/DdlNodes.h 2010-06-26 01:52:06 UTC (rev 51288) @@ -24,11 +24,14 @@ #define DSQL_DDL_NODES_H #include "../jrd/common.h" +#include "../jrd/dyn.h" +#include "../jrd/msg_encode.h" #include "../dsql/node.h" #include "../dsql/make_proto.h" #include "../dsql/Nodes.h" #include "../common/classes/array.h" #include "../common/classes/TriState.h" +#include "../dsql/errd_proto.h" namespace Jrd { @@ -494,6 +497,91 @@ }; +class CreateCollationNode : public DdlNode +{ +public: + explicit CreateCollationNode(MemoryPool& p, const Firebird::string& sqlText, + const Firebird::MetaName& aName, const Firebird::MetaName& aForCharSet) + : DdlNode(p, sqlText), + name(p, aName), + forCharSet(p, aForCharSet), + fromName(p), + fromExternal(p), + specificAttributes(p), + attributesOn(0), + attributesOff(0), + forCharSetId(0), + fromCollationId(0) + { + } + +public: + virtual void print(Firebird::string& text, Firebird::Array<dsql_nod*>& nodes) const; + virtual void execute(thread_db* tdbb, jrd_tra* transaction); + + void setAttribute(USHORT attribute) + { + if ((attributesOn | attributesOff) & attribute) + { + // msg: 222: "Invalid collation attributes" + using namespace Firebird; + ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) << + Arg::Gds(ENCODE_ISC_MSG(222, DYN_MSG_FAC))); + } + + attributesOn |= attribute; + } + + void unsetAttribute(USHORT attribute) + { + if ((attributesOn | attributesOff) & attribute) + { + // msg: 222: "Invalid collation attributes" + using namespace Firebird; + ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) << + Arg::Gds(ENCODE_ISC_MSG(222, DYN_MSG_FAC))); + } + + attributesOff |= attribute; + } + +protected: + virtual DdlNode* internalDsqlPass(); + +public: + Firebird::MetaName name; + Firebird::MetaName forCharSet; + Firebird::MetaName fromName; + Firebird::string fromExternal; + Firebird::UCharBuffer specificAttributes; + +private: + USHORT attributesOn; + USHORT attributesOff; + USHORT forCharSetId; + USHORT fromCollationId; +}; + + +class DropCollationNode : public DdlNode +{ +public: + explicit DropCollationNode(MemoryPool& p, const Firebird::string& sqlText, + const Firebird::MetaName& aName) + : DdlNode(p, sqlText), + name(p, 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 CreateSequenceNode : public DdlNode { public: Modified: firebird/trunk/src/dsql/ddl.cpp =================================================================== --- firebird/trunk/src/dsql/ddl.cpp 2010-06-26 01:24:31 UTC (rev 51287) +++ firebird/trunk/src/dsql/ddl.cpp 2010-06-26 01:52:06 UTC (rev 51288) @@ -132,7 +132,6 @@ static void define_field(DsqlCompilerScratch*, dsql_nod*, SSHORT, const dsql_str*, const dsql_nod* pkcols); static void define_filter(DsqlCompilerScratch*); static SSHORT getBlobFilterSubType(DsqlCompilerScratch* dsqlScratch, const dsql_nod* node); -static void define_collation(DsqlCompilerScratch*); static void define_role(DsqlCompilerScratch*); static void define_index(DsqlCompilerScratch*); static void define_rel_constraint(DsqlCompilerScratch*, dsql_nod*); @@ -148,7 +147,6 @@ const dsql_nod*, const char*, const char*); static void define_view(DsqlCompilerScratch*, NOD_TYPE); static void define_view_trigger(DsqlCompilerScratch*, dsql_nod*, dsql_nod*, dsql_nod*); -static void delete_collation(DsqlCompilerScratch*); static void delete_exception(DsqlCompilerScratch*, dsql_nod*, bool); static void delete_relation_view(DsqlCompilerScratch*, dsql_nod*, bool); static const dsql_nod* find_pk_columns(const dsql_nod* def_rel_elements); @@ -270,13 +268,6 @@ METD_drop_relation(request->getTransaction(), string); break; - case nod_del_collation: - // for delete, get rid of the cached collation metadata - string = (dsql_str*) statement->getDdlNode()->nod_arg[e_del_coll_name]; - sym_type = SYM_intlsym_collation; - METD_drop_collation(request->getTransaction(), string); - break; - case nod_del_udf: case nod_mod_udf: // Signal UDF for obsolescence @@ -1918,105 +1909,6 @@ } -static void define_collation(DsqlCompilerScratch* dsqlScratch) -{ -/************************************** - * - * d e f i n e _ c o l l a t i o n - * - ************************************** - * - * Function - * Create a collation. - * - **************************************/ - - DsqlCompiledStatement* statement = dsqlScratch->getStatement(); - - const dsql_nod* ddlNode = statement->getDdlNode(); - const dsql_str* coll_name = (dsql_str*) ddlNode->nod_arg[e_def_coll_name]; - const dsql_str* coll_for = (dsql_str*) ddlNode->nod_arg[e_def_coll_for]; - const dsql_nod* coll_from = ddlNode->nod_arg[e_def_coll_from]; - const dsql_nod* coll_attributes = ddlNode->nod_arg[e_def_coll_attributes]; - const dsql_nod* coll_specific_attributes = - PASS1_node(dsqlScratch, ddlNode->nod_arg[e_def_coll_specific_attributes]); - - const dsql_intlsym* resolved_charset = - METD_get_charset(dsqlScratch->getTransaction(), (USHORT) strlen(coll_for->str_data), - coll_for->str_data); - - if (!resolved_charset) - { - // specified character set not found - ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-504) << - Arg::Gds(isc_charset_not_found) << Arg::Str(coll_for->str_data)); - } - - if (coll_specific_attributes) - coll_specific_attributes = coll_specific_attributes->nod_arg[0]; - - dsqlScratch->appendNullString(isc_dyn_def_collation, coll_name->str_data); - dsqlScratch->appendNumber(isc_dyn_coll_for_charset, resolved_charset->intlsym_charset_id); - - if (coll_from) - { - const dsql_str* coll_name = reinterpret_cast<dsql_str*>(coll_from->nod_arg[0]); - if (coll_from->nod_type == nod_collation_from) - { - const dsql_intlsym* resolved_collation = METD_get_collation( - dsqlScratch->getTransaction(), coll_name, resolved_charset->intlsym_charset_id); - - if (!resolved_collation) - { - // Specified collation not found - ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-204) << - Arg::Gds(isc_collation_not_found) << Arg::Str(coll_name->str_data) << - Arg::Str(resolved_charset->intlsym_name)); - } - - dsqlScratch->appendNumber(isc_dyn_coll_from, - INTL_CS_COLL_TO_TTYPE(resolved_collation->intlsym_charset_id, - resolved_collation->intlsym_collate_id)); - } - else if (coll_from->nod_type == nod_collation_from_external) - { - dsqlScratch->appendNullString(isc_dyn_coll_from_external, coll_name->str_data); - } - else - fb_assert(false); - } - - if (coll_attributes) - { - const dsql_nod* const* ptr = coll_attributes->nod_arg; - for (const dsql_nod* const* const end = ptr + coll_attributes->nod_count; ptr < end; ptr++) - { - const dsql_nod* attribute = *ptr; - - switch (attribute->nod_type) - { - case nod_collation_attr: - dsqlScratch->appendNumber(isc_dyn_coll_attribute, (IPTR) attribute->nod_arg[0]); - break; - - default: - break; - } - } - } - - if (coll_specific_attributes) - { - dsqlScratch->appendNumber(isc_dyn_coll_specific_attributes_charset, - coll_specific_attributes->nod_desc.dsc_ttype()); - dsqlScratch->appendNullString(isc_dyn_coll_specific_attributes, - ((dsql_str*)coll_specific_attributes->nod_arg[0])->str_data); - } - - dsqlScratch->appendUChar(isc_dyn_end); -} - - static void define_index(DsqlCompilerScratch* dsqlScratch) { /************************************** @@ -3258,26 +3150,6 @@ } -static void delete_collation(DsqlCompilerScratch* dsqlScratch) -{ -/************************************** - * - * d e l e t e _ c o l l a t i o n - * - ************************************** - * - * Function - * Delete a collation. - * - **************************************/ - - DsqlCompiledStatement* statement = dsqlScratch->getStatement(); - const dsql_str* coll_name = (dsql_str*) statement->getDdlNode()->nod_arg[e_del_coll_name]; - dsqlScratch->appendNullString(isc_dyn_del_collation, coll_name->str_data); - dsqlScratch->appendUChar(isc_dyn_end); -} - - static void delete_exception (DsqlCompilerScratch* dsqlScratch, dsql_nod* node, bool silent_deletion) { /************************************** @@ -3673,14 +3545,6 @@ modify_map(dsqlScratch); break; - case nod_def_collation: - define_collation(dsqlScratch); - break; - - case nod_del_collation: - delete_collation(dsqlScratch); - break; - case nod_add_user: define_user(dsqlScratch, isc_dyn_user_add); break; Modified: firebird/trunk/src/dsql/node.h =================================================================== --- firebird/trunk/src/dsql/node.h 2010-06-26 01:24:31 UTC (rev 51287) +++ firebird/trunk/src/dsql/node.h 2010-06-26 01:52:06 UTC (rev 51288) @@ -265,12 +265,6 @@ nod_redef_exception, // RECREATE EXCEPTION nod_replace_exception, // CREATE OR ALTER EXCEPTION nod_mod_udf, - nod_def_collation, - nod_del_collation, - nod_collation_from, - nod_collation_from_external, - nod_collation_attr, - nod_collation_specific_attr, nod_strlen, nod_trim, nod_returning, @@ -831,16 +825,6 @@ e_mod_udf_module, e_mod_udf_count, - e_def_coll_name = 0, - e_def_coll_for, - e_def_coll_from, - e_def_coll_attributes, - e_def_coll_specific_attributes, - e_def_coll_count, - - e_del_coll_name = 0, - e_del_coll_count, - e_strlen_type = 0, // constant representing type of length e_strlen_value, e_strlen_count, Modified: firebird/trunk/src/dsql/parse.y =================================================================== --- firebird/trunk/src/dsql/parse.y 2010-06-26 01:24:31 UTC (rev 51287) +++ firebird/trunk/src/dsql/parse.y 2010-06-26 01:52:06 UTC (rev 51288) @@ -627,6 +627,7 @@ Jrd::ExprNode* exprNode; Jrd::StmtNode* stmtNode; Jrd::DdlNode* ddlNode; + Jrd::CreateCollationNode* createCollationNode; Jrd::CreateAlterFunctionNode* createAlterFunctionNode; Jrd::CreateAlterProcedureNode* createAlterProcedureNode; Jrd::CreateAlterTriggerNode* createAlterTriggerNode; @@ -659,10 +660,7 @@ %type <legacyNode> case_abbreviation case_expression case_operand case_result case_specification %type <legacyNode> cast_specification char_length_expression character_keyword character_type %type <legacyNode> charset_clause check_constraint check_opt close_cursor col_opt collate_clause -%type <legacyNode> collation_accent_attribute collation_attribute collation_attribute_list -%type <legacyNode> collation_attribute_list_opt collation_case_attribute collation_clause -%type <legacyNode> collation_pad_attribute collation_sequence_definition -%type <legacyNode> collation_specific_attribute_opt column_constraint column_constraint_clause +%type <legacyNode> column_constraint column_constraint_clause %type <legacyNode> column_constraint_def column_constraint_list column_def %type <legacyNode> column_list column_name column_parens column_parens_opt column_select @@ -822,6 +820,16 @@ %type <createAlterProcedureNode> alter_procedure_clause procedure_clause procedure_clause_start replace_procedure_clause %type <externalClause> external_clause +%type <createCollationNode> collation_clause +%type collation_sequence_definition(<createCollationNode>) +%type collation_accent_attribute(<createCollationNode>) +%type collation_attribute(<createCollationNode>) +%type collation_attribute_list(<createCollationNode>) +%type collation_attribute_list_opt(<createCollationNode>) +%type collation_case_attribute(<createCollationNode>) +%type collation_pad_attribute(<createCollationNode>) +%type collation_specific_attribute_opt(<createCollationNode>) + %type <triBoolVal> trigger_active %type <uint64Val> trigger_db_type trigger_ddl_type trigger_ddl_type_items trigger_type %type <uint64Val> trigger_type_prefix trigger_type_suffix @@ -1213,7 +1221,7 @@ | ROLE role_clause { $$ = $2; } | COLLATION collation_clause - { $$ = $2; } + { $$ = makeClassNode($2); } | USER create_user_clause { $$ = $2; } | PACKAGE package_clause @@ -1426,62 +1434,71 @@ // CREATE COLLATION -collation_clause : symbol_collation_name FOR symbol_character_set_name - collation_sequence_definition - collation_attribute_list_opt collation_specific_attribute_opt - { $$ = make_node (nod_def_collation, - (int) e_def_coll_count, $1, $3, $4, make_list($5), $6); } - ; +collation_clause + : symbol_collation_name FOR symbol_character_set_name + { + $<createCollationNode>$ = FB_NEW(getPool()) CreateCollationNode( + getPool(), compilingText, toName($1), toName($3)); + } + collation_sequence_definition($4) + collation_attribute_list_opt($4) collation_specific_attribute_opt($4) + { $$ = $4; } + ; -collation_sequence_definition : - FROM symbol_collation_name - { $$ = make_node(nod_collation_from, 1, $2); } - | FROM EXTERNAL '(' sql_string ')' - { $$ = make_node(nod_collation_from_external, 1, $4); } - | - { $$ = NULL; } - ; +collation_sequence_definition($createCollation) + : + | FROM symbol_collation_name + { $createCollation->fromName = toName($2); } + | FROM EXTERNAL '(' sql_string ')' + { $createCollation->fromExternal = toString($4); } + ; -collation_attribute_list_opt : - { $$ = NULL; } - | collation_attribute_list - ; +collation_attribute_list_opt($createCollation) + : + | collation_attribute_list($createCollation) + ; -collation_attribute_list : collation_attribute - | collation_attribute_list collation_attribute - { $$ = make_node(nod_list, 2, $1, $2); } - ; +collation_attribute_list($createCollation) + : collation_attribute($createCollation) + | collation_attribute_list collation_attribute($createCollation) + ; -collation_attribute : - collation_pad_attribute - | collation_case_attribute - | collation_accent_attribute - ; +collation_attribute($createCollation) + : collation_pad_attribute($createCollation) + | collation_case_attribute($createCollation) + | collation_accent_attribute($createCollation) + ; -collation_pad_attribute : NO PAD - { $$ = make_node(nod_collation_attr, 1, -TEXTTYPE_ATTR_PAD_SPACE); } - | PAD SPACE - { $$ = make_node(nod_collation_attr, 1, TEXTTYPE_ATTR_PAD_SPACE); } - ; +collation_pad_attribute($createCollation) + : NO PAD + { $createCollation->unsetAttribute(TEXTTYPE_ATTR_PAD_SPACE); } + | PAD SPACE + { $createCollation->setAttribute(TEXTTYPE_ATTR_PAD_SPACE); } + ; -collation_case_attribute : CASE SENSITIVE - { $$ = make_node(nod_collation_attr, 1, -TEXTTYPE_ATTR_CASE_INSENSITIVE); } - | CASE INSENSITIVE - { $$ = make_node(nod_collation_attr, 1, TEXTTYPE_ATTR_CASE_INSENSITIVE); }... [truncated message content] |
From: <asf...@us...> - 2010-06-27 03:47:49
|
Revision: 51295 http://firebird.svn.sourceforge.net/firebird/?rev=51295&view=rev Author: asfernandes Date: 2010-06-27 03:47:40 +0000 (Sun, 27 Jun 2010) Log Message: ----------- MSVC10 support Modified Paths: -------------- firebird/trunk/builds/win32/setenvvar.bat firebird/trunk/src/jrd/gds.cpp firebird/trunk/src/jrd/os/win32/mod_loader.cpp Added Paths: ----------- firebird/trunk/builds/win32/msvc10/ firebird/trunk/builds/win32/msvc10/DllNoEmbedManifest.props firebird/trunk/builds/win32/msvc10/Firebird2.sln firebird/trunk/builds/win32/msvc10/Firebird2Boot.sln firebird/trunk/builds/win32/msvc10/Firebird2_Examples.sln firebird/trunk/builds/win32/msvc10/alice.vcxproj firebird/trunk/builds/win32/msvc10/alice.vcxproj.filters firebird/trunk/builds/win32/msvc10/btyacc.vcxproj firebird/trunk/builds/win32/msvc10/btyacc.vcxproj.filters firebird/trunk/builds/win32/msvc10/build_msg.vcxproj firebird/trunk/builds/win32/msvc10/build_msg.vcxproj.filters firebird/trunk/builds/win32/msvc10/burp.vcxproj firebird/trunk/builds/win32/msvc10/burp.vcxproj.filters firebird/trunk/builds/win32/msvc10/codes.vcxproj firebird/trunk/builds/win32/msvc10/codes.vcxproj.filters firebird/trunk/builds/win32/msvc10/common.vcxproj firebird/trunk/builds/win32/msvc10/common.vcxproj.filters firebird/trunk/builds/win32/msvc10/common_classic.vcxproj firebird/trunk/builds/win32/msvc10/common_classic.vcxproj.filters firebird/trunk/builds/win32/msvc10/common_static.vcxproj firebird/trunk/builds/win32/msvc10/common_static.vcxproj.filters firebird/trunk/builds/win32/msvc10/config.vcxproj firebird/trunk/builds/win32/msvc10/config.vcxproj.filters firebird/trunk/builds/win32/msvc10/dsql_server.vcxproj firebird/trunk/builds/win32/msvc10/dsql_server.vcxproj.filters firebird/trunk/builds/win32/msvc10/dsql_server_classic.vcxproj firebird/trunk/builds/win32/msvc10/dsql_server_classic.vcxproj.filters firebird/trunk/builds/win32/msvc10/empbuild.vcxproj firebird/trunk/builds/win32/msvc10/empbuild.vcxproj.filters firebird/trunk/builds/win32/msvc10/engine.vcxproj firebird/trunk/builds/win32/msvc10/engine.vcxproj.filters firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj.filters firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj.filters firebird/trunk/builds/win32/msvc10/fb2control.vcxproj firebird/trunk/builds/win32/msvc10/fb2control.vcxproj.filters firebird/trunk/builds/win32/msvc10/fb_inet_server.vcxproj firebird/trunk/builds/win32/msvc10/fb_inet_server.vcxproj.filters firebird/trunk/builds/win32/msvc10/fb_lock_print.vcxproj firebird/trunk/builds/win32/msvc10/fb_lock_print.vcxproj.filters firebird/trunk/builds/win32/msvc10/fbclient.vcxproj firebird/trunk/builds/win32/msvc10/fbclient.vcxproj.filters firebird/trunk/builds/win32/msvc10/fbembed.vcxproj firebird/trunk/builds/win32/msvc10/fbembed.vcxproj.filters firebird/trunk/builds/win32/msvc10/fbguard.vcxproj firebird/trunk/builds/win32/msvc10/fbguard.vcxproj.filters firebird/trunk/builds/win32/msvc10/fbrmclib.vcxproj firebird/trunk/builds/win32/msvc10/fbrmclib.vcxproj.filters firebird/trunk/builds/win32/msvc10/fbserver.vcxproj firebird/trunk/builds/win32/msvc10/fbserver.vcxproj.filters firebird/trunk/builds/win32/msvc10/fbsvcmgr.vcxproj firebird/trunk/builds/win32/msvc10/fbsvcmgr.vcxproj.filters firebird/trunk/builds/win32/msvc10/fbtrace.vcxproj firebird/trunk/builds/win32/msvc10/fbtrace.vcxproj.filters firebird/trunk/builds/win32/msvc10/fbtracemgr.vcxproj firebird/trunk/builds/win32/msvc10/fbtracemgr.vcxproj.filters firebird/trunk/builds/win32/msvc10/fbudf.vcxproj firebird/trunk/builds/win32/msvc10/fbudf.vcxproj.filters firebird/trunk/builds/win32/msvc10/firebird2.props firebird/trunk/builds/win32/msvc10/firebird2debug.props firebird/trunk/builds/win32/msvc10/firebird2release.props firebird/trunk/builds/win32/msvc10/gbak.vcxproj firebird/trunk/builds/win32/msvc10/gbak.vcxproj.filters firebird/trunk/builds/win32/msvc10/gbak_embed.vcxproj firebird/trunk/builds/win32/msvc10/gbak_embed.vcxproj.filters firebird/trunk/builds/win32/msvc10/gfix.vcxproj firebird/trunk/builds/win32/msvc10/gfix.vcxproj.filters firebird/trunk/builds/win32/msvc10/gpre.vcxproj firebird/trunk/builds/win32/msvc10/gpre.vcxproj.filters firebird/trunk/builds/win32/msvc10/gpre_boot.vcxproj firebird/trunk/builds/win32/msvc10/gpre_boot.vcxproj.filters firebird/trunk/builds/win32/msvc10/gpre_embed.vcxproj firebird/trunk/builds/win32/msvc10/gpre_embed.vcxproj.filters firebird/trunk/builds/win32/msvc10/gsec.vcxproj firebird/trunk/builds/win32/msvc10/gsec.vcxproj.filters firebird/trunk/builds/win32/msvc10/gsplit.vcxproj firebird/trunk/builds/win32/msvc10/gsplit.vcxproj.filters firebird/trunk/builds/win32/msvc10/gstat.vcxproj firebird/trunk/builds/win32/msvc10/gstat.vcxproj.filters firebird/trunk/builds/win32/msvc10/ib_udf.vcxproj firebird/trunk/builds/win32/msvc10/ib_udf.vcxproj.filters firebird/trunk/builds/win32/msvc10/ib_util.vcxproj firebird/trunk/builds/win32/msvc10/ib_util.vcxproj.filters firebird/trunk/builds/win32/msvc10/instclient.vcxproj firebird/trunk/builds/win32/msvc10/instclient.vcxproj.filters firebird/trunk/builds/win32/msvc10/instreg.vcxproj firebird/trunk/builds/win32/msvc10/instreg.vcxproj.filters firebird/trunk/builds/win32/msvc10/instsvc.vcxproj firebird/trunk/builds/win32/msvc10/instsvc.vcxproj.filters firebird/trunk/builds/win32/msvc10/intl.vcxproj firebird/trunk/builds/win32/msvc10/intl.vcxproj.filters firebird/trunk/builds/win32/msvc10/intlbuild.vcxproj firebird/trunk/builds/win32/msvc10/intlbuild.vcxproj.filters firebird/trunk/builds/win32/msvc10/isql.vcxproj firebird/trunk/builds/win32/msvc10/isql.vcxproj.filters firebird/trunk/builds/win32/msvc10/isql_embed.vcxproj firebird/trunk/builds/win32/msvc10/isql_embed.vcxproj.filters firebird/trunk/builds/win32/msvc10/lock.vcxproj firebird/trunk/builds/win32/msvc10/lock.vcxproj.filters firebird/trunk/builds/win32/msvc10/lock_classic.vcxproj firebird/trunk/builds/win32/msvc10/lock_classic.vcxproj.filters firebird/trunk/builds/win32/msvc10/nbackup.vcxproj firebird/trunk/builds/win32/msvc10/nbackup.vcxproj.filters firebird/trunk/builds/win32/msvc10/qli.vcxproj firebird/trunk/builds/win32/msvc10/qli.vcxproj.filters firebird/trunk/builds/win32/msvc10/remote.vcxproj firebird/trunk/builds/win32/msvc10/remote.vcxproj.filters firebird/trunk/builds/win32/msvc10/udr_engine.vcxproj firebird/trunk/builds/win32/msvc10/udr_engine.vcxproj.filters firebird/trunk/builds/win32/msvc10/udrcpp_example.vcxproj firebird/trunk/builds/win32/msvc10/udrcpp_example.vcxproj.filters firebird/trunk/extern/icu/source/allinone/allinone_10.sln firebird/trunk/extern/icu/source/allinone/firebird2debug.props firebird/trunk/extern/icu/source/allinone/firebird2intl.props firebird/trunk/extern/icu/source/allinone/firebird2release.props firebird/trunk/extern/icu/source/common/common_10.vcxproj firebird/trunk/extern/icu/source/common/common_10.vcxproj.filters firebird/trunk/extern/icu/source/data/makedata_10.vcxproj firebird/trunk/extern/icu/source/data/makedata_10.vcxproj.filters firebird/trunk/extern/icu/source/extra/uconv/uconv_10.vcxproj firebird/trunk/extern/icu/source/extra/uconv/uconv_10.vcxproj.filters firebird/trunk/extern/icu/source/i18n/i18n_10.vcxproj firebird/trunk/extern/icu/source/i18n/i18n_10.vcxproj.filters firebird/trunk/extern/icu/source/io/io_10.vcxproj firebird/trunk/extern/icu/source/io/io_10.vcxproj.filters firebird/trunk/extern/icu/source/layout/layout_10.vcxproj firebird/trunk/extern/icu/source/layout/layout_10.vcxproj.filters firebird/trunk/extern/icu/source/layoutex/layoutex_10.vcxproj firebird/trunk/extern/icu/source/layoutex/layoutex_10.vcxproj.filters firebird/trunk/extern/icu/source/stubdata/stubdata_10.vcxproj firebird/trunk/extern/icu/source/stubdata/stubdata_10.vcxproj.filters firebird/trunk/extern/icu/source/test/cintltst/cintltst_10.vcxproj firebird/trunk/extern/icu/source/test/cintltst/cintltst_10.vcxproj.filters firebird/trunk/extern/icu/source/test/intltest/intltest_10.vcxproj firebird/trunk/extern/icu/source/test/intltest/intltest_10.vcxproj.filters firebird/trunk/extern/icu/source/test/iotest/iotest_10.vcxproj firebird/trunk/extern/icu/source/test/iotest/iotest_10.vcxproj.filters firebird/trunk/extern/icu/source/tools/ctestfw/ctestfw_10.vcxproj firebird/trunk/extern/icu/source/tools/ctestfw/ctestfw_10.vcxproj.filters firebird/trunk/extern/icu/source/tools/genbrk/genbrk_10.vcxproj firebird/trunk/extern/icu/source/tools/genbrk/genbrk_10.vcxproj.filters firebird/trunk/extern/icu/source/tools/genccode/genccode_10.vcxproj firebird/trunk/extern/icu/source/tools/genccode/genccode_10.vcxproj.filters firebird/trunk/extern/icu/source/tools/gencmn/decmn_10.vcxproj firebird/trunk/extern/icu/source/tools/gencmn/decmn_10.vcxproj.filters firebird/trunk/extern/icu/source/tools/gencmn/gencmn_10.vcxproj firebird/trunk/extern/icu/source/tools/gencmn/gencmn_10.vcxproj.filters firebird/trunk/extern/icu/source/tools/gencnval/gencnval_10.vcxproj firebird/trunk/extern/icu/source/tools/gencnval/gencnval_10.vcxproj.filters firebird/trunk/extern/icu/source/tools/gennames/gennames_10.vcxproj firebird/trunk/extern/icu/source/tools/gennames/gennames_10.vcxproj.filters firebird/trunk/extern/icu/source/tools/gennorm/gennorm_10.vcxproj firebird/trunk/extern/icu/source/tools/gennorm/gennorm_10.vcxproj.filters firebird/trunk/extern/icu/source/tools/genpname/genpname_10.vcxproj firebird/trunk/extern/icu/source/tools/genpname/genpname_10.vcxproj.filters firebird/trunk/extern/icu/source/tools/genprops/genprops_10.vcxproj firebird/trunk/extern/icu/source/tools/genprops/genprops_10.vcxproj.filters firebird/trunk/extern/icu/source/tools/genrb/derb_10.vcxproj firebird/trunk/extern/icu/source/tools/genrb/derb_10.vcxproj.filters firebird/trunk/extern/icu/source/tools/genrb/genrb_10.vcxproj firebird/trunk/extern/icu/source/tools/genrb/genrb_10.vcxproj.filters firebird/trunk/extern/icu/source/tools/gensprep/gensprep_10.vcxproj firebird/trunk/extern/icu/source/tools/gensprep/gensprep_10.vcxproj.filters firebird/trunk/extern/icu/source/tools/gentest/gentest_10.vcxproj firebird/trunk/extern/icu/source/tools/gentest/gentest_10.vcxproj.filters firebird/trunk/extern/icu/source/tools/genuca/genuca_10.vcxproj firebird/trunk/extern/icu/source/tools/genuca/genuca_10.vcxproj.filters firebird/trunk/extern/icu/source/tools/icuswap/icuswap_10.vcxproj firebird/trunk/extern/icu/source/tools/icuswap/icuswap_10.vcxproj.filters firebird/trunk/extern/icu/source/tools/makeconv/makeconv_10.vcxproj firebird/trunk/extern/icu/source/tools/makeconv/makeconv_10.vcxproj.filters firebird/trunk/extern/icu/source/tools/pkgdata/pkgdata_10.vcxproj firebird/trunk/extern/icu/source/tools/pkgdata/pkgdata_10.vcxproj.filters firebird/trunk/extern/icu/source/tools/toolutil/toolutil_10.vcxproj firebird/trunk/extern/icu/source/tools/toolutil/toolutil_10.vcxproj.filters Added: firebird/trunk/builds/win32/msvc10/DllNoEmbedManifest.props =================================================================== --- firebird/trunk/builds/win32/msvc10/DllNoEmbedManifest.props (rev 0) +++ firebird/trunk/builds/win32/msvc10/DllNoEmbedManifest.props 2010-06-27 03:47:40 UTC (rev 51295) @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> + <GenerateManifest>false</GenerateManifest> + </PropertyGroup> +</Project> \ No newline at end of file Property changes on: firebird/trunk/builds/win32/msvc10/DllNoEmbedManifest.props ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: firebird/trunk/builds/win32/msvc10/Firebird2.sln =================================================================== --- firebird/trunk/builds/win32/msvc10/Firebird2.sln (rev 0) +++ firebird/trunk/builds/win32/msvc10/Firebird2.sln 2010-06-27 03:47:40 UTC (rev 51295) @@ -0,0 +1,423 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "alice", "alice.vcxproj", "{0D616380-1A5A-4230-A80B-021360E4E669}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "burp", "burp.vcxproj", "{D1507562-A363-4685-96AF-B036F5E5E47F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "common.vcxproj", "{15605F44-BFFD-444F-AD4C-55DC9D704465}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common_classic", "common_classic.vcxproj", "{F5746066-8613-4811-B27C-0ED70FF9F0FF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dsql_server", "dsql_server.vcxproj", "{520DF501-5775-44FD-BDC6-37753A17696A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dsql_server_classic", "dsql_server_classic.vcxproj", "{488199DD-D9F3-41C8-AED6-8AFFFB294CFF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "engine", "engine.vcxproj", "{F8798A49-9D20-451E-A7BD-FEB5237103B5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "engine_classic", "engine_classic.vcxproj", "{E029E4E2-0C3F-4F7D-BC4C-D9C20F40EB4E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "engine_embed", "engine_embed.vcxproj", "{F55ACA54-70DF-4343-8E16-FA97C757CCF6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fb_inet_server", "fb_inet_server.vcxproj", "{664D4A04-36E0-48EF-8BCA-D5C331EFAA24}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fb_lock_print", "fb_lock_print.vcxproj", "{E8397148-0E9C-449B-9F45-7FB377A08242}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fbclient", "fbclient.vcxproj", "{492E7BDA-8948-408D-A43E-4C0A5B86AFB8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fbembed", "fbembed.vcxproj", "{C5A60E3D-7815-4127-B856-96277BEC1D11}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fbguard", "fbguard.vcxproj", "{BBD83ED3-8A48-4FE8-B4B7-CB27730986B2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fbserver", "fbserver.vcxproj", "{23EC8DAA-6718-4EF3-979F-89F611C7D504}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fbudf", "fbudf.vcxproj", "{9DC67B05-AC3E-49A3-B0CC-83B25D757445}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gbak", "gbak.vcxproj", "{B732F5D2-B5D9-417F-B156-D790F466CB8E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gfix", "gfix.vcxproj", "{44A9E4AD-B932-4620-B319-431A153BB341}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gpre", "gpre.vcxproj", "{D84F0839-28A4-40B2-B5F4-F5E1E7F48FD0}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gsec", "gsec.vcxproj", "{7043CC61-DEC1-4C6B-86B9-0E911D1094C9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gsplit", "gsplit.vcxproj", "{B7F22B7F-9937-4874-9A8B-6AB4E36E74A5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gstat", "gstat.vcxproj", "{7E862973-37C4-4202-80E7-490ED4DEDA14}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ib_udf", "ib_udf.vcxproj", "{0D4A2D8E-6461-479E-9399-F7929174E050}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ib_util", "ib_util.vcxproj", "{EABA0FF3-1C4D-4FAB-8418-31C9061F3F0D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "instreg", "instreg.vcxproj", "{19470DE6-1975-4F9B-B1BE-E87A83240B15}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "instsvc", "instsvc.vcxproj", "{72894398-38CA-47A6-95FE-9647DE2BE968}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "intl", "intl.vcxproj", "{DFFA2117-E6A8-4806-BB69-94DAC8F8F42A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "isql", "isql.vcxproj", "{DEE75AD5-F165-40E1-80B2-400E27725D5C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lock", "lock.vcxproj", "{604E1144-1A22-43AF-9A3E-08650EE4EE90}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lock_classic", "lock_classic.vcxproj", "{213C6F21-D83F-48C7-BBB5-B35AB1B706B1}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qli", "qli.vcxproj", "{EBB8361B-49D5-43A5-8771-940DF3E308EF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "remote", "remote.vcxproj", "{4BCC693D-1745-45ED-8302-E5E2F979549A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nbackup", "nbackup.vcxproj", "{01A41DFA-8908-4576-A1F1-C8BC7EAE39A1}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "config", "config.vcxproj", "{E83187C1-AAC2-445D-B8B2-883EFC10C39A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "instclient", "instclient.vcxproj", "{C6A31374-178C-4680-A404-76BE24D0229B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fb2control", "fb2control.vcxproj", "{1AE02D41-7E24-43CC-9BCB-E4CEB6037D16}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fbrmclib", "fbrmclib.vcxproj", "{FAF9AD25-8238-49E9-9AC9-8C56E190440A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fbsvcmgr", "fbsvcmgr.vcxproj", "{EFB07DBC-36E3-4C54-B941-3CDAFAACF47B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fbtrace", "fbtrace.vcxproj", "{53F75437-15B8-4A5C-86BF-E238CC68FCBC}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fbtracemgr", "fbtracemgr.vcxproj", "{58C7E370-0EDD-4F5E-8617-3F5071170205}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "udr_engine", "udr_engine.vcxproj", "{20DEBF08-EF0A-4C94-ADEB-FE9BBA14588B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0D616380-1A5A-4230-A80B-021360E4E669}.Debug|Win32.ActiveCfg = Debug|Win32 + {0D616380-1A5A-4230-A80B-021360E4E669}.Debug|Win32.Build.0 = Debug|Win32 + {0D616380-1A5A-4230-A80B-021360E4E669}.Debug|x64.ActiveCfg = Debug|x64 + {0D616380-1A5A-4230-A80B-021360E4E669}.Debug|x64.Build.0 = Debug|x64 + {0D616380-1A5A-4230-A80B-021360E4E669}.Release|Win32.ActiveCfg = Release|Win32 + {0D616380-1A5A-4230-A80B-021360E4E669}.Release|Win32.Build.0 = Release|Win32 + {0D616380-1A5A-4230-A80B-021360E4E669}.Release|x64.ActiveCfg = Release|x64 + {0D616380-1A5A-4230-A80B-021360E4E669}.Release|x64.Build.0 = Release|x64 + {D1507562-A363-4685-96AF-B036F5E5E47F}.Debug|Win32.ActiveCfg = Debug|Win32 + {D1507562-A363-4685-96AF-B036F5E5E47F}.Debug|Win32.Build.0 = Debug|Win32 + {D1507562-A363-4685-96AF-B036F5E5E47F}.Debug|x64.ActiveCfg = Debug|x64 + {D1507562-A363-4685-96AF-B036F5E5E47F}.Debug|x64.Build.0 = Debug|x64 + {D1507562-A363-4685-96AF-B036F5E5E47F}.Release|Win32.ActiveCfg = Release|Win32 + {D1507562-A363-4685-96AF-B036F5E5E47F}.Release|Win32.Build.0 = Release|Win32 + {D1507562-A363-4685-96AF-B036F5E5E47F}.Release|x64.ActiveCfg = Release|x64 + {D1507562-A363-4685-96AF-B036F5E5E47F}.Release|x64.Build.0 = Release|x64 + {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|x64 + {15605F44-BFFD-444F-AD4C-55DC9D704465}.Debug|x64.Build.0 = Debug|x64 + {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|x64 + {15605F44-BFFD-444F-AD4C-55DC9D704465}.Release|x64.Build.0 = Release|x64 + {F5746066-8613-4811-B27C-0ED70FF9F0FF}.Debug|Win32.ActiveCfg = Debug|Win32 + {F5746066-8613-4811-B27C-0ED70FF9F0FF}.Debug|Win32.Build.0 = Debug|Win32 + {F5746066-8613-4811-B27C-0ED70FF9F0FF}.Debug|x64.ActiveCfg = Debug|x64 + {F5746066-8613-4811-B27C-0ED70FF9F0FF}.Debug|x64.Build.0 = Debug|x64 + {F5746066-8613-4811-B27C-0ED70FF9F0FF}.Release|Win32.ActiveCfg = Release|Win32 + {F5746066-8613-4811-B27C-0ED70FF9F0FF}.Release|Win32.Build.0 = Release|Win32 + {F5746066-8613-4811-B27C-0ED70FF9F0FF}.Release|x64.ActiveCfg = Release|x64 + {F5746066-8613-4811-B27C-0ED70FF9F0FF}.Release|x64.Build.0 = Release|x64 + {520DF501-5775-44FD-BDC6-37753A17696A}.Debug|Win32.ActiveCfg = Debug|Win32 + {520DF501-5775-44FD-BDC6-37753A17696A}.Debug|Win32.Build.0 = Debug|Win32 + {520DF501-5775-44FD-BDC6-37753A17696A}.Debug|x64.ActiveCfg = Debug|x64 + {520DF501-5775-44FD-BDC6-37753A17696A}.Debug|x64.Build.0 = Debug|x64 + {520DF501-5775-44FD-BDC6-37753A17696A}.Release|Win32.ActiveCfg = Release|Win32 + {520DF501-5775-44FD-BDC6-37753A17696A}.Release|Win32.Build.0 = Release|Win32 + {520DF501-5775-44FD-BDC6-37753A17696A}.Release|x64.ActiveCfg = Release|x64 + {520DF501-5775-44FD-BDC6-37753A17696A}.Release|x64.Build.0 = Release|x64 + {488199DD-D9F3-41C8-AED6-8AFFFB294CFF}.Debug|Win32.ActiveCfg = Debug|Win32 + {488199DD-D9F3-41C8-AED6-8AFFFB294CFF}.Debug|Win32.Build.0 = Debug|Win32 + {488199DD-D9F3-41C8-AED6-8AFFFB294CFF}.Debug|x64.ActiveCfg = Debug|x64 + {488199DD-D9F3-41C8-AED6-8AFFFB294CFF}.Debug|x64.Build.0 = Debug|x64 + {488199DD-D9F3-41C8-AED6-8AFFFB294CFF}.Release|Win32.ActiveCfg = Release|Win32 + {488199DD-D9F3-41C8-AED6-8AFFFB294CFF}.Release|Win32.Build.0 = Release|Win32 + {488199DD-D9F3-41C8-AED6-8AFFFB294CFF}.Release|x64.ActiveCfg = Release|x64 + {488199DD-D9F3-41C8-AED6-8AFFFB294CFF}.Release|x64.Build.0 = Release|x64 + {F8798A49-9D20-451E-A7BD-FEB5237103B5}.Debug|Win32.ActiveCfg = Debug|Win32 + {F8798A49-9D20-451E-A7BD-FEB5237103B5}.Debug|Win32.Build.0 = Debug|Win32 + {F8798A49-9D20-451E-A7BD-FEB5237103B5}.Debug|x64.ActiveCfg = Debug|x64 + {F8798A49-9D20-451E-A7BD-FEB5237103B5}.Debug|x64.Build.0 = Debug|x64 + {F8798A49-9D20-451E-A7BD-FEB5237103B5}.Release|Win32.ActiveCfg = Release|Win32 + {F8798A49-9D20-451E-A7BD-FEB5237103B5}.Release|Win32.Build.0 = Release|Win32 + {F8798A49-9D20-451E-A7BD-FEB5237103B5}.Release|x64.ActiveCfg = Release|x64 + {F8798A49-9D20-451E-A7BD-FEB5237103B5}.Release|x64.Build.0 = Release|x64 + {E029E4E2-0C3F-4F7D-BC4C-D9C20F40EB4E}.Debug|Win32.ActiveCfg = Debug|Win32 + {E029E4E2-0C3F-4F7D-BC4C-D9C20F40EB4E}.Debug|Win32.Build.0 = Debug|Win32 + {E029E4E2-0C3F-4F7D-BC4C-D9C20F40EB4E}.Debug|x64.ActiveCfg = Debug|x64 + {E029E4E2-0C3F-4F7D-BC4C-D9C20F40EB4E}.Debug|x64.Build.0 = Debug|x64 + {E029E4E2-0C3F-4F7D-BC4C-D9C20F40EB4E}.Release|Win32.ActiveCfg = Release|Win32 + {E029E4E2-0C3F-4F7D-BC4C-D9C20F40EB4E}.Release|Win32.Build.0 = Release|Win32 + {E029E4E2-0C3F-4F7D-BC4C-D9C20F40EB4E}.Release|x64.ActiveCfg = Release|x64 + {E029E4E2-0C3F-4F7D-BC4C-D9C20F40EB4E}.Release|x64.Build.0 = Release|x64 + {F55ACA54-70DF-4343-8E16-FA97C757CCF6}.Debug|Win32.ActiveCfg = Debug|Win32 + {F55ACA54-70DF-4343-8E16-FA97C757CCF6}.Debug|Win32.Build.0 = Debug|Win32 + {F55ACA54-70DF-4343-8E16-FA97C757CCF6}.Debug|x64.ActiveCfg = Debug|x64 + {F55ACA54-70DF-4343-8E16-FA97C757CCF6}.Debug|x64.Build.0 = Debug|x64 + {F55ACA54-70DF-4343-8E16-FA97C757CCF6}.Release|Win32.ActiveCfg = Release|Win32 + {F55ACA54-70DF-4343-8E16-FA97C757CCF6}.Release|Win32.Build.0 = Release|Win32 + {F55ACA54-70DF-4343-8E16-FA97C757CCF6}.Release|x64.ActiveCfg = Release|x64 + {F55ACA54-70DF-4343-8E16-FA97C757CCF6}.Release|x64.Build.0 = Release|x64 + {664D4A04-36E0-48EF-8BCA-D5C331EFAA24}.Debug|Win32.ActiveCfg = Debug|Win32 + {664D4A04-36E0-48EF-8BCA-D5C331EFAA24}.Debug|Win32.Build.0 = Debug|Win32 + {664D4A04-36E0-48EF-8BCA-D5C331EFAA24}.Debug|x64.ActiveCfg = Debug|x64 + {664D4A04-36E0-48EF-8BCA-D5C331EFAA24}.Debug|x64.Build.0 = Debug|x64 + {664D4A04-36E0-48EF-8BCA-D5C331EFAA24}.Release|Win32.ActiveCfg = Release|Win32 + {664D4A04-36E0-48EF-8BCA-D5C331EFAA24}.Release|Win32.Build.0 = Release|Win32 + {664D4A04-36E0-48EF-8BCA-D5C331EFAA24}.Release|x64.ActiveCfg = Release|x64 + {664D4A04-36E0-48EF-8BCA-D5C331EFAA24}.Release|x64.Build.0 = Release|x64 + {E8397148-0E9C-449B-9F45-7FB377A08242}.Debug|Win32.ActiveCfg = Debug|Win32 + {E8397148-0E9C-449B-9F45-7FB377A08242}.Debug|Win32.Build.0 = Debug|Win32 + {E8397148-0E9C-449B-9F45-7FB377A08242}.Debug|x64.ActiveCfg = Debug|x64 + {E8397148-0E9C-449B-9F45-7FB377A08242}.Debug|x64.Build.0 = Debug|x64 + {E8397148-0E9C-449B-9F45-7FB377A08242}.Release|Win32.ActiveCfg = Release|Win32 + {E8397148-0E9C-449B-9F45-7FB377A08242}.Release|Win32.Build.0 = Release|Win32 + {E8397148-0E9C-449B-9F45-7FB377A08242}.Release|x64.ActiveCfg = Release|x64 + {E8397148-0E9C-449B-9F45-7FB377A08242}.Release|x64.Build.0 = Release|x64 + {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}.Debug|Win32.ActiveCfg = Debug|Win32 + {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}.Debug|Win32.Build.0 = Debug|Win32 + {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}.Debug|x64.ActiveCfg = Debug|x64 + {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}.Debug|x64.Build.0 = Debug|x64 + {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}.Release|Win32.ActiveCfg = Release|Win32 + {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}.Release|Win32.Build.0 = Release|Win32 + {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}.Release|x64.ActiveCfg = Release|x64 + {492E7BDA-8948-408D-A43E-4C0A5B86AFB8}.Release|x64.Build.0 = Release|x64 + {C5A60E3D-7815-4127-B856-96277BEC1D11}.Debug|Win32.ActiveCfg = Debug|Win32 + {C5A60E3D-7815-4127-B856-96277BEC1D11}.Debug|Win32.Build.0 = Debug|Win32 + {C5A60E3D-7815-4127-B856-96277BEC1D11}.Debug|x64.ActiveCfg = Debug|x64 + {C5A60E3D-7815-4127-B856-96277BEC1D11}.Debug|x64.Build.0 = Debug|x64 + {C5A60E3D-7815-4127-B856-96277BEC1D11}.Release|Win32.ActiveCfg = Release|Win32 + {C5A60E3D-7815-4127-B856-96277BEC1D11}.Release|Win32.Build.0 = Release|Win32 + {C5A60E3D-7815-4127-B856-96277BEC1D11}.Release|x64.ActiveCfg = Release|x64 + {C5A60E3D-7815-4127-B856-96277BEC1D11}.Release|x64.Build.0 = Release|x64 + {BBD83ED3-8A48-4FE8-B4B7-CB27730986B2}.Debug|Win32.ActiveCfg = Debug|Win32 + {BBD83ED3-8A48-4FE8-B4B7-CB27730986B2}.Debug|Win32.Build.0 = Debug|Win32 + {BBD83ED3-8A48-4FE8-B4B7-CB27730986B2}.Debug|x64.ActiveCfg = Debug|x64 + {BBD83ED3-8A48-4FE8-B4B7-CB27730986B2}.Debug|x64.Build.0 = Debug|x64 + {BBD83ED3-8A48-4FE8-B4B7-CB27730986B2}.Release|Win32.ActiveCfg = Release|Win32 + {BBD83ED3-8A48-4FE8-B4B7-CB27730986B2}.Release|Win32.Build.0 = Release|Win32 + {BBD83ED3-8A48-4FE8-B4B7-CB27730986B2}.Release|x64.ActiveCfg = Release|x64 + {BBD83ED3-8A48-4FE8-B4B7-CB27730986B2}.Release|x64.Build.0 = Release|x64 + {23EC8DAA-6718-4EF3-979F-89F611C7D504}.Debug|Win32.ActiveCfg = Debug|Win32 + {23EC8DAA-6718-4EF3-979F-89F611C7D504}.Debug|Win32.Build.0 = Debug|Win32 + {23EC8DAA-6718-4EF3-979F-89F611C7D504}.Debug|x64.ActiveCfg = Debug|x64 + {23EC8DAA-6718-4EF3-979F-89F611C7D504}.Debug|x64.Build.0 = Debug|x64 + {23EC8DAA-6718-4EF3-979F-89F611C7D504}.Release|Win32.ActiveCfg = Release|Win32 + {23EC8DAA-6718-4EF3-979F-89F611C7D504}.Release|Win32.Build.0 = Release|Win32 + {23EC8DAA-6718-4EF3-979F-89F611C7D504}.Release|x64.ActiveCfg = Release|x64 + {23EC8DAA-6718-4EF3-979F-89F611C7D504}.Release|x64.Build.0 = Release|x64 + {9DC67B05-AC3E-49A3-B0CC-83B25D757445}.Debug|Win32.ActiveCfg = Debug|Win32 + {9DC67B05-AC3E-49A3-B0CC-83B25D757445}.Debug|Win32.Build.0 = Debug|Win32 + {9DC67B05-AC3E-49A3-B0CC-83B25D757445}.Debug|x64.ActiveCfg = Debug|x64 + {9DC67B05-AC3E-49A3-B0CC-83B25D757445}.Debug|x64.Build.0 = Debug|x64 + {9DC67B05-AC3E-49A3-B0CC-83B25D757445}.Release|Win32.ActiveCfg = Release|Win32 + {9DC67B05-AC3E-49A3-B0CC-83B25D757445}.Release|Win32.Build.0 = Release|Win32 + {9DC67B05-AC3E-49A3-B0CC-83B25D757445}.Release|x64.ActiveCfg = Release|x64 + {9DC67B05-AC3E-49A3-B0CC-83B25D757445}.Release|x64.Build.0 = Release|x64 + {B732F5D2-B5D9-417F-B156-D790F466CB8E}.Debug|Win32.ActiveCfg = Debug|Win32 + {B732F5D2-B5D9-417F-B156-D790F466CB8E}.Debug|Win32.Build.0 = Debug|Win32 + {B732F5D2-B5D9-417F-B156-D790F466CB8E}.Debug|x64.ActiveCfg = Debug|x64 + {B732F5D2-B5D9-417F-B156-D790F466CB8E}.Debug|x64.Build.0 = Debug|x64 + {B732F5D2-B5D9-417F-B156-D790F466CB8E}.Release|Win32.ActiveCfg = Release|Win32 + {B732F5D2-B5D9-417F-B156-D790F466CB8E}.Release|Win32.Build.0 = Release|Win32 + {B732F5D2-B5D9-417F-B156-D790F466CB8E}.Release|x64.ActiveCfg = Release|x64 + {B732F5D2-B5D9-417F-B156-D790F466CB8E}.Release|x64.Build.0 = Release|x64 + {44A9E4AD-B932-4620-B319-431A153BB341}.Debug|Win32.ActiveCfg = Debug|Win32 + {44A9E4AD-B932-4620-B319-431A153BB341}.Debug|Win32.Build.0 = Debug|Win32 + {44A9E4AD-B932-4620-B319-431A153BB341}.Debug|x64.ActiveCfg = Debug|x64 + {44A9E4AD-B932-4620-B319-431A153BB341}.Debug|x64.Build.0 = Debug|x64 + {44A9E4AD-B932-4620-B319-431A153BB341}.Release|Win32.ActiveCfg = Release|Win32 + {44A9E4AD-B932-4620-B319-431A153BB341}.Release|Win32.Build.0 = Release|Win32 + {44A9E4AD-B932-4620-B319-431A153BB341}.Release|x64.ActiveCfg = Release|x64 + {44A9E4AD-B932-4620-B319-431A153BB341}.Release|x64.Build.0 = Release|x64 + {D84F0839-28A4-40B2-B5F4-F5E1E7F48FD0}.Debug|Win32.ActiveCfg = Debug|Win32 + {D84F0839-28A4-40B2-B5F4-F5E1E7F48FD0}.Debug|Win32.Build.0 = Debug|Win32 + {D84F0839-28A4-40B2-B5F4-F5E1E7F48FD0}.Debug|x64.ActiveCfg = Debug|x64 + {D84F0839-28A4-40B2-B5F4-F5E1E7F48FD0}.Debug|x64.Build.0 = Debug|x64 + {D84F0839-28A4-40B2-B5F4-F5E1E7F48FD0}.Release|Win32.ActiveCfg = Release|Win32 + {D84F08... [truncated message content] |
From: <asf...@us...> - 2010-07-06 00:49:41
|
Revision: 51312 http://firebird.svn.sourceforge.net/firebird/?rev=51312&view=rev Author: asfernandes Date: 2010-07-06 00:49:33 +0000 (Tue, 06 Jul 2010) Log Message: ----------- Refactor CREATE/ALTER/DROP DOMAIN Modified Paths: -------------- firebird/trunk/builds/win32/msvc10/common.vcxproj firebird/trunk/builds/win32/msvc10/common_classic.vcxproj firebird/trunk/builds/win32/msvc10/common_static.vcxproj firebird/trunk/builds/win32/msvc8/common.vcproj firebird/trunk/builds/win32/msvc8/common_classic.vcproj firebird/trunk/builds/win32/msvc8/common_static.vcproj firebird/trunk/builds/win32/msvc9/common.vcproj firebird/trunk/builds/win32/msvc9/common_classic.vcproj firebird/trunk/builds/win32/msvc9/common_static.vcproj firebird/trunk/src/dsql/BlrWriter.h firebird/trunk/src/dsql/DdlNodes.epp firebird/trunk/src/dsql/DdlNodes.h firebird/trunk/src/dsql/Nodes.h firebird/trunk/src/dsql/Parser.h firebird/trunk/src/dsql/ddl.cpp firebird/trunk/src/dsql/dsql.h firebird/trunk/src/dsql/node.h firebird/trunk/src/dsql/parse.y firebird/trunk/src/dsql/pass1.cpp firebird/trunk/src/jrd/Attachment.cpp firebird/trunk/src/jrd/Attachment.h firebird/trunk/src/jrd/drq.h firebird/trunk/src/jrd/dyn.epp firebird/trunk/src/jrd/dyn_def.epp firebird/trunk/src/jrd/dyn_del.epp firebird/trunk/src/jrd/dyn_df_proto.h firebird/trunk/src/jrd/dyn_dl_proto.h firebird/trunk/src/jrd/dyn_md_proto.h firebird/trunk/src/jrd/dyn_mod.epp firebird/trunk/src/jrd/ini.epp Added Paths: ----------- firebird/trunk/src/common/classes/ByteChunk.h Modified: firebird/trunk/builds/win32/msvc10/common.vcxproj =================================================================== --- firebird/trunk/builds/win32/msvc10/common.vcxproj 2010-07-05 18:37:35 UTC (rev 51311) +++ firebird/trunk/builds/win32/msvc10/common.vcxproj 2010-07-06 00:49:33 UTC (rev 51312) @@ -181,6 +181,7 @@ <ClInclude Include="..\..\..\src\common\classes\alloc.h" /> <ClInclude Include="..\..\..\src\common\classes\array.h" /> <ClInclude Include="..\..\..\src\common\classes\BaseStream.h" /> + <ClInclude Include="..\..\..\src\common\classes\ByteChunk.h" /> <ClInclude Include="..\..\..\src\common\classes\ClumpletReader.h" /> <ClInclude Include="..\..\..\src\common\classes\ClumpletWriter.h" /> <ClInclude Include="..\..\..\src\common\classes\condition.h" /> Modified: firebird/trunk/builds/win32/msvc10/common_classic.vcxproj =================================================================== --- firebird/trunk/builds/win32/msvc10/common_classic.vcxproj 2010-07-05 18:37:35 UTC (rev 51311) +++ firebird/trunk/builds/win32/msvc10/common_classic.vcxproj 2010-07-06 00:49:33 UTC (rev 51312) @@ -181,6 +181,7 @@ <ClInclude Include="..\..\..\src\common\classes\alloc.h" /> <ClInclude Include="..\..\..\src\common\classes\array.h" /> <ClInclude Include="..\..\..\src\common\classes\BaseStream.h" /> + <ClInclude Include="..\..\..\src\common\classes\ByteChunk.h" /> <ClInclude Include="..\..\..\src\common\classes\ClumpletReader.h" /> <ClInclude Include="..\..\..\src\common\classes\ClumpletWriter.h" /> <ClInclude Include="..\..\..\src\common\classes\condition.h" /> Modified: firebird/trunk/builds/win32/msvc10/common_static.vcxproj =================================================================== --- firebird/trunk/builds/win32/msvc10/common_static.vcxproj 2010-07-05 18:37:35 UTC (rev 51311) +++ firebird/trunk/builds/win32/msvc10/common_static.vcxproj 2010-07-06 00:49:33 UTC (rev 51312) @@ -178,6 +178,7 @@ <ClInclude Include="..\..\..\src\common\classes\alloc.h" /> <ClInclude Include="..\..\..\src\common\classes\array.h" /> <ClInclude Include="..\..\..\src\common\classes\BaseStream.h" /> + <ClInclude Include="..\..\..\src\common\classes\ByteChunk.h" /> <ClInclude Include="..\..\..\src\common\classes\ClumpletReader.h" /> <ClInclude Include="..\..\..\src\common\classes\ClumpletWriter.h" /> <ClInclude Include="..\..\..\src\common\config\config.h" /> Modified: firebird/trunk/builds/win32/msvc8/common.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc8/common.vcproj 2010-07-05 18:37:35 UTC (rev 51311) +++ firebird/trunk/builds/win32/msvc8/common.vcproj 2010-07-06 00:49:33 UTC (rev 51312) @@ -429,6 +429,10 @@ > </File> <File + RelativePath="..\..\..\src\common\classes\ByteChunk.h" + > + </File> + <File RelativePath="..\..\..\src\common\classes\ClumpletReader.h" > </File> Modified: firebird/trunk/builds/win32/msvc8/common_classic.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc8/common_classic.vcproj 2010-07-05 18:37:35 UTC (rev 51311) +++ firebird/trunk/builds/win32/msvc8/common_classic.vcproj 2010-07-06 00:49:33 UTC (rev 51312) @@ -429,6 +429,10 @@ > </File> <File + RelativePath="..\..\..\src\common\classes\ByteChunk.h" + > + </File> + <File RelativePath="..\..\..\src\common\classes\ClumpletReader.h" > </File> Modified: firebird/trunk/builds/win32/msvc8/common_static.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc8/common_static.vcproj 2010-07-05 18:37:35 UTC (rev 51311) +++ firebird/trunk/builds/win32/msvc8/common_static.vcproj 2010-07-06 00:49:33 UTC (rev 51312) @@ -410,6 +410,10 @@ > </File> <File + RelativePath="..\..\..\src\common\classes\ByteChunk.h" + > + </File> + <File RelativePath="..\..\..\src\common\classes\ClumpletReader.h" > </File> Modified: firebird/trunk/builds/win32/msvc9/common.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc9/common.vcproj 2010-07-05 18:37:35 UTC (rev 51311) +++ firebird/trunk/builds/win32/msvc9/common.vcproj 2010-07-06 00:49:33 UTC (rev 51312) @@ -430,6 +430,10 @@ > </File> <File + RelativePath="..\..\..\src\common\classes\ByteChunk.h" + > + </File> + <File RelativePath="..\..\..\src\common\classes\ClumpletReader.h" > </File> Modified: firebird/trunk/builds/win32/msvc9/common_classic.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc9/common_classic.vcproj 2010-07-05 18:37:35 UTC (rev 51311) +++ firebird/trunk/builds/win32/msvc9/common_classic.vcproj 2010-07-06 00:49:33 UTC (rev 51312) @@ -430,6 +430,10 @@ > </File> <File + RelativePath="..\..\..\src\common\classes\ByteChunk.h" + > + </File> + <File RelativePath="..\..\..\src\common\classes\ClumpletReader.h" > </File> Modified: firebird/trunk/builds/win32/msvc9/common_static.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc9/common_static.vcproj 2010-07-05 18:37:35 UTC (rev 51311) +++ firebird/trunk/builds/win32/msvc9/common_static.vcproj 2010-07-06 00:49:33 UTC (rev 51312) @@ -411,6 +411,10 @@ > </File> <File + RelativePath="..\..\..\src\common\classes\ByteChunk.h" + > + </File> + <File RelativePath="..\..\..\src\common\classes\ClumpletReader.h" > </File> Added: firebird/trunk/src/common/classes/ByteChunk.h =================================================================== --- firebird/trunk/src/common/classes/ByteChunk.h (rev 0) +++ firebird/trunk/src/common/classes/ByteChunk.h 2010-07-06 00:49:33 UTC (rev 51312) @@ -0,0 +1,55 @@ +/* + * 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) 2010 Adriano dos Santos Fernandes <adr...@gm...> + * and all contributors signed below. + * + * All Rights Reserved. + * Contributor(s): ______________________________________. + */ + +#ifndef COMMON_BYTE_CHUNK_H +#define COMMON_BYTE_CHUNK_H + +#include "../common/classes/array.h" + +namespace Firebird { + +// Wrapper for different kinds of byte buffers. +struct ByteChunk +{ + // Separate pointer/length buffer. + ByteChunk(const UCHAR* aData, size_t aLength) + : data(aData), + length(aLength) + { + } + + // Array<UCHAR> buffer. + // This constructor is intentionally not-explicit. + template <typename Storage> + ByteChunk(const Firebird::Array<UCHAR, Storage>& array) + : data(array.begin()), + length(array.getCount()) + { + } + + const UCHAR* const data; + const size_t length; +}; + +} // namespace Firebird + +#endif // COMMON_BYTE_CHUNK_H Property changes on: firebird/trunk/src/common/classes/ByteChunk.h ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Modified: firebird/trunk/src/dsql/BlrWriter.h =================================================================== --- firebird/trunk/src/dsql/BlrWriter.h 2010-07-05 18:37:35 UTC (rev 51311) +++ firebird/trunk/src/dsql/BlrWriter.h 2010-07-06 00:49:33 UTC (rev 51312) @@ -132,8 +132,9 @@ ULONG getBaseOffset() const { return baseOffset; } void setBaseOffset(ULONG value) { baseOffset = value; } + virtual bool isVersion4() = 0; + protected: - virtual bool isVersion4() = 0; virtual bool isDdlDyn() = 0; private: Modified: firebird/trunk/src/dsql/DdlNodes.epp =================================================================== --- firebird/trunk/src/dsql/DdlNodes.epp 2010-07-05 18:37:35 UTC (rev 51311) +++ firebird/trunk/src/dsql/DdlNodes.epp 2010-07-06 00:49:33 UTC (rev 51312) @@ -34,6 +34,7 @@ #include "../jrd/PreparedStatement.h" #include "../jrd/blb_proto.h" #include "../jrd/cmp_proto.h" +#include "../jrd/dsc_proto.h" #include "../jrd/dyn_dl_proto.h" #include "../jrd/dyn_ut_proto.h" #include "../jrd/exe_proto.h" @@ -82,7 +83,89 @@ status_exception::raise(newVector); } +// Update RDB$FIELDS received by reference. +static void updateRdbFields(const TypeClause& type, + SSHORT& fieldType, + SSHORT& fieldLength, + SSHORT& fieldSubTypeNull, SSHORT& fieldSubType, + SSHORT& fieldScaleNull, SSHORT& fieldScale, + SSHORT& characterSetIdNull, SSHORT& characterSetId, + SSHORT& characterLengthNull, SSHORT& characterLength, + SSHORT& fieldPrecisionNull, SSHORT& fieldPrecision, + SSHORT& collationIdNull, SSHORT& collationId, + SSHORT& segmentLengthNull, SSHORT& segmentLength) +{ + // Initialize all nullable fields. + fieldSubTypeNull = fieldScaleNull = characterSetIdNull = characterLengthNull = + fieldPrecisionNull = collationIdNull = segmentLengthNull = TRUE; + if (type.type == dtype_blob) + { + fieldSubTypeNull = FALSE; + fieldSubType = type.subType; + + fieldScaleNull = FALSE; + fieldScale = 0; + + if (type.subType == isc_blob_text) + { + characterSetIdNull = FALSE; + characterSetId = type.charSetId; + + collationIdNull = !type.collateSpecified; + collationId = type.collationId; + } + + if (type.segLength != 0) + { + segmentLengthNull = FALSE; + segmentLength = type.segLength; + } + } + else if (type.type <= dtype_any_text) + { + fieldSubTypeNull = FALSE; + fieldSubType = type.subType; + + fieldScaleNull = FALSE; + fieldScale = 0; + + characterLengthNull = FALSE; + characterLength = type.charLength; + + characterSetIdNull = FALSE; + characterSetId = type.charSetId; + + collationIdNull = !type.collateSpecified; + collationId = type.collationId; + } + else + { + fieldScaleNull = FALSE; + fieldScale = type.scale; + + if (DTYPE_IS_EXACT(type.type)) + { + fieldPrecisionNull = FALSE; + fieldPrecision = type.precision; + + fieldSubTypeNull = FALSE; + fieldSubType = type.subType; + } + } + + if (type.type == dtype_varying) + { + fb_assert(type.length <= MAX_SSHORT); + fieldLength = (SSHORT) (type.length - sizeof(USHORT)); + } + else + fieldLength = type.length; + + fieldType = blr_dtypes[type.type]; +} + + //---------------------- @@ -225,94 +308,44 @@ } -MetaName DdlNode::storeGlobalField(thread_db* tdbb, jrd_tra* transaction, const TypeClause& parameter) +MetaName DdlNode::storeGlobalField(thread_db* tdbb, jrd_tra* transaction, const TypeClause& field, + MetaName& name) { - MetaName name; + bool endStore = false; - AutoCacheRequest requestHandle(tdbb, drq_s_fld_src, DYN_REQUESTS); - - STORE (REQUEST_HANDLE requestHandle TRANSACTION_HANDLE transaction) - FLD IN RDB$FIELDS + try { - FLD.RDB$FIELD_SUB_TYPE.NULL = TRUE; - FLD.RDB$FIELD_SCALE.NULL = TRUE; - FLD.RDB$CHARACTER_SET_ID.NULL = TRUE; - FLD.RDB$CHARACTER_LENGTH.NULL = TRUE; - FLD.RDB$FIELD_PRECISION.NULL = TRUE; - FLD.RDB$COLLATION_ID.NULL = TRUE; - FLD.RDB$SEGMENT_LENGTH.NULL = TRUE; + if (name.isEmpty()) + DYN_UTIL_generate_field_name(tdbb, NULL, name); - FLD.RDB$SYSTEM_FLAG = 0; + AutoCacheRequest requestHandle(tdbb, drq_s_fld_src, DYN_REQUESTS); - DYN_UTIL_generate_field_name(tdbb, NULL, name); - strcpy(FLD.RDB$FIELD_NAME, name.c_str()); - - if (parameter.type == dtype_blob) + STORE (REQUEST_HANDLE requestHandle TRANSACTION_HANDLE transaction) + FLD IN RDB$FIELDS { - FLD.RDB$FIELD_SUB_TYPE.NULL = FALSE; - FLD.RDB$FIELD_SUB_TYPE = parameter.subType; + FLD.RDB$SYSTEM_FLAG = 0; + strcpy(FLD.RDB$FIELD_NAME, name.c_str()); - FLD.RDB$FIELD_SCALE.NULL = FALSE; - FLD.RDB$FIELD_SCALE = 0; + updateRdbFields(field, + FLD.RDB$FIELD_TYPE, + FLD.RDB$FIELD_LENGTH, + FLD.RDB$FIELD_SUB_TYPE.NULL, FLD.RDB$FIELD_SUB_TYPE, + FLD.RDB$FIELD_SCALE.NULL, FLD.RDB$FIELD_SCALE, + FLD.RDB$CHARACTER_SET_ID.NULL, FLD.RDB$CHARACTER_SET_ID, + FLD.RDB$CHARACTER_LENGTH.NULL, FLD.RDB$CHARACTER_LENGTH, + FLD.RDB$FIELD_PRECISION.NULL, FLD.RDB$FIELD_PRECISION, + FLD.RDB$COLLATION_ID.NULL, FLD.RDB$COLLATION_ID, + FLD.RDB$SEGMENT_LENGTH.NULL, FLD.RDB$SEGMENT_LENGTH); - if (parameter.subType == isc_blob_text) - { - FLD.RDB$CHARACTER_SET_ID.NULL = FALSE; - FLD.RDB$CHARACTER_SET_ID = parameter.charSetId; - - FLD.RDB$COLLATION_ID.NULL = !parameter.collateSpecified; - FLD.RDB$COLLATION_ID = parameter.collationId; - } - - if (parameter.segLength != 0) - { - FLD.RDB$SEGMENT_LENGTH.NULL = FALSE; - FLD.RDB$SEGMENT_LENGTH = parameter.segLength; - } + endStore = true; } - else if (parameter.type <= dtype_any_text) - { - FLD.RDB$FIELD_SUB_TYPE.NULL = FALSE; - FLD.RDB$FIELD_SUB_TYPE = parameter.subType; - - FLD.RDB$FIELD_SCALE.NULL = FALSE; - FLD.RDB$FIELD_SCALE = 0; - - FLD.RDB$CHARACTER_LENGTH.NULL = FALSE; - FLD.RDB$CHARACTER_LENGTH = parameter.charLength; - - FLD.RDB$CHARACTER_SET_ID.NULL = FALSE; - FLD.RDB$CHARACTER_SET_ID = parameter.charSetId; - - FLD.RDB$COLLATION_ID.NULL = !parameter.collateSpecified; - FLD.RDB$COLLATION_ID = parameter.collationId; - } - else - { - FLD.RDB$FIELD_SCALE.NULL = FALSE; - FLD.RDB$FIELD_SCALE = parameter.scale; - - if (DTYPE_IS_EXACT(parameter.type)) - { - FLD.RDB$FIELD_PRECISION.NULL = FALSE; - FLD.RDB$FIELD_PRECISION = parameter.precision; - - FLD.RDB$FIELD_SUB_TYPE.NULL = FALSE; - FLD.RDB$FIELD_SUB_TYPE = parameter.subType; - } - } - - if (parameter.type == dtype_varying) - { - fb_assert(parameter.length <= MAX_SSHORT); - FLD.RDB$FIELD_LENGTH = (SSHORT) (parameter.length - sizeof(USHORT)); - } - else - FLD.RDB$FIELD_LENGTH = parameter.length; - - FLD.RDB$FIELD_TYPE = blr_dtypes[parameter.type]; + END_STORE } - END_STORE + catch (const status_exception& ex) + { + // STORE RDB$FIELDS failed + rethrowMetaException(ex, ENCODE_ISC_MSG(13, DYN_MSG_FAC), endStore); + } return name; } @@ -956,13 +989,11 @@ { FUN.RDB$FUNCTION_BLR.NULL = FALSE; attachment->storeBinaryBlob(tdbb, transaction, &FUN.RDB$FUNCTION_BLR, - dsqlScratch->getBlrData().begin(), - dsqlScratch->getBlrData().getCount()); + dsqlScratch->getBlrData()); FUN.RDB$DEBUG_INFO.NULL = FALSE; attachment->storeBinaryBlob(tdbb, transaction, &FUN.RDB$DEBUG_INFO, - dsqlScratch->getDebugData().begin(), - dsqlScratch->getDebugData().getCount()); + dsqlScratch->getDebugData()); } } @@ -1069,7 +1100,8 @@ strcpy(ARG.RDB$FIELD_SOURCE, parameter.typeOfName.c_str()); else { - const MetaName fieldName = storeGlobalField(tdbb, transaction, parameter); + MetaName fieldName; + storeGlobalField(tdbb, transaction, parameter, fieldName); strcpy(ARG.RDB$FIELD_SOURCE, fieldName.c_str()); } } @@ -1119,8 +1151,7 @@ dsqlScratch->appendUChar(blr_eoc); attachment->storeBinaryBlob(tdbb, transaction, &ARG.RDB$DEFAULT_VALUE, - dsqlScratch->getBlrData().begin(), - dsqlScratch->getBlrData().getCount()); + dsqlScratch->getBlrData()); } } END_STORE @@ -1756,13 +1787,11 @@ { P.RDB$PROCEDURE_BLR.NULL = FALSE; attachment->storeBinaryBlob(tdbb, transaction, &P.RDB$PROCEDURE_BLR, - dsqlScratch->getBlrData().begin(), - dsqlScratch->getBlrData().getCount()); + dsqlScratch->getBlrData()); P.RDB$DEBUG_INFO.NULL = FALSE; attachment->storeBinaryBlob(tdbb, transaction, &P.RDB$DEBUG_INFO, - dsqlScratch->getDebugData().begin(), - dsqlScratch->getDebugData().getCount()); + dsqlScratch->getDebugData()); P.RDB$PROCEDURE_TYPE.NULL = FALSE; P.RDB$PROCEDURE_TYPE = (USHORT) @@ -1874,7 +1903,8 @@ strcpy(PRM.RDB$FIELD_SOURCE, parameter.typeOfName.c_str()); else { - const MetaName fieldName = storeGlobalField(tdbb, transaction, parameter); + MetaName fieldName; + storeGlobalField(tdbb, transaction, parameter, fieldName); strcpy(PRM.RDB$FIELD_SOURCE, fieldName.c_str()); } } @@ -1921,8 +1951,7 @@ dsqlScratch->appendUChar(blr_eoc); attachment->storeBinaryBlob(tdbb, transaction, &PRM.RDB$DEFAULT_VALUE, - dsqlScratch->getBlrData().begin(), - dsqlScratch->getBlrData().getCount()); + dsqlScratch->getBlrData()); } } END_STORE @@ -2458,13 +2487,11 @@ { TRG.RDB$TRIGGER_BLR.NULL = FALSE; attachment->storeBinaryBlob(tdbb, transaction, &TRG.RDB$TRIGGER_BLR, - dsqlScratch->getBlrData().begin(), - dsqlScratch->getBlrData().getCount()); + dsqlScratch->getBlrData()); TRG.RDB$DEBUG_INFO.NULL = FALSE; attachment->storeBinaryBlob(tdbb, transaction, &TRG.RDB$DEBUG_INFO, - dsqlScratch->getDebugData().begin(), - dsqlScratch->getDebugData().getCount()); + dsqlScratch->getDebugData()); } if (source.hasData()) @@ -3105,6 +3132,1027 @@ //---------------------- +void CreateDomainNode::print(string& text, Array<dsql_nod*>& nodes) const +{ + string nameTypeStr; + nameType.print(nameTypeStr); + + text = + "CreateDomainNode\n" + " " + nameTypeStr + "\n"; +} + +void CreateDomainNode::execute(thread_db* tdbb, jrd_tra* transaction) +{ + Attachment* attachment = transaction->tra_attachment; + + if (fb_utils::implicit_domain(nameType.name.c_str())) + { + status_exception::raise( + Arg::Gds(isc_sqlerr) << Arg::Num(-637) << + Arg::Gds(isc_dsql_implicit_domain_name) << nameType.name); + } + + const dsql_nod* elements = nameType.legacyField->fld_ranges; + const USHORT dims = elements ? elements->nod_count / 2 : 0; + + if (nameType.legacyDefault && dims != 0) + { + // Default value is not allowed for array type in domain %s + status_exception::raise(Arg::Gds(isc_no_meta_update) << + Arg::Gds(ENCODE_ISC_MSG(226, DYN_MSG_FAC)) << nameType.name); + } + + if (dims > MAX_ARRAY_DIMENSIONS) + { + status_exception::raise( + Arg::Gds(isc_sqlerr) << Arg::Num(-604) << + Arg::Gds(isc_dsql_max_arr_dim_exceeded)); + } + + nameType.resolve(dsqlScratch); + + dsqlScratch->domainValue.dsc_dtype = nameType.type; + dsqlScratch->domainValue.dsc_length = nameType.length; + dsqlScratch->domainValue.dsc_scale = nameType.scale; + + // run all statements under savepoint control + AutoSavePoint savePoint(tdbb, transaction); + + executeDdlTrigger(tdbb, transaction, DTW_BEFORE, DDL_TRIGGER_CREATE_DOMAIN, nameType.name); + + storeGlobalField(tdbb, transaction, nameType, nameType.name); + + if (nameType.legacyDefault || check || notNull || dims != 0) + { + AutoCacheRequest request(tdbb, drq_m_fld, DYN_REQUESTS); + + FOR (REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + FLD IN RDB$FIELDS + WITH FLD.RDB$FIELD_NAME EQ nameType.name.c_str() + { + MODIFY FLD + if (nameType.legacyDefault) + { + dsql_str* defaultString = + (dsql_str*) nameType.legacyDefault->nod_arg[e_dft_default_source]; + string defaultSource = string(defaultString->str_data, defaultString->str_length); + + FLD.RDB$DEFAULT_SOURCE.NULL = FALSE; + attachment->storeMetaDataBlob(tdbb, transaction, &FLD.RDB$DEFAULT_SOURCE, defaultSource); + + dsqlScratch->getBlrData().clear(); + dsqlScratch->appendUChar(dsqlScratch->isVersion4() ? blr_version4 : blr_version5); + + dsql_nod* node = PASS1_node(dsqlScratch, nameType.legacyDefault->nod_arg[e_dft_default]); + + GEN_hidden_variables(dsqlScratch, true); + GEN_expr(dsqlScratch, node); + + dsqlScratch->appendUChar(blr_eoc); + + FLD.RDB$DEFAULT_VALUE.NULL = FALSE; + attachment->storeBinaryBlob(tdbb, transaction, &FLD.RDB$DEFAULT_VALUE, + dsqlScratch->getBlrData()); + } + + if (check) + { + dsql_str* checkString = (dsql_str*) check->nod_arg[e_cnstr_source]; + string checkSource = string(checkString->str_data, checkString->str_length); + + FLD.RDB$VALIDATION_SOURCE.NULL = FALSE; + attachment->storeMetaDataBlob(tdbb, transaction, &FLD.RDB$VALIDATION_SOURCE, checkSource); + + dsqlScratch->getBlrData().clear(); + dsqlScratch->appendUChar(dsqlScratch->isVersion4() ? blr_version4 : blr_version5); + + // Increment the context level for this statement, so that the context number for + // any RSE generated for a SELECT within the CHECK clause will be greater than 0. + // In the environment of a domain check constraint, context number 0 is reserved + // for the "blr_fid, 0, 0, 0," which is emitted for a nod_dom_value, corresponding + // to an occurance of the VALUE keyword in the body of the check constraint. + // -- chrisj 1999-08-20 + ++dsqlScratch->contextNumber; + + dsql_nod* node = PASS1_node(dsqlScratch, check->nod_arg[e_cnstr_condition]); + + GEN_hidden_variables(dsqlScratch, true); + GEN_expr(dsqlScratch, node); + + dsqlScratch->appendUChar(blr_eoc); + + FLD.RDB$VALIDATION_BLR.NULL = FALSE; + attachment->storeBinaryBlob(tdbb, transaction, &FLD.RDB$VALIDATION_BLR, + dsqlScratch->getBlrData()); + } + + if (notNull) + { + FLD.RDB$NULL_FLAG.NULL = FALSE; + FLD.RDB$NULL_FLAG = 1; + } + + if (dims != 0) + { + FLD.RDB$DIMENSIONS.NULL = FALSE; + FLD.RDB$DIMENSIONS = dims; + } + END_MODIFY + } + END_FOR + } + + if (elements) // Is the type an array? + { + AutoCacheRequest request(tdbb, drq_s_fld_dym, DYN_REQUESTS); + + SSHORT position = 0; + const dsql_nod* const* ptr = elements->nod_arg; + for (const dsql_nod* const* const end = ptr + elements->nod_count; ptr < end; ++ptr, ++position) + { + const dsql_nod* element = *ptr++; + const SLONG lrange = element->getSlong(); + element = *ptr; + const SLONG hrange = element->getSlong(); + + if (lrange >= hrange) + { + status_exception::raise( + Arg::Gds(isc_sqlerr) << Arg::Num(-604) << + Arg::Gds(isc_dsql_arr_range_error)); + } + + bool endStore = false; + + try + { + STORE (REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + DIM IN RDB$FIELD_DIMENSIONS + { + strcpy(DIM.RDB$FIELD_NAME, nameType.name.c_str()); + DIM.RDB$DIMENSION = position; + DIM.RDB$UPPER_BOUND = hrange; + DIM.RDB$LOWER_BOUND = lrange; + + endStore = true; + } + END_STORE + + } + catch (const status_exception& ex) + { + // STORE RDB$FIELD_DIMENSIONS failed + rethrowMetaException(ex, ENCODE_ISC_MSG(3, DYN_MSG_FAC), endStore); + } + } + } + + executeDdlTrigger(tdbb, transaction, DTW_AFTER, DDL_TRIGGER_CREATE_DOMAIN, nameType.name); + + savePoint.release(); // everything is ok +} + + +//---------------------- + + +// Compare the original field type with the new field type to determine if the original type can be +// changed to the new type. +// +// The following conversions are not allowed: +// Blob to anything +// Array to anything +// Date to anything +// Char to any numeric +// Varchar to any numeric +// Anything to Blob +// Anything to Array +// +// This function throws an exception if the conversion can not be made. +// +// ASF: We should stop using dyn_fld here as soon DYN stops to be a caller of this function. +void AlterDomainNode::checkUpdate(const dyn_fld& origFld, const dyn_fld& newFld) +{ + ULONG errorCode = FB_SUCCESS; + + // Check to make sure that the old and new types are compatible + switch (origFld.dyn_dtype) + { + // CHARACTER types + case blr_text: + case blr_varying: + case blr_cstring: + switch (newFld.dyn_dtype) + { + case blr_blob: + case blr_blob_id: + // Cannot change datatype for column %s. + // The operation cannot be performed on BLOB, or ARRAY columns. + errorCode = isc_dyn_dtype_invalid; + break; + + case blr_sql_date: + case blr_sql_time: + case blr_timestamp: + case blr_int64: + case blr_long: + case blr_short: + case blr_d_float: + case blr_double: + case blr_float: + // Cannot convert column %s from character to non-character data. + errorCode = isc_dyn_dtype_conv_invalid; + break; + + // If the original field is a character field and the new field is a character field, + // is there enough space in the new field? + case blr_text: + case blr_varying: + case blr_cstring: + { + // CVC: Because our caller invoked DSC_make_descriptor() on newFld previously, + // we should have the added bytes for varchar. For cstring, we are done, since + // DSC_make_descriptor(DSC_string_length) != DSC_string_length(DSC_make_descriptor). + + const USHORT maxflen = DSC_string_length(&origFld.dyn_dsc); + + // We can have this assertion since this case is for both string fields. + const ULONG new_len = DSC_string_length(&newFld.dyn_dsc); + fb_assert(new_len - maxflen == (ULONG) newFld.dyn_charbytelen - origFld.dyn_charbytelen); + // if (newFld.dyn_dsc.dsc_length < maxflen) + if (new_len < maxflen) + { + // msg 208: New size specified for column %s must be at least %d characters. + errorCode = isc_dyn_char_fld_too_small; + } + } + break; + + default: + fb_assert(FALSE); + errorCode = 87; // MODIFY RDB$FIELDS FAILED + break; + } + break; + + // BLOB and ARRAY types + case blr_blob: + case blr_blob_id: + // Cannot change datatype for column %s. + // The operation cannot be performed on BLOB, or ARRAY columns. + errorCode = isc_dyn_dtype_invalid; + break; + + // DATE types + case blr_sql_date: + case blr_sql_time: + case blr_timestamp: + switch (newFld.dyn_dtype) + { + case blr_sql_date: + if (origFld.dyn_dtype == blr_sql_time) + { + // Cannot change datatype for column %s. Conversion from base type %s to base type %s is not supported. + errorCode = isc_dyn_invalid_dtype_conversion; + } + break; + + case blr_sql_time: + if (origFld.dyn_dtype == blr_sql_date) + { + // Cannot change datatype for column %s. Conversion from base type %s to base type %s is not supported. + errorCode = isc_dyn_invalid_dtype_conversion; + } + break; + + case blr_timestamp: + if (origFld.dyn_dtype == blr_sql_time) + { + // Cannot change datatype for column %s. Conversion from base type %s to base type %s is not supported. + errorCode = isc_dyn_invalid_dtype_conversion; + } + break; + + // If the original field is a date field and the new field is a character field, + // is there enough space in the new field? + case blr_text: + case blr_text2: + case blr_varying: + case blr_varying2: + case blr_cstring: + case blr_cstring2: + { + const USHORT maxflen = DSC_string_length(&origFld.dyn_dsc); + + // CVC: Solve bug #910423, missing DSC_string_length call. + // if (newFld.dyn_dsc.dsc_length < maxflen) + if (DSC_string_length(&newFld.dyn_dsc) < maxflen) + { + // msg 208: New size specified for column %s must be at least %d characters. + errorCode = isc_dyn_char_fld_too_small; + } + } + + break; + + default: + // Cannot change datatype for column %s. Conversion from base type %s to base type %s is not supported. + errorCode = isc_dyn_invalid_dtype_conversion; + break; + } + break; + + // NUMERIC types + case blr_int64: + case blr_long: + case blr_short: + case blr_d_float: + case blr_double: + case blr_float: + switch (newFld.dyn_dtype) + { + case blr_blob: + case blr_blob_id: + // Cannot change datatype for column %s. + // The operation cannot be performed on BLOB, or ARRAY columns. + errorCode = isc_dyn_dtype_invalid; + break; + + case blr_sql_date: + case blr_sql_time: + case blr_timestamp: + // Cannot change datatype for column %s. Conversion from base type %s to base type %s is not supported. + errorCode = isc_dyn_invalid_dtype_conversion; + break; + + // If the original field is a numeric field and the new field is a numeric field, + // is there enough space in the new field (do not allow the base type to decrease) + + case blr_short: + switch (origFld.dyn_dtype) + { + case blr_short: + errorCode = checkUpdateNumericType(origFld, newFld); + break; + + default: + // Cannot change datatype for column %s. Conversion from base type %s to base type %s is not supported. + errorCode = isc_dyn_invalid_dtype_conversion; + ... [truncated message content] |
From: <ale...@us...> - 2010-07-09 12:51:12
|
Revision: 51322 http://firebird.svn.sourceforge.net/firebird/?rev=51322&view=rev Author: alexpeshkoff Date: 2010-07-09 12:51:05 +0000 (Fri, 09 Jul 2010) Log Message: ----------- ODS change: made RDB$USERS system table, added virtual table SEC$USERS Modified Paths: -------------- firebird/trunk/builds/posix/Makefile.in.firebird firebird/trunk/builds/posix/make.shared.variables firebird/trunk/src/dbs/security.sql firebird/trunk/src/include/gen/ids.h firebird/trunk/src/jrd/DatabaseSnapshot.cpp firebird/trunk/src/jrd/DatabaseSnapshot.h firebird/trunk/src/jrd/Relation.h firebird/trunk/src/jrd/UserManagement.cpp firebird/trunk/src/jrd/UserManagement.h firebird/trunk/src/jrd/constants.h firebird/trunk/src/jrd/fields.h firebird/trunk/src/jrd/idx.h firebird/trunk/src/jrd/ini.epp firebird/trunk/src/jrd/met.epp firebird/trunk/src/jrd/names.h firebird/trunk/src/jrd/opt.cpp firebird/trunk/src/jrd/recsrc/RecordSource.h firebird/trunk/src/jrd/relations.h firebird/trunk/src/jrd/svc.cpp firebird/trunk/src/jrd/types.h firebird/trunk/src/msgs/facilities2.sql firebird/trunk/src/msgs/messages2.sql firebird/trunk/src/utilities/gsec/gsec.cpp firebird/trunk/src/utilities/gsec/gsec.h firebird/trunk/src/utilities/gsec/gsecswi.h firebird/trunk/src/utilities/gsec/secur_proto.h firebird/trunk/src/utilities/gsec/security.epp Added Paths: ----------- firebird/trunk/src/jrd/recsrc/UsersTableScan.cpp Modified: firebird/trunk/builds/posix/Makefile.in.firebird =================================================================== --- firebird/trunk/builds/posix/Makefile.in.firebird 2010-07-09 11:33:28 UTC (rev 51321) +++ firebird/trunk/builds/posix/Makefile.in.firebird 2010-07-09 12:51:05 UTC (rev 51322) @@ -76,9 +76,7 @@ # use the static files as a last resort. # # The bootstrap version of gpre (gpre_boot) is used to build all the -# engine files, except security.bin. security.epp requires the security -# database which is not available at this time. The code in jrd/alt.cpp -# that references the functions in security.bin has been #ifdef'ed out. +# engine file. # During this phase of the build process the limited version of alt.bin # is used. The full version of alt.bin is compiled later in the build # process after the security database is available. After the Modified: firebird/trunk/builds/posix/make.shared.variables =================================================================== --- firebird/trunk/builds/posix/make.shared.variables 2010-07-09 11:33:28 UTC (rev 51321) +++ firebird/trunk/builds/posix/make.shared.variables 2010-07-09 12:51:05 UTC (rev 51322) @@ -53,7 +53,7 @@ recsrc/MergeJoin.cpp recsrc/NestedLoopJoin.cpp \ recsrc/ProcedureScan.cpp recsrc/RecordSource.cpp recsrc/RecursiveStream.cpp \ recsrc/SingularStream.cpp recsrc/SkipRowsStream.cpp recsrc/SortedStream.cpp recsrc/Union.cpp \ - recsrc/VirtualTableScan.cpp recsrc/WindowedStream.cpp + recsrc/VirtualTableScan.cpp recsrc/UsersTableScan.cpp recsrc/WindowedStream.cpp JRD_ServerSources = $(addprefix jrd/, $(JRD_ServerFiles)) JRD_ServerSources += gpre/pretty.cpp @@ -357,7 +357,7 @@ # MOD 29-July-2002 # Stub for services entrypoints missing in static library -STUB_Sources = jrd/svc_stub.cpp +STUB_Sources = jrd/svc_stub.cpp utilities/gsec/security.epp STUB_Objects = $(addprefix $(OBJ)/, $(addsuffix .o, $(basename $(STUB_Sources)))) Modified: firebird/trunk/src/dbs/security.sql =================================================================== --- firebird/trunk/src/dbs/security.sql 2010-07-09 11:33:28 UTC (rev 51321) +++ firebird/trunk/src/dbs/security.sql 2010-07-09 12:51:05 UTC (rev 51322) @@ -22,57 +22,6 @@ * (see http://www.volny.cz/iprenosil/interbase/ for details). */ -/* Domain definitions */ -CREATE DOMAIN RDB$COMMENT AS BLOB SUB_TYPE TEXT SEGMENT SIZE 80 CHARACTER SET UNICODE_FSS; -CREATE DOMAIN RDB$NAME_PART AS VARCHAR(32) CHARACTER SET UNICODE_FSS DEFAULT _UNICODE_FSS ''; -CREATE DOMAIN RDB$GID AS INTEGER; -CREATE DOMAIN RDB$PASSWD AS VARCHAR(64) CHARACTER SET BINARY; -CREATE DOMAIN RDB$UID AS INTEGER; -CREATE DOMAIN RDB$USER_NAME AS VARCHAR(128) CHARACTER SET UNICODE_FSS; -CREATE DOMAIN RDB$USER_PRIVILEGE AS INTEGER; - - -/* Table: RDB$USERS */ -CREATE TABLE RDB$USERS ( - RDB$USER_NAME RDB$USER_NAME NOT NULL PRIMARY KEY, - /* local system user name for setuid for file permissions */ - RDB$SYS_USER_NAME RDB$USER_NAME, - RDB$GROUP_NAME RDB$USER_NAME, - RDB$UID RDB$UID, - RDB$GID RDB$GID, - RDB$PASSWD RDB$PASSWD NOT NULL, - - /* Privilege level of user - mark a user as having DBA privilege */ - RDB$PRIVILEGE RDB$USER_PRIVILEGE, - - RDB$COMMENT RDB$COMMENT, - RDB$FIRST_NAME RDB$NAME_PART, - RDB$MIDDLE_NAME RDB$NAME_PART, - RDB$LAST_NAME RDB$NAME_PART); - -COMMIT; - -/* View: USERS. Let's user modify his own password. */ -CREATE VIEW USERS (USER_NAME, SYS_USER_NAME, GROUP_NAME, UID, GID, PASSWD, - PRIVILEGE, COMMENT, FIRST_NAME, MIDDLE_NAME, LAST_NAME, FULL_NAME) AS - SELECT RDB$USER_NAME, RDB$SYS_USER_NAME, RDB$GROUP_NAME, RDB$UID, RDB$GID, RDB$PASSWD, - RDB$PRIVILEGE, RDB$COMMENT, RDB$FIRST_NAME, RDB$MIDDLE_NAME, RDB$LAST_NAME, - COALESCE (RDB$first_name || _UNICODE_FSS ' ', '') || - COALESCE (RDB$middle_name || _UNICODE_FSS ' ', '') || - COALESCE (RDB$last_name, '') - FROM RDB$USERS - WHERE CURRENT_USER = 'SYSDBA' - OR CURRENT_ROLE = 'RDB$ADMIN' - OR CURRENT_USER = RDB$USERS.RDB$USER_NAME; - -/* Access rights */ -GRANT ALL ON RDB$USERS to VIEW USERS; -GRANT SELECT ON USERS to PUBLIC; -GRANT UPDATE(PASSWD, GROUP_NAME, UID, GID, FIRST_NAME, MIDDLE_NAME, LAST_NAME) - ON USERS TO PUBLIC; - -COMMIT; - /* Needed record - with PASSWD = random + SHA1 (random + 'SYSDBA' + crypt('masterke')) */ INSERT INTO RDB$USERS(RDB$USER_NAME, RDB$PASSWD, RDB$FIRST_NAME, RDB$MIDDLE_NAME, RDB$LAST_NAME) VALUES ('SYSDBA', 'NLtwcs9LrxLMOYhG0uGM9i6KS7mf3QAKvFVpmRg=', 'Sql', 'Server', 'Administrator'); Modified: firebird/trunk/src/include/gen/ids.h =================================================================== --- firebird/trunk/src/include/gen/ids.h 2010-07-09 11:33:28 UTC (rev 51321) +++ firebird/trunk/src/include/gen/ids.h 2010-07-09 12:51:05 UTC (rev 51322) @@ -592,3 +592,28 @@ const USHORT f_pkg_desc = 6; +// Relation 43 (RDB$USERS) + + const USHORT f_user_name = 0; + const USHORT f_group_name = 1; + const USHORT f_uid = 2; + const USHORT f_gid = 3; + const USHORT f_passwd_type = 4; + const USHORT f_passwd = 5; + const USHORT f_first_name = 6; + const USHORT f_middle_name = 7; + const USHORT f_last_name = 8; + const USHORT f_user_desc = 9; + + +// Relation 44 (SEC$USERS) + + const USHORT f_sec_user_name = 0; + const USHORT f_sec_group_name = 1; + const USHORT f_sec_uid = 2; + const USHORT f_sec_gid = 3; + const USHORT f_sec_first_name = 4; + const USHORT f_sec_middle_name = 5; + const USHORT f_sec_last_name = 6; + + Modified: firebird/trunk/src/jrd/DatabaseSnapshot.cpp =================================================================== --- firebird/trunk/src/jrd/DatabaseSnapshot.cpp 2010-07-09 11:33:28 UTC (rev 51321) +++ firebird/trunk/src/jrd/DatabaseSnapshot.cpp 2010-07-09 12:51:05 UTC (rev 51322) @@ -370,7 +370,7 @@ DatabaseSnapshot::DatabaseSnapshot(thread_db* tdbb, MemoryPool& pool) - : snapshot(pool), idMap(pool), idCounter(0) + : DataDump(pool), snapshot(pool) { SET_TDBB(tdbb); @@ -589,7 +589,7 @@ jrd_rel* relation = MET_lookup_relation_id(tdbb, rel_id, false); fb_assert(relation); MET_scan_relation(tdbb, relation); - fb_assert(relation->isVirtual()); + fb_assert(relation->isVirtual() && !relation->isUsers()); Format* format = MET_current(tdbb, relation); fb_assert(format); @@ -601,7 +601,7 @@ } -void DatabaseSnapshot::clearRecord(Record* record) +void DataDump::clearRecord(Record* record) { fb_assert(record); @@ -612,7 +612,7 @@ } -void DatabaseSnapshot::putField(thread_db* tdbb, Record* record, const DumpField& field, +void DataDump::putField(thread_db* tdbb, Record* record, const DumpField& field, int& charset, bool set_charset) { fb_assert(record); Modified: firebird/trunk/src/jrd/DatabaseSnapshot.h =================================================================== --- firebird/trunk/src/jrd/DatabaseSnapshot.h 2010-07-09 11:33:28 UTC (rev 51321) +++ firebird/trunk/src/jrd/DatabaseSnapshot.h 2010-07-09 12:51:05 UTC (rev 51322) @@ -18,6 +18,7 @@ * * All Rights Reserved. * Contributor(s): ______________________________________. + * Alex Peshkoff, 2010 - divided into class DataDump and the remaining part of DatabaseSnapshot */ #ifndef JRD_DATABASE_SNAPSHOT_H @@ -26,24 +27,36 @@ #include "../common/classes/array.h" #include "../common/classes/init.h" #include "../jrd/isc_s_proto.h" +#include "../common/classes/timestamp.h" +#include "../jrd/val.h" namespace Jrd { // forward declarations class jrd_rel; +class Record; class RecordBuffer; class RuntimeStatistics; -class DatabaseSnapshot +class DataDump { +public: enum ValueType {VALUE_GLOBAL_ID, VALUE_INTEGER, VALUE_TIMESTAMP, VALUE_STRING}; + DataDump(MemoryPool& pool) + : idMap(pool), idCounter(0) { } + struct DumpField { + DumpField(USHORT p_id, ValueType p_type, USHORT p_length, const void* p_data) + : id(p_id), type(p_type), length(p_length), data(p_data) { } + DumpField() + : id(0), type(VALUE_GLOBAL_ID), length(0), data(NULL) { } + USHORT id; ValueType type; USHORT length; - void* data; + const void* data; }; class DumpRecord @@ -178,6 +191,16 @@ ULONG sizeLimit; }; + void clearRecord(Record*); + void putField(thread_db*, Record*, const DumpField&, int&, bool = false); + +private: + Firebird::GenericMap<Firebird::Pair<Firebird::NonPooled<SINT64, SLONG> > > idMap; + int idCounter; +}; + +class DatabaseSnapshot : public DataDump +{ struct RelationData { int rel_id; @@ -321,8 +344,6 @@ private: RecordBuffer* allocBuffer(thread_db*, MemoryPool&, int); - void clearRecord(Record*); - void putField(thread_db*, Record*, const DumpField&, int&, bool = false); static void dumpData(thread_db*); @@ -338,8 +359,6 @@ static void putMemoryUsage(const Firebird::MemoryStats&, Writer&, int, int); Firebird::Array<RelationData> snapshot; - Firebird::GenericMap<Firebird::Pair<Firebird::NonPooled<SINT64, SLONG> > > idMap; - int idCounter; }; } // namespace Modified: firebird/trunk/src/jrd/Relation.h =================================================================== --- firebird/trunk/src/jrd/Relation.h 2010-07-09 11:33:28 UTC (rev 51321) +++ firebird/trunk/src/jrd/Relation.h 2010-07-09 12:51:05 UTC (rev 51322) @@ -176,8 +176,8 @@ { public: USHORT rel_id; - USHORT rel_flags; USHORT rel_current_fmt; // Current format number + ULONG rel_flags; Format* rel_current_format; // Current record format Firebird::MetaName rel_name; // ascii relation name vec<Format*>* rel_formats; // Known record formats @@ -219,6 +219,7 @@ bool isSystem() const; bool isTemporary() const; bool isVirtual() const; + bool isUsers() const; // global temporary relations attributes RelationPages* getPages(thread_db* tdbb, SLONG tran = -1, bool allocPages = true); @@ -282,22 +283,23 @@ // rel_flags -const USHORT REL_scanned = 0x0001; // Field expressions scanned (or being scanned) -const USHORT REL_system = 0x0002; -const USHORT REL_deleted = 0x0004; // Relation known gonzo -const USHORT REL_get_dependencies = 0x0008; // New relation needs dependencies during scan -const USHORT REL_force_scan = 0x0010; // system relation has been updated since ODS change, force a scan -const USHORT REL_check_existence = 0x0020; // Existence lock released pending drop of relation -const USHORT REL_blocking = 0x0040; // Blocking someone from dropping relation -const USHORT REL_sys_triggers = 0x0080; // The relation has system triggers to compile -const USHORT REL_sql_relation = 0x0100; // Relation defined as sql table -const USHORT REL_check_partners = 0x0200; // Rescan primary dependencies and foreign references -const USHORT REL_being_scanned = 0x0400; // relation scan in progress -const USHORT REL_sys_trigs_being_loaded = 0x0800; // System triggers being loaded -const USHORT REL_deleting = 0x1000; // relation delete in progress -const USHORT REL_temp_tran = 0x2000; // relation is a GTT delete rows -const USHORT REL_temp_conn = 0x4000; // relation is a GTT preserve rows -const USHORT REL_virtual = 0x8000; // relation is virtual +const ULONG REL_scanned = 0x0001; // Field expressions scanned (or being scanned) +const ULONG REL_system = 0x0002; +const ULONG REL_deleted = 0x0004; // Relation known gonzo +const ULONG REL_get_dependencies = 0x0008; // New relation needs dependencies during scan +const ULONG REL_force_scan = 0x0010; // system relation has been updated since ODS change, force a scan +const ULONG REL_check_existence = 0x0020; // Existence lock released pending drop of relation +const ULONG REL_blocking = 0x0040; // Blocking someone from dropping relation +const ULONG REL_sys_triggers = 0x0080; // The relation has system triggers to compile +const ULONG REL_sql_relation = 0x0100; // Relation defined as sql table +const ULONG REL_check_partners = 0x0200; // Rescan primary dependencies and foreign references +const ULONG REL_being_scanned = 0x0400; // relation scan in progress +const ULONG REL_sys_trigs_being_loaded = 0x0800; // System triggers being loaded +const ULONG REL_deleting = 0x1000; // relation delete in progress +const ULONG REL_temp_tran = 0x2000; // relation is a GTT delete rows +const ULONG REL_temp_conn = 0x4000; // relation is a GTT preserve rows +const ULONG REL_virtual = 0x8000; // relation is virtual +const ULONG REL_users = 0x00010000; // relation is users list inline bool jrd_rel::isSystem() const @@ -312,9 +314,14 @@ inline bool jrd_rel::isVirtual() const { - return (rel_flags & REL_virtual); + return (rel_flags & (REL_virtual | REL_users)); } +inline bool jrd_rel::isUsers() const +{ + return (rel_flags & REL_users); +} + inline RelationPages* jrd_rel::getPages(thread_db* tdbb, SLONG tran, bool allocPages) { if (!isTemporary()) Modified: firebird/trunk/src/jrd/UserManagement.cpp =================================================================== --- firebird/trunk/src/jrd/UserManagement.cpp 2010-07-09 11:33:28 UTC (rev 51321) +++ firebird/trunk/src/jrd/UserManagement.cpp 2010-07-09 12:51:05 UTC (rev 51322) @@ -30,31 +30,36 @@ #include "../jrd/msg_encode.h" #include "../utilities/gsec/gsec.h" #include "../utilities/gsec/secur_proto.h" +#include "../jrd/met_proto.h" +#include "../jrd/ini.h" +#include "gen/ids.h" using namespace Jrd; using namespace Firebird; UserManagement::UserManagement(jrd_tra* tra) - : database(0), transaction(0), commands(*tra->tra_pool) + : DataDump(*tra->tra_pool), database(0), transaction(0), buffer(0), + threadDbb(NULL), realUser(NULL), commands(*tra->tra_pool) { - char securityDatabaseName[MAXPATHLEN]; - Auth::SecurityDatabase::getPath(securityDatabaseName); - ISC_STATUS_ARRAY status; Attachment* att = tra->tra_attachment; - - ClumpletWriter dpb(ClumpletReader::dpbList, MAX_DPB_SIZE); - dpb.insertByte(isc_dpb_gsec_attach, TRUE); - dpb.insertString(isc_dpb_trusted_auth, att->att_user->usr_user_name); - if (att->att_user->usr_flags & USR_trole) + if (!att || !att->att_user) { - dpb.insertString(isc_dpb_trusted_role, ADMIN_ROLE, strlen(ADMIN_ROLE)); + (Arg::Gds(isc_random) << "Unknown user name for given transaction").raise(); } - else if (!att->att_user->usr_sql_role_name.empty()) + if (!att->att_user->locksmith()) { - dpb.insertString(isc_dpb_trusted_role, att->att_user->usr_sql_role_name); + realUser = att->att_user->usr_user_name.c_str(); } + char securityDatabaseName[MAXPATHLEN]; + Auth::SecurityDatabase::getPath(securityDatabaseName); + + ClumpletWriter dpb(ClumpletReader::dpbList, MAX_DPB_SIZE); + dpb.insertByte(isc_dpb_gsec_attach, TRUE); + dpb.insertString(isc_dpb_trusted_auth, SYSDBA_USER_NAME); + + ISC_STATUS_ARRAY status; if (isc_attach_database(status, 0, securityDatabaseName, &database, dpb.getBufferLength(), reinterpret_cast<const char*>(dpb.getBuffer()))) { @@ -92,6 +97,8 @@ status_exception::raise(status); } } + + delete buffer; } void UserManagement::commit() @@ -119,6 +126,25 @@ return ret; } +void UserManagement::checkSecurityResult(int errcode, ISC_STATUS* status, const char* userName) +{ + Arg::StatusVector tmp; + + if (!errcode) + { + return; + } + + tmp << Arg::Gds(ENCODE_ISC_MSG(errcode, GSEC_MSG_FAC)); + if (errcode == GsecMsg22) + { + tmp << userName; + } + tmp.append(Arg::StatusVector(&status[0])); + + tmp.raise(); +} + void UserManagement::execute(USHORT id) { if (!transaction || !commands[id]) @@ -138,30 +164,108 @@ #else ISC_STATUS_ARRAY status; int errcode = (!commands[id]->user_name_entered) ? GsecMsg18 : - SECURITY_exec_line(status, database, transaction, commands[id], NULL, NULL); + SECURITY_exec_line(status, realUser, database, transaction, commands[id], NULL, NULL); - switch (errcode) + checkSecurityResult(errcode, status, commands[id]->user_name); + + delete commands[id]; + commands[id] = NULL; +#endif +} + +void UserManagement::display(void* arg, const internal_user_data* u, bool/*firstTime*/) +{ + UserManagement* instance = reinterpret_cast<UserManagement*>(arg); + fb_assert(instance && instance->buffer); + + instance->display(u); +} + +void UserManagement::display(const internal_user_data* u) +{ + Record* record = buffer->getTempRecord(); + clearRecord(record); + + int attachment_charset = ttype_none; + + if (u->user_name_entered) + putField(threadDbb, record, + DumpField(f_sec_user_name, VALUE_STRING, strlen(u->user_name), u->user_name), + attachment_charset); + if (u->group_name_entered) + putField(threadDbb, record, + DumpField(f_sec_group_name, VALUE_STRING, strlen(u->group_name), u->group_name), + attachment_charset); + if (u->uid_entered) + putField(threadDbb, record, + DumpField(f_sec_uid, VALUE_INTEGER, sizeof(int), &u->uid), + attachment_charset); + if (u->gid_entered) + putField(threadDbb, record, + DumpField(f_sec_gid, VALUE_INTEGER, sizeof(int), &u->gid), + attachment_charset); + if (u->first_name_entered) + putField(threadDbb, record, + DumpField(f_sec_first_name, VALUE_STRING, strlen(u->first_name), u->first_name), + attachment_charset); + if (u->middle_name_entered) + putField(threadDbb, record, + DumpField(f_sec_middle_name, VALUE_STRING, strlen(u->middle_name), u->middle_name), + attachment_charset); + if (u->last_name_entered) + putField(threadDbb, record, + DumpField(f_sec_last_name, VALUE_STRING, strlen(u->last_name), u->last_name), + attachment_charset); + + buffer->store(record); +} + +RecordBuffer* UserManagement::getList(thread_db* tdbb) +{ +#ifdef EMBEDDED + // this restriction for embedded is temporarty and will gone when new build system will be introduced + status_exception::raise(Arg::Gds(isc_random) << "User management not supported in embedded library"); +#else + if (buffer) { - case 0: // nothing - break; - case GsecMsg22: - { - Arg::StatusVector tmp; - tmp << Arg::Gds(ENCODE_ISC_MSG(errcode, GSEC_MSG_FAC)) << Arg::Str(commands[id]->user_name); - tmp.append(Arg::StatusVector(&status[0])); - tmp.raise(); - } + return buffer; + } - default: + try + { + threadDbb = tdbb; + + jrd_rel* relation = MET_lookup_relation_id(threadDbb, rel_sec_users, false); + fb_assert(relation); + + MET_scan_relation(threadDbb, relation); + fb_assert(relation->isUsers()); + + Format* format = MET_current(threadDbb, relation); + fb_assert(format); + + MemoryPool* pool = threadDbb->getTransaction()->tra_pool; + fb_assert(pool); + + buffer = FB_NEW(*pool) RecordBuffer(*pool, format); + fb_assert(buffer); + + ISC_STATUS_ARRAY status; + internal_user_data u; + u.operation = DIS_OPER; + int errcode = SECURITY_exec_line(status, realUser, database, transaction, &u, display, this); + checkSecurityResult(errcode, status, u.user_name); + } + catch (const Exception&) + { + if (buffer) { - Arg::StatusVector tmp; - tmp << Arg::Gds(ENCODE_ISC_MSG(errcode, GSEC_MSG_FAC)); - tmp.append(Arg::StatusVector(&status[0])); - tmp.raise(); + delete buffer; + buffer = NULL; } + throw; } - delete commands[id]; - commands[id] = NULL; + return buffer; #endif } Modified: firebird/trunk/src/jrd/UserManagement.h =================================================================== --- firebird/trunk/src/jrd/UserManagement.h 2010-07-09 11:33:28 UTC (rev 51321) +++ firebird/trunk/src/jrd/UserManagement.h 2010-07-09 12:51:05 UTC (rev 51322) @@ -25,7 +25,9 @@ #include "firebird.h" #include "../common/classes/array.h" +#include "../common/classes/fb_string.h" #include "../jrd/ibase.h" +#include "../jrd/DatabaseSnapshot.h" struct internal_user_data; @@ -33,9 +35,10 @@ class thread_db; class jrd_tra; +class RecordBuffer; // User management argument for deferred work -class UserManagement +class UserManagement : public DataDump { public: explicit UserManagement(jrd_tra* tra); @@ -47,10 +50,19 @@ void execute(USHORT id); // commit transaction in security database void commit(); + // return users list for SEC$USERS + RecordBuffer* getList(thread_db* tdbb); private: FB_API_HANDLE database, transaction; + RecordBuffer* buffer; + thread_db* threadDbb; + const char* realUser; Firebird::HalfStaticArray<internal_user_data*, 8> commands; + + static void display(void* arg, const internal_user_data* u, bool firstTime); + void display(const internal_user_data* u); + static void checkSecurityResult(int errcode, ISC_STATUS* status, const char* userName); }; } // namespace Modified: firebird/trunk/src/jrd/constants.h =================================================================== --- firebird/trunk/src/jrd/constants.h 2010-07-09 11:33:28 UTC (rev 51321) +++ firebird/trunk/src/jrd/constants.h 2010-07-09 12:51:05 UTC (rev 51322) @@ -202,7 +202,8 @@ rel_external = 2, rel_virtual = 3, rel_global_temp_preserve = 4, - rel_global_temp_delete = 5 + rel_global_temp_delete = 5, + rel_vrt_users = 6 }; // procedure types Modified: firebird/trunk/src/jrd/fields.h =================================================================== --- firebird/trunk/src/jrd/fields.h 2010-07-09 11:33:28 UTC (rev 51321) +++ firebird/trunk/src/jrd/fields.h 2010-07-09 12:51:05 UTC (rev 51322) @@ -166,3 +166,9 @@ FIELD(fld_arg_mechanism , nam_arg_mechanism , dtype_short , sizeof(SSHORT) , 0 , NULL , true) FIELD(fld_identity_type , nam_identity_type , dtype_short , sizeof(SSHORT) , 0 , NULL , true) + + FIELD(fld_uid , nam_uid , dtype_long , sizeof(SLONG) , 0 , NULL , true) + FIELD(fld_gid , nam_gid , dtype_long , sizeof(SLONG) , 0 , NULL , true) + FIELD(fld_passwd_type , nam_passwd_type , dtype_text , 32 , dsc_text_type_ascii , NULL , true) + FIELD(fld_passwd , nam_passwd , dtype_blob , BLOB_SIZE , isc_blob_untyped , NULL , true) + FIELD(fld_name_part , nam_name_part , dtype_text , 32 , dsc_text_type_metadata , NULL , true) Modified: firebird/trunk/src/jrd/idx.h =================================================================== --- firebird/trunk/src/jrd/idx.h 2010-07-09 11:33:28 UTC (rev 51321) +++ firebird/trunk/src/jrd/idx.h 2010-07-09 12:51:05 UTC (rev 51322) @@ -345,6 +345,10 @@ SEGMENT(f_prm_procedure, idx_metadata), // procedure name SEGMENT(f_prm_name, idx_metadata), // parameter name SEGMENT(f_prm_pkg_name, idx_metadata) // package name + }}, + // define index RDB$INDEX_52 for RDB$USERS unique RDB$USER_NAME; + INDEX(52, ODS_12_0, rel_users, idx_unique, 1) + SEGMENT(f_user_name, idx_metadata) // procedure name }} // Last index in ODS 12.0 is RDB$INDEX_51 Modified: firebird/trunk/src/jrd/ini.epp =================================================================== --- firebird/trunk/src/jrd/ini.epp 2010-07-09 11:33:28 UTC (rev 51321) +++ firebird/trunk/src/jrd/ini.epp 2010-07-09 12:51:05 UTC (rev 51322) @@ -71,7 +71,7 @@ static void add_index_set(thread_db*); static void add_security_to_sys_rel(thread_db*, const Firebird::MetaName&, - const TEXT*, const UCHAR*, const SSHORT); + const TEXT*, const UCHAR*, const SSHORT, const bool); static void store_generator(thread_db*, const gen*, AutoRequest&); static void store_global_field(thread_db*, const gfld*, AutoRequest&); static void store_intlnames(thread_db*); @@ -468,10 +468,39 @@ *acl++ = ACL_end; length = acl - buffer; - add_security_to_sys_rel(tdbb, ownerName, "RDB$ROLES", buffer, length); - add_security_to_sys_rel(tdbb, ownerName, "RDB$PAGES", buffer, length); + add_security_to_sys_rel(tdbb, ownerName, "RDB$ROLES", buffer, length, true); + add_security_to_sys_rel(tdbb, ownerName, "RDB$PAGES", buffer, length, true); // DFW writes here - add_security_to_sys_rel(tdbb, ownerName, "RDB$FORMATS", buffer, length); + add_security_to_sys_rel(tdbb, ownerName, "RDB$FORMATS", buffer, length, true); + + // nobody except DBA should access it + acl = buffer; + *acl++ = ACL_version; + *acl++ = ACL_id_list; + *acl++ = id_person; + + length = ownerName.length(); + if (length > MAX_UCHAR) + length = MAX_UCHAR; + + *acl++ = (UCHAR)length; + if (length) + { + const TEXT* p_1 = ownerName.c_str(); + memcpy(acl, p_1, length); + acl += length; + } + *acl++ = ACL_end; + *acl++ = ACL_priv_list; + *acl++ = priv_protect; + *acl++ = priv_control; + *acl++ = priv_delete; + *acl++ = priv_write; + *acl++ = priv_read; + *acl++ = ACL_end; + *acl++ = ACL_end; + length = acl - buffer; + add_security_to_sys_rel(tdbb, ownerName, "RDB$USERS", buffer, length, false); } @@ -863,7 +892,8 @@ const Firebird::MetaName& user_name, const TEXT* rel_name, const UCHAR* acl, - const SSHORT acl_length) + const SSHORT acl_length, + const bool pub_select) { /************************************** * @@ -935,7 +965,7 @@ handle1.reset(); - for (int cnt = 0; cnt < 6; cnt++) + for (int cnt = 0; cnt < (pub_select ? 6 : 5); cnt++) { STORE(REQUEST_HANDLE handle1) PRIV IN RDB$USER_PRIVILEGES switch (cnt) Modified: firebird/trunk/src/jrd/met.epp =================================================================== --- firebird/trunk/src/jrd/met.epp 2010-07-09 11:33:28 UTC (rev 51321) +++ firebird/trunk/src/jrd/met.epp 2010-07-09 12:51:05 UTC (rev 51322) @@ -3607,6 +3607,9 @@ case rel_view: fb_assert(relation->rel_view_rse); break; + case rel_vrt_users: + relation->rel_flags |= REL_users; + break; case rel_virtual: relation->rel_flags |= REL_virtual; break; Modified: firebird/trunk/src/jrd/names.h =================================================================== --- firebird/trunk/src/jrd/names.h 2010-07-09 11:33:28 UTC (rev 51321) +++ firebird/trunk/src/jrd/names.h 2010-07-09 12:51:05 UTC (rev 51322) @@ -257,6 +257,18 @@ NAME("RDB$ARGUMENT_NAME", nam_arg_name) NAME("RDB$IDENTITY_TYPE", nam_identity_type) +NAME("RDB$USERS", nam_users) +NAME("RDB$USER_NAME", nam_user_name) +NAME("RDB$GROUP_NAME", nam_group_name) +NAME("RDB$UID", nam_uid) +NAME("RDB$GID", nam_gid) +NAME("RDB$PASSWD_TYPE", nam_passwd_type) +NAME("RDB$PASSWD", nam_passwd) +NAME("RDB$FIRST_NAME", nam_first_name) +NAME("RDB$MIDDLE_NAME", nam_middle_name) +NAME("RDB$LAST_NAME", nam_last_name) +NAME("RDB$NAME_PART", nam_name_part) + NAME("MON$ATTACHMENTS", nam_mon_attachments) NAME("MON$ATTACHMENT_ID", nam_mon_att_id) NAME("MON$ATTACHMENT_NAME", nam_mon_att_name) @@ -331,6 +343,7 @@ NAME("MON$TRANSACTIONS", nam_mon_transactions) NAME("MON$TRANSACTION_ID", nam_mon_tra_id) NAME("MON$USER", nam_mon_user) +NAME("SEC$USERS", nam_sec_users) NAME("MON$VARIABLE_NAME", nam_mon_var_name) NAME("MON$VARIABLE_VALUE", nam_mon_var_value) NAME("MON$PACKAGE_NAME", nam_mon_pkg_name) Modified: firebird/trunk/src/jrd/opt.cpp =================================================================== --- firebird/trunk/src/jrd/opt.cpp 2010-07-09 11:33:28 UTC (rev 51321) +++ firebird/trunk/src/jrd/opt.cpp 2010-07-09 12:51:05 UTC (rev 51322) @@ -3074,6 +3074,11 @@ // External table rsb = FB_NEW(*tdbb->getDefaultPool()) ExternalTableScan(csb, alias, stream); } + else if (relation->isUsers()) + { + // Users table + rsb = FB_NEW(*tdbb->getDefaultPool()) UsersTableScan(csb, alias, stream); + } else if (relation->isVirtual()) { // Virtual table Modified: firebird/trunk/src/jrd/recsrc/RecordSource.h =================================================================== --- firebird/trunk/src/jrd/recsrc/RecordSource.h 2010-07-09 11:33:28 UTC (rev 51321) +++ firebird/trunk/src/jrd/recsrc/RecordSource.h 2010-07-09 12:51:05 UTC (rev 51322) @@ -302,6 +302,29 @@ const Firebird::string m_name; }; + class UsersTableScan : public RecordStream + { + struct Impure : public RecordSource::Impure + { + RecordBuffer* irsb_record_buffer; + }; + + public: + UsersTableScan(CompilerScratch* csb, const Firebird::string& name, UCHAR stream); + + void open(thread_db* tdbb) const; + void close(thread_db* tdbb) const; + + bool getRecord(thread_db* tdbb) const; + bool refetchRecord(thread_db* tdbb) const; + bool lockRecord(thread_db* tdbb) const; + + void dump(thread_db* tdbb, Firebird::UCharBuffer& buffer) const; + + private: + const Firebird::string m_name; + }; + class ProcedureScan : public RecordStream { struct Impure : public RecordSource::Impure Added: firebird/trunk/src/jrd/recsrc/UsersTableScan.cpp =================================================================== --- firebird/trunk/src/jrd/recsrc/UsersTableScan.cpp (rev 0) +++ firebird/trunk/src/jrd/recsrc/UsersTableScan.cpp 2010-07-09 12:51:05 UTC (rev 51322) @@ -0,0 +1,142 @@ +/* + * 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 m... [truncated message content] |
From: <di...@us...> - 2010-07-13 12:31:43
|
Revision: 51337 http://firebird.svn.sourceforge.net/firebird/?rev=51337&view=rev Author: dimitr Date: 2010-07-13 12:31:35 +0000 (Tue, 13 Jul 2010) Log Message: ----------- Reworked the SEC$USERS implementation so that no new physical table type and data access method would be required. More changes are likely to follow soon. Modified Paths: -------------- firebird/trunk/builds/win32/msvc10/engine.vcxproj firebird/trunk/builds/win32/msvc10/engine.vcxproj.filters firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj.filters firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj.filters firebird/trunk/builds/win32/msvc9/engine.vcproj firebird/trunk/builds/win32/msvc9/engine_classic.vcproj firebird/trunk/builds/win32/msvc9/engine_embed.vcproj firebird/trunk/src/jrd/Database.h firebird/trunk/src/jrd/DatabaseSnapshot.cpp firebird/trunk/src/jrd/DatabaseSnapshot.h firebird/trunk/src/jrd/Relation.h firebird/trunk/src/jrd/UserManagement.cpp firebird/trunk/src/jrd/UserManagement.h firebird/trunk/src/jrd/constants.h firebird/trunk/src/jrd/met.epp firebird/trunk/src/jrd/opt.cpp firebird/trunk/src/jrd/recsrc/RecordSource.h firebird/trunk/src/jrd/recsrc/VirtualTableScan.cpp firebird/trunk/src/jrd/relations.h firebird/trunk/src/jrd/types.h Modified: firebird/trunk/builds/win32/msvc10/engine.vcxproj =================================================================== --- firebird/trunk/builds/win32/msvc10/engine.vcxproj 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/builds/win32/msvc10/engine.vcxproj 2010-07-13 12:31:35 UTC (rev 51337) @@ -221,7 +221,6 @@ <ClCompile Include="..\..\..\src\jrd\PreparedStatement.cpp" /> <ClCompile Include="..\..\..\src\jrd\RandomGenerator.cpp" /> <ClCompile Include="..\..\..\src\jrd\RecordBuffer.cpp" /> - <ClCompile Include="..\..\..\src\jrd\recsrc\UsersTableScan.cpp" /> <ClCompile Include="..\..\..\src\jrd\Relation.cpp" /> <ClCompile Include="..\..\..\src\jrd\ResultSet.cpp" /> <ClCompile Include="..\..\..\src\jrd\rlck.cpp" /> Modified: firebird/trunk/builds/win32/msvc10/engine.vcxproj.filters =================================================================== --- firebird/trunk/builds/win32/msvc10/engine.vcxproj.filters 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/builds/win32/msvc10/engine.vcxproj.filters 2010-07-13 12:31:35 UTC (rev 51337) @@ -423,9 +423,6 @@ <ClCompile Include="..\..\..\src\gpre\pretty.cpp"> <Filter>GPRE files</Filter> </ClCompile> - <ClCompile Include="..\..\..\src\jrd\recsrc\UsersTableScan.cpp"> - <Filter>JRD files\Data Access</Filter> - </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\..\..\src\jrd\acl.h"> Modified: firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj =================================================================== --- firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj 2010-07-13 12:31:35 UTC (rev 51337) @@ -221,7 +221,6 @@ <ClCompile Include="..\..\..\src\jrd\PreparedStatement.cpp" /> <ClCompile Include="..\..\..\src\jrd\RandomGenerator.cpp" /> <ClCompile Include="..\..\..\src\jrd\RecordBuffer.cpp" /> - <ClCompile Include="..\..\..\src\jrd\recsrc\UsersTableScan.cpp" /> <ClCompile Include="..\..\..\src\jrd\Relation.cpp" /> <ClCompile Include="..\..\..\src\jrd\ResultSet.cpp" /> <ClCompile Include="..\..\..\src\jrd\rlck.cpp" /> Modified: firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj.filters =================================================================== --- firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj.filters 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj.filters 2010-07-13 12:31:35 UTC (rev 51337) @@ -423,9 +423,6 @@ <ClCompile Include="..\..\..\src\gpre\pretty.cpp"> <Filter>GPRE files</Filter> </ClCompile> - <ClCompile Include="..\..\..\src\jrd\recsrc\UsersTableScan.cpp"> - <Filter>JRD files\Data Access</Filter> - </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\..\..\src\jrd\acl.h"> Modified: firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj =================================================================== --- firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj 2010-07-13 12:31:35 UTC (rev 51337) @@ -221,7 +221,6 @@ <ClCompile Include="..\..\..\src\jrd\PreparedStatement.cpp" /> <ClCompile Include="..\..\..\src\jrd\RandomGenerator.cpp" /> <ClCompile Include="..\..\..\src\jrd\RecordBuffer.cpp" /> - <ClCompile Include="..\..\..\src\jrd\recsrc\UsersTableScan.cpp" /> <ClCompile Include="..\..\..\src\jrd\Relation.cpp" /> <ClCompile Include="..\..\..\src\jrd\ResultSet.cpp" /> <ClCompile Include="..\..\..\src\jrd\rlck.cpp" /> Modified: firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj.filters =================================================================== --- firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj.filters 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj.filters 2010-07-13 12:31:35 UTC (rev 51337) @@ -423,9 +423,6 @@ <ClCompile Include="..\..\..\src\gpre\pretty.cpp"> <Filter>GPRE files</Filter> </ClCompile> - <ClCompile Include="..\..\..\src\jrd\recsrc\UsersTableScan.cpp"> - <Filter>JRD files\Data Access</Filter> - </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\..\..\src\jrd\acl.h"> Modified: firebird/trunk/builds/win32/msvc9/engine.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc9/engine.vcproj 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/builds/win32/msvc9/engine.vcproj 2010-07-13 12:31:35 UTC (rev 51337) @@ -807,10 +807,6 @@ > </File> <File - RelativePath="..\..\..\src\jrd\recsrc\UsersTableScan.cpp" - > - </File> - <File RelativePath="..\..\..\src\jrd\recsrc\VirtualTableScan.cpp" > </File> Modified: firebird/trunk/builds/win32/msvc9/engine_classic.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc9/engine_classic.vcproj 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/builds/win32/msvc9/engine_classic.vcproj 2010-07-13 12:31:35 UTC (rev 51337) @@ -807,14 +807,10 @@ > </File> <File - RelativePath="..\..\..\src\jrd\recsrc\UsersTableScan.cpp" + RelativePath="..\..\..\src\jrd\recsrc\VirtualTableScan.cpp" > </File> <File - RelativePath="..\..\..\src\jrd\recsrc\VirtualTableScan.cpp" - > - </File> - <File RelativePath="..\..\..\src\jrd\recsrc\WindowedStream.cpp" > </File> Modified: firebird/trunk/builds/win32/msvc9/engine_embed.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc9/engine_embed.vcproj 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/builds/win32/msvc9/engine_embed.vcproj 2010-07-13 12:31:35 UTC (rev 51337) @@ -807,14 +807,10 @@ > </File> <File - RelativePath="..\..\..\src\jrd\recsrc\UsersTableScan.cpp" + RelativePath="..\..\..\src\jrd\recsrc\VirtualTableScan.cpp" > </File> <File - RelativePath="..\..\..\src\jrd\recsrc\VirtualTableScan.cpp" - > - </File> - <File RelativePath="..\..\..\src\jrd\recsrc\WindowedStream.cpp" > </File> Modified: firebird/trunk/src/jrd/Database.h =================================================================== --- firebird/trunk/src/jrd/Database.h 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/Database.h 2010-07-13 12:31:35 UTC (rev 51337) @@ -54,7 +54,6 @@ #include "../common/classes/PublicHandle.h" #include "../common/classes/semaphore.h" #include "../common/utils_proto.h" -#include "../jrd/DatabaseSnapshot.h" #include "../jrd/RandomGenerator.h" #include "../jrd/os/guid.h" #include "../jrd/sbm.h" @@ -79,6 +78,7 @@ class BackupManager; class vcl; class ExternalFileDirectoryList; + class MonitoringData; typedef Firebird::ObjectsArray<Trigger> trig_vec; @@ -368,7 +368,7 @@ trig_vec* dbb_triggers[DB_TRIGGER_MAX]; trig_vec* dbb_ddl_triggers; - DatabaseSnapshot::SharedData* dbb_monitoring_data; // monitoring data + MonitoringData* dbb_monitoring_data; // monitoring data DatabaseModules dbb_modules; // external function/filter modules ExtEngineManager dbb_extManager; // external engine manager Modified: firebird/trunk/src/jrd/DatabaseSnapshot.cpp =================================================================== --- firebird/trunk/src/jrd/DatabaseSnapshot.cpp 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/DatabaseSnapshot.cpp 2010-07-13 12:31:35 UTC (rev 51337) @@ -71,9 +71,17 @@ using namespace Jrd; -// SharedData class +bool MonitoringTableScan::retrieveRecord(thread_db* tdbb, jrd_rel* relation, + FB_UINT64 position, Record* record) const +{ + DatabaseSnapshot* const snapshot = DatabaseSnapshot::create(tdbb); + return snapshot->getData(relation)->fetch(position, record); +} -DatabaseSnapshot::SharedData::SharedData(const Database* dbb) + +// MonitoringData class + +MonitoringData::MonitoringData(const Database* dbb) : process_id(getpid()), local_id(dbb->dbb_monitoring_id) { string name; @@ -91,10 +99,10 @@ } -DatabaseSnapshot::SharedData::~SharedData() +MonitoringData::~MonitoringData() { { // scope - DumpGuard guard(this); + Guard guard(this); cleanup(); if (sh_mem_header->used == sizeof(Header)) @@ -106,7 +114,7 @@ } -void DatabaseSnapshot::SharedData::acquire() +void MonitoringData::acquire() { mutexLock(); @@ -126,13 +134,13 @@ } -void DatabaseSnapshot::SharedData::release() +void MonitoringData::release() { mutexUnlock(); } -UCHAR* DatabaseSnapshot::SharedData::read(MemoryPool& pool, ULONG& resultSize) +UCHAR* MonitoringData::read(MemoryPool& pool, ULONG& resultSize) { ULONG self_dbb_offset = 0; @@ -198,7 +206,7 @@ } -ULONG DatabaseSnapshot::SharedData::setup() +ULONG MonitoringData::setup() { ensureSpace(sizeof(Element)); @@ -214,7 +222,7 @@ } -void DatabaseSnapshot::SharedData::write(ULONG offset, ULONG length, const void* buffer) +void MonitoringData::write(ULONG offset, ULONG length, const void* buffer) { ensureSpace(length); @@ -229,7 +237,7 @@ } -void DatabaseSnapshot::SharedData::cleanup() +void MonitoringData::cleanup() { // Remove information about our dbb for (ULONG offset = alignOffset(sizeof(Header)); offset < sh_mem_header->used;) @@ -252,7 +260,7 @@ } -void DatabaseSnapshot::SharedData::ensureSpace(ULONG length) +void MonitoringData::ensureSpace(ULONG length) { ULONG newSize = sh_mem_header->used + length; @@ -274,7 +282,7 @@ } -void DatabaseSnapshot::SharedData::mutexBug(int osErrorCode, const char* string) +void MonitoringData::mutexBug(int osErrorCode, const char* string) { gds__log("MONITOR: mutex %s error, status = %d", string, osErrorCode); @@ -283,7 +291,7 @@ } -bool DatabaseSnapshot::SharedData::initialize(bool initialize) +bool MonitoringData::initialize(bool initialize) { if (initialize) { @@ -299,11 +307,12 @@ } -ULONG DatabaseSnapshot::SharedData::alignOffset(ULONG unaligned) +ULONG MonitoringData::alignOffset(ULONG unaligned) { - return Firebird::MEM_ALIGN(unaligned); + return (ULONG) Firebird::MEM_ALIGN(unaligned); } + // DatabaseSnapshot class @@ -424,7 +433,7 @@ { // scope fb_assert(dbb->dbb_monitoring_data); - DumpGuard guard(dbb->dbb_monitoring_data); + MonitoringData::Guard guard(dbb->dbb_monitoring_data); dataPtr = dbb->dbb_monitoring_data->read(pool, dataSize); } @@ -589,7 +598,7 @@ jrd_rel* relation = MET_lookup_relation_id(tdbb, rel_id, false); fb_assert(relation); MET_scan_relation(tdbb, relation); - fb_assert(relation->isVirtual() && !relation->isUsers()); + fb_assert(relation->isVirtual()); Format* format = MET_current(tdbb, relation); fb_assert(format); @@ -613,7 +622,7 @@ void DataDump::putField(thread_db* tdbb, Record* record, const DumpField& field, - int& charset, bool set_charset) + int& charset, bool set_charset) { fb_assert(record); @@ -726,10 +735,10 @@ if (!dbb->dbb_monitoring_data) { - dbb->dbb_monitoring_data = FB_NEW(*dbb->dbb_permanent) SharedData(dbb); + dbb->dbb_monitoring_data = FB_NEW(*dbb->dbb_permanent) MonitoringData(dbb); } - DumpGuard guard(dbb->dbb_monitoring_data); + MonitoringData::Guard guard(dbb->dbb_monitoring_data); dbb->dbb_monitoring_data->cleanup(); Writer writer(dbb->dbb_monitoring_data); @@ -905,7 +914,7 @@ bool DatabaseSnapshot::putAttachment(thread_db* tdbb, const Jrd::Attachment* attachment, - Writer& writer, int stat_id) + Writer& writer, int stat_id) { fb_assert(attachment); Modified: firebird/trunk/src/jrd/DatabaseSnapshot.h =================================================================== --- firebird/trunk/src/jrd/DatabaseSnapshot.h 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/DatabaseSnapshot.h 2010-07-13 12:31:35 UTC (rev 51337) @@ -29,6 +29,7 @@ #include "../jrd/isc_s_proto.h" #include "../common/classes/timestamp.h" #include "../jrd/val.h" +#include "../jrd/recsrc/RecordSource.h" namespace Jrd { @@ -199,91 +200,103 @@ int idCounter; }; -class DatabaseSnapshot : public DataDump + +class MonitoringHeader : public MemoryHeader { - struct RelationData +public: + ULONG used; + ULONG allocated; +}; + +class MonitoringData : public SharedMemory<MonitoringHeader> +{ + static const ULONG MONITOR_VERSION = 3; + static const ULONG DEFAULT_SIZE = 1048576; + + typedef MonitoringHeader Header; + + struct Element { - int rel_id; - RecordBuffer* data; + SLONG processId; + SLONG localId; + ULONG length; }; + static ULONG alignOffset(ULONG absoluteOffset); + public: - class SnapshotHeader : public MemoryHeader + class Guard { public: - ULONG used; - ULONG allocated; - }; + explicit Guard(MonitoringData* ptr) + : data(ptr) + { + data->acquire(); + } - class SharedData : public SharedMemory<SnapshotHeader> - { - static const ULONG MONITOR_VERSION = 3; - static const ULONG DEFAULT_SIZE = 1048576; + ~Guard() + { + data->release(); + } - typedef SnapshotHeader Header; + private: + Guard(const Guard&); + Guard& operator=(const Guard&); - struct Element - { - SLONG processId; - SLONG localId; - ULONG length; - }; + MonitoringData* const data; + }; - static ULONG alignOffset(ULONG absoluteOffset); + explicit MonitoringData(const Database*); + ~MonitoringData(); - public: - explicit SharedData(const Database*); - ~SharedData(); + bool initialize(bool); + void mutexBug(int osErrorCode, const char* text); - bool initialize(bool); - void mutexBug(int osErrorCode, const char* text); + void acquire(); + void release(); - void acquire(); - void release(); + UCHAR* read(MemoryPool&, ULONG&); + ULONG setup(); + void write(ULONG, ULONG, const void*); - UCHAR* read(MemoryPool&, ULONG&); - ULONG setup(); - void write(ULONG, ULONG, const void*); + void cleanup(); - void cleanup(); +private: + // copying is prohibited + MonitoringData(const MonitoringData&); + MonitoringData& operator =(const MonitoringData&); - private: - // copying is prohibited - SharedData(const SharedData&); - SharedData& operator =(const SharedData&); + void ensureSpace(ULONG); - void ensureSpace(ULONG); + const SLONG process_id; + const SLONG local_id; +}; - const SLONG process_id; - const SLONG local_id; - }; -private: - class DumpGuard - { - public: - explicit DumpGuard(SharedData* ptr) - : data(ptr) - { - data->acquire(); - } +class MonitoringTableScan: public VirtualTableScan +{ +public: + MonitoringTableScan(CompilerScratch* csb, const Firebird::string& name, UCHAR stream) + : VirtualTableScan(csb, name, stream) + {} - ~DumpGuard() - { - data->release(); - } + bool retrieveRecord(thread_db* tdbb, jrd_rel* relation, FB_UINT64 position, Record* record) const; +}; - private: - DumpGuard(const DumpGuard&); - DumpGuard& operator=(const DumpGuard&); - SharedData* const data; +class DatabaseSnapshot : public DataDump +{ + struct RelationData + { + int rel_id; + RecordBuffer* data; }; +private: class Writer { public: - explicit Writer(SharedData* data) + explicit Writer(MonitoringData* data) : dump(data) { fb_assert(dump); @@ -299,7 +312,7 @@ } private: - SharedData* dump; + MonitoringData* dump; ULONG offset; }; @@ -338,6 +351,7 @@ static DatabaseSnapshot* create(thread_db*); static int blockingAst(void*); + static bool getRecord(thread_db* tdbb, jrd_rel* relation, FB_UINT64 position, Record* record); protected: DatabaseSnapshot(thread_db*, MemoryPool&); Modified: firebird/trunk/src/jrd/Relation.h =================================================================== --- firebird/trunk/src/jrd/Relation.h 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/Relation.h 2010-07-13 12:31:35 UTC (rev 51337) @@ -219,7 +219,6 @@ bool isSystem() const; bool isTemporary() const; bool isVirtual() const; - bool isUsers() const; // global temporary relations attributes RelationPages* getPages(thread_db* tdbb, SLONG tran = -1, bool allocPages = true); @@ -299,7 +298,6 @@ const ULONG REL_temp_tran = 0x2000; // relation is a GTT delete rows const ULONG REL_temp_conn = 0x4000; // relation is a GTT preserve rows const ULONG REL_virtual = 0x8000; // relation is virtual -const ULONG REL_users = 0x00010000; // relation is users list inline bool jrd_rel::isSystem() const @@ -314,14 +312,9 @@ inline bool jrd_rel::isVirtual() const { - return (rel_flags & (REL_virtual | REL_users)); + return (rel_flags & REL_virtual); } -inline bool jrd_rel::isUsers() const -{ - return (rel_flags & REL_users); -} - inline RelationPages* jrd_rel::getPages(thread_db* tdbb, SLONG tran, bool allocPages) { if (!isTemporary()) Modified: firebird/trunk/src/jrd/UserManagement.cpp =================================================================== --- firebird/trunk/src/jrd/UserManagement.cpp 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/UserManagement.cpp 2010-07-13 12:31:35 UTC (rev 51337) @@ -38,6 +38,14 @@ using namespace Firebird; +bool UsersTableScan::retrieveRecord(thread_db* tdbb, jrd_rel* relation, + FB_UINT64 position, Record* record) const +{ + jrd_tra* const transaction = tdbb->getTransaction(); + return transaction->getUserManagement()->getList(tdbb, relation)->fetch(position, record); +} + + UserManagement::UserManagement(jrd_tra* tra) : DataDump(*tra->tra_pool), database(0), transaction(0), buffer(0), threadDbb(NULL), realUser(NULL), commands(*tra->tra_pool) @@ -219,51 +227,44 @@ buffer->store(record); } -RecordBuffer* UserManagement::getList(thread_db* tdbb) +RecordBuffer* UserManagement::getList(thread_db* tdbb, jrd_rel* relation) { #ifdef EMBEDDED // this restriction for embedded is temporarty and will gone when new build system will be introduced status_exception::raise(Arg::Gds(isc_random) << "User management not supported in embedded library"); return 0; // keep the compiler happy #else - if (buffer) + if (!buffer) { - return buffer; - } + try + { + threadDbb = tdbb; - try - { - threadDbb = tdbb; + fb_assert(relation && relation->rel_id == rel_sec_users); - jrd_rel* relation = MET_lookup_relation_id(threadDbb, rel_sec_users, false); - fb_assert(relation); + MET_scan_relation(threadDbb, relation); - MET_scan_relation(threadDbb, relation); - fb_assert(relation->isUsers()); + Format* const format = MET_current(threadDbb, relation); + fb_assert(format); - Format* format = MET_current(threadDbb, relation); - fb_assert(format); + MemoryPool* const pool = threadDbb->getTransaction()->tra_pool; + fb_assert(pool); - MemoryPool* pool = threadDbb->getTransaction()->tra_pool; - fb_assert(pool); + buffer = FB_NEW(*pool) RecordBuffer(*pool, format); + fb_assert(buffer); - buffer = FB_NEW(*pool) RecordBuffer(*pool, format); - fb_assert(buffer); - - ISC_STATUS_ARRAY status; - internal_user_data u; - u.operation = DIS_OPER; - int errcode = SECURITY_exec_line(status, realUser, database, transaction, &u, display, this); - checkSecurityResult(errcode, status, u.user_name); - } - catch (const Exception&) - { - if (buffer) + ISC_STATUS_ARRAY status; + internal_user_data u; + u.operation = DIS_OPER; + int errcode = SECURITY_exec_line(status, realUser, database, transaction, &u, display, this); + checkSecurityResult(errcode, status, u.user_name); + } + catch (const Exception&) { delete buffer; buffer = NULL; + throw; } - throw; } return buffer; Modified: firebird/trunk/src/jrd/UserManagement.h =================================================================== --- firebird/trunk/src/jrd/UserManagement.h 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/UserManagement.h 2010-07-13 12:31:35 UTC (rev 51337) @@ -28,6 +28,7 @@ #include "../common/classes/fb_string.h" #include "../jrd/ibase.h" #include "../jrd/DatabaseSnapshot.h" +#include "../jrd/recsrc/RecordSource.h" struct internal_user_data; @@ -37,6 +38,16 @@ class jrd_tra; class RecordBuffer; +class UsersTableScan: public VirtualTableScan +{ +public: + UsersTableScan(CompilerScratch* csb, const Firebird::string& name, UCHAR stream) + : VirtualTableScan(csb, name, stream) + {} + + bool retrieveRecord(thread_db* tdbb, jrd_rel* relation, FB_UINT64 position, Record* record) const; +}; + // User management argument for deferred work class UserManagement : public DataDump { @@ -51,7 +62,7 @@ // commit transaction in security database void commit(); // return users list for SEC$USERS - RecordBuffer* getList(thread_db* tdbb); + RecordBuffer* getList(thread_db* tdbb, jrd_rel* relation); private: FB_API_HANDLE database, transaction; Modified: firebird/trunk/src/jrd/constants.h =================================================================== --- firebird/trunk/src/jrd/constants.h 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/constants.h 2010-07-13 12:31:35 UTC (rev 51337) @@ -202,8 +202,7 @@ rel_external = 2, rel_virtual = 3, rel_global_temp_preserve = 4, - rel_global_temp_delete = 5, - rel_vrt_users = 6 + rel_global_temp_delete = 5 }; // procedure types Modified: firebird/trunk/src/jrd/met.epp =================================================================== --- firebird/trunk/src/jrd/met.epp 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/met.epp 2010-07-13 12:31:35 UTC (rev 51337) @@ -3607,9 +3607,6 @@ case rel_view: fb_assert(relation->rel_view_rse); break; - case rel_vrt_users: - relation->rel_flags |= REL_users; - break; case rel_virtual: relation->rel_flags |= REL_virtual; break; Modified: firebird/trunk/src/jrd/opt.cpp =================================================================== --- firebird/trunk/src/jrd/opt.cpp 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/opt.cpp 2010-07-13 12:31:35 UTC (rev 51337) @@ -56,6 +56,7 @@ #include "../jrd/btr.h" #include "../jrd/sort.h" #include "../jrd/rse.h" +#include "../jrd/ini.h" #include "../jrd/intl.h" #include "../jrd/gdsassert.h" #include "../jrd/btr_proto.h" @@ -76,6 +77,8 @@ #include "../jrd/dbg_proto.h" #include "../jrd/DataTypeUtil.h" #include "../jrd/VirtualTable.h" +#include "../jrd/DatabaseSnapshot.h" +#include "../jrd/UserManagement.h" #include "../common/classes/array.h" #include "../common/classes/objects_array.h" #include "../jrd/recsrc/RecordSource.h" @@ -3045,9 +3048,9 @@ DEV_BLKCHK(*return_boolean, type_nod); } - CompilerScratch* csb = opt->opt_csb; - CompilerScratch::csb_repeat* csb_tail = &csb->csb_rpt[stream]; - jrd_rel* relation = csb_tail->csb_relation; + CompilerScratch* const csb = opt->opt_csb; + CompilerScratch::csb_repeat* const csb_tail = &csb->csb_rpt[stream]; + jrd_rel* const relation = csb_tail->csb_relation; fb_assert(relation); @@ -3074,15 +3077,17 @@ // External table rsb = FB_NEW(*tdbb->getDefaultPool()) ExternalTableScan(csb, alias, stream); } - else if (relation->isUsers()) - { - // Users table - rsb = FB_NEW(*tdbb->getDefaultPool()) UsersTableScan(csb, alias, stream); - } else if (relation->isVirtual()) { - // Virtual table - rsb = FB_NEW(*tdbb->getDefaultPool()) VirtualTableScan(csb, alias, stream); + // Virtual table: monitoring or security + if (relation->rel_id == rel_sec_users) + { + rsb = FB_NEW(*tdbb->getDefaultPool()) UsersTableScan(csb, alias, stream); + } + else + { + rsb = FB_NEW(*tdbb->getDefaultPool()) MonitoringTableScan(csb, alias, stream); + } } else { Modified: firebird/trunk/src/jrd/recsrc/RecordSource.h =================================================================== --- firebird/trunk/src/jrd/recsrc/RecordSource.h 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/recsrc/RecordSource.h 2010-07-13 12:31:35 UTC (rev 51337) @@ -28,11 +28,6 @@ #include "../jrd/rse.h" #include "../jrd/inf_pub.h" -namespace Ods -{ - struct btree_page; -} - namespace Jrd { class thread_db; @@ -281,11 +276,6 @@ class VirtualTableScan : public RecordStream { - struct Impure : public RecordSource::Impure - { - RecordBuffer* irsb_record_buffer; - }; - public: VirtualTableScan(CompilerScratch* csb, const Firebird::string& name, UCHAR stream); @@ -298,29 +288,10 @@ void dump(thread_db* tdbb, Firebird::UCharBuffer& buffer) const; - private: - const Firebird::string m_name; - }; + protected: + virtual bool retrieveRecord(thread_db* tdbb, jrd_rel* relation, + FB_UINT64 position, Record* record) const = 0; - class UsersTableScan : public RecordStream - { - struct Impure : public RecordSource::Impure - { - RecordBuffer* irsb_record_buffer; - }; - - public: - UsersTableScan(CompilerScratch* csb, const Firebird::string& name, UCHAR stream); - - void open(thread_db* tdbb) const; - void close(thread_db* tdbb) const; - - bool getRecord(thread_db* tdbb) const; - bool refetchRecord(thread_db* tdbb) const; - bool lockRecord(thread_db* tdbb) const; - - void dump(thread_db* tdbb, Firebird::UCharBuffer& buffer) const; - private: const Firebird::string m_name; }; Modified: firebird/trunk/src/jrd/recsrc/VirtualTableScan.cpp =================================================================== --- firebird/trunk/src/jrd/recsrc/VirtualTableScan.cpp 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/recsrc/VirtualTableScan.cpp 2010-07-13 12:31:35 UTC (rev 51337) @@ -68,9 +68,6 @@ } rpb->rpb_number.setValue(BOF_NUMBER); - - DatabaseSnapshot* const snapshot = DatabaseSnapshot::create(tdbb); - impure->irsb_record_buffer = snapshot->getData(relation); } void VirtualTableScan::close(thread_db* tdbb) const @@ -84,7 +81,6 @@ if (impure->irsb_flags & irsb_open) { impure->irsb_flags &= ~irsb_open; - impure->irsb_record_buffer = NULL; } } @@ -102,9 +98,7 @@ rpb->rpb_number.increment(); - fb_assert(impure->irsb_record_buffer); - - if (impure->irsb_record_buffer->fetch(rpb->rpb_number.getValue(), rpb->rpb_record)) + if (retrieveRecord(tdbb, rpb->rpb_relation, rpb->rpb_number.getValue(), rpb->rpb_record)) { rpb->rpb_number.setValid(true); return true; Modified: firebird/trunk/src/jrd/relations.h =================================================================== --- firebird/trunk/src/jrd/relations.h 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/relations.h 2010-07-13 12:31:35 UTC (rev 51337) @@ -606,7 +606,7 @@ END_RELATION // Relation 44 (SEC$USERS) -RELATION(nam_sec_users, rel_sec_users, ODS_12_0, rel_vrt_users) +RELATION(nam_sec_users, rel_sec_users, ODS_12_0, rel_virtual) FIELD(f_sec_user_name, nam_user_name, fld_user, 1, ODS_12_0) FIELD(f_sec_group_name, nam_group_name, fld_user, 1, ODS_12_0) FIELD(f_sec_uid, nam_uid, fld_uid, 1, ODS_12_0) Modified: firebird/trunk/src/jrd/types.h =================================================================== --- firebird/trunk/src/jrd/types.h 2010-07-13 11:03:55 UTC (rev 51336) +++ firebird/trunk/src/jrd/types.h 2010-07-13 12:31:35 UTC (rev 51337) @@ -112,7 +112,6 @@ TYPE ("VIRTUAL", rel_virtual, nam_r_type) TYPE ("GLOBAL_TEMPORARY_PRESERVE", rel_global_temp_preserve, nam_r_type) TYPE ("GLOBAL_TEMPORARY_DELETE", rel_global_temp_delete, nam_r_type) -TYPE ("USERS LIST", rel_vrt_users, nam_r_type) TYPE ("LEGACY", prc_legacy, nam_prc_type) TYPE ("SELECTABLE", prc_selectable, nam_prc_type) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <asf...@us...> - 2010-07-15 00:47:30
|
Revision: 51342 http://firebird.svn.sourceforge.net/firebird/?rev=51342&view=rev Author: asfernandes Date: 2010-07-15 00:47:24 +0000 (Thu, 15 Jul 2010) Log Message: ----------- Misc Modified Paths: -------------- firebird/trunk/builds/posix/Makefile.in.firebird firebird/trunk/src/jrd/UserManagement.cpp firebird/trunk/src/jrd/svc.cpp firebird/trunk/src/utilities/gsec/gsec.cpp firebird/trunk/src/utilities/gsec/secur_proto.h firebird/trunk/src/utilities/gsec/security.epp Modified: firebird/trunk/builds/posix/Makefile.in.firebird =================================================================== --- firebird/trunk/builds/posix/Makefile.in.firebird 2010-07-14 10:29:09 UTC (rev 51341) +++ firebird/trunk/builds/posix/Makefile.in.firebird 2010-07-15 00:47:24 UTC (rev 51342) @@ -76,7 +76,7 @@ # use the static files as a last resort. # # The bootstrap version of gpre (gpre_boot) is used to build all the -# engine file. +# engine file. # During this phase of the build process the limited version of alt.bin # is used. The full version of alt.bin is compiled later in the build # process after the security database is available. After the Modified: firebird/trunk/src/jrd/UserManagement.cpp =================================================================== --- firebird/trunk/src/jrd/UserManagement.cpp 2010-07-14 10:29:09 UTC (rev 51341) +++ firebird/trunk/src/jrd/UserManagement.cpp 2010-07-15 00:47:24 UTC (rev 51342) @@ -196,33 +196,53 @@ int attachment_charset = ttype_none; if (u->user_name_entered) + { putField(threadDbb, record, DumpField(f_sec_user_name, VALUE_STRING, strlen(u->user_name), u->user_name), attachment_charset); + } + if (u->group_name_entered) + { putField(threadDbb, record, DumpField(f_sec_group_name, VALUE_STRING, strlen(u->group_name), u->group_name), attachment_charset); + } + if (u->uid_entered) + { putField(threadDbb, record, DumpField(f_sec_uid, VALUE_INTEGER, sizeof(int), &u->uid), attachment_charset); + } + if (u->gid_entered) + { putField(threadDbb, record, DumpField(f_sec_gid, VALUE_INTEGER, sizeof(int), &u->gid), attachment_charset); + } + if (u->first_name_entered) + { putField(threadDbb, record, DumpField(f_sec_first_name, VALUE_STRING, strlen(u->first_name), u->first_name), attachment_charset); + } + if (u->middle_name_entered) + { putField(threadDbb, record, DumpField(f_sec_middle_name, VALUE_STRING, strlen(u->middle_name), u->middle_name), attachment_charset); + } + if (u->last_name_entered) + { putField(threadDbb, record, DumpField(f_sec_last_name, VALUE_STRING, strlen(u->last_name), u->last_name), attachment_charset); + } buffer->store(record); } Modified: firebird/trunk/src/jrd/svc.cpp =================================================================== --- firebird/trunk/src/jrd/svc.cpp 2010-07-14 10:29:09 UTC (rev 51341) +++ firebird/trunk/src/jrd/svc.cpp 2010-07-15 00:47:24 UTC (rev 51342) @@ -1925,7 +1925,8 @@ // Only need to add username and password information to those calls which need // to make a database connection - const bool flNeedUser = (svc_id == isc_action_svc_backup || + const bool flNeedUser = + svc_id == isc_action_svc_backup || svc_id == isc_action_svc_restore || svc_id == isc_action_svc_nbak || svc_id == isc_action_svc_nrest || @@ -1936,15 +1937,16 @@ svc_id == isc_action_svc_trace_stop || svc_id == isc_action_svc_trace_suspend || svc_id == isc_action_svc_trace_resume || - svc_id == isc_action_svc_trace_list); + svc_id == isc_action_svc_trace_list; - const bool flGsecUser = (svc_id == isc_action_svc_add_user || + const bool flGsecUser = + svc_id == isc_action_svc_add_user || svc_id == isc_action_svc_delete_user || svc_id == isc_action_svc_modify_user || svc_id == isc_action_svc_display_user || svc_id == isc_action_svc_display_user_adm || svc_id == isc_action_svc_set_mapping || - svc_id == isc_action_svc_drop_mapping); + svc_id == isc_action_svc_drop_mapping; if (flNeedUser || flGsecUser) { @@ -1975,7 +1977,6 @@ } } - // All services except for get_ib_log require switches spb.rewind(); if ((!svc_switches.hasData()) && svc_id != isc_action_svc_get_fb_log) Modified: firebird/trunk/src/utilities/gsec/gsec.cpp =================================================================== --- firebird/trunk/src/utilities/gsec/gsec.cpp 2010-07-14 10:29:09 UTC (rev 51341) +++ firebird/trunk/src/utilities/gsec/gsec.cpp 2010-07-15 00:47:24 UTC (rev 51342) @@ -278,7 +278,7 @@ uSvc->started(); if (! useServices) { - ret = SECURITY_exec_line(status, tdsec->tsec_real_user, + ret = SECURITY_exec_line(status, tdsec->tsec_real_user, db_handle, user_data, data_print, NULL); if (ret) { Modified: firebird/trunk/src/utilities/gsec/secur_proto.h =================================================================== --- firebird/trunk/src/utilities/gsec/secur_proto.h 2010-07-14 10:29:09 UTC (rev 51341) +++ firebird/trunk/src/utilities/gsec/secur_proto.h 2010-07-15 00:47:24 UTC (rev 51342) @@ -33,4 +33,3 @@ void* callback_arg); #endif // UTILITIES_SECUR_PROTO_H - Modified: firebird/trunk/src/utilities/gsec/security.epp =================================================================== --- firebird/trunk/src/utilities/gsec/security.epp 2010-07-14 10:29:09 UTC (rev 51341) +++ firebird/trunk/src/utilities/gsec/security.epp 2010-07-15 00:47:24 UTC (rev 51342) @@ -85,7 +85,7 @@ } -static bool storePasswd(ISC_STATUS* isc_status, FB_API_HANDLE DB, FB_API_HANDLE trans, +static bool storePasswd(ISC_STATUS* isc_status, FB_API_HANDLE DB, FB_API_HANDLE trans, ISC_QUAD& blobId, const Firebird::string& passwd) { UserBlob blob(isc_status); @@ -98,6 +98,7 @@ if (!blob.putData(passwd.length(), passwd.c_str())) { + blob.close(); return false; } @@ -105,7 +106,7 @@ } SSHORT SECURITY_exec_line(ISC_STATUS* isc_status, - const char *realUser, + const char* realUser, FB_API_HANDLE DB, FB_API_HANDLE trans, internal_user_data* io_user_data, @@ -544,7 +545,7 @@ } SSHORT SECURITY_exec_line(ISC_STATUS* isc_status, - const char *realUser, + const char* realUser, FB_API_HANDLE DB, internal_user_data* io_user_data, FPTR_SECURITY_CALLBACK display_func, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ale...@us...> - 2010-07-23 12:04:26
|
Revision: 51355 http://firebird.svn.sourceforge.net/firebird/?rev=51355&view=rev Author: alexpeshkoff Date: 2010-07-23 12:04:18 +0000 (Fri, 23 Jul 2010) Log Message: ----------- Implemented self-registering plugins format (same plugin can be easily linked statically or as dynamic library, depending upon platform requirements). Self-registering plugins need not export any functions, instead they call fb_register_plugin() on startup. Reworked all user management to use self-registering plugins. Removed system table RDB$USERS. PLG$USERS is not created automatically by plugin, but will be later (work in progress). Modified Paths: -------------- firebird/trunk/builds/posix/Makefile.in.client.gsec firebird/trunk/builds/posix/Makefile.in.embed.util firebird/trunk/builds/posix/Makefile.in.fbserver firebird/trunk/builds/posix/Makefile.in.firebird firebird/trunk/builds/posix/Makefile.in.smp_server firebird/trunk/builds/posix/firebird.vers firebird/trunk/builds/posix/make.defaults firebird/trunk/builds/posix/make.rules firebird/trunk/builds/posix/make.shared.variables firebird/trunk/configure.in firebird/trunk/src/auth/Auth.cpp firebird/trunk/src/auth/Auth.h firebird/trunk/src/auth/AuthInterface.h firebird/trunk/src/auth/SecurityDatabase/LegacyClient.cpp firebird/trunk/src/auth/SecurityDatabase/LegacyClient.h firebird/trunk/src/common/classes/Interface.h firebird/trunk/src/dbs/security.sql firebird/trunk/src/include/FirebirdPluginApi.h firebird/trunk/src/include/gen/ids.h firebird/trunk/src/jrd/PluginManager.h firebird/trunk/src/jrd/fields.h firebird/trunk/src/jrd/gds.cpp firebird/trunk/src/jrd/idx.h firebird/trunk/src/jrd/ini.epp firebird/trunk/src/jrd/jrd_pwd.h firebird/trunk/src/jrd/names.h firebird/trunk/src/jrd/os/posix/mod_loader.cpp firebird/trunk/src/jrd/pwd.cpp firebird/trunk/src/jrd/relations.h firebird/trunk/src/plugins/udr_engine/UdrEngine.cpp firebird/trunk/src/remote/interface.cpp firebird/trunk/src/remote/server.cpp Added Paths: ----------- firebird/trunk/builds/posix/Makefile.in.user.management firebird/trunk/src/auth/AuthDbg.cpp firebird/trunk/src/auth/AuthDbg.h firebird/trunk/src/auth/SecurityDatabase/LegacyManagement.epp firebird/trunk/src/auth/SecurityDatabase/LegacyManagement.h firebird/trunk/src/common/classes/ImplementHelper.h firebird/trunk/src/misc/smallog.cpp firebird/trunk/src/utilities/gsec/security.cpp Removed Paths: ------------- firebird/trunk/src/utilities/gsec/security.epp Property Changed: ---------------- firebird/trunk/builds/posix/Makefile.in.client.gsec firebird/trunk/builds/posix/Makefile.in.embed.util firebird/trunk/builds/posix/Makefile.in.fbserver firebird/trunk/builds/posix/Makefile.in.firebird firebird/trunk/builds/posix/Makefile.in.smp_server firebird/trunk/builds/posix/firebird.vers firebird/trunk/builds/posix/make.defaults firebird/trunk/builds/posix/make.rules firebird/trunk/builds/posix/make.shared.variables firebird/trunk/configure.in firebird/trunk/src/auth/Auth.cpp firebird/trunk/src/auth/Auth.h firebird/trunk/src/auth/AuthInterface.h firebird/trunk/src/auth/SecurityDatabase/LegacyClient.cpp firebird/trunk/src/auth/SecurityDatabase/LegacyClient.h firebird/trunk/src/common/classes/Interface.h firebird/trunk/src/dbs/security.sql firebird/trunk/src/include/FirebirdPluginApi.h firebird/trunk/src/include/gen/ids.h firebird/trunk/src/jrd/PluginManager.h firebird/trunk/src/jrd/fields.h firebird/trunk/src/jrd/gds.cpp firebird/trunk/src/jrd/idx.h firebird/trunk/src/jrd/ini.epp firebird/trunk/src/jrd/jrd_pwd.h firebird/trunk/src/jrd/names.h firebird/trunk/src/jrd/os/posix/mod_loader.cpp firebird/trunk/src/jrd/pwd.cpp firebird/trunk/src/jrd/relations.h firebird/trunk/src/plugins/udr_engine/UdrEngine.cpp firebird/trunk/src/remote/interface.cpp Modified: firebird/trunk/builds/posix/Makefile.in.client.gsec =================================================================== --- firebird/trunk/builds/posix/Makefile.in.client.gsec 2010-07-22 09:36:15 UTC (rev 51354) +++ firebird/trunk/builds/posix/Makefile.in.client.gsec 2010-07-23 12:04:18 UTC (rev 51355) @@ -29,8 +29,7 @@ @SET_MAKE@ -GSEC_Other_Sources = jrd/isc_file.cpp jrd/ThreadData.cpp jrd/enc.cpp \ - jrd/sha.cpp jrd/guid.cpp +GSEC_Other_Sources = jrd/isc_file.cpp jrd/ThreadData.cpp GSEC_Files = gsec.cpp call_service.cpp gsecMain.cpp security.cpp GSEC_Sources = $(addprefix utilities/gsec/, $(GSEC_Files)) $(GSEC_Other_Sources) GSEC_Objects = $(addprefix $(OBJ)/, $(addsuffix .o, $(basename $(GSEC_Sources)))) Property changes on: firebird/trunk/builds/posix/Makefile.in.client.gsec ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: firebird/trunk/builds/posix/Makefile.in.embed.util =================================================================== --- firebird/trunk/builds/posix/Makefile.in.embed.util 2010-07-22 09:36:15 UTC (rev 51354) +++ firebird/trunk/builds/posix/Makefile.in.embed.util 2010-07-23 12:04:18 UTC (rev 51355) @@ -70,7 +70,7 @@ DROP_Objects = $(addprefix $(OBJ)/, $(addsuffix .o, $(basename $(DROP_Sources)))) $(FBCOMMON_ClientObjects) -GSEC_Other_Sources = jrd/enc.cpp jrd/sha.cpp jrd/guid.cpp \ +GSEC_Other_Sources = \ jrd/isc_file.cpp common/config/config.cpp common/config/config_file.cpp \ common/config/ConfigCache.cpp common/config/dir_list.cpp \ jrd/ThreadData.cpp $(OS_SPECIFIC_Sources) Property changes on: firebird/trunk/builds/posix/Makefile.in.embed.util ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: firebird/trunk/builds/posix/Makefile.in.fbserver =================================================================== --- firebird/trunk/builds/posix/Makefile.in.fbserver 2010-07-22 09:36:15 UTC (rev 51354) +++ firebird/trunk/builds/posix/Makefile.in.fbserver 2010-07-23 12:04:18 UTC (rev 51355) @@ -39,10 +39,15 @@ @SET_MAKE@ +SERVER_Other_sources = jrd/pwd.cpp jrd/sha.cpp +SERVER_Other Objects = $(addprefix $(OBJ)/, $(addsuffix .o, $(basename $(SERVER_Other_sources)))) + SERVER_Files = $(OS_ServerFiles) server.cpp -SERVER_Sources = $(addprefix remote/, $(SERVER_Files)) jrd/pwd.cpp -SERVER_Objects = $(addprefix $(OBJ)/, $(addsuffix .o, $(basename $(SERVER_Sources)))) $(LIBFBSERVER_Objects) $(COMMON_Objects) +SERVER_Sources = $(addprefix remote/, $(SERVER_Files)) +SERVER_Objects = $(addprefix $(OBJ)/, $(addsuffix .o, $(basename $(SERVER_Sources)))) \ + $(LIBFBSERVER_Objects) $(COMMON_Objects) $(SERVER_Other Objects) + .PHONY: fbserver Property changes on: firebird/trunk/builds/posix/Makefile.in.fbserver ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: firebird/trunk/builds/posix/Makefile.in.firebird =================================================================== --- firebird/trunk/builds/posix/Makefile.in.firebird 2010-07-22 09:36:15 UTC (rev 51354) +++ firebird/trunk/builds/posix/Makefile.in.firebird 2010-07-23 12:04:18 UTC (rev 51355) @@ -134,7 +134,7 @@ .PHONY: all firebird firebird_boot firebird_basic .PHONY: firebird_embedded firebird_server classic_programs super_programs .PHONY: firebird_super firebird_classic btyacc_binary -.PHONY: fbtrace +.PHONY: plugins2 # The main targets are firebird_embedded or firebird_server @@ -145,8 +145,8 @@ firebird : firebird_@FIREBIRD_ARCH_TYPE@ $(PLATFORM_POSTBUILD_TARGET) -firebird_classic firebird_embedded: firebird_basic classic_targets fbtrace -firebird_super firebird_server: firebird_basic super_targets fbtrace +firebird_classic firebird_embedded: firebird_basic classic_targets plugins2 +firebird_super firebird_server: firebird_basic super_targets plugins2 @@ -414,8 +414,9 @@ #--------------------------------------------------------------------------- -fbtrace: +plugins2: $(MAKE) $(CPU_OPTION) -f $(GEN_ROOT)/Makefile.fbtrace + $(MAKE) $(CPU_OPTION) -f $(GEN_ROOT)/Makefile.user.management #--------------------------------------------------------------------------- Property changes on: firebird/trunk/builds/posix/Makefile.in.firebird ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: firebird/trunk/builds/posix/Makefile.in.smp_server =================================================================== --- firebird/trunk/builds/posix/Makefile.in.smp_server 2010-07-22 09:36:15 UTC (rev 51354) +++ firebird/trunk/builds/posix/Makefile.in.smp_server 2010-07-23 12:04:18 UTC (rev 51355) @@ -42,8 +42,8 @@ SERVER_JrdFiles = ThreadData.cpp divorce.cpp dsc.cpp enc.cpp isc_file.cpp isc.cpp \ sdl.cpp status.cpp SERVER_Files = $(OS_ServerFiles) server.cpp -SERVER_Other_sources = common/cvt.cpp common/classes/DbImplementation.cpp \ -jrd/pwd.cpp jrd/sha.cpp jrd/guid.cpp auth/Auth.cpp +SERVER_Other_sources = common/cvt.cpp common/classes/DbImplementation.cpp auth/Auth.cpp \ +jrd/pwd.cpp jrd/sha.cpp jrd/guid.cpp SERVER_Sources = $(addprefix remote/, $(SERVER_Files)) $(addprefix jrd/, $(SERVER_JrdFiles)) $(SERVER_Other_sources) REMOTE_CommonSources = $(addprefix remote/, $(REMOTE_CommonFiles)) Property changes on: firebird/trunk/builds/posix/Makefile.in.smp_server ___________________________________________________________________ Added: svn:mime-type + text/plain Added: firebird/trunk/builds/posix/Makefile.in.user.management =================================================================== --- firebird/trunk/builds/posix/Makefile.in.user.management (rev 0) +++ firebird/trunk/builds/posix/Makefile.in.user.management 2010-07-23 12:04:18 UTC (rev 51355) @@ -0,0 +1,81 @@ +# 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 <mar...@lu...> +# +# Contributor(s): +# +# +# +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@ + + +USER_MANAGEMENT_Files = LegacyManagement.epp + +USER_MANAGEMENT_Sources = $(addprefix auth/SecurityDatabase/, $(USER_MANAGEMENT_Files)) + +USER_MANAGEMENT_Objects = $(addprefix $(OBJ)/, $(addsuffix .o, $(basename $(USER_MANAGEMENT_Sources)))) + + +MANAGEMENT_OTHER_Sources = jrd/enc.cpp jrd/sha.cpp jrd/guid.cpp common/classes/alloc.cpp \ +common/classes/locks.cpp common/classes/UserBlob.cpp common/classes/init.cpp common/classes/fb_string.cpp \ +common/fb_exception.cpp common/thd.cpp common/StatusArg.cpp + + +MANAGEMENT_OTHER_Objects = $(addprefix $(OBJ)/, $(addsuffix .o, $(basename $(MANAGEMENT_OTHER_Sources)))) + + +MANAGEMENT_Objects = $(USER_MANAGEMENT_Objects) $(MANAGEMENT_OTHER_Objects) +#$(FBCLASSES_ClientObjects) $(FBCOMMON_ClientObjects) +# $(CONFIG_Objects) \ +# $(FBCLASSES_MsgObjects) \ +# $(FBCONFIG_Objects) + + +AllObjects = $(MANAGEMENT_Objects) +Dependencies = $(AllObjects:.o=.d) + + +.PHONY: all user_management + + +all : user_management + +user_management: $(MANAGEMENT) + +$(MANAGEMENT): $(MANAGEMENT_Objects) + $(LINK_PLUGIN) $(call LIB_LINK_SONAME,$(MANAGEMENT).0) -o $@ $^ $(LINK_PLUG_LIBS) + + +include $(ROOT)/gen/make.shared.targets + +-include $(Dependencies) Property changes on: firebird/trunk/builds/posix/Makefile.in.user.management ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Modified: firebird/trunk/builds/posix/firebird.vers =================================================================== --- firebird/trunk/builds/posix/firebird.vers 2010-07-22 09:36:15 UTC (rev 51354) +++ firebird/trunk/builds/posix/firebird.vers 2010-07-23 12:04:18 UTC (rev 51355) @@ -333,6 +333,11 @@ fb_shutdown fb_shutdown_callback +# Plugins support + +fb_register_plugin +fb_query_plugin + # Other misc functions isc_ftof Property changes on: firebird/trunk/builds/posix/firebird.vers ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: firebird/trunk/builds/posix/make.defaults =================================================================== --- firebird/trunk/builds/posix/make.defaults 2010-07-22 09:36:15 UTC (rev 51354) +++ firebird/trunk/builds/posix/make.defaults 2010-07-23 12:04:18 UTC (rev 51355) @@ -317,6 +317,9 @@ $(call LIB_LINK_SONAME,$(SharedLibrarySoName)) $(call LIB_LINK_RPATH,lib) LINK_EMBED_LIBS = -L$(LIB) $(LIB_GUI) $(SO_LINK_LIBS) $(ICU_LIBS) +LINK_PLUGIN = $(LIB_LINK) $(LINK_EMPTY_SYMBOLS) $(LIB_LINK_OPTIONS) $(call LIB_LINK_RPATH,lib) +LINK_PLUG_LIBS = -L$(LIB) $(SO_LINK_LIBS) + # From utilities CREATE_DB = $(BIN)/create_db$(EXEC_EXT) GDS_DROP = $(BIN)/gds_drop$(EXEC_EXT) @@ -339,6 +342,7 @@ INSTSVC = $(BIN)/instsvc$(EXEC_EXT) ISC_GDB = $(FIREBIRD)/security2.fdb ISC_GBAK = $(BIN)/security.gbak +MANAGEMENT = $(PLUGINS)/$(LIB_PREFIX)user_management.$(SHRLIB_EXT) # From qli QLI = $(BIN)/qli$(EXEC_EXT) Property changes on: firebird/trunk/builds/posix/make.defaults ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: firebird/trunk/builds/posix/make.rules =================================================================== --- firebird/trunk/builds/posix/make.rules 2010-07-22 09:36:15 UTC (rev 51354) +++ firebird/trunk/builds/posix/make.rules 2010-07-23 12:04:18 UTC (rev 51355) @@ -127,7 +127,7 @@ $(OBJ)/jrd/fun.epp $(OBJ)/jrd/dyn.epp $(OBJ)/jrd/dfw.epp $(OBJ)/jrd/dyn_util.epp \ $(OBJ)/jrd/pcmet.epp $(OBJ)/jrd/met.epp $(OBJ)/jrd/dpm.epp $(OBJ)/utilities/rebuild/rstore.epp \ $(OBJ)/utilities/rebuild/rmet.epp $(OBJ)/utilities/gstat/dba.epp $(OBJ)/utilities/stats.epp \ - $(OBJ)/utilities/gsec/security.epp $(OBJ)/alice/alice_meta.epp $(OBJ)/qli/meta.epp \ + $(OBJ)/auth/SecurityDatabase/LegacyManagement.epp $(OBJ)/alice/alice_meta.epp $(OBJ)/qli/meta.epp \ $(OBJ)/qli/proc.epp $(OBJ)/qli/show.epp $(OBJ)/qli/help.epp $(OBJ)/misc/codes.epp \ $(OBJ)/gpre/gpre_meta.epp $(OBJ)/dsql/blob.epp $(OBJ)/dsql/array.epp \ $(OBJ)/dsql/PackageNodes.epp $(OBJ)/dsql/metd.epp $(OBJ)/dsql/DdlNodes.epp $(OBJ)/isql/show.epp \ Property changes on: firebird/trunk/builds/posix/make.rules ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: firebird/trunk/builds/posix/make.shared.variables =================================================================== --- firebird/trunk/builds/posix/make.shared.variables 2010-07-22 09:36:15 UTC (rev 51354) +++ firebird/trunk/builds/posix/make.shared.variables 2010-07-23 12:04:18 UTC (rev 51355) @@ -14,7 +14,7 @@ JRD_ClientFiles = alt.cpp db_alias.cpp dsc.cpp \ - enc.cpp gds.cpp isc.cpp isc_file.cpp isc_ipc.cpp \ + gds.cpp isc.cpp isc_file.cpp isc_ipc.cpp \ perf.cpp sdl.cpp status.cpp \ ThreadData.cpp ThreadStart.cpp utl.cpp \ $(WHY_Sources) @@ -41,7 +41,7 @@ sdw.cpp shut.cpp sort.cpp sqz.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 \ + nodebug.cpp nbak.cpp $(Physical_IO_Module) TextType.cpp \ unicode_util.cpp RuntimeStatistics.cpp DebugInterface.cpp \ extds/ExtDS.cpp extds/InternalDS.cpp extds/IscDS.cpp \ trace/TraceConfigStorage.cpp trace/TraceLog.cpp \ @@ -114,7 +114,7 @@ INTERFACE_Sources = $(addprefix remote/, $(INTERFACE_Files)) \ - auth/Auth.cpp auth/SecurityDatabase/LegacyClient.cpp + auth/Auth.cpp auth/AuthDbg.cpp auth/SecurityDatabase/LegacyClient.cpp jrd/enc.cpp INTERFACE_Objects = $(addprefix $(OBJ)/, $(addsuffix .o, $(basename $(INTERFACE_Sources)))) ifeq ($(PLATFORM),win32) @@ -357,7 +357,7 @@ # MOD 29-July-2002 # Stub for services entrypoints missing in static library -STUB_Sources = jrd/svc_stub.cpp utilities/gsec/security.epp +STUB_Sources = jrd/svc_stub.cpp utilities/gsec/security.cpp STUB_Objects = $(addprefix $(OBJ)/, $(addsuffix .o, $(basename $(STUB_Sources)))) Property changes on: firebird/trunk/builds/posix/make.shared.variables ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: firebird/trunk/configure.in =================================================================== --- firebird/trunk/configure.in 2010-07-22 09:36:15 UTC (rev 51354) +++ firebird/trunk/configure.in 2010-07-23 12:04:18 UTC (rev 51355) @@ -1371,6 +1371,7 @@ gen/Makefile.embed.qli:${MAKE_SRC_DIR}/Makefile.in.embed.qli gen/Makefile.embed.gpre:${MAKE_SRC_DIR}/Makefile.in.embed.gpre gen/Makefile.fbtrace:${MAKE_SRC_DIR}/Makefile.in.fbtrace +gen/Makefile.user.management:${MAKE_SRC_DIR}/Makefile.in.user.management gen/Makefile.install:builds/install/arch-specific/${INSTALL_PREFIX}/Makefile.in Makefile:Makefile.in ) Property changes on: firebird/trunk/configure.in ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: firebird/trunk/src/auth/Auth.cpp =================================================================== --- firebird/trunk/src/auth/Auth.cpp 2010-07-22 09:36:15 UTC (rev 51354) +++ firebird/trunk/src/auth/Auth.cpp 2010-07-23 12:04:18 UTC (rev 51355) @@ -28,137 +28,10 @@ #include "firebird.h" #include "../auth/Auth.h" #include "../jrd/ibase.h" +#include "../common/classes/ImplementHelper.h" -#ifdef AUTH_DEBUG - -namespace -{ - void debugName(const char** data, unsigned short* dataSize) - { - // Construct a copy of the literal so we don't violate the constness. - // The caller can do anything with the pointer unless we change getName() signature. - static char name[] = "DEBUG_AUTH"; - *data = name; - *dataSize = strlen(name); - } -} - namespace Auth { -ServerInstance* DebugServer::instance() -{ - return interfaceAlloc<DebugServerInstance>(); -} - -ClientInstance* DebugClient::instance() -{ - return interfaceAlloc<DebugClientInstance>(); -} - -void DebugServer::getName(const char** data, unsigned short* dataSize) -{ - debugName(data, dataSize); -} - -void DebugClient::getName(const char** data, unsigned short* dataSize) -{ - debugName(data, dataSize); -} - -void DebugServer::release() -{ - interfaceFree(this); -} - -void DebugClient::release() -{ - interfaceFree(this); -} - -DebugServerInstance::DebugServerInstance() - : str(*getDefaultMemoryPool()) -{ } - -Result DebugServerInstance::startAuthentication(bool isService, const char* dbName, - const unsigned char* dpb, unsigned int dpbSize, - WriterInterface* writerInterface) -{ - str.erase(); - Firebird::ClumpletReader rdr(isService ? - Firebird::ClumpletReader::spbList : - Firebird::ClumpletReader::dpbList, dpb, dpbSize); - - if (rdr.find(isService ? isc_spb_trusted_auth : isc_dpb_trusted_auth)) - { - str.assign(rdr.getBytes(), rdr.getClumpLength()); - } - - str += '_'; - return AUTH_MORE_DATA; -} - -Result DebugServerInstance::contAuthentication(WriterInterface* writerInterface, - const unsigned char* data, unsigned int size) -{ - //fprintf(stderr, "DebugServerInstance::contAuthentication: %.*s\n", size, data); - writerInterface->add(Firebird::string((const char*) data, size).c_str(), "DEBUG", ""); - return AUTH_SUCCESS; -} - -void DebugServerInstance::getData(const unsigned char** data, unsigned short* dataSize) -{ - *data = reinterpret_cast<const unsigned char*>(str.c_str()); - *dataSize = str.length(); - //fprintf(stderr, "DebugServerInstance::getData: %.*s\n", *dataSize, *data); -} - -void DebugServerInstance::release() -{ - interfaceFree(this); -} - -DebugClientInstance::DebugClientInstance() - : str(*getDefaultMemoryPool()) -{ } - -Result DebugClientInstance::startAuthentication(bool isService, const char*, DpbInterface* dpb) -{ - str = "HAND"; - if (dpb) - { - dpb->add(isService ? isc_spb_trusted_auth : isc_dpb_trusted_auth, - str.c_str(), str.length()); - return AUTH_SUCCESS; - } - return AUTH_MORE_DATA; -} - -Result DebugClientInstance::contAuthentication(const unsigned char* data, unsigned int size) -{ - //fprintf(stderr, "DebugClientInstance::contAuthentication: %.*s\n", size, data); - str.assign(data, size); - str += "SHAKE"; - return AUTH_CONTINUE; -} - -void DebugClientInstance::getData(const unsigned char** data, unsigned short* dataSize) -{ - *data = reinterpret_cast<const unsigned char*>(str.c_str()); - *dataSize = str.length(); - //fprintf(stderr, "DebugClientInstance::getData: %.*s\n", *dataSize, *data); -} - -void DebugClientInstance::release() -{ - interfaceFree(this); -} - -} // namespace Auth - -#endif // AUTH_DEBUG - -namespace Auth { - WriterImplementation::WriterImplementation(Firebird::MemoryPool& pool, bool svcFlag) : Firebird::PermanentStorage(pool), body(getPool()), sequence(0), tag(svcFlag ? isc_spb_auth_block : isc_dpb_auth_block) @@ -202,16 +75,13 @@ } -bool legacy(Plugin* plugin) +bool legacy(Firebird::Plugin* plugin) { const char* legacyTrusted = "WIN_SSPI"; - const short legLength = strlen(legacyTrusted); - const char* nm; - USHORT len; + const unsigned short legLength = strlen(legacyTrusted); + const char* nm = plugin->name(); - plugin->getName(&nm, &len); - - return len == legLength && memcmp(legacyTrusted, nm, legLength) == 0; + return strlen(nm) == legLength && memcmp(legacyTrusted, nm, legLength) == 0; } } // namespace Auth Property changes on: firebird/trunk/src/auth/Auth.cpp ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: firebird/trunk/src/auth/Auth.h =================================================================== --- firebird/trunk/src/auth/Auth.h 2010-07-22 09:36:15 UTC (rev 51354) +++ firebird/trunk/src/auth/Auth.h 2010-07-23 12:04:18 UTC (rev 51355) @@ -38,7 +38,7 @@ namespace Auth { -bool legacy(Plugin* plugin); +bool legacy(Firebird::Plugin* plugin); class WriterImplementation : public WriterInterface, public Firebird::PermanentStorage { @@ -69,7 +69,7 @@ Firebird::ClumpletWriter* body; }; -//#define AUTH_DEBUG +#define AUTH_DEBUG #ifdef AUTH_DEBUG @@ -80,7 +80,6 @@ { public: ServerInstance* instance(); - void getName(const char** data, unsigned short* dataSize); void release(); }; @@ -88,7 +87,6 @@ { public: ClientInstance* instance(); - void getName(const char** data, unsigned short* dataSize); void release(); }; Property changes on: firebird/trunk/src/auth/Auth.h ___________________________________________________________________ Added: svn:mime-type + text/plain Added: firebird/trunk/src/auth/AuthDbg.cpp =================================================================== --- firebird/trunk/src/auth/AuthDbg.cpp (rev 0) +++ firebird/trunk/src/auth/AuthDbg.cpp 2010-07-23 12:04:18 UTC (rev 51355) @@ -0,0 +1,133 @@ +/* + * PROGRAM: Firebird authentication + * MODULE: Auth.cpp + * DESCRIPTION: Implementation of interfaces, passed to plugins + * Plugins loader + * + * 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 Alex Peshkov + * for the Firebird Open Source RDBMS project. + * + * Copyright (c) 2010 Alex Peshkov <peshkoff at mail.ru> + * and all contributors signed below. + * + * All Rights Reserved. + * Contributor(s): ______________________________________. + */ + +#include "firebird.h" +#include "../auth/AuthDbg.h" +#include "../jrd/ibase.h" +#include "../common/classes/ImplementHelper.h" + +#ifdef AUTH_DEBUG + +namespace { + char name[] = "DEBUG_AUTH"; + Firebird::PluginHelper<Auth::DebugServer, Firebird::Plugin::AuthServer, name> debugServer; + Firebird::PluginHelper<Auth::DebugClient, Firebird::Plugin::AuthClient, name> debugClient; +} + +namespace Auth { + +ServerInstance* DebugServer::instance() +{ + return Firebird::interfaceAlloc<DebugServerInstance>(); +} + +ClientInstance* DebugClient::instance() +{ + return Firebird::interfaceAlloc<DebugClientInstance>(); +} + +DebugServerInstance::DebugServerInstance() + : str(*getDefaultMemoryPool()) +{ } + +Result DebugServerInstance::startAuthentication(bool isService, const char* dbName, + const unsigned char* dpb, unsigned int dpbSize, + WriterInterface* writerInterface) +{ + str.erase(); + Firebird::ClumpletReader rdr(isService ? + Firebird::ClumpletReader::spbList : + Firebird::ClumpletReader::dpbList, dpb, dpbSize); + + if (rdr.find(isService ? isc_spb_trusted_auth : isc_dpb_trusted_auth)) + { + str.assign(rdr.getBytes(), rdr.getClumpLength()); + } + + str += '_'; + return AUTH_MORE_DATA; +} + +Result DebugServerInstance::contAuthentication(WriterInterface* writerInterface, + const unsigned char* data, unsigned int size) +{ + //fprintf(stderr, "DebugServerInstance::contAuthentication: %.*s\n", size, data); + writerInterface->add(Firebird::string((const char*) data, size).c_str(), "DEBUG", ""); + return AUTH_SUCCESS; +} + +void DebugServerInstance::getData(const unsigned char** data, unsigned short* dataSize) +{ + *data = reinterpret_cast<const unsigned char*>(str.c_str()); + *dataSize = str.length(); + //fprintf(stderr, "DebugServerInstance::getData: %.*s\n", *dataSize, *data); +} + +void DebugServerInstance::release() +{ + Firebird::interfaceFree(this); +} + +DebugClientInstance::DebugClientInstance() + : str(*getDefaultMemoryPool()) +{ } + +Result DebugClientInstance::startAuthentication(bool isService, const char*, DpbInterface* dpb) +{ + str = "HAND"; + if (dpb) + { + dpb->add(isService ? isc_spb_trusted_auth : isc_dpb_trusted_auth, + str.c_str(), str.length()); + return AUTH_SUCCESS; + } + return AUTH_MORE_DATA; +} + +Result DebugClientInstance::contAuthentication(const unsigned char* data, unsigned int size) +{ + //fprintf(stderr, "DebugClientInstance::contAuthentication: %.*s\n", size, data); + str.assign(data, size); + str += "SHAKE"; + return AUTH_CONTINUE; +} + +void DebugClientInstance::getData(const unsigned char** data, unsigned short* dataSize) +{ + *data = reinterpret_cast<const unsigned char*>(str.c_str()); + *dataSize = str.length(); + //fprintf(stderr, "DebugClientInstance::getData: %.*s\n", *dataSize, *data); +} + +void DebugClientInstance::release() +{ + Firebird::interfaceFree(this); +} + +} // namespace Auth + +#endif // AUTH_DEBUG Property changes on: firebird/trunk/src/auth/AuthDbg.cpp ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: firebird/trunk/src/auth/AuthDbg.h =================================================================== --- firebird/trunk/src/auth/AuthDbg.h (rev 0) +++ firebird/trunk/src/auth/AuthDbg.h 2010-07-23 12:04:18 UTC (rev 51355) @@ -0,0 +1,95 @@ +/* + * PROGRAM: Firebird authentication + * MODULE: Auth.h + * DESCRIPTION: Implementation of interfaces, passed to plugins + * Plugins loader + * + * 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 Alex Peshkov + * for the Firebird Open Source RDBMS project. + * + * Copyright (c) 2010 Alex Peshkov <peshkoff at mail.ru> + * and all contributors signed below. + * + * All Rights Reserved. + * Contributor(s): ______________________________________. + * + * + */ + +#ifndef FB_AUTHDBG_H +#define FB_AUTHDBG_H + +//#define AUTH_DEBUG + +#ifdef AUTH_DEBUG + +#include "../auth/AuthInterface.h" +#include "../common/classes/ClumpletWriter.h" +#include "../common/classes/init.h" +#include "../common/classes/array.h" +#include "../common/classes/fb_string.h" + +namespace Auth { + +// The idea of debug plugin is to send some data from server to client, +// modify them on client and return result (which becomes login name) to the server + +class DebugServer : public ServerPlugin +{ +public: + ServerInstance* instance(); +}; + +class DebugClient : public ClientP... [truncated message content] |
From: <hv...@us...> - 2010-07-23 14:06:35
|
Revision: 51361 http://firebird.svn.sourceforge.net/firebird/?rev=51361&view=rev Author: hvlad Date: 2010-07-23 14:06:29 +0000 (Fri, 23 Jul 2010) Log Message: ----------- Make Windows build work (MSVC8 only) after Alex changes. Some corrections is still required. Modified Paths: -------------- firebird/trunk/builds/win32/defs/fbclient.def firebird/trunk/builds/win32/make_boot.bat firebird/trunk/builds/win32/msvc8/gsec.vcproj firebird/trunk/builds/win32/msvc8/utilities.vcproj firebird/trunk/builds/win32/preprocess.bat firebird/trunk/src/auth/SecurityDatabase/LegacyClient.cpp firebird/trunk/src/auth/trusted/AuthSspi.cpp firebird/trunk/src/auth/trusted/AuthSspi.h firebird/trunk/src/jrd/pwd.cpp firebird/trunk/src/remote/os/win32/srvr_w32.cpp Modified: firebird/trunk/builds/win32/defs/fbclient.def =================================================================== --- firebird/trunk/builds/win32/defs/fbclient.def 2010-07-23 14:01:54 UTC (rev 51360) +++ firebird/trunk/builds/win32/defs/fbclient.def 2010-07-23 14:06:29 UTC (rev 51361) @@ -350,6 +350,9 @@ _isc_expand_dpb=isc_expand_dpb _isc_event_block=isc_event_block + fb_register_plugin + fb_query_plugin + ;----------------- ; OTHER FUNCTIONS ;----------------- Modified: firebird/trunk/builds/win32/make_boot.bat =================================================================== --- firebird/trunk/builds/win32/make_boot.bat 2010-07-23 14:01:54 UTC (rev 51360) +++ firebird/trunk/builds/win32/make_boot.bat 2010-07-23 14:06:29 UTC (rev 51361) @@ -23,15 +23,16 @@ @echo Creating directories @rmdir /s /q %FB_GEN_DIR% 2>nul :: Remove previously generated output, and recreate the directory hierarchy. Note the exceptions to the rule! -for %%v in ( alice burp dsql gpre isql journal jrd misc msgs qli examples ) do ( +for %%v in ( alice auth burp dsql gpre isql journal jrd misc msgs qli examples ) do ( if NOT "%%v"=="journal" (@mkdir %FB_GEN_DIR%\%%v ) ) @rmdir /s /q %FB_GEN_DIR%\utilities 2>nul @mkdir %FB_GEN_DIR%\utilities 2>nul @mkdir %FB_GEN_DIR%\utilities\gstat 2>nul -@mkdir %FB_GEN_DIR%\utilities\gsec 2>nul +@mkdir %FB_GEN_DIR%\auth\SecurityDatabase 2>nul + ::======= call :btyacc if "%ERRLEV%"=="1" goto :END Modified: firebird/trunk/builds/win32/msvc8/gsec.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc8/gsec.vcproj 2010-07-23 14:01:54 UTC (rev 51360) +++ firebird/trunk/builds/win32/msvc8/gsec.vcproj 2010-07-23 14:06:29 UTC (rev 51361) @@ -332,7 +332,7 @@ > </File> <File - RelativePath="..\..\..\gen\$(PlatformName)\utilities\gsec\security.cpp" + RelativePath="..\..\..\src\utilities\gsec\security.cpp" > </File> </Filter> Modified: firebird/trunk/builds/win32/msvc8/utilities.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc8/utilities.vcproj 2010-07-23 14:01:54 UTC (rev 51360) +++ firebird/trunk/builds/win32/msvc8/utilities.vcproj 2010-07-23 14:06:29 UTC (rev 51361) @@ -273,6 +273,10 @@ RelativePath="..\..\..\src\utilities\gsec\gsec.cpp" > </File> + <File + RelativePath="..\..\..\src\utilities\gsec\security.cpp" + > + </File> <Filter Name="epp files" Filter="epp" @@ -289,16 +293,12 @@ RelativePath="..\..\..\src\utilities\rstore.epp" > </File> - <File - RelativePath="..\..\..\src\utilities\security.epp" - > - </File> </Filter> <Filter Name="Generated files" > <File - RelativePath="..\..\..\gen\$(PlatformName)\utilities\gsec\security.cpp" + RelativePath="..\..\..\gen\Win32\auth\SecurityDatabase\LegacyManagement.cpp" > </File> </Filter> Modified: firebird/trunk/builds/win32/preprocess.bat =================================================================== --- firebird/trunk/builds/win32/preprocess.bat 2010-07-23 14:01:54 UTC (rev 51360) +++ firebird/trunk/builds/win32/preprocess.bat 2010-07-23 14:06:29 UTC (rev 51361) @@ -74,6 +74,7 @@ :MASTER_PROCESS @set GPRE=%FB_GEN_DIR%\gpre_embed @for %%i in (alice_meta) do @call :PREPROCESS alice %%i +@for %%i in (LegacyManagement) do @call :PREPROCESS auth/SecurityDatabase %%i @for %%i in (backup, restore, OdsDetection) 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 @@ -85,7 +86,6 @@ @for %%i in (help, meta, proc, show) do @call :PREPROCESS qli %%i @for %%i in (extract, isql, show) do @call :PREPROCESS isql %%i @for %%i in (dba) do @call :PREPROCESS utilities/gstat %%i -@for %%i in (security) do @call :PREPROCESS utilities/gsec %%i @for %%i in (stats) do @call :PREPROCESS utilities %%i @goto :EOF Modified: firebird/trunk/src/auth/SecurityDatabase/LegacyClient.cpp =================================================================== --- firebird/trunk/src/auth/SecurityDatabase/LegacyClient.cpp 2010-07-23 14:01:54 UTC (rev 51360) +++ firebird/trunk/src/auth/SecurityDatabase/LegacyClient.cpp 2010-07-23 14:06:29 UTC (rev 51361) @@ -31,8 +31,10 @@ #include "../common/classes/ImplementHelper.h" namespace { +#ifndef WIN_NT char name[] = "LEGACY_AUTH"; Firebird::PluginHelper<Auth::SecurityDatabaseClient, Firebird::Plugin::AuthClient, name> client; +#endif } namespace Auth { Modified: firebird/trunk/src/auth/trusted/AuthSspi.cpp =================================================================== --- firebird/trunk/src/auth/trusted/AuthSspi.cpp 2010-07-23 14:01:54 UTC (rev 51360) +++ firebird/trunk/src/auth/trusted/AuthSspi.cpp 2010-07-23 14:06:29 UTC (rev 51361) @@ -31,7 +31,16 @@ #include "../common/classes/ClumpletReader.h" #include "../common/classes/Interface.h" +#include "../common/classes/ImplementHelper.h" +namespace { +#ifndef WIN_NT + char name[] = "WIN_SSPI"; + Firebird::PluginHelper<Auth::WinSspiServer, Firebird::Plugin::AuthServer, name> server; + Firebird::PluginHelper<Auth::WinSspiClient, Firebird::Plugin::AuthClient, name> client; +#endif +} + using namespace Firebird; namespace @@ -336,26 +345,7 @@ return interfaceAlloc<WinSspiClientInstance>(); } -void WinSspiServer::getName(const char** data, unsigned short* dataSize) -{ - authName(data, dataSize); -} -void WinSspiClient::getName(const char** data, unsigned short* dataSize) -{ - authName(data, dataSize); -} - -void WinSspiServer::release() -{ - interfaceFree(this); -} - -void WinSspiClient::release() -{ - interfaceFree(this); -} - WinSspiServerInstance::WinSspiServerInstance() : sspiData(*getDefaultMemoryPool()) { } Modified: firebird/trunk/src/auth/trusted/AuthSspi.h =================================================================== --- firebird/trunk/src/auth/trusted/AuthSspi.h 2010-07-23 14:01:54 UTC (rev 51360) +++ firebird/trunk/src/auth/trusted/AuthSspi.h 2010-07-23 14:06:29 UTC (rev 51361) @@ -99,16 +99,12 @@ { public: ServerInstance* instance(); - void getName(const char** data, unsigned short* dataSize); - void release(); }; class WinSspiClient : public ClientPlugin { public: ClientInstance* instance(); - void getName(const char** data, unsigned short* dataSize); - void release(); }; class WinSspiServerInstance : public ServerInstance Modified: firebird/trunk/src/jrd/pwd.cpp =================================================================== --- firebird/trunk/src/jrd/pwd.cpp 2010-07-23 14:01:54 UTC (rev 51360) +++ firebird/trunk/src/jrd/pwd.cpp 2010-07-23 14:06:29 UTC (rev 51361) @@ -48,9 +48,10 @@ namespace { // register plugin - +#ifndef WIN_NT char name[] = "LEGACY_AUTH"; PluginHelper<Auth::SecurityDatabaseServer, Firebird::Plugin::AuthServer, name> server; +#endif // temporal implementation of timer Modified: firebird/trunk/src/remote/os/win32/srvr_w32.cpp =================================================================== --- firebird/trunk/src/remote/os/win32/srvr_w32.cpp 2010-07-23 14:01:54 UTC (rev 51360) +++ firebird/trunk/src/remote/os/win32/srvr_w32.cpp 2010-07-23 14:06:29 UTC (rev 51361) @@ -109,7 +109,36 @@ #include "../../../common/classes/FpeControl.h" #include "../jrd/ibase.h" +// hvlad: following code registering plugins is temporary and should be +// moved at appropriate places +#include "../common/classes/ImplementHelper.h" +#include "../auth/trusted/AuthSspi.h" +#include "../auth/SecurityDatabase/LegacyClient.h" +#include "../auth/SecurityDatabase/LegacyManagement.h" +#include "../jrd/jrd_pwd.h" + +namespace { + + // from AuthSspi + char name1[] = "WIN_SSPI"; + Firebird::PluginHelper<Auth::WinSspiServer, Firebird::Plugin::AuthServer, name1> server1; + Firebird::PluginHelper<Auth::WinSspiClient, Firebird::Plugin::AuthClient, name1> client1; + + // from LegacyClient + char name2[] = "LEGACY_AUTH"; + Firebird::PluginHelper<Auth::SecurityDatabaseClient, Firebird::Plugin::AuthClient, name2> client2; + + // from LegacyManagement + char name3[] = "LEGACY_AUTH"; + Firebird::PluginHelper<Auth::SecurityDatabaseManagement, Firebird::Plugin::UserManagement, name3> manage3; + + // from pwd + char name4[] = "LEGACY_AUTH"; + Firebird::PluginHelper<Auth::SecurityDatabaseServer, Firebird::Plugin::AuthServer, name4> server4; +} + + static THREAD_ENTRY_DECLARE inet_connect_wait_thread(THREAD_ENTRY_PARAM); static THREAD_ENTRY_DECLARE wnet_connect_wait_thread(THREAD_ENTRY_PARAM); static THREAD_ENTRY_DECLARE xnet_connect_wait_thread(THREAD_ENTRY_PARAM); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <asf...@us...> - 2010-07-26 02:38:13
|
Revision: 51368 http://firebird.svn.sourceforge.net/firebird/?rev=51368&view=rev Author: asfernandes Date: 2010-07-26 02:37:57 +0000 (Mon, 26 Jul 2010) Log Message: ----------- Refactor CREATE/ALTER/DROP/RECREATE TABLE and DROP VIEW commands Modified Paths: -------------- firebird/trunk/lang_helpers/gds_codes.ftn firebird/trunk/lang_helpers/gds_codes.pas firebird/trunk/src/common/classes/ByteChunk.h firebird/trunk/src/common/classes/objects_array.h firebird/trunk/src/dsql/BlrWriter.h firebird/trunk/src/dsql/DdlNodes.epp firebird/trunk/src/dsql/DdlNodes.h firebird/trunk/src/dsql/Nodes.h firebird/trunk/src/dsql/PackageNodes.epp firebird/trunk/src/dsql/PackageNodes.h firebird/trunk/src/dsql/ddl.cpp firebird/trunk/src/dsql/ddl_proto.h firebird/trunk/src/dsql/dsql.h firebird/trunk/src/dsql/node.h firebird/trunk/src/dsql/parse.y firebird/trunk/src/dsql/pass1.cpp firebird/trunk/src/gpre/gpre.h firebird/trunk/src/include/gen/codetext.h firebird/trunk/src/include/gen/iberror.h firebird/trunk/src/include/gen/msgs.h firebird/trunk/src/include/gen/sql_code.h firebird/trunk/src/include/gen/sql_state.h firebird/trunk/src/jrd/constants.h firebird/trunk/src/jrd/drq.h firebird/trunk/src/jrd/dyn.epp firebird/trunk/src/jrd/dyn_def.epp firebird/trunk/src/jrd/dyn_del.epp firebird/trunk/src/jrd/dyn_df_proto.h firebird/trunk/src/jrd/dyn_dl_proto.h firebird/trunk/src/jrd/dyn_md_proto.h firebird/trunk/src/jrd/dyn_mod.epp firebird/trunk/src/jrd/dyn_ut_proto.h firebird/trunk/src/jrd/dyn_util.epp firebird/trunk/src/msgs/facilities2.sql firebird/trunk/src/msgs/messages2.sql firebird/trunk/src/msgs/system_errors2.sql Modified: firebird/trunk/lang_helpers/gds_codes.ftn =================================================================== --- firebird/trunk/lang_helpers/gds_codes.ftn 2010-07-26 02:14:48 UTC (rev 51367) +++ firebird/trunk/lang_helpers/gds_codes.ftn 2010-07-26 02:37:57 UTC (rev 51368) @@ -1996,6 +1996,86 @@ PARAMETER (GDS__dsql_invalid_type_neg = 336397256) INTEGER*4 GDS__dsql_max_distinct_items PARAMETER (GDS__dsql_max_distinct_items = 336397257) + INTEGER*4 GDS__dsql_alter_charset_failed + PARAMETER (GDS__dsql_alter_charset_failed = 336397258) + INTEGER*4 GDS__dsql_comment_on_failed + PARAMETER (GDS__dsql_comment_on_failed = 336397259) + INTEGER*4 GDS__dsql_create_func_failed + PARAMETER (GDS__dsql_create_func_failed = 336397260) + INTEGER*4 GDS__dsql_alter_func_failed + PARAMETER (GDS__dsql_alter_func_failed = 336397261) + INTEGER*4 GDS__dsql_create_alter_func_failed + PARAMETER (GDS__dsql_create_alter_func_failed = 336397262) + INTEGER*4 GDS__dsql_drop_func_failed + PARAMETER (GDS__dsql_drop_func_failed = 336397263) + INTEGER*4 GDS__dsql_recreate_func_failed + PARAMETER (GDS__dsql_recreate_func_failed = 336397264) + INTEGER*4 GDS__dsql_create_proc_failed + PARAMETER (GDS__dsql_create_proc_failed = 336397265) + INTEGER*4 GDS__dsql_alter_proc_failed + PARAMETER (GDS__dsql_alter_proc_failed = 336397266) + INTEGER*4 GDS__dsql_create_alter_proc_failed + PARAMETER (GDS__dsql_create_alter_proc_failed = 336397267) + INTEGER*4 GDS__dsql_drop_proc_failed + PARAMETER (GDS__dsql_drop_proc_failed = 336397268) + INTEGER*4 GDS__dsql_recreate_proc_failed + PARAMETER (GDS__dsql_recreate_proc_failed = 336397269) + INTEGER*4 GDS__dsql_create_trigger_failed + PARAMETER (GDS__dsql_create_trigger_failed = 336397270) + INTEGER*4 GDS__dsql_alter_trigger_failed + PARAMETER (GDS__dsql_alter_trigger_failed = 336397271) + INTEGER*4 GDS__dsql_create_alter_trigger_failed + PARAMETER (GDS__dsql_create_alter_trigger_failed = 336397272) + INTEGER*4 GDS__dsql_drop_trigger_failed + PARAMETER (GDS__dsql_drop_trigger_failed = 336397273) + INTEGER*4 GDS__dsql_recreate_trigger_failed + PARAMETER (GDS__dsql_recreate_trigger_failed = 336397274) + INTEGER*4 GDS__dsql_create_collation_failed + PARAMETER (GDS__dsql_create_collation_failed = 336397275) + INTEGER*4 GDS__dsql_drop_collation_failed + PARAMETER (GDS__dsql_drop_collation_failed = 336397276) + INTEGER*4 GDS__dsql_create_domain_failed + PARAMETER (GDS__dsql_create_domain_failed = 336397277) + INTEGER*4 GDS__dsql_alter_domain_failed + PARAMETER (GDS__dsql_alter_domain_failed = 336397278) + INTEGER*4 GDS__dsql_drop_domain_failed + PARAMETER (GDS__dsql_drop_domain_failed = 336397279) + INTEGER*4 GDS__dsql_create_except_failed + PARAMETER (GDS__dsql_create_except_failed = 336397280) + INTEGER*4 GDS__dsql_alter_except_failed + PARAMETER (GDS__dsql_alter_except_failed = 336397281) + INTEGER*4 GDS__dsql_create_alter_except_failed + PARAMETER (GDS__dsql_create_alter_except_failed = 336397282) + INTEGER*4 GDS__dsql_recreate_except_failed + PARAMETER (GDS__dsql_recreate_except_failed = 336397283) + INTEGER*4 GDS__dsql_drop_except_failed + PARAMETER (GDS__dsql_drop_except_failed = 336397284) + INTEGER*4 GDS__dsql_create_sequence_failed + PARAMETER (GDS__dsql_create_sequence_failed = 336397285) + INTEGER*4 GDS__dsql_create_table_failed + PARAMETER (GDS__dsql_create_table_failed = 336397286) + INTEGER*4 GDS__dsql_alter_table_failed + PARAMETER (GDS__dsql_alter_table_failed = 336397287) + INTEGER*4 GDS__dsql_drop_table_failed + PARAMETER (GDS__dsql_drop_table_failed = 336397288) + INTEGER*4 GDS__dsql_recreate_table_failed + PARAMETER (GDS__dsql_recreate_table_failed = 336397289) + INTEGER*4 GDS__dsql_create_pack_failed + PARAMETER (GDS__dsql_create_pack_failed = 336397290) + INTEGER*4 GDS__dsql_alter_pack_failed + PARAMETER (GDS__dsql_alter_pack_failed = 336397291) + INTEGER*4 GDS__dsql_create_alter_pack_failed + PARAMETER (GDS__dsql_create_alter_pack_failed = 336397292) + INTEGER*4 GDS__dsql_drop_pack_failed + PARAMETER (GDS__dsql_drop_pack_failed = 336397293) + INTEGER*4 GDS__dsql_recreate_pack_failed + PARAMETER (GDS__dsql_recreate_pack_failed = 336397294) + INTEGER*4 GDS__dsql_create_pack_body_failed + PARAMETER (GDS__dsql_create_pack_body_failed = 336397295) + INTEGER*4 GDS__dsql_drop_pack_body_failed + PARAMETER (GDS__dsql_drop_pack_body_failed = 336397296) + INTEGER*4 GDS__dsql_recreate_pack_body_failed + PARAMETER (GDS__dsql_recreate_pack_body_failed = 336397297) INTEGER*4 GDS__gsec_cant_open_db PARAMETER (GDS__gsec_cant_open_db = 336723983) INTEGER*4 GDS__gsec_switches_error Modified: firebird/trunk/lang_helpers/gds_codes.pas =================================================================== --- firebird/trunk/lang_helpers/gds_codes.pas 2010-07-26 02:14:48 UTC (rev 51367) +++ firebird/trunk/lang_helpers/gds_codes.pas 2010-07-26 02:37:57 UTC (rev 51368) @@ -1005,6 +1005,46 @@ gds_dsql_nostring_neg_dial3 = 336397255; gds_dsql_invalid_type_neg = 336397256; gds_dsql_max_distinct_items = 336397257; + gds_dsql_alter_charset_failed = 336397258; + gds_dsql_comment_on_failed = 336397259; + gds_dsql_create_func_failed = 336397260; + gds_dsql_alter_func_failed = 336397261; + gds_dsql_create_alter_func_failed = 336397262; + gds_dsql_drop_func_failed = 336397263; + gds_dsql_recreate_func_failed = 336397264; + gds_dsql_create_proc_failed = 336397265; + gds_dsql_alter_proc_failed = 336397266; + gds_dsql_create_alter_proc_failed = 336397267; + gds_dsql_drop_proc_failed = 336397268; + gds_dsql_recreate_proc_failed = 336397269; + gds_dsql_create_trigger_failed = 336397270; + gds_dsql_alter_trigger_failed = 336397271; + gds_dsql_create_alter_trigger_failed = 336397272; + gds_dsql_drop_trigger_failed = 336397273; + gds_dsql_recreate_trigger_failed = 336397274; + gds_dsql_create_collation_failed = 336397275; + gds_dsql_drop_collation_failed = 336397276; + gds_dsql_create_domain_failed = 336397277; + gds_dsql_alter_domain_failed = 336397278; + gds_dsql_drop_domain_failed = 336397279; + gds_dsql_create_except_failed = 336397280; + gds_dsql_alter_except_failed = 336397281; + gds_dsql_create_alter_except_failed = 336397282; + gds_dsql_recreate_except_failed = 336397283; + gds_dsql_drop_except_failed = 336397284; + gds_dsql_create_sequence_failed = 336397285; + gds_dsql_create_table_failed = 336397286; + gds_dsql_alter_table_failed = 336397287; + gds_dsql_drop_table_failed = 336397288; + gds_dsql_recreate_table_failed = 336397289; + gds_dsql_create_pack_failed = 336397290; + gds_dsql_alter_pack_failed = 336397291; + gds_dsql_create_alter_pack_failed = 336397292; + gds_dsql_drop_pack_failed = 336397293; + gds_dsql_recreate_pack_failed = 336397294; + gds_dsql_create_pack_body_failed = 336397295; + gds_dsql_drop_pack_body_failed = 336397296; + gds_dsql_recreate_pack_body_failed = 336397297; gds_gsec_cant_open_db = 336723983; gds_gsec_switches_error = 336723984; gds_gsec_no_op_spec = 336723985; Modified: firebird/trunk/src/common/classes/ByteChunk.h =================================================================== --- firebird/trunk/src/common/classes/ByteChunk.h 2010-07-26 02:14:48 UTC (rev 51367) +++ firebird/trunk/src/common/classes/ByteChunk.h 2010-07-26 02:37:57 UTC (rev 51368) @@ -24,6 +24,7 @@ #define COMMON_BYTE_CHUNK_H #include "../common/classes/array.h" +#include "../common/classes/fb_string.h" namespace Firebird { @@ -46,8 +47,22 @@ { } - const UCHAR* const data; - const size_t length; + // String buffer. + ByteChunk(string& str) + : data((UCHAR*) str.c_str()), + length(str.length()) + { + } + + // Empty. + ByteChunk() + : data(NULL), + length(0) + { + } + + const UCHAR* data; + size_t length; }; } // namespace Firebird Modified: firebird/trunk/src/common/classes/objects_array.h =================================================================== --- firebird/trunk/src/common/classes/objects_array.h 2010-07-26 02:14:48 UTC (rev 51367) +++ firebird/trunk/src/common/classes/objects_array.h 2010-07-26 02:37:57 UTC (rev 51368) @@ -279,6 +279,11 @@ size_t getCount() const {return inherited::getCount();} size_t getCapacity() const {return inherited::getCapacity();} + bool hasData() const + { + return getCount() != 0; + } + bool isEmpty() const { return getCount() == 0; Modified: firebird/trunk/src/dsql/BlrWriter.h =================================================================== --- firebird/trunk/src/dsql/BlrWriter.h 2010-07-26 02:14:48 UTC (rev 51367) +++ firebird/trunk/src/dsql/BlrWriter.h 2010-07-26 02:37:57 UTC (rev 51368) @@ -36,6 +36,9 @@ class BlrWriter : public Firebird::PermanentStorage { public: + typedef Firebird::HalfStaticArray<UCHAR, 1024> BlrData; + typedef Firebird::HalfStaticArray<UCHAR, 128> DebugData; + explicit BlrWriter(MemoryPool& p) : PermanentStorage(p), blrData(p), @@ -44,6 +47,10 @@ { } + virtual ~BlrWriter() + { + } + void appendUChar(const UCHAR byte) { blrData.add(byte); @@ -126,8 +133,8 @@ void putDebugArgument(UCHAR, USHORT, const TEXT*); void appendDebugInfo(); - Firebird::HalfStaticArray<UCHAR, 1024>& getBlrData() { return blrData; } - Firebird::HalfStaticArray<UCHAR, 128>& getDebugData() { return debugData; } + BlrData& getBlrData() { return blrData; } + DebugData& getDebugData() { return debugData; } ULONG getBaseOffset() const { return baseOffset; } void setBaseOffset(ULONG value) { baseOffset = value; } @@ -138,8 +145,8 @@ virtual bool isDdlDyn() = 0; private: - Firebird::HalfStaticArray<UCHAR, 1024> blrData; - Firebird::HalfStaticArray<UCHAR, 128> debugData; + BlrData blrData; + DebugData debugData; ULONG baseOffset; // place to go back and stuff in blr length }; Modified: firebird/trunk/src/dsql/DdlNodes.epp =================================================================== --- firebird/trunk/src/dsql/DdlNodes.epp 2010-07-26 02:14:48 UTC (rev 51367) +++ firebird/trunk/src/dsql/DdlNodes.epp 2010-07-26 02:37:57 UTC (rev 51368) @@ -19,10 +19,12 @@ */ #include "firebird.h" +#include "dyn_consts.h" #include "../jrd/common.h" #include "../dsql/DdlNodes.h" #include "../dsql/node.h" #include "../jrd/blr.h" +#include "../jrd/btr.h" #include "../jrd/dyn.h" #include "../jrd/flags.h" #include "../jrd/intl.h" @@ -30,6 +32,7 @@ #include "../jrd/msg_encode.h" #include "../jrd/obj.h" #include "../jrd/tra.h" +#include "../jrd/os/path_utils.h" #include "../jrd/IntlManager.h" #include "../jrd/PreparedStatement.h" #include "../jrd/blb_proto.h" @@ -39,7 +42,9 @@ #include "../jrd/dyn_ut_proto.h" #include "../jrd/exe_proto.h" #include "../jrd/intl_proto.h" +#include "../jrd/isc_f_proto.h" #include "../jrd/met_proto.h" +#include "../jrd/scl_proto.h" #include "../jrd/vio_proto.h" #include "../dsql/ddl_proto.h" #include "../dsql/errd_proto.h" @@ -49,14 +54,39 @@ #include "../dsql/pass1_proto.h" #include "../common/StatusArg.h" -using namespace Firebird; - namespace Jrd { using namespace Firebird; using namespace Dsql; -static void rethrowMetaException(const status_exception& ex, ISC_STATUS code, bool metaDataException); +static void checkForeignKeyTempScope(thread_db* tdbb, jrd_tra* transaction, + const MetaName& childRelName, const MetaName& masterIndexName); +static void checkSpTrigDependency(thread_db* tdbb, jrd_tra* transaction, + const MetaName& relationName, const MetaName& fieldName); +static void checkViewDependency(thread_db* tdbb, jrd_tra* transaction, + const MetaName& relationName, const MetaName& fieldName); +static void clearPermanentField(dsql_rel* relation, bool permanent); +static void deleteKeyConstraint(thread_db* tdbb, jrd_tra* transaction, + const MetaName& relationName, const MetaName& constraintName, const MetaName& indexName); +static bool fieldExists(thread_db* tdbb, jrd_tra* transaction, const MetaName& relationName, + const MetaName& fieldName); +static void makeRelationScopeName(const MetaName& name, const rel_t type, string& message); +static void modifyLocalFieldPosition(thread_db* tdbb, jrd_tra* transaction, + const MetaName& relationName, const MetaName& fieldName, USHORT newPosition, + USHORT existingPosition); +static rel_t relationType(SSHORT relationTypeNull, SSHORT relationType); +static void saveRelation(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, + const dsql_str* relationName, bool creating); +static void updateRdbFields(const TypeClause& type, + SSHORT& fieldType, + SSHORT& fieldLength, + SSHORT& fieldSubTypeNull, SSHORT& fieldSubType, + SSHORT& fieldScaleNull, SSHORT& fieldScale, + SSHORT& characterSetIdNull, SSHORT& characterSetId, + SSHORT& characterLengthNull, SSHORT& characterLength, + SSHORT& fieldPrecisionNull, SSHORT& fieldPrecision, + SSHORT& collationIdNull, SSHORT& collationId, + SSHORT& segmentLengthNull, SSHORT& segmentLength); DATABASE DB = STATIC "ODS.RDB"; @@ -64,25 +94,376 @@ //---------------------- -// Rethrow an exception with isc_no_meta_update and code prefix when necessary. -static void rethrowMetaException(const status_exception& ex, ISC_STATUS code, bool metaDataException) +// Check temporary table reference rules between given child relation and master +// relation (owner of given PK/UK index). +static void checkForeignKeyTempScope(thread_db* tdbb, jrd_tra* transaction, + const MetaName& childRelName, const MetaName& masterIndexName) { - Arg::StatusVector newVector; - const ISC_STATUS* status = ex.value(); + AutoCacheRequest request(tdbb, drq_l_rel_info, DYN_REQUESTS); + bool error = false; + string master, child; - if (metaDataException) + FOR(REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + RLC_M IN RDB$RELATION_CONSTRAINTS CROSS + REL_C IN RDB$RELATIONS CROSS + REL_M IN RDB$RELATIONS + WITH (RLC_M.RDB$CONSTRAINT_TYPE EQ UNIQUE_CNSTRT OR + RLC_M.RDB$CONSTRAINT_TYPE EQ PRIMARY_KEY) AND + RLC_M.RDB$INDEX_NAME EQ masterIndexName.c_str() AND + REL_C.RDB$RELATION_NAME EQ childRelName.c_str() AND + REL_M.RDB$RELATION_NAME EQ RLC_M.RDB$RELATION_NAME { - if (status[1] != isc_no_meta_update) - newVector << Arg::Gds(isc_no_meta_update); + const rel_t masterType = relationType(REL_M.RDB$RELATION_TYPE.NULL, REL_M.RDB$RELATION_TYPE); + fb_assert(masterType == rel_persistent || + masterType == rel_global_temp_preserve || + masterType == rel_global_temp_delete); - if (code != 0) - newVector << Arg::Gds(code); + const rel_t childType = relationType(REL_C.RDB$RELATION_TYPE.NULL, REL_C.RDB$RELATION_TYPE); + fb_assert(childType == rel_persistent || + childType == rel_global_temp_preserve || + childType == rel_global_temp_delete); + + error = masterType != childType && + !(masterType == rel_global_temp_preserve && childType == rel_global_temp_delete); + + if (error) + { + makeRelationScopeName(masterIndexName, masterType, master); + makeRelationScopeName(childRelName, childType, child); + } } + END_FOR - newVector.append(Arg::StatusVector(status)); - status_exception::raise(newVector); + if (error) + { + // Msg 232 : "%s can't reference %s" + status_exception::raise(Arg::Gds(ENCODE_ISC_MSG(232, DYN_MSG_FAC)) << child << master); + } } +// Check temporary table reference rules between just created child relation and all +// its master relations. +static void checkRelationTempScope(thread_db* tdbb, jrd_tra* transaction, + const MetaName& childRelName, const rel_t childType) +{ + if (childType != rel_persistent && + childType != rel_global_temp_preserve && + childType != rel_global_temp_delete) + { + return; + } + + AutoCacheRequest request(tdbb, drq_l_rel_info2, DYN_REQUESTS); + bool error = false; + string master, child; + + FOR(REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + RLC_C IN RDB$RELATION_CONSTRAINTS CROSS + IND_C IN RDB$INDICES CROSS + IND_M IN RDB$INDICES CROSS + REL_M IN RDB$RELATIONS + WITH RLC_C.RDB$CONSTRAINT_TYPE EQ FOREIGN_KEY AND + RLC_C.RDB$RELATION_NAME EQ childRelName.c_str() AND + IND_C.RDB$INDEX_NAME EQ RLC_C.RDB$INDEX_NAME AND + IND_M.RDB$INDEX_NAME EQ IND_C.RDB$FOREIGN_KEY AND + IND_M.RDB$RELATION_NAME EQ REL_M.RDB$RELATION_NAME + { + const rel_t masterType = relationType(REL_M.RDB$RELATION_TYPE.NULL, REL_M.RDB$RELATION_TYPE); + fb_assert(masterType == rel_persistent || + masterType == rel_global_temp_preserve || + masterType == rel_global_temp_delete); + + error = masterType != childType && + !(masterType == rel_global_temp_preserve && childType == rel_global_temp_delete); + + if (error) + { + makeRelationScopeName(REL_M.RDB$RELATION_NAME, masterType, master); + makeRelationScopeName(childRelName, childType, child); + } + } + END_FOR + + if (error) + { + // Msg 232 : "%s can't reference %s" + status_exception::raise(Arg::Gds(ENCODE_ISC_MSG(232, DYN_MSG_FAC)) << child << master); + } +} + +// Checks to see if the given field is referenced in a stored procedure or trigger. +// If the field is referenced, throw. +static void checkSpTrigDependency(thread_db* tdbb, jrd_tra* transaction, + const MetaName& relationName, const MetaName& fieldName) +{ + AutoRequest request; + + FOR(REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + FIRST 1 + DEP IN RDB$DEPENDENCIES + WITH DEP.RDB$DEPENDED_ON_NAME EQ relationName.c_str() AND + DEP.RDB$FIELD_NAME EQ fieldName.c_str() + { + MetaName depName(DEP.RDB$DEPENDENT_NAME); + + // msg 206: Column %s from table %s is referenced in %s. + status_exception::raise( + Arg::Gds(ENCODE_ISC_MSG(206, DYN_MSG_FAC)) << fieldName << relationName << depName); + } + END_FOR +} + +// Checks to see if the given field is referenced in a view. If it is, throw. +static void checkViewDependency(thread_db* tdbb, jrd_tra* transaction, + const MetaName& relationName, const MetaName& fieldName) +{ + AutoRequest request; + + FOR(REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + FIRST 1 + X IN RDB$RELATION_FIELDS CROSS + Y IN RDB$RELATION_FIELDS CROSS + Z IN RDB$VIEW_RELATIONS + WITH X.RDB$RELATION_NAME EQ relationName.c_str() AND + X.RDB$FIELD_NAME EQ fieldName.c_str() AND + X.RDB$FIELD_NAME EQ Y.RDB$BASE_FIELD AND + X.RDB$FIELD_SOURCE EQ Y.RDB$FIELD_SOURCE AND + Y.RDB$RELATION_NAME EQ Z.RDB$VIEW_NAME AND + X.RDB$RELATION_NAME EQ Z.RDB$RELATION_NAME AND + Y.RDB$VIEW_CONTEXT EQ Z.RDB$VIEW_CONTEXT + { + MetaName viewName(Z.RDB$VIEW_NAME); + + // msg 206: Column %s from table %s is referenced in %s. + status_exception::raise( + Arg::Gds(ENCODE_ISC_MSG(206, DYN_MSG_FAC)) << fieldName << relationName << viewName); + } + END_FOR +} + +// Removes temporary pool pointers from field, stored in permanent cache. +static void clearPermanentField(dsql_rel* relation, bool permanent) +{ + if (relation && relation->rel_fields && permanent) + { + relation->rel_fields->fld_procedure = NULL; + relation->rel_fields->fld_ranges = NULL; + relation->rel_fields->fld_character_set = NULL; + relation->rel_fields->fld_sub_type_name = NULL; + relation->rel_fields->fld_relation = relation; + } +} + +// Delete a record from RDB$RELATION_CONSTRAINTS based on a constraint name. +// +// On deleting from RDB$RELATION_CONSTRAINTS, 2 system triggers fire: +// +// (A) pre delete trigger: pre_delete_constraint, will: +// +// 1. delete a record first from RDB$REF_CONSTRAINTS where +// RDB$REF_CONSTRAINTS.RDB$CONSTRAINT_NAME = +// RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_NAME +// +// (B) post delete trigger: post_delete_constraint will: +// +// 1. also delete a record from RDB$INDICES where +// RDB$INDICES.RDB$INDEX_NAME = +// RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME +// +// 2. also delete a record from RDB$INDEX_SEGMENTS where +// RDB$INDEX_SEGMENTS.RDB$INDEX_NAME = +// RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME +static void deleteKeyConstraint(thread_db* tdbb, jrd_tra* transaction, + const MetaName& relationName, const MetaName& constraintName, const MetaName& indexName) +{ + SET_TDBB(tdbb); + + AutoCacheRequest request(tdbb, drq_e_rel_const, DYN_REQUESTS); + bool found = false; + + FOR(REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + RC IN RDB$RELATION_CONSTRAINTS + WITH RC.RDB$CONSTRAINT_NAME EQ constraintName.c_str() AND + RC.RDB$CONSTRAINT_TYPE EQ FOREIGN_KEY AND + RC.RDB$RELATION_NAME EQ relationName.c_str() AND + RC.RDB$INDEX_NAME EQ indexName.c_str() + { + found = true; + ERASE RC; + } + END_FOR + + if (!found) + { + // msg 130: "CONSTRAINT %s does not exist." + status_exception::raise( + Arg::Gds(ENCODE_ISC_MSG(130, DYN_MSG_FAC)) << constraintName); + } +} + +// Checks to see if the given field already exists in a relation. +static bool fieldExists(thread_db* tdbb, jrd_tra* transaction, const MetaName& relationName, + const MetaName& fieldName) +{ + AutoRequest request; + bool found = false; + + FOR(REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + FLD IN RDB$RELATION_FIELDS + WITH FLD.RDB$RELATION_NAME EQ relationName.c_str() AND + FLD.RDB$FIELD_NAME EQ fieldName.c_str() + { + found = true; + } + END_FOR + + return found; +} + +// Make string with relation name and type of its temporary scope. +static void makeRelationScopeName(const MetaName& name, const rel_t type, string& message) +{ + const char* scope = NULL; + + if (type == rel_global_temp_preserve) + scope = REL_SCOPE_GTT_PRESERVE; + else if (type == rel_global_temp_delete) + scope = REL_SCOPE_GTT_DELETE; + else + scope = REL_SCOPE_PERSISTENT; + + message.printf(scope, name.c_str()); +} + +// Alters the position of a field with respect to the +// other fields in the relation. This will only affect +// the order in which the fields will be returned when either +// viewing the relation or performing select * from the relation. +// +// The rules of engagement are as follows: +// if new_position > original position +// increase RDB$FIELD_POSITION for all fields with RDB$FIELD_POSITION +// between the new_position and existing position of the field +// then update the position of the field being altered. +// just update the position +// +// if new_position < original position +// decrease RDB$FIELD_POSITION for all fields with RDB$FIELD_POSITION +// between the new_position and existing position of the field +// then update the position of the field being altered. +// +// if new_position == original_position -- no_op +static void modifyLocalFieldPosition(thread_db* tdbb, jrd_tra* transaction, + const MetaName& relationName, const MetaName& fieldName, USHORT newPosition, + USHORT existingPosition) +{ + // Make sure that there are no duplicate field positions and no gaps in the position sequence. + // (gaps are introduced when fields are removed) + + AutoRequest request; + USHORT newPos = 0; + + FOR(REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + FLD IN RDB$RELATION_FIELDS + WITH FLD.RDB$RELATION_NAME EQ relationName.c_str() + SORTED BY ASCENDING FLD.RDB$FIELD_POSITION + { + if (FLD.RDB$FIELD_POSITION != newPos) + { + MODIFY FLD USING + FLD.RDB$FIELD_POSITION = newPos; + END_MODIFY + } + + ++newPos; + } + END_FOR + + // Find the position of the last field in the relation. + SLONG maxPosition = -1; + DYN_UTIL_generate_field_position(tdbb, NULL, relationName, &maxPosition); + + // If the existing position of the field is less than the new position of + // the field, subtract 1 to move the fields to their new positions otherwise, + // increase the value in RDB$FIELD_POSITION by one. + + bool moveDown = false; + if (existingPosition < newPosition) + moveDown = true; + + // Retrieve the records for the fields which have a position between the + // existing field position and the new field position. + + request.reset(); + + FOR(REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + FLD IN RDB$RELATION_FIELDS + WITH FLD.RDB$RELATION_NAME EQ relationName.c_str() AND + FLD.RDB$FIELD_POSITION >= MIN(newPosition, existingPosition) AND + FLD.RDB$FIELD_POSITION <= MAX(newPosition, existingPosition) + { + MODIFY FLD USING + // If the field is the one we want, change the position, otherwise + // increase the value of RDB$FIELD_POSITION. + if (fieldName == FLD.RDB$FIELD_NAME) + { + if (newPosition > maxPosition) + { + // This prevents gaps in the position sequence of the fields. + FLD.RDB$FIELD_POSITION = maxPosition; + } + else + FLD.RDB$FIELD_POSITION = newPosition; + } + else + { + if (moveDown) + FLD.RDB$FIELD_POSITION = FLD.RDB$FIELD_POSITION - 1; + else + FLD.RDB$FIELD_POSITION = FLD.RDB$FIELD_POSITION + 1; + } + + FLD.RDB$FIELD_POSITION.NULL = FALSE; + END_MODIFY + } + END_FOR +} + +// Convert RDB$RELATION_TYPE to rel_t type. +static rel_t relationType(SSHORT relationTypeNull, SSHORT relationType) +{ + return relationTypeNull ? rel_persistent : rel_t(relationType); +} + +// Save the name of the relation or view currently being defined. This is done to support definition +// of triggers which will depend on the metadata created in this statement. +static void saveRelation(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, + const dsql_str* relationName, bool creating) +{ + //// TODO: Verify "creating" usage when using this function for views. + + DsqlCompiledStatement* statement = dsqlScratch->getStatement(); + + if (dsqlScratch->flags & DsqlCompilerScratch::FLAG_METADATA_SAVED) + return; + + dsqlScratch->flags |= DsqlCompilerScratch::FLAG_METADATA_SAVED; + + dsql_rel* relation; + + if (!creating) + relation = METD_get_relation(dsqlScratch->getTransaction(), dsqlScratch, relationName); + else + { + MemoryPool& pool = *tdbb->getDefaultPool(); + relation = FB_NEW(pool) dsql_rel(pool); + relation->rel_name = relationName->str_data; + relation->rel_flags = REL_creating; + } + + dsqlScratch->relation = relation; +} + // Update RDB$FIELDS received by reference. static void updateRdbFields(const TypeClause& type, SSHORT& fieldType, @@ -169,6 +550,25 @@ //---------------------- +// Delete a security class. +bool DdlNode::deleteSecurityClass(thread_db* tdbb, jrd_tra* transaction, + const MetaName& secClass) +{ + AutoCacheRequest request(tdbb, drq_e_class, DYN_REQUESTS); + bool found = false; + + FOR(REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + SC IN RDB$SECURITY_CLASSES + WITH SC.RDB$SECURITY_CLASS EQ secClass.c_str() + { + found = true; + ERASE SC; + } + END_FOR + + return found; +} + void DdlNode::executeDdlTrigger(thread_db* tdbb, jrd_tra* transaction, DdlTriggerWhen when, int action, const MetaName& objectName, const string& sqlText) { @@ -192,14 +592,12 @@ savePoint.release(); // everything is ok } - void DdlNode::executeDdlTrigger(thread_db* tdbb, jrd_tra* transaction, DdlNode::DdlTriggerWhen when, int action, const MetaName& objectName) { executeDdlTrigger(tdbb, transaction, when, action, objectName, sqlText); } - void DdlNode::putType(const TypeClause& type, bool useSubType) { #ifdef DEV_BUILD @@ -300,51 +698,105 @@ } } - void DdlNode::resetContextStack() { dsqlScratch->context->clea... [truncated message content] |
From: <asf...@us...> - 2010-08-02 02:22:33
|
Revision: 51383 http://firebird.svn.sourceforge.net/firebird/?rev=51383&view=rev Author: asfernandes Date: 2010-08-02 02:22:26 +0000 (Mon, 02 Aug 2010) Log Message: ----------- Refactor CREATE/ALTER/CREATE OR ALTER/RECREATE VIEW and cleanup related to previously refactors Modified Paths: -------------- firebird/trunk/lang_helpers/gds_codes.ftn firebird/trunk/lang_helpers/gds_codes.pas firebird/trunk/src/dsql/DdlNodes.epp firebird/trunk/src/dsql/DdlNodes.h firebird/trunk/src/dsql/ddl.cpp firebird/trunk/src/dsql/dsql.h firebird/trunk/src/dsql/metd.epp firebird/trunk/src/dsql/metd_proto.h firebird/trunk/src/dsql/node.h firebird/trunk/src/dsql/parse.y firebird/trunk/src/dsql/pass1.cpp firebird/trunk/src/include/gen/codetext.h firebird/trunk/src/include/gen/iberror.h firebird/trunk/src/include/gen/msgs.h firebird/trunk/src/include/gen/sql_code.h firebird/trunk/src/include/gen/sql_state.h firebird/trunk/src/jrd/drq.h firebird/trunk/src/jrd/dyn.epp firebird/trunk/src/jrd/dyn_def.epp firebird/trunk/src/jrd/dyn_del.epp firebird/trunk/src/jrd/dyn_df_proto.h firebird/trunk/src/jrd/dyn_dl_proto.h firebird/trunk/src/jrd/dyn_md_proto.h firebird/trunk/src/jrd/dyn_mod.epp firebird/trunk/src/jrd/dyn_ut_proto.h firebird/trunk/src/jrd/dyn_util.epp firebird/trunk/src/msgs/facilities2.sql firebird/trunk/src/msgs/messages2.sql firebird/trunk/src/msgs/system_errors2.sql Modified: firebird/trunk/lang_helpers/gds_codes.ftn =================================================================== --- firebird/trunk/lang_helpers/gds_codes.ftn 2010-08-01 20:43:29 UTC (rev 51382) +++ firebird/trunk/lang_helpers/gds_codes.ftn 2010-08-02 02:22:26 UTC (rev 51383) @@ -2076,6 +2076,16 @@ PARAMETER (GDS__dsql_drop_pack_body_failed = 336397296) INTEGER*4 GDS__dsql_recreate_pack_body_failed PARAMETER (GDS__dsql_recreate_pack_body_failed = 336397297) + INTEGER*4 GDS__dsql_create_view_failed + PARAMETER (GDS__dsql_create_view_failed = 336397298) + INTEGER*4 GDS__dsql_alter_view_failed + PARAMETER (GDS__dsql_alter_view_failed = 336397299) + INTEGER*4 GDS__dsql_create_alter_view_failed + PARAMETER (GDS__dsql_create_alter_view_failed = 336397300) + INTEGER*4 GDS__dsql_recreate_view_failed + PARAMETER (GDS__dsql_recreate_view_failed = 336397301) + INTEGER*4 GDS__dsql_drop_view_failed + PARAMETER (GDS__dsql_drop_view_failed = 336397302) INTEGER*4 GDS__gsec_cant_open_db PARAMETER (GDS__gsec_cant_open_db = 336723983) INTEGER*4 GDS__gsec_switches_error Modified: firebird/trunk/lang_helpers/gds_codes.pas =================================================================== --- firebird/trunk/lang_helpers/gds_codes.pas 2010-08-01 20:43:29 UTC (rev 51382) +++ firebird/trunk/lang_helpers/gds_codes.pas 2010-08-02 02:22:26 UTC (rev 51383) @@ -1045,6 +1045,11 @@ gds_dsql_create_pack_body_failed = 336397295; gds_dsql_drop_pack_body_failed = 336397296; gds_dsql_recreate_pack_body_failed = 336397297; + gds_dsql_create_view_failed = 336397298; + gds_dsql_alter_view_failed = 336397299; + gds_dsql_create_alter_view_failed = 336397300; + gds_dsql_recreate_view_failed = 336397301; + gds_dsql_drop_view_failed = 336397302; gds_gsec_cant_open_db = 336723983; gds_gsec_switches_error = 336723984; gds_gsec_no_op_spec = 336723985; Modified: firebird/trunk/src/dsql/DdlNodes.epp =================================================================== --- firebird/trunk/src/dsql/DdlNodes.epp 2010-08-01 20:43:29 UTC (rev 51382) +++ firebird/trunk/src/dsql/DdlNodes.epp 2010-08-02 02:22:26 UTC (rev 51383) @@ -75,8 +75,9 @@ const MetaName& relationName, const MetaName& fieldName, USHORT newPosition, USHORT existingPosition); static rel_t relationType(SSHORT relationTypeNull, SSHORT relationType); +static void saveField(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, const MetaName& fieldName); static void saveRelation(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, - const dsql_str* relationName, bool creating); + const MetaName& relationName, bool view, bool creating); static void updateRdbFields(const TypeClause& type, SSHORT& fieldType, SSHORT& fieldLength, @@ -435,13 +436,27 @@ return relationTypeNull ? rel_persistent : rel_t(relationType); } +// Save the name of a field in the relation or view currently being defined. This is done to support +// definition of triggers which will depend on the metadata created in this statement. +static void saveField(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, const MetaName& fieldName) +{ + dsql_rel* relation = dsqlScratch->relation; + if (!relation) + return; + + MemoryPool& p = relation->rel_flags & REL_new_relation ? + *tdbb->getDefaultPool() : dsqlScratch->getAttachment()->dbb_pool; + dsql_fld* field = FB_NEW(p) dsql_fld(p); + field->fld_name = fieldName.c_str(); + field->fld_next = relation->rel_fields; + relation->rel_fields = field; +} + // Save the name of the relation or view currently being defined. This is done to support definition // of triggers which will depend on the metadata created in this statement. static void saveRelation(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, - const dsql_str* relationName, bool creating) + const MetaName& relationName, bool view, bool creating) { - //// TODO: Verify "creating" usage when using this function for views. - DsqlCompiledStatement* statement = dsqlScratch->getStatement(); if (dsqlScratch->flags & DsqlCompilerScratch::FLAG_METADATA_SAVED) @@ -451,14 +466,15 @@ dsql_rel* relation; - if (!creating) + if (!view && !creating) relation = METD_get_relation(dsqlScratch->getTransaction(), dsqlScratch, relationName); else { MemoryPool& pool = *tdbb->getDefaultPool(); relation = FB_NEW(pool) dsql_rel(pool); - relation->rel_name = relationName->str_data; - relation->rel_flags = REL_creating; + relation->rel_name = relationName; + if (!view) + relation->rel_flags = REL_creating; } dsqlScratch->relation = relation; @@ -511,8 +527,11 @@ fieldScaleNull = FALSE; fieldScale = 0; - characterLengthNull = FALSE; - characterLength = type.charLength; + if (type.charLength != 0) + { + characterLengthNull = FALSE; + characterLength = type.charLength; + } characterSetIdNull = FALSE; characterSetId = type.charSetId; @@ -815,6 +834,11 @@ DDL_resolve_intl_type2(dsqlScratch, legacyField, (collate.isEmpty() ? NULL : MAKE_cstring(collate.c_str())), modifying); + setup(dsqlScratch); +} + +void TypeClause::setup(DsqlCompilerScratch* dsqlScratch) +{ type = legacyField->fld_dtype; length = legacyField->fld_length; scale = legacyField->fld_scale; @@ -2655,7 +2679,7 @@ if (name.isEmpty()) DYN_UTIL_generate_trigger_name(tdbb, transaction, name); - AutoCacheRequest requestHandle(tdbb, drq_s_triggers2, DYN_REQUESTS); + AutoCacheRequest requestHandle(tdbb, drq_s_triggers, DYN_REQUESTS); STORE (REQUEST_HANDLE requestHandle TRANSACTION_HANDLE transaction) TRG IN RDB$TRIGGERS @@ -3403,7 +3427,8 @@ AutoCacheRequest request2(tdbb, drq_l_rfld_coll, DYN_REQUESTS); FOR (REQUEST_HANDLE request2 TRANSACTION_HANDLE transaction) - RF IN RDB$RELATION_FIELDS CROSS F IN RDB$FIELDS + RF IN RDB$RELATION_FIELDS + CROSS F IN RDB$FIELDS WITH RF.RDB$FIELD_SOURCE EQ F.RDB$FIELD_NAME AND F.RDB$CHARACTER_SET_ID EQ COLL.RDB$CHARACTER_SET_ID AND RF.RDB$COLLATION_ID EQ COLL.RDB$COLLATION_ID @@ -4205,7 +4230,7 @@ FOR (REQUEST_HANDLE request TRANSACTION_HANDLE transaction) RFR IN RDB$RELATION_FIELDS WITH RFR.RDB$FIELD_SOURCE = FLD.RDB$FIELD_NAME AND - RFR.RDB$GENERATOR_NAME NOT MISSING + RFR.RDB$GENERATOR_NAME NOT MISSING { // Domain @1 must be of exact number type with zero scale because it's used // in an identity column. @@ -4673,6 +4698,175 @@ //---------------------- +void RelationNode::FieldDefinition::modify(thread_db* tdbb, jrd_tra* transaction) +{ + Attachment* attachment = transaction->tra_attachment; + + AutoRequest request; + + FOR(REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + RFR IN RDB$RELATION_FIELDS + WITH RFR.RDB$RELATION_NAME EQ relationName.c_str() AND + RFR.RDB$FIELD_NAME EQ name.c_str() + { + // ASF: This is prepared only to modify view fields! + + MODIFY RFR + strcpy(RFR.RDB$FIELD_SOURCE, fieldSource.c_str()); + + RFR.RDB$COLLATION_ID.NULL = TRUE; + RFR.RDB$GENERATOR_NAME.NULL = TRUE; + RFR.RDB$IDENTITY_TYPE.NULL = TRUE; + RFR.RDB$NULL_FLAG.NULL = TRUE; + RFR.RDB$DEFAULT_SOURCE.NULL = TRUE; + RFR.RDB$DEFAULT_VALUE.NULL = TRUE; + RFR.RDB$FIELD_POSITION.NULL = TRUE; + + RFR.RDB$VIEW_CONTEXT.NULL = TRUE; + RFR.RDB$BASE_FIELD.NULL = TRUE; + ///RFR.RDB$UPDATE_FLAG.NULL = TRUE; + + if (collationId.specified) + { + RFR.RDB$COLLATION_ID.NULL = FALSE; + RFR.RDB$COLLATION_ID = collationId.value; + } + + SLONG fieldPos = -1; + + if (position.specified) + fieldPos = position.value; + else + { + DYN_UTIL_generate_field_position(tdbb, NULL, name, &fieldPos); + if (fieldPos >= 0) + ++fieldPos; + } + + if (fieldPos >= 0) + { + RFR.RDB$FIELD_POSITION.NULL = FALSE; + RFR.RDB$FIELD_POSITION = SSHORT(fieldPos); + } + + if (baseField.hasData()) + { + RFR.RDB$BASE_FIELD.NULL = FALSE; + strcpy(RFR.RDB$BASE_FIELD, baseField.c_str()); + } + + if (viewContext.specified) + { + fb_assert(baseField.hasData()); + + RFR.RDB$VIEW_CONTEXT.NULL = FALSE; + RFR.RDB$VIEW_CONTEXT = viewContext.value; + + DYN_UTIL_find_field_source(tdbb, transaction, relationName, viewContext.value, + baseField.c_str(), RFR.RDB$FIELD_SOURCE); + } + END_MODIFY + } + END_FOR +} + +void RelationNode::FieldDefinition::store(thread_db* tdbb, jrd_tra* transaction) +{ + Attachment* attachment = transaction->tra_attachment; + + AutoCacheRequest request(tdbb, drq_s_lfields, DYN_REQUESTS); + + STORE(REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + RFR IN RDB$RELATION_FIELDS + { + strcpy(RFR.RDB$FIELD_NAME, name.c_str()); + strcpy(RFR.RDB$RELATION_NAME, relationName.c_str()); + strcpy(RFR.RDB$FIELD_SOURCE, fieldSource.c_str()); + RFR.RDB$SYSTEM_FLAG = 0; + + RFR.RDB$COLLATION_ID.NULL = TRUE; + RFR.RDB$GENERATOR_NAME.NULL = TRUE; + RFR.RDB$IDENTITY_TYPE.NULL = TRUE; + RFR.RDB$NULL_FLAG.NULL = TRUE; + RFR.RDB$DEFAULT_SOURCE.NULL = TRUE; + RFR.RDB$DEFAULT_VALUE.NULL = TRUE; + RFR.RDB$FIELD_POSITION.NULL = TRUE; + + RFR.RDB$VIEW_CONTEXT.NULL = TRUE; + RFR.RDB$BASE_FIELD.NULL = TRUE; + ///RFR.RDB$UPDATE_FLAG.NULL = TRUE; + + if (collationId.specified) + { + RFR.RDB$COLLATION_ID.NULL = FALSE; + RFR.RDB$COLLATION_ID = collationId.value; + } + + if (identitySequence.hasData()) + { + RFR.RDB$GENERATOR_NAME.NULL = FALSE; + strcpy(RFR.RDB$GENERATOR_NAME, identitySequence.c_str()); + + RFR.RDB$IDENTITY_TYPE.NULL = FALSE; + RFR.RDB$IDENTITY_TYPE = IDENT_TYPE_BY_DEFAULT; + } + + if (notNullFlag.specified) + { + RFR.RDB$NULL_FLAG.NULL = FALSE; + RFR.RDB$NULL_FLAG = notNullFlag.value; + } + + if (defaultSource.hasData()) + { + RFR.RDB$DEFAULT_SOURCE.NULL = FALSE; + attachment->storeMetaDataBlob(tdbb, transaction, &RFR.RDB$DEFAULT_SOURCE, + defaultSource); + } + + if (defaultValue.length > 0) + { + RFR.RDB$DEFAULT_VALUE.NULL = FALSE; + attachment->storeBinaryBlob(tdbb, transaction, &RFR.RDB$DEFAULT_VALUE, defaultValue); + } + + SLONG fieldPos = -1; + + if (position.specified) + fieldPos = position.value; + else + { + DYN_UTIL_generate_field_position(tdbb, NULL, name, &fieldPos); + if (fieldPos >= 0) + ++fieldPos; + } + + if (fieldPos >= 0) + { + RFR.RDB$FIELD_POSITION.NULL = FALSE; + RFR.RDB$FIELD_POSITION = SSHORT(fieldPos); + } + + if (baseField.hasData()) + { + RFR.RDB$BASE_FIELD.NULL = FALSE; + strcpy(RFR.RDB$BASE_FIELD, baseField.c_str()); + } + + if (viewContext.specified) + { + fb_assert(baseField.hasData()); + + RFR.RDB$VIEW_CONTEXT.NULL = FALSE; + RFR.RDB$VIEW_CONTEXT = viewContext.value; + + DYN_UTIL_find_field_source(tdbb, transaction, relationName, viewContext.value, + baseField.c_str(), RFR.RDB$FIELD_SOURCE); + } + } + END_STORE +} + // Delete local field. // // The rules for dropping a regular column: @@ -4828,6 +5022,29 @@ } } +void RelationNode::storePrivileges(thread_db* tdbb, jrd_tra* transaction) +{ + Attachment* attachment = transaction->tra_attachment; + + AutoCacheRequest request(tdbb, drq_s_usr_prvs, DYN_REQUESTS); + + for (const TEXT* p = ALL_PRIVILEGES; *p; ++p) + { + STORE(REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + X IN RDB$USER_PRIVILEGES + { + strcpy(X.RDB$RELATION_NAME, name.c_str()); + strcpy(X.RDB$USER, attachment->att_user->usr_user_name.c_str()); + X.RDB$USER_TYPE = obj_user; + X.RDB$OBJECT_TYPE = obj_relation; + X.RDB$PRIVILEGE[0] = *p; + X.RDB$PRIVILEGE[1] = 0; + X.RDB$GRANT_OPTION = 1; + } + END_STORE + } +} + void RelationNode::defineField(thread_db* tdbb, jrd_tra* transaction, const dsql_nod* element, SSHORT position, const dsql_nod* pkCols) { @@ -4887,157 +5104,109 @@ } } - AutoCacheRequest request(tdbb, drq_s_lfields2, DYN_REQUESTS); + FieldDefinition fieldDefinition(*tdbb->getDefaultPool()); + fieldDefinition.relationName = name; + fieldDefinition.name = field->fld_name; + fieldDefinition.notNullFlag = notNullFlag; - STORE(REQUEST_HANDLE request TRANSACTION_HANDLE transaction) - RFR IN RDB$RELATION_FIELDS - { - const dsql_nod* domainNode = element->nod_arg[Dsql::e_dfl_domain]; - MetaName fieldSource; + if (position >= 0) + fieldDefinition.position = position; - if (domainNode) - { - const dsql_nod* node1 = domainNode->nod_arg[Dsql::e_dom_name]; - const dsql_str* domainName = (dsql_str*) node1->nod_arg[Dsql::e_fln_name]; + const dsql_nod* domainNode = element->nod_arg[Dsql::e_dfl_domain]; - // Get the domain information. - if (!METD_get_domain(transaction, field, domainName->str_data)) - { - // Specified domain or source field does not exist - status_exception::raise( - Arg::Gds(isc_sqlerr) << Arg::Num(-607) << - Arg::Gds(isc_dsql_command_err) << - Arg::Gds(isc_dsql_domain_not_found) << domainName->str_data); - } + if (domainNode) + { + const dsql_nod* node1 = domainNode->nod_arg[Dsql::e_dom_name]; + const dsql_str* domainName = (dsql_str*) node1->nod_arg[Dsql::e_fln_name]; - fieldSource = domainName->str_data; - } - else + // Get the domain information. + if (!METD_get_domain(transaction, field, domainName->str_data)) { - string computedSource; - BlrWriter::BlrData computedValue; - - if (element->nod_arg[e_dfl_computed]) - { - field->fld_flags |= FLD_computed; - - defineComputed(tdbb, field, element->nod_arg[e_dfl_computed], - computedSource, computedValue); - } - - TypeClause fieldType(field, NULL); // Don't use the collate in the generated domain. - fieldType.resolve(dsqlScratch); - - // Generate a domain. - storeGlobalField(tdbb, transaction, fieldSource, fieldType, - computedSource, computedValue); - } - - if ((relation->rel_flags & REL_external) && - (field->fld_dtype == dtype_blob || field->fld_dtype == dtype_array || - field->fld_dimensions)) - { - const char* typeName = (field->fld_dtype == dtype_blob ? "BLOB" : "ARRAY"); - + // Specified domain or source field does not exist status_exception::raise( Arg::Gds(isc_sqlerr) << Arg::Num(-607) << Arg::Gds(isc_dsql_command_err) << - Arg::Gds(isc_dsql_type_not_supp_ext_tab) << typeName << name << field->fld_name); + Arg::Gds(isc_dsql_domain_not_found) << domainName->str_data); } - strcpy(RFR.RDB$FIELD_NAME, field->fld_name.c_str()); - strcpy(RFR.RDB$FIELD_SOURCE, fieldSource.c_str()); - strcpy(RFR.RDB$RELATION_NAME, name.c_str()); - RFR.RDB$SYSTEM_FLAG = 0; + fieldDefinition.fieldSource = domainName->str_data; + } + else + { + string computedSource; + BlrWriter::BlrData computedValue; - RFR.RDB$NULL_FLAG.NULL = TRUE; - RFR.RDB$BASE_FIELD.NULL = TRUE; - RFR.RDB$UPDATE_FLAG.NULL = TRUE; - RFR.RDB$FIELD_POSITION.NULL = TRUE; - RFR.RDB$VIEW_CONTEXT.NULL = TRUE; - RFR.RDB$DEFAULT_VALUE.NULL = TRUE; - RFR.RDB$DEFAULT_SOURCE.NULL = TRUE; - RFR.RDB$COLLATION_ID.NULL = TRUE; - RFR.RDB$GENERATOR_NAME.NULL = TRUE; - RFR.RDB$IDENTITY_TYPE.NULL = TRUE; - - if (element->nod_arg[Dsql::e_dfl_collate]) + if (element->nod_arg[e_dfl_computed]) { - DDL_resolve_intl_type(dsqlScratch, field, (dsql_str*) element->nod_arg[Dsql::e_dfl_collate]); + field->fld_flags |= FLD_computed; - RFR.RDB$COLLATION_ID.NULL = FALSE; - RFR.RDB$COLLATION_ID = SSHORT(field->fld_collation_id); + defineComputed(tdbb, field, element->nod_arg[e_dfl_computed], + computedSource, computedValue); } - if (element->nod_arg[Dsql::e_dfl_identity]) - { - dsc desc; - MET_get_domain(tdbb, fieldSource, &desc, NULL); + TypeClause fieldType(field, NULL); // Don't use the collate in the generated domain. + fieldType.resolve(dsqlScratch); - if (!desc.isExact() || desc.dsc_scale != 0) - { - // Identity column @1 of table @2 must be exact numeric with zero scale. - status_exception::raise( - Arg::Gds(ENCODE_ISC_MSG(273, DYN_MSG_FAC)) << field->fld_name << name); - } + // Generate a domain. + storeGlobalField(tdbb, transaction, fieldDefinition.fieldSource, fieldType, + computedSource, computedValue); + } - MetaName sequenceName; - DYN_UTIL_generate_generator_name(tdbb, sequenceName); + if ((relation->rel_flags & REL_external) && + (field->fld_dtype == dtype_blob || field->fld_dtype == dtype_array || + field->fld_dimensions)) + { + const char* typeName = (field->fld_dtype == dtype_blob ? "BLOB" : "ARRAY"); - CreateSequenceNode::store(tdbb, transaction, sequenceName, - fb_sysflag_identity_generator); + status_exception::raise( + Arg::Gds(isc_sqlerr) << Arg::Num(-607) << + Arg::Gds(isc_dsql_command_err) << + Arg::Gds(isc_dsql_type_not_supp_ext_tab) << typeName << name << field->fld_name); + } - RFR.RDB$GENERATOR_NAME.NULL = FALSE; - strcpy(RFR.RDB$GENERATOR_NAME, sequenceName.c_str()); + if (element->nod_arg[Dsql::e_dfl_collate]) + DDL_resolve_intl_type(dsqlScratch, field, (dsql_str*) element->nod_arg[Dsql::e_dfl_collate]); - RFR.RDB$IDENTITY_TYPE.NULL = FALSE; - RFR.RDB$IDENTITY_TYPE = IDENT_TYPE_BY_DEFAULT; - } + if (element->nod_arg[Dsql::e_dfl_identity]) + { + dsc desc; + MET_get_domain(tdbb, fieldDefinition.fieldSource, &desc, NULL); - if (notNullFlag) + if (!desc.isExact() || desc.dsc_scale != 0) { - RFR.RDB$NULL_FLAG.NULL = FALSE; - RFR.RDB$NULL_FLAG = TRUE; + // Identity column @1 of table @2 must be exact numeric with zero scale. + status_exception::raise( + Arg::Gds(ENCODE_ISC_MSG(273, DYN_MSG_FAC)) << field->fld_name << name); } - if (element->nod_arg[Dsql::e_dfl_default]) - { - string defaultSource; - BlrWriter::BlrData defaultValue; + DYN_UTIL_generate_generator_name(tdbb, fieldDefinition.identitySequence); - if (defineDefault(tdbb, field, element->nod_arg[Dsql::e_dfl_default], defaultSource, - defaultValue) && - notNullFlag) - { - status_exception::raise( - Arg::Gds(isc_sqlerr) << Arg::Num(-204) << - Arg::Gds(isc_bad_default_value) << - Arg::Gds(isc_invalid_clause) << "default null not null"); - } + CreateSequenceNode::store(tdbb, transaction, fieldDefinition.identitySequence, + fb_sysflag_identity_generator); + } - RFR.RDB$DEFAULT_SOURCE.NULL = FALSE; - attachment->storeMetaDataBlob(tdbb, transaction, &RFR.RDB$DEFAULT_SOURCE, defaultSource); + BlrWriter::BlrData defaultValue; - RFR.RDB$DEFAULT_VALUE.NULL = FALSE; - attachment->storeBinaryBlob(tdbb, transaction, &RFR.RDB$DEFAULT_VALUE, defaultValue); - } - - if (position == -1) + if (element->nod_arg[Dsql::e_dfl_default]) + { + if (defineDefault(tdbb, field, element->nod_arg[Dsql::e_dfl_default], + fieldDefinition.defaultSource, defaultValue) && + notNullFlag) { - SLONG fieldPos = -1; - DYN_UTIL_generate_field_position(tdbb, NULL, name, &fieldPos); - if (fieldPos >= 0) - position = SSHORT(fieldPos + 1); + status_exception::raise( + Arg::Gds(isc_sqlerr) << Arg::Num(-204) << + Arg::Gds(isc_bad_default_value) << + Arg::Gds(isc_invalid_clause) << "default null not null"); } - - if (position >= 0) - { - RFR.RDB$FIELD_POSITION.NULL = FALSE; - RFR.RDB$FIELD_POSITION = position; - } } - END_STORE + fieldDefinition.defaultValue = defaultValue; + + if (element->nod_arg[Dsql::e_dfl_collate]) + fieldDefinition.collationId = field->fld_collation_id; + + fieldDefinition.store(tdbb, transaction); + // Define the field constraints. for (ObjectsArray<Constraint>::iterator constraint(constraints.begin()); constraint != constraints.end(); @@ -5130,7 +5299,7 @@ if (field->fld_dtype <= dtype_any_text) { field->fld_character_set_id = DSC_GET_CHARSET(&desc); - field->fld_collation_id= DSC_GET_COLLATE(&desc); + field->fld_collation_id = DSC_GET_COLLATE(&desc); } else field->fld_sub_type = desc.dsc_sub_type; @@ -5639,9 +5808,7 @@ void RelationNode::defineCheckConstraintTrigger(Constraint& constraint, dsql_nod* node, FB_UINT64 triggerType) { - // See hack at pass1_field. - AutoSetRestore2<dsql_nod*, DsqlCompiledStatement> autoDdlNode(dsqlScratch->getStatement(), - &DsqlCompiledStatement::getDdlNode, &DsqlCompiledStatement::setDdlNode, node); + AutoSetRestore<bool> autoCheckConstraintTrigger(&dsqlScratch->checkConstraintTrigger, true); Constraint::BlrWriter& blrWriter = constraint.blrWritersHolder.add(); blrWriter.init(dsqlScratch); @@ -6085,7 +6252,7 @@ { Attachment* attachment = transaction->tra_attachment; - saveRelation(tdbb, dsqlScratch, MAKE_cstring(name.c_str()), true); + saveRelation(tdbb, dsqlScratch, name, false, true); if (externalFile) { @@ -6145,24 +6312,8 @@ } END_STORE - for (const TEXT* p = ALL_PRIVILEGES; *p; ++p) - { - request.reset(tdbb, drq_s_usr_prvs, DYN_REQUESTS); + storePrivileges(tdbb, transaction); - STORE(REQUEST_HANDLE request TRANSACTION_HANDLE transaction) - X IN RDB$USER_PRIVILEGES - { - strcpy(X.RDB$RELATION_NAME, name.c_str()); - strcpy(X.RDB$USER, attachment->att_user->usr_user_name.c_str()); - X.RDB$USER_TYPE = obj_user; - X.RDB$OBJECT_TYPE = obj_relation; - X.RDB$PRIVILEGE[0] = *p; - X.RDB$PRIVILEGE[1] = 0; - X.RDB$GRANT_OPTION = 1; - } - END_STORE - } - ObjectsArray<Constraint> constraints; const dsql_nod* pkCols = findPkColumns(); SSHORT position = 0; @@ -6241,7 +6392,7 @@ { Attachment* attachment = transaction->tra_attachment; - saveRelation(tdbb, dsqlScratch, MAKE_cstring(name.c_str()), false); + saveRelation(tdbb, dsqlScratch, name, false, false); if (!dsqlScratch->relation) { @@ -7076,8 +7227,7 @@ void DropRelationNode::execute(thread_db* tdbb, jrd_tra* transaction) { - AutoPtr<dsql_str> nameStr(MAKE_string(name.c_str(), name.length())); - const dsql_rel* relation = METD_get_relation(transaction, dsqlScratch, nameStr); + const dsql_rel* relation = METD_get_relation(transaction, dsqlScratch, name); if (!relation && silent) return; @@ -7141,6 +7291,927 @@ //---------------------- +void CreateAlterViewNode::print(string& text, Array<dsql_nod*>& /*nodes*/) const +{ + text.printf( + "CreateAlterViewNode\n" + " name: '%s'\n", + name.c_str()); +} + +void CreateAlterViewNode::execute(thread_db* tdbb, jrd_tra* transaction) +{ + Attachment* attachment = transaction->tra_attachment; + + const dsql_rel* modifyingView = NULL; + + if (alter) + { + modifyingView = METD_get_relation(dsqlScratch->getTransaction(), dsqlScratch, name); + + if (!modifyingView && !create) + status_exception::raise(Arg::Gds(isc_dyn_view_not_found) << name); + } + + saveRelation(tdbb, dsqlScratch, name, true, modifyingView == NULL); + + // run all statements under savepoint control + AutoSavePoint savePoint(tdbb, transaction); + + const int ddlTriggerAction = (modifyingView ? DDL_TRIGGER_ALTER_VIEW : DDL_TRIGGER_CREATE_VIEW); + + executeDdlTrigger(tdbb, transaction, DTW_BEFORE, ddlTriggerAction, name); + + if (!modifyingView) + DYN_UTIL_check_unique_name(tdbb, transaction, name, obj_relation); + + // Compile the SELECT statement into a record selection expression, making sure to bump the + // context number since view contexts start at 1 (except for computed fields) -- note that + // calling PASS1_rse directly rather than PASS1_statement saves the context stack. + + DDL_reset_context_stack(dsqlScratch); + ++dsqlScratch->contextNumber; + selectExpr->nod_flags |= NOD_SELECT_VIEW_FIELDS; + dsql_nod* rse = PASS1_rse(dsqlScratch, selectExpr, NULL); + + dsqlScratch->getBlrData().clear(); + dsqlScratch->appendUChar(dsqlScratch->isVersion4() ? blr_version4 : blr_version5); + + // ASF: Call GEN_hidden_variables could be a optimization for views to not have + // blr_dcl_variables inside RSE loops, but this is currently not possible because it will + // mix the variables from view fields and view body. + + GEN_expr(dsqlScratch, rse); + dsqlScratch->appendUChar(blr_eoc); + + // Store the blr and source string for the view definition. + + if (modifyingView) + { + AutoCacheRequest request(tdbb, drq_m_view, DYN_REQUESTS); + bool found = false; + + FOR (REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + REL IN RDB$RELATIONS + WITH REL.RDB$RELATION_NAME EQ name.c_str() AND + REL.RDB$VIEW_BLR NOT MISSING + { + found = true; + + MODIFY REL + attachment->storeMetaDataBlob(tdbb, transaction, &REL.RDB$VIEW_SOURCE, source); + attachment->storeBinaryBlob(tdbb, transaction, &REL.RDB$VIEW_BLR, + dsqlScratch->getBlrData()); + END_MODIFY + } + END_FOR + + if (!found) + status_exception::raise(Arg::Gds(isc_dyn_view_not_found) << name); + + AutoRequest request2; + + FOR (REQUEST_HANDLE request2 TRANSACTION_HANDLE transaction) + VR IN RDB$VIEW_RELATIONS + WITH VR.RDB$VIEW_NAME EQ name.c_str() + { + ERASE VR; + } + END_FOR + + request2.reset(); + + FOR (REQUEST_HANDLE request2 TRANSACTION_HANDLE transaction) + TRG IN RDB$TRIGGERS + WITH TRG.RDB$RELATION_NAME EQ name.c_str() AND + TRG.RDB$SYSTEM_FLAG EQ fb_sysflag_view_check + { + ERASE TRG; + } + END_FOR + } + else + { + AutoCacheRequest request(tdbb, drq_s_rels, DYN_REQUESTS); + + STORE(REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + REL IN RDB$RELATIONS + { + strcpy(REL.RDB$RELATION_NAME, name.c_str()); + REL.RDB$SYSTEM_FLAG = 0; + REL.RDB$FLAGS = REL_sql; + REL.RDB$RELATION_TYPE = SSHORT(rel_view); + + attachment->storeMetaDataBlob(tdbb, transaction, &REL.RDB$VIEW_SOURCE, source); + attachment->storeBinaryBlob(tdbb, transaction, &REL.RDB$VIEW_BLR, dsqlScratch->getBlrData()); + } + END_STORE + + storePrivileges(tdbb, transaction); + } + + // Define the view source relations from the statement contexts and union contexts. + + while (dsqlScratch->derivedContext.hasData()) + dsqlScratch->context->push(dsqlScratch->derivedContext.pop()); + + while (dsqlScratch->unionContext.hasData()) + dsqlScratch->context->push(dsqlScratch->unionContext.pop()); + + AutoCacheRequest request(tdbb, drq_s_view_rels, DYN_REQUESTS); + + for (DsqlContextStack::iterator temp(*dsqlScratch->context); temp.hasData(); ++temp) + { + const dsql_ctx* context = temp.object(); + const dsql_rel* relation = context->ctx_relation; + const dsql_prc* procedure = context->ctx_procedure; + + if (relation || procedure) + { + const MetaName& refName = relation ? relation->rel_name : procedure->prc_name.identifier; + const char* contextName = context->ctx_alias ? context->ctx_alias : refName.c_str(); + + ViewContextType ctxType; + if (relation) + { + if (!(relation->rel_flags & REL_view)) + ctxType = VCT_TABLE; + else + ctxType = VCT_VIEW; + } + else //if (procedure) + ctxType = VCT_PROCEDURE; + + STORE(REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + VRL IN RDB$VIEW_RELATIONS + { + strcpy(VRL.RDB$VIEW_NAME, name.c_str()); + strcpy(VRL.RDB$RELATION_NAME, refName.c_str()); + VRL.RDB$CONTEXT_TYPE = SSHORT(ctxType); + VRL.RDB$VIEW_CONTEXT = context->ctx_context; + strcpy(VRL.RDB$CONTEXT_NAME, contextName); + + if (procedure && procedure->prc_name.package.hasData()) + { + VRL.RDB$PACKAGE_NAME.NULL = FALSE; + strcpy(VRL.RDB$PACKAGE_NAME, procedure->prc_name.package.c_str()); + } + else + VRL.RDB$PACKAGE_NAME.NULL = TRUE; + } + END_STORE + } + } + + // Check privileges on base tables and views. + + request.reset(tdbb, drq_l_view_rels, DYN_REQUESTS); + + FOR(REQUEST_HANDLE request TRANSACTION_HANDLE transaction) + VRL IN RDB$VIEW_RELATIONS CROSS + PREL IN RDB$RELATIONS OVER RDB$RELATION_NAME + WITH VRL.RDB$PACKAGE_NAME MISSING AND + VRL.RDB$VIEW_NAME EQ name.c_str() + { + // CVC: This never matches so it causes unnecessary calls to verify, + // so I included a call to strip trailing blanks. + fb_utils::exact_name_limit(PREL.RDB$OWNER_NAME, sizeof(PREL.RDB$OWNER_NAME)); + + if (attachment->att_user->usr_user_name != PREL.RDB$OWNER_NAME) + { + SecurityClass::flags_t priv; + + // I think this should be the responsability of DFW or the user will find ways to + // circumvent DYN. + if (!DYN_UTIL_get_prot(tdbb, transaction, PREL.RDB$RELATION_NAME, "", &priv)) + { + // ASF: DYN_UTIL_get_prot will throw instead of return false. + fb_assert(false); + } + + if (!(priv & SCL_read)) + { + // msg 32: no permission for %s access to %s %s + status_exception::raise( + Arg::Gds(isc_no_priv) << Arg::Str("SELECT") << // Non-Translatable + // Remember, a view may be based on a view. + "TABLE/VIEW" << // Non-Translatable + ... [truncated message content] |
From: <ale...@us...> - 2010-08-09 13:56:28
|
Revision: 51416 http://firebird.svn.sourceforge.net/firebird/?rev=51416&view=rev Author: alexpeshkoff Date: 2010-08-09 13:56:20 +0000 (Mon, 09 Aug 2010) Log Message: ----------- Damian's patch for additional CPUs under linux Modified Paths: -------------- firebird/trunk/configure.in firebird/trunk/src/common/classes/DbImplementation.cpp firebird/trunk/src/jrd/common.h Modified: firebird/trunk/configure.in =================================================================== --- firebird/trunk/configure.in 2010-08-09 11:50:12 UTC (rev 51415) +++ firebird/trunk/configure.in 2010-08-09 13:56:20 UTC (rev 51416) @@ -275,6 +275,28 @@ SHRLIB_EXT=so ;; + hppa*-*-linux*) + MAKEFILE_PREFIX=linux_generic + INSTALL_PREFIX=linux + PLATFORM=LINUX + AC_DEFINE(LINUX, 1, [Define this if OS is Linux]) + AC_DEFINE(HPPA, 1, [Define this if CPU is HPPA]) + LOCK_MANAGER_FLG=Y + EDITLINE_FLG=Y + SHRLIB_EXT=so + ;; + + alpha*-*-linux*) + MAKEFILE_PREFIX=linux_generic + INSTALL_PREFIX=linux + PLATFORM=LINUX + AC_DEFINE(LINUX, 1, [Define this if OS is Linux]) + AC_DEFINE(ALPHA, 1, [Define this if CPU is Alpha]) + LOCK_MANAGER_FLG=Y + EDITLINE_FLG=Y + SHRLIB_EXT=so + ;; + *-*-linux* | *-*-gnu*) MAKEFILE_PREFIX=linux_generic INSTALL_PREFIX=linux Modified: firebird/trunk/src/common/classes/DbImplementation.cpp =================================================================== --- firebird/trunk/src/common/classes/DbImplementation.cpp 2010-08-09 11:50:12 UTC (rev 51415) +++ firebird/trunk/src/common/classes/DbImplementation.cpp 2010-08-09 13:56:20 UTC (rev 51416) @@ -46,6 +46,7 @@ static const UCHAR CpuSh = 11; static const UCHAR CpuSheb = 12; static const UCHAR CpuHppa = 13; +static const UCHAR CpuAlpha = 14; static const UCHAR OsWindows = 0; static const UCHAR OsLinux = 1; @@ -82,7 +83,8 @@ "s390x", "SH", "SHEB", - "HPPA" + "HPPA", + "Alpha" }; const char* operatingSystem[] = { @@ -109,22 +111,22 @@ // This table lists pre-fb3 imlementation codes const UCHAR backwardTable[FB_NELEM(hardware) * FB_NELEM(operatingSystem)] = { -// Intel AMD Sparc PPC PPC64 MIPSEL MIPS ARM IA64 s390 s390x SH SHEB HPPA -/* Windows */ 50, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* Linux */ 60, 66, 65, 69, 0, 71, 72, 75, 76, 79, 78, 80, 81, 0, -/* Darwin */ 70, 73, 0, 63, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* Solaris */ 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* HPUX */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, -/* AIX */ 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* MVS */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* FreeBSD */ 61, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* NetBSD */ 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +// Intel AMD Sparc PPC PPC64 MIPSEL MIPS ARM IA64 s390 s390x SH SHEB HPPA Alpha +/* Windows */ 50, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* Linux */ 60, 66, 65, 69, 0, 71, 72, 75, 76, 79, 78, 80, 81, 0, 0, +/* Darwin */ 70, 73, 0, 63, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* Solaris */ 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* HPUX */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, +/* AIX */ 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* MVS */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* FreeBSD */ 61, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* NetBSD */ 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; const UCHAR backEndianess[FB_NELEM(hardware)] = { -// Intel AMD Sparc PPC PPC64 MIPSEL MIPS ARM IA64 s390 s390x SH SHEB HPPA - 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, +// Intel AMD Sparc PPC PPC64 MIPSEL MIPS ARM IA64 s390 s390x SH SHEB HPPA Alpha + 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0 }; } // anonymous namespace Modified: firebird/trunk/src/jrd/common.h =================================================================== --- firebird/trunk/src/jrd/common.h 2010-08-09 11:50:12 UTC (rev 51415) +++ firebird/trunk/src/jrd/common.h 2010-08-09 13:56:20 UTC (rev 51416) @@ -182,6 +182,16 @@ #define RISC_ALIGNMENT #endif /* sheb */ +#ifdef HPPA +#define FB_CPU CpuHppa +#define RISC_ALIGNMENT +#endif /* hppa */ + +#ifdef ALPHA +#define FB_CPU CpuAlpha +#define RISC_ALIGNMENT +#endif + #endif /* LINUX */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <asf...@us...> - 2010-08-09 15:49:01
|
Revision: 51418 http://firebird.svn.sourceforge.net/firebird/?rev=51418&view=rev Author: asfernandes Date: 2010-08-09 15:48:51 +0000 (Mon, 09 Aug 2010) Log Message: ----------- Const correction for EVL, EXE and they subsystems. Adjustments to CMP and OPT. Modified Paths: -------------- firebird/trunk/builds/win32/msvc10/common.vcxproj firebird/trunk/builds/win32/msvc10/common.vcxproj.filters firebird/trunk/builds/win32/msvc10/common_classic.vcxproj firebird/trunk/builds/win32/msvc10/common_classic.vcxproj.filters firebird/trunk/builds/win32/msvc10/common_static.vcxproj firebird/trunk/builds/win32/msvc10/common_static.vcxproj.filters firebird/trunk/builds/win32/msvc8/common.vcproj firebird/trunk/builds/win32/msvc8/common_classic.vcproj firebird/trunk/builds/win32/msvc8/common_static.vcproj firebird/trunk/builds/win32/msvc9/common.vcproj firebird/trunk/builds/win32/msvc9/common_classic.vcproj firebird/trunk/builds/win32/msvc9/common_static.vcproj firebird/trunk/src/dsql/AggNodes.cpp firebird/trunk/src/dsql/AggNodes.h firebird/trunk/src/dsql/ExprNodes.cpp firebird/trunk/src/dsql/ExprNodes.h firebird/trunk/src/dsql/Nodes.h firebird/trunk/src/dsql/StmtNodes.cpp firebird/trunk/src/dsql/StmtNodes.h firebird/trunk/src/dsql/WinNodes.cpp firebird/trunk/src/dsql/WinNodes.h firebird/trunk/src/jrd/ExtEngineManager.cpp firebird/trunk/src/jrd/ExtEngineManager.h firebird/trunk/src/jrd/Function.epp firebird/trunk/src/jrd/Function.h firebird/trunk/src/jrd/Optimizer.cpp firebird/trunk/src/jrd/Optimizer.h firebird/trunk/src/jrd/SysFunction.cpp firebird/trunk/src/jrd/SysFunction.h firebird/trunk/src/jrd/blb.cpp firebird/trunk/src/jrd/blb_proto.h firebird/trunk/src/jrd/btr.cpp firebird/trunk/src/jrd/btr_proto.h firebird/trunk/src/jrd/cmp.cpp firebird/trunk/src/jrd/evl.cpp firebird/trunk/src/jrd/evl_proto.h firebird/trunk/src/jrd/exe.cpp firebird/trunk/src/jrd/exe.h firebird/trunk/src/jrd/exe_proto.h firebird/trunk/src/jrd/execute_statement.cpp firebird/trunk/src/jrd/execute_statement.h firebird/trunk/src/jrd/extds/ExtDS.cpp firebird/trunk/src/jrd/extds/ExtDS.h firebird/trunk/src/jrd/fun.epp firebird/trunk/src/jrd/fun_proto.h firebird/trunk/src/jrd/met.epp firebird/trunk/src/jrd/opt.cpp firebird/trunk/src/jrd/par.cpp firebird/trunk/src/jrd/recsrc/AggregatedStream.cpp firebird/trunk/src/jrd/recsrc/Cursor.cpp firebird/trunk/src/jrd/recsrc/Cursor.h firebird/trunk/src/jrd/recsrc/FilteredStream.cpp firebird/trunk/src/jrd/recsrc/HashJoin.cpp firebird/trunk/src/jrd/recsrc/MergeJoin.cpp firebird/trunk/src/jrd/recsrc/ProcedureScan.cpp firebird/trunk/src/jrd/recsrc/RecordSource.h firebird/trunk/src/jrd/recsrc/RecursiveStream.cpp firebird/trunk/src/jrd/recsrc/SortedStream.cpp firebird/trunk/src/jrd/recsrc/Union.cpp firebird/trunk/src/jrd/recsrc/WindowedStream.cpp firebird/trunk/src/jrd/req.h firebird/trunk/src/jrd/trace/TraceJrdHelpers.h Added Paths: ----------- firebird/trunk/src/common/classes/NestConst.h Modified: firebird/trunk/builds/win32/msvc10/common.vcxproj =================================================================== --- firebird/trunk/builds/win32/msvc10/common.vcxproj 2010-08-09 14:50:11 UTC (rev 51417) +++ firebird/trunk/builds/win32/msvc10/common.vcxproj 2010-08-09 15:48:51 UTC (rev 51418) @@ -199,6 +199,7 @@ <ClInclude Include="..\..\..\src\common\classes\GenericMap.h" /> <ClInclude Include="..\..\..\src\common\classes\MetaName.h" /> <ClInclude Include="..\..\..\src\common\classes\MsgPrint.h" /> + <ClInclude Include="..\..\..\src\common\classes\NestConst.h" /> <ClInclude Include="..\..\..\src\common\classes\SafeArg.h" /> <ClInclude Include="..\..\..\src\common\StatusArg.h" /> <ClInclude Include="..\..\..\src\common\StatusHolder.h" /> Modified: firebird/trunk/builds/win32/msvc10/common.vcxproj.filters =================================================================== --- firebird/trunk/builds/win32/msvc10/common.vcxproj.filters 2010-08-09 14:50:11 UTC (rev 51417) +++ firebird/trunk/builds/win32/msvc10/common.vcxproj.filters 2010-08-09 15:48:51 UTC (rev 51418) @@ -180,6 +180,9 @@ <ClInclude Include="..\..\..\src\common\classes\MsgPrint.h"> <Filter>Header files</Filter> </ClInclude> + <ClInclude Include="..\..\..\src\common\classes\NestConst.h"> + <Filter>Header files</Filter> + </ClInclude> <ClInclude Include="..\..\..\src\common\classes\SafeArg.h"> <Filter>Header files</Filter> </ClInclude> Modified: firebird/trunk/builds/win32/msvc10/common_classic.vcxproj =================================================================== --- firebird/trunk/builds/win32/msvc10/common_classic.vcxproj 2010-08-09 14:50:11 UTC (rev 51417) +++ firebird/trunk/builds/win32/msvc10/common_classic.vcxproj 2010-08-09 15:48:51 UTC (rev 51418) @@ -198,6 +198,7 @@ <ClInclude Include="..\..\..\src\common\classes\GenericMap.h" /> <ClInclude Include="..\..\..\src\common\classes\MetaName.h" /> <ClInclude Include="..\..\..\src\common\classes\MsgPrint.h" /> + <ClInclude Include="..\..\..\src\common\classes\NestConst.h" /> <ClInclude Include="..\..\..\src\common\classes\SafeArg.h" /> <ClInclude Include="..\..\..\src\common\StatusArg.h" /> <ClInclude Include="..\..\..\src\common\StatusHolder.h" /> Modified: firebird/trunk/builds/win32/msvc10/common_classic.vcxproj.filters =================================================================== --- firebird/trunk/builds/win32/msvc10/common_classic.vcxproj.filters 2010-08-09 14:50:11 UTC (rev 51417) +++ firebird/trunk/builds/win32/msvc10/common_classic.vcxproj.filters 2010-08-09 15:48:51 UTC (rev 51418) @@ -177,6 +177,9 @@ <ClInclude Include="..\..\..\src\common\classes\MsgPrint.h"> <Filter>Header files</Filter> </ClInclude> + <ClInclude Include="..\..\..\src\common\classes\NestConst.h"> + <Filter>Header files</Filter> + </ClInclude> <ClInclude Include="..\..\..\src\common\classes\SafeArg.h"> <Filter>Header files</Filter> </ClInclude> Modified: firebird/trunk/builds/win32/msvc10/common_static.vcxproj =================================================================== --- firebird/trunk/builds/win32/msvc10/common_static.vcxproj 2010-08-09 14:50:11 UTC (rev 51417) +++ firebird/trunk/builds/win32/msvc10/common_static.vcxproj 2010-08-09 15:48:51 UTC (rev 51418) @@ -193,6 +193,7 @@ <ClInclude Include="..\..\..\src\common\classes\init.h" /> <ClInclude Include="..\..\..\src\common\classes\MetaName.h" /> <ClInclude Include="..\..\..\src\common\classes\MsgPrint.h" /> + <ClInclude Include="..\..\..\src\common\classes\NestConst.h" /> <ClInclude Include="..\..\..\src\common\classes\SafeArg.h" /> <ClInclude Include="..\..\..\src\common\StatusArg.h" /> <ClInclude Include="..\..\..\src\common\StatusHolder.h" /> Modified: firebird/trunk/builds/win32/msvc10/common_static.vcxproj.filters =================================================================== --- firebird/trunk/builds/win32/msvc10/common_static.vcxproj.filters 2010-08-09 14:50:11 UTC (rev 51417) +++ firebird/trunk/builds/win32/msvc10/common_static.vcxproj.filters 2010-08-09 15:48:51 UTC (rev 51418) @@ -156,6 +156,9 @@ <ClInclude Include="..\..\..\src\common\classes\MsgPrint.h"> <Filter>Header files</Filter> </ClInclude> + <ClInclude Include="..\..\..\src\common\classes\NestConst.h"> + <Filter>Header files</Filter> + </ClInclude> <ClInclude Include="..\..\..\src\common\classes\SafeArg.h"> <Filter>Header files</Filter> </ClInclude> Modified: firebird/trunk/builds/win32/msvc8/common.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc8/common.vcproj 2010-08-09 14:50:11 UTC (rev 51417) +++ firebird/trunk/builds/win32/msvc8/common.vcproj 2010-08-09 15:48:51 UTC (rev 51418) @@ -501,6 +501,10 @@ > </File> <File + RelativePath="..\..\..\src\common\classes\NestConst.h" + > + </File> + <File RelativePath="..\..\..\src\common\classes\SafeArg.h" > </File> Modified: firebird/trunk/builds/win32/msvc8/common_classic.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc8/common_classic.vcproj 2010-08-09 14:50:11 UTC (rev 51417) +++ firebird/trunk/builds/win32/msvc8/common_classic.vcproj 2010-08-09 15:48:51 UTC (rev 51418) @@ -497,6 +497,10 @@ > </File> <File + RelativePath="..\..\..\src\common\classes\NestConst.h" + > + </File> + <File RelativePath="..\..\..\src\common\classes\SafeArg.h" > </File> Modified: firebird/trunk/builds/win32/msvc8/common_static.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc8/common_static.vcproj 2010-08-09 14:50:11 UTC (rev 51417) +++ firebird/trunk/builds/win32/msvc8/common_static.vcproj 2010-08-09 15:48:51 UTC (rev 51418) @@ -470,6 +470,10 @@ > </File> <File + RelativePath="..\..\..\src\common\classes\NestConst.h" + > + </File> + <File RelativePath="..\..\..\src\common\classes\SafeArg.h" > </File> Modified: firebird/trunk/builds/win32/msvc9/common.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc9/common.vcproj 2010-08-09 14:50:11 UTC (rev 51417) +++ firebird/trunk/builds/win32/msvc9/common.vcproj 2010-08-09 15:48:51 UTC (rev 51418) @@ -502,6 +502,10 @@ > </File> <File + RelativePath="..\..\..\src\common\classes\NestConst.h" + > + </File> + <File RelativePath="..\..\..\src\common\classes\SafeArg.h" > </File> Modified: firebird/trunk/builds/win32/msvc9/common_classic.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc9/common_classic.vcproj 2010-08-09 14:50:11 UTC (rev 51417) +++ firebird/trunk/builds/win32/msvc9/common_classic.vcproj 2010-08-09 15:48:51 UTC (rev 51418) @@ -498,6 +498,10 @@ > </File> <File + RelativePath="..\..\..\src\common\classes\NestConst.h" + > + </File> + <File RelativePath="..\..\..\src\common\classes\SafeArg.h" > </File> Modified: firebird/trunk/builds/win32/msvc9/common_static.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc9/common_static.vcproj 2010-08-09 14:50:11 UTC (rev 51417) +++ firebird/trunk/builds/win32/msvc9/common_static.vcproj 2010-08-09 15:48:51 UTC (rev 51418) @@ -471,6 +471,10 @@ > </File> <File + RelativePath="..\..\..\src\common\classes\NestConst.h" + > + </File> + <File RelativePath="..\..\..\src\common\classes\SafeArg.h" > </File> Added: firebird/trunk/src/common/classes/NestConst.h =================================================================== --- firebird/trunk/src/common/classes/NestConst.h (rev 0) +++ firebird/trunk/src/common/classes/NestConst.h 2010-08-09 15:48:51 UTC (rev 51418) @@ -0,0 +1,52 @@ +/* + * 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) 2010 Adriano dos Santos Fernandes <adr...@gm...> + * and all contributors signed below. + * + * All Rights Reserved. + * Contributor(s): ______________________________________. + */ + +#ifndef COMMON_NEST_CONST_H +#define COMMON_NEST_CONST_H + +// Encloses a pointer to cascade parent object constness. +template <typename T> +class NestConst +{ +public: + NestConst(T* aPtr = NULL) + : ptr(aPtr) + { + } + + NestConst<T>& operator =(T* aPtr) + { + ptr = aPtr; + return *this; + } + + operator T*() { return ptr; } + operator const T*() const { return ptr; } + + T* operator ->() { return ptr; } + const T* operator ->() const { return ptr; } + +private: + T* ptr; +}; + +#endif // COMMON_NEST_CONST_H Property changes on: firebird/trunk/src/common/classes/NestConst.h ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Modified: firebird/trunk/src/dsql/AggNodes.cpp =================================================================== --- firebird/trunk/src/dsql/AggNodes.cpp 2010-08-09 14:50:11 UTC (rev 51417) +++ firebird/trunk/src/dsql/AggNodes.cpp 2010-08-09 15:48:51 UTC (rev 51418) @@ -553,7 +553,7 @@ } } -ExprNode* AvgAggNode::copy(thread_db* tdbb, NodeCopier& copier) const +ExprNode* AvgAggNode::copy(thread_db* tdbb, NodeCopier& copier) { AvgAggNode* node = FB_NEW(*tdbb->getDefaultPool()) AvgAggNode(*tdbb->getDefaultPool(), distinct, dialect1); @@ -679,7 +679,7 @@ desc->makeBlob(desc->getBlobSubType(), desc->getTextType()); } -ExprNode* ListAggNode::copy(thread_db* tdbb, NodeCopier& copier) const +ExprNode* ListAggNode::copy(thread_db* tdbb, NodeCopier& copier) { ListAggNode* node = FB_NEW(*tdbb->getDefaultPool()) ListAggNode(*tdbb->getDefaultPool(), distinct); @@ -805,7 +805,7 @@ desc->dsc_flags = 0; } -ExprNode* CountAggNode::copy(thread_db* tdbb, NodeCopier& copier) const +ExprNode* CountAggNode::copy(thread_db* tdbb, NodeCopier& copier) { CountAggNode* node = FB_NEW(*tdbb->getDefaultPool()) CountAggNode(*tdbb->getDefaultPool(), distinct); @@ -1040,7 +1040,7 @@ ERR_post(Arg::Gds(isc_datype_notsup)); // data type not supported for arithmetic } -ExprNode* SumAggNode::copy(thread_db* tdbb, NodeCopier& copier) const +ExprNode* SumAggNode::copy(thread_db* tdbb, NodeCopier& copier) { SumAggNode* node = FB_NEW(*tdbb->getDefaultPool()) SumAggNode(*tdbb->getDefaultPool(), distinct, dialect1); @@ -1123,7 +1123,7 @@ CMP_get_desc(tdbb, csb, arg, desc); } -ExprNode* MaxMinAggNode::copy(thread_db* tdbb, NodeCopier& copier) const +ExprNode* MaxMinAggNode::copy(thread_db* tdbb, NodeCopier& copier) { MaxMinAggNode* node = FB_NEW(*tdbb->getDefaultPool()) MaxMinAggNode(*tdbb->getDefaultPool(), type); Modified: firebird/trunk/src/dsql/AggNodes.h =================================================================== --- firebird/trunk/src/dsql/AggNodes.h 2010-08-09 14:50:11 UTC (rev 51417) +++ firebird/trunk/src/dsql/AggNodes.h 2010-08-09 15:48:51 UTC (rev 51418) @@ -39,7 +39,7 @@ virtual void make(dsc* desc, dsql_nod* nullReplacement); virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc); - virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier) const; + virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier); virtual ExprNode* pass2(thread_db* tdbb, CompilerScratch* csb); virtual void aggInit(thread_db* tdbb, jrd_req* request) const; @@ -65,7 +65,7 @@ virtual bool setParameterType(DsqlCompilerScratch* dsqlScratch, dsql_nod* node, bool forceVarChar) const; virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc); - virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier) const; + virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier); virtual void checkOrderedWindowCapable() const { @@ -84,7 +84,7 @@ private: dsql_nod* dsqlDelimiter; - jrd_nod* delimiter; + NestConst<jrd_nod> delimiter; }; class CountAggNode : public AggNode @@ -97,7 +97,7 @@ virtual void make(dsc* desc, dsql_nod* nullReplacement); virtual void genBlr(); virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc); - virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier) const; + virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier); virtual void aggInit(thread_db* tdbb, jrd_req* request) const; virtual void aggPass(thread_db* tdbb, jrd_req* request, dsc* desc) const; @@ -116,7 +116,7 @@ virtual void make(dsc* desc, dsql_nod* nullReplacement); virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc); - virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier) const; + virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier); virtual void aggInit(thread_db* tdbb, jrd_req* request) const; virtual void aggPass(thread_db* tdbb, jrd_req* request, dsc* desc) const; @@ -141,7 +141,7 @@ virtual void make(dsc* desc, dsql_nod* nullReplacement); virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc); - virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier) const; + virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier); virtual void aggInit(thread_db* tdbb, jrd_req* request) const; virtual void aggPass(thread_db* tdbb, jrd_req* request, dsc* desc) const; Modified: firebird/trunk/src/dsql/ExprNodes.cpp =================================================================== --- firebird/trunk/src/dsql/ExprNodes.cpp 2010-08-09 14:50:11 UTC (rev 51417) +++ firebird/trunk/src/dsql/ExprNodes.cpp 2010-08-09 15:48:51 UTC (rev 51418) @@ -57,9 +57,15 @@ reinterpret_cast<ExprNode*>(node->nod_arg[0]) : NULL; } -ExprNode* ExprNode::fromLegacy(const jrd_nod* node) +const ExprNode* ExprNode::fromLegacy(const jrd_nod* node) { return node->nod_type == nod_class_exprnode_jrd ? + reinterpret_cast<const ExprNode*>(node->nod_arg[0]) : NULL; +} + +ExprNode* ExprNode::fromLegacy(jrd_nod* node) +{ + return node->nod_type == nod_class_exprnode_jrd ? reinterpret_cast<ExprNode*>(node->nod_arg[0]) : NULL; } @@ -111,14 +117,14 @@ ExprNode* ExprNode::pass1(thread_db* tdbb, CompilerScratch* csb) { - for (jrd_nod*** i = jrdChildNodes.begin(); i != jrdChildNodes.end(); ++i) + for (NestConst<jrd_nod>** i = jrdChildNodes.begin(); i != jrdChildNodes.end(); ++i) **i = CMP_pass1(tdbb, csb, **i); return this; } ExprNode* ExprNode::pass2(thread_db* tdbb, CompilerScratch* csb) { - for (jrd_nod*** i = jrdChildNodes.begin(); i != jrdChildNodes.end(); ++i) + for (NestConst<jrd_nod>** i = jrdChildNodes.begin(); i != jrdChildNodes.end(); ++i) **i = CMP_pass2(tdbb, csb, **i, node); return this; } @@ -127,7 +133,7 @@ { bool ret = false; - for (jrd_nod*** i = jrdChildNodes.begin(); i != jrdChildNodes.end(); ++i) + for (NestConst<jrd_nod>** i = jrdChildNodes.begin(); i != jrdChildNodes.end(); ++i) ret |= visitor.visit(**i); return ret; @@ -203,7 +209,7 @@ DataTypeUtil(tdbb).makeConcatenate(desc, &desc1, &desc2); } -ExprNode* ConcatenateNode::copy(thread_db* tdbb, NodeCopier& copier) const +ExprNode* ConcatenateNode::copy(thread_db* tdbb, NodeCopier& copier) { ConcatenateNode* node = FB_NEW(*tdbb->getDefaultPool()) ConcatenateNode(*tdbb->getDefaultPool()); node->arg1 = copier.copy(tdbb, arg1); @@ -591,7 +597,7 @@ fb_assert(false); } -ExprNode* OverNode::copy(thread_db* /*tdbb*/, NodeCopier& /*copier*/) const +ExprNode* OverNode::copy(thread_db* /*tdbb*/, NodeCopier& /*copier*/) { fb_assert(false); return NULL; @@ -687,7 +693,7 @@ CMP_get_desc(tdbb, csb, escape, &tempDesc); } -ExprNode* SubstringSimilarNode::copy(thread_db* tdbb, NodeCopier& copier) const +ExprNode* SubstringSimilarNode::copy(thread_db* tdbb, NodeCopier& copier) { SubstringSimilarNode* node = FB_NEW(*tdbb->getDefaultPool()) SubstringSimilarNode( *tdbb->getDefaultPool()); @@ -947,7 +953,7 @@ delete *pArgs; } -ExprNode* SysFuncCallNode::copy(thread_db* tdbb, NodeCopier& copier) const +ExprNode* SysFuncCallNode::copy(thread_db* tdbb, NodeCopier& copier) { SysFuncCallNode* node = FB_NEW(*tdbb->getDefaultPool()) SysFuncCallNode( *tdbb->getDefaultPool(), name); @@ -1169,7 +1175,7 @@ desc->clear(); } -ExprNode* UdfCallNode::copy(thread_db* tdbb, NodeCopier& copier) const +ExprNode* UdfCallNode::copy(thread_db* tdbb, NodeCopier& copier) { UdfCallNode* node = FB_NEW(*tdbb->getDefaultPool()) UdfCallNode(*tdbb->getDefaultPool(), name); node->args = copier.copy(tdbb, args); Modified: firebird/trunk/src/dsql/ExprNodes.h =================================================================== --- firebird/trunk/src/dsql/ExprNodes.h 2010-08-09 14:50:11 UTC (rev 51417) +++ firebird/trunk/src/dsql/ExprNodes.h 2010-08-09 15:48:51 UTC (rev 51418) @@ -47,7 +47,7 @@ virtual void make(dsc* desc, dsql_nod* nullReplacement); virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc); - virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier) const; + virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier); virtual ExprNode* pass2(thread_db* tdbb, CompilerScratch* csb); virtual dsc* execute(thread_db* tdbb, jrd_req* request) const; @@ -57,8 +57,8 @@ public: dsql_nod* dsqlArg1; dsql_nod* dsqlArg2; - jrd_nod* arg1; - jrd_nod* arg2; + NestConst<jrd_nod> arg1; + NestConst<jrd_nod> arg2; }; @@ -83,7 +83,7 @@ virtual void make(dsc* desc, dsql_nod* nullReplacement); virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc); - virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier) const; + virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier); virtual dsc* execute(thread_db* tdbb, jrd_req* request) const; protected: @@ -112,7 +112,7 @@ virtual void make(dsc* desc, dsql_nod* nullReplacement); virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc); - virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier) const; + virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier); virtual ExprNode* pass1(thread_db* tdbb, CompilerScratch* csb); virtual ExprNode* pass2(thread_db* tdbb, CompilerScratch* csb); virtual dsc* execute(thread_db* tdbb, jrd_req* request) const; @@ -124,9 +124,9 @@ dsql_nod* dsqlExpr; dsql_nod* dsqlPattern; dsql_nod* dsqlEscape; - jrd_nod* expr; - jrd_nod* pattern; - jrd_nod* escape; + NestConst<jrd_nod> expr; + NestConst<jrd_nod> pattern; + NestConst<jrd_nod> escape; }; @@ -144,7 +144,7 @@ virtual void make(dsc* desc, dsql_nod* nullReplacement); virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc); - virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier) const; + virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier); virtual bool dsqlMatch(const ExprNode* other, bool ignoreMapCast) const; virtual ExprNode* pass2(thread_db* tdbb, CompilerScratch* csb); virtual dsc* execute(thread_db* tdbb, jrd_req* request) const; @@ -156,7 +156,7 @@ Firebird::MetaName name; dsql_nod* dsqlArgs; bool dsqlSpecialSyntax; - jrd_nod* args; + NestConst<jrd_nod> args; const SysFunction* function; }; @@ -175,7 +175,7 @@ virtual void make(dsc* desc, dsql_nod* nullReplacement); virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc); - virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier) const; + virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier); virtual bool dsqlMatch(const ExprNode* other, bool ignoreMapCast) const; virtual ExprNode* pass1(thread_db* tdbb, CompilerScratch* csb); virtual ExprNode* pass2(thread_db* tdbb, CompilerScratch* csb); @@ -187,7 +187,7 @@ public: Firebird::QualifiedName name; dsql_nod* dsqlArgs; - jrd_nod* args; + NestConst<jrd_nod> args; /*const*/ Function* function; private: Modified: firebird/trunk/src/dsql/Nodes.h =================================================================== --- firebird/trunk/src/dsql/Nodes.h 2010-08-09 14:50:11 UTC (rev 51417) +++ firebird/trunk/src/dsql/Nodes.h 2010-08-09 15:48:51 UTC (rev 51418) @@ -28,7 +28,7 @@ #include "../dsql/node.h" #include "../dsql/Visitors.h" #include "../common/classes/array.h" -//#include "../common/classes/ByteChunk.h" +#include "../common/classes/NestConst.h" namespace Jrd { @@ -199,7 +199,7 @@ virtual DmlNode* pass2(thread_db* tdbb, CompilerScratch* csb) = 0; protected: - jrd_nod* node; + NestConst<jrd_nod> node; }; @@ -273,7 +273,8 @@ } static ExprNode* fromLegacy(const dsql_nod* node); - static ExprNode* fromLegacy(const jrd_nod* node); + static const ExprNode* fromLegacy(const jrd_nod* node); + static ExprNode* fromLegacy(jrd_nod* node); virtual bool dsqlAggregateFinder(AggregateFinder& visitor) { @@ -341,7 +342,7 @@ virtual void make(dsc* desc, dsql_nod* nullReplacement) = 0; virtual void getDesc(thread_db* tdbb, CompilerScratch* csb, dsc* desc) = 0; - virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier) const = 0; + virtual ExprNode* copy(thread_db* tdbb, NodeCopier& copier) = 0; virtual dsc* execute(thread_db* tdbb, jrd_req* request) const = 0; protected: @@ -349,7 +350,7 @@ virtual bool dsqlVisit(NonConstDsqlNodeVisitor& visitor); virtual bool jrdVisit(JrdNodeVisitor& visitor); - void addChildNode(dsql_nod*& dsqlNode, jrd_nod*& jrdNode) + void addChildNode(dsql_nod*& dsqlNode, NestConst<jrd_nod>& jrdNode) { dsqlChildNodes.add(&dsqlNode); jrdChildNodes.add(&jrdNode); @@ -364,7 +365,7 @@ const Type type; const char* dsqlCompatDialectVerb; Firebird::Array<dsql_nod**> dsqlChildNodes; - Firebird::Array<jrd_nod**> jrdChildNodes; + Firebird::Array<NestConst<jrd_nod>*> jrdChildNodes; }; class AggNode : public TypedNode<ExprNode, ExprNode::TYPE_AGGREGATE> @@ -487,7 +488,7 @@ bool distinct; bool dialect1; dsql_nod* dsqlArg; - jrd_nod* arg; + NestConst<jrd_nod> arg; const AggregateSort* asb; bool indexed; }; @@ -553,7 +554,7 @@ { } - virtual jrd_nod* execute(thread_db* tdbb, jrd_req* request) const = 0; + virtual const jrd_nod* execute(thread_db* tdbb, jrd_req* request) const = 0; }; @@ -580,7 +581,7 @@ return this; } - jrd_nod* execute(thread_db* /*tdbb*/, jrd_req* /*request*/) const + const jrd_nod* execute(thread_db* /*tdbb*/, jrd_req* /*request*/) const { fb_assert(false); return NULL; Modified: firebird/trunk/src/dsql/StmtNodes.cpp =================================================================== --- firebird/trunk/src/dsql/StmtNodes.cpp 2010-08-09 14:50:11 UTC (rev 51417) +++ firebird/trunk/src/dsql/StmtNodes.cpp 2010-08-09 15:48:51 UTC (rev 51418) @@ -441,7 +441,7 @@ } -jrd_nod* IfNode::execute(thread_db* tdbb, jrd_req* request) const +const jrd_nod* IfNode::execute(thread_db* tdbb, jrd_req* request) const { if (request->req_operation == jrd_req::req_evaluate) { @@ -530,7 +530,7 @@ } -jrd_nod* InAutonomousTransactionNode::execute(thread_db* tdbb, jrd_req* request) const +const jrd_nod* InAutonomousTransactionNode::execute(thread_db* tdbb, jrd_req* request) const { Jrd::Attachment* attachment = request->req_attachment; SLONG* savNumber = request->getImpure<SLONG>(savNumberOffset); @@ -1090,7 +1090,7 @@ } -jrd_nod* ExceptionNode::execute(thread_db* tdbb, jrd_req* request) const +const jrd_nod* ExceptionNode::execute(thread_db* tdbb, jrd_req* request) const { if (request->req_operation == jrd_req::req_evaluate) { @@ -1428,7 +1428,7 @@ return this; } -jrd_nod* ForNode::execute(thread_db* tdbb, jrd_req* request) const +const jrd_nod* ForNode::execute(thread_db* tdbb, jrd_req* request) const { switch (request->req_operation) { @@ -1453,7 +1453,7 @@ case jrd_req::req_unwind: { - jrd_nod* parent = node->nod_parent; + const jrd_nod* parent = node->nod_parent; if (parent && parent->nod_type == nod_label && request->req_label == (USHORT)(IPTR) parent->nod_arg[e_lbl_label] && @@ -1549,7 +1549,7 @@ } -jrd_nod* PostEventNode::execute(thread_db* tdbb, jrd_req* request) const +const jrd_nod* PostEventNode::execute(thread_db* tdbb, jrd_req* request) const { jrd_tra* transaction = request->req_transaction; @@ -1654,7 +1654,7 @@ } -jrd_nod* SavepointNode::execute(thread_db* tdbb, jrd_req* request) const +const jrd_nod* SavepointNode::execute(thread_db* tdbb, jrd_req* request) const { jrd_tra* transaction = request->req_transaction; @@ -1833,7 +1833,7 @@ // Execute a SEND statement. -jrd_nod* SuspendNode::execute(thread_db* /*tdbb*/, jrd_req* request) const +const jrd_nod* SuspendNode::execute(thread_db* /*tdbb*/, jrd_req* request) const { switch (request->req_operation) { Modified: firebird/trunk/src/dsql/StmtNodes.h =================================================================== --- firebird/trunk/src/dsql/StmtNodes.h 2010-08-09 14:50:11 UTC (rev 51417) +++ firebird/trunk/src/dsql/StmtNodes.h 2010-08-09 15:48:51 UTC (rev 51418) @@ -60,15 +60,15 @@ virtual void genBlr(); virtual IfNode* pass1(thread_db* tdbb, CompilerScratch* csb); virtual IfNode* pass2(thread_db* tdbb, CompilerScratch* csb); - virtual jrd_nod* execute(thread_db* tdbb, jrd_req* request) const; + virtual const jrd_nod* execute(thread_db* tdbb, jrd_req* request) const; public: dsql_nod* dsqlCondition; dsql_nod* dsqlTrueAction; dsql_nod* dsqlFalseAction; - jrd_nod* condition; - jrd_nod* trueAction; - jrd_nod* falseAction; + NestConst<jrd_nod> condition; + NestConst<jrd_nod> trueAction; + NestConst<jrd_nod> falseAction; }; @@ -94,11 +94,11 @@ virtual void genBlr(); virtual InAutonomousTransactionNode* pass1(thread_db* tdbb, CompilerScratch* csb); virtual InAutonomousTransactionNode* pass2(thread_db* tdbb, CompilerScratch* csb); - virtual jrd_nod* execute(thread_db* tdbb, jrd_req* request) const; + virtual const jrd_nod* execute(thread_db* tdbb, jrd_req* request) const; public: dsql_nod* dsqlAction; - jrd_nod* action; + NestConst<jrd_nod> action; SLONG savNumberOffset; }; @@ -160,7 +160,7 @@ virtual void genBlr(); virtual ExceptionNode* pass1(thread_db* tdbb, CompilerScratch* csb); virtual ExceptionNode* pass2(thread_db* tdbb, CompilerScratch* csb); - virtual jrd_nod* execute(thread_db* tdbb, jrd_req* request) const; + virtual const jrd_nod* execute(thread_db* tdbb, jrd_req* request) const; private: void setError(thread_db* tdbb) const; @@ -169,8 +169,8 @@ F... [truncated message content] |
From: <fir...@us...> - 2010-08-11 03:16:25
|
Revision: 51430 http://firebird.svn.sourceforge.net/firebird/?rev=51430&view=rev Author: firebirds Date: 2010-08-11 03:16:18 +0000 (Wed, 11 Aug 2010) Log Message: ----------- nightly update Modified Paths: -------------- firebird/trunk/ChangeLog firebird/trunk/src/jrd/build_no.h firebird/trunk/src/misc/writeBuildNum.sh Modified: firebird/trunk/ChangeLog =================================================================== --- firebird/trunk/ChangeLog 2010-08-11 02:59:33 UTC (rev 51429) +++ firebird/trunk/ChangeLog 2010-08-11 03:16:18 UTC (rev 51430) @@ -1,3 +1,36 @@ + 2010-08-11 02:59 asfernandes + M src/dsql/ExprNodes.cpp + M src/dsql/ExprNodes.h + M src/dsql/StmtNodes.cpp + M src/jrd/exe.h + M src/jrd/met.epp + M src/jrd/nod.h + M src/jrd/par.cpp +Better internal handling of dependencies + + 2010-08-10 15:20 asfernandes + M src/dsql/DdlNodes.epp + M src/dsql/DdlNodes.h + M src/dsql/StmtNodes.h + M src/dsql/parse.y +Misc + + 2010-08-10 11:08 alexpeshkoff + A mkChangeLog.sh +BuildNum and ChangeLog generator + + 2010-08-10 10:42 alexpeshkoff + M src/misc/writeBuildNum.sh +misc + + 2010-08-10 07:49 alexpeshkoff + M ChangeLog +rolled back test change + + 2010-08-10 07:31 firebirds + M ChangeLog +nightly update - test commit, please ignore + 2010-08-10 00:37 asfernandes M src/dsql/DdlNodes.epp M src/jrd/btr.cpp Modified: firebird/trunk/src/jrd/build_no.h =================================================================== --- firebird/trunk/src/jrd/build_no.h 2010-08-11 02:59:33 UTC (rev 51429) +++ firebird/trunk/src/jrd/build_no.h 2010-08-11 03:16:18 UTC (rev 51430) @@ -3,16 +3,16 @@ *** DO NOT EDIT *** TO CHANGE ANY INFORMATION IN HERE PLEASE EDIT src/misc/writeBuildNum.sh - FORMAL BUILD NUMBER:28669 + FORMAL BUILD NUMBER:28675 */ -#define PRODUCT_VER_STRING "3.0.0.28669" -#define FILE_VER_STRING "WI-T3.0.0.28669" -#define LICENSE_VER_STRING "WI-T3.0.0.28669" -#define FILE_VER_NUMBER 3, 0, 0, 28669 +#define PRODUCT_VER_STRING "3.0.0.28675" +#define FILE_VER_STRING "WI-T3.0.0.28675" +#define LICENSE_VER_STRING "WI-T3.0.0.28675" +#define FILE_VER_NUMBER 3, 0, 0, 28675 #define FB_MAJOR_VER "3" #define FB_MINOR_VER "0" #define FB_REV_NO "0" -#define FB_BUILD_NO "28669" +#define FB_BUILD_NO "28675" #define FB_BUILD_TYPE "T" #define FB_BUILD_SUFFIX "Firebird 3.0 Unstable" Modified: firebird/trunk/src/misc/writeBuildNum.sh =================================================================== --- firebird/trunk/src/misc/writeBuildNum.sh 2010-08-11 02:59:33 UTC (rev 51429) +++ firebird/trunk/src/misc/writeBuildNum.sh 2010-08-11 03:16:18 UTC (rev 51430) @@ -9,7 +9,7 @@ MajorVer=3 MinorVer=0 RevNo=0 -BuildNum=28669 +BuildNum=28675 if [ "$SPECIAL_BUILD_SUFFIX" = "" ]; then # Normal builds This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fir...@us...> - 2010-08-12 03:13:33
|
Revision: 51437 http://firebird.svn.sourceforge.net/firebird/?rev=51437&view=rev Author: firebirds Date: 2010-08-12 03:13:26 +0000 (Thu, 12 Aug 2010) Log Message: ----------- nightly update Modified Paths: -------------- firebird/trunk/ChangeLog firebird/trunk/src/jrd/build_no.h firebird/trunk/src/misc/writeBuildNum.sh Modified: firebird/trunk/ChangeLog =================================================================== --- firebird/trunk/ChangeLog 2010-08-12 00:59:48 UTC (rev 51436) +++ firebird/trunk/ChangeLog 2010-08-12 03:13:26 UTC (rev 51437) @@ -1,3 +1,20 @@ + 2010-08-12 00:59 asfernandes + M src/dsql/ExprNodes.cpp + M src/jrd/JrdStatement.cpp + M src/jrd/JrdStatement.h + M src/jrd/exe.cpp + M src/jrd/exe.h +More consts + + 2010-08-11 15:33 asfernandes + M src/common/classes/NestConst.h + M src/dsql/StmtNodes.h +Misc + + 2010-08-11 15:22 firebirds + M src/misc/smallog.cpp +make output in brnches better + 2010-08-11 02:59 asfernandes M src/dsql/ExprNodes.cpp M src/dsql/ExprNodes.h Modified: firebird/trunk/src/jrd/build_no.h =================================================================== --- firebird/trunk/src/jrd/build_no.h 2010-08-12 00:59:48 UTC (rev 51436) +++ firebird/trunk/src/jrd/build_no.h 2010-08-12 03:13:26 UTC (rev 51437) @@ -3,16 +3,16 @@ *** DO NOT EDIT *** TO CHANGE ANY INFORMATION IN HERE PLEASE EDIT src/misc/writeBuildNum.sh - FORMAL BUILD NUMBER:28675 + FORMAL BUILD NUMBER:28678 */ -#define PRODUCT_VER_STRING "3.0.0.28675" -#define FILE_VER_STRING "WI-T3.0.0.28675" -#define LICENSE_VER_STRING "WI-T3.0.0.28675" -#define FILE_VER_NUMBER 3, 0, 0, 28675 +#define PRODUCT_VER_STRING "3.0.0.28678" +#define FILE_VER_STRING "WI-T3.0.0.28678" +#define LICENSE_VER_STRING "WI-T3.0.0.28678" +#define FILE_VER_NUMBER 3, 0, 0, 28678 #define FB_MAJOR_VER "3" #define FB_MINOR_VER "0" #define FB_REV_NO "0" -#define FB_BUILD_NO "28675" +#define FB_BUILD_NO "28678" #define FB_BUILD_TYPE "T" #define FB_BUILD_SUFFIX "Firebird 3.0 Unstable" Modified: firebird/trunk/src/misc/writeBuildNum.sh =================================================================== --- firebird/trunk/src/misc/writeBuildNum.sh 2010-08-12 00:59:48 UTC (rev 51436) +++ firebird/trunk/src/misc/writeBuildNum.sh 2010-08-12 03:13:26 UTC (rev 51437) @@ -9,7 +9,7 @@ MajorVer=3 MinorVer=0 RevNo=0 -BuildNum=28675 +BuildNum=28678 if [ "$SPECIAL_BUILD_SUFFIX" = "" ]; then # Normal builds This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fir...@us...> - 2010-08-13 03:16:40
|
Revision: 51440 http://firebird.svn.sourceforge.net/firebird/?rev=51440&view=rev Author: firebirds Date: 2010-08-13 03:16:33 +0000 (Fri, 13 Aug 2010) Log Message: ----------- nightly update Modified Paths: -------------- firebird/trunk/ChangeLog firebird/trunk/src/jrd/build_no.h firebird/trunk/src/misc/writeBuildNum.sh Modified: firebird/trunk/ChangeLog =================================================================== --- firebird/trunk/ChangeLog 2010-08-12 10:32:50 UTC (rev 51439) +++ firebird/trunk/ChangeLog 2010-08-13 03:16:33 UTC (rev 51440) @@ -1,3 +1,8 @@ + 2010-08-12 10:32 robocop + M src/jrd/exe.h + M src/jrd/par.cpp +Misc. + 2010-08-12 00:59 asfernandes M src/dsql/ExprNodes.cpp M src/jrd/JrdStatement.cpp Modified: firebird/trunk/src/jrd/build_no.h =================================================================== --- firebird/trunk/src/jrd/build_no.h 2010-08-12 10:32:50 UTC (rev 51439) +++ firebird/trunk/src/jrd/build_no.h 2010-08-13 03:16:33 UTC (rev 51440) @@ -3,16 +3,16 @@ *** DO NOT EDIT *** TO CHANGE ANY INFORMATION IN HERE PLEASE EDIT src/misc/writeBuildNum.sh - FORMAL BUILD NUMBER:28678 + FORMAL BUILD NUMBER:28679 */ -#define PRODUCT_VER_STRING "3.0.0.28678" -#define FILE_VER_STRING "WI-T3.0.0.28678" -#define LICENSE_VER_STRING "WI-T3.0.0.28678" -#define FILE_VER_NUMBER 3, 0, 0, 28678 +#define PRODUCT_VER_STRING "3.0.0.28679" +#define FILE_VER_STRING "WI-T3.0.0.28679" +#define LICENSE_VER_STRING "WI-T3.0.0.28679" +#define FILE_VER_NUMBER 3, 0, 0, 28679 #define FB_MAJOR_VER "3" #define FB_MINOR_VER "0" #define FB_REV_NO "0" -#define FB_BUILD_NO "28678" +#define FB_BUILD_NO "28679" #define FB_BUILD_TYPE "T" #define FB_BUILD_SUFFIX "Firebird 3.0 Unstable" Modified: firebird/trunk/src/misc/writeBuildNum.sh =================================================================== --- firebird/trunk/src/misc/writeBuildNum.sh 2010-08-12 10:32:50 UTC (rev 51439) +++ firebird/trunk/src/misc/writeBuildNum.sh 2010-08-13 03:16:33 UTC (rev 51440) @@ -9,7 +9,7 @@ MajorVer=3 MinorVer=0 RevNo=0 -BuildNum=28678 +BuildNum=28679 if [ "$SPECIAL_BUILD_SUFFIX" = "" ]; then # Normal builds This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fir...@us...> - 2010-08-14 03:14:23
|
Revision: 51447 http://firebird.svn.sourceforge.net/firebird/?rev=51447&view=rev Author: firebirds Date: 2010-08-14 03:14:17 +0000 (Sat, 14 Aug 2010) Log Message: ----------- nightly update Modified Paths: -------------- firebird/trunk/ChangeLog firebird/trunk/src/jrd/build_no.h firebird/trunk/src/misc/writeBuildNum.sh Modified: firebird/trunk/ChangeLog =================================================================== --- firebird/trunk/ChangeLog 2010-08-13 15:22:00 UTC (rev 51446) +++ firebird/trunk/ChangeLog 2010-08-14 03:14:17 UTC (rev 51447) @@ -1,3 +1,28 @@ + 2010-08-13 15:22 asfernandes + M src/common/classes/NestConst.h + M src/jrd/ExtEngineManager.cpp + M src/jrd/ExtEngineManager.h + M src/jrd/Function.h + M src/jrd/ValuesImpl.h + M src/jrd/cmp.cpp + M src/jrd/cmp_proto.h + M src/jrd/exe.h + M src/jrd/jrd.h + M src/jrd/met.epp + M src/jrd/par.cpp + M src/jrd/recsrc/ProcedureScan.cpp + M src/jrd/recsrc/RecordSource.cpp + M src/jrd/recsrc/RecordSource.h +More consts + + 2010-08-13 09:37 firebirds + M mkChangeLog.sh +per-branch consts + + 2010-08-13 08:41 firebirds + M src/misc/smallog.cpp +Better handling of commits to be skipped + 2010-08-12 10:32 robocop M src/jrd/exe.h M src/jrd/par.cpp @@ -49,10 +74,6 @@ M ChangeLog rolled back test change - 2010-08-10 07:31 firebirds - M ChangeLog -nightly update - test commit, please ignore - 2010-08-10 00:37 asfernandes M src/dsql/DdlNodes.epp M src/jrd/btr.cpp Modified: firebird/trunk/src/jrd/build_no.h =================================================================== --- firebird/trunk/src/jrd/build_no.h 2010-08-13 15:22:00 UTC (rev 51446) +++ firebird/trunk/src/jrd/build_no.h 2010-08-14 03:14:17 UTC (rev 51447) @@ -3,16 +3,16 @@ *** DO NOT EDIT *** TO CHANGE ANY INFORMATION IN HERE PLEASE EDIT src/misc/writeBuildNum.sh - FORMAL BUILD NUMBER:28679 + FORMAL BUILD NUMBER:28681 */ -#define PRODUCT_VER_STRING "3.0.0.28679" -#define FILE_VER_STRING "WI-T3.0.0.28679" -#define LICENSE_VER_STRING "WI-T3.0.0.28679" -#define FILE_VER_NUMBER 3, 0, 0, 28679 +#define PRODUCT_VER_STRING "3.0.0.28681" +#define FILE_VER_STRING "WI-T3.0.0.28681" +#define LICENSE_VER_STRING "WI-T3.0.0.28681" +#define FILE_VER_NUMBER 3, 0, 0, 28681 #define FB_MAJOR_VER "3" #define FB_MINOR_VER "0" #define FB_REV_NO "0" -#define FB_BUILD_NO "28679" +#define FB_BUILD_NO "28681" #define FB_BUILD_TYPE "T" #define FB_BUILD_SUFFIX "Firebird 3.0 Unstable" Modified: firebird/trunk/src/misc/writeBuildNum.sh =================================================================== --- firebird/trunk/src/misc/writeBuildNum.sh 2010-08-13 15:22:00 UTC (rev 51446) +++ firebird/trunk/src/misc/writeBuildNum.sh 2010-08-14 03:14:17 UTC (rev 51447) @@ -9,7 +9,7 @@ MajorVer=3 MinorVer=0 RevNo=0 -BuildNum=28679 +BuildNum=28681 if [ "$SPECIAL_BUILD_SUFFIX" = "" ]; then # Normal builds This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fir...@us...> - 2010-08-16 03:14:09
|
Revision: 51451 http://firebird.svn.sourceforge.net/firebird/?rev=51451&view=rev Author: firebirds Date: 2010-08-16 03:14:03 +0000 (Mon, 16 Aug 2010) Log Message: ----------- nightly update Modified Paths: -------------- firebird/trunk/ChangeLog firebird/trunk/src/jrd/build_no.h firebird/trunk/src/misc/writeBuildNum.sh Modified: firebird/trunk/ChangeLog =================================================================== --- firebird/trunk/ChangeLog 2010-08-16 01:47:24 UTC (rev 51450) +++ firebird/trunk/ChangeLog 2010-08-16 03:14:03 UTC (rev 51451) @@ -1,3 +1,7 @@ + 2010-08-16 01:47 asfernandes + M src/misc/blrtable.cpp +Fix wrong nod_type of scrollable cursors + 2010-08-13 15:22 asfernandes M src/common/classes/NestConst.h M src/jrd/ExtEngineManager.cpp Modified: firebird/trunk/src/jrd/build_no.h =================================================================== --- firebird/trunk/src/jrd/build_no.h 2010-08-16 01:47:24 UTC (rev 51450) +++ firebird/trunk/src/jrd/build_no.h 2010-08-16 03:14:03 UTC (rev 51451) @@ -3,16 +3,16 @@ *** DO NOT EDIT *** TO CHANGE ANY INFORMATION IN HERE PLEASE EDIT src/misc/writeBuildNum.sh - FORMAL BUILD NUMBER:28681 + FORMAL BUILD NUMBER:28682 */ -#define PRODUCT_VER_STRING "3.0.0.28681" -#define FILE_VER_STRING "WI-T3.0.0.28681" -#define LICENSE_VER_STRING "WI-T3.0.0.28681" -#define FILE_VER_NUMBER 3, 0, 0, 28681 +#define PRODUCT_VER_STRING "3.0.0.28682" +#define FILE_VER_STRING "WI-T3.0.0.28682" +#define LICENSE_VER_STRING "WI-T3.0.0.28682" +#define FILE_VER_NUMBER 3, 0, 0, 28682 #define FB_MAJOR_VER "3" #define FB_MINOR_VER "0" #define FB_REV_NO "0" -#define FB_BUILD_NO "28681" +#define FB_BUILD_NO "28682" #define FB_BUILD_TYPE "T" #define FB_BUILD_SUFFIX "Firebird 3.0 Unstable" Modified: firebird/trunk/src/misc/writeBuildNum.sh =================================================================== --- firebird/trunk/src/misc/writeBuildNum.sh 2010-08-16 01:47:24 UTC (rev 51450) +++ firebird/trunk/src/misc/writeBuildNum.sh 2010-08-16 03:14:03 UTC (rev 51451) @@ -9,7 +9,7 @@ MajorVer=3 MinorVer=0 RevNo=0 -BuildNum=28681 +BuildNum=28682 if [ "$SPECIAL_BUILD_SUFFIX" = "" ]; then # Normal builds This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <asf...@us...> - 2010-08-24 04:10:38
|
Revision: 51464 http://firebird.svn.sourceforge.net/firebird/?rev=51464&view=rev Author: asfernandes Date: 2010-08-24 03:25:01 +0000 (Tue, 24 Aug 2010) Log Message: ----------- Refactor nod_rse, nod_relation, nod_procedure, nod_union, nod_aggregate and nod_window. Modified Paths: -------------- firebird/trunk/builds/posix/make.shared.variables firebird/trunk/builds/win32/msvc10/engine.vcxproj firebird/trunk/builds/win32/msvc10/engine.vcxproj.filters firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj.filters firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj.filters firebird/trunk/builds/win32/msvc9/engine.vcproj firebird/trunk/builds/win32/msvc9/engine_classic.vcproj firebird/trunk/builds/win32/msvc9/engine_embed.vcproj firebird/trunk/src/dsql/ExprNodes.cpp firebird/trunk/src/dsql/Nodes.h firebird/trunk/src/dsql/StmtNodes.cpp firebird/trunk/src/dsql/StmtNodes.h firebird/trunk/src/dsql/Visitors.h firebird/trunk/src/jrd/Attachment.h firebird/trunk/src/jrd/Optimizer.cpp firebird/trunk/src/jrd/Optimizer.h firebird/trunk/src/jrd/Relation.h firebird/trunk/src/jrd/cmp.cpp firebird/trunk/src/jrd/cmp_proto.h firebird/trunk/src/jrd/exe.cpp firebird/trunk/src/jrd/exe.h firebird/trunk/src/jrd/jrd.h firebird/trunk/src/jrd/lls.h firebird/trunk/src/jrd/met.epp firebird/trunk/src/jrd/nod.h firebird/trunk/src/jrd/opt.cpp firebird/trunk/src/jrd/opt_proto.h firebird/trunk/src/jrd/par.cpp firebird/trunk/src/jrd/par_proto.h firebird/trunk/src/jrd/recsrc/RecordSource.h firebird/trunk/src/jrd/recsrc/Union.cpp firebird/trunk/src/misc/blrtable.cpp Added Paths: ----------- firebird/trunk/src/jrd/RecordSourceNodes.cpp firebird/trunk/src/jrd/RecordSourceNodes.h Modified: firebird/trunk/builds/posix/make.shared.variables =================================================================== --- firebird/trunk/builds/posix/make.shared.variables 2010-08-24 03:15:58 UTC (rev 51463) +++ firebird/trunk/builds/posix/make.shared.variables 2010-08-24 03:25:01 UTC (rev 51464) @@ -42,7 +42,7 @@ svc.cpp SysFunction.cpp TempSpace.cpp tpc.cpp tra.cpp validation.cpp \ ValueImpl.cpp ValuesImpl.cpp vio.cpp \ nodebug.cpp nbak.cpp $(Physical_IO_Module) TextType.cpp \ - unicode_util.cpp RuntimeStatistics.cpp DebugInterface.cpp \ + unicode_util.cpp RecordSourceNodes.cpp RuntimeStatistics.cpp DebugInterface.cpp \ extds/ExtDS.cpp extds/InternalDS.cpp extds/IscDS.cpp \ trace/TraceConfigStorage.cpp trace/TraceLog.cpp \ trace/TraceManager.cpp trace/TraceObjects.cpp \ Modified: firebird/trunk/builds/win32/msvc10/engine.vcxproj =================================================================== --- firebird/trunk/builds/win32/msvc10/engine.vcxproj 2010-08-24 03:15:58 UTC (rev 51463) +++ firebird/trunk/builds/win32/msvc10/engine.vcxproj 2010-08-24 03:25:01 UTC (rev 51464) @@ -221,6 +221,7 @@ <ClCompile Include="..\..\..\src\jrd\PreparedStatement.cpp" /> <ClCompile Include="..\..\..\src\jrd\RandomGenerator.cpp" /> <ClCompile Include="..\..\..\src\jrd\RecordBuffer.cpp" /> + <ClCompile Include="..\..\..\src\jrd\RecordSourceNodes.cpp" /> <ClCompile Include="..\..\..\src\jrd\Relation.cpp" /> <ClCompile Include="..\..\..\src\jrd\ResultSet.cpp" /> <ClCompile Include="..\..\..\src\jrd\rlck.cpp" /> @@ -427,6 +428,7 @@ <ClInclude Include="..\..\..\src\jrd\que.h" /> <ClInclude Include="..\..\..\src\jrd\RandomGenerator.h" /> <ClInclude Include="..\..\..\src\jrd\RecordBuffer.h" /> + <ClInclude Include="..\..\..\src\jrd\RecordSourceNodes.h" /> <ClInclude Include="..\..\..\src\jrd\recsrc\RecordSource.h" /> <ClInclude Include="..\..\..\src\jrd\Relation.h" /> <ClInclude Include="..\..\..\src\jrd\relations.h" /> Modified: firebird/trunk/builds/win32/msvc10/engine.vcxproj.filters =================================================================== --- firebird/trunk/builds/win32/msvc10/engine.vcxproj.filters 2010-08-24 03:15:58 UTC (rev 51463) +++ firebird/trunk/builds/win32/msvc10/engine.vcxproj.filters 2010-08-24 03:25:01 UTC (rev 51464) @@ -240,6 +240,9 @@ <ClCompile Include="..\..\..\src\jrd\RecordBuffer.cpp"> <Filter>JRD files</Filter> </ClCompile> + <ClCompile Include="..\..\..\src\jrd\RecordSourceNodes.cpp"> + <Filter>JRD files</Filter> + </ClCompile> <ClCompile Include="..\..\..\src\jrd\Relation.cpp"> <Filter>JRD files</Filter> </ClCompile> @@ -854,6 +857,9 @@ <ClInclude Include="..\..\..\src\jrd\RecordBuffer.h"> <Filter>Header files</Filter> </ClInclude> + <ClInclude Include="..\..\..\src\jrd\RecordSourceNodes.h"> + <Filter>Header files</Filter> + </ClInclude> <ClInclude Include="..\..\..\src\jrd\recsrc\RecordSource.h"> <Filter>Header files</Filter> </ClInclude> Modified: firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj =================================================================== --- firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj 2010-08-24 03:15:58 UTC (rev 51463) +++ firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj 2010-08-24 03:25:01 UTC (rev 51464) @@ -221,6 +221,7 @@ <ClCompile Include="..\..\..\src\jrd\PreparedStatement.cpp" /> <ClCompile Include="..\..\..\src\jrd\RandomGenerator.cpp" /> <ClCompile Include="..\..\..\src\jrd\RecordBuffer.cpp" /> + <ClCompile Include="..\..\..\src\jrd\RecordSourceNodes.cpp" /> <ClCompile Include="..\..\..\src\jrd\Relation.cpp" /> <ClCompile Include="..\..\..\src\jrd\ResultSet.cpp" /> <ClCompile Include="..\..\..\src\jrd\rlck.cpp" /> @@ -427,6 +428,7 @@ <ClInclude Include="..\..\..\src\jrd\que.h" /> <ClInclude Include="..\..\..\src\jrd\RandomGenerator.h" /> <ClInclude Include="..\..\..\src\jrd\RecordBuffer.h" /> + <ClInclude Include="..\..\..\src\jrd\RecordSourceNodes.h" /> <ClInclude Include="..\..\..\src\jrd\recsrc\RecordSource.h" /> <ClInclude Include="..\..\..\src\jrd\Relation.h" /> <ClInclude Include="..\..\..\src\jrd\relations.h" /> Modified: firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj.filters =================================================================== --- firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj.filters 2010-08-24 03:15:58 UTC (rev 51463) +++ firebird/trunk/builds/win32/msvc10/engine_classic.vcxproj.filters 2010-08-24 03:25:01 UTC (rev 51464) @@ -240,6 +240,9 @@ <ClCompile Include="..\..\..\src\jrd\RecordBuffer.cpp"> <Filter>JRD files</Filter> </ClCompile> + <ClCompile Include="..\..\..\src\jrd\RecordSourceNodes.cpp"> + <Filter>JRD files</Filter> + </ClCompile> <ClCompile Include="..\..\..\src\jrd\Relation.cpp"> <Filter>JRD files</Filter> </ClCompile> @@ -854,6 +857,9 @@ <ClInclude Include="..\..\..\src\jrd\RecordBuffer.h"> <Filter>Header files</Filter> </ClInclude> + <ClInclude Include="..\..\..\src\jrd\RecordSourceNodes.h"> + <Filter>Header files</Filter> + </ClInclude> <ClInclude Include="..\..\..\src\jrd\recsrc\RecordSource.h"> <Filter>Header files</Filter> </ClInclude> Modified: firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj =================================================================== --- firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj 2010-08-24 03:15:58 UTC (rev 51463) +++ firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj 2010-08-24 03:25:01 UTC (rev 51464) @@ -221,6 +221,7 @@ <ClCompile Include="..\..\..\src\jrd\PreparedStatement.cpp" /> <ClCompile Include="..\..\..\src\jrd\RandomGenerator.cpp" /> <ClCompile Include="..\..\..\src\jrd\RecordBuffer.cpp" /> + <ClCompile Include="..\..\..\src\jrd\RecordSourceNodes.cpp" /> <ClCompile Include="..\..\..\src\jrd\Relation.cpp" /> <ClCompile Include="..\..\..\src\jrd\ResultSet.cpp" /> <ClCompile Include="..\..\..\src\jrd\rlck.cpp" /> @@ -427,6 +428,7 @@ <ClInclude Include="..\..\..\src\jrd\que.h" /> <ClInclude Include="..\..\..\src\jrd\RandomGenerator.h" /> <ClInclude Include="..\..\..\src\jrd\RecordBuffer.h" /> + <ClInclude Include="..\..\..\src\jrd\RecordSourceNodes.h" /> <ClInclude Include="..\..\..\src\jrd\recsrc\RecordSource.h" /> <ClInclude Include="..\..\..\src\jrd\Relation.h" /> <ClInclude Include="..\..\..\src\jrd\relations.h" /> Modified: firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj.filters =================================================================== --- firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj.filters 2010-08-24 03:15:58 UTC (rev 51463) +++ firebird/trunk/builds/win32/msvc10/engine_embed.vcxproj.filters 2010-08-24 03:25:01 UTC (rev 51464) @@ -240,6 +240,9 @@ <ClCompile Include="..\..\..\src\jrd\RecordBuffer.cpp"> <Filter>JRD files</Filter> </ClCompile> + <ClCompile Include="..\..\..\src\jrd\RecordSourceNodes.cpp"> + <Filter>JRD files</Filter> + </ClCompile> <ClCompile Include="..\..\..\src\jrd\Relation.cpp"> <Filter>JRD files</Filter> </ClCompile> @@ -857,6 +860,9 @@ <ClInclude Include="..\..\..\src\jrd\recsrc\RecordSource.h"> <Filter>Header files</Filter> </ClInclude> + <ClInclude Include="..\..\..\src\jrd\RecordSourceNodes.h"> + <Filter>Header files</Filter> + </ClInclude> <ClInclude Include="..\..\..\src\jrd\Relation.h"> <Filter>Header files</Filter> </ClInclude> Modified: firebird/trunk/builds/win32/msvc9/engine.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc9/engine.vcproj 2010-08-24 03:15:58 UTC (rev 51463) +++ firebird/trunk/builds/win32/msvc9/engine.vcproj 2010-08-24 03:25:01 UTC (rev 51464) @@ -572,6 +572,10 @@ > </File> <File + RelativePath="..\..\..\src\jrd\RecordSourceNodes.cpp" + > + </File> + <File RelativePath="..\..\..\src\jrd\Relation.cpp" > </File> @@ -1392,6 +1396,10 @@ > </File> <File + RelativePath="..\..\..\src\jrd\RecordSourceNodes.h" + > + </File> + <File RelativePath="..\..\..\src\jrd\recsrc\RecordSource.h" > </File> Modified: firebird/trunk/builds/win32/msvc9/engine_classic.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc9/engine_classic.vcproj 2010-08-24 03:15:58 UTC (rev 51463) +++ firebird/trunk/builds/win32/msvc9/engine_classic.vcproj 2010-08-24 03:25:01 UTC (rev 51464) @@ -572,6 +572,10 @@ > </File> <File + RelativePath="..\..\..\src\jrd\RecordSourceNodes.cpp" + > + </File> + <File RelativePath="..\..\..\src\jrd\Relation.cpp" > </File> @@ -1392,6 +1396,10 @@ > </File> <File + RelativePath="..\..\..\src\jrd\RecordSourceNodes.h" + > + </File> + <File RelativePath="..\..\..\src\jrd\recsrc\RecordSource.h" > </File> Modified: firebird/trunk/builds/win32/msvc9/engine_embed.vcproj =================================================================== --- firebird/trunk/builds/win32/msvc9/engine_embed.vcproj 2010-08-24 03:15:58 UTC (rev 51463) +++ firebird/trunk/builds/win32/msvc9/engine_embed.vcproj 2010-08-24 03:25:01 UTC (rev 51464) @@ -572,6 +572,10 @@ > </File> <File + RelativePath="..\..\..\src\jrd\RecordSourceNodes.cpp" + > + </File> + <File RelativePath="..\..\..\src\jrd\Relation.cpp" > </File> @@ -1392,6 +1396,10 @@ > </File> <File + RelativePath="..\..\..\src\jrd\RecordSourceNodes.h" + > + </File> + <File RelativePath="..\..\..\src\jrd\recsrc\RecordSource.h" > </File> Modified: firebird/trunk/src/dsql/ExprNodes.cpp =================================================================== --- firebird/trunk/src/dsql/ExprNodes.cpp 2010-08-24 03:15:58 UTC (rev 51463) +++ firebird/trunk/src/dsql/ExprNodes.cpp 2010-08-24 03:25:01 UTC (rev 51464) @@ -709,7 +709,7 @@ // We need to take care of invariantness expressions to be able to pre-compile the pattern. node->nod_flags |= nod_invariant; - csb->csb_current_nodes.push(node); + csb->csb_current_nodes.push(node.getObject()); pattern = CMP_pass1(tdbb, csb, pattern); escape = CMP_pass1(tdbb, csb, escape); @@ -721,11 +721,11 @@ if ((node->nod_flags & nod_invariant) && (pattern->nod_type != nod_literal || escape->nod_type != nod_literal)) { - const jrd_node_base* const* ctx_node, *const *end; + const LegacyNodeOrRseNode* ctx_node, *end; for (ctx_node = csb->csb_current_nodes.begin(), end = csb->csb_current_nodes.end(); - ctx_node < end; ctx_node++) + ctx_node != end; ++ctx_node) { - if ((*ctx_node)->nod_type == nod_rse) + if (ctx_node->rseNode) break; } Modified: firebird/trunk/src/dsql/Nodes.h =================================================================== --- firebird/trunk/src/dsql/Nodes.h 2010-08-24 03:15:58 UTC (rev 51463) +++ firebird/trunk/src/dsql/Nodes.h 2010-08-24 03:25:01 UTC (rev 51464) @@ -38,7 +38,7 @@ class dsql_nod; class ExprNode; class jrd_nod; -class RecordSelExpr; +class RseNode; class SlidingWindow; class TypeClause; @@ -550,7 +550,7 @@ } public: - virtual void pass2Cursor(RecordSelExpr*& /*rsePtr*/, Cursor**& /*cursorPtr*/) + virtual void pass2Cursor(RseNode*& /*rsePtr*/, Cursor**& /*cursorPtr*/) { } Modified: firebird/trunk/src/dsql/StmtNodes.cpp =================================================================== --- firebird/trunk/src/dsql/StmtNodes.cpp 2010-08-24 03:15:58 UTC (rev 51463) +++ firebird/trunk/src/dsql/StmtNodes.cpp 2010-08-24 03:25:01 UTC (rev 51464) @@ -26,6 +26,7 @@ #include "../dsql/node.h" #include "../jrd/blr.h" #include "../jrd/tra.h" +#include "../jrd/RecordSourceNodes.h" #include "../jrd/recsrc/Cursor.h" #include "../jrd/cmp_proto.h" #include "../jrd/dfw_proto.h" @@ -1291,10 +1292,10 @@ csb->csb_blr_reader.peekByte() == (UCHAR) blr_singular || csb->csb_blr_reader.peekByte() == (UCHAR) blr_scrollable) { - node->rse = PAR_parse_node(tdbb, csb, TYPE_RSE); + node->rse = RseNode::getFrom(PAR_parse_node(tdbb, csb, TYPE_RSE)); } else - node->rse = PAR_rse(tdbb, csb, blrOp); + node->rse = RseNode::getFrom(PAR_rse(tdbb, csb, blrOp)); node->statement = PAR_parse_node(tdbb, csb, STATEMENT); @@ -1414,7 +1415,7 @@ StmtNode* ForNode::pass1(thread_db* tdbb, CompilerScratch* csb) { stall = CMP_pass1(tdbb, csb, stall); - rse = CMP_pass1(tdbb, csb, rse); + rse->pass1(tdbb, csb, csb->csb_view); statement = CMP_pass1(tdbb, csb, statement); return this; } @@ -1422,7 +1423,7 @@ StmtNode* ForNode::pass2(thread_db* tdbb, CompilerScratch* csb) { stall = CMP_pass2(tdbb, csb, stall, node); - rse = CMP_pass2(tdbb, csb, rse, node); + rse->pass2(tdbb, csb); statement = CMP_pass2(tdbb, csb, statement, node); return this; } Modified: firebird/trunk/src/dsql/StmtNodes.h =================================================================== --- firebird/trunk/src/dsql/StmtNodes.h 2010-08-24 03:15:58 UTC (rev 51463) +++ firebird/trunk/src/dsql/StmtNodes.h 2010-08-24 03:25:01 UTC (rev 51464) @@ -220,9 +220,9 @@ virtual StmtNode* pass1(thread_db* tdbb, CompilerScratch* csb); virtual StmtNode* pass2(thread_db* tdbb, CompilerScratch* csb); - virtual void pass2Cursor(RecordSelExpr*& rsePtr, Cursor**& cursorPtr) + virtual void pass2Cursor(RseNode*& rsePtr, Cursor**& cursorPtr) { - rsePtr = reinterpret_cast<RecordSelExpr*>(static_cast<jrd_nod*>(rse)); + rsePtr = rse; cursorPtr = cursor.getAddress(); } @@ -236,7 +236,7 @@ dsql_nod* dsqlLabel; bool dsqlForceSingular; NestConst<jrd_nod> stall; - NestConst<jrd_nod> rse; + NestConst<RseNode> rse; NestConst<jrd_nod> statement; NestConst<Cursor> cursor; }; Modified: firebird/trunk/src/dsql/Visitors.h =================================================================== --- firebird/trunk/src/dsql/Visitors.h 2010-08-24 03:15:58 UTC (rev 51463) +++ firebird/trunk/src/dsql/Visitors.h 2010-08-24 03:25:01 UTC (rev 51464) @@ -427,7 +427,7 @@ virtual USHORT getFieldId(jrd_nod* input); -protected: +public: CompilerScratch* csb; UCHAR* remap; jrd_nod* message; Modified: firebird/trunk/src/jrd/Attachment.h =================================================================== --- firebird/trunk/src/jrd/Attachment.h 2010-08-24 03:15:58 UTC (rev 51463) +++ firebird/trunk/src/jrd/Attachment.h 2010-08-24 03:25:01 UTC (rev 51464) @@ -65,7 +65,6 @@ class IndexLock; class ArrayField; struct sort_context; - class RecordSelExpr; class vcl; class TextType; class Parameter; Modified: firebird/trunk/src/jrd/Optimizer.cpp =================================================================== --- firebird/trunk/src/jrd/Optimizer.cpp 2010-08-24 03:15:58 UTC (rev 51463) +++ firebird/trunk/src/jrd/Optimizer.cpp 2010-08-24 03:25:01 UTC (rev 51464) @@ -36,6 +36,7 @@ #include "../jrd/rse.h" #include "../jrd/ods.h" #include "../jrd/Optimizer.h" +#include "../jrd/RecordSourceNodes.h" #include "../jrd/recsrc/RecordSource.h" #include "../dsql/ExprNodes.h" #include "../dsql/StmtNodes.h" @@ -89,44 +90,17 @@ DEV_BLKCHK(csb, type_csb); DEV_BLKCHK(node, type_nod); - if (node->nod_flags & nod_deoptimize) { + if (node->nod_flags & nod_deoptimize) return false; - } // Recurse thru interesting sub-nodes switch (node->nod_type) { - case nod_procedure: - { - jrd_nod* inputs = node->nod_arg[e_prc_inputs]; - if (inputs) - { - fb_assert(inputs->nod_type == nod_asn_list); - jrd_nod* const* ptr = inputs->nod_arg; - for (const jrd_nod* const* const end = ptr + inputs->nod_count; ptr < end; ptr++) - { - if (!OPT_computable(csb, *ptr, stream, idx_use, allowOnlyCurrentStream)) { - return false; - } - } - } - break; - } + case nod_class_recsrcnode_jrd: + return reinterpret_cast<RecordSourceNode*>(node->nod_arg[0])->computable( + csb, stream, idx_use, allowOnlyCurrentStream, NULL); - case nod_union: - { - jrd_nod* clauses = node->nod_arg[e_uni_clauses]; - jrd_nod* const* ptr = clauses->nod_arg; - for (const jrd_nod* const* const end = ptr + clauses->nod_count; ptr < end; ptr += 2) - { - if (!OPT_computable(csb, *ptr, stream, idx_use, allowOnlyCurrentStream)) { - return false; - } - } - break; - } - case nod_class_exprnode_jrd: { ExprNode* exprNode = reinterpret_cast<ExprNode*>(node->nod_arg[0]); @@ -146,17 +120,13 @@ jrd_nod* const* ptr = node->nod_arg; for (const jrd_nod* const* const end = ptr + node->nod_count; ptr < end; ptr++) { - if (!OPT_computable(csb, *ptr, stream, idx_use, allowOnlyCurrentStream)) { + if (!OPT_computable(csb, *ptr, stream, idx_use, allowOnlyCurrentStream)) return false; - } } break; } } - RecordSelExpr* rse; - jrd_nod* sub; - jrd_nod* value; USHORT n; switch (node->nod_type) @@ -166,15 +136,12 @@ if (allowOnlyCurrentStream) { if (n != stream && !(csb->csb_rpt[n].csb_flags & csb_sub_stream)) - { return false; - } } else { - if (n == stream) { + if (n == stream) return false; - } } return csb->csb_rpt[n].csb_flags & csb_active; @@ -225,115 +192,24 @@ case nod_total: case nod_count: case nod_from: - if ((sub = node->nod_arg[e_stat_default]) && - !OPT_computable(csb, sub, stream, idx_use, allowOnlyCurrentStream)) { - return false; - } - rse = (RecordSelExpr*) node->nod_arg[e_stat_rse]; - value = node->nod_arg[e_stat_value]; - break; + jrd_nod* sub; - case nod_rse: - rse = (RecordSelExpr*) node; - value = NULL; - break; - - case nod_aggregate: - rse = (RecordSelExpr*) node->nod_arg[e_agg_rse]; - rse->rse_sorted = node->nod_arg[e_agg_group]; - value = NULL; - break; - - case nod_window: - rse = (RecordSelExpr*) node->nod_arg[e_win_rse]; - value = NULL; - break; - - default: - return true; - } - - // Node is a record selection expression. - bool result = true; - - if ((sub = rse->rse_first) && !OPT_computable(csb, sub, stream, idx_use, allowOnlyCurrentStream)) { - return false; - } - - if ((sub = rse->rse_skip) && !OPT_computable(csb, sub, stream, idx_use, allowOnlyCurrentStream)) { - return false; - } - - // Set sub-streams of rse active - jrd_nod* const* ptr; - const jrd_nod* const* end; - - for (ptr = rse->rse_relation, end = ptr + rse->rse_count; ptr < end; ptr++) - { - const jrd_nod* const node = *ptr; - - if (node->nod_type == nod_window) - { - const jrd_nod* windows = node->nod_arg[e_win_windows]; - - for (unsigned i = 0; i < windows->nod_count; ++i) + if ((sub = node->nod_arg[e_stat_default]) && + !OPT_computable(csb, sub, stream, idx_use, allowOnlyCurrentStream)) { - n = (USHORT)(IPTR) windows->nod_arg[i]->nod_arg[e_part_stream]; - csb->csb_rpt[n].csb_flags |= (csb_active | csb_sub_stream); + return false; } - } - else if (node->nod_type != nod_rse) - { - n = (USHORT)(IPTR) node->nod_arg[STREAM_INDEX(node)]; - csb->csb_rpt[n].csb_flags |= (csb_active | csb_sub_stream); - } - } - // Check sub-stream - if (((sub = rse->rse_boolean) && !OPT_computable(csb, sub, stream, idx_use, allowOnlyCurrentStream)) || - ((sub = rse->rse_sorted) && !OPT_computable(csb, sub, stream, idx_use, allowOnlyCurrentStream)) || - ((sub = rse->rse_projection) && !OPT_computable(csb, sub, stream, idx_use, allowOnlyCurrentStream))) - { - result = false; - } + fb_assert(node->nod_arg[e_stat_rse]->nod_type == nod_class_recsrcnode_jrd); + RseNode* rse = reinterpret_cast<RseNode*>(node->nod_arg[e_stat_rse]->nod_arg[0]); - for (ptr = rse->rse_relation, end = ptr + rse->rse_count; ptr < end && result; ptr++) - { - if (!OPT_computable(csb, (*ptr), stream, idx_use, allowOnlyCurrentStream)) - { - result = false; + return rse->computable(csb, stream, idx_use, allowOnlyCurrentStream, + node->nod_arg[e_stat_value]); } } - // Check value expression, if any - if (result && value && !OPT_computable(csb, value, stream, idx_use, allowOnlyCurrentStream)) { - result = false; - } - - // Reset streams inactive - for (ptr = rse->rse_relation, end = ptr + rse->rse_count; ptr < end; ptr++) - { - const jrd_nod* const node = *ptr; - - if (node->nod_type == nod_window) - { - const jrd_nod* windows = node->nod_arg[e_win_windows]; - - for (unsigned i = 0; i < windows->nod_count; ++i) - { - n = (USHORT)(IPTR) windows->nod_arg[i]->nod_arg[e_part_stream]; - csb->csb_rpt[n].csb_flags &= ~(csb_active | csb_sub_stream); - } - } - else if (node->nod_type != nod_rse) - { - n = (USHORT)(IPTR) (*ptr)->nod_arg[STREAM_INDEX((*ptr))]; - csb->csb_rpt[n].csb_flags &= ~(csb_active | csb_sub_stream); - } - } - - return result; + return true; } @@ -1067,6 +943,7 @@ return OPT_make_binary_node(node_type, node1, node2, false); } + void OptimizerRetrieval::findDependentFromStreams(jrd_nod* node, SortedStreamList* streamList) const { /************************************** @@ -1081,30 +958,8 @@ // Recurse thru interesting sub-nodes - if (node->nod_type == nod_procedure) + if (node->nod_type == nod_class_exprnode_jrd) { - jrd_nod* const inputs = node->nod_arg[e_prc_inputs]; - if (inputs) - { - fb_assert(inputs->nod_type == nod_asn_list); - jrd_nod* const* ptr = inputs->nod_arg; - for (const jrd_nod* const* const end = ptr + inputs->nod_count; ptr < end; ptr++) - { - findDependentFromStreams(*ptr, streamList); - } - } - } - else if (node->nod_type == nod_union) - { - jrd_nod* const clauses = node->nod_arg[e_uni_clauses]; - jrd_nod* const* ptr = clauses->nod_arg; - for (const jrd_nod* const* const end = ptr + clauses->nod_count; ptr < end; ptr += 2) - { - findDependentFromStreams(*ptr, streamList); - } - } - else if (node->nod_type == nod_class_exprnode_jrd) - { ExprNode* exprNode = reinterpret_cast<ExprNode*>(node->nod_arg[0]); for (NestConst<NestConst<jrd_nod> >* i = exprNode->jrdChildNodes.begin(); @@ -1113,19 +968,19 @@ findDependentFromStreams(**i, streamList); } } + else if (node->nod_type == nod_class_recsrcnode_jrd) + { + reinterpret_cast<RecordSourceNode*>(node->nod_arg[0])->findDependentFromStreams( + this, streamList); + } else { jrd_nod* const* ptr = node->nod_arg; + for (const jrd_nod* const* const end = ptr + node->nod_count; ptr < end; ptr++) - { findDependentFromStreams(*ptr, streamList); - } } - RecordSelExpr* rse; - jrd_nod* sub; - jrd_nod* value; - switch (node->nod_type) { case nod_field: @@ -1136,9 +991,8 @@ (csb->csb_rpt[fieldStream].csb_flags & csb_active) && !(csb->csb_rpt[fieldStream].csb_flags & csb_trigger)) { - if (!streamList->exist(fieldStream)) { + if (!streamList->exist(fieldStream)) streamList->add(fieldStream); - } } return; } @@ -1180,67 +1034,26 @@ case nod_total: case nod_count: case nod_from: - if (sub = node->nod_arg[e_stat_default]) { + { + jrd_nod* sub; + + if (sub = node->nod_arg[e_stat_default]) findDependentFromStreams(sub, streamList); - } - rse = (RecordSelExpr*) node->nod_arg[e_stat_rse]; - value = node->nod_arg[e_stat_value]; - break; - case nod_rse: - rse = (RecordSelExpr*) node; - value = NULL; - break; + fb_assert(node->nod_arg[e_stat_rse]->nod_type == nod_class_recsrcnode_jrd); + RseNode* rse = reinterpret_cast<RseNode*>(node->nod_arg[e_stat_rse]->nod_arg[0]); - case nod_aggregate: - rse = (RecordSelExpr*) node->nod_arg[e_agg_rse]; - rse->rse_sorted = node->nod_arg[e_agg_group]; - value = NULL; - break; + rse->findDependentFromStreams(this, streamList); - case nod_window: - rse = (RecordSelExpr*) node->nod_arg[e_win_rse]; - value = NULL; - break; + jrd_nod* value = node->nod_arg[e_stat_value]; - default: - return; - } + // Check value expression, if any + if (value) + findDependentFromStreams(value, streamList); - // Node is a record selection expression. - if (sub = rse->rse_first) { - findDependentFromStreams(sub, streamList); + break; + } } - - if (sub = rse->rse_skip) { - findDependentFromStreams(sub, streamList); - } - - if (sub = rse->rse_boolean) { - findDependentFromStreams(sub, streamList); - } - - if (sub = rse->rse_sorted) { - findDependentFromStreams(sub, streamList); - } - - if (sub = rse->rse_projection) { - findDependentFromStreams(sub, streamList); - } - - jrd_nod* const* ptr; - const jrd_nod* const* end; - for (ptr = rse->rse_relation, end = ptr + rse->rse_count; ptr < end; ptr++) - { - findDependentFromStreams(*ptr, streamList); - } - - // Check value expression, if any - if (value) { - findDependentFromStreams(value, streamList); - } - - return; } const string& OptimizerRetrieval::getAlias() Modified: firebird/trunk/src/jrd/Optimizer.h =================================================================== --- firebird/trunk/src/jrd/Optimizer.h 2010-08-24 03:15:58 UTC (rev 51463) +++ firebird/trunk/src/jrd/Optimizer.h 2010-08-24 03:25:01 UTC (rev 51464) @@ -80,24 +80,6 @@ Firebird::string OPT_make_alias(thread_db*, const CompilerScratch*, const CompilerScratch::csb_repeat*); jrd_nod* OPT_make_binary_node(nod_t, jrd_nod*, jrd_nod*, bool); -inline int STREAM_INDEX(const jrd_nod* node) -{ - switch (node->nod_type) - { - case nod_relation: - return e_rel_stream; - case nod_procedure: - return e_prc_stream; - case nod_union: - return e_uni_stream; - case nod_aggregate: - return e_agg_stream; - default: - fb_assert(false); - return 0; // silence compiler warning. - } -} - enum segmentScanType { segmentScanNone, segmentScanGreater, @@ -146,8 +128,6 @@ Firebird::Array<IndexScratchSegment*> segments; }; -typedef Firebird::SortedArray<int> SortedStreamList; - class InversionCandidate { public: @@ -182,9 +162,10 @@ InversionCandidate* getCost(); InversionCandidate* getInversion(IndexTableScan** rsb); + void findDependentFromStreams(jrd_nod* node, SortedStreamList* streamList) const; + protected: jrd_nod* composeInversion(jrd_nod* node1, jrd_nod* node2, nod_t node_type) const; - void findDependentFromStreams(jrd_nod* node, SortedStreamList* streamList) const; const Firebird::string& getAlias(); InversionCandidate* generateInversion(IndexTableScan** rsb); IndexTableScan* generateNavigation(); Added: firebird/trunk/src/jrd/RecordSourceNodes.cpp =================================================================== --- firebird/trunk/src/jrd/RecordSourceNodes.cpp (rev 0) +++ firebird/trunk/src/jrd/RecordSourceNodes.cpp 2010-08-24 03:25:01 UTC (rev 51464) @@ -0,0 +1,2444 @@ +/* + * The contents of this file are subject to the Interbase 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.Inprise.com/IPL.html + * + * Software distributed under the License is distributed on an + * "AS IS" basis, 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 Inprise Corporation + * and its predecessors. Portions created by Inprise Corporation are + * Copyright (C) Inprise Corporation. + * + * All Rights Reserved. + * Contributor(s): ______________________________________. + * Adriano dos Santos Fernandes + */ + +#include "firebird.h" +#include "../jrd/common.h" +#include "../jrd/align.h" +#include "../jrd/RecordSourceNodes.h" +#include "../jrd/DataTypeUtil.h" +#include "../jrd/Optimizer.h" +#include "../jrd/recsrc/RecordSource.h" +#include "../jrd/btr_proto.h" +#include "../jrd/cmp_proto.h" +#include "../jrd/dbg_proto.h" +#include "../jrd/dsc_proto.h" +#include "../jrd/met_proto.h" +#include "../jrd/opt_proto.h" +#include "../jrd/par_proto.h" + +using namespace Firebird; +using namespace Jrd; + + +static jrd_nod* parseMap(thread_db* tdbb, CompilerScratch* csb, USHORT stream); +static SSHORT strcmpSpace(const char* p, const char* q); +static void processSource(thread_db* tdbb, CompilerScra... [truncated message content] |
From: <fir...@us...> - 2010-08-25 03:15:31
|
Revision: 51474 http://firebird.svn.sourceforge.net/firebird/?rev=51474&view=rev Author: firebirds Date: 2010-08-25 03:15:25 +0000 (Wed, 25 Aug 2010) Log Message: ----------- nightly update Modified Paths: -------------- firebird/trunk/ChangeLog firebird/trunk/src/jrd/build_no.h firebird/trunk/src/misc/writeBuildNum.sh Modified: firebird/trunk/ChangeLog =================================================================== --- firebird/trunk/ChangeLog 2010-08-25 03:10:12 UTC (rev 51473) +++ firebird/trunk/ChangeLog 2010-08-25 03:15:25 UTC (rev 51474) @@ -1,3 +1,73 @@ + 2010-08-25 01:35 asfernandes + M src/jrd/RecordSourceNodes.cpp + M src/jrd/RecordSourceNodes.h + M src/jrd/opt.cpp +Misc + + 2010-08-25 01:01 asfernandes + M src/jrd/RecordSourceNodes.cpp +Remove do-nothing checks from the new file + + 2010-08-25 00:42 asfernandes + M src/jrd/cmp.cpp + M src/jrd/met.epp +Misc + + 2010-08-24 17:49 dimitr + M src/jrd/opt.cpp +Refactored the rivers management a bit. + + 2010-08-24 16:26 asfernandes + M src/jrd/cmp.cpp +Correction + + 2010-08-24 11:58 dimitr + M src/dsql/ExprNodes.cpp +Fixed incomplete processing of UDF arguments, causing server crashes. + + 2010-08-24 08:27 firebirds + M mkChangeLog.sh +Fixed correct buildno in 2.5 + + 2010-08-24 03:25 asfernandes + M builds/posix/make.shared.variables + M builds/win32/msvc10/engine.vcxproj + M builds/win32/msvc10/engine.vcxproj.filters + M builds/win32/msvc10/engine_classic.vcxproj + M builds/win32/msvc10/engine_classic.vcxproj.filters + M builds/win32/msvc10/engine_embed.vcxproj + M builds/win32/msvc10/engine_embed.vcxproj.filters + M builds/win32/msvc9/engine.vcproj + M builds/win32/msvc9/engine_classic.vcproj + M builds/win32/msvc9/engine_embed.vcproj + M src/dsql/ExprNodes.cpp + M src/dsql/Nodes.h + M src/dsql/StmtNodes.cpp + M src/dsql/StmtNodes.h + M src/dsql/Visitors.h + M src/jrd/Attachment.h + M src/jrd/Optimizer.cpp + M src/jrd/Optimizer.h + A src/jrd/RecordSourceNodes.cpp + A src/jrd/RecordSourceNodes.h + M src/jrd/Relation.h + M src/jrd/cmp.cpp + M src/jrd/cmp_proto.h + M src/jrd/exe.cpp + M src/jrd/exe.h + M src/jrd/jrd.h + M src/jrd/lls.h + M src/jrd/met.epp + M src/jrd/nod.h + M src/jrd/opt.cpp + M src/jrd/opt_proto.h + M src/jrd/par.cpp + M src/jrd/par_proto.h + M src/jrd/recsrc/RecordSource.h + M src/jrd/recsrc/Union.cpp + M src/misc/blrtable.cpp +Refactor nod_rse, nod_relation, nod_procedure, nod_union, nod_aggregate and nod_window. + 2010-08-16 01:47 asfernandes M src/misc/blrtable.cpp Fix wrong nod_type of scrollable cursors Modified: firebird/trunk/src/jrd/build_no.h =================================================================== --- firebird/trunk/src/jrd/build_no.h 2010-08-25 03:10:12 UTC (rev 51473) +++ firebird/trunk/src/jrd/build_no.h 2010-08-25 03:15:25 UTC (rev 51474) @@ -3,16 +3,16 @@ *** DO NOT EDIT *** TO CHANGE ANY INFORMATION IN HERE PLEASE EDIT src/misc/writeBuildNum.sh - FORMAL BUILD NUMBER:28682 + FORMAL BUILD NUMBER:28690 */ -#define PRODUCT_VER_STRING "3.0.0.28682" -#define FILE_VER_STRING "WI-T3.0.0.28682" -#define LICENSE_VER_STRING "WI-T3.0.0.28682" -#define FILE_VER_NUMBER 3, 0, 0, 28682 +#define PRODUCT_VER_STRING "3.0.0.28690" +#define FILE_VER_STRING "WI-T3.0.0.28690" +#define LICENSE_VER_STRING "WI-T3.0.0.28690" +#define FILE_VER_NUMBER 3, 0, 0, 28690 #define FB_MAJOR_VER "3" #define FB_MINOR_VER "0" #define FB_REV_NO "0" -#define FB_BUILD_NO "28682" +#define FB_BUILD_NO "28690" #define FB_BUILD_TYPE "T" #define FB_BUILD_SUFFIX "Firebird 3.0 Unstable" Modified: firebird/trunk/src/misc/writeBuildNum.sh =================================================================== --- firebird/trunk/src/misc/writeBuildNum.sh 2010-08-25 03:10:12 UTC (rev 51473) +++ firebird/trunk/src/misc/writeBuildNum.sh 2010-08-25 03:15:25 UTC (rev 51474) @@ -9,7 +9,7 @@ MajorVer=3 MinorVer=0 RevNo=0 -BuildNum=28682 +BuildNum=28690 if [ "$SPECIAL_BUILD_SUFFIX" = "" ]; then # Normal builds This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fir...@us...> - 2010-08-26 03:14:21
|
Revision: 51483 http://firebird.svn.sourceforge.net/firebird/?rev=51483&view=rev Author: firebirds Date: 2010-08-26 03:14:14 +0000 (Thu, 26 Aug 2010) Log Message: ----------- nightly update Modified Paths: -------------- firebird/trunk/ChangeLog firebird/trunk/src/jrd/build_no.h firebird/trunk/src/misc/writeBuildNum.sh Modified: firebird/trunk/ChangeLog =================================================================== --- firebird/trunk/ChangeLog 2010-08-25 15:52:46 UTC (rev 51482) +++ firebird/trunk/ChangeLog 2010-08-26 03:14:14 UTC (rev 51483) @@ -1,3 +1,39 @@ + 2010-08-25 15:52 asfernandes + M src/jrd/RecordSourceNodes.cpp + M src/jrd/RecordSourceNodes.h + M src/jrd/exe.h + M src/jrd/recsrc/RecordSource.h + M src/jrd/recsrc/WindowedStream.cpp +Rework WindowSourceNode to use type-safe partitions + + 2010-08-25 13:36 mapopa + M doc/README.build.msvc.html +Added links to visual c++ studio 2008 + + 2010-08-25 13:25 mapopa + M doc/README.build.msvc.html +Added unicode/classic innosetup note (we are not using unicode version for the moment , only for 3.0 maybe in the future) + + 2010-08-25 12:00 mapopa + M doc/README.build.msvc.html +added innosetup 5 to the build instructions + + 2010-08-25 10:16 mapopa + M doc/README.build.msvc.html +added sed instructions + + 2010-08-25 08:02 dimitr + M src/jrd/cmp.cpp +Fixed a few suspicious places related to the variable cloning. + + 2010-08-25 03:10 asfernandes + M src/jrd/RecordSourceNodes.cpp + M src/jrd/RecordSourceNodes.h + M src/jrd/exe.h + M src/jrd/opt.cpp + M src/jrd/rse.h +Move dozen of parameters of virtual/overriden function to OptimizerBlk + 2010-08-25 01:35 asfernandes M src/jrd/RecordSourceNodes.cpp M src/jrd/RecordSourceNodes.h Modified: firebird/trunk/src/jrd/build_no.h =================================================================== --- firebird/trunk/src/jrd/build_no.h 2010-08-25 15:52:46 UTC (rev 51482) +++ firebird/trunk/src/jrd/build_no.h 2010-08-26 03:14:14 UTC (rev 51483) @@ -3,16 +3,16 @@ *** DO NOT EDIT *** TO CHANGE ANY INFORMATION IN HERE PLEASE EDIT src/misc/writeBuildNum.sh - FORMAL BUILD NUMBER:28690 + FORMAL BUILD NUMBER:28697 */ -#define PRODUCT_VER_STRING "3.0.0.28690" -#define FILE_VER_STRING "WI-T3.0.0.28690" -#define LICENSE_VER_STRING "WI-T3.0.0.28690" -#define FILE_VER_NUMBER 3, 0, 0, 28690 +#define PRODUCT_VER_STRING "3.0.0.28697" +#define FILE_VER_STRING "WI-T3.0.0.28697" +#define LICENSE_VER_STRING "WI-T3.0.0.28697" +#define FILE_VER_NUMBER 3, 0, 0, 28697 #define FB_MAJOR_VER "3" #define FB_MINOR_VER "0" #define FB_REV_NO "0" -#define FB_BUILD_NO "28690" +#define FB_BUILD_NO "28697" #define FB_BUILD_TYPE "T" #define FB_BUILD_SUFFIX "Firebird 3.0 Unstable" Modified: firebird/trunk/src/misc/writeBuildNum.sh =================================================================== --- firebird/trunk/src/misc/writeBuildNum.sh 2010-08-25 15:52:46 UTC (rev 51482) +++ firebird/trunk/src/misc/writeBuildNum.sh 2010-08-26 03:14:14 UTC (rev 51483) @@ -9,7 +9,7 @@ MajorVer=3 MinorVer=0 RevNo=0 -BuildNum=28690 +BuildNum=28697 if [ "$SPECIAL_BUILD_SUFFIX" = "" ]; then # Normal builds This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <asf...@us...> - 2010-08-27 02:18:09
|
Revision: 51488 http://firebird.svn.sourceforge.net/firebird/?rev=51488&view=rev Author: asfernandes Date: 2010-08-27 02:18:00 +0000 (Fri, 27 Aug 2010) Log Message: ----------- 1) Separate DsqlCompilerScratch in its own files. 2) Move BlockNode functionality to it. 3) Move some related CTE functions to it. Modified Paths: -------------- firebird/trunk/builds/posix/make.shared.variables firebird/trunk/src/dsql/DSqlDataTypeUtil.cpp firebird/trunk/src/dsql/DdlNodes.epp firebird/trunk/src/dsql/DdlNodes.h firebird/trunk/src/dsql/Nodes.h firebird/trunk/src/dsql/StmtNodes.cpp firebird/trunk/src/dsql/StmtNodes.h firebird/trunk/src/dsql/dsql.h firebird/trunk/src/dsql/gen.cpp firebird/trunk/src/dsql/misc_func.cpp firebird/trunk/src/dsql/pass1.cpp firebird/trunk/src/dsql/pass1_proto.h Added Paths: ----------- firebird/trunk/src/dsql/DsqlCompilerScratch.cpp firebird/trunk/src/dsql/DsqlCompilerScratch.h Modified: firebird/trunk/builds/posix/make.shared.variables =================================================================== --- firebird/trunk/builds/posix/make.shared.variables 2010-08-26 15:40:51 UTC (rev 51487) +++ firebird/trunk/builds/posix/make.shared.variables 2010-08-27 02:18:00 UTC (rev 51488) @@ -81,7 +81,8 @@ DSQL_ServerFiles= metd.epp DSqlDataTypeUtil.cpp \ 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 PackageNodes.epp AggNodes.cpp BlrWriter.cpp ExprNodes.cpp StmtNodes.cpp WinNodes.cpp + DdlNodes.epp PackageNodes.epp AggNodes.cpp BlrWriter.cpp DsqlCompilerScratch.cpp \ + ExprNodes.cpp StmtNodes.cpp WinNodes.cpp DSQL_Files = $(DSQL_ClientFiles) $(DSQL_ServerFiles) Modified: firebird/trunk/src/dsql/DSqlDataTypeUtil.cpp =================================================================== --- firebird/trunk/src/dsql/DSqlDataTypeUtil.cpp 2010-08-26 15:40:51 UTC (rev 51487) +++ firebird/trunk/src/dsql/DSqlDataTypeUtil.cpp 2010-08-27 02:18:00 UTC (rev 51488) @@ -24,7 +24,7 @@ #include "firebird.h" #include "../dsql/DSqlDataTypeUtil.h" -#include "../dsql/dsql.h" +#include "../dsql/DsqlCompilerScratch.h" #include "../dsql/metd_proto.h" UCHAR Jrd::DSqlDataTypeUtil::maxBytesPerChar(UCHAR charSet) Modified: firebird/trunk/src/dsql/DdlNodes.epp =================================================================== --- firebird/trunk/src/dsql/DdlNodes.epp 2010-08-26 15:40:51 UTC (rev 51487) +++ firebird/trunk/src/dsql/DdlNodes.epp 2010-08-27 02:18:00 UTC (rev 51488) @@ -1157,8 +1157,6 @@ DdlNode* CreateAlterFunctionNode::internalDsqlPass() { - DsqlCompiledStatement* const statement = dsqlScratch->getStatement(); - statement->setBlockNode(this); dsqlScratch->flags |= (DsqlCompilerScratch::FLAG_BLOCK | DsqlCompilerScratch::FLAG_FUNCTION); const dsql_nod* variables = localDeclList; @@ -1488,7 +1486,6 @@ unsigned pos, const ParameterClause& parameter) { Attachment* attachment = transaction->getAttachment(); - DsqlCompiledStatement* statement = dsqlScratch->getStatement(); AutoCacheRequest requestHandle(tdbb, drq_s_func_args2, DYN_REQUESTS); @@ -1591,7 +1588,7 @@ dsqlScratch->getBlrData().clear(); - if (statement->getFlags() & DsqlCompiledStatement::FLAG_BLR_VERSION4) + if (dsqlScratch->isVersion4()) dsqlScratch->appendUChar(blr_version4); else dsqlScratch->appendUChar(blr_version5); @@ -1618,14 +1615,12 @@ compiled = true; invalid = true; - DsqlCompiledStatement* statement = dsqlScratch->getStatement(); - if (body) { dsqlScratch->beginDebug(); dsqlScratch->getBlrData().clear(); - if (statement->getFlags() & DsqlCompiledStatement::FLAG_BLR_VERSION4) + if (dsqlScratch->isVersion4()) dsqlScratch->appendUChar(blr_version4); else dsqlScratch->appendUChar(blr_version5); @@ -1650,7 +1645,7 @@ dsqlScratch->appendUChar(blr_short); dsqlScratch->appendUChar(0); - variables.add(MAKE_variable(parameter.legacyField, + dsqlScratch->variables.add(MAKE_variable(parameter.legacyField, parameter.name.c_str(), VAR_input, 0, (USHORT) (2 * i), 0)); } } @@ -1667,8 +1662,8 @@ dsqlScratch->appendUChar(0); dsql_nod* const var = MAKE_variable(returnType.legacyField, "", VAR_output, 1, 0, 0); - variables.add(var); - outputVariables.add(var); + dsqlScratch->variables.add(var); + dsqlScratch->outputVariables.add(var); if (parameters.getCount() != 0) { @@ -1695,14 +1690,15 @@ } } - dsql_var* const variable = (dsql_var*) outputVariables[0]->nod_arg[Dsql::e_var_variable]; - putLocalVariable(dsqlScratch, variable, 0, NULL); + dsql_var* const variable = + (dsql_var*) dsqlScratch->outputVariables[0]->nod_arg[Dsql::e_var_variable]; + dsqlScratch->putLocalVariable(variable, 0, NULL); // ASF: This is here to not change the old logic (proc_flag) // of previous calls to PASS1_node and PASS1_statement. dsqlScratch->setPsql(true); - putLocalVariables(dsqlScratch, localDeclList, 1); + dsqlScratch->putLocalVariables(localDeclList, 1); dsqlScratch->appendUChar(blr_stall); // put a label before body of procedure, @@ -1714,10 +1710,9 @@ GEN_statement(dsqlScratch, PASS1_statement(dsqlScratch, body)); - statement->setType(DsqlCompiledStatement::TYPE_DDL); + dsqlScratch->getStatement()->setType(DsqlCompiledStatement::TYPE_DDL); dsqlScratch->appendUChar(blr_end); - genReturn(dsqlScratch, false); - + dsqlScratch->genReturn(false); dsqlScratch->appendUChar(blr_end); dsqlScratch->appendUChar(blr_eoc); @@ -1902,8 +1897,6 @@ DdlNode* CreateAlterProcedureNode::internalDsqlPass() { - DsqlCompiledStatement* statement = dsqlScratch->getStatement(); - statement->setBlockNode(this); dsqlScratch->flags |= (DsqlCompilerScratch::FLAG_BLOCK | DsqlCompilerScratch::FLAG_PROCEDURE); const dsql_nod* variables = localDeclList; @@ -2340,11 +2333,9 @@ string defaultSource = string(defaultString->str_data, defaultString->str_length); attachment->storeMetaDataBlob(tdbb, transaction, &PRM.RDB$DEFAULT_SOURCE, defaultSource); - DsqlCompiledStatement* statement = dsqlScratch->getStatement(); - dsqlScratch->getBlrData().clear(); - if (statement->getFlags() & DsqlCompiledStatement::FLAG_BLR_VERSION4) + if (dsqlScratch->isVersion4()) dsqlScratch->appendUChar(blr_version4); else dsqlScratch->appendUChar(blr_version5); @@ -2375,12 +2366,10 @@ invalid = true; - DsqlCompiledStatement* statement = dsqlScratch->getStatement(); - dsqlScratch->beginDebug(); dsqlScratch->getBlrData().clear(); - if (statement->getFlags() & DsqlCompiledStatement::FLAG_BLR_VERSION4) + if (dsqlScratch->isVersion4()) dsqlScratch->appendUChar(blr_version4); else dsqlScratch->appendUChar(blr_version5); @@ -2404,7 +2393,7 @@ dsqlScratch->appendUChar(blr_short); dsqlScratch->appendUChar(0); - variables.add(MAKE_variable(parameter.legacyField, + dsqlScratch->variables.add(MAKE_variable(parameter.legacyField, parameter.name.c_str(), VAR_input, 0, (USHORT) (2 * i), 0)); } } @@ -2429,8 +2418,8 @@ dsql_nod* const var = MAKE_variable(parameter.legacyField, parameter.name.c_str(), VAR_output, 1, (USHORT) (2 * i), i); - variables.add(var); - outputVariables.add(var); + dsqlScratch->variables.add(var); + dsqlScratch->outputVariables.add(var); } } @@ -2463,18 +2452,20 @@ } } - for (Array<dsql_nod*>::const_iterator i = outputVariables.begin(); i != outputVariables.end(); ++i) + for (Array<dsql_nod*>::const_iterator i = dsqlScratch->outputVariables.begin(); + i != dsqlScratch->outputVariables.end(); + ++i) { dsql_nod* parameter = *i; dsql_var* const variable = (dsql_var*) parameter->nod_arg[Dsql::e_var_variable]; - putLocalVariable(dsqlScratch, variable, 0, NULL); + dsqlScratch->putLocalVariable(variable, 0, NULL); } // ASF: This is here to not change the old logic (proc_flag) // of previous calls to PASS1_node and PASS1_statement. dsqlScratch->setPsql(true); - putLocalVariables(dsqlScratch, localDeclList, returns.getCount()); + dsqlScratch->putLocalVariables(localDeclList, returns.getCount()); dsqlScratch->appendUChar(blr_stall); // put a label before body of procedure, @@ -2486,10 +2477,9 @@ GEN_statement(dsqlScratch, PASS1_statement(dsqlScratch, body)); - statement->setType(DsqlCompiledStatement::TYPE_DDL); + dsqlScratch->getStatement()->setType(DsqlCompiledStatement::TYPE_DDL); dsqlScratch->appendUChar(blr_end); - genReturn(dsqlScratch, true); - + dsqlScratch->genReturn(true); dsqlScratch->appendUChar(blr_end); dsqlScratch->appendUChar(blr_eoc); @@ -2779,8 +2769,6 @@ DdlNode* CreateAlterTriggerNode::internalDsqlPass() { - DsqlCompiledStatement* statement = dsqlScratch->getStatement(); - statement->setBlockNode(this); dsqlScratch->flags |= (DsqlCompilerScratch::FLAG_BLOCK | DsqlCompilerScratch::FLAG_TRIGGER); if (type.specified) @@ -2876,8 +2864,6 @@ if (body) { - DsqlCompiledStatement* statement = dsqlScratch->getStatement(); - dsqlScratch->beginDebug(); dsqlScratch->getBlrData().clear(); @@ -2921,7 +2907,7 @@ // generate the trigger blr - if (statement->getFlags() & DsqlCompiledStatement::FLAG_BLR_VERSION4) + if (dsqlScratch->isVersion4()) dsqlScratch->appendUChar(blr_version4); else dsqlScratch->appendUChar(blr_version5); @@ -2929,9 +2915,8 @@ dsqlScratch->appendUChar(blr_begin); dsqlScratch->setPsql(true); + dsqlScratch->putLocalVariables(localDeclList, 0); - putLocalVariables(dsqlScratch, localDeclList, 0); - dsqlScratch->scopeLevel++; // dimitr: I see no reason to deny EXIT command in triggers, // hence I've added zero label at the beginning. @@ -2954,7 +2939,7 @@ // The statement type may have been set incorrectly when parsing // the trigger actions, so reset it to reflect the fact that this // is a data definition statement; also reset the ddl node. - statement->setType(DsqlCompiledStatement::TYPE_DDL); + dsqlScratch->getStatement()->setType(DsqlCompiledStatement::TYPE_DDL); } invalid = false; Modified: firebird/trunk/src/dsql/DdlNodes.h =================================================================== --- firebird/trunk/src/dsql/DdlNodes.h 2010-08-26 15:40:51 UTC (rev 51487) +++ firebird/trunk/src/dsql/DdlNodes.h 2010-08-27 02:18:00 UTC (rev 51488) @@ -229,12 +229,11 @@ }; -class CreateAlterFunctionNode : public DdlNode, public BlockNode +class CreateAlterFunctionNode : public DdlNode { public: CreateAlterFunctionNode(MemoryPool& pool, const Firebird::MetaName& aName) : DdlNode(pool), - BlockNode(pool, false), name(pool, aName), create(true), alter(false), @@ -334,12 +333,11 @@ RecreateFunctionNode; -class CreateAlterProcedureNode : public DdlNode, public BlockNode +class CreateAlterProcedureNode : public DdlNode { public: CreateAlterProcedureNode(MemoryPool& pool, const Firebird::MetaName& aName) : DdlNode(pool), - BlockNode(pool, true), name(pool, aName), create(true), alter(false), @@ -476,12 +474,11 @@ }; -class CreateAlterTriggerNode : public DdlNode, public BlockNode, public TriggerDefinition +class CreateAlterTriggerNode : public DdlNode, public TriggerDefinition { public: CreateAlterTriggerNode(MemoryPool& p, const Firebird::MetaName& aName) : DdlNode(p), - BlockNode(p, false), TriggerDefinition(p), create(true), alter(false), Added: firebird/trunk/src/dsql/DsqlCompilerScratch.cpp =================================================================== --- firebird/trunk/src/dsql/DsqlCompilerScratch.cpp (rev 0) +++ firebird/trunk/src/dsql/DsqlCompilerScratch.cpp 2010-08-27 02:18:00 UTC (rev 51488) @@ -0,0 +1,761 @@ +/* + * The contents of this file are subject to the Interbase 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.Inprise.com/IPL.html + * + * Software distributed under the License is distributed on an + * "AS IS" basis, 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 Inprise Corporation + * and its predecessors. Portions created by Inprise Corporation are + * Copyright (C) Inprise Corporation. + * + * All Rights Reserved. + * Contributor(s): ______________________________________. + * Adriano dos Santos Fernandes + */ + +#include "firebird.h" +#include "../jrd/common.h" +#include "../dsql/DsqlCompilerScratch.h" +#include "../jrd/jrd.h" +#include "../jrd/blr.h" +#include "../dsql/node.h" +#include "../dsql/ddl_proto.h" +#include "../dsql/errd_proto.h" +#include "../dsql/gen_proto.h" +#include "../dsql/make_proto.h" +#include "../dsql/pass1_proto.h" + +using namespace Firebird; +using namespace Dsql; +using namespace Jrd; + + +// Write out field data type. +// Taking special care to declare international text. +void DsqlCompilerScratch::putDtype(const dsql_fld* field, bool useSubType) +{ +#ifdef DEV_BUILD + // Check if the field describes a known datatype + + if (field->fld_dtype > FB_NELEM(blr_dtypes) || !blr_dtypes[field->fld_dtype]) + { + SCHAR buffer[100]; + + sprintf(buffer, "Invalid dtype %d in BlockNode::putDtype", field->fld_dtype); + ERRD_bugcheck(buffer); + } +#endif + + if (field->fld_not_nullable) + appendUChar(blr_not_nullable); + + if (field->fld_type_of_name.hasData()) + { + if (field->fld_type_of_table) + { + if (field->fld_explicit_collation) + { + appendUChar(blr_column_name2); + appendUChar(field->fld_full_domain ? blr_domain_full : blr_domain_type_of); + appendMetaString(field->fld_type_of_table->str_data); + appendMetaString(field->fld_type_of_name.c_str()); + appendUShort(field->fld_ttype); + } + else + { + appendUChar(blr_column_name); + appendUChar(field->fld_full_domain ? blr_domain_full : blr_domain_type_of); + appendMetaString(field->fld_type_of_table->str_data); + appendMetaString(field->fld_type_of_name.c_str()); + } + } + else + { + if (field->fld_explicit_collation) + { + appendUChar(blr_domain_name2); + appendUChar(field->fld_full_domain ? blr_domain_full : blr_domain_type_of); + appendMetaString(field->fld_type_of_name.c_str()); + appendUShort(field->fld_ttype); + } + else + { + appendUChar(blr_domain_name); + appendUChar(field->fld_full_domain ? blr_domain_full : blr_domain_type_of); + appendMetaString(field->fld_type_of_name.c_str()); + } + } + + return; + } + + switch (field->fld_dtype) + { + case dtype_cstring: + case dtype_text: + case dtype_varying: + case dtype_blob: + if (!useSubType) + appendUChar(blr_dtypes[field->fld_dtype]); + else if (field->fld_dtype == dtype_varying) + { + appendUChar(blr_varying2); + appendUShort(field->fld_ttype); + } + else if (field->fld_dtype == dtype_cstring) + { + appendUChar(blr_cstring2); + appendUShort(field->fld_ttype); + } + else if (field->fld_dtype == dtype_blob) + { + appendUChar(blr_blob2); + appendUShort(field->fld_sub_type); + appendUShort(field->fld_ttype); + } + else + { + appendUChar(blr_text2); + appendUShort(field->fld_ttype); + } + + if (field->fld_dtype == dtype_varying) + appendUShort(field->fld_length - sizeof(USHORT)); + else if (field->fld_dtype != dtype_blob) + appendUShort(field->fld_length); + break; + + default: + appendUChar(blr_dtypes[field->fld_dtype]); + if (DTYPE_IS_EXACT(field->fld_dtype) || (dtype_quad == field->fld_dtype)) + appendUChar(field->fld_scale); + break; + } +} + +// Emit dyn for the local variables declared in a procedure or trigger. +void DsqlCompilerScratch::putLocalVariables(const dsql_nod* parameters, SSHORT locals) +{ + if (!parameters) + return; + + dsql_nod* const* ptr = parameters->nod_arg; + + for (const dsql_nod* const* const end = ptr + parameters->nod_count; ptr < end; ptr++) + { + dsql_nod* parameter = *ptr; + + putDebugSrcInfo(parameter->nod_line, parameter->nod_column); + + if (parameter->nod_type == Dsql::nod_def_field) + { + dsql_fld* field = (dsql_fld*) parameter->nod_arg[Dsql::e_dfl_field]; + const dsql_nod* const* rest = ptr; + + while (++rest != end) + { + if ((*rest)->nod_type == Dsql::nod_def_field) + { + const dsql_fld* rest_field = (dsql_fld*) (*rest)->nod_arg[Dsql::e_dfl_field]; + if (field->fld_name == rest_field->fld_name) + { + ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-637) << + Arg::Gds(isc_dsql_duplicate_spec) << Arg::Str(field->fld_name)); + } + } + } + + dsql_nod* varNode = MAKE_variable(field, field->fld_name.c_str(), VAR_local, 0, 0, locals); + variables.add(varNode); + + dsql_var* variable = (dsql_var*) varNode->nod_arg[Dsql::e_var_variable]; + putLocalVariable(variable, parameter, + reinterpret_cast<const dsql_str*>(parameter->nod_arg[Dsql::e_dfl_collate])); + + // Some field attributes are calculated inside + // putLocalVariable(), so we reinitialize the + // descriptor + MAKE_desc_from_field(&varNode->nod_desc, field); + + ++locals; + } + else if (parameter->nod_type == Dsql::nod_cursor) + { + PASS1_statement(this, parameter); + GEN_statement(this, parameter); + } + } +} + +// Write out local variable field data type. +void DsqlCompilerScratch::putLocalVariable(dsql_var* variable, dsql_nod* hostParam, + const dsql_str* collationName) +{ + dsql_fld* field = variable->var_field; + + appendUChar(blr_dcl_variable); + appendUShort(variable->var_variable_number); + DDL_resolve_intl_type(this, field, collationName); + + //const USHORT dtype = field->fld_dtype; + + putDtype(field, true); + //field->fld_dtype = dtype; + + // Check for a default value, borrowed from define_domain + dsql_nod* node = hostParam ? hostParam->nod_arg[Dsql::e_dfl_default] : NULL; + + if (node || (!field->fld_full_domain && !field->fld_not_nullable)) + { + appendUChar(blr_assignment); + + if (node) + { + fb_assert(node->nod_type == Dsql::nod_def_default); + PsqlChanger psqlChanger(this, false); + node = PASS1_node(this, node->nod_arg[Dsql::e_dft_default]); + GEN_expr(this, node); + } + else + appendUChar(blr_null); // Initialize variable to NULL + + appendUChar(blr_variable); + appendUShort(variable->var_variable_number); + } + else + { + appendUChar(blr_init_variable); + appendUShort(variable->var_variable_number); + } + + if (variable->var_name[0]) // Not a function return value + putDebugVariable(variable->var_variable_number, variable->var_name); + + ++hiddenVarsNumber; +} + +// Try to resolve variable name against parameters and local variables. +dsql_nod* DsqlCompilerScratch::resolveVariable(const dsql_str* varName) +{ + for (dsql_nod* const* i = variables.begin(); i != variables.end(); ++i) + { + dsql_nod* varNode = *i; + fb_assert(varNode->nod_type == Dsql::nod_variable); + + if (varNode->nod_type == Dsql::nod_variable) + { + const dsql_var* variable = (dsql_var*) varNode->nod_arg[Dsql::e_var_variable]; + DEV_BLKCHK(variable, dsql_type_var); + + if (!strcmp(varName->str_data, variable->var_name)) + return varNode; + } + } + + return NULL; +} + +// Generate BLR for a return. +void DsqlCompilerScratch::genReturn(bool eosFlag) +{ + const bool hasEos = !(flags & (FLAG_TRIGGER | FLAG_FUNCTION)); + + if (hasEos && !eosFlag) + appendUChar(blr_begin); + + appendUChar(blr_send); + appendUChar(1); + appendUChar(blr_begin); + + for (Array<dsql_nod*>::const_iterator i = outputVariables.begin(); i != outputVariables.end(); ++i) + { + const dsql_nod* parameter = *i; + const dsql_var* variable = (dsql_var*) parameter->nod_arg[Dsql::e_var_variable]; + appendUChar(blr_assignment); + appendUChar(blr_variable); + appendUShort(variable->var_variable_number); + appendUChar(blr_parameter2); + appendUChar(variable->var_msg_number); + appendUShort(variable->var_msg_item); + appendUShort(variable->var_msg_item + 1); + } + + if (hasEos) + { + appendUChar(blr_assignment); + appendUChar(blr_literal); + appendUChar(blr_short); + appendUChar(0); + appendUShort((eosFlag ? 0 : 1)); + appendUChar(blr_parameter); + appendUChar(1); + appendUShort(USHORT(2 * outputVariables.getCount())); + } + + appendUChar(blr_end); + + if (hasEos && !eosFlag) + { + appendUChar(blr_stall); + appendUChar(blr_end); + } +} + +void DsqlCompilerScratch::addCTEs(dsql_nod* with) +{ + DEV_BLKCHK(with, dsql_type_nod); + fb_assert(with->nod_type == Dsql::nod_with); + + if (ctes.getCount()) + { + ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) << + // WITH clause can't be nested + Arg::Gds(isc_dsql_cte_nested_with)); + } + + if (with->nod_flags & NOD_UNION_RECURSIVE) + flags |= DsqlCompilerScratch::FLAG_RECURSIVE_CTE; + + const dsql_nod* list = with->nod_arg[0]; + const dsql_nod* const* end = list->nod_arg + list->nod_count; + + for (dsql_nod* const* cte = list->nod_arg; cte < end; cte++) + { + fb_assert((*cte)->nod_type == Dsql::nod_derived_table); + + if (with->nod_flags & NOD_UNION_RECURSIVE) + { + currCtes.push(*cte); + PsqlChanger changer(this, false); + ctes.add(pass1RecursiveCte(*cte)); + currCtes.pop(); + + // Add CTE name into CTE aliases stack. It allows later to search for + // aliases of given CTE. + const dsql_str* cteName = (dsql_str*) (*cte)->nod_arg[Dsql::e_derived_table_alias]; + addCTEAlias(cteName); + } + else + ctes.add(*cte); + } +} + +dsql_nod* DsqlCompilerScratch::findCTE(const dsql_str* name) +{ + for (size_t i = 0; i < ctes.getCount(); ++i) + { + dsql_nod* cte = ctes[i]; + const dsql_str* cteName = (dsql_str*) cte->nod_arg[Dsql::e_derived_table_alias]; + + if (name->str_length == cteName->str_length && + strncmp(name->str_data, cteName->str_data, cteName->str_length) == 0) + { + return cte; + } + } + + return NULL; +} + +void DsqlCompilerScratch::clearCTEs() +{ + flags &= ~DsqlCompilerScratch::FLAG_RECURSIVE_CTE; + ctes.clear(); + cteAliases.clear(); +} + +void DsqlCompilerScratch::checkUnusedCTEs() const +{ + for (size_t i = 0; i < ctes.getCount(); ++i) + { + const dsql_nod* cte = ctes[i]; + + if (!(cte->nod_flags & NOD_DT_CTE_USED)) + { + const dsql_str* cteName = (dsql_str*) cte->nod_arg[Dsql::e_derived_table_alias]; + + ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) << + Arg::Gds(isc_dsql_cte_not_used) << Arg::Str(cteName->str_data)); + } + } +} + +// Process derived table which can be recursive CTE. +// If it is non-recursive return input node unchanged. +// If it is recursive return new derived table which is an union of union of anchor (non-recursive) +// queries and union of recursive queries. Check recursive queries to satisfy various criterias. +// Note that our parser is right-to-left therefore nested list linked as first node in parent list +// and second node is always query spec. +// For example, if we have 4 CTE's where first two is non-recursive and last two is recursive: +// +// list union +// [0] [1] [0] [1] +// list cte3 ===> anchor recursive +// [0] [1] [0] [1] [0] [1] +// list cte3 cte1 cte2 cte3 cte4 +// [0] [1] +// cte1 cte2 +// +// Also, we should not change layout of original parse tree to allow it to be parsed again if +// needed. Therefore recursive part is built using newly allocated list nodes. +dsql_nod* DsqlCompilerScratch::pass1RecursiveCte(dsql_nod* input) +{ + dsql_str* const cte_alias = (dsql_str*) input->nod_arg[Dsql::e_derived_table_alias]; + dsql_nod* const select_expr = input->nod_arg[Dsql::e_derived_table_rse]; + dsql_nod* query = select_expr->nod_arg[Dsql::e_sel_query_spec]; + + if (query->nod_type != Dsql::nod_list && pass1RseIsRecursive(query)) + { + ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) << + // Recursive CTE (%s) must be an UNION + Arg::Gds(isc_dsql_cte_not_a_union) << Arg::Str(cte_alias->str_data)); + } + + // split queries list on two parts: anchor and recursive + dsql_nod* anchorRse = NULL, *recursiveRse = NULL; + dsql_nod* qry = query; + + dsql_nod* newQry = MAKE_node(Dsql::nod_list, 2); + newQry->nod_flags = query->nod_flags; + + while (true) + { + dsql_nod* rse = NULL; + + if (qry->nod_type == Dsql::nod_list) + rse = qry->nod_arg[1]; + else + rse = qry; + + dsql_nod* newRse = pass1RseIsRecursive(rse); + + if (newRse) // rse is recursive + { + if (anchorRse) + { + ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) << + // CTE '%s' defined non-recursive member after recursive + Arg::Gds(isc_dsql_cte_nonrecurs_after_recurs) << Arg::Str(cte_alias->str_data)); + } + + if (newRse->nod_arg[Dsql::e_qry_distinct]) + { + ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) << + // Recursive member of CTE '%s' has %s clause + Arg::Gds(isc_dsql_cte_wrong_clause) << Arg::Str(cte_alias->str_data) << + Arg::Str("DISTINCT")); + } + + if (newRse->nod_arg[Dsql::e_qry_group]) + { + ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) << + // Recursive member of CTE '%s' has %s clause + Arg::Gds(isc_dsql_cte_wrong_clause) << Arg::Str(cte_alias->str_data) << + Arg::Str("GROUP BY")); + } + + if (newRse->nod_arg[Dsql::e_qry_having]) + { + ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) << + // Recursive member of CTE '%s' has %s clause + Arg::Gds(isc_dsql_cte_wrong_clause) << Arg::Str(cte_alias->str_data) << + Arg::Str("HAVING")); + } + // hvlad: we need also forbid any aggregate function here + // but for now i have no idea how to do it simple + + if ((newQry->nod_type == Dsql::nod_list) && !(newQry->nod_flags & NOD_UNION_ALL)) + { + ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) << + // Recursive members of CTE (%s) must be linked with another members via UNION ALL + Arg::Gds(isc_dsql_cte_union_all) << Arg::Str(cte_alias->str_data)); + } + + if (!recursiveRse) + recursiveRse = newQry; + + newRse->nod_flags |= NOD_SELECT_EXPR_RECURSIVE; + + if (qry->nod_type == Dsql::nod_list) + newQry->nod_arg[1] = newRse; + else + newQry->nod_arg[0] = newRse; + } + else + { + if (qry->nod_type == Dsql::nod_list) + newQry->nod_arg[1] = rse; + else + newQry->nod_arg[0] = rse; + + if (!anchorRse) + { + if (qry->nod_type == Dsql::nod_list) + anchorRse = newQry; + else + anchorRse = rse; + } + } + + if (qry->nod_type != Dsql::nod_list) + break; + + qry = qry->nod_arg[0]; + + if (qry->nod_type == Dsql::nod_list) + { + newQry->nod_arg[0] = MAKE_node(Dsql::nod_list, 2); + newQry = newQry->nod_arg[0]; + newQry->nod_flags = qry->nod_flags; + } + } + + if (!recursiveRse) + return input; + + if (!anchorRse) + { + ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) << + // Non-recursive member is missing in CTE '%s' + Arg::Gds(isc_dsql_cte_miss_nonrecursive) << Arg::Str(cte_alias->str_data)); + } + + qry = recursiveRse; + dsql_nod* list = NULL; + + while (qry->nod_arg[0] != anchorRse) + { + list = qry; + qry = qry->nod_arg[0]; + } + + qry->nod_arg[0] = 0; + + if (list) + list->nod_arg[0] = qry->nod_arg[1]; + else + recursiveRse = qry->nod_arg[1]; + + dsql_nod* unionNode = MAKE_node(Dsql::nod_list, 2); + unionNode->nod_flags = NOD_UNION_ALL | NOD_UNION_RECURSIVE; + unionNode->nod_arg[0] = anchorRse; + unionNode->nod_arg[1] = recursiveRse; + + dsql_nod* select = MAKE_node(Dsql::nod_select_expr, Dsql::e_sel_count); + select->nod_arg[Dsql::e_sel_query_spec] = unionNode; + select->nod_arg[Dsql::e_sel_order] = select->nod_arg[Dsql::e_sel_rows] = + select->nod_arg[Dsql::e_sel_with_list] = NULL; + + dsql_nod* node = MAKE_node(Dsql::nod_derived_table, Dsql::e_derived_table_count); + dsql_str* alias = (dsql_str*) input->nod_arg[Dsql::e_derived_table_alias]; + node->nod_arg[Dsql::e_derived_table_alias] = (dsql_nod*) alias; + node->nod_arg[Dsql::e_derived_table_column_alias] = + input->nod_arg[Dsql::e_derived_table_column_alias]; + node->nod_arg[Dsql::e_derived_table_rse] = select; + node->nod_arg[Dsql::e_derived_table_context] = input->nod_arg[Dsql::e_derived_table_context]; + + return node; +} + +// Check if rse is recursive. If recursive reference is a table in the FROM list remove it. +// If recursive reference is a part of join add join boolean (returned by pass1JoinIsRecursive) +// to the WHERE clause. Punt if more than one recursive reference is found. +dsql_nod* DsqlCompilerScratch::pass1RseIsRecursive(dsql_nod* input) +{ + fb_assert(input->nod_type == Dsql::nod_query_spec); + + dsql_nod* result = MAKE_node(Dsql::nod_query_spec, Dsql::e_qry_count); + memcpy(result->nod_arg, input->nod_arg, Dsql::e_qry_count * sizeof(dsql_nod*)); + + dsql_nod* srcTables = input->nod_arg[Dsql::e_qry_from]; + dsql_nod* dstTables = MAKE_node(Dsql::nod_list, srcTables->nod_count); + result->nod_arg[Dsql::e_qry_from] = dstTables; + + dsql_nod** pDstTable = dstTables->nod_arg; + dsql_nod** pSrcTable = srcTables->nod_arg; + dsql_nod** end = srcTables->nod_arg + srcTables->nod_count; + bool found = false; + + for (dsql_nod** prev = pDstTable; pSrcTable < end; ++pSrcTable, ++pDstTable) + { + *prev++ = *pDstTable = *pSrcTable; + + switch ((*pDstTable)->nod_type) + { + case Dsql::nod_rel_proc_name: + case Dsql::nod_relation_name: + if (pass1RelProcIsRecursive(*pDstTable)) + { + if (found) + { + ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) << + // Recursive member of CTE can't reference itself more than once + Arg::Gds(isc_dsql_cte_mult_references)); + } + found = true; + + prev--; + dstTables->nod_count--; + } + break; + + case Dsql::nod_join: + { + *pDstTable = MAKE_node(Dsql::nod_join, Dsql::e_join_count); + memcpy((*pDstTable)->nod_arg, (*pSrcTable)->nod_arg, + Dsql::e_join_count * sizeof(dsql_nod*)); + + dsql_nod* joinBool = pass1JoinIsRecursive(*pDstTable); + if (joinBool) + { + if (found) + { + ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) << + // Recursive member of CTE can't reference itself more than once + Arg::Gds... [truncated message content] |
From: <fir...@us...> - 2010-08-27 03:15:17
|
Revision: 51491 http://firebird.svn.sourceforge.net/firebird/?rev=51491&view=rev Author: firebirds Date: 2010-08-27 03:15:10 +0000 (Fri, 27 Aug 2010) Log Message: ----------- nightly update Modified Paths: -------------- firebird/trunk/ChangeLog firebird/trunk/src/jrd/build_no.h firebird/trunk/src/misc/writeBuildNum.sh Modified: firebird/trunk/ChangeLog =================================================================== --- firebird/trunk/ChangeLog 2010-08-27 02:55:09 UTC (rev 51490) +++ firebird/trunk/ChangeLog 2010-08-27 03:15:10 UTC (rev 51491) @@ -1,3 +1,32 @@ + 2010-08-27 02:55 asfernandes + M src/jrd/dyn.epp +Fixed CORE-3109 - [Crash] isc_dql_exec_immed3_m for "create database ..." and NULL transaction + + 2010-08-27 02:18 asfernandes + M builds/posix/make.shared.variables + M src/dsql/DSqlDataTypeUtil.cpp + M src/dsql/DdlNodes.epp + M src/dsql/DdlNodes.h + A src/dsql/DsqlCompilerScratch.cpp + A src/dsql/DsqlCompilerScratch.h + M src/dsql/Nodes.h + M src/dsql/StmtNodes.cpp + M src/dsql/StmtNodes.h + M src/dsql/dsql.h + M src/dsql/gen.cpp + M src/dsql/misc_func.cpp + M src/dsql/pass1.cpp + M src/dsql/pass1_proto.h +1) Separate DsqlCompilerScratch in its own files. +2) Move BlockNode functionality to it. +3) Move some related CTE functions to it. + + 2010-08-26 15:40 asfernandes + M src/jrd/Function.epp + M src/jrd/Function.h + M src/jrd/fun.epp +Misc + 2010-08-25 15:52 asfernandes M src/jrd/RecordSourceNodes.cpp M src/jrd/RecordSourceNodes.h Modified: firebird/trunk/src/jrd/build_no.h =================================================================== --- firebird/trunk/src/jrd/build_no.h 2010-08-27 02:55:09 UTC (rev 51490) +++ firebird/trunk/src/jrd/build_no.h 2010-08-27 03:15:10 UTC (rev 51491) @@ -3,16 +3,16 @@ *** DO NOT EDIT *** TO CHANGE ANY INFORMATION IN HERE PLEASE EDIT src/misc/writeBuildNum.sh - FORMAL BUILD NUMBER:28697 + FORMAL BUILD NUMBER:28700 */ -#define PRODUCT_VER_STRING "3.0.0.28697" -#define FILE_VER_STRING "WI-T3.0.0.28697" -#define LICENSE_VER_STRING "WI-T3.0.0.28697" -#define FILE_VER_NUMBER 3, 0, 0, 28697 +#define PRODUCT_VER_STRING "3.0.0.28700" +#define FILE_VER_STRING "WI-T3.0.0.28700" +#define LICENSE_VER_STRING "WI-T3.0.0.28700" +#define FILE_VER_NUMBER 3, 0, 0, 28700 #define FB_MAJOR_VER "3" #define FB_MINOR_VER "0" #define FB_REV_NO "0" -#define FB_BUILD_NO "28697" +#define FB_BUILD_NO "28700" #define FB_BUILD_TYPE "T" #define FB_BUILD_SUFFIX "Firebird 3.0 Unstable" Modified: firebird/trunk/src/misc/writeBuildNum.sh =================================================================== --- firebird/trunk/src/misc/writeBuildNum.sh 2010-08-27 02:55:09 UTC (rev 51490) +++ firebird/trunk/src/misc/writeBuildNum.sh 2010-08-27 03:15:10 UTC (rev 51491) @@ -9,7 +9,7 @@ MajorVer=3 MinorVer=0 RevNo=0 -BuildNum=28697 +BuildNum=28700 if [ "$SPECIAL_BUILD_SUFFIX" = "" ]; then # Normal builds This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |