[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
r6219 - in trunk: gnue-appserver gnue-appserver/doc gnue-appserver/doc/m
From: |
reinhard |
Subject: |
r6219 - in trunk: gnue-appserver gnue-appserver/doc gnue-appserver/doc/man gnue-appserver/samples gnue-appserver/scripts gnue-appserver/src/gcd gnue-common/packaging/win32 gnue-common/utils |
Date: |
Thu, 26 Aug 2004 11:28:48 -0500 (CDT) |
Author: reinhard
Date: 2004-08-26 11:28:47 -0500 (Thu, 26 Aug 2004)
New Revision: 6219
Added:
trunk/gnue-appserver/doc/man/gnue-readgcd.1
trunk/gnue-appserver/doc/man/gnue-readgld.1
trunk/gnue-appserver/scripts/gnue-readgcd
trunk/gnue-appserver/src/gcd/readgcd.py
Removed:
trunk/gnue-appserver/doc/man/gnue-gcd2sql.1
trunk/gnue-appserver/scripts/gnue-gcd2sql
trunk/gnue-appserver/src/gcd/gcd2sql.py
Modified:
trunk/gnue-appserver/doc/gcd.dtd
trunk/gnue-appserver/doc/gld.dtd
trunk/gnue-appserver/samples/README
trunk/gnue-appserver/samples/setup-db.sh
trunk/gnue-appserver/setup.cvs
trunk/gnue-appserver/setup.py
trunk/gnue-common/packaging/win32/GNUe-Appserver-debug.iss
trunk/gnue-common/packaging/win32/GNUe-Appserver.iss
trunk/gnue-common/packaging/win32/setup.py
trunk/gnue-common/utils/update-tool-docs
Log:
Renamed gnue-gcd2sql to gnue-readgcd, fixed missing stuff for new binary
gnue-readgld.
Modified: trunk/gnue-appserver/doc/gcd.dtd
===================================================================
--- trunk/gnue-appserver/doc/gcd.dtd 2004-08-26 16:05:57 UTC (rev 6218)
+++ trunk/gnue-appserver/doc/gcd.dtd 2004-08-26 16:28:47 UTC (rev 6219)
@@ -1,4 +1,4 @@
-<!-- GNUe Class Definitions DTD (Version 0.1.0) -->
+<!-- GNUe Class Definitions DTD (Version 0.1.89.99) -->
<!--
Copyright 2001-2004 Free Software Foundation
@@ -95,5 +95,5 @@
<!-- This DTD was created by gnuedtd
- Updated: 2004-08-03 20:25:35 -->
+ Updated: 2004-08-26 18:00:48 -->
Modified: trunk/gnue-appserver/doc/gld.dtd
===================================================================
--- trunk/gnue-appserver/doc/gld.dtd 2004-08-26 16:05:57 UTC (rev 6218)
+++ trunk/gnue-appserver/doc/gld.dtd 2004-08-26 16:28:47 UTC (rev 6219)
@@ -77,5 +77,5 @@
<!-- This DTD was created by gnuedtd
- Updated: 2004-08-07 13:53:00 -->
+ Updated: 2004-08-26 18:00:48 -->
Deleted: trunk/gnue-appserver/doc/man/gnue-gcd2sql.1
===================================================================
--- trunk/gnue-appserver/doc/man/gnue-gcd2sql.1 2004-08-26 16:05:57 UTC (rev
6218)
+++ trunk/gnue-appserver/doc/man/gnue-gcd2sql.1 2004-08-26 16:28:47 UTC (rev
6219)
@@ -1,120 +0,0 @@
-.TH GCD2SQL 1 "03 August 2004" "gcd2sql"
-.SH NAME
-gcd2sql \- gcd2sql
-.SH SYNOPSIS
-.ll +8
-.B gcd2sql
-[
-.I options
-]
-[
-.I OPTIONS
-]
-.I file
-.SH DESCRIPTION
-Create or update a database schema from a GNUe Class Definition
-(gcd) file
-and maintain data for all gnue_* classes
-
-.SH OPTIONS
-.TP
-.B GENERAL OPTIONS
-.TP
-.TP
-.B \-\-connection <connectionname>, \-c
-Use the connection <connectionname> for creating the schema
-.TP
-.B \-\-connections <loc>
-Specifies the location of the connection definition file. <loc> may
-specify a file name (/usr/local/gnue/etc/connections.conf),or a URL
-location (http://localhost/connections.conf).If this option is not
-specified, the environent variable GNUE_CONNECTIONS is checked.If
-neither of them is set, "/home/reinhard/gnue/etc/connections.conf"
-is used as a default.
-.TP
-.B \-\-debug-file <filename>
-Sends all debugging messages to a specified file (e.g.,
-"\-\-debug\-file trace.log" sends all output to "trace.log")
-.TP
-.B \-\-debug-level <level>
-Enables debugging messages. Argument specifies the level of
-messages to display (e.g., "\-\-debug\-level 5" displays all
-debugging messages at level 5 or below.)
-.TP
-.B \-\-file-only, \-f
-If this flag is set, only code is sent to the output file and the
-schema is not created automatically.
-.TP
-.B \-\-help
-Displays this help screen.
-.TP
-.B \-\-help-config
-Displays a list of valid configuration file entries, their purpose,
-and their default values.
-.TP
-.B \-\-help-connections
-Display help information related to database connections, including
-a list of available drivers.
-.TP
-.B \-\-help-dev
-Display all options of interest to core developers.
-.TP
-.B \-\-output <filename>, \-o
-Also send the code for creating the schema to this file.
-.TP
-.B \-\-password <password>, \-p
-Set the password for the database.
-.TP
-.B \-\-username <user>, \-u
-Set the username for the database. If the database is to be created,
-this username will be it's owner.
-.TP
-.B \-\-version
-Displays the version information for this program.
-.TP
-.B DEVELOPER OPTIONS
-.TP
-.TP
-.B \-\-interactive-debugger
-Run the app inside Python's built\-in debugger
-.TP
-.B \-\-profile
-Run Python's built\-in profiler and display the resulting run
-statistics.
-.TP
-.B \-\-selfdoc <type[,subtype]>
-Generates self\-documentation.
-.TP
-.B \-\-selfdoc-file <filename>
-Specifies the filename that selfdoc should write to. If not provided,
- output is sent to stdout.
-.TP
-.B \-\-selfdoc-format <format>
-Format to output the self\-documentation in. Supported formats are
-dependent on the type of selfdoc being created.
-.TP
-.B \-\-selfdoc-options <options>
-Options specific to individual selfdoc types.
-.SH AUTHOR
-GNU Enterprise Project <address@hidden>
-.SH BUGS
-Please report any bugs to address@hidden
-Include a complete, self-contained example
-that will allow the bug to be reproduced,
-and say which version of this tool you are using.
-.SH COPYRIGHT
-Copyright \(co 2000-2004 Free Software Foundation, Inc.
-.LP
-gcd2sql is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
-version.
-.LP
-gcd2sql 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 General Public License
-for more details.
-.LP
-You should have received a copy of the GNU General Public License along
-with gcd2sql; see the file COPYING. If not, write to the Free Software
-Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Copied: trunk/gnue-appserver/doc/man/gnue-readgcd.1 (from rev 6217,
trunk/gnue-appserver/doc/man/gnue-gcd2sql.1)
===================================================================
--- trunk/gnue-appserver/doc/man/gnue-gcd2sql.1 2004-08-26 15:37:34 UTC (rev
6217)
+++ trunk/gnue-appserver/doc/man/gnue-readgcd.1 2004-08-26 16:28:47 UTC (rev
6219)
@@ -0,0 +1,120 @@
+.TH READGCD 1 "26 August 2004" "readgcd"
+.SH NAME
+readgcd \- readgcd
+.SH SYNOPSIS
+.ll +8
+.B readgcd
+[
+.I options
+]
+[
+.I OPTIONS
+]
+.I file
+.SH DESCRIPTION
+Create or update a database schema from a GNUe Class Definition
+(gcd) file
+and maintain data for all gnue_* classes
+
+.SH OPTIONS
+.TP
+.B GENERAL OPTIONS
+.TP
+.TP
+.B \-\-connection <connectionname>, \-c
+Use the connection <connectionname> for creating the schema
+.TP
+.B \-\-connections <loc>
+Specifies the location of the connection definition file. <loc> may
+specify a file name (/usr/local/gnue/etc/connections.conf),or a URL
+location (http://localhost/connections.conf).If this option is not
+specified, the environent variable GNUE_CONNECTIONS is checked.If
+neither of them is set, "/home/reinhard/gnue/etc/connections.conf"
+is used as a default.
+.TP
+.B \-\-debug-file <filename>
+Sends all debugging messages to a specified file (e.g.,
+"\-\-debug\-file trace.log" sends all output to "trace.log")
+.TP
+.B \-\-debug-level <level>
+Enables debugging messages. Argument specifies the level of
+messages to display (e.g., "\-\-debug\-level 5" displays all
+debugging messages at level 5 or below.)
+.TP
+.B \-\-file-only, \-f
+If this flag is set, only code is sent to the output file and the
+schema is not created automatically.
+.TP
+.B \-\-help
+Displays this help screen.
+.TP
+.B \-\-help-config
+Displays a list of valid configuration file entries, their purpose,
+and their default values.
+.TP
+.B \-\-help-connections
+Display help information related to database connections, including
+a list of available drivers.
+.TP
+.B \-\-help-dev
+Display all options of interest to core developers.
+.TP
+.B \-\-output <filename>, \-o
+Also send the code for creating the schema to this file.
+.TP
+.B \-\-password <password>, \-p
+Set the password for the database.
+.TP
+.B \-\-username <user>, \-u
+Set the username for the database. If the database is to be created,
+this username will be it's owner.
+.TP
+.B \-\-version
+Displays the version information for this program.
+.TP
+.B DEVELOPER OPTIONS
+.TP
+.TP
+.B \-\-interactive-debugger
+Run the app inside Python's built\-in debugger
+.TP
+.B \-\-profile
+Run Python's built\-in profiler and display the resulting run
+statistics.
+.TP
+.B \-\-selfdoc <type[,subtype]>
+Generates self\-documentation.
+.TP
+.B \-\-selfdoc-file <filename>
+Specifies the filename that selfdoc should write to. If not provided,
+ output is sent to stdout.
+.TP
+.B \-\-selfdoc-format <format>
+Format to output the self\-documentation in. Supported formats are
+dependent on the type of selfdoc being created.
+.TP
+.B \-\-selfdoc-options <options>
+Options specific to individual selfdoc types.
+.SH AUTHOR
+GNU Enterprise Project <address@hidden>
+.SH BUGS
+Please report any bugs to address@hidden
+Include a complete, self-contained example
+that will allow the bug to be reproduced,
+and say which version of this tool you are using.
+.SH COPYRIGHT
+Copyright \(co 2000-2004 Free Software Foundation, Inc.
+.LP
+readgcd is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
+.LP
+readgcd 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 General Public License
+for more details.
+.LP
+You should have received a copy of the GNU General Public License along
+with readgcd; see the file COPYING. If not, write to the Free Software
+Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Added: trunk/gnue-appserver/doc/man/gnue-readgld.1
===================================================================
--- trunk/gnue-appserver/doc/man/gnue-readgld.1 2004-08-26 16:05:57 UTC (rev
6218)
+++ trunk/gnue-appserver/doc/man/gnue-readgld.1 2004-08-26 16:28:47 UTC (rev
6219)
@@ -0,0 +1,110 @@
+.TH GNUE\-READGLD 1 "26 August 2004" "gnue-readgld"
+.SH NAME
+gnue\-readgld \- gnue\-readgld
+.SH SYNOPSIS
+.ll +8
+.B gnue\-readgld
+[
+.I options
+]
+.I file
+.I file
+.I \&...
+.SH DESCRIPTION
+Read GNUe Layout Definitions and update the class repository
+
+.SH OPTIONS
+.TP
+.B GENERAL OPTIONS
+.TP
+.TP
+.B \-\-connection <connectionname>, \-c
+Use the connection <connectionname> for creating the schema
+.TP
+.B \-\-connections <loc>
+Specifies the location of the connection definition file. <loc> may
+specify a file name (/usr/local/gnue/etc/connections.conf),or a URL
+location (http://localhost/connections.conf).If this option is not
+specified, the environent variable GNUE_CONNECTIONS is checked.If
+neither of them is set, "/home/reinhard/gnue/etc/connections.conf"
+is used as a default.
+.TP
+.B \-\-debug-file <filename>
+Sends all debugging messages to a specified file (e.g.,
+"\-\-debug\-file trace.log" sends all output to "trace.log")
+.TP
+.B \-\-debug-level <level>
+Enables debugging messages. Argument specifies the level of
+messages to display (e.g., "\-\-debug\-level 5" displays all
+debugging messages at level 5 or below.)
+.TP
+.B \-\-help
+Displays this help screen.
+.TP
+.B \-\-help-config
+Displays a list of valid configuration file entries, their purpose,
+and their default values.
+.TP
+.B \-\-help-connections
+Display help information related to database connections, including
+a list of available drivers.
+.TP
+.B \-\-help-dev
+Display all options of interest to core developers.
+.TP
+.B \-\-password <password>, \-p
+Set the password for the database.
+.TP
+.B \-\-username <user>, \-u
+Set the username for the database. If the database is to be created,
+this username will be it's owner.
+.TP
+.B \-\-version
+Displays the version information for this program.
+.TP
+.B DEVELOPER OPTIONS
+.TP
+.TP
+.B \-\-interactive-debugger
+Run the app inside Python's built\-in debugger
+.TP
+.B \-\-profile
+Run Python's built\-in profiler and display the resulting run
+statistics.
+.TP
+.B \-\-selfdoc <type[,subtype]>
+Generates self\-documentation.
+.TP
+.B \-\-selfdoc-file <filename>
+Specifies the filename that selfdoc should write to. If not provided,
+ output is sent to stdout.
+.TP
+.B \-\-selfdoc-format <format>
+Format to output the self\-documentation in. Supported formats are
+dependent on the type of selfdoc being created.
+.TP
+.B \-\-selfdoc-options <options>
+Options specific to individual selfdoc types.
+.SH AUTHOR
+GNU Enterprise Project <address@hidden>
+.SH BUGS
+Please report any bugs to address@hidden
+Include a complete, self-contained example
+that will allow the bug to be reproduced,
+and say which version of this tool you are using.
+.SH COPYRIGHT
+Copyright \(co 2000-2004 Free Software Foundation, Inc.
+.LP
+gnue\-readgld is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
+.LP
+gnue\-readgld 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 General Public License
+for more details.
+.LP
+You should have received a copy of the GNU General Public License along
+with gnue\-readgld; see the file COPYING. If not, write to the Free Software
+Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Modified: trunk/gnue-appserver/samples/README
===================================================================
--- trunk/gnue-appserver/samples/README 2004-08-26 16:05:57 UTC (rev 6218)
+++ trunk/gnue-appserver/samples/README 2004-08-26 16:28:47 UTC (rev 6219)
@@ -37,7 +37,7 @@
This will create all tables needed for the classrepository
-gnue-gcd2sql --connection=gnue auth.gcd sample.gcd
+gnue-readgcd --connection=gnue auth.gcd sample.gcd
This will create the sample classes and updates the classrepository
Modified: trunk/gnue-appserver/samples/setup-db.sh
===================================================================
--- trunk/gnue-appserver/samples/setup-db.sh 2004-08-26 16:05:57 UTC (rev
6218)
+++ trunk/gnue-appserver/samples/setup-db.sh 2004-08-26 16:28:47 UTC (rev
6219)
@@ -1,5 +1,5 @@
#!/bin/sh
gnue-schema --connection=gnue --createdb base.gsd
-gnue-gcd2sql --connection=gnue auth.gcd sample.gcd
+gnue-readgcd --connection=gnue auth.gcd sample.gcd
gnue-schema --connection=gnue sample.gsd
Deleted: trunk/gnue-appserver/scripts/gnue-gcd2sql
===================================================================
--- trunk/gnue-appserver/scripts/gnue-gcd2sql 2004-08-26 16:05:57 UTC (rev
6218)
+++ trunk/gnue-appserver/scripts/gnue-gcd2sql 2004-08-26 16:28:47 UTC (rev
6219)
@@ -1,33 +0,0 @@
-#!/usr/bin/env python
-#
-# This file is part of GNU Enterprise.
-#
-# GNU Enterprise is free software; you can redistribute it
-# and/or modify it under the terms of the GNU General Public
-# License as published by the Free Software Foundation; either
-# version 2, or (at your option) any later version.
-#
-# GNU Enterprise 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 General Public License for more details.
-#
-# You should have received a copy of the GNU General Public
-# License along with program; see the file COPYING. If not,
-# write to the Free Software Foundation, Inc., 59 Temple Place
-# - Suite 330, Boston, MA 02111-1307, USA.
-#
-# Copyright 2001-2004 Free Software Foundation
-#
-# $Id: $
-
-import os, sys
-
-if hasattr(sys, 'frozen'):
- sys.path.append(os.path.abspath(os.path.dirname(sys.argv[0])))
-
-from gnue.appserver.gcd import gcd2sql
-
-if __name__ == '__main__':
- gcd2sql = gcd2sql.gcdConverter ()
- gcd2sql.run ();
Copied: trunk/gnue-appserver/scripts/gnue-readgcd (from rev 6217,
trunk/gnue-appserver/scripts/gnue-gcd2sql)
===================================================================
--- trunk/gnue-appserver/scripts/gnue-gcd2sql 2004-08-26 15:37:34 UTC (rev
6217)
+++ trunk/gnue-appserver/scripts/gnue-readgcd 2004-08-26 16:28:47 UTC (rev
6219)
@@ -0,0 +1,33 @@
+#!/usr/bin/env python
+#
+# This file is part of GNU Enterprise.
+#
+# GNU Enterprise is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Copyright 2001-2004 Free Software Foundation
+#
+# $Id$
+
+import os, sys
+
+if hasattr(sys, 'frozen'):
+ sys.path.append(os.path.abspath(os.path.dirname(sys.argv[0])))
+
+from gnue.appserver.gcd import readgcd
+
+if __name__ == '__main__':
+ readgcd = readgcd.gcdConverter ()
+ readgcd.run ();
Property changes on: trunk/gnue-appserver/scripts/gnue-readgcd
___________________________________________________________________
Name: svn:executable
+ *
Name: svn:keywords
+ Id
Modified: trunk/gnue-appserver/setup.cvs
===================================================================
--- trunk/gnue-appserver/setup.cvs 2004-08-26 16:05:57 UTC (rev 6218)
+++ trunk/gnue-appserver/setup.cvs 2004-08-26 16:28:47 UTC (rev 6219)
@@ -33,7 +33,7 @@
# Create our shell script..
createShell ('gacvs', 'gnue-appserver')
createShell ('ggcvs', 'gnue-gsdgen')
-createShell ('gcdcvs', 'gnue-gcd2sql')
+createShell ('gcdcvs', 'gnue-readgcd')
createShell ('gldcvs', 'gnue-readgld')
# Add our GNUe RPC resource files to the config directory...
Modified: trunk/gnue-appserver/setup.py
===================================================================
--- trunk/gnue-appserver/setup.py 2004-08-26 16:05:57 UTC (rev 6218)
+++ trunk/gnue-appserver/setup.py 2004-08-26 16:28:47 UTC (rev 6219)
@@ -64,7 +64,8 @@
params ["package_dir"] = {"gnue.appserver": "src"}
params ["scripts"] = ["scripts/gnue-appserver",
"scripts/gnue-gsdgen",
- "scripts/gnue-gcd2sql"]
+ "scripts/gnue-readgcd",
+ "scripts/gnue-readgld"]
# The Data
datafiles = ["src/classrep/repository.ini"]
Deleted: trunk/gnue-appserver/src/gcd/gcd2sql.py
===================================================================
--- trunk/gnue-appserver/src/gcd/gcd2sql.py 2004-08-26 16:05:57 UTC (rev
6218)
+++ trunk/gnue-appserver/src/gcd/gcd2sql.py 2004-08-26 16:28:47 UTC (rev
6219)
@@ -1,715 +0,0 @@
-# GNU Enterprise Application Server - Gnue Schema Definition Generator
-#
-# Copyright 2001-2004 Free Software Foundation
-#
-# This file is part of GNU Enterprise.
-#
-# GNU Enterprise is free software; you can redistribute it
-# and/or modify it under the terms of the GNU General Public
-# License as published by the Free Software Foundation; either
-# version 2, or (at your option) any later version.
-#
-# GNU Enterprise 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 General Public License for more details.
-#
-# You should have received a copy of the GNU General Public
-# License along with program; see the file COPYING. If not,
-# write to the Free Software Foundation, Inc., 59 Temple Place
-# - Suite 330, Boston, MA 02111-1307, USA.
-#
-# $Id$
-
-import sys
-import os
-import whrandom
-
-from gnue.common.apps import i18n
-from gnue.common.apps.GClientApp import *
-from gnue.common.utils.FileUtils import openResource
-from gnue.common.datasources import GDataSource, GConditions
-
-from gnue.appserver import VERSION
-from gnue.appserver.gcd import GCParser
-
-
-# =============================================================================
-# Exceptions
-# =============================================================================
-
-class Error (gException):
- pass
-
-class ModuleNotFoundError (Error):
- def __init__ (self, module):
- msg = u_("Module '%s' not found in class repository") % module
- Error.__init__ (self, msg)
-
-class ProcedureNotFoundError (Error):
- def __init__ (self, procedure):
- msg = u_("Procedure '%s' not found in class repository") % procedure
- Error.__init__ (self, msg)
-
-
-# =============================================================================
-# Update a database schema from GNUe Class Definitions and update classrep.
-# =============================================================================
-
-class gcdConverter (GClientApp):
-
- NAME = "gcd2sql"
- VERSION = VERSION
- COMMAND = "gcd2sql"
- USAGE = "%s %s" % (GClientApp.USAGE, " [OPTIONS] file")
- SUMMARY = _(
-"""Create or update a database schema from a GNUe Class Definition (gcd) file
-and maintain data for all gnue_* classes""")
-
- # ---------------------------------------------------------------------------
- # Constructor
- # ---------------------------------------------------------------------------
-
- def __init__ (self, connections = None):
-
- self.addCommandOption ('connection', 'c', argument='connectionname',
- help = _("Use the connection <connectionname> for creating the
schema"))
-
- self.addCommandOption ('output','o', argument='filename',
- help = _("Also send the code for creating the schema to this file."))
-
- self.addCommandOption ('file-only', 'f', default = False,
- help = _("If this flag is set, only code is sent to the output file "
- "and the schema is not created automatically."))
-
- self.addCommandOption ('username', 'u', argument="user",
- help = _("Set the username for the database. If the database is to be "
- "created, this username will be it's owner."))
-
- self.addCommandOption ('password', 'p', argument="password",
- help = _("Set the password for the database."))
-
- ConfigOptions = {}
-
- GClientApp.__init__ (self, connections, 'gcd2sql', ConfigOptions)
-
-
- # ---------------------------------------------------------------------------
- # Verify the given commandline options
- # ---------------------------------------------------------------------------
-
- def __checkOptions (self):
- """
- This function checks wether the given command line arguments and options
- are usefull or not.
- """
- self._args = [unicode (a, i18n.encoding) for a in self.ARGUMENTS]
-
- if not len (self._args):
- self.handleStartupError (_("No input file specified."))
-
- try:
- self._files = []
-
- for filename in self._args:
- self._files.append (openResource (filename))
-
- except IOError:
- self.handleStartupError (u_("Unable to open input file %s.") % filename)
-
-
- if not self.OPTIONS ['connection']:
- self.handleStartupError (_("No connection specified."))
-
- self.outfile = self.OPTIONS ['output']
-
- if self.OPTIONS ['file-only'] and self.outfile is None:
- self.handleStartupError (_("Output to file only requested, but no "
- "filename specified."))
-
-
- # ---------------------------------------------------------------------------
- # Main program
- # ---------------------------------------------------------------------------
-
- def run (self):
- """
- This is the main function of the whole process. It verifies the given
- options, loads all schema definitions and then logs into the connection to
- perform all actions requested.
- """
-
- self.__checkOptions ()
-
- try:
- self.tables = []
- self.modules = {}
- self.classes = {}
- self.properties = {}
- self.procedures = {}
- self.parameters = {}
-
- for item in range (len (self._files)):
- print o (u_("Loading gcd file '%s' ...") % self._args [item])
-
- try:
- schema = GCParser.loadFile (self._files [item])
- schema.walk (self.__iterateObjects)
-
- finally:
- self._files [item].close ()
-
- except Exception:
- print sys.exc_info () [1]
-
- else:
- self.executeAndGenerateCode ()
-
- self.updateRepository ()
-
-
- # ---------------------------------------------------------------------------
- # Iterate over all top level elements
- # ---------------------------------------------------------------------------
-
- def __iterateObjects (self, sObject):
- """
- This function iterates over all objects of a GCD tree and processes the
- GCModule and GCClass instances.
-
- @param sObject: current GCD object to be processed
- """
- if sObject._type == 'GCModule':
- self.__translateModule (sObject)
-
- elif sObject._type == 'GCClass':
- self.__translateClass (sObject)
-
-
-
- # ---------------------------------------------------------------------------
- # A module translates to a gnue_module data entry only
- # ---------------------------------------------------------------------------
-
- def __translateModule (self, aModule):
- """
- This function adds a dictionary for the given module to the modules data
- block for later update of the class repository.
-
- @param aModule: GCD Module object to be processed.
- """
-
- self.modules [aModule.name] = self.fetchTags (aModule, ['name', 'comment'])
- self.modules [aModule.name] ['gnue_id'] = None
-
-
- # ---------------------------------------------------------------------------
- # A class translation needs a table creation/modification and a data entry
- # ---------------------------------------------------------------------------
-
- def __translateClass (self, aClass):
- """
- This function creates an entry for schema creation of the given class, as
- well as a dictionary for the class repository update.
-
- @param aClass: GCD Class object to be processed.
- """
-
- self.tables.append ({'name': aClass.fullName, 'fields': []})
-
- if aClass.action == 'create':
- self.tables [-1]['primarykey'] = {
- 'name' : 'gnue_id_pk_%s' % aClass.fullName,
- 'fields': ['gnue_id']}
-
- cDef = self.fetchTags (aClass, ['name', 'module', 'comment'])
- cDef ['gnue_id'] = None
-
- self.classes [aClass.fullName] = cDef
-
- # After processing the class definition, iterate over all it's items
- aClass.walk (self.__iterateClassObjects, defs = self.tables [-1])
-
-
- # ---------------------------------------------------------------------------
- # Iterate over all elements of a class definition
- # ---------------------------------------------------------------------------
-
- def __iterateClassObjects (self, sObject, defs):
- """
- This function processes all child objects of a GCD class instance. For all
- properties a schema creation dictionary will be created. Properties,
- Procedures and Parameters will be added to the class repository update
- dictionaries.
-
- @param sObject: current GCD object to be processed
- @param defs: schema creation dictionary describing the table definition for
- the class.
- """
-
- if sObject._type == 'GCProperty':
- fDef = {'name' : sObject.fullName,
- 'type' : sObject.datatype,
- 'nullable': sObject.nullable}
-
- if sObject.length is not None and sObject.length:
- fDef ['length'] = sObject.length
- if sObject.scale is not None and sObject.scale:
- fDef ['precision'] = sObject.scale
-
- defs ['fields'].append (fDef)
-
- # Create a foreign key constraint for class references
- if sObject.isReference:
- cDef = {'name' : "fk_%s_%s" % (defs ['name'], fDef ['name']),
- 'fields' : [fDef ['name']],
- 'reftable' : sObject.type,
- 'reffields': ['gnue_id']}
-
- if not defs.has_key ('constraints'):
- defs ['constraints'] = [cDef]
- else:
- defs ['constraints'].append (cDef)
-
- fqName = "%s.%s" % (sObject._parent.fullName, sObject.fullName)
- propDef = self.fetchTags (sObject, ['name', 'length', 'scale',
- 'nullable', 'comment'])
- if sObject.isReference:
- propDef ['gnue_type'] = sObject.type
- propDef ['gnue_length'] = None
-
- elif sObject.fullName == 'gnue_id':
- propDef ['gnue_type'] = 'id'
- propDef ['gnue_length'] = None
- else:
- propDef ['gnue_type'] = sObject.datatype
-
- propDef ['gnue_id'] = None
- propDef ['gnue_class'] = sObject._parent.fullName
- propDef ['gnue_module'] = sObject.module
- self.properties [fqName] = propDef
-
-
- # Process a procedure of the class
- elif sObject._type == 'GCProcedure':
- fqName = "%s.%s" % (sObject._parent.fullName, sObject.fullName)
- pDef = self.fetchTags (sObject, ['name', 'module', 'nullable',
- 'language', 'length', 'scale', 'comment'])
- pDef ['gnue_id'] = None
- pDef ['gnue_class'] = sObject._parent.fullName
- pDef ['gnue_type'] = sObject.datatype
- pDef ['gnue_code'] = sObject.getChildrenAsContent ()
- self.procedures [fqName] = pDef
-
- sObject.walk (self.__iterateProcedure)
-
-
- # ---------------------------------------------------------------------------
- # Iterate over all child elements of a procedure
- # ---------------------------------------------------------------------------
-
- def __iterateProcedure (self, sObject):
- """
- This function processes any parameter definitions for a GCD procedure
- instance. A dictionary for class repository update will be created.
-
- @param sObject: the GCD parameter object to be processed
- """
- if sObject._type == 'GCParameter':
- pDef = self.fetchTags (sObject, ['name', 'comment', 'length', 'scale'])
- pDef ['gnue_type'] = sObject.datatype
- pDef ['gnue_procedure'] = "%s.%s" % (sObject._parent._parent.fullName,
- sObject._parent.fullName)
- fqName = "%s.%s" % (pDef ['gnue_procedure'], sObject.name)
- self.parameters [fqName] = pDef
-
-
- # ---------------------------------------------------------------------------
- # Get a dictionary with all keys listed in tags and values from sObject
- # ---------------------------------------------------------------------------
-
- def fetchTags (self, sObject, tags):
- """
- This function creates a dictionary with all attributes from sObject listed
- in tags, where the keys are constructed by 'gnue_%s' % attributename.
-
- @param sObject: Schema object to retriev attributes from
- @param tags: list of all attributes to retrieve
- @return: dictionary with the attribute names as keys and their values
- """
- res = {}
- for item in tags:
- if hasattr (sObject, item):
- res ["gnue_%s" % item] = getattr (sObject, item)
- return res
-
-
- # ---------------------------------------------------------------------------
- # Execute and generate the code
- # ---------------------------------------------------------------------------
-
- def executeAndGenerateCode (self):
- """
- This function logs into the given connection and calls it for an update of
- it's schema according to the loaded table definitions. Additionally the
- schema creation code is generated by this call, which will be stored in the
- given output file (if requested by options).
- """
-
- connection = self.connections.getConnection (self.OPTIONS ['connection'])
-
- connection.parameters ['username'] = self.OPTIONS ['username'] or "gnue"
- connection.parameters ['password'] = self.OPTIONS ['password'] or "gnue"
-
- self.connections.loginToConnection (connection)
-
- print _("Updating schema ...")
- code = connection.updateSchema (self.tables, self.OPTIONS ['file-only'])
-
- if self.outfile is not None:
- dest = open (self.outfile, 'w')
-
- for item in code:
- for line in item:
- dest.write (line + "\n")
-
- dest.close ()
-
-
- # ---------------------------------------------------------------------------
- # Update the class repository
- # ---------------------------------------------------------------------------
-
- def updateRepository (self):
- print _("Updating class repository ...")
-
- self._updateModules ()
- self._updateClasses ()
- self._updateProperties ()
- self._updateProcedures ()
- self._updateParameter ()
-
-
- # ---------------------------------------------------------------------------
- # Update/add modules to the class repository
- # ---------------------------------------------------------------------------
-
- def _updateModules (self):
- """
- """
- attributes = {'name' : "dts_gnueModule",
- 'database': self.OPTIONS ['connection'],
- 'table' : 'gnue_module'}
- fieldList = ['gnue_id', 'gnue_name', 'gnue_comment']
-
- self._dtsModules = GDataSource.DataSourceWrapper (
- connections = self.connections,
- attributes = attributes,
- fields = fieldList,
- unicodeMode = True)
-
- stat = [0, 0, 0] # inserted, updated, unchanged
-
- for module in self.modules.values ():
- cond = GConditions.buildConditionFromDict ( \
- {'gnue_name': module ['gnue_name']})
- resultSet = self._dtsModules.createResultSet (cond)
-
- if resultSet.firstRecord () is None:
- resultSet.insertRecord ()
- modifier = 0
- module ['gnue_id'] = self.__generateId ()
- else:
- module ['gnue_id'] = resultSet.current.getField ('gnue_id')
- modifier = 1
-
- if not self.doUpdate (resultSet, module):
- modifier += 1
-
- stat [modifier] += 1
-
- if stat [0] + stat [1]:
- self.connections.commitAll ()
-
- print o (u_(" Modules : %(ins)3d inserted, %(upd)3d updated, %(kept)3d "
- "unchanged.") \
- % {'ins': stat [0], 'upd': stat [1], 'kept': stat [2]})
-
-
- # ---------------------------------------------------------------------------
- # Update/add classes to the class repository
- # ---------------------------------------------------------------------------
-
- def _updateClasses (self):
- """
- """
- attributes = {'name' : "dts_gnueClass",
- 'database': self.OPTIONS ['connection'],
- 'table' : 'gnue_class'}
- fieldList = ['gnue_id', 'gnue_name', 'gnue_module', 'gnue_comment']
-
- datasource = GDataSource.DataSourceWrapper (
- connections = self.connections,
- attributes = attributes,
- fields = fieldList,
- unicodeMode = True)
-
- stat = [0, 0, 0] # inserted, updated, unchanged
-
- for klass in self.classes.values ():
- moduleId = self.__findModule (klass ['gnue_module'])
- cond = GConditions.buildConditionFromDict ( \
- {'gnue_name': klass ['gnue_name'],
- 'gnue_module': moduleId})
- resultSet = datasource.createResultSet (cond)
-
- if resultSet.firstRecord () is None:
- resultSet.insertRecord ()
- modifier = 0
- klass ['gnue_id'] = self.__generateId ()
- else:
- klass ['gnue_id'] = resultSet.current.getField ('gnue_id')
- modifier = 1
-
- # replace the module's name by it's gnue_id
- klass ['gnue_module'] = moduleId
-
- if not self.doUpdate (resultSet, klass):
- modifier += 1
-
- stat [modifier] += 1
-
- if stat [0] + stat [1]:
- self.connections.commitAll ()
-
- print o (u_(" Classes : %(ins)3d inserted, %(upd)3d updated, %(kept)3d "
- "unchanged.") \
- % {'ins': stat [0], 'upd': stat [1], 'kept': stat [2]})
-
-
- # ---------------------------------------------------------------------------
- # Update/add Properties to the class repository
- # ---------------------------------------------------------------------------
-
- def _updateProperties (self):
- """
- """
- attributes = {'name' : "dts_gnueProperty",
- 'database': self.OPTIONS ['connection'],
- 'table' : 'gnue_property'}
- fieldList = ['gnue_id', 'gnue_module', 'gnue_class', 'gnue_name',
- 'gnue_type', 'gnue_length', 'gnue_scale', 'gnue_nullable',
- 'gnue_comment']
-
- datasource = GDataSource.DataSourceWrapper (
- connections = self.connections,
- attributes = attributes,
- fields = fieldList,
- unicodeMode = True)
-
- stat = [0, 0, 0] # inserted, updated, unchanged
-
- for prop in self.properties.values ():
- # make sure we have a valid gnue_id for the referenced module
- moduleId = self.__findModule (prop ['gnue_module'])
-
- cond = GConditions.buildConditionFromDict ( \
- {'gnue_name' : prop ['gnue_name'],
- 'gnue_module': moduleId,
- 'gnue_class' : self.classes [prop ['gnue_class']] ['gnue_id']})
- resultSet = datasource.createResultSet (cond)
-
- if resultSet.firstRecord () is None:
- resultSet.insertRecord ()
- modifier = 0
- prop ['gnue_id'] = self.__generateId ()
- else:
- prop ['gnue_id'] = resultSet.current.getField ('gnue_id')
- modifier = 1
-
- # replace module-name and class-name by their gnue_id's
- prop ['gnue_module'] = moduleId
- prop ['gnue_class'] = self.classes [prop ['gnue_class']] ['gnue_id']
-
- if not self.doUpdate (resultSet, prop):
- modifier += 1
-
- stat [modifier] += 1
-
- if stat [0] + stat [1]:
- self.connections.commitAll ()
-
- print o (u_(" Properties: %(ins)3d inserted, %(upd)3d updated, %(kept)3d "
- "unchanged.") \
- % {'ins': stat [0], 'upd': stat [1], 'kept': stat [2]})
-
-
- # ---------------------------------------------------------------------------
- # Update/add Procedures to the class repository
- # ---------------------------------------------------------------------------
-
- def _updateProcedures (self):
- attributes = {'name' : "dts_gnueProcedure",
- 'database': self.OPTIONS ['connection'],
- 'table' : 'gnue_procedure'}
- fieldList = ['gnue_id', 'gnue_module', 'gnue_class', 'gnue_name',
- 'gnue_type', 'gnue_length', 'gnue_scale', 'gnue_nullable',
- 'gnue_comment', 'gnue_code', 'gnue_language']
-
- self._dtsProcedure = GDataSource.DataSourceWrapper (
- connections = self.connections,
- attributes = attributes,
- fields = fieldList,
- unicodeMode = True)
-
- stat = [0, 0, 0] # inserted, updated, unchanged
-
- for proc in self.procedures.values ():
- moduleId = self.__findModule (proc ['gnue_module'])
- cond = GConditions.buildConditionFromDict ( \
- {'gnue_name' : proc ['gnue_name'],
- 'gnue_module': moduleId,
- 'gnue_class' : self.classes [proc ['gnue_class']] ['gnue_id']})
- resultSet = self._dtsProcedure.createResultSet (cond)
-
- if resultSet.firstRecord () is None:
- resultSet.insertRecord ()
- modifier = 0
- proc ['gnue_id'] = self.__generateId ()
- else:
- proc ['gnue_id'] = resultSet.current.getField ('gnue_id')
- modifier = 1
-
- # replace module-name and class-name by their gnue_id's
- proc ['gnue_module'] = moduleId
- proc ['gnue_class'] = self.classes [proc ['gnue_class']] ['gnue_id']
-
- if not self.doUpdate (resultSet, proc):
- modifier += 1
-
- stat [modifier] += 1
-
- if stat [0] + stat [1]:
- self.connections.commitAll ()
-
- print o (u_(" Procedures: %(ins)3d inserted, %(upd)3d updated, %(kept)3d "
- "unchanged.") \
- % {'ins': stat [0], 'upd': stat [1], 'kept': stat [2]})
-
-
- # ---------------------------------------------------------------------------
- # Update/add Procedures to the class repository
- # ---------------------------------------------------------------------------
-
- def _updateParameter (self):
- attributes = {'name' : "dts_gnueParameter",
- 'database': self.OPTIONS ['connection'],
- 'table' : 'gnue_parameter'}
- fieldList = ['gnue_id', 'gnue_procedure', 'gnue_name', 'gnue_type',
- 'gnue_scale', 'gnue_length', 'gnue_comment']
-
- self._dtsParameter = GDataSource.DataSourceWrapper (
- connections = self.connections,
- attributes = attributes,
- fields = fieldList,
- unicodeMode = True)
-
- stat = [0, 0, 0] # inserted, updated, unchanged
-
- for param in self.parameters.values ():
-
- if self.procedures.has_key (param ['gnue_procedure']):
- procId = self.procedures [param ['gnue_procedure']] ['gnue_id']
- else:
- raise ProcedureNotFoundError, (param ['gnue_procedure'])
-
- cond = GConditions.buildConditionFromDict ( \
- {'gnue_name' : param ['gnue_name'],
- 'gnue_procedure': procId})
- resultSet = self._dtsParameter.createResultSet (cond)
-
- if resultSet.firstRecord () is None:
- resultSet.insertRecord ()
- modifier = 0
- param ['gnue_id'] = self.__generateId ()
- else:
- param ['gnue_id'] = resultSet.current.getField ('gnue_id')
- modifier = 1
-
- # replace module-name and class-name by their gnue_id's
- param ['gnue_procedure'] = procId
-
- if not self.doUpdate (resultSet, param):
- modifier += 1
-
- stat [modifier] += 1
-
- if stat [0] + stat [1]:
- self.connections.commitAll ()
-
- print o (u_(" Parameters: %(ins)3d inserted, %(upd)3d updated, %(kept)3d "
- "unchanged.") \
- % {'ins': stat [0], 'upd': stat [1], 'kept': stat [2]})
-
-
- # ---------------------------------------------------------------------------
- # Perform an update on the given resultset using a given data dictionary
- # ---------------------------------------------------------------------------
-
- def doUpdate (self, resultSet, data):
- """
- This function sets all fields in the current record of the resultset base
- on the key/values given by the data dictionary. It returns TRUE, if a field
- value has been changed, otherwise FALSE. If a field was changed, the record
- gets posted.
-
- @param resultSet: resultset with the current record to be updated
- @param data: dictionary with keys and values used for updates
- @return: TRUE if a field has been changed, FALSE if no field has been
- changed.
- """
- doPost = False
-
- for key in data:
- if resultSet.current.getField (key) != data [key]:
- resultSet.current.setField (key, data [key])
- doPost = True
-
- if doPost:
- resultSet.post ()
-
- return doPost
-
-
- # ---------------------------------------------------------------------------
- # Find a module by name
- # ---------------------------------------------------------------------------
-
- def __findModule (self, module):
- if self.modules.has_key (module):
- return self.modules [module]['gnue_id']
- else:
- mc = GConditions.buildConditionFromDict ({'gnue_name': module})
- rs = self._dtsModules.createResultSet (mc)
- if rs.firstRecord () is None:
- raise ModuleNotFoundError, (module)
- return rs.current.getField ('gnue_id')
-
-
- # ---------------------------------------------------------------------------
- # Generate a new object id
- # ---------------------------------------------------------------------------
-
- def __generateId (self):
- """
- This function generates a new gnue_id like it is done by appserver. Once
- this algorithm should be replace by a better one.
- """
- result = u''
- for i in range (0, 32):
- result = result + str (int (whrandom.random () * 10))
- return result
-
-
-if __name__ == "__main__":
- gcdConverter ().run ()
Copied: trunk/gnue-appserver/src/gcd/readgcd.py (from rev 6217,
trunk/gnue-appserver/src/gcd/gcd2sql.py)
===================================================================
--- trunk/gnue-appserver/src/gcd/gcd2sql.py 2004-08-26 15:37:34 UTC (rev
6217)
+++ trunk/gnue-appserver/src/gcd/readgcd.py 2004-08-26 16:28:47 UTC (rev
6219)
@@ -0,0 +1,715 @@
+# GNU Enterprise Application Server - Gnue Schema Definition Generator
+#
+# Copyright 2001-2004 Free Software Foundation
+#
+# This file is part of GNU Enterprise.
+#
+# GNU Enterprise is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+
+import sys
+import os
+import whrandom
+
+from gnue.common.apps import i18n
+from gnue.common.apps.GClientApp import *
+from gnue.common.utils.FileUtils import openResource
+from gnue.common.datasources import GDataSource, GConditions
+
+from gnue.appserver import VERSION
+from gnue.appserver.gcd import GCParser
+
+
+# =============================================================================
+# Exceptions
+# =============================================================================
+
+class Error (gException):
+ pass
+
+class ModuleNotFoundError (Error):
+ def __init__ (self, module):
+ msg = u_("Module '%s' not found in class repository") % module
+ Error.__init__ (self, msg)
+
+class ProcedureNotFoundError (Error):
+ def __init__ (self, procedure):
+ msg = u_("Procedure '%s' not found in class repository") % procedure
+ Error.__init__ (self, msg)
+
+
+# =============================================================================
+# Update a database schema from GNUe Class Definitions and update classrep.
+# =============================================================================
+
+class gcdConverter (GClientApp):
+
+ NAME = "readgcd"
+ VERSION = VERSION
+ COMMAND = "readgcd"
+ USAGE = "%s %s" % (GClientApp.USAGE, " [OPTIONS] file")
+ SUMMARY = _(
+"""Create or update a database schema from a GNUe Class Definition (gcd) file
+and maintain data for all gnue_* classes""")
+
+ # ---------------------------------------------------------------------------
+ # Constructor
+ # ---------------------------------------------------------------------------
+
+ def __init__ (self, connections = None):
+
+ self.addCommandOption ('connection', 'c', argument='connectionname',
+ help = _("Use the connection <connectionname> for creating the
schema"))
+
+ self.addCommandOption ('output','o', argument='filename',
+ help = _("Also send the code for creating the schema to this file."))
+
+ self.addCommandOption ('file-only', 'f', default = False,
+ help = _("If this flag is set, only code is sent to the output file "
+ "and the schema is not created automatically."))
+
+ self.addCommandOption ('username', 'u', argument="user",
+ help = _("Set the username for the database. If the database is to be "
+ "created, this username will be it's owner."))
+
+ self.addCommandOption ('password', 'p', argument="password",
+ help = _("Set the password for the database."))
+
+ ConfigOptions = {}
+
+ GClientApp.__init__ (self, connections, 'readgcd', ConfigOptions)
+
+
+ # ---------------------------------------------------------------------------
+ # Verify the given commandline options
+ # ---------------------------------------------------------------------------
+
+ def __checkOptions (self):
+ """
+ This function checks wether the given command line arguments and options
+ are usefull or not.
+ """
+ self._args = [unicode (a, i18n.encoding) for a in self.ARGUMENTS]
+
+ if not len (self._args):
+ self.handleStartupError (_("No input file specified."))
+
+ try:
+ self._files = []
+
+ for filename in self._args:
+ self._files.append (openResource (filename))
+
+ except IOError:
+ self.handleStartupError (u_("Unable to open input file %s.") % filename)
+
+
+ if not self.OPTIONS ['connection']:
+ self.handleStartupError (_("No connection specified."))
+
+ self.outfile = self.OPTIONS ['output']
+
+ if self.OPTIONS ['file-only'] and self.outfile is None:
+ self.handleStartupError (_("Output to file only requested, but no "
+ "filename specified."))
+
+
+ # ---------------------------------------------------------------------------
+ # Main program
+ # ---------------------------------------------------------------------------
+
+ def run (self):
+ """
+ This is the main function of the whole process. It verifies the given
+ options, loads all schema definitions and then logs into the connection to
+ perform all actions requested.
+ """
+
+ self.__checkOptions ()
+
+ try:
+ self.tables = []
+ self.modules = {}
+ self.classes = {}
+ self.properties = {}
+ self.procedures = {}
+ self.parameters = {}
+
+ for item in range (len (self._files)):
+ print o (u_("Loading gcd file '%s' ...") % self._args [item])
+
+ try:
+ schema = GCParser.loadFile (self._files [item])
+ schema.walk (self.__iterateObjects)
+
+ finally:
+ self._files [item].close ()
+
+ except Exception:
+ print sys.exc_info () [1]
+
+ else:
+ self.executeAndGenerateCode ()
+
+ self.updateRepository ()
+
+
+ # ---------------------------------------------------------------------------
+ # Iterate over all top level elements
+ # ---------------------------------------------------------------------------
+
+ def __iterateObjects (self, sObject):
+ """
+ This function iterates over all objects of a GCD tree and processes the
+ GCModule and GCClass instances.
+
+ @param sObject: current GCD object to be processed
+ """
+ if sObject._type == 'GCModule':
+ self.__translateModule (sObject)
+
+ elif sObject._type == 'GCClass':
+ self.__translateClass (sObject)
+
+
+
+ # ---------------------------------------------------------------------------
+ # A module translates to a gnue_module data entry only
+ # ---------------------------------------------------------------------------
+
+ def __translateModule (self, aModule):
+ """
+ This function adds a dictionary for the given module to the modules data
+ block for later update of the class repository.
+
+ @param aModule: GCD Module object to be processed.
+ """
+
+ self.modules [aModule.name] = self.fetchTags (aModule, ['name', 'comment'])
+ self.modules [aModule.name] ['gnue_id'] = None
+
+
+ # ---------------------------------------------------------------------------
+ # A class translation needs a table creation/modification and a data entry
+ # ---------------------------------------------------------------------------
+
+ def __translateClass (self, aClass):
+ """
+ This function creates an entry for schema creation of the given class, as
+ well as a dictionary for the class repository update.
+
+ @param aClass: GCD Class object to be processed.
+ """
+
+ self.tables.append ({'name': aClass.fullName, 'fields': []})
+
+ if aClass.action == 'create':
+ self.tables [-1]['primarykey'] = {
+ 'name' : 'gnue_id_pk_%s' % aClass.fullName,
+ 'fields': ['gnue_id']}
+
+ cDef = self.fetchTags (aClass, ['name', 'module', 'comment'])
+ cDef ['gnue_id'] = None
+
+ self.classes [aClass.fullName] = cDef
+
+ # After processing the class definition, iterate over all it's items
+ aClass.walk (self.__iterateClassObjects, defs = self.tables [-1])
+
+
+ # ---------------------------------------------------------------------------
+ # Iterate over all elements of a class definition
+ # ---------------------------------------------------------------------------
+
+ def __iterateClassObjects (self, sObject, defs):
+ """
+ This function processes all child objects of a GCD class instance. For all
+ properties a schema creation dictionary will be created. Properties,
+ Procedures and Parameters will be added to the class repository update
+ dictionaries.
+
+ @param sObject: current GCD object to be processed
+ @param defs: schema creation dictionary describing the table definition for
+ the class.
+ """
+
+ if sObject._type == 'GCProperty':
+ fDef = {'name' : sObject.fullName,
+ 'type' : sObject.datatype,
+ 'nullable': sObject.nullable}
+
+ if sObject.length is not None and sObject.length:
+ fDef ['length'] = sObject.length
+ if sObject.scale is not None and sObject.scale:
+ fDef ['precision'] = sObject.scale
+
+ defs ['fields'].append (fDef)
+
+ # Create a foreign key constraint for class references
+ if sObject.isReference:
+ cDef = {'name' : "fk_%s_%s" % (defs ['name'], fDef ['name']),
+ 'fields' : [fDef ['name']],
+ 'reftable' : sObject.type,
+ 'reffields': ['gnue_id']}
+
+ if not defs.has_key ('constraints'):
+ defs ['constraints'] = [cDef]
+ else:
+ defs ['constraints'].append (cDef)
+
+ fqName = "%s.%s" % (sObject._parent.fullName, sObject.fullName)
+ propDef = self.fetchTags (sObject, ['name', 'length', 'scale',
+ 'nullable', 'comment'])
+ if sObject.isReference:
+ propDef ['gnue_type'] = sObject.type
+ propDef ['gnue_length'] = None
+
+ elif sObject.fullName == 'gnue_id':
+ propDef ['gnue_type'] = 'id'
+ propDef ['gnue_length'] = None
+ else:
+ propDef ['gnue_type'] = sObject.datatype
+
+ propDef ['gnue_id'] = None
+ propDef ['gnue_class'] = sObject._parent.fullName
+ propDef ['gnue_module'] = sObject.module
+ self.properties [fqName] = propDef
+
+
+ # Process a procedure of the class
+ elif sObject._type == 'GCProcedure':
+ fqName = "%s.%s" % (sObject._parent.fullName, sObject.fullName)
+ pDef = self.fetchTags (sObject, ['name', 'module', 'nullable',
+ 'language', 'length', 'scale', 'comment'])
+ pDef ['gnue_id'] = None
+ pDef ['gnue_class'] = sObject._parent.fullName
+ pDef ['gnue_type'] = sObject.datatype
+ pDef ['gnue_code'] = sObject.getChildrenAsContent ()
+ self.procedures [fqName] = pDef
+
+ sObject.walk (self.__iterateProcedure)
+
+
+ # ---------------------------------------------------------------------------
+ # Iterate over all child elements of a procedure
+ # ---------------------------------------------------------------------------
+
+ def __iterateProcedure (self, sObject):
+ """
+ This function processes any parameter definitions for a GCD procedure
+ instance. A dictionary for class repository update will be created.
+
+ @param sObject: the GCD parameter object to be processed
+ """
+ if sObject._type == 'GCParameter':
+ pDef = self.fetchTags (sObject, ['name', 'comment', 'length', 'scale'])
+ pDef ['gnue_type'] = sObject.datatype
+ pDef ['gnue_procedure'] = "%s.%s" % (sObject._parent._parent.fullName,
+ sObject._parent.fullName)
+ fqName = "%s.%s" % (pDef ['gnue_procedure'], sObject.name)
+ self.parameters [fqName] = pDef
+
+
+ # ---------------------------------------------------------------------------
+ # Get a dictionary with all keys listed in tags and values from sObject
+ # ---------------------------------------------------------------------------
+
+ def fetchTags (self, sObject, tags):
+ """
+ This function creates a dictionary with all attributes from sObject listed
+ in tags, where the keys are constructed by 'gnue_%s' % attributename.
+
+ @param sObject: Schema object to retriev attributes from
+ @param tags: list of all attributes to retrieve
+ @return: dictionary with the attribute names as keys and their values
+ """
+ res = {}
+ for item in tags:
+ if hasattr (sObject, item):
+ res ["gnue_%s" % item] = getattr (sObject, item)
+ return res
+
+
+ # ---------------------------------------------------------------------------
+ # Execute and generate the code
+ # ---------------------------------------------------------------------------
+
+ def executeAndGenerateCode (self):
+ """
+ This function logs into the given connection and calls it for an update of
+ it's schema according to the loaded table definitions. Additionally the
+ schema creation code is generated by this call, which will be stored in the
+ given output file (if requested by options).
+ """
+
+ connection = self.connections.getConnection (self.OPTIONS ['connection'])
+
+ connection.parameters ['username'] = self.OPTIONS ['username'] or "gnue"
+ connection.parameters ['password'] = self.OPTIONS ['password'] or "gnue"
+
+ self.connections.loginToConnection (connection)
+
+ print _("Updating schema ...")
+ code = connection.updateSchema (self.tables, self.OPTIONS ['file-only'])
+
+ if self.outfile is not None:
+ dest = open (self.outfile, 'w')
+
+ for item in code:
+ for line in item:
+ dest.write (line + "\n")
+
+ dest.close ()
+
+
+ # ---------------------------------------------------------------------------
+ # Update the class repository
+ # ---------------------------------------------------------------------------
+
+ def updateRepository (self):
+ print _("Updating class repository ...")
+
+ self._updateModules ()
+ self._updateClasses ()
+ self._updateProperties ()
+ self._updateProcedures ()
+ self._updateParameter ()
+
+
+ # ---------------------------------------------------------------------------
+ # Update/add modules to the class repository
+ # ---------------------------------------------------------------------------
+
+ def _updateModules (self):
+ """
+ """
+ attributes = {'name' : "dts_gnueModule",
+ 'database': self.OPTIONS ['connection'],
+ 'table' : 'gnue_module'}
+ fieldList = ['gnue_id', 'gnue_name', 'gnue_comment']
+
+ self._dtsModules = GDataSource.DataSourceWrapper (
+ connections = self.connections,
+ attributes = attributes,
+ fields = fieldList,
+ unicodeMode = True)
+
+ stat = [0, 0, 0] # inserted, updated, unchanged
+
+ for module in self.modules.values ():
+ cond = GConditions.buildConditionFromDict ( \
+ {'gnue_name': module ['gnue_name']})
+ resultSet = self._dtsModules.createResultSet (cond)
+
+ if resultSet.firstRecord () is None:
+ resultSet.insertRecord ()
+ modifier = 0
+ module ['gnue_id'] = self.__generateId ()
+ else:
+ module ['gnue_id'] = resultSet.current.getField ('gnue_id')
+ modifier = 1
+
+ if not self.doUpdate (resultSet, module):
+ modifier += 1
+
+ stat [modifier] += 1
+
+ if stat [0] + stat [1]:
+ self.connections.commitAll ()
+
+ print o (u_(" Modules : %(ins)3d inserted, %(upd)3d updated, %(kept)3d "
+ "unchanged.") \
+ % {'ins': stat [0], 'upd': stat [1], 'kept': stat [2]})
+
+
+ # ---------------------------------------------------------------------------
+ # Update/add classes to the class repository
+ # ---------------------------------------------------------------------------
+
+ def _updateClasses (self):
+ """
+ """
+ attributes = {'name' : "dts_gnueClass",
+ 'database': self.OPTIONS ['connection'],
+ 'table' : 'gnue_class'}
+ fieldList = ['gnue_id', 'gnue_name', 'gnue_module', 'gnue_comment']
+
+ datasource = GDataSource.DataSourceWrapper (
+ connections = self.connections,
+ attributes = attributes,
+ fields = fieldList,
+ unicodeMode = True)
+
+ stat = [0, 0, 0] # inserted, updated, unchanged
+
+ for klass in self.classes.values ():
+ moduleId = self.__findModule (klass ['gnue_module'])
+ cond = GConditions.buildConditionFromDict ( \
+ {'gnue_name': klass ['gnue_name'],
+ 'gnue_module': moduleId})
+ resultSet = datasource.createResultSet (cond)
+
+ if resultSet.firstRecord () is None:
+ resultSet.insertRecord ()
+ modifier = 0
+ klass ['gnue_id'] = self.__generateId ()
+ else:
+ klass ['gnue_id'] = resultSet.current.getField ('gnue_id')
+ modifier = 1
+
+ # replace the module's name by it's gnue_id
+ klass ['gnue_module'] = moduleId
+
+ if not self.doUpdate (resultSet, klass):
+ modifier += 1
+
+ stat [modifier] += 1
+
+ if stat [0] + stat [1]:
+ self.connections.commitAll ()
+
+ print o (u_(" Classes : %(ins)3d inserted, %(upd)3d updated, %(kept)3d "
+ "unchanged.") \
+ % {'ins': stat [0], 'upd': stat [1], 'kept': stat [2]})
+
+
+ # ---------------------------------------------------------------------------
+ # Update/add Properties to the class repository
+ # ---------------------------------------------------------------------------
+
+ def _updateProperties (self):
+ """
+ """
+ attributes = {'name' : "dts_gnueProperty",
+ 'database': self.OPTIONS ['connection'],
+ 'table' : 'gnue_property'}
+ fieldList = ['gnue_id', 'gnue_module', 'gnue_class', 'gnue_name',
+ 'gnue_type', 'gnue_length', 'gnue_scale', 'gnue_nullable',
+ 'gnue_comment']
+
+ datasource = GDataSource.DataSourceWrapper (
+ connections = self.connections,
+ attributes = attributes,
+ fields = fieldList,
+ unicodeMode = True)
+
+ stat = [0, 0, 0] # inserted, updated, unchanged
+
+ for prop in self.properties.values ():
+ # make sure we have a valid gnue_id for the referenced module
+ moduleId = self.__findModule (prop ['gnue_module'])
+
+ cond = GConditions.buildConditionFromDict ( \
+ {'gnue_name' : prop ['gnue_name'],
+ 'gnue_module': moduleId,
+ 'gnue_class' : self.classes [prop ['gnue_class']] ['gnue_id']})
+ resultSet = datasource.createResultSet (cond)
+
+ if resultSet.firstRecord () is None:
+ resultSet.insertRecord ()
+ modifier = 0
+ prop ['gnue_id'] = self.__generateId ()
+ else:
+ prop ['gnue_id'] = resultSet.current.getField ('gnue_id')
+ modifier = 1
+
+ # replace module-name and class-name by their gnue_id's
+ prop ['gnue_module'] = moduleId
+ prop ['gnue_class'] = self.classes [prop ['gnue_class']] ['gnue_id']
+
+ if not self.doUpdate (resultSet, prop):
+ modifier += 1
+
+ stat [modifier] += 1
+
+ if stat [0] + stat [1]:
+ self.connections.commitAll ()
+
+ print o (u_(" Properties: %(ins)3d inserted, %(upd)3d updated, %(kept)3d "
+ "unchanged.") \
+ % {'ins': stat [0], 'upd': stat [1], 'kept': stat [2]})
+
+
+ # ---------------------------------------------------------------------------
+ # Update/add Procedures to the class repository
+ # ---------------------------------------------------------------------------
+
+ def _updateProcedures (self):
+ attributes = {'name' : "dts_gnueProcedure",
+ 'database': self.OPTIONS ['connection'],
+ 'table' : 'gnue_procedure'}
+ fieldList = ['gnue_id', 'gnue_module', 'gnue_class', 'gnue_name',
+ 'gnue_type', 'gnue_length', 'gnue_scale', 'gnue_nullable',
+ 'gnue_comment', 'gnue_code', 'gnue_language']
+
+ self._dtsProcedure = GDataSource.DataSourceWrapper (
+ connections = self.connections,
+ attributes = attributes,
+ fields = fieldList,
+ unicodeMode = True)
+
+ stat = [0, 0, 0] # inserted, updated, unchanged
+
+ for proc in self.procedures.values ():
+ moduleId = self.__findModule (proc ['gnue_module'])
+ cond = GConditions.buildConditionFromDict ( \
+ {'gnue_name' : proc ['gnue_name'],
+ 'gnue_module': moduleId,
+ 'gnue_class' : self.classes [proc ['gnue_class']] ['gnue_id']})
+ resultSet = self._dtsProcedure.createResultSet (cond)
+
+ if resultSet.firstRecord () is None:
+ resultSet.insertRecord ()
+ modifier = 0
+ proc ['gnue_id'] = self.__generateId ()
+ else:
+ proc ['gnue_id'] = resultSet.current.getField ('gnue_id')
+ modifier = 1
+
+ # replace module-name and class-name by their gnue_id's
+ proc ['gnue_module'] = moduleId
+ proc ['gnue_class'] = self.classes [proc ['gnue_class']] ['gnue_id']
+
+ if not self.doUpdate (resultSet, proc):
+ modifier += 1
+
+ stat [modifier] += 1
+
+ if stat [0] + stat [1]:
+ self.connections.commitAll ()
+
+ print o (u_(" Procedures: %(ins)3d inserted, %(upd)3d updated, %(kept)3d "
+ "unchanged.") \
+ % {'ins': stat [0], 'upd': stat [1], 'kept': stat [2]})
+
+
+ # ---------------------------------------------------------------------------
+ # Update/add Procedures to the class repository
+ # ---------------------------------------------------------------------------
+
+ def _updateParameter (self):
+ attributes = {'name' : "dts_gnueParameter",
+ 'database': self.OPTIONS ['connection'],
+ 'table' : 'gnue_parameter'}
+ fieldList = ['gnue_id', 'gnue_procedure', 'gnue_name', 'gnue_type',
+ 'gnue_scale', 'gnue_length', 'gnue_comment']
+
+ self._dtsParameter = GDataSource.DataSourceWrapper (
+ connections = self.connections,
+ attributes = attributes,
+ fields = fieldList,
+ unicodeMode = True)
+
+ stat = [0, 0, 0] # inserted, updated, unchanged
+
+ for param in self.parameters.values ():
+
+ if self.procedures.has_key (param ['gnue_procedure']):
+ procId = self.procedures [param ['gnue_procedure']] ['gnue_id']
+ else:
+ raise ProcedureNotFoundError, (param ['gnue_procedure'])
+
+ cond = GConditions.buildConditionFromDict ( \
+ {'gnue_name' : param ['gnue_name'],
+ 'gnue_procedure': procId})
+ resultSet = self._dtsParameter.createResultSet (cond)
+
+ if resultSet.firstRecord () is None:
+ resultSet.insertRecord ()
+ modifier = 0
+ param ['gnue_id'] = self.__generateId ()
+ else:
+ param ['gnue_id'] = resultSet.current.getField ('gnue_id')
+ modifier = 1
+
+ # replace module-name and class-name by their gnue_id's
+ param ['gnue_procedure'] = procId
+
+ if not self.doUpdate (resultSet, param):
+ modifier += 1
+
+ stat [modifier] += 1
+
+ if stat [0] + stat [1]:
+ self.connections.commitAll ()
+
+ print o (u_(" Parameters: %(ins)3d inserted, %(upd)3d updated, %(kept)3d "
+ "unchanged.") \
+ % {'ins': stat [0], 'upd': stat [1], 'kept': stat [2]})
+
+
+ # ---------------------------------------------------------------------------
+ # Perform an update on the given resultset using a given data dictionary
+ # ---------------------------------------------------------------------------
+
+ def doUpdate (self, resultSet, data):
+ """
+ This function sets all fields in the current record of the resultset base
+ on the key/values given by the data dictionary. It returns TRUE, if a field
+ value has been changed, otherwise FALSE. If a field was changed, the record
+ gets posted.
+
+ @param resultSet: resultset with the current record to be updated
+ @param data: dictionary with keys and values used for updates
+ @return: TRUE if a field has been changed, FALSE if no field has been
+ changed.
+ """
+ doPost = False
+
+ for key in data:
+ if resultSet.current.getField (key) != data [key]:
+ resultSet.current.setField (key, data [key])
+ doPost = True
+
+ if doPost:
+ resultSet.post ()
+
+ return doPost
+
+
+ # ---------------------------------------------------------------------------
+ # Find a module by name
+ # ---------------------------------------------------------------------------
+
+ def __findModule (self, module):
+ if self.modules.has_key (module):
+ return self.modules [module]['gnue_id']
+ else:
+ mc = GConditions.buildConditionFromDict ({'gnue_name': module})
+ rs = self._dtsModules.createResultSet (mc)
+ if rs.firstRecord () is None:
+ raise ModuleNotFoundError, (module)
+ return rs.current.getField ('gnue_id')
+
+
+ # ---------------------------------------------------------------------------
+ # Generate a new object id
+ # ---------------------------------------------------------------------------
+
+ def __generateId (self):
+ """
+ This function generates a new gnue_id like it is done by appserver. Once
+ this algorithm should be replace by a better one.
+ """
+ result = u''
+ for i in range (0, 32):
+ result = result + str (int (whrandom.random () * 10))
+ return result
+
+
+if __name__ == "__main__":
+ gcdConverter ().run ()
Modified: trunk/gnue-common/packaging/win32/GNUe-Appserver-debug.iss
===================================================================
--- trunk/gnue-common/packaging/win32/GNUe-Appserver-debug.iss 2004-08-26
16:05:57 UTC (rev 6218)
+++ trunk/gnue-common/packaging/win32/GNUe-Appserver-debug.iss 2004-08-26
16:28:47 UTC (rev 6219)
@@ -30,7 +30,8 @@
[Files]
Source: c:\gnue\bin\gnue-appserver.exe; DestDir: {app}\bin; Components: main;
Flags: ignoreversion
Source: c:\gnue\bin\gnue-gsdgen.exe; DestDir: {app}\bin; Components: main;
Flags: ignoreversion
-Source: c:\gnue\bin\gnue-gcd2sql.exe; DestDir: {app}\bin; Components: main;
Flags: ignoreversion
+Source: c:\gnue\bin\gnue-readgcd.exe; DestDir: {app}\bin; Components: main;
Flags: ignoreversion
+Source: c:\gnue\bin\gnue-readgld.exe; DestDir: {app}\bin; Components: main;
Flags: ignoreversion
Source: c:\gnue\bin\gnue\appserver\*.*; DestDir: {app}\bin\gnue\appserver;
Flags: recursesubdirs ignoreversion; Components: main
Source: c:\gnue\share\locale\de\LC_MESSAGES\gnue-appserver.mo; DestDir:
{app}\share\locale\de\LC_MESSAGES\; Flags: recursesubdirs; Components:
translations
Source: c:\gnue\share\locale\es_MX\LC_MESSAGES\gnue-appserver.mo; DestDir:
{app}\share\locale\es_MX\LC_MESSAGES\; Flags: recursesubdirs; Components:
translations
Modified: trunk/gnue-common/packaging/win32/GNUe-Appserver.iss
===================================================================
--- trunk/gnue-common/packaging/win32/GNUe-Appserver.iss 2004-08-26
16:05:57 UTC (rev 6218)
+++ trunk/gnue-common/packaging/win32/GNUe-Appserver.iss 2004-08-26
16:28:47 UTC (rev 6219)
@@ -30,7 +30,8 @@
[Files]
Source: c:\gnue\bin\gnue-appserver.exe; DestDir: {app}\bin; Components: main;
Flags: ignoreversion
Source: c:\gnue\bin\gnue-gsdgen.exe; DestDir: {app}\bin; Components: main;
Flags: ignoreversion
-Source: c:\gnue\bin\gnue-gcd2sql.exe; DestDir: {app}\bin; Components: main;
Flags: ignoreversion
+Source: c:\gnue\bin\gnue-readgcd.exe; DestDir: {app}\bin; Components: main;
Flags: ignoreversion
+Source: c:\gnue\bin\gnue-readgld.exe; DestDir: {app}\bin; Components: main;
Flags: ignoreversion
Source: c:\gnue\bin\gnue\appserver\*.*; DestDir: {app}\bin\gnue\appserver;
Flags: recursesubdirs ignoreversion; Components: main
Source: c:\gnue\share\locale\de\LC_MESSAGES\gnue-appserver.mo; DestDir:
{app}\share\locale\de\LC_MESSAGES\; Flags: recursesubdirs; Components:
translations
Source: c:\gnue\share\locale\es_MX\LC_MESSAGES\gnue-appserver.mo; DestDir:
{app}\share\locale\es_MX\LC_MESSAGES\; Flags: recursesubdirs; Components:
translations
Modified: trunk/gnue-common/packaging/win32/setup.py
===================================================================
--- trunk/gnue-common/packaging/win32/setup.py 2004-08-26 16:05:57 UTC (rev
6218)
+++ trunk/gnue-common/packaging/win32/setup.py 2004-08-26 16:28:47 UTC (rev
6219)
@@ -10,7 +10,8 @@
"gnue-designer",
"gnue-forms",
"gnue-gsdgen",
- "gnue-gcd2sql",
+ "gnue-readgcd",
+ "gnue-readgld",
"gnue-import",
"gnue-navigator",
"gnue-reports",
Modified: trunk/gnue-common/utils/update-tool-docs
===================================================================
--- trunk/gnue-common/utils/update-tool-docs 2004-08-26 16:05:57 UTC (rev
6218)
+++ trunk/gnue-common/utils/update-tool-docs 2004-08-26 16:28:47 UTC (rev
6219)
@@ -30,7 +30,8 @@
gcvs $GDTD gld gnue-appserver/doc/gld.dtd
(cd gnue-appserver/doc/man && gacvs --selfdoc manpage --selfdoc-file
gnue-appserver.1)
(cd gnue-appserver/doc/man && ggcvs --selfdoc manpage --selfdoc-file
gnue-gsdgen.1)
-(cd gnue-appserver/doc/man && gcdcvs --selfdoc manpage --selfdoc-file
gnue-gcd2sql.1)
+(cd gnue-appserver/doc/man && gcdcvs --selfdoc manpage --selfdoc-file
gnue-readgcd.1)
+(cd gnue-appserver/doc/man && gldcvs --selfdoc manpage --selfdoc-file
gnue-readgld.1)
# Navigator
gcvs $GDTD navigator gnue-navigator/doc/gnue-navigator.dtd
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- r6219 - in trunk: gnue-appserver gnue-appserver/doc gnue-appserver/doc/man gnue-appserver/samples gnue-appserver/scripts gnue-appserver/src/gcd gnue-common/packaging/win32 gnue-common/utils,
reinhard <=