fdb-1.4.9+dfsg1/0000755000215700017510000000000012544565035012176 5ustar rstuartitfdb-1.4.9+dfsg1/sphinx/0000755000215700017510000000000012544565035013507 5ustar rstuartitfdb-1.4.9+dfsg1/sphinx/changelog.txt0000644000215700017510000002415712544564660016213 0ustar rstuartit######### Changelog ######### * `Version 1.4.9`_ (30.6.2015) * `Version 1.4.8`_ (23.6.2015) * `Version 1.4.7`_ (4.6.2015) * `Version 1.4.6`_ (29.5.2015) * `Version 1.4.5`_ (31.3.2015) * `Version 1.4.4`_ (27.2.2015) * `Version 1.4.3`_ (14.11.2014) * `Version 1.4.2`_ (13.11.2014) * `Version 1.4.1`_ (25.6.2014) * `Version 1.4`_ (24.6.2013) * `Version 1.3`_ (7.6.2013) * `Version 1.2`_ (31.5.2013) * `Version 1.1.1`_ (14.5.2013) * `Version 1.1`_ (9.4.2013) * `Version 1.0`_ (7.3.2013) * `Version 0.9.9`_ (30.11.2012) * `Version 0.9.1`_ (8. 9. 2012) * `Version 0.9`_ (5. 9. 2012) * `Version 0.8.5`_ (28. 6. 2012) * `Version 0.8`_ (31. 5. 2012) * `Version 0.7.2`_ (27. 3. 2012) * `Version 0.7.1`_ (31. 1. 2012) * `Version 0.7`_ (21. 12. 2011) Version 1.4.9 ============= - (PYFB-51) .get_sql_for('create') returns invalid output parameters - (PYFB-52) isc_info* types which are _DATABASE_INFO_CODES_WITH_COUNT_RESULTS raises TypeError: 'float' object cannot be interpreted as an integer Version 1.4.8 ============= - Enhancement to automatic client library location detection on POSIX. Now it also looks at LD_LIBRARY_PATH dir if specified. Version 1.4.7 ============= - Forgoten debug printout removed. Annoying for Python 2.x users, fatal for 3.x users. Version 1.4.6 ============= Bugs Fixed ---------- - (PYFB-50) Exception ReferenceError: 'weakly-referenced object no longer exists' in PreparedStatement and Cursor Version 1.4.5 ============= Bugs Fixed ---------- - (PYFB-49) Memory and DB resource leak due to circular references. Version 1.4.4 ============= Improvements ------------ - (PYFB-47) Firebird client library path added as optinal parameter to :func:`fdb.connect` and :func:`fdb.create_database`. Bugs Fixed ---------- - Additional fix related to PYFB-43 - Additional correction for unregistered problem with circular ref. between PS and Cursor when explicit PS is executed. Version 1.4.3 ============= Bugs Fixed ---------- - Previous fix for PYFB-43 was incomplete, corrected. Version 1.4.2 ============= Improvements ------------ - In relation to PYFB-43 I had to make a **backward incompatible change** to event processing API. Starting from this version `EventConduit` does not automatically starts collection of events upon creation, but it's now necessary to call :meth:`~fdb.EventConduit.begin` method. To mitigate the inconvenience, EventConduit now supports context manager protocol that ensures calls to begin() and close() via `with` statement. - In relation to PYFB-39 I have decided to drop support for implicitly cached and reused prepared statements. I never liked this feature as I think it's a sneaky method how to put some performance to badly written applications that in worst case may lead to significant resource consumption on server side when developers are not only lazy but also stupid. It was implemented for the sake of compatibility with KInterbasDB. **This change has no impact on API, but may affect performance of your applications.** Bugs Fixed ---------- - PYFB-44 - Inserting a datetime.date into a TIMESTAMP column does not work - PYFB-42 - Python 3.4 and FDB - backup throws an exception - Unregistered - Fixes in monitor.TransactionInfo Version 1.4.1 ============= Improvements ------------ - PYFB-40 - fbclient.dll is not found if not in path. Aside from registry lookup, client library isn't loaded until first call to :func:`fdb.connect`, :func:`fdb.create_database` or :func:`fdb.load_api` (which now supports optional specification of Firebird Client Library to load). - Adjustments for Firebird 3.0 (Alpha1) - Properties :attr:`~fdb.services.Connection.version` and :attr:`~fdb.services.Connection.engine_version` added to :class:`fdb.services.Connection` Bugs Fixed ---------- - Unregistered - isolation_level parameter for fdb.connection has no effect. - Unregistered - Information gathered from monitoring tables is not properly dropped upon refresh request. Version 1.4 =========== New Features ------------ - :mod:`fdb.schema` submodule extended with support for user privileges. Improvements ------------ - :meth:`fdb.services.User.load_information` method to load information about user from server. - :mod:`fdb.ibase` content cleanup and additions. - :mod:`fdb.blr` submodule with BLR definitions. Bugs Fixed ---------- - PYFB-37 - Unicode Strings incorrect not allowed for insertion into BLOB SubType 1. Version 1.3 =========== New Features ------------ - :mod:`fdb.monitor` submodule for access to / work with monitoring tables. - New :attr:`fdb.Connection.monitor` property for access to monitoring tables. Improvements ------------ - :attr:`~fdb.schema.Schema.closed` property and :meth:`~fdb.schema.Schema.clear` method for Schema. - Unit tests reworked. Bugs Fixed ---------- - Unregistered: Bug in :meth:`fdb.schema.Schema.close` and :meth:`fdb.schema.Schema.bind`. Version 1.2 =========== New Features ------------ - :mod:`fdb.schema` submodule for access to / work with database metadata. - :mod:`fdb.utils` submodule with various helper classes and functions. - New :attr:`fdb.Connection.schema` property for access to database schema. - New :class:`~fdb.ConnectionWithSchema` connection class that provides more direct access to database schema than `Connection`. - New :attr:`fdb.Connection.firebird_version`, :attr:`fdb.Connection.version` and :attr:`fdb.Connection.engine_version` properties. - New `Connection.ods` read only property that returns ODS version number of connected database. There are also new module-level constants `ODS_FB_20`, `ODS_FB_21` and `ODS_FB_25`. - New :attr:`fdb.Connection.query_transaction` property. This is ReadOnly ReadCommitted transaction that could be active indefinitely without blocking garbage collection. It’s used internally to query metadata, but it’s generally useful. Improvements ------------ - Optional PEP 249 (Python DB API 2.0) Extensions - `Connection.Error`, `Connection.ProgrammingError`, etc. All exception classes defined by the DB API standard are exposed on the Connection objects as attributes (in addition to being available at module scope). - `Cursor.connection` This read-only attribute return a reference to the Connection object on which the cursor was created. - `Cursor.transaction` read-only attribute returns a reference to the Transaction object on which the cursor was created. - Optimized wekref management, especially for `PreparedStatement`. - `create_database` now supports two methods for database screation. You can specify CREATE DATABASE statement (as before) or provide set of named database parameters (SQL statement is created automatically from them). - Functions `connection` and `create_database` now take optional keyword parameter `connection_class` to obtain instances of different class instead `Connection`. - Support for legacy (pre-2.5) shutdown mode with mode `fdb.services.SHUT_LEGACY`. - :meth:`fdb.Cursor.executemany` returns `self`, so it could be used directly as iterator. - Documentation inprovements. Bugs Fixed ---------- - Unregistered: `buffers` parameter of `fdb.connection` doesn't support values greater than 255. - Unregistered: Lowercase character set name passed to `fdb.connect` may result in wrong funcion of automatic data conversions and other failures (exceptions raised). Version 1.1.1 ============= Bugs Fixed ---------- - PYFB-35 - Call to fetch after a sql statement without a result should raise exception - PYFB-34 - Server resources not released on PreparedStatement destruction Version 1.1 =========== New Features ------------ - :ref:`Context Manager ` for transactions. Bugs Fixed ---------- - PYFB-30 - BLOBs are truncated at first zero byte Version 1.0 =========== Improvements ------------ - Removed dependency on fbclient library to be present at import time (PYFB-24) Bugs Fixed ---------- - PYFB-25 - Truncate long text from VARCHAR(5000) Version 0.9.9 ============= New Features ------------ - Firebird ARRAY support. Other changes ------------- - Cursor.execute() returns Self, so it could be used as iterator. - Reading output from Services now uses more efficient method to get data from server. Bugs Fixed ---------- - Fix: precision_cache in Connection works as intended. Version 0.9.1 ============= Just bugfixes to make FDB work on P3K again. Version 0.9 =========== New Features ------------ - Documentation; both in-source (in Sphinx autodoc format) and Sphinx (html) - Services API completely reworked Other changes ------------- - Unregistered bugs fixed. - Various optimizations and cleanup - Object reference graph optimalizations - Many new tests in test suite Version 0.8.5 ============= New Features ------------ - Support for Firebird stream BLOBs (see ReleaseNotes for details) - Documentation (stub, from KInterbasDB 3.3.0) Bugs Fixed ---------- - Fix for PYFB-17 and PYFB-18 (see our JIRA tracker for details) - Fixes for automatic unicode conversions + refactoring - Some optimizations Version 0.8 =========== New Features ------------ - Support for Firebird Event Notifications - `JIRA entry ` Bugs Fixes ---------- - database_info (isc_info_firebird_version) fails opn amd64 linux - `JIRA entry ` - more than 2 consecutive cursor open execute and iter fail - `JIRA entry ` Version 0.7.2 ============= New Features ------------ - Python 3 Support (thanks to Philippe Makowski) - Support for Distributed Transactions And as always, some (unregistered) bugs fixed. Version 0.7.1 ============= Bug fixes. Version 0.7 =========== Initial release. Almost feature-complete (ready for 95% of users), but it could be still buggy (it’s beta!), and the code wasn’t optimized for size and speed. In all other ways it’s ready for wide testing. What’s missing -------------- - Distributed transactions - ARRAY support - EVENTs support - Stream BLOBs - TRACE service - Documentation (but you can use KInterbasDB one as FDB is as close to it as possible). - Python 3.x support (haven’t had time to test it, but it shouldn’t be hard to make it work there) fdb-1.4.9+dfsg1/sphinx/conf.py0000644000215700017510000001423312544564670015015 0ustar rstuartit# -*- coding: utf-8 -*- # # FDB documentation build configuration file, created by # sphinx-quickstart on Wed Jan 7 12:29:48 2009. # # This file is execfile()d with the current directory set to its containing dir. # # The contents of this file are pickled, so don't put values in the namespace # that aren't pickleable (module imports are okay, they're removed automatically). # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os # If your extensions are in another directory, add it here. If the directory # is relative to the documentation root, use os.path.abspath to make it # absolute, like shown here. sys.path.append(os.path.abspath('..')) # General configuration # --------------------- # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinx.ext.todo'] # Add any paths that contain templates here, relative to this directory. templates_path = ['.templates'] # The suffix of source filenames. source_suffix = '.txt' # The encoding of source files. #source_encoding = 'utf-8' # The master toctree document. master_doc = 'index' # General information about the project. project = u'FDB' copyright = u'2009-2015, David Rushby, Pavel Cisar' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = '1.4.9' # The full version, including alpha/beta/rc tags. release = '1.4.9' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of documents that shouldn't be included in the build. unused_docs = ['usage'] # List of directories, relative to source directory, that shouldn't be searched # for source files. exclude_trees = ['.build','requirements.txt'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # Autodoc options # --------------- autoclass_content = 'both' # Intersphinx options intersphinx_mapping = {'python': ('http://docs.python.org/', None)} # Options for HTML output # ----------------------- html_theme = "fdbtheme" html_theme_path = ["."] # The style sheet to use for HTML and HTML Help pages. A file of that name # must exist either in Sphinx' static/ path, or in one of the custom paths # given in html_static_path. #html_style = 'pyramid.css' # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['.static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_use_modindex = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, the reST sources are included in the HTML build as _sources/. #html_copy_source = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = '' # Output file base name for HTML help builder. htmlhelp_basename = 'FDBdoc' # Options for LaTeX output # ------------------------ # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, document class [howto/manual]). latex_documents = [ ('index', 'FDB.tex', ur'FDB Documentation', ur'Pavel Cisar', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_use_modindex = True fdb-1.4.9+dfsg1/sphinx/python-db-api-compliance.txt0000644000215700017510000002102712431143162021021 0ustar rstuartit##################################### Compliance to Python Database API 2.0 ##################################### .. currentmodule:: fdb Full text of Python Database API 2.0 (PEP 249) is available at `http://www.python.org/dev/peps/pep-0249/ `__ Unsupported Optional Features ============================= :meth:`fdb.Cursor.nextset` This method is not implemented because the database engine does not support opening multiple result sets simultaneously with a single cursor. Supported Optional Features =========================== - `Connection.Error`, `Connection.ProgrammingError`, etc. All exception classes defined by the DB API standard are exposed on the Connection objects as attributes (in addition to being available at module scope). - `Cursor.connection` This read-only attribute return a reference to the Connection object on which the cursor was created. Nominally Supported Optional Features ===================================== :class:`fdb.Cursor` :attr:`~fdb.Cursor.arraysize` As required by the spec, the value of this attribute is observed with respect to the `fetchmany` method. However, changing the value of this attribute does not make any difference in fetch efficiency because the database engine only supports fetching a single row at a time. :meth:`~fdb.Cursor.setinputsizes` Although this method is present, it does nothing, as allowed by the spec. :meth:`~fdb.Cursor.setoutputsize` Although this method is present, it does nothing, as allowed by the spec. Extensions and Caveats ====================== FDB offers a large feature set beyond the minimal requirements of the Python DB API. This section attempts to document only those features that overlap with the DB API, or are too insignificant to warrant their own subsection elsewhere. :func:`fdb.connect` This function supports the following optional keyword arguments in addition to those required by the spec: :role: For connecting to a database with a specific SQL role. *Example:* .. sourcecode:: python fdb.connect(dsn='host:/path/database.db', user='limited_user', password='pass', role='MORE_POWERFUL_ROLE') :charset: For explicitly specifying the character set of the connection. See Firebird Documentation for a list of available character sets, and `Unicode Fields and FDB` section for information on handling extended character sets with FDB. *Example:* .. sourcecode:: python fdb.connect(dsn='host:/path/database.db', user='sysdba', password='pass', charset='UTF8') :sql_dialect: The SQL dialect is feature for backward compatibility with Interbase® 5.5 or earlier. The default dialect is `3` (the most featureful dialect, default for Firebird). If you want to connect to `legacy` databases, you must explicitly set this argument's value to `1`. Dialect `2` is a transitional dialect that is normally used only during ports from IB < 6 to IB >= 6 or Firebird. See Firebird documentation for more information about SQL Dialects. *Example:* .. sourcecode:: python fdb.connect(dsn='host:/path/database.db', user='sysdba', password='pass', dialect=1) :class:`fdb.Connection` :attr:`~fdb.Connection.charset` *(read-only)* The character set of the connection (set via the `charset` parameter of :func:`fdb.connect()`). See Firebird Documentation for a list of available character sets, and `Unicode Fields and FDB` section for information on handling extended character sets with FDB. :attr:`~fdb.Connection.sql_dialect` This integer attribute indicates which SQL dialect the connection is using. You should not change a connection's dialect; instead, discard the connection and establish a new one with the desired dialect. For more information, see the documentation of the `sql_dialect` argument of the `connect` function. :attr:`~fdb.Connection.server_version` *(read-only)* The version string of the database server to which this connection is connected. :meth:`~fdb.Connection.execute_immediate` Executes a statement without caching its prepared form. The statement must *not* be of a type that returns a result set. In most cases (especially cases in which the same statement -- perhaps a parameterized statement -- is executed repeatedly), it is better to create a cursor using the connection's `cursor` method, then execute the statement using one of the cursor's execute methods. Arguments: :sql: String containing the SQL statement to execute. :meth:`~fdb.Connection.commit(retaining=False)` :meth:`~fdb.Connection.rollback(retaining=False, savepoint=None)` The `commit` and `rollback` methods accept an optional boolean parameter `retaining` (default `False`) that indicates whether the transactional context of the transaction being resolved should be recycled. For details, see the Advanced Transaction Control: Retaining Operations section of this document. The `rollback` method accepts an optional string parameter `savepoint` that causes the transaction to roll back only as far as the designated savepoint, rather than rolling back entirely. For details, see the Advanced Transaction Control: Savepoints section of this document. :class:`fdb.Cursor` :attr:`~fdb.Cursor.description` FDB makes absolutely no guarantees about `description` except those required by the Python Database API Specification 2.0 (that is, `description` is either `None` or a sequence of 7-element sequences). Therefore, client programmers should *not* rely on `description` being an instance of a particular class or type. FDB provides several named positional constants to be used as indices into a given element of `description` . The contents of all `description` elements are defined by the DB API spec; these constants are provided merely for convenience. .. sourcecode:: python DESCRIPTION_NAME DESCRIPTION_TYPE_CODE DESCRIPTION_DISPLAY_SIZE DESCRIPTION_INTERNAL_SIZE DESCRIPTION_PRECISION DESCRIPTION_SCALE DESCRIPTION_NULL_OK Here is an example of accessing the *name* of the first field in the `description` of cursor `cur`: .. sourcecode:: python nameOfFirstField = cur.description[0][fdb.DESCRIPTION_NAME] For more information, see the documentation of Cursor.description in the `DB API Specification `__. :attr:`~fdb.Cursor.rowcount` Although FDB's `Cursor`s implement this attribute, the database engine's own support for the determination of "rows affected"/"rows selected" is quirky. The database engine only supports the determination of rowcount for `INSERT`, `UPDATE`, `DELETE`, and `SELECT` statements. When stored procedures become involved, row count figures are usually not available to the client. Determining rowcount for `SELECT` statements is problematic: the rowcount is reported as zero until at least one row has been fetched from the result set, and the rowcount is misreported if the result set is larger than 1302 rows. The server apparently marshals result sets internally in batches of 1302, and will misreport the rowcount for result sets larger than 1302 rows until the 1303rd row is fetched, result sets larger than 2604 rows until the 2605th row is fetched, and so on, in increments of 1302. As required by the Python DB API Spec, the rowcount attribute "is -1 in case no executeXX() has been performed on the cursor or the rowcount of the last operation is not determinable by the interface". :meth:`~fdb.Cursor.fetchone` :meth:`~fdb.Cursor.fetchmany` :meth:`~fdb.Cursor.fetchall` FDB makes absolutely no guarantees about the return value of the `fetchone` / `fetchmany` / `fetchall` methods except that it is a sequence indexed by field position. FDB makes absolutely no guarantees about the return value of the `fetchonemap` / `fetchmanymap` / `fetchallmap` methods (documented below) except that it is a mapping of field name to field value. Therefore, client programmers should *not* rely on the return value being an instance of a particular class or type. fdb-1.4.9+dfsg1/sphinx/usage-guide.txt0000644000215700017510000044323312431126606016450 0ustar rstuartit =========== Usage Guide =========== .. currentModule:: fdb Driver structure ================ Source code is currently divided into next submodules: * :mod:`~fdb.ibase` - Python :ref:`ctypes ` interface to Firebird client library. * :mod:`~fdb.fbcore` - Main driver source code. * :mod:`~fdb.services` - Driver code to work with Firebird Services. * :mod:`~fdb.schema` - Driver code to work with Firebird database schema (metadata). * :mod:`~fdb.utils` - Various classes and functions used by driver that are generally useful. All important data, functions, classes and constants are available directly in fdb namespace, so there is not need to import or use :mod:`~fdb.fbcore` and :mod:`~fdb.ibase` submodules directly. Exception is the :mod:`fdb.services` submodule that contains functions and classes for work with Firebird Services. Because Services are optional, not so frequently used Firebird facility, all service-related code was isolated in separate submodule rather than exposed directly through main module namespace. Because :mod:`~fdb.services` submodule contains names also used by main driver (:func:`~fdb.services.connect`, :class:`~fdb.services.Connection`), it's advised to use fully qualified names when refering to them instead importing them via `from fdb.services import ...`. .. index:: Database Databases ========= Access to the database is made available through :class:`Connection` objects. FDB provides two constructors for these: * :func:`connect` - Returns `Connection` to database that already exists. * :func:`create_database` - Returns `Connection` to newly created database. .. index:: pair: Database; connect Using `connect` --------------- This constructor has number of keyword parameters that could be divided into several groups: * Database specification (parameters `dsn`, `host`, `database` and `port`) * User specification (parameters `user`, `password` and `role`) * Connection options (parameters `sql_dialect`, `charset`, `isolation_level`, `buffers`, `force_writes`, `no_reserve` and `db_key_scope`) To establish a connection to database, you always must specify the database, either as `connection string` parameter `dsn`, or as required combination of parameters `host`, `database` and `port`. .. important:: Current driver version ignores the value of `port` parameter. If you need to specify the port number, you have to use `dsn` parameter instead. Although specification of `user` and `password` parameters is optional (if environment variables `ISC_USER` and `ISC_PASSWORD` are set, their values are used if these parameters are ommited), it's recommended practice to use them. Parameter `role` is needed only when you use Firebird roles. Connection options are optional (see `Firebird Documentation`_ for details). However you may often want to specify `charset`, as it directs automatic conversions of string data between client and server, and automatic conversions from/to unicode performed by FDB driver (see `Data handling and conversions`_ for details). **Examples:** .. code-block:: python # Connecting via 'dsn' # # Local database (local protocol, if supported) con = fdb.connect(dsn='/path/database.fdb', user='sysdba', password='pass') # Local database (TCP/IP) con = fdb.connect(dsn='localhost:/path/database.fdb', user='sysdba', password='pass') # Local database (TCP/IP with port specification) con = fdb.connect(dsn='localhost/3050:/path/database.fdb', user='sysdba', password='pass') # Remote database con = fdb.connect(dsn='host:/path/database.db', user='sysdba', password='pass') # Remote database with port specification con = fdb.connect(dsn='host/3050:/path/database.db', user='sysdba', password='pass') # # Connecting via 'database', 'host' and 'port' # # Local database (local protocol, if supported) con = fdb.connect(database='/path/database.db', user='sysdba', password='pass') # Local database (TCP/IP) con = fdb.connect(host='localhost', database='/path/database.db', user='sysdba', password='pass') # Local database (TCP/IP with port specification) con = fdb.connect(host='localhost', port=3050, database='/path/database.db', user='sysdba', password='pass') # Remote database con = fdb.connect(host='myhost', database='/path/database.db', user='sysdba', password='pass') Since version 1.2 FDB supports additional `Connection` class(es) that extend :class:`Connection` functionality in optional (opt-in) way. For example :class:`ConnectionWithSchema` extends Connection interface with methods and attributes provided by :class:`~fdb.schema.Schema`. New `connection_class` parameter was introduced to `connect` and `create_database` to connect to/create database using different class than descends from `Connection`. **Example:** .. code-block:: python # Connecting through ConnectionWithSchema # con = fdb.connect(dsn='/path/database.fdb', user='sysdba', password='pass', connection_class=fdb.ConnectionWithSchema) .. index:: pair: Database; create Using `create_database` ----------------------- The Firebird engine supports dynamic database creation via the SQL statement `CREATE DATABASE`. FDB wraps it into :func:`create_database`, that returns `Connection` instance attached to newly created database. **Example:** .. code-block:: python con = fdb.create_database("create database 'host:/temp/db.db' user 'sysdba' password 'pass'") .. note:: Since version 1.2 FDB supports additional method for database creation. Instead `CREATE DATABASE` SQL statement you can use number of optional keyword parameters introduced to :func:`create_database`. **Example:** .. code-block:: python con = fdb.create_database(dsn='/temp/db.fdb',user='sysdba',password='pass',page_size=8192) .. index:: pair: Database; delete Deleting databases ------------------ The Firebird engine also supports dropping (deleting) databases dynamically, but dropping is a more complicated operation than creating, for several reasons: an existing database may be in use by users other than the one who requests the deletion, it may have supporting objects such as temporary sort files, and it may even have dependent shadow databases. Although the database engine recognizes a `DROP DATABASE` SQL statement, support for that statement is limited to the `isql` command-line administration utility. However, the engine supports the deletion of databases via an API call, which FDB exposes as :meth:`~Connection.drop_database` method in :class:`Connection` class. So, to drop a database you need to connect to it first. **Examples:** .. code-block:: python import fdb con = fdb.create_database("create database '/temp/db.db' user 'sysdba' password 'pass'") con.drop_database() con = fdb.connect(dsn='/path/database.fdb', user='sysdba', password='pass') con.drop_database() .. index:: pair: Connection; usage Connection object ----------------- :class:`Connection` object represents a direct link to database, and works as gateway for next operations with it: * `Executing SQL Statements`_: methods :meth:`~Connection.execute_immediate` and :meth:`~Connection.cursor`. * Dropping database: method :meth:`~Connection.drop_database`. * `Transanction management`_: methods :meth:`~Connection.begin`, :meth:`~Connection.commit`, :meth:`~Connection.rollback`, :meth:`~Connection.savepoint`, :meth:`~Connection.trans`, :meth:`~Connection.trans_info` and :meth:`~Connection.transaction_info`, and attributes :attr:`~Connection.main_transaction`, :attr:`~Connection.transactions`, :attr:`~Connection.default_tpb` and :attr:`~Connection.group`. * Work with `Database Events`_: method :meth:`~Connection.event_conduit`. * `Getting information about Firebird version`_: attributes :attr:`~Connection.server_version`, :attr:`~Connection.firebird_version`, :attr:`~Connection.version` and :attr:`~Connection.engine_version`. * `Getting information about database`_: methods :meth:`~Connection.db_info` and :meth:`~Connection.database_info`. * :ref:`Getting information about database metadata `: attribute :attr:`~Connection.schema` and :attr:`~Connection.ods`. .. index:: pair: Firebird; information about Getting information about Firebird version ------------------------------------------ Because functionality and some features depends on actual Firebird version, it could be important for FDB users to check it. This (otherwise) simple task could be confusing for new Firebird users, because Firebird uses two different version lineages. This abomination was introduced to Firebird thanks to its InterBase legacy (Firebird 1.0 is a fork of InterBase 6.0), as applications designed to work with InterBase can often work with Firebird without problems (and vice versa). However, legacy applications designed to work with InterBase may stop working properly if they would detect unexpectedly low server version, so default version number returned by Firebird (and FDB) is based on InterBase version number. For example this version for Firebird 2.5.2 is 6.3.2, so condition for legacy applications that require at least IB 6.0 is met. FDB provides these version strings as two `Connection` properties: - :attr:`~Connection.server_version` - Legacy InterBase-friendly version string. - :attr:`~Connection.firebird_version` - Firebird's own version string. However, this version string contains more information than version number. For example for Linux Firebird 2.5.2 it's 'LI-V2.5.2.26540 Firebird 2.5'. So FDB provides two more properties for your convenience: - :attr:`~Connection.version` - Only Firebird version number. It's a string with format: major.minor.subrelease.build - :attr:`~Connection.engine_version` - Engine (major.minor) version as (float) number. FDB also provides convenient constants for supported engine versions: `ODS_FB_20`,`ODS_FB_21` and `ODS_FB_25`. Database On-Disk Structure -------------------------- Particular Firebird features may also depend on specific support in database (for example monitoring tables introduced in Firebird 2.1). These required structures are present automatically when database is created by particular engine verison that needs them, but Firebird engine may typically work with databases created by older versions and thus with older structure, so it could be necessary to consult also On-Disk Structure (ODS for short) version. FDB provides this number as :attr:`Connection.ods` (float) property. **Example**: .. code-block:: python con = fdb.connect(dsn='/path/database.fdb', user='sysdba', password='pass') print 'Firebird version:',con.version print 'ODS version:',con.ods :: Firebird version: 2.5.2.26540 ODS version: 11.1 In abover example although connected Firebird engine is version 2.5, connected database has ODS 11.1 which came with Firebird 2.1, and some Firebird 2.5 features will not be available on this database. .. index:: pair: Database; information about Getting information about database ---------------------------------- Firebird provides various informations about server and connected database via `database_info` API call. FDB surfaces this API through methods :meth:`~Connection.db_info` and :meth:`~Connection.database_info` on Connection object. :meth:`Connection.database_info` is a `very thin` wrapper around function `isc_database_info()`. This method does not attempt to interpret its results except with regard to whether they are a string or an integer. For example, requesting `isc_info_user_names` with the call:: con.database_info(fdb.isc_info_user_names, 's') will return a binary string containing a raw succession of length-name pairs. **Example program:** .. code-block:: python import fdb con = fdb.connect(dsn='localhost:/temp/test.db', user='sysdba', password='pass') # Retrieving an integer info item is quite simple. bytesInUse = con.database_info(fdb.isc_info_current_memory, 'i') print 'The server is currently using %d bytes of memory.' % bytesInUse # Retrieving a string info item is somewhat more involved, because the # information is returned in a raw binary buffer that must be parsed # according to the rules defined in the Interbase® 6 API Guide section # entitled "Requesting buffer items and result buffer values" (page 51). # # Often, the buffer contains a succession of length-string pairs # (one byte telling the length of s, followed by s itself). # Function fdb.ibase.ord2 is provided to convert a raw # byte to a Python integer (see examples below). buf = con.database_info(fdb.isc_info_db_id, 's') # Parse the filename from the buffer. beginningOfFilename = 2 # The second byte in the buffer contains the size of the database filename # in bytes. lengthOfFilename = fdb.ibase.ord2(buf[1]) filename = buf[beginningOfFilename:beginningOfFilename + lengthOfFilename] # Parse the host name from the buffer. beginningOfHostName = (beginningOfFilename + lengthOfFilename) + 1 # The first byte after the end of the database filename contains the size # of the host name in bytes. lengthOfHostName = fdb.ibase.ord2(buf[beginningOfHostName - 1]) host = buf[beginningOfHostName:beginningOfHostName + lengthOfHostName] print 'We are connected to the database at %s on host %s.' % (filename, host) Sample output:: The server is currently using 8931328 bytes of memory. We are connected to the database at C:\TEMP\TEST.DB on host WEASEL. A more convenient way to access the same functionality is via the :meth:`~Connection.db_info` method, which is high-level convenience wrapper around the `database_info()` method that parses the output of database_info into Python-friendly objects instead of returning raw binary buffers in the case of complex result types. For example, requesting `isc_info_user_names` with the call:: con.db_info(fdb.isc_info_user_names) returns a dictionary that maps (username -> number of open connections). If SYSDBA has one open connection to the database to which `con` is connected, and TEST_USER_1 has three open connections to that same database, the return value would be:: {‘SYSDBA’: 1, ‘TEST_USER_1’: 3} **Example program:** .. code-block:: python import fdb import os.path ############################################################################### # Querying an isc_info_* item that has a complex result: ############################################################################### # Establish three connections to the test database as TEST_USER_1, and one # connection as SYSDBA. Then use the Connection.db_info method to query the # number of attachments by each user to the test database. testUserCons = [] for i in range(3): tcon = fdb.connect(dsn='localhost:/temp/test.db', user='TEST_USER_1', password='pass') testUserCons.append(tcon) con = fdb.connect(dsn='localhost:/temp/test.db', user='sysdba', password='pass') print 'Open connections to this database:' print con.db_info(fdb.isc_info_user_names) ############################################################################### # Querying multiple isc_info_* items at once: ############################################################################### # Request multiple db_info items at once, specifically the page size of the # database and the number of pages currently allocated. Compare the size # computed by that method with the size reported by the file system. # The advantages of using db_info instead of the file system to compute # database size are: # - db_info works seamlessly on connections to remote databases that reside # in file systems to which the client program lacks access. # - If the database is split across multiple files, db_info includes all of # them. res = con.db_info([fdb.isc_info_page_size, fdb.isc_info_allocation]) pagesAllocated = res[fdb.isc_info_allocation] pageSize = res[fdb.isc_info_page_size] print '\ndb_info indicates database size is', pageSize * pagesAllocated, 'bytes' print 'os.path.getsize indicates size is ', os.path.getsize(DB_FILENAME), 'bytes' Sample output:: Open connections to this database: {'SYSDBA': 1, 'TEST_USER_1': 3} db_info indicates database size is 20684800 bytes os.path.getsize indicates size is 20684800 bytes .. index:: SQL Statement Executing SQL Statements ======================== FDB implements two ways for execution of SQL commands against connected database: * :meth:`~Connection.execute_immediate` - for execution of SQL commands that don't return any result. * :class:`Cursor` objects that offer rich interface for execution of SQL commands and fetching their results. .. index:: pair: Cursor; usage Cursor object ------------- Because `Cursor` objects always operate in context of single :class:`Connection` (and :class:`Transaction`), `Cursor` instances are not created directly, but by constructor method. Python DB API 2.0 assume that if database engine supports transactions, it supports only one transaction per connection, hence it defines constructor method :meth:`~Connection.cursor` (and other transaction-related methods) as part of :class:`Connection` interface. However, Firebird supports multiple independent transactions per connection. To conform to Python DB API, FDB uses concept of internal :attr:`~Connection.main_transaction` and secondary :attr:`~Connection.transactions`. Cursor constructor is primarily defined by :class:`Transaction`, and Cursor constructor on `Connection` is therefore a shortcut for `main_transaction.cursor()`. `Cursor` objects are used for next operations: * Execution of SQL Statemets: methods :meth:`~Cursor.execute`, :meth:`~Cursor.executemany` and :meth:`~Cursor.callproc`. * Creating :class:`PreparedStatement` objects for efficient repeated execution of SQL statements, and to obtain additional information about SQL statements (like execution :attr:`~PreparedStatement.plan`): method :meth:`~Cursor.prep`. * `Fetching results `_: methods :meth:`~Cursor.fetchone`, :meth:`~Cursor.fetchmany`, :meth:`~Cursor.fetchall`, :meth:`~Cursor.fetchonemap`, :meth:`~Cursor.fetchmanymap`, :meth:`~Cursor.fetchallmap`, :meth:`~Cursor.iter`, :meth:`~Cursor.itermap` and :meth:`~Cursor.next`. .. index:: pair: SQL Statement; execution SQL Execution Basics -------------------- There are three methods how to execute SQL commands: * :meth:`Connection.execute_immediate` or :meth:`Transaction.execute_immediate` for SQL commands that don't return any result, and are not executed frequently. This method also **doesn't** support either `parametrized statements`_ or `prepared statements`_. .. tip:: This method is efficient for `administrative` and `DDL`_ SQL commands, like `DROP`, `CREATE` or `ALTER` commands, `SET STATISTICS` etc. * :meth:`Cursor.execute` or :meth:`Cursor.executemany` for commands that return result sets, i.e. sequence of `rows` of the same structure, and sequence has unknown number of `rows` (including zero). .. tip:: This method is preferred for all `SELECT` and other `DML`_ statements, or any statement that is executed frequently, either `as is` or in `parametrized` form. * :meth:`Cursor.callproc` for execution of `Stored procedures` that always return exactly one set of values. .. note:: This method of SP invocation is equivalent to `"EXECUTE PROCEDURE ..."` SQL statement. .. index:: pair: SQL Statement; parametrized .. _parametrized-statements: Parametrized statements ----------------------- When SQL command you want to execute contains data `values`, you can either: * Embed them `directly` or via `string formatting` into command `string`, e.g.: .. code-block:: python cur.execute("insert into the_table (a,b,c) values ('aardvark', 1, 0.1)") # or cur.execute("select * from the_table where col == 'aardvark'") # or cur.execute("insert into the_table (a,b,c) values ('%s', %i, %f)" % ('aardvark',1,0.1)) # or cur.execute("select * from the_table where col == '%s'" % 'aardvark') * Use parameter marker (`?`) in command `string` in the slots where values are expected, then supply those values as Python list or tuple: .. code-block:: python cur.execute("insert into the_table (a,b,c) values (?,?,?)", ('aardvark', 1, 0.1)) # or cur.execute("select * from the_table where col == ?",('aardvark',)) While both methods have the same results, the second one (called `parametrized`) has several important advantages: * You don't need to handle conversions from Python data types to strings. * FDB will handle all data type conversions (if necessary) from Python data types to Firebird ones, including `None/NULL` conversion and conversion from `unicode` to `byte strings` in encoding expected by server. * You may pass BLOB values as open `file-like` objects, and FDB will handle the transfer of BLOB value. * If you'll pass exactly the same command `string` again to particular :class:`Cursor` instance, it will be executed more efficiently (see section about `Prepared Statements`_ for details). Parametrized statemets also have some limitations. Currently: * `DATE`, `TIME` and `DATETIME` values must be relevant :mod:`datetime` objects. * `NUMERIC` and `DECIMAL` values must be :mod:`decimal` objects. .. index:: pair: Cursor; fetching data Fetching data from server ------------------------- Result of SQL statement execution consists from sequence of zero to unknown number of `rows`, where each `row` is a set of exactly the same number of values. :class:`Cursor` object offer number of different methods for fetching these `rows`, that should satisfy all your specific needs: * :meth:`~Cursor.fetchone` - Returns the next row of a query result set, or `None` when no more data is available. .. tip:: Cursor supports the :ref:`iterator protocol `, yielding tuples of values like :meth:`~Cursor.fetchone`. * :meth:`~Cursor.fetchmany` - Returns the next set of rows of a query result, returning a sequence of sequences (e.g. a list of tuples). An empty sequence is returned when no more rows are available. The number of rows to fetch per call is specified by the parameter. If it is not given, the cursor’s :attr:`~Cursor.arraysize` determines the number of rows to be fetched. The method does try to fetch as many rows as indicated by the size parameter. If this is not possible due to the specified number of rows not being available, fewer rows may be returned. .. note:: The default value of :attr:`~Cursor.arraysize` is `1`, so without paremeter it's equivalent to :meth:`~Cursor.fetchone`, but returns list of `rows`, instead actual `row` directly. * :meth:`~Cursor.fetchall` - Returns all (remaining) rows of a query result as list of tuples, where each tuple is one row of returned values. .. tip:: This method can potentially return huge amount of data, that may exhaust available memory. If you need just `iteration` over potentially big result set, use loops with :meth:`~Cursor.fetchone`, Cursor's built-in support for :ref:`iterator protocol ` or call to :meth:`~Cursor.iter` instead this method. * :meth:`~Cursor.fetchonemap` - Returns the next row like :meth:`~Cursor.fetchone`, but returns a mapping of `field name` to `field value`, rather than a tuple. * :meth:`~Cursor.fetchmanymap` - Returns the next set of rows of a query result like :meth:`~Cursor.fetchmany`, but returns a list of mapping of `field name` to `field value`, rather than a tuple. * :meth:`~Cursor.fetchallmap` - Returns all (remaining) rows of a query result like :meth:`~Cursor.fetchall`, returns a list of mappings of `field name` to `field value`, rather than a tuple. .. tip:: This method can potentially return huge amount of data, that may exhaust available memory. If you need just `iteration` over potentially big result set with mapping support, use :meth:`~Cursor.itermap` instead this method. * :meth:`~Cursor.iter` - Equivalent to the :meth:`~Cursor.fetchall`, except that it returns :ref:`iterator ` rather than materialized list. * :meth:`~Cursor.itermap` - Equivalent to the :meth:`~Cursor.fetchallmap`, except that it returns :ref:`iterator ` rather than materialized list. * Call to :meth:`~Cursor.execute` returns self (Cursor instance) that itself supports the :ref:`iterator protocol `, yielding tuples of values like :meth:`~Cursor.fetchone`. .. important:: FDB makes absolutely no guarantees about the return value of the `fetchone` / `fetchmany` / `fetchall` methods except that it is a sequence indexed by field position. FDB makes absolutely no guarantees about the return value of the `fetchonemap` / `fetchmanymap` / `fetchallmap` methods except that it is a mapping of field name to field value. Therefore, client programmers should not rely on the return value being an instance of a particular class or type. **Examples:** .. code-block:: python import fdb con = fdb.connect(dsn='/temp/test.db', user='sysdba', password='masterkey') cur = con.cursor() SELECT = "select name, year_released from languages order by year_released" # 1. Using built-in support for iteration protocol to iterate over the rows available from the cursor, # unpacking the resulting sequences to yield their elements (name, year_released): cur.execute(SELECT) for (name, year_released) in cur: print '%s has been publicly available since %d.' % (name, year_released) # or alternatively you can take an advantage of cur.execute returning self. for (name, year_released) in cur.execute(SELECT): print '%s has been publicly available since %d.' % (name, year_released) # 2. Equivalently using fetchall(): # This is potentially dangerous if result set is huge, as the whole result set is first materialized # as list and then used for iteration. cur.execute(SELECT) for row in cur.fetchall(): print '%s has been publicly available since %d.' % (row[0], row[1]) # 3. Using mapping-iteration rather than sequence-iteration: cur.execute(SELECT) for row in cur.itermap(): print '%(name)s has been publicly available since %(year_released)d.' % row .. tip:: :meth:`Cursor.execute` and :meth:`Cursor.executemany` return self, so you can use calls to them as iterators (see example above). .. index:: pair: SQL Statement; prepared .. _prepared-statements: Prepared Statements ------------------- Execution of any SQL statement has three phases: * *Preparation*: command is analyzed, validated, execution plan is determined by optimizer and all necessary data structures (for example for input and output parameters) are initialized. * *Execution*: input parameters (if any) are passed to server and previously prepared statement is actually executed by database engine. * *Fetching*: result of execution and data (if any) are transfered from server to client, and allocated resources are then released. The preparation phase consumes some amount of server resources (memory and CPU). Although preparation and release of resources typically takes only small amount of CPU time, it builds up as number of executed statements grows. Firebird (like most database engines) allows to spare this time for subsequent execution if particular statement should be executed repeatedly - by reusing once prepared statement for repeated execution. This may save significant amount of server processing time, and result in better overall performance. FDB builds on this by encapsulating all statement-related code into separate :class:`PreparedStatement` class, and implementing :class:`Cursor` class as a wrapper around it. .. warning:: FDB's implementation of Cursor somewhat violates the Python DB API 2.0, which requires that cursor will be unusable after call to `close`; and an Error (or subclass) exception should be raised if any operation is attempted with the cursor. If you'll take advantage of this `anomaly`, your code would be less portable to other Python DB API 2.0 compliant drivers. Beside SQL command string, `Cursor` also allows to aquire and use `PreparedStatement` instances explicitly. `PreparedStatement` are aquired by calling :meth:`~Cursor.prep` method could be then passed to :meth:`~Cursor.execute` or :meth:`~Cursor.executemany` instead `command string`. **Example:** .. code-block:: python insertStatement = cur.prep("insert into the_table (a,b,c) values (?,?,?)") inputRows = [ ('aardvark', 1, 0.1), ('zymurgy', 2147483647, 99999.999), ('foobar', 2000, 9.9) ] for row in inputRows: cur.execute(insertStatement,row) # # or you can use executemany # cur.executemany(insertStatement, inputRows) Prepared statements are bound to `Cursor` instance that created them, and can't be used with any other `Cursor` instance. Beside repeated execution they are also useful to get information about statement (like its output :attr:`~PreparedStatement.description`, execution :attr:`~PreparedStatement.plan` or :attr:`~PreparedStatement.statement_type`) before its execution. **Example Program:** The following program demonstrates the explicit use of `PreparedStatements`. It also benchmarks explicit `PreparedStatement` reuse against normal execution that prepares statements on each execution. .. code-block:: python import time import fdb con = fdb.connect(dsn='localhost:employee', user='sysdba', password='masterkey' ) cur = con.cursor() # Create supporting database entities: cur.execute("recreate table t (a int, b varchar(50))") con.commit() cur.execute("create unique index unique_t_a on t(a)") con.commit() # Explicitly prepare the insert statement: psIns = cur.prep("insert into t (a,b) values (?,?)") print 'psIns.sql: "%s"' % psIns.sql print 'psIns.statement_type == fdb.isc_info_sql_stmt_insert:', ( psIns.statement_type == fdb.isc_info_sql_stmt_insert ) print 'psIns.n_input_params: %d' % psIns.n_input_params print 'psIns.n_output_params: %d' % psIns.n_output_params print 'psIns.plan: %s' % psIns.plan print N = 50000 iStart = 0 # The client programmer uses a PreparedStatement explicitly: startTime = time.time() for i in xrange(iStart, iStart + N): cur.execute(psIns, (i, str(i))) print ( 'With explicit prepared statement, performed' '\n %0.2f insertions per second.' % (N / (time.time() - startTime)) ) con.commit() iStart += N # A new SQL string containing the inputs is submitted every time. Also, in a # more complicated scenario where the end user supplied the string input # values, the program would risk SQL injection attacks: startTime = time.time() for i in xrange(iStart, iStart + N): cur.execute("insert into t (a,b) values (%d,'%s')" % (i, str(i))) print ( 'When unable to reuse prepared statement, performed' '\n %0.2f insertions per second.' % (N / (time.time() - startTime)) ) con.commit() # Prepare a SELECT statement and examine its properties. The optimizer's plan # should use the unique index that we created at the beginning of this program. print psSel = cur.prep("select * from t where a = ?") print 'psSel.sql: "%s"' % psSel.sql print 'psSel.statement_type == fdb.isc_info_sql_stmt_select:', ( psSel.statement_type == fdb.isc_info_sql_stmt_select ) print 'psSel.n_input_params: %d' % psSel.n_input_params print 'psSel.n_output_params: %d' % psSel.n_output_params print 'psSel.plan: %s' % psSel.plan # The current implementation does not allow PreparedStatements to be prepared # on one Cursor and executed on another: print print 'Note that PreparedStatements are not transferrable from one cursor to another:' cur2 = con.cursor() cur2.execute(psSel) Sample output:: psIns.sql: "insert into t (a,b) values (?,?)" psIns.statement_type == fdb.isc_info_sql_stmt_insert: True psIns.n_input_params: 2 psIns.n_output_params: 0 psIns.plan: None With explicit prepared statement, performed 4276.00 insertions per second. When unable to reuse prepared statement, performed 2037.70 insertions per second. psSel.sql: "select * from t where a = ?" psSel.statement_type == fdb.isc_info_sql_stmt_select: True psSel.n_input_params: 1 psSel.n_output_params: 2 psSel.plan: PLAN (T INDEX (UNIQUE_T_A)) Note that PreparedStatements are not transferrable from one cursor to another: Traceback (most recent call last): File "pstest.py", line 85, in cur2.execute(psSel) File "/home/job/python/envs/pyfirebird/fdb/fdb/fbcore.py", line 2623, in execute raise ValueError("PreparedStatement was created by different Cursor.") ValueError: PreparedStatement was created by different Cursor. As you can see, the version that prevents the reuse of prepared statements is about two times slower – *for a trivial statement*. In a real application, SQL statements are likely to be far more complicated, so the speed advantage of using prepared statements would only increase. .. index:: pair: Cursor; named Named Cursors ------------- To allow the Python programmer to perform scrolling `UPDATE` or `DELETE` via the `“SELECT ... FOR UPDATE”` syntax, FDB provides the read/write property :attr:`Cursor.name`. **Example Program:** .. code-block:: python import fdb con = fdb.connect(dsn='localhost:/temp/test.db', user='sysdba', password='pass') curScroll = con.cursor() curUpdate = con.cursor() curScroll.execute("select city from addresses for update") curScroll.name = 'city_scroller' update = "update addresses set city=? where current of " + curScroll.name for (city,) in curScroll: city = ... # make some changes to city curUpdate.execute( update, (city,) ) con.commit() .. index:: pair: Stored procedure; execution Working with stored procedures ------------------------------ Firebird stored procedures can have `input` parameters and/or `output` parameters. Some databases support `input/output` parameters, where the same parameter is used for both input and output; Firebird does not support this. It is important to distinguish between procedures that `return a result set` and procedures that `populate and return their output parameters` exactly once. Conceptually, the latter “return their output parameters” like a Python function, whereas the former “yield result rows” like a Python generator. Firebird’s `server-side` procedural SQL syntax makes no such distinction, but client-side SQL code (and C API code) must. A result set is retrieved from a stored procedure by `SELECT'ing from the procedure, whereas output parameters are retrieved with an 'EXECUTE PROCEDURE' statement`. To **retrieve a result set** from a stored procedure with FDB, use code such as this: .. code-block:: python cur.execute("select output1, output2 from the_proc(?, ?)", (input1, input2)) # Ordinary fetch code here, such as: for row in cur: ... # process row con.commit() # If the procedure had any side effects, commit them. To **execute** a stored procedure and **access its output parameters**, use code such as this: .. code-block:: python cur.callproc("the_proc", (input1, input2)) # If there are output parameters, retrieve them as though they were the # first row of a result set. For example: outputParams = cur.fetchone() con.commit() # If the procedure had any side effects, commit them. This latter is not very elegant; it would be preferable to access the procedure’s output parameters as the return value of :meth:`Cursor.callproc`. The Python DB API specification requires the current behavior, however. .. index:: pair: Data; conversion Data handling and conversions ============================= .. index:: pair: parameter; conversion Implicit Conversion of Input Parameters from Strings ---------------------------------------------------- The database engine treats most SQL data types in a weakly typed fashion: the engine may attempt to convert the raw value to a different type, as appropriate for the current context. For instance, the SQL expressions `123` (integer) and `‘123’` (string) are treated equivalently when the value is to be inserted into an `integer` field; the same applies when `‘123’` and `123` are to be inserted into a `varchar` field. This weak typing model is quite unlike Python’s dynamic yet strong typing. Although weak typing is regarded with suspicion by most experienced Python programmers, the database engine is in certain situations so aggressive about its typing model that KInterbasDB must compromise in order to remain an elegant means of programming the database engine. An example is the handling of “magic values” for date and time fields. The database engine interprets certain string values such as `‘yesterday’` and `‘now’` as having special meaning in a date/time context. If FDB did not accept strings as the values of parameters destined for storage in date/time fields, the resulting code would be awkward. Consider the difference between the two Python snippets below, which insert a row containing an integer and a timestamp into a table defined with the following DDL statement: .. code-block:: sql create table test_table (i integer, t timestamp) .. code-block:: python i = 1 t = 'now' sqlWithMagicValues = "insert into test_table (i, t) values (?, '%s')" % t cur.execute( sqlWithMagicValues, (i,) ) .. code-block:: python i = 1 t = 'now' cur.execute( "insert into test_table (i, t) values (?, ?)", (i, t) ) If FDB did not support weak parameter typing, string parameters that the database engine is to interpret as “magic values” would have to be rolled into the SQL statement in a separate operation from the binding of the rest of the parameters, as in the first Python snippet above. Implicit conversion of parameter values from strings allows the consistency evident in the second snippet, which is both more readable and more general. It should be noted that FDB does not perform the conversion from string itself. Instead, it passes that responsibility to the database engine by changing the parameter metadata structure dynamically at the last moment, then restoring the original state of the metadata structure after the database engine has performed the conversion. A secondary benefit is that when one uses FDB to import large amounts of data from flat files into the database, the incoming values need not necessarily be converted to their proper Python types before being passed to the database engine. Eliminating this intermediate step may accelerate the import process considerably, although other factors such as the chosen connection protocol and the deactivation of indexes during the import are more consequential. For bulk import tasks, the database engine’s external tables also deserve consideration. External tables can be used to suck semi-structured data from flat files directly into the relational database without the intervention of an ad hoc conversion program. .. index:: pair: unicode; conversion Automatic conversion from/to unicode ------------------------------------ In Firebird, every `CHAR`, `VARCHAR` or textual `BLOB` field can (or, better: must) have a `character set` assigned. While it's possible to define single character set for whole database, it's also possible to define different character set for each textual field. This information is used to correctly store the bytes that make up the character string, and together with collation information (that defines the sort ordering and uppercase conversions for a string) is vital for correct data manupulation, including automatic transliteration between character sets when necessary. .. important:: Because data also flow between server and client application, it's vital that client will send data encoded only in character set(s) that server expects. While it's possible to leave this responsibility completely on client application, it's better when client and server settle on single character set they would use for communication, especially when database operates with multiple character sets, or uses character set that is not `native` for client application. Character set for communication is specified using `charset` parameter in :func:`connection ` call. When `connection charset` is defined, all textual data returned from server are encoded in this charset, and client application must ensure that all textual data sent to server are encoded only in this charset as well. FDB helps with client side of this character set bargain by automatically converting `unicode` strings into `bytes/strings` encoded in connection character set, and vice versa. However, developers are still responsible that `non-unicode` strings passed to server are in correct encoding (because FDB makes no assuption about encoding of non-unicode strings, so it can't recode them to connection charset). .. important:: In case that `connection charset` is NOT defined at all, or `NONE` charset is specified, FDB uses :func:`locale.getpreferredencoding` to determine encoding for conversions from/to `unicode`. .. important:: There is one exception to automatic conversion: when character set OCTETS is defined for data column. Values assigned to OCTETS columns are always passed `as is`, because they're basically binary streams. This has specific implications regarding Python version you use. Python 2.x `native strings` are `bytes`, suitable for such binary streams, but Python 3 native strings are `unicode`, and you would probably want to use `bytes` type instead. However, FDB in this case doesn't check the value type at all, so you'll not be warned if you'll make a mistake and pass `unicode` to OCTETS column (unless you'll pass more bytes than column may hold, or you intend to store unicode that way). Rules for automatic conversion depend on Python version you use: * Native Python 2.x `strings` are passed to server as is, and developers must explicitly use `unicode` strings to take advantage of automatic conversion. String values coming from server are converted to `unicode` **only**: * for data stored in database (i.e. not for string values returned by Firebird Service and `info` calls etc.). * when `connection charset` is specified. * Native Python 3 strings are `unicode`, so conversion is fully automatic in both directions for all textual data, i.e. including for string values returned by Firebird Service and `info` calls etc. When `connection charset` is not specified, FDB uses :func:`locale.getpreferredencoding` to determine encoding for conversions from/to `unicode`. .. tip:: Except for legacy databases that doesn't have `character set` defined, **always** define character set for your databases and specify `connection charset`. It will make your life much easier. .. index:: BLOB pair: Data; BLOB .. _working_with_blobs: Working with BLOBs ------------------ FDB uses two types of BLOB values: * **Materialized** BLOB values are Python strings. This is the **default** type. * **Streamed** BLOB values are `file-like` objects. Materialized BLOBs are easy to work with, but are not suitable for: * **deferred loading** of BLOBs. They're called `materialized` because they're always fetched from server as part of row fetch. Fetching BLOB value means separate API calls (and network roundtrips), which may slow down you application considerably. * **large values**, as they are always stored in memory in full size. These drawbacks are addressed by `stream` BLOBs. Using BLOBs in `stream` mode is easy: * For **input** values, simply use :ref:`parametrized statement ` and pass any `file-like` object in place of BLOB parameter. The `file-like` object must implement only the :meth:`~file.read` method, as no other metod is used. * For **output** values, you have to call :meth:`Cursor.set_stream_blob` (or :meth:`PreparedStatement.set_stream_blob`) method with specification of column name(s) that should be returned as `file-like` objects. FDB then returns :class:`BlobReader` instance instead string in place of returned BLOB value for these column(s). The :class:`BlobReader` instance is bound to particular BLOB value returned by server, so its life time is limited. The actual BLOB value is not opened initially, so no additonal API calls to server are made if you'll decide to ignore the value completely. You also don't need to open the BLOB value explicitly, as BLOB is opened automatically on first call to :meth:`~BlobReader.next`, :meth:`~BlobReader.read`, :meth:`~BlobReader.readline`, :meth:`~BlobReader.readlines` or :meth:`~BlobReader.seek`. However, it's good practice to :meth:`~BlobReader.close` the reader once you're finished reading, as it's likely that Python's garbage collector would call the `__del__` method too late, when fetch context is already gone, and closing the reader would cause an error. .. warning:: If BLOB was NOT CREATED as `stream` BLOB, calling :meth:`BlobReader.seek` method will raise :exc:`DatabaseError` exception. **This constraint is set by Firebird.** .. important:: When working with BLOB values, always have memory efficiency in mind, especially when you're processing huge quantity of rows with BLOB values at once. Materialized BLOB values may exhaust your memory quickly, but using stream BLOBs may have inpact on performance too, as new `BlobReader` instance is created for each value fetched. **Example program:** .. code-block:: python import os.path from cStringIO import StringIO import fdb con = fdb.connect(dsn='localhost:employee',user='sysdba', password='masterkey') cur = con.cursor() cur.execute("recreate table blob_test (a blob)") con.commit() # --- Materialized mode (str objects for both input and output) --- # Insertion: cur.execute("insert into blob_test values (?)", ('abcdef',)) cur.execute("insert into blob_test values (?)", ('ghijklmnop',)) # Retrieval: cur.execute("select * from blob_test") print 'Materialized retrieval (as str):' print cur.fetchall() cur.execute("delete from blob_test") # --- Streaming mode (file-like objects for input; fdb.BlobReader objects for output) --- # Insertion: cur.execute("insert into blob_test values (?)", (StringIO('abcdef'),)) cur.execute("insert into blob_test values (?)", (StringIO('ghijklmnop'),)) f = file(os.path.abspath(__file__), 'rb') cur.execute("insert into blob_test values (?)", (f,)) f.close() # Retrieval using the "file-like" methods of BlobReader: cur.execute("select * from blob_test") cur.set_stream_blob('A') # Note the capital letter readerA = cur.fetchone()[0] print '\nStreaming retrieval (via fdb.BlobReader):' # Python "file-like" interface: print 'readerA.mode: "%s"' % readerA.mode print 'readerA.closed: %s' % readerA.closed print 'readerA.tell(): %d' % readerA.tell() print 'readerA.read(2): "%s"' % readerA.read(2) print 'readerA.tell(): %d' % readerA.tell() print 'readerA.read(): "%s"' % readerA.read() print 'readerA.tell(): %d' % readerA.tell() print 'readerA.read(): "%s"' % readerA.read() readerA.close() print 'readerA.closed: %s' % readerA.closed Output:: Materialized retrieval (as str): [('abcdef',), ('ghijklmnop',)] Streaming retrieval (via fdb.BlobReader): readerA.mode: "rb" readerA.closed: False readerA.tell(): 0 readerA.read(2): "ab" readerA.tell(): 2 readerA.read(): "cdef" readerA.tell(): 6 readerA.read(): "" readerA.closed: True .. index:: ARRAY pair: Data; ARRAY Firebird ARRAY type ------------------- FDB supports Firebird ARRAY data type. ARRAY values are represented as Python lists. On input, the Python sequence (list or tuple) must be nested appropriately if the array field is multi-dimensional, and the incoming sequence must not fall short of its maximum possible length (it will not be “padded” implicitly–see below). On output, the lists will be nested if the database array has multiple dimensions. .. note:: Database arrays have no place in a purely relational data model, which requires that data values be atomized (that is, every value stored in the database must be reduced to elementary, non-decomposable parts). The Firebird implementation of database arrays, like that of most relational database engines that support this data type, is fraught with limitations. Database arrays are of fixed size, with a predeclared number of dimensions (max. 16) and number of elements per dimension. Individual array elements cannot be set to NULL / None, so the mapping between Python lists (which have dynamic length and are therefore not normally “padded” with dummy values) and non-trivial database arrays is clumsy. Stored procedures cannot have array parameters. Finally, many interface libraries, GUIs, and even the isql command line utility do not support database arrays. In general, it is preferable to avoid using database arrays unless you have a compelling reason. **Example:** .. code-block:: python >>> import fdb >>> con = fdb.connect(dsn='localhost:employee',user='sysdba', password='masterkey') >>> cur = con.cursor() >>> cur.execute("select LANGUAGE_REQ from job where job_code='Eng' and job_grade=3 and job_country='Japan'") >>> cur.fetchone() (['Japanese\n', 'Mandarin\n', 'English\n', '\n', '\n'],) **Example program:** .. code-block:: python import fdb con = fdb.connect(dsn='localhost:/temp/test.db', user='sysdba', password='pass') con.execute_immediate("recreate table array_table (a int[3,4])") con.commit() cur = con.cursor() arrayIn = [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] print 'arrayIn: %s' % arrayIn cur.execute("insert into array_table values (?)", (arrayIn,)) cur.execute("select a from array_table") arrayOut = cur.fetchone()[0] print 'arrayOut: %s' % arrayOut con.commit() Output:: arrayIn: [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] arrayOut: [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] .. index:: pair: Transaction; management Transanction management ======================= For the sake of simplicity, FDB lets the Python programmer ignore transaction management to the greatest extent allowed by the Python Database API Specification 2.0. The specification says, “if the database supports an auto-commit feature, this must be initially off”. At a minimum, therefore, it is necessary to call the commit method of the connection in order to persist any changes made to the database. Remember that because of ACID, every data manipulation operation in the Firebird database engine takes place in the context of a transaction, including operations that are conceptually “read-only”, such as a typical SELECT. The client programmer of FDB establishes a transaction implicitly by using any SQL execution method, such as :meth:`~Connection.execute_immediate`, :meth:`Cursor.execute()`, or :meth:`Cursor.callproc`. Although FDB allows the programmer to pay little attention to transactions, it also exposes the full complement of the database engine’s advanced transaction control features: `transaction parameters`_, `retaining transactions`_, `savepoints`_, and `distributed transactions`_. Basics ------ When it comes to transactions, Python Database API 2.0 specify that :class:`Connection` object has to respond to the following methods: :meth:`Connection.commit()` Commit any pending transaction to the database. Note that if the database supports an auto-commit feature, this must be initially off. An interface method may be provided to turn it back on. Database modules that do not support transactions should implement this method with void functionality. :meth:`Connection.rollback()` (optional) In case a database does provide transactions this method causes the the database to roll back to the start of any pending transaction. **Closing a connection without committing the changes first will cause an implicit rollback to be performed.** In addition to the implicit transaction initiation required by Python Database API, FDB allows the programmer to start transactions explicitly via the :meth:`Connection.begin` method. Also :meth:`Connection.savepoint` method was added to provide support for `Firebird SAVEPOINTs`_. But Python Database API 2.0 was created with assumption that connection can support only one transactions per single connection. However, Firebird can support multiple independent transactions that can run simultaneously within single connection / attachment to the database. This feature is very important, as applications may require multiple transaction openned simultaneously to perform various tasks, which would require to open multiple connections and thus consume more resources than necessary. FDB surfaces this Firebird feature by separating transaction management out from :class:`Connection` into separate :class:`Transaction` objects. To comply with Python DB API 2.0 requirements, `Connection` object uses one `Transaction` instance as :attr:`main transaction `, and delegates :meth:`~Connection.begin`, :meth:`~Connection.savepoint`, :meth:`~Connection.commit`, :meth:`~Connection.rollback`, :meth:`~Connection.trans_info` and :meth:`~Connection.transaction_info` calls to it. .. seealso:: More about using multiple transactions with the same connection in separate :ref:`section `. **Example:** .. code-block:: python import fdb con = fdb.connect(dsn='localhost:employee',user='sysdba', password='masterkey') cur = con.cursor() # Most minimalistic transaction management -> implicit start, only commit() and rollback() # ======================================================================================== # # Transaction is started implicitly cur.execute('insert into country values ('Oz','Crowns') con.commit() # commits active transaction # Again, transaction is started implicitly cur.execute('insert into country values ('Barsoom','XXX') con.rollback() # rolls back active transaction cur.execute('insert into country values ('Pellucidar','Shells') # This will roll back the transaction # because Python DB API 2.0 requires that closing connection # with pending transaction must cause an implicit rollback con.close() .. index:: pair: Transaction; auto-commit Auto-commit ----------- FDB doesn't support `auto-commit` feature directly, but developers may achieve the similar result using `explicit` transaction start, taking advantage of :attr:`~Transaction.default_action` and its default value (`commit`). **Example:** .. code-block:: python import fdb con = fdb.connect(dsn='localhost:employee',user='sysdba', password='masterkey') cur = con.cursor() con.begin() cur.execute('insert into country values ('Oz','Crowns') con.begin() # commits active transaction and starts new one cur.execute('insert into country values ('Barsoom','XXX') con.begin() # commits active transaction and starts new one cur.execute('insert into country values ('Pellucidar','Shells') # However, commit is required before connection is closed, # because Python DB API 2.0 requires that closing connection # with pending transaction must cause an implicit rollback con.commit() con.close() .. index:: pair: Transaction; parameters Transaction parameters ---------------------- The database engine offers the client programmer an optional facility called `transaction parameter buffers` (TPBs) for tweaking the operating characteristics of the transactions he initiates. These include characteristics such as whether the transaction has read and write access to tables, or read-only access, and whether or not other simultaneously active transactions can share table access with the transaction. Connections have a :attr:`~Connection.default_tpb` attribute that can be changed to set the default TPB for all transactions subsequently started on the connection. Alternatively, if the programmer only wants to set the TPB for a single transaction, he can start a transaction explicitly via the :meth:`~Connection.begin()` method and pass a TPB for that single transaction. For details about TPB construction, see the `Firebird API documentation`_. In particular, the `ibase.h` supplied with Firebird contains all possible TPB elements – single bytes that the C API defines as constants whose names begin with `isc_tpb_`. FDB makes all of those TPB constants available (under the same names) as module-level constants. A transaction parameter buffer is handled in C as a character array; FDB requires that TPBs be constructed as Python `strings` (or `bytes` for Python 3). Since the constants in the `fdb.isc_tpb_*` family are numbers, they can't be simply concatenated to create a TPB, but you may use utility function **fdb.bs(byte_array)** that accepts sequence of numbers and returns `string` (P2) or `bytes` (P3). For example next call returns TPB for typical `READ COMMITED` transaction: .. code-block:: python from fdb import * TPB = bs([isc_tpb_version3, isc_tpb_write, isc_tpb_wait, isc_tpb_read_committed, isc_tpb_rec_version]) .. warning:: This method requires good knowledge of `tpc_block` structure and proper order of various parameters, as Firebird engine will raise an error when badly structured block would be used. Also definition of `table reservation` parameters is uncomfortable as you’ll need to mix binary codes with table names passed as Pascal strings (characters preceded by string length). FDB provides several predefined TPB's for convenience: * **ISOLATION_LEVEL_READ_COMMITED** Read/Write READ COMMITED with `record version` and WAIT option. Isolation level with greatest concurrent throughput. This is **Default** TPB. .. tip:: This isolation level is optimal for transactions that write data and doesn't require stable snapshot of database for their operations (i.e. most operations are limited to individual rows). * **ISOLATION_LEVEL_READ_COMMITED_LEGACY** Read/Write READ COMMITED with `NO record version` and WAIT option. .. warning:: This isolation level emulates RDBMS that use locks instead multiversion control (MVC). It's not recommended to use it at all, except for legacy applications lazily ported from such RDBMS to Firebird. * **ISOLATION_LEVEL_READ_COMMITED_RO** Like `ISOLATION_LEVEL_READ_COMMITED`, but **Read Only**. .. tip:: Firebird threats these transactions as `pre-committed`, so they are best option **for long running transactions that only read data**. Internaly FDB uses such transaction to read metadata from connected database. This internal transaction is also available to developers for convenience as :attr:`Connection.query_transaction`. * **ISOLATION_LEVEL_REPEATABLE_READ** or **ISOLATION_LEVEL_SNAPSHOT** Read/Write SNAPSHOT (concurrency) with WAIT option. .. tip:: This isolation level is necessary for transactions that process data in bulk, like reporting, recalculations etc. * **ISOLATION_LEVEL_SERIALIZABLE** or **ISOLATION_LEVEL_SNAPSHOT_TABLE_STABILITY** Read/Write SNAPSHOT TABLE STABILITY (consistency) with WAIT option. Like REPEATABLE_READ/SNAPSHOT, but locks whole tables for writes from other transactions. Isolation level with lowest concurrent throughput. .. warning:: Because tables are locked for `protected write` (i.e. no other transaction can write until lock is released) **at time of first access**, there is a great risk of `deadlock` between transactions. .. tip:: To prevent deadlocks and increase concurrent throughput it's recommended to use custom TPB's with `fine-grained table access reservation`. **Example:** .. code-block:: python import fdb con = fdb.connect(dsn='localhost:employee',user='sysdba', password='masterkey') cur = con.cursor() # Start transaction with default_tpb (ISOLATION_LEVEL_READ_COMMITED) con.begin() cur.execute('select * from JOB') com.commit() # Start using transactions in REPEATABLE READ (SNAPSHOT) isolation con.default_tpb = fdb.ISOLATION_LEVEL_REPEATABLE_READ con.begin() cur.execute('select * from JOB') com.commit() # Start THIS transaction as R/O READ COMMITTED con.begin(fdb.ISOLATION_LEVEL_READ_COMMITED_RO) cur.execute('select * from JOB') com.commit() For cases when predefined transaction parameter blocks are not suitable for your needs, FDB offers utility class :class:`TPB` for convenient and safe construction of custom `tpb blocks`. Simply create instance of this class, set member attributes to required values and use either :meth:`rendered ` binary tpb block or `TPB` instance itself to set `default_tpb` or as paraneter to `begin()`. **Example:** .. code-block:: python import fdb con = fdb.connect(dsn='localhost:employee',user='sysdba', password='masterkey') # Use TPB to construct valid transaction parameter block # from the fdb.isc_tpb_* family. customTPB = fdb.TPB() customTPB.isolation_level = fdb.isc_tpb_consistency # SERIALIZABLE customTPB.table_reservation["MY_TABLE"] = (fdb.isc_tpb_protected, fdb.isc_tpb_lock_write) # Explicitly start a transaction with the custom TPB: con.begin(tpb=customTPB) # For frequent use, it's better to use already assembled version of TPB customTPB = fdb.TPB() customTPB.access_mode = fdb.isc_tpb_read # read only customTPB.isolation_level = fdb.isc_tpb_concurrency # SNAPSHOT customTPB = customTPB.render() # Create valid block according to current values of member attributes. for x in range(1000): con.begin(tpb=customTPB) If you want to build only `table reservation` part of `tpb` (for example to add to various custom built parameter blocks), you can use class :class:`TableReservation` instead `TPB`. .. index:: pair: Transaction; information about Getting information about transaction ------------------------------------- :class:`Transaction` object exposes two methods that return information about currently managed active transaction (the same methods are exposed also by :class:`Connection` object for :attr:`~Connection.main_transaction`): :meth:`~Transaction.transaction_info` is a very thin wrapper around function `isc_transaction_info()`. This method does not attempt to interpret its results except with regard to whether they are a string or an integer. A more convenient way to access the same functionality is via the :meth:`~Transaction.trans_info` method, which is high-level convenience wrapper around the `transaction_info` method that parses the output of `transaction_info` into Python-friendly objects instead of returning raw binary buffers in the case of complex result types. **Example program:** .. code-block:: python import fdb con = fdb.connect(dsn='localhost:employee',user='sysdba', password='masterkey') # Start transaction, so we can get information about it con.begin() info = con.trans_info([fdb.isc_info_tra_id, fdb.isc_info_tra_oldest_interesting, fdb.isc_info_tra_oldest_snapshot, fdb.isc_info_tra_oldest_active, fdb.isc_info_tra_isolation, fdb.isc_info_tra_access, fdb.isc_info_tra_lock_timeout]) print info print "TransactionID:", info[fdb.isc_info_tra_id] print "Oldest Interesting (OIT):",info[fdb.isc_info_tra_oldest_interesting] print "Oldest Snapshot:",info[fdb.isc_info_tra_oldest_snapshot] print "Oldest Active (OAT):",info[fdb.isc_info_tra_oldest_active] print "Isolation Level:",info[fdb.isc_info_tra_isolation] print "Access Mode:",info[fdb.isc_info_tra_access] print "Lock Timeout:",info[fdb.isc_info_tra_lock_timeout] Output:: {4: 459, 5: 430, 6: 459, 7: 459, 8: (3, 1), 9: 1, 10: -1} TransactionID: 459 Oldest Interesting (OIT): 430 Oldest Snapshot: 459 Oldest Active (OAT): 459 Isolation Level: (3, 1) Access Mode: 1 Lock Timeout: -1 .. note:: Isolation level info values are available as FDB constants `isc_info_tra_consistency`, `isc_info_tra_concurrency` and `isc_info_tra_read_committed`. For `read committed`, a tuple of two values is returned instead single value, where the second value is record version flag `isc_info_tra_no_rec_version` or `isc_info_tra_rec_version`. Access mode values are available as FDB constants `isc_info_tra_readonly` and `isc_info_tra_readwrite`. .. index:: pair: Transaction; retaining Retaining transactions ---------------------- The :meth:`~Transaction.commit` and :meth:`~Transaction.rollback` methods accept an optional boolean parameter `retaining` (**default False**) to indicate whether to recycle the transactional context of the transaction being resolved by the method call. If retaining is `True`, the infrastructural support for the transaction active at the time of the method call will be “retained” (efficiently and transparently recycled) after the database server has committed or rolled back the conceptual transaction. .. important:: In code that commits or rolls back frequently, “retaining” the transaction yields considerably better performance. However, retaining transactions must be used cautiously because they can interfere with the server’s ability to garbage collect old record versions. For details about this issue, read the “Garbage” section of `this document `_ by Ann Harrison. For more information about retaining transactions, see `Firebird documentation`. .. index:: pair: Transaction; SAVEPOINT Savepoints ---------- Savepoints are named, intermediate control points within an open transaction that can later be rolled back to, without affecting the preceding work. Multiple savepoints can exist within a single unresolved transaction, providing “multi-level undo” functionality. Although Firebird savepoints are fully supported from SQL alone via the `SAVEPOINT ‘name’` and `ROLLBACK TO ‘name’` statements, FDB also exposes savepoints at the Python API level for the sake of convenience. Call to method :meth:`~Transaction.savepoint` establishes a savepoint with the specified `name`. To roll back to a specific savepoint, call the :meth:`~Transaction.rollback` method and provide a value (the name of the savepoint) for the optional `savepoint` parameter. If the savepoint parameter of `rollback()` is not specified, the active transaction is cancelled in its entirety, as required by the Python Database API Specification. The following program demonstrates savepoint manipulation via the FDB API, rather than raw SQL. .. code-block:: python import fdb con = fdb.connect(dsn='employee', user='sysdba', password='pass') cur = con.cursor() cur.execute("recreate table test_savepoints (a integer)") con.commit() print 'Before the first savepoint, the contents of the table are:' cur.execute("select * from test_savepoints") print ' ', cur.fetchall() cur.execute("insert into test_savepoints values (?)", [1]) con.savepoint('A') print 'After savepoint A, the contents of the table are:' cur.execute("select * from test_savepoints") print ' ', cur.fetchall() cur.execute("insert into test_savepoints values (?)", [2]) con.savepoint('B') print 'After savepoint B, the contents of the table are:' cur.execute("select * from test_savepoints") print ' ', cur.fetchall() cur.execute("insert into test_savepoints values (?)", [3]) con.savepoint('C') print 'After savepoint C, the contents of the table are:' cur.execute("select * from test_savepoints") print ' ', cur.fetchall() con.rollback(savepoint='A') print 'After rolling back to savepoint A, the contents of the table are:' cur.execute("select * from test_savepoints") print ' ', cur.fetchall() con.rollback() print 'After rolling back entirely, the contents of the table are:' cur.execute("select * from test_savepoints") print ' ', cur.fetchall() The output of the example program is shown below:: Before the first savepoint, the contents of the table are: [] After savepoint A, the contents of the table are: [(1,)] After savepoint B, the contents of the table are: [(1,), (2,)] After savepoint C, the contents of the table are: [(1,), (2,), (3,)] After rolling back to savepoint A, the contents of the table are: [(1,)] After rolling back entirely, the contents of the table are: [] .. index:: pair: Transaction; multiple .. _multiple_transactions: Using multiple transactions with the same connection ---------------------------------------------------- To use additional transactions that could run simultaneously with :attr:`main transaction ` managed by `Connection`, create new :class:`Transaction` object calling :meth:`Connection.trans` method. If you don't specify the optional `default_tpb` parameter, this new `Transaction` inherits the :attr:`~Connection.default_tpb` from `Connection`. Physical transaction is not started when `Transaction` instance is created, but implicitly when first SQL statement is executed, or explicitly via :meth:`Transaction.begin` call. To execute statements in context of this additional transaction you have to use `cursors` obtained directly from this `Transaction` instance calling its :meth:`~Transaction.cursor` method, or call :meth:`Transaction.execute_immediate` method. **Example:** .. code-block:: python import fdb con = fdb.connect(dsn='employee', user='sysdba', password='pass') # Cursor for main_transaction context cur = con.cursor() # Create new READ ONLY READ COMMITTED transaction ro_transaction = con.trans(fdb.ISOLATION_LEVEL_READ_COMMITED_RO) # and cursor ro_cur = ro_transaction.cursor() cur.execute('insert into country values ('Oz','Crowns') con.commit() # commits main transaction # Read data created by main transaction from second one ro_cur.execute("select * from COUNTRY where COUNTRY = `Oz`") print ro_cur.fetchall() # Insert more data, but don't commit cur.execute('insert into country values ('Barsoom','XXX') # Read data created by main transaction from second one ro_cur.execute("select * from COUNTRY where COUNTRY = `Barsoom`") print ro_cur.fetchall() .. index:: pair: Transaction; distributed .. _distributed_transactions: Distributed Transactions ------------------------ Distributed transactions are transactions that span multiple databases. FDB provides this Firebird feature through :class:`ConnectionGroup` class. Instances of this class act as managers for :class:`Transaction` object that is bound to multiple connections, and to :class:`cursors ` bound to it and connections participated in group. That's it, distributed transaction is fully independent from all other transactions, main or secondary, of member connections. To assemble a group of connections, you can either pass the sequence of :class:`Connection` instances to :class:`ConnectionGroup` constructor, or add connections latter calling :meth:`ConnectionGroup.add` method. Any :class:`Connection` could be a member of only one group, and attempt to add it to another one would raise an exception. Also, `Connection` participating in group cannot be :meth:`closed ` before it's :meth:`removed ` or whole group is :meth:`disbanded `. .. warning:: Never add more than one connection to the same database to the same `ConnectionGroup`! Similarly to :class:`Transaction`, distributed transactions are managed through :meth:`ConnectionGroup.begin`, :meth:`ConnectionGroup.savepoint`. :meth:`ConnectionGroup.commit` and :meth:`ConnectionGroup.rollback` methods. Additionally, `ConnectionGroup` exposes method :meth:`~ConnectionGroup.prepare` that explicitly initiates the first phase of `Two-Phase Commit Protocol`. Transaction parameters are defined similarly to :class:`Transaction` using :attr:`ConnectionGroup.default_tpb` or as optional parameter to :meth:`~ConnectionGroup.begin` call. SQL statements that should belong to context of distributed transaction are executed via :class:`Cursor` instances aquired through :meth:`ConnectionGroup.cursor` method, or calling :meth:`ConnectionGroup.execute_immediate` method. .. note:: Because :class:`Cursor` instances can belong to only one :class:`Connection`, the :meth:`~ConnectionGroup.cursor` method has manadory parameter `connection`, to specify to which member connection cursor should belong. **Example program:** .. code-block:: python import fdb # First database con1 = fdb.create_database("CREATE DATABASE 'testdb-1.fdb' USER 'SYSDBA' PASSWORD 'masterkey'") con1.execute_immediate("recreate table T (PK integer, C1 integer)") con1.commit() # Second database con2 = fdb.create_database("CREATE DATABASE 'testdb-2,fdb' USER 'SYSDBA' PASSWORD 'masterkey'") con2.execute_immediate("recreate table T (PK integer, C1 integer)") con2.commit() # Create connection group cg = fdb.ConnectionGroup((con1,con2)) # Prepare Group cursors for each connection gc1 = cg.cursor(con1) gc2 = cg.cursor(con2) # Connection cursors to check content of databases q = 'select * from T order by pk' cc1 = con1.cursor() p1 = cc1.prep(q) cc2 = con2.cursor() p2 = cc2.prep(q) print "Distributed transaction: COMMIT" # =============================== gc1.execute('insert into t (pk) values (1)') gc2.execute('insert into t (pk) values (1)') cg.commit() # check it con1.commit() cc1.execute(p1) print 'db1:',cc1.fetchall() con2.commit() cc2.execute(p2) print 'db2:',cc2.fetchall() print "Distributed transaction: PREPARE + COMMIT" # ========================================= gc1.execute('insert into t (pk) values (2)') gc2.execute('insert into t (pk) values (2)') cg.prepare() cg.commit() # check it con1.commit() cc1.execute(p1) print 'db1:',cc1.fetchall() con2.commit() cc2.execute(p2) print 'db2:',cc2.fetchall() print "Distributed transaction: SAVEPOINT + ROLLBACK to it" # =================================================== gc1.execute('insert into t (pk) values (3)') cg.savepoint('CG_SAVEPOINT') gc2.execute('insert into t (pk) values (3)') cg.rollback(savepoint='CG_SAVEPOINT') # check it - via group cursors, as transaction is still active gc1.execute(q) print 'db1:',gc1.fetchall() gc2.execute(q) print 'db2:',gc2.fetchall() print "Distributed transaction: ROLLBACK" # ================================= cg.rollback() # check it con1.commit() cc1.execute(p1) print 'db1:',cc1.fetchall() con2.commit() cc2.execute(p2) print 'db2:',cc2.fetchall() print "Distributed transaction: EXECUTE_IMMEDIATE" # ========================================== cg.execute_immediate('insert into t (pk) values (3)') cg.commit() # check it con1.commit() cc1.execute(p1) print 'db1:',cc1.fetchall() con2.commit() cc2.execute(p2) print 'db2:',cc2.fetchall() # Finalize con1.drop_database() con1.close() con2.drop_database() con2.close() Output:: Distributed transaction: COMMIT db1: [(1, None)] db2: [(1, None)] Distributed transaction: PREPARE + COMMIT db1: [(1, None), (2, None)] db2: [(1, None), (2, None)] Distributed transaction: SAVEPOINT + ROLLBACK to it db1: [(1, None), (2, None), (3, None)] db2: [(1, None), (2, None)] Distributed transaction: ROLLBACK db1: [(1, None), (2, None)] db2: [(1, None), (2, None)] Distributed transaction: EXECUTE_IMMEDIATE db1: [(1, None), (2, None), (3, None)] db2: [(1, None), (2, None), (3, None)] .. _transaction-context-manager: Transaction Context Manager --------------------------- FDB provides context manager :class:`TransactionContext` that allows automatic transaction management using :ref:`WITH`. It can work with any object that supports `begin()`, `commit()` and `rollback()` methods, i.e. :class:`Connection`, :class:`ConnectionGroup` or :class:`Transaction`. It starts transaction when WITH block is entered and commits it if no exception occurst within it, or calls `rollback()` otherwise. Exceptions raised in WITH block are never suppressed. Examples: .. sourcecode:: python con = fdb.connect(dsn='employee',user='sysdba',password='masterkey') # Uses default main transaction with TransactionContext(con): cur = con.cursor() cur.execute("insert into T (PK,C1) values (1,'TXT')") # Uses separate transaction with TransactionContext(con.trans()) as tr: cur = tr.cursor() cur.execute("insert into T (PK,C1) values (2,'AAA')") # Uses connection group (distributed transaction) con2 = fdb.connect(dsn='remote:employee',user='sysdba',password='masterkey') cg = fdb.ConnectionGroup((con,con2)) with TransactionContext(cg): cur1 = cg.cursor(con) cur2 = cg.cursor(con2) cur1.execute("insert into T (PK,C1) values (3,'Local')") cur2.execute("insert into T (PK,C1) values (3,'Remote')") .. index:: pair: Database; events Database Events =============== What they are ------------- The Firebird engine features a distributed, interprocess communication mechanism based on messages called `database events`. A database event is a message passed from a trigger or stored procedure to an application to announce the occurrence of a specified condition or action, usually a database change such as an insertion, modification, or deletion of a record. The Firebird event mechanism enables applications to respond to actions and database changes made by other, concurrently running applications without the need for those applications to communicate directly with one another, and without incurring the expense of CPU time required for periodic polling to determine if an event has occurred. Why use them ------------ Anything that can be accomplished with database events can also be implemented using other techniques, so why bother with events? Since you’ve chosen to write database-centric programs in Python rather than assembly language, you probably already know the answer to this question, but let’s illustrate. A typical application for database events is the handling of administrative messages. Suppose you have an administrative message database with a `message's` table, into which various applications insert timestamped status reports. It may be desirable to react to these messages in diverse ways, depending on the status they indicate: to ignore them, to initiate the update of dependent databases upon their arrival, to forward them by e-mail to a remote administrator, or even to set off an alarm so that on-site administrators will know a problem has occurred. It is undesirable to tightly couple the program whose status is being reported (the `message producer`) to the program that handles the status reports (the `message handler`). There are obvious losses of flexibility in doing so. For example, the message producer may run on a separate machine from the administrative message database and may lack access rights to the downstream reporting facilities (e.g., network access to the SMTP server, in the case of forwarded e-mail notifications). Additionally, the actions required to handle status reports may themselves be time-consuming and error-prone, as in accessing a remote network to transmit e-mail. In the absence of database event support, the message handler would probably be implemented via `polling`. Polling is simply the repetition of a check for a condition at a specified interval. In this case, the message handler would check in an infinite loop to see whether the most recent record in the `messages` table was more recent than the last message it had handled. If so, it would handle the fresh message(s); if not, it would go to sleep for a specified interval, then loop. The `polling-based` implementation of the message handler is fundamentally flawed. Polling is a form of busy-wait_; the check for new messages is performed at the specified interval, regardless of the actual activity level of the message producers. If the polling interval is lengthy, messages might not be handled within a reasonable time period after their arrival; if the polling interval is brief, the message handler program (and there may be many such programs) will waste a large amount of CPU time on unnecessary checks. The database server is necessarily aware of the exact moment when a new message arrives. Why not let the message handler program request that the database server send it a notification when a new message arrives? The message handler can then efficiently sleep until the moment its services are needed. Under this `event-based` scheme, the message handler becomes aware of new messages at the instant they arrive, yet it does not waste CPU time checking in vain for new messages when there are none available. How events are exposed ---------------------- #. Server Process ("An event just occurred!") To notify any interested listeners that a specific event has occurred, issue the `POST_EVENT` statement from Stored Procedure or Trigger. The `POST_EVENT` statement has one parameter: the name of the event to post. In the preceding example of the administrative message database, `POST_EVENT` might be used from an `after insert` trigger on the `messages` table, like this: .. code-block:: s create trigger trig_messages_handle_insert for messages after insert as begin POST_EVENT 'new_message'; end .. note:: The physical notification of the client process does not occur until the transaction in which the `POST_EVENT` took place is actually committed. Therefore, multiple events may *conceptually* occur before the client process is *physically* informed of even one occurrence. Furthermore, the database engine makes no guarantee that clients will be informed of events in the same groupings in which they conceptually occurred. If, within a single transaction, an event named `event_a` is posted once and an event named `event_b` is posted once, the client may receive those posts in separate "batches", despite the fact that they occurred in the same conceptual unit (a single transaction). This also applies to multiple occurrences of *the same* event within a single conceptual unit: the physical notifications may arrive at the client separately. #. Client Process ("Send me a message when an event occurs.") .. note:: If you don't care about the gory details of event notification, skip to the section that describes FDB's Python-level event handling API. The Firebird C client library offers two forms of event notification. The first form is *synchronous* notification, by way of the function :c:func:`isc_wait_for_event()`. This form is admirably simple for a C programmer to use, but is inappropriate as a basis for FDB's event support, chiefly because it's not sophisticated enough to serve as the basis for a comfortable Python-level API. The other form of event notification offered by the database client library is *asynchronous*, by way of the functions :c:func:`isc_que_events()` (note that the name of that function is misspelled), :c:func:`isc_cancel_events()`, and others. The details are as nasty as they are numerous, but the essence of using asynchronous notification from C is as follows: #. Call :c:func:`isc_event_block()` to create a formatted binary buffer that will tell the server which events the client wants to listen for. #. Call :c:func:`isc_que_events()` (passing the buffer created in the previous step) to inform the server that the client is ready to receive event notifications, and provide a callback that will be asynchronously invoked when one or more of the registered events occurs. #. [The thread that called :c:func:`isc_que_events()` to initiate event listening must now do something else.] #. When the callback is invoked (the database client library starts a thread dedicated to this purpose), it can use the :c:func:`isc_event_counts()` function to determine how many times each of the registered events has occurred since the last call to :c:func:`isc_event_counts()` (if any). #. [The callback thread should now "do its thing", which may include communicating with the thread that called :c:func:`isc_que_events()`.] #. When the callback thread is finished handling an event notification, it must call :c:func:`isc_que_events()` again in order to receive future notifications. Future notifications will invoke the callback again, effectively "looping" the callback thread back to Step 4. API for Python developers ------------------------- The FDB database event API is comprised of the following: the method :meth:`Connection.event_conduit` and the class :class:`EventConduit`. The :class:`EventConduit` class serve as "conduit" through which database event notifications will flow into the Python program. It's not designed to be instantiated directly by the Python programmer. Instead, use the :meth:`Connection.event_conduit` method to create `EventConduit` instances. `event_conduit` is a method of `Connection` rather than a module-level function or a class constructor because the database engine deals with events in the context of a particular database (after all, `POST_EVENT` must be issued by a stored procedure or a trigger). :meth:`Connection.event_conduit` takes a sequence of string event names as parameter, and returns :class:`EventConduit` instance. .. important:: To start listening for events it's necessary (starting from FDB version 1.4.2) to call :meth:`EventConduit.begin` method or use EventConduit's context manager interface. Immediately when :meth:`~EventConduit.begin` method is called, EventConduit starts to accumulate notifications of any events that occur within the conduit’s internal queue until the conduit is closed either explicitly (via the :meth:`~EventConduit.close` method) or implicitly (via garbage collection). Notifications about events are aquired through call to :meth:`~EventConduit.wait` method, that blocks the calling thread until at least one of the events occurs, or the specified `timeout` (if any) expires, and returns `None` if the wait timed out, or a dictionary that maps `event_name -> event_occurrence_count`. .. important:: `EventConduit` can act as context manager that ensures execution of :meth:`~EventConduit.begin` and :meth:`~EventConduit.close` methods. It's strongly advised to use the `EventConduit` with the `with` statement. **Example:** .. code-block:: python with connection.event_conduit( ('event_a', 'event_b') ) as conduit: events = conduit.wait() process_events(events) If you want to drop notifications accumulated so far by conduit, call :meth:`EventConduit.flush` method. **Example program:** .. code-block:: python import fdb import threading import time # Prepare database con = fdb.create_database("CREATE DATABASE 'event_test.fdb' USER 'SYSDBA' PASSWORD 'masterkey'") con.execute_immediate("CREATE TABLE T (PK Integer, C1 Integer)") con.execute_immediate("""CREATE TRIGGER EVENTS_AU FOR T ACTIVE BEFORE UPDATE POSITION 0 AS BEGIN if (old.C1 <> new.C1) then post_event 'c1_updated' ; END""") con.execute_immediate("""CREATE TRIGGER EVENTS_AI FOR T ACTIVE AFTER INSERT POSITION 0 AS BEGIN if (new.c1 = 1) then post_event 'insert_1' ; else if (new.c1 = 2) then post_event 'insert_2' ; else if (new.c1 = 3) then post_event 'insert_3' ; else post_event 'insert_other' ; END""") con.commit() cur = con.cursor() # Utility function def send_events(command_list): for cmd in command_list: cur.execute(cmd) con.commit() print "One event" # ========= timed_event = threading.Timer(3.0,send_events,args=[["insert into T (PK,C1) values (1,1)",]]) events = con.event_conduit(['insert_1']) events.begin() timed_event.start() e = events.wait() events.close() print e print "Multiple events" # =============== cmds = ["insert into T (PK,C1) values (1,1)", "insert into T (PK,C1) values (1,2)", "insert into T (PK,C1) values (1,3)", "insert into T (PK,C1) values (1,1)", "insert into T (PK,C1) values (1,2)",] timed_event = threading.Timer(3.0,send_events,args=[cmds]) events = self.con.event_conduit(['insert_1','insert_3']) events.begin() timed_event.start() e = events.wait() events.close() print e print "20 events" # ========= cmds = ["insert into T (PK,C1) values (1,1)", "insert into T (PK,C1) values (1,2)", "insert into T (PK,C1) values (1,3)", "insert into T (PK,C1) values (1,1)", "insert into T (PK,C1) values (1,2)",] timed_event = threading.Timer(1.0,send_events,args=[cmds]) events = con.event_conduit(['insert_1','A','B','C','D', 'E','F','G','H','I','J','K','L','M', 'N','O','P','Q','R','insert_3']) events.begin() timed_event.start() time.sleep(3) e = events.wait() events.close() print e print "Flush events" # ============ timed_event = threading.Timer(3.0,send_events,args=[["insert into T (PK,C1) values (1,1)",]]) events = con.event_conduit(['insert_1']) events.begin() send_events(["insert into T (PK,C1) values (1,1)", "insert into T (PK,C1) values (1,1)"]) time.sleep(2) events.flush() timed_event.start() e = events.wait() events.close() print e # Finalize con.drop_database() con.close() Output:: One event {'insert_1': 1} Multiple events {'insert_3': 1, 'insert_1': 2} 20 events {'A': 0, 'C': 0, 'B': 0, 'E': 0, 'D': 0, 'G': 0, 'insert_1': 2, 'I': 0, 'H': 0, 'K': 0, 'J': 0, 'M': 0, 'L': 0, 'O': 0, 'N': 0, 'Q': 0, 'P': 0, 'R': 0, 'insert_3': 1, 'F': 0} Flush events {'insert_1': 1} .. currentModule:: fdb.services .. index:: Services .. _working_with_services: Working with Services ===================== Database server maintenance tasks such as user management, load monitoring, and database backup have traditionally been automated by scripting the command-line tools :program:`gbak`, :program:`gfix`, :program:`gsec`, and :program:`gstat`. The API presented to the client programmer by these utilities is inelegant because they are, after all, command-line tools rather than native components of the client language. To address this problem, Firebird has a facility called the `Services API`, which exposes a uniform interface to the administrative functionality of the traditional command-line tools. The native Services API, though consistent, is much lower-level than a Pythonic API. If the native version were exposed directly, accomplishing a given task would probably require more Python code than scripting the traditional command-line tools. For this reason, FDB presents its own abstraction over the native API via the :mod:`fdb.services` module. Services API Connections ------------------------ All Services API operations are performed in the context of a `connection` to a specific database server, represented by the :class:`fdb.services.Connection` class. Similarly to database connections, FDB provides :func:`~fdb.services.connect()` constructor function to create such connections. This constructor has three keyword parameters: :host: The network name of the computer on which the database server is running. :user: The name of the database user under whose authority the maintenance tasks are to be performed. :password: User’s password. Since maintenance operations are most often initiated by an administrative user on the same computer as the database server, `host` defaults to the local computer, and `user` defaults to `SYSDBA`. The three calls to :func:`fdb.services.connect()` in the following program are equivalent: .. code-block:: python from fdb import services con = services.connect(password='masterkey') con = services.connect(user='sysdba', password='masterkey') con = services.connect(host='localhost', user='sysdba', password='masterkey') .. note:: Like database connections, it's good practice to :meth:`~Connection.close` them when you don't need them anymore. :class:`~fdb.services.Connection` object provides number of methods that could be divided into several groups: * `Server Configuration and State`_: To get information about server configuration, active attachments or users, or to get content of server log. * `Database options`_: To set various database parameters like size of page cache, access mode or SQL dialect. * `Database maintenance`_: To perform backup, restore, validation or other database maintenance tasks. * `User maintanance`_: To get or change information about users defined in security database, to create new or remove users. * `Trace service`_: To start, stop, pause/resume or list Firebird `trace sessions`. * `Text ouput from Services`_: Some services like `backup` or `trace` may return significant amount of text. This output is not returned directly by method that starts the service, but through separate methods that emulate read from text file, or provide :ref:`iterator protocol ` support on `Connection`. Server Configuration and State ------------------------------ :meth:`~Connection.get_service_manager_version()` To help client programs adapt to version changes, the service manager exposes its version number as an integer. .. code-block:: python # 64-bit Linux Firebird 2.5.1 SuperServer >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> print con.get_service_manager_version() 2 `fdb.services` is a thick wrapper of the Services API that can shield its users from changes in the underlying C API, so this method is unlikely to be useful to the typical Python client programmer. :meth:`~Connection.get_server_version()` Returns the server’s version string .. code-block:: python # 64-bit Linux Firebird 2.5.1 SuperServer >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> print con.get_server_version() LI-V2.5.2.26536 Firebird 2.5 At first glance, this method appears to duplicate the functionality of the :attr:`fdb.Connection.server_version` property, but when working with Firebird, there is a difference. :attr:`fdb.Connection.server_version` is based on a C API call (`isc_database_info()`) that existed long before the introduction of the Services API. Some programs written before the advent of Firebird test the version number in the return value of `isc_database_info()`, and refuse to work if it indicates that the server is too old. Since the first stable version of Firebird was labeled 1.0, this pre-Firebird version testing scheme incorrectly concludes that (e.g.) Firebird 1.0 is older than Interbase 5.0. Firebird addresses this problem by making `isc_database_info()` return a “pseudo-InterBase” version number, whereas the Services API returns the true Firebird version, as shown: .. code-block:: python # 64-bit Linux Firebird 2.5.1 SuperServer import fdb con = fdb.connect(dsn='employee', user='sysdba', password='masterkey') print 'Interbase-compatible version string:', con.server_version svcCon = fdb.services.connect(password='masterkey') print 'Actual Firebird version string: ', svcCon.get_server_version() Output (on Firebird 2.5.1/Linux64):: Interbase-compatible version string: LI-V6.3.1.26351 Firebird 2.5 Actual Firebird version string: LI-V2.5.1.26351 Firebird 2.5 :meth:`~Connection.get_architecture()` Returns platform information for the server, including hardware architecture and operating system family. .. code-block:: python # 64-bit Linux Firebird 2.5.1 SuperServer >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> print con.get_architecture() Firebird/linux AMD64 :meth:`~Connection.get_home_directory()` Returns the equivalent of the RootDirectory setting from :file:`firebird.conf`. .. code-block:: python # 64-bit Linux Firebird 2.5.1 SuperServer >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> print con.get_home_directory() /opt/firebird/ :meth:`~Connection.get_security_database_path()` Returns the location of the server’s core security database, which contains user definitions and such. Name of this database is :file:`security2.fdb` (Firebird 2.0 and later) or :file:`security.fdb` (Firebird 1.5). .. code-block:: python # 64-bit Linux Firebird 2.5.1 SuperServer >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> print con.get_security_database_path() /opt/firebird/security2.fdb :meth:`~Connection.get_lock_file_directory()` Returns the directory location for Firebird lock files. .. code-block:: python # 64-bit Linux Firebird 2.5.1 SuperServer >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> print con.get_lock_file_directory() /tmp/firebird/ :meth:`~Connection.get_server_capabilities()` Returns tuple of capability info codes for each capability reported by Firebird server. Following constants are defined in :mod:`fdb.services` for convenience: * :data:`CAPABILITY_MULTI_CLIENT` * :data:`CAPABILITY_REMOTE_HOP` * :data:`CAPABILITY_SERVER_CONFIG` * :data:`CAPABILITY_QUOTED_FILENAME` * :data:`CAPABILITY_NO_SERVER_SHUTDOWN` .. code-block:: python # 64-bit Linux Firebird 2.5.1 SuperServer >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> print con.get_server_capabilities() (2L, 4L, 512L, 256L) >>> fdb.services.CAPABILITY_MULTI_CLIENT in con.get_server_capabilities() True >>> fdb.services.CAPABILITY_QUOTED_FILENAME in con.get_server_capabilities() False :meth:`~Connection.get_message_file_directory()` To support internationalized error messages/prompts, the database engine stores its messages in a file named :file:`firebird.msg`. The directory in which this file resides can be determined with this method. .. code-block:: python # 64-bit Linux Firebird 2.5.1 SuperServer >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> print con.get_message_file_directory() /opt/firebird/ :meth:`~Connection.get_connection_count()` Returns the number of active connections to databases managed by the server. This count only includes database connections (such as open instances of :class:`fdb.Connection`), not services manager connections (such as open instances of :class:`fdb.services.Connection`). .. code-block:: python # 64-bit Linux Firebird 2.5.1 SuperServer >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> db1 = fdb.connect(dsn='employee',user='sysdba',password='masterkey') >>> db2 = fdb.connect(dsn='employee',user='sysdba',password='masterkey') >>> print con.get_connection_count() 2 :meth:`~Connection.get_attached_database_names()` Returns a list of the names of all databases to which the server is maintaining at least one connection. The database names are not guaranteed to be in any particular order. .. code-block:: python # 64-bit Linux Firebird 2.5.1 SuperServer >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> db1 = fdb.connect(dsn='employee',user='sysdba',password='masterkey') >>> db2 = fdb.connect(dsn='employee',user='sysdba',password='masterkey') >>> print con.get_attached_database_names() ['/opt/firebird/examples/empbuild/employee.fdb'] :meth:`~Connection.get_log()` Request the contents of the server’s log file (:file:`firebird.log`). This method is so-called `Async method` that only initiates log transfer. Actual log content could be read by one from many methods for `text ouput from Services`_ that `Connection` provides . .. code-block:: python # 64-bit Linux Firebird 2.5.1 SuperServer >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> con.get_log() >>> log = con.readlines() Database options ---------------- :meth:`~Connection.set_default_page_buffers` Sets individual page cache size for Database. .. code-block:: python >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> con.set_default_page_buffers('employee',100) :meth:`~Connection.set_sweep_interval` Sets treshold for automatic sweep. .. code-block:: python >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> con.set_sweep_interval('employee',100000) :meth:`~Connection.set_reserve_page_space` Sets data page space reservation policy. .. code-block:: python >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') # Use all space >>> con.set_reserve_page_space('employee',False) :meth:`~Connection.set_write_mode` Sets Disk Write Mode: Sync (forced writes) or Async (buffered). Following constants are defined in :mod:`fdb.services` for convenience: * :data:`~fdb.services.WRITE_FORCED` * :data:`~fdb.services.WRITE_BUFFERED` .. code-block:: python >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') # Disable Forced Writes >>> con.set_write_mode('employee',services.WRITE_BUFFERED) :meth:`~Connection.set_access_mode` Sets Database Access mode: Read Only or Read/Write. Following constants are defined in :mod:`fdb.services` for convenience: * :data:`~fdb.services.ACCESS_READ_WRITE` * :data:`~fdb.services.ACCESS_READ_ONLY` .. code-block:: python >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') # Set database to R/O mode >>> con.set_access_mode('employee',services.ACCESS_READ_ONLY) :meth:`~Connection.set_sql_dialect` Sets SQL Dialect for Database. .. warning:: Changing SQL dialect on existing database is not recommended. Only newly created database objects would respect new dialect setting, while objects created with previous dialect remain unchanged. That may have dire consequences. .. code-block:: python >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') # Use SQL dialect 1 >>> con.set_sql_dialect('employee',1) Database maintenance -------------------- :meth:`~Connection.get_limbo_transaction_ids` Returns list of transactions in limbo. :meth:`~Connection.commit_limbo_transaction` Resolves limbo transaction with commit. :meth:`~Connection.rollback_limbo_transaction` Resolves limbo transaction with rollback. :meth:`~Connection.get_statistics` Request database statisctics. Report is in the same format as the output of the gstat command-line utility. This method has one required parameter, the location of the database on which to compute statistics, and six optional boolean parameters for controlling the domain of the statistics. This method is so-called `Async method` that only initiates report processing. Actual report could be read by one from many methods for `text ouput from Services`_ that `Connection` provides . .. note:: Until statistical report is not fully fetched from service (or ignored via :meth:`~Connection.wait`), any attempt to start another asynchronous service will fail with exception. .. code-block:: python >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> con.get_statistics('employee') >>> stat_report = con.readlines() :meth:`~Connection.backup` Request logical (GBAK) database backup. Produces report about backup process. This method is so-called `Async method` that only initiates backup process. Actual report could be read by one from many methods for `text ouput from Services`_ that `Connection` provides . .. note:: Until backup report is not fully fetched from service (or ignored via :meth:`~Connection.wait`), any attempt to start another asynchronous service will fail with exception. .. code-block:: python # 64-bit Linux Firebird 2.5.1 SuperServer >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> con.backup('employee', '/home/data/employee.fbk', metadata_only=True, collect_garbage=False) >>> backup_report = con.readlines() :meth:`~Connection.restore` Request database restore from logical (GBAK) backup. Produces report about restore process. This method is so-called `Async method` that only initiates restore process. Actual report could be read by one from many methods for `text ouput from Services`_ that `Connection` provides . .. note:: Until restore report is not fully fetched from service (or ignored via :meth:`~Connection.wait`), any attempt to start another asynchronous service will fail with exception. .. code-block:: python # 64-bit Linux Firebird 2.5.1 SuperServer >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> con.restore('/home/data/employee.fbk', '/home/data/empcopy.fdb') >>> restore_report = con.readlines() :meth:`~Connection.nbackup` Perform physical (NBACKUP) database backup. .. note:: Method call will not return until sweep is finished. :meth:`~Connection.nrestore` Perform restore from physical (NBACKUP) database backup. .. note:: Method call will not return until sweep is finished. :meth:`~Connection.shutdown` Database shutdown. Following constants are defined in :mod:`fdb.services` for convenience: For shutdow mode: * :data:`~fdb.services.SHUT_SINGLE` * :data:`~fdb.services.SHUT_MULTI` * :data:`~fdb.services.SHUT_FULL` For shutdown method: * :data:`~fdb.services.SHUT_FORCE` * :data:`~fdb.services.SHUT_DENY_NEW_TRANSACTIONS` * :data:`~fdb.services.SHUT_DENY_NEW_ATTACHMENTS` .. code-block:: python # 64-bit Linux Firebird 2.5.1 SuperServer >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') # Shutdown database to single-user maintenance mode >>> con.shutdown('empoyee', services.SHUT_SINGLE, services.SHUT_FORCE, 0) # Go to full shutdown mode, disabling new attachments during 5 seconds >>> con.shutdown('empoyee', services.SHUT_FULL, services.SHUT_DENY_NEW_ATTACHMENTS, 5) :meth:`~Connection.bring_online` Bring previously shut down database back online. Following constants are defined in :mod:`fdb.services` for convenience: For on-line mode: * :data:`~fdb.services.SHUT_NORMAL` * :data:`~fdb.services.SHUT_SINGLE` * :data:`~fdb.services.SHUT_MULTI` .. code-block:: python # 64-bit Linux Firebird 2.5.1 SuperServer >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') # Enable multi-user maintenance >>> con.bring_online('employee', services.SHUT_MULTI) # Enable single-user maintenance >>> con.bring_online('employee', services.SHUT_SINGLE) # Return to normal state >>> con.bring_online('employee') :meth:`~Connection.activate_shadow` Activates Database Shadow(s). :meth:`~Connection.sweep` Performs Database Sweep. .. note:: Method call will not return until sweep is finished. .. code-block:: python >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> con.sweep('empoyee') :meth:`~Connection.repair` Database Validation and Repair. .. note:: Method call will not return until action is finished. .. code-block:: python >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') # Just validate >>> con.repair('empoyee', ignore_checksums=True, read_only_validation=True) # Mend the database >>> con.repair('empoyee', ignore_checksums=True, mend_database=True) User maintanance ---------------- :meth:`~Connection.get_users` Returns information about specified user or all users as a list of :class:`User` instances. .. code-block:: python >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> users = con.get_users() >>> for user in users: ... print user.name ... print user.first_name, user.middle_name, user.last_name ... print user.user_id, user.group_id SYSDBA Sql Server Administrator 0 0 :meth:`~Connection.add_user` Adds new user. Requires instance of :class:`User` with **at least** its :attr:`~User.name` and :attr:`~User.password` attributes specified as non-empty values. All other attributes are optional. .. code-block:: python >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> user = services.User('NewUser') >>> user.password = 'secret' >>> user.first_name = 'John' >>> user.last_name = 'Doe' >>> con.add_users(User) :meth:`~Connection.modify_user` Modifycation of user information. Requires instance of :class:`User` with **at least** its :attr:`~User.name` attribute specified as non-empty value. .. note:: Sets :attr:`~User.first_name`, :attr:`~User.middle_name` and :attr:`~User.last_name` to their actual values, and ignores the :attr:`~User.user_id` and :attr:`~User.group_id` attributes regardless of their values. :attr:`~User.password` is set **only** when it has value. .. code-block:: python >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> user = services.User('SYSDBA') # Change pasword >>> user.password = 'Pa$$w0rd' >>> con.modify_user(User) :meth:`~Connection.remove_user` Removes user. Requires User name or instance of :class:`User` with **at least** its :attr:`~User.name` attribute specified as non-empty value. .. code-block:: python >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> con.remove_user('NewUser') :meth:`~Connection.user_exists` Checks for user's existence. Requires User name or instance of :class:`User` with **at least** its :attr:`~User.name` attribute specified as non-empty value. .. code-block:: python >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> con.user_exists('NewUser') False Trace service ------------- :meth:`~Connection.trace_start` Starts new trace session. Requires trace `configuration` and returns `Session ID`. Trace session output could be retrieved through :meth:`~Connection.readline`, :meth:`~Connection.readlines`, iteration over `Connection` or ignored via call to :meth:`~Connection.wait`. .. note:: Until session output is not fully fetched from service (or ignored via :meth:`~Connection.wait`), any attempt to start another asynchronous service including call to any `trace_` method will fail with exception. .. code-block:: python import fdb svc = fdb.services.connect(password='masterkey') # Because trace session blocks the connection, we need another one to stop trace session! svc_aux = fdb.services.connect(password='masterkey') trace_config = """ enabled true log_statement_finish true print_plan true include_filter %%SELECT%% exclude_filter %%RDB$%% time_threshold 0 max_sql_length 2048 """ trace_id = svc.trace_start(trace_config,'test_trace_1') trace_log = [] # Get first 10 lines of trace output for i in range(10): trace_log.append(svc.readline()) # Stop trace session svc_aux.stop_trace(trace_id) :meth:`~Connection.trace_stop` Stops trace session specified by ID. .. code-block:: python >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> con.trace_stop(15) Trace session ID 15 stopped :meth:`~Connection.trace_suspend` Suspends trace session specified by ID. .. code-block:: python >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> con.trace_suspend(15) Trace session ID 15 paused :meth:`~Connection.trace_resume` resumes trace session specified by ID. .. code-block:: python >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> con.trace_resume(15) Trace session ID 15 resumed :meth:`~Connection.trace_list` Returns information about existing trace sessions as dictionary mapping `SESSION_ID -> SESSION_PARAMS`. Session parameters is another dictionary with next keys: :name: (string) (optional) Session name if specified. :date: (datetime.datetime) Session start date and time. :user: (string) Trace user name. :flags: (list of strings) Session flags. .. code-block:: python >>> from fdb import services >>> con = services.connect(host='localhost', user='sysdba', password='masterkey') >>> con.trace_list() {53: {'date': datetime.datetime(2012, 10, 5, 10, 45, 4), 'flags': ['active', ' admin', ' trace'], 'user': 'SYSDBA'}} Text ouput from Services ------------------------ Some services like `backup` or `trace` may return significant amount of text. Rather than return the whole text as single string value by methods that provide access to these services, FDB isolated the transfer process to separate methods: * :meth:`~Connection.readline` - Similar to :meth:`file.readline`, returns next line of output from Service. * :meth:`~Connection.readlines` - Like :meth:`file.readlines`, returns list of output lines. * Iteration over `Connection` object, because :class:`Connection` has built-in support for :ref:`iterator protocol `. * Using `callback` method provided by developer. Each `Connection` method that returns its result asynchronously accepts an optional parameter `callback`, which must be a function that accepts one string parameter. This method is then called with each output line coming from service. * :meth:`~Connection.wait` - Waits for Sevice to finish, ignoring rest of the output it may produce. .. warning:: Until output is not fully fetched from service, any attempt to start another asynchronous service will fail with exception! This constraint is set by Firebird Service API. You may check the status of asynchronous Services using :attr:`Connection.fetching` attribute or :meth:`Connection.isrunning` method. In cases when you're not interested in output produced by Service, call :meth:`~Connection.wait` to wait for service to complete. **Examples:** .. code-block:: python import fdb svc = fdb.services.connect(password='masterkey') print "Fetch materialized" print "==================" print "Start backup" svc.backup('employee', 'employee.fbk') print "svc.fetching is", svc.fetching print "svc.running is", svc.isrunning() report = svc.readlines() print "%i lines returned" % len(report) print "First 5 lines from output:" for i in xrange(5): print i,report[i] print "svc.fetching is", svc.fetching print "svc.running is", svc.isrunning() print print "Iterate over result" print "===================" svc.backup('employee', 'employee.fbk') output = [] for line in svc: output.append(line) print "%i lines returned" % len(output) print "Last 5 lines from output:" for line in output[-5:]: print line print print "Callback" print "========" output = [] # Callback function def fetchline(line): output.append(line) svc.backup('employee', 'employee.fbk', callback=fetchline) print "%i lines returned" % len(output) print "Last 5 lines from output:" for line in output[-5:]: print line Output:: Fetch materialized ================== Start backup svc.fetching is True svc.running is True 558 lines returned First 5 lines from output: 0 gbak:readied database employee for backup 1 gbak:creating file employee.fbk 2 gbak:starting transaction 3 gbak:database employee has a page size of 4096 bytes. 4 gbak:writing domains svc.fetching is False svc.running is False Iterate over result =================== 558 lines returned Last 5 lines from output: gbak:writing referential constraints gbak:writing check constraints gbak:writing SQL roles gbak:writing names mapping gbak:closing file, committing, and finishing. 74752 bytes written Callback ======== 558 lines returned Last 5 lines from output: gbak:writing referential constraints gbak:writing check constraints gbak:writing SQL roles gbak:writing names mapping gbak:closing file, committing, and finishing. 74752 bytes written .. index:: pair: Database; schema pair: Database schema; working with .. _working-with-schema: Working with database schema ============================ Description of database objects like tables, views, stored procedures, triggers or UDF functions that represent database schema is stored in set of system tables present in every database. Firebird users can query these tables to get information about these objects and their relations. But querying system tables is inconvenient, as it requires good knowledge how this information is structured and requires significant amount of Python code. Changes in system tables between Firebird versions further add to this complexity. Hence FDB provides set of classes (isolated in separate module :mod:`fdb.schema`) that transform information stored in system tables into set of Python objects that surface the vital information in meaningful way, and additionaly provide set of methods for most commonly used operations or checks. Database schema could be accessed in three different ways, each suitable for different use case: - By direct creation of :class:`fdb.schema.Schema` instances that are then :meth:`binded ` to particular :class:`Connection` instance. This method is best if you want to work with schema only occasionally, or you want to keep connections as lightweight as possible. - Accessing :attr:`fdb.Connection.schema` property. This method is more convenient than previous one, and represents a compromise between convenience and resource consumption because :class:`~fdb.schem.Schema` instance is not created until first reference and is managed by connection itself. Individual metadata objects are not loaded from system tables until first reference. - Using :class:`~fdb.ConnectionWithSchema` instead :class:`Connection` by specifying `connection_class=ConnectionWithSchema` parameter to :func:`~fdb.connect` or :func:`~fdb.create_database`. This `Connection` descendant loads all database metadata immediately and provides directly all attributes and methods provided by :class:`~fdb.schema.Schema` class. This method is most suitable in case you want to work with database metadata extensively. **Examples:** 1. Using Schema instance: .. code-block:: python >>> import fdb >>> con = fdb.connect(dsn='employee',user='sysdba', password='masterkey') >>> schema = fdb.schema.Schema() >>> schema.bind(con) >>> [t.name for t in schema.tables] ['COUNTRY', 'JOB', 'DEPARTMENT', 'EMPLOYEE', 'SALES', 'PROJECT', 'EMPLOYEE_PROJECT', 'PROJ_DEPT_BUDGET', 'SALARY_HISTORY', 'CUSTOMER'] 2. Using Connection.schema: .. code-block:: python >>> import fdb >>> con = fdb.connect(dsn='employee',user='sysdba', password='masterkey') >>> [t.name for t in con.schema.tables] ['COUNTRY', 'JOB', 'DEPARTMENT', 'EMPLOYEE', 'SALES', 'PROJECT', 'EMPLOYEE_PROJECT', 'PROJ_DEPT_BUDGET', 'SALARY_HISTORY', 'CUSTOMER'] 3. Using ConnectionWithSchema: .. code-block:: python >>> import fdb >>> con = fdb.connect(dsn='employee',user='sysdba', password='masterkey', connection_class=fdb.ConnectionWithSchema) >>> [t.name for t in con.tables] ['COUNTRY', 'JOB', 'DEPARTMENT', 'EMPLOYEE', 'SALES', 'PROJECT', 'EMPLOYEE_PROJECT', 'PROJ_DEPT_BUDGET', 'SALARY_HISTORY', 'CUSTOMER'] .. note:: Individual metadata information (i.e. information about :attr:`domains `, :attr:`tables ` etc.) is loaded on first access and cached for further reference until it's :meth:`clared ` or :meth:`reload ` is requested. Because once loaded information is cached, it's good to :meth:`clar ` it when it's no longer needed to conserve memory. Available information --------------------- The :class:`~fdb.schema.Schema` provides information about: - **Database:** :attr:`Owner name `, :attr:`default character set `, :attr:`description `, :attr:`security class ` and whether database consist from :meth:`single or multiple files `. - **Facilities:** Available :attr:`character sets `, :attr:`collations `, database :attr:`files ` and :attr:`shadows `. - **User database objects:** :attr:`exceptions `, :attr:`generators `, :attr:`domains `, :attr:`tables ` and their :attr:`constraints `, :attr:`indices `, :attr:`views `, :attr:`triggers `, :attr:`procedures `, user :attr:`roles ` and :attr:`user defined functions `. - **System database objects:** :attr:`generators `, :attr:`domains `, :attr:`tables ` and their constraints, :attr:`indices `, :attr:`views `, :attr:`triggers `, :attr:`procedures ` and :attr:`functions `. - **Relations between objects:** Through direct links between metadata objects and :attr:`dependencies `. - **Privileges:** :attr:`All ` privileges, or privileges granted for specific :attr:`table `, :attr:`table column `, :attr:`view `, :attr:`view column `, :attr:`procedure ` or :attr:`role `. It's also possible to get all privileges :meth:`granted to ` specific user, role, procedure, trigger or view. Metadata objects ---------------- Schema information is presented as Python objects of various classes with common parent class :class:`~fdb.schema.BaseSchemaItem` (except :class:`~fdb.schema.Schema` itself), that defines several common attributes and methods: Attributes: - :attr:`~fdb.schema.BaseSchemaItem.name`: Name of database object or None if object doesn't have a name. - :attr:`~fdb.schema.BaseSchemaItem.description`: Description (documentation text) for object or None if object doesn't have a description. - :attr:`~fdb.schema.BaseSchemaItem.actions`: List of supported SQL operations on schema object instance. Methods: - :meth:`~fdb.schema.BaseSchemaItem.accept_visitor`: :ref:`Visitor Pattern support `. - :meth:`~fdb.schema.BaseSchemaItem.issystemobject`: Returns True if this database object is system object. - :meth:`~fdb.schema.BaseSchemaItem.get_quoted_name`: Returns quoted (if necessary) name of database object. - :meth:`~fdb.schema.BaseSchemaItem.get_dependents`: Returns list of all database objects that :ref:`depend ` on this one. - :meth:`~fdb.schema.BaseSchemaItem.get_dependencies`: Returns list of database objects that this object :ref:`depend ` on. - :meth:`~fdb.schema.BaseSchemaItem.get_sql_for`: Returns :ref:`SQL command string ` for specified action on database object. There are next schema objects: :class:`~fdb.schema.Collation`, :class:`~fdb.schema.CharacterSet`, :class:`~fdb.schema.DatabaseException`, :class:`~fdb.schema.Sequence` (Generator), :class:`~fdb.schema.Domain`, :class:`~fdb.schema.Index`, :class:`~fdb.schema.Table`, :class:`~fdb.schema.TableColumn`, :class:`~fdb.schema.Constraint`, :class:`~fdb.schema.View`, :class:`~fdb.schema.ViewColumn`, :class:`~fdb.schema.Trigger`, :class:`~fdb.schema.Procedure`, :class:`~fdb.schema.ProcedureParameter`, :class:`~fdb.schema.Function`, :class:`~fdb.schema.FunctionArgument`, :class:`~fdb.schema.Role`, :class:`~fdb.schema.Dependency`, :class:`~fdb.schema.DatabaseFile` and :class:`~fdb.schema.Shadow`. .. _visitor-pattern-support: Visitor Pattern support ----------------------- `Visitor Pattern`_ is particularly useful when you need to process various objects that need special handling in common algorithm (for example display information about them or generate SQL commands to create them in new database). Each metadata object (including :class:`~fdb.schema.Schema`) supports :meth:`~fdb.schema.BaseSchemaItem.accept_visitor` method that calls `class-specific` method on object passed to it as parameter. This method name always starts with 'visit'. For example :class:`~fdb.schema.Table` object calls `visitTable`. This 'visit*' method has one parameter - object instance that calls it. FDB provides skeleton implementation for :class:`schema Visitor object ` that implements all `visit*` methods called by schema classes as call to method `default_action` that does nothing. Next code uses visitor pattern to print all DROP SQL statements necessary to drop database object, taking its dependencies into account, i.e. it could be necessary to first drop other - dependant objects before it could be dropped. .. code-block:: python import fdb # Object dropper class ObjectDropper(fdb.schema.SchemaVisitor): def __init__(self): self.seen = [] def drop(self,obj): self.seen = [] obj.accept_visitor(self) def default_action(self,obj): if not obj.issystemobject() and 'drop' in obj.actions: for dependency in obj.get_dependents(): d = dependency.dependent if d and d not in self.seen: d.accept_visitor(self) if obj not in self.seen: print obj.get_sql_for('drop') self.seen.append(obj) def visitSchema(self,schema): pass def visitMetadataItem(self,item): pass def visitTableColumn(self,column): column.table.accept_visitor(self) def visitViewColumn(self,column): column.view.accept_visitor(self) def visitDependency(self,dependency): pass def visitConstraint(self,constraint): pass def visitProcedureParameter(self,param): param.procedure.accept_visitor(self) def visitFunctionArgument(self,arg): arg.function.accept_visitor(self) def visitDatabaseFile(self,dbfile): pass def visitShadow(self,shadow): pass # Sample use: con = fdb.connect(dsn='employee',user='sysdba', password='masterkey') table = con.schema.get_table('JOB') dropper = ObjectDropper() dropper.drop(table) Will produce next result:: DROP PROCEDURE ALL_LANGS DROP PROCEDURE SHOW_LANGS DROP TABLE JOB .. _object-dependencies: Object dependencies ------------------- Close relations between metadata object like `ownership` (Table vs. TableColumn, Index or Trigger) or `cooperation` (like FK Index vs. partner UQ/PK Index) are defined directly using properties of particular schema objects. Besides close releations Firebird also uses `dependencies`, that describe functional dependency between otherwise independent metadata objects. For example stored procedure can call other stored procedures, define its parameters using domains or work with tables or views. Removing or changing these objects may/will cause the procedure to stop working correctly, so Firebird tracks these dependencies. FDB surfaces these dependencies as :class:`~fdb.schema.Dependency` schema objects, and all schema objects have :meth:`~fdb.schema.BaseSchemaItem.get_dependents` and :meth:`~fdb.schema.BaseSchemaItem.get_dependencies` methods to get list of :class:`~fdb.schema.Dependency` instances that describe these dependencies. :class:`~fdb.schema.Dependency` object provides names and types of dependent/depended on database objects, and access to their respective schema Python objects as well. .. _sql-oprations: SQL operations -------------- FDB doesn't allow you to change database metadata directly using schema objects. Instead it supports generation of DDL SQL commands from schema objects using :meth:`~fdb.schema.BaseSchemaItem.get_sql_for` method present on all schema objects except Schema itself. DDL commands that could be generated depend on object type and context (for example it's not possible to generate DDL commands for system database objects), and list of DDL commands that could be generated for particular schema object could be obtained from its :attr:`~fdb.schema.BaseSchemaItem.actions` attribute. Possible `actions` could be: create, recreate, create_or_alter, alter, drop, activate, deactivate, recompute and declare. Some actions require/allow additional parameters. .. list-table:: SQL actions :widths: 20 15 15 5 45 :header-rows: 1 * - Schema class - Action - Parameter - Required - Description * - :class:`~fdb.schema.Collation` - create - - - * - - drop - - - * - :class:`~fdb.schema.CharacterSet` - alter - collation - Yes - :class:`~fdb.schema.Collation` instance or collation name * - :class:`~fdb.schema.DatabaseException` - create - - - * - - recreate - - - * - - alter - message - Yes - string. * - - create_or_alter - - - * - - drop - - - * - :class:`~fdb.schema.Sequence` - create - - - * - - alter - value - Yes - integer * - - drop - - - * - :class:`~fdb.schema.Domain` - create - - - * - - alter - - - One from next parameters required * - - - name - No - string * - - - default - No - string definition or None to drop default * - - - check - No - string definition or None to drop check * - - - datatype - No - string SQL datatype definition * - - drop - - - * - :class:`~fdb.schema.Constraint` - create - - - * - - drop - - - * - :class:`~fdb.schema.Index` - create - - - * - - activate - - - * - - deactivate - - - * - - recompute - - - * - - drop - - - * - :class:`~fdb.schema.Table` - create - - - * - - recreate - - - * - - drop - - - * - :class:`~fdb.schema.TableColumn` - alter - - - One from next parameters required * - - - name - No - string * - - - datatype - No - string SQL type definition * - - - position - No - integer * - - - expression - No - string with COMPUTED BY expression * - :class:`~fdb.schema.View` - create - - - * - - recreate - - - * - - alter - columns - No - string or list of strings * - - - query - Yes - string * - - - check - No - True for WITH CHECK OPTION clause * - - create_or_alter - - - * - - drop - - - * - :class:`~fdb.schema.Trigger` - create - - - * - - recreate - - - * - - create_or_alter - - - * - - alter - - - Requires parameters for either header or body definition. * - - - fire_on - No - string * - - - active - No - bool * - - - sequence - No - integer * - - - declare - No - string or list of strings * - - - code - No - string or list of strings * - - drop - - - * - :class:`~fdb.schema.Procedure` - create - no_code - No - True to supress procedure body from output * - - recreate - no_code - No - True to supress procedure body from output * - - create_or_alter - no_code - No - True to supress procedure body from output * - - drop - - - * - :class:`~fdb.schema.Role` - create - - - * - - drop - - - * - :class:`~fdb.schema.Function` - declare - - - * - - drop - - - * - :class:`~fdb.schema.DatabaseFile` - create - - - * - :class:`~fdb.schema.Shadow` - create - - - * - - drop - - - * - :class:`~fdb.schema.Privilege` - grant - grantors - No - List of grantor names. Generates GRANTED BY clause if grantor is not in list. * - - revoke - grantors - No - List of grantor names. Generates GRANTED BY clause if grantor is not in list. * - - - grant_option - No - True to get REVOKE of GRANT/ADMIN OPTION only. Raises ProgrammingError if privilege doesn't have such option. **Examples:** .. code-block:: python >>> import fdb >>> con = fdb.connect(dsn='employee',user='sysdba', password='masterkey') >>> t = con.schema.get_table('EMPLOYEE') >>> print t.get_sql_for('create') CREATE TABLE EMPLOYEE ( EMP_NO EMPNO NOT NULL, FIRST_NAME "FIRSTNAME" NOT NULL, LAST_NAME "LASTNAME" NOT NULL, PHONE_EXT VARCHAR(4), HIRE_DATE TIMESTAMP DEFAULT 'NOW' NOT NULL, DEPT_NO DEPTNO NOT NULL, JOB_CODE JOBCODE NOT NULL, JOB_GRADE JOBGRADE NOT NULL, JOB_COUNTRY COUNTRYNAME NOT NULL, SALARY SALARY NOT NULL, FULL_NAME COMPUTED BY (last_name || ', ' || first_name), PRIMARY KEY (EMP_NO) ) >>> for i in t.indices: ... if 'create' in i.actions: ... print i.get_sql_for('create') ... CREATE ASCENDING INDEX NAMEX ON EMPLOYEE (LAST_NAME,FIRST_NAME) >>> for c in [x for x in t.constraints if x.ischeck() or x.isfkey()]: ... print c.get_sql_for('create') ... ALTER TABLE EMPLOYEE ADD FOREIGN KEY (DEPT_NO) REFERENCES DEPARTMENT (DEPT_NO) ALTER TABLE EMPLOYEE ADD FOREIGN KEY (JOB_CODE,JOB_GRADE,JOB_COUNTRY) REFERENCES JOB (JOB_CODE,JOB_GRADE,JOB_COUNTRY) ALTER TABLE EMPLOYEE ADD CHECK ( salary >= (SELECT min_salary FROM job WHERE job.job_code = employee.job_code AND job.job_grade = employee.job_grade AND job.job_country = employee.job_country) AND salary <= (SELECT max_salary FROM job WHERE job.job_code = employee.job_code AND job.job_grade = employee.job_grade AND job.job_country = employee.job_country)) >>> p = con.schema.get_procedure('GET_EMP_PROJ') >>> print p.get_sql_for('recreate',no_code=True) RECREATE PROCEDURE GET_EMP_PROJ (EMP_NO SMALLINT) RETURNS (PROJ_ID CHAR(5)) AS BEGIN END >>> print p.get_sql_for('create_or_alter') CREATE OR ALTER PROCEDURE GET_EMP_PROJ (EMP_NO SMALLINT) RETURNS (PROJ_ID CHAR(5)) AS BEGIN FOR SELECT proj_id FROM employee_project WHERE emp_no = :emp_no INTO :proj_id DO SUSPEND; END >>> print p.get_sql_for('alter',input=['In1 INTEGER','In2 VARCHAR(5)'], ... output='Out1 INETEGER,\nOut2 VARCHAR(10)',declare=['declare variable i integer = 1;'], ... code=['/* body */','Out1 = i',"Out2 = 'Value'"]) ALTER PROCEDURE GET_EMP_PROJ ( In1 INTEGER, In2 VARCHAR(5) ) RETURNS (Out1 INETEGER, Out2 VARCHAR(10)) AS declare variable i integer = 1; BEGIN /* body */ Out1 = i Out2 = 'Value' END Working with user privileges ============================ User or database object privileges are part of database metadata accesible through FDB :class:`~fdb.schema.Schema` support. Each discrete privilege is represented by :class:`~fdb.schema.Privilege` instance. You can access either :attr:`all ` privileges, or privileges granted for specific :attr:`table `, :attr:`table column `, :attr:`view `, :attr:`view column `, :attr:`procedure ` or :attr:`role `. It's also possible to get all privileges :meth:`granted to ` specific user, role, procedure, trigger or view. :class:`~fdb.schema.Privilege` class supports :meth:`~fdb.schema.Privilege.get_sql_for` method to generate GRANT and REVOKE SQL statements for given privilege. If you want to generate grant/revoke statements for set of privileges (for example all privileges granted on specific object or grated to specific user), it's more convenient to use function :func:`~fdb.schema.get_grants` that returns list of minimal set of SQL commands required to task. **Examples:** .. code-block:: python >>> import fdb >>> con = fdb.connect(dsn='employee',user='sysdba', password='masterkey') >>> t = con.schema.get_table('EMPLOYEE') >>> for p in t.privileges: ... print p.get_sql_for('grant') ... GRANT SELECT ON EMPLOYEE TO SYSDBA WITH GRANT OPTION GRANT INSERT ON EMPLOYEE TO SYSDBA WITH GRANT OPTION GRANT UPDATE ON EMPLOYEE TO SYSDBA WITH GRANT OPTION GRANT DELETE ON EMPLOYEE TO SYSDBA WITH GRANT OPTION GRANT REFERENCES ON EMPLOYEE TO SYSDBA WITH GRANT OPTION GRANT SELECT ON EMPLOYEE TO PUBLIC WITH GRANT OPTION GRANT INSERT ON EMPLOYEE TO PUBLIC WITH GRANT OPTION GRANT UPDATE ON EMPLOYEE TO PUBLIC WITH GRANT OPTION GRANT DELETE ON EMPLOYEE TO PUBLIC WITH GRANT OPTION GRANT REFERENCES ON EMPLOYEE TO PUBLIC WITH GRANT OPTION >>> for p in fdb.schema.get_grants(t.privileges): ... print p ... GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE ON EMPLOYEE TO PUBLIC WITH GRANT OPTION GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE ON EMPLOYEE TO SYSDBA WITH GRANT OPTION Normally generated GRANT/REVOKE statements don't contain grantor's name, because GRANTED BY clause is supported only since Firebird 2.5. If you want to get GRANT/REVOKE statements including this clause, use `grantors` parameter for `get_sql_for` and `get_grants`. This parameter is a list of grantor names, and GRANTED BY clause is generated only for privileges not granted by user from this list. It's useful to suppress GRANTED BY clause for SYSDBA or database owner. Working with monitoring tables ============================== Starting from Firebird 2.1 (ODS 11.1) its possible to monitor server-side activity happening inside a particular database. The engine offers a set of “virtual” tables (so-called "monitoring tables") that provides the user with a snapshot of the current activity within the given database. FDB provides access to this information through set of classes (isolated in separate module :mod:`fdb.monitor`) that transform information stored in monitoring tables into set of Python objects that surface the information in meaningful way, and additionaly provide set of methods for available operations or checks. Like database schema, monitoring tables could be accessed in two different ways, each suitable for different use case: - By direct creation of :class:`fdb.monitor.Monitor` instances that are then binded to particular :class:`~fdb.Connection` instance. This method is best if you want to work with monitoring data only occasionally, or you want to keep connections as lightweight as possible. - Accessing :attr:`fdb.Connection.monitor` property. This method is more convenient than previous one, and represents a compromise between convenience and resource consumption because :class:`~fdb.monitor.Monitor` instance is not created until first reference and is managed by connection itself. **Examples:** 1. Using Monitor instance: .. code-block:: python >>> import fdb >>> con = fdb.connect(dsn='employee',user='sysdba', password='masterkey') >>> monitor = fdb.monitor.Monitor() >>> monitor.bind(con) >>> monitor.db.name '/opt/firebird/examples/empbuild/employee.fdb' 2. Using Connection.monitor: .. code-block:: python >>> import fdb >>> con = fdb.connect(dsn='employee',user='sysdba', password='masterkey') >>> con.monitor.db.name '/opt/firebird/examples/empbuild/employee.fdb' Available information --------------------- The :class:`~fdb.monitor.Monitor` provides information about: - :attr:`Database `. - :attr:`Connections ` to database and :attr:`current ` connection. - :attr:`Transactions `. - Executed :attr:`SQL statements `. - PSQL :attr:`callstack `. - Page and row :attr:`I/O statistics `, including memory usage. - :attr:`Context variables `. Activity snapshot ----------------- The key term of the monitoring feature is an `activity snapshot`. It represents the current state of the database, comprising a variety of information about the database itself, active attachments and users, transactions, prepared and running statements, and more. A snapshot is created the first time any of the monitoring information is being accessed from in the given `Monitor` instance and it is preserved until :attr:`~fdb.monitor.Monitor.closed`, :meth:`clared ` or :meth:`refreshed `, in order that accessed information is always consistent. There are two ways to refresh the snapshot: 1. Call :meth:`Monitor.clear() ` method. New snapshot will be taken on next access to monitoring information. 2. Call :meth:`Monitor.refresh() ` method to take the new snapshot immediately. .. important:: In both cases, any instances of information objects your application may hold would be obsolete. Using them may result in error, or (more likely) provide outdated information. .. note:: Individual monitoring information (i.e. information about :attr:`connections `, :attr:`transactions ` etc.) is loaded from activity snapshot on first access and cached for further reference until it's :meth:`clared ` or snapshot is :meth:`refreshed `. Because once loaded information is cached, it's good to :meth:`clar ` it when it's no longer needed to conserve memory. .. _Firebird Documentation: http://www.firebirdsql.org/en/reference-manuals/ .. _DDL: http://en.wikipedia.org/wiki/Data_Definition_Language .. _DML: http://en.wikipedia.org/wiki/Data_Manipulation_Language .. _Firebird SAVEPOINTs: http://www.firebirdsql.org/refdocs/langrefupd15-savepoint.html .. _Firebird API documentation: http://www.ibphoenix.com/files/60ApiGuide.zip .. _busy-wait: http://www.catb.org/jargon/html/B/busy-wait.html .. _Visitor Pattern: http://en.wikipedia.org/wiki/Visitor_pattern fdb-1.4.9+dfsg1/sphinx/Makefile0000644000215700017510000000446712431143162015146 0ustar rstuartit# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d .build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html web pickle htmlhelp latex changes linkcheck help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " changes to make an overview over all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" clean: -rm -rf .build/* html: mkdir -p .build/html .build/doctrees $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) ../docs @echo @echo "Build finished. The HTML pages are in ../docs." pickle: mkdir -p .build/pickle .build/doctrees $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) .build/pickle @echo @echo "Build finished; now you can process the pickle files." web: pickle json: mkdir -p .build/json .build/doctrees $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) .build/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: mkdir -p .build/htmlhelp .build/doctrees $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) .build/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in .build/htmlhelp." latex: mkdir -p .build/latex .build/doctrees $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) .build/latex @echo @echo "Build finished; the LaTeX files are in .build/latex." @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ "run these through (pdf)latex." changes: mkdir -p .build/changes .build/doctrees $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) .build/changes @echo @echo "The overview file is in .build/changes." linkcheck: mkdir -p .build/linkcheck .build/doctrees $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) .build/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in .build/linkcheck/output.txt." fdb-1.4.9+dfsg1/sphinx/index.txt0000644000215700017510000000304612431143162015346 0ustar rstuartit.. FDB documentation master file, created by sphinx-quickstart on Wed Jan 7 12:29:48 2009. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. ############################### Welcome to FDB's documentation! ############################### FDB is a `Python `__ library package that implements `Python Database API 2.0`-compliant support for the open source relational database `Firebird® `__. In addition to the minimal feature set of the standard Python DB API, FDB also exposes nearly the entire native client API of the database engine. FDB is free -- covered by a permissive BSD-style `license `__ that both commercial and noncommercial users should find agreeable. This documentation set is not a tutorial on Python, SQL, or Firebird; rather, it is a topical presentation of FDB's feature set, with example code to demonstrate basic usage patterns. For detailed information about Firebird features, see the `Firebird documentation `__, and especially the excellent `The Firebird Book `__ written by Helen Borrie and published by APress. Documentation Contents: *********************** .. toctree:: :maxdepth: 2 getting-started usage-guide python-db-api-compliance differences-from-kdb reference changelog license Indices and tables ****************** * :ref:`genindex` * :ref:`modindex` * :ref:`search` fdb-1.4.9+dfsg1/sphinx/requirements.txt0000644000215700017510000000000412431143162016751 0ustar rstuartitfdb fdb-1.4.9+dfsg1/sphinx/fdbtheme/0000755000215700017510000000000012544565035015265 5ustar rstuartitfdb-1.4.9+dfsg1/sphinx/fdbtheme/theme.conf0000644000215700017510000000135012431143162017221 0ustar rstuartit[theme] inherit = basic stylesheet = fdbtheme.css pygments_style = sphinx.pygment_styles.PyramidStyle [options] rightsidebar = false stickysidebar = false collapsiblesidebar = false externalrefs = false footerbgcolor = #11303d footertextcolor = #ffffff sidebarbgcolor = #1c4e63 sidebarbtncolor = #3c6e83 sidebartextcolor = #ffffff sidebarlinkcolor = #98dbcc relbarbgcolor = #133f52 relbartextcolor = #ffffff relbarlinkcolor = #ffffff bgcolor = #ffffff textcolor = #000000 headbgcolor = white headtextcolor = #20435c headlinkcolor = #c60f0f linkcolor = #355f7c visitedlinkcolor = #355f7c codebgcolor = #eeffcc codetextcolor = #333333 bodyfont = sans-serif headfont = 'Neuton', sans-serif fdb-1.4.9+dfsg1/sphinx/fdbtheme/static/0000755000215700017510000000000012544565035016554 5ustar rstuartitfdb-1.4.9+dfsg1/sphinx/fdbtheme/static/dialog-warning.png0000644000215700017510000000255712431143162022161 0ustar rstuartitPNG  IHDR szzsBIT|d&IDATX[hTGsً1Y&݈˪xɂ VD4R%Z[郈}Xj" &` D%"ffxC%&FOaaf3ρ(#Q.e&( 9\_ao; 28>\;b8JeoOI3iaPwBW< AiqnqqJ<-ͺw|s:boG)`[QDXu5d RP4T{C((?OYJmt *+ۤAg/18#Ѐс/'.p*~8|z2ʬYhaԹs]J6ߕBt¡ PԔmm-[~?B\.WbBLIUTD&'K7 B5kx[UpwLyqՑ Nm᫤ٳsܦ)څLJJ8r8((躞ĵw/OR&M]C8 TSav G/,L8IdӉ|o^sSi#+'GSwg [`k)={xb4\$`4nɏw0 M@ k耝}@L i( p M/IENDB`fdb-1.4.9+dfsg1/sphinx/fdbtheme/static/dialog-topic.png0000644000215700017510000000356612431143162021633 0ustar rstuartitPNG  IHDR szzbKGD pHYs  tIME38fIDATXŖ[lTgnό_0cCp 8$&R,RUmU+%@ EMUZE}$C%6JmriJۤb<_>s݇ <U}_3y੧B 2ܦ&r=j6yg{ZWS]V:4F=tqibV+/z BΘNiش6D9"!7Bٲ_ɹ?|p:3k՚칳 kO㤋7{(iM:41rAA2"D(/PWٜ9sd }ntscړ$HD0N6'KdrFVXxC(NlKslMun? l\U,l)@A9D9#1f2N,3s2U:^Δ}ݧ;߄Z E.É9Ĕd 3RW]cDŠ UV4u(E5S6LsBsal`A O|WT W7]|?Z71e'^Z!͈,8#sA*_Yӝw ""1ֽXESTw -Ze6ld&dh Gz%%̚U˛ZX&<.W67z\#b5D*ϕtN-V쉹9\1qY6b27h@h3 mTr_={jl i]koY昮,'BH%#-Mn\% Cx/Yр}bW^͟o՗u|H6u6 FJ  k_8t=ӆ7ėXXT-gIbL2];ڞ5Qڮ\&yv)sR\e ՆS}ᱯ]{.~rt'VJpb=N}>XJnm{۳cU%/L 8vn5+E:Uuzq;nX籇lAOZ4F#\# [;oС;6ڲنxO.J A>7/xMKY@z?]+= d YvՓ3 z@G"C])8qcSp]{;00ch\G….B[ugrwwӚaL\6ALCX蹏05y\RbPg29|Y q@EpzdNNf;;{essw?6mze;8rdj喝׃jPK Btz㞱Q?Ϗ?~yuT_s%^E Dhooo}g2bM`B`l [՜^PJqˍoMJ-1?(this.runtimeStyle.backgroundImage = "none", this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.src + "',sizingMethod='image')", this.src = "_static/transparent.gif"):(this.origBg = this.origBg? this.origBg :this.currentStyle.backgroundImage.toString().replace('url("','').replace('")',''), this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.origBg + "',sizingMethod='crop')", this.runtimeStyle.backgroundImage = "none")),this.pngSet=true) );} fdb-1.4.9+dfsg1/sphinx/fdbtheme/static/middlebg.png0000644000215700017510000000535512431143162021025 0ustar rstuartitPNG  IHDRƹ CiCCPICC ProfilexwTSY{/Bz MJz^E%$B WDWi"".Y+XX/"e_eǜߛ;sܙ<(BQ&@H"`1DpyYA?/3uLu a2?KНBА|A6# Ax 5H2  ͇@( dHIUF*ʡP#t ]z4 aMٰ;Gdx)΃åp5| n/>x~O!!# Da!l#qH"F H R4 mH'r D&abXg/&,ŬlÔc`1[!$#a~l26-b}kpX\*n%nnw׃Mx5%||?C  6oBAD@(!%%F 3DщL56 qH2""HRR%L%;CB:r)8 yD1p()e;0<.%J5Qvj"MBO/VBYWii 3LhϬkh.26`QXV=kȂah⹥eNNˏVvVV5V7XYicjó=:{ڹs_ؚ lޱmk``/owwHpt`!m+XGǵ:;IN8rNs><6h`^ͼa]A tqV>vsպsa!h8qVs{">^J^^^u'}|VM;<4 AA,0X Z w? 1 Ys(.4$"IuتpZ#<""GGJ#ۣꢦ=c,cV\Uƶjz-ܳp$.>?Ѣe.V_%%' GsܩDII.IIc.ɻS\SJR&aEojUtZpOS"%Q#S+sYfOYV~R{NĵPV K7IrTɍ=LqhYr[^JJU:֯ZhMzk֎Ywd=i}_6Xm(jcƶ<ͼuyÛ|66;oڂ"ҽuֲ  K omw}ڞȾhю;+(y7swW{Zb[RWw4LlG JʭzoҬ*zw@xAՆ%pr=}]zmaâÃGŽt98ZTKǏ ~?p$dO?U6њ ͓-)-=O95l:+():K:wӹg|a}I1owvt_ t勝箸\9}kk-7wu5bKS}w 7o9{˷n_[g ~`/ܛAC%4Ujk!ϡ''%ڣuc6cǽo>]tYֳ|n?蚌y!~m/^~e}*d3oy~.L{&>||)ӧ pHYs  PIDAT(c& H#S48]EAT&DaSB9%Hr3N $,&IENDB`fdb-1.4.9+dfsg1/sphinx/fdbtheme/static/epub.css0000644000215700017510000001273412431143162020214 0ustar rstuartit/* * default.css_t * ~~~~~~~~~~~~~ * * Sphinx stylesheet -- default theme. * * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: {{ theme_bodyfont }}; font-size: 100%; background-color: {{ theme_footerbgcolor }}; color: #000; margin: 0; padding: 0; } div.document { background-color: {{ theme_sidebarbgcolor }}; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 0 0 0 230px; } div.body { background-color: {{ theme_bgcolor }}; color: {{ theme_textcolor }}; padding: 0 20px 30px 20px; } {%- if theme_rightsidebar|tobool %} div.bodywrapper { margin: 0 230px 0 0; } {%- endif %} div.footer { color: {{ theme_footertextcolor }}; width: 100%; padding: 9px 0 9px 0; text-align: center; font-size: 75%; } div.footer a { color: {{ theme_footertextcolor }}; text-decoration: underline; } div.related { background-color: {{ theme_relbarbgcolor }}; line-height: 30px; color: {{ theme_relbartextcolor }}; } div.related a { color: {{ theme_relbarlinkcolor }}; } div.sphinxsidebar { {%- if theme_stickysidebar|tobool %} top: 30px; bottom: 0; margin: 0; position: fixed; overflow: auto; height: auto; {%- endif %} {%- if theme_rightsidebar|tobool %} float: right; {%- if theme_stickysidebar|tobool %} right: 0; {%- endif %} {%- endif %} } {%- if theme_stickysidebar|tobool %} /* this is nice, but it it leads to hidden headings when jumping to an anchor */ /* div.related { position: fixed; } div.documentwrapper { margin-top: 30px; } */ {%- endif %} div.sphinxsidebar h3 { font-family: {{ theme_headfont }}; color: {{ theme_sidebartextcolor }}; font-size: 1.4em; font-weight: normal; margin: 0; padding: 0; } div.sphinxsidebar h3 a { color: {{ theme_sidebartextcolor }}; } div.sphinxsidebar h4 { font-family: {{ theme_headfont }}; color: {{ theme_sidebartextcolor }}; font-size: 1.3em; font-weight: normal; margin: 5px 0 0 0; padding: 0; } div.sphinxsidebar p { color: {{ theme_sidebartextcolor }}; } div.sphinxsidebar p.topless { margin: 5px 10px 10px 10px; } div.sphinxsidebar ul { margin: 10px; padding: 0; color: {{ theme_sidebartextcolor }}; } div.sphinxsidebar a { color: {{ theme_sidebarlinkcolor }}; } div.sphinxsidebar input { border: 1px solid {{ theme_sidebarlinkcolor }}; font-family: sans-serif; font-size: 1em; } {% if theme_collapsiblesidebar|tobool %} /* for collapsible sidebar */ div#sidebarbutton { background-color: {{ theme_sidebarbtncolor }}; } {% endif %} /* -- hyperlink styles ------------------------------------------------------ */ a { color: {{ theme_linkcolor }}; text-decoration: none; } a:visited { color: {{ theme_visitedlinkcolor }}; text-decoration: none; } a:hover { text-decoration: underline; } {% if theme_externalrefs|tobool %} a.external { text-decoration: none; border-bottom: 1px dashed {{ theme_linkcolor }}; } a.external:hover { text-decoration: none; border-bottom: none; } a.external:visited { text-decoration: none; border-bottom: 1px dashed {{ theme_visitedlinkcolor }}; } {% endif %} /* -- body styles ----------------------------------------------------------- */ div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: {{ theme_headfont }}; background-color: {{ theme_headbgcolor }}; font-weight: normal; color: {{ theme_headtextcolor }}; border-bottom: 1px solid #ccc; margin: 20px -20px 10px -20px; padding: 3px 0 3px 10px; } div.body h1 { margin-top: 0; font-size: 200%; } div.body h2 { font-size: 160%; } div.body h3 { font-size: 140%; } div.body h4 { font-size: 120%; } div.body h5 { font-size: 110%; } div.body h6 { font-size: 100%; } a.headerlink { color: {{ theme_headlinkcolor }}; font-size: 0.8em; padding: 0 4px 0 4px; text-decoration: none; } a.headerlink:hover { background-color: {{ theme_headlinkcolor }}; color: white; } div.body p, div.body dd, div.body li { text-align: justify; line-height: 130%; } div.admonition p.admonition-title + p { display: inline; } div.admonition p { margin-bottom: 5px; } div.admonition pre { margin-bottom: 5px; } div.admonition ul, div.admonition ol { margin-bottom: 5px; } div.note { background-color: #eee; border: 1px solid #ccc; } div.seealso { background-color: #ffc; border: 1px solid #ff6; } div.topic { background-color: #eee; } div.warning { background-color: #ffe4e4; border: 1px solid #f66; } p.admonition-title { display: inline; } p.admonition-title:after { content: ":"; } pre { padding: 5px; background-color: {{ theme_codebgcolor }}; color: {{ theme_codetextcolor }}; line-height: 120%; border: 1px solid #ac9; border-left: none; border-right: none; } tt { background-color: #ecf0f3; padding: 0 1px 0 1px; font-size: 0.95em; } th { background-color: #ede; } .warning tt { background: #efc2c2; } .note tt { background: #d6d6d6; } .viewcode-back { font-family: {{ theme_bodyfont }}; } div.viewcode-block:target { background-color: #f4debf; border-top: 1px solid #ac9; border-bottom: 1px solid #ac9; } fdb-1.4.9+dfsg1/sphinx/fdbtheme/static/footerbg.png0000644000215700017510000000051512431143162021056 0ustar rstuartitPNG  IHDRfIDAT8ɑ0Z샔%[ڇ58| X0`oqNG@ř;mH#8Kk8FO-&19Z#AdF\g/8MLGp8dk躓}}tse.u9d=|9MӍ}ջ晍k>;t.k~!;?۟ZqY:wumM|<+3ݝ9p-nV=F|IENDB`fdb-1.4.9+dfsg1/sphinx/fdbtheme/static/fdbtheme.css_t0000644000215700017510000001655612431143162021370 0ustar rstuartit/* * pylons.css_t * ~~~~~~~~~~~~ * * Sphinx stylesheet -- pylons theme. * * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: "Nobile", sans-serif; font-size: 100%; background-color: #393939; color: #ffffff; margin: 0; padding: 0; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 0 0 0 {{ theme_sidebarwidth }}px; } hr { border: 1px solid #B1B4B6; } div.document { background-color: #eee; } div.header { width:100%; background: #f4ad32 url(headerbg.png) repeat-x 0 top; border-bottom: 2px solid #ffffff; } div.logo { text-align: center; padding-top: 10px; } div.body { background-color: #ffffff; color: #3E4349; padding: 0 30px 30px 30px; font-size: 1em; border: 2px solid #ddd; border-right-style: none; overflow: auto; } div.footer { color: #ffffff; width: 100%; padding: 13px 0; text-align: center; font-size: 75%; background: transparent; clear:both; } div.footer a { color: #ffffff; text-decoration: none; } div.footer a:hover { color: #e88f00; text-decoration: underline; } div.related { line-height: 30px; color: #373839; font-size: 0.8em; background-color: #eee; } div.related a { color: #1b61d6; } div.related ul { padding-left: {{ theme_sidebarwidth|toint + 10 }}px; } div.sphinxsidebar { font-size: 0.75em; line-height: 1.5em; } div.sphinxsidebarwrapper{ padding: 10px 0; } div.sphinxsidebar h3, div.sphinxsidebar h4 { font-family: "Neuton", sans-serif; color: #373839; font-size: 1.4em; font-weight: normal; margin: 0; padding: 5px 10px; border-bottom: 2px solid #ddd; } div.sphinxsidebar h4{ font-size: 1.3em; } div.sphinxsidebar h3 a { color: #000000; } div.sphinxsidebar p { color: #888; padding: 5px 20px; } div.sphinxsidebar p.topless { } div.sphinxsidebar ul { margin: 10px 20px; padding: 0; color: #373839; } div.sphinxsidebar a { color: #444; } div.sphinxsidebar input { border: 1px solid #ccc; font-family: sans-serif; font-size: 1em; } div.sphinxsidebar input[type=text]{ margin-left: 20px; } /* -- sidebars -------------------------------------------------------------- */ div.sidebar { margin: 0 0 0.5em 1em; border: 2px solid #c6d880; background-color: #e6efc2; width: 40%; float: right; border-right-style: none; border-left-style: none; padding: 10px 20px; } p.sidebar-title { font-weight: bold; } /* -- body styles ----------------------------------------------------------- */ a, a .pre { color: #1b61d6; text-decoration: none; } a:hover, a:hover .pre { text-decoration: underline; } /* margin: 20px -20px 10px -20px; headfont Trebuchet MS */ div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: {{ theme_headfont }}; background-color: {{ theme_headbgcolor }}; font-weight: normal; color: {{ theme_headtextcolor }}; border-bottom: 1px solid #ccc; margin: 20px -25px 10px -25px; padding: 3px 0 3px 10px; } div.body h1 { margin-top: 0; font-size: 200%; } div.body h2 { font-size: 160%; } div.body h3 { font-size: 140%; } div.body h4 { font-size: 120%; } div.body h5 { font-size: 110%; } div.body h6 { font-size: 100%; } /* Pyramid style div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: "Neuton", sans-serif; background-color: #ffffff; font-weight: normal; color: #373839; margin: 30px 0px 10px 0px; padding: 5px 0; } div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 200%; } div.body h2 { font-size: 150%; background-color: #ffffff; } div.body h3 { font-size: 120%; background-color: #ffffff; } div.body h4 { font-size: 110%; background-color: #ffffff; } div.body h5 { font-size: 100%; background-color: #ffffff; } div.body h6 { font-size: 100%; background-color: #ffffff; } */ a.headerlink { color: #1b61d6; font-size: 0.8em; padding: 0 4px 0 4px; text-decoration: none; } a.headerlink:hover { text-decoration: underline; } div.body p, div.body dd, div.body li { line-height: 1.5em; } div.admonition p.admonition-title + p { display: inline; } div.highlight{ background-color: white; } div.note { border: 2px solid #7a9eec; border-right-style: none; border-left-style: none; padding: 10px 20px 10px 60px; background: #e1ecfe url(dialog-note.png) no-repeat 10px 8px; } div.danger { border: 2px solid #fbc2c4; border-right-style: none; border-left-style: none; padding: 10px 20px 10px 60px; background: #fbe3e4 url(dialog-note.png) no-repeat 10px 8px; } div.attention { border: 2px solid #ffd324; border-right-style: none; border-left-style: none; padding: 10px 20px 10px 60px; background: #fff6bf url(dialog-note.png) no-repeat 10px 8px; } div.caution { border: 2px solid #ffd324; border-right-style: none; border-left-style: none; padding: 10px 20px 10px 60px; background: #fff6bf url(dialog-warning.png) no-repeat 10px 8px; } div.important { background: #fbe3e4 url(dialog-seealso.png) no-repeat 10px 8px; border: 2px solid #fbc2c4; border-left-style: none; border-right-style: none; padding: 10px 20px 10px 60px; } div.seealso { background: #fff6bf url(dialog-seealso.png) no-repeat 10px 8px; border: 2px solid #ffd324; border-left-style: none; border-right-style: none; padding: 10px 20px 10px 60px; } div.hint, div.tip { background: #eeffcc url(dialog-topic.png) no-repeat 10px 8px; border: 2px solid #aacc99; border-left-style: none; border-right-style: none; padding: 10px 20px 10px 60px; } div.topic { background: #eeeeee; border: 2px solid #C6C9CB; padding: 10px 20px; border-right-style: none; border-left-style: none; } div.warning, div.error { background: #fbe3e4 url(dialog-warning.png) no-repeat 10px 8px; border: 2px solid #fbc2c4; border-right-style: none; border-left-style: none; padding: 10px 20px 10px 60px; } p.admonition-title { display: none; } p.admonition-title:after { content: ":"; } pre { padding: 10px; background-color: #fafafa; /* background-color: #eeffcc; */ color: #222; line-height: 1.2em; border: 2px solid #C6C9CB; /* border: 2px solid #aacc99; */ font-size: 1.1em; margin: 1.5em 0 1.5em 0; border-right-style: none; border-left-style: none; } tt { background-color: transparent; color: #222; font-size: 1.1em; font-family: monospace; } .viewcode-back { font-family: "Nobile", sans-serif; } div.viewcode-block:target { background-color: #fff6bf; border: 2px solid #ffd324; border-left-style: none; border-right-style: none; padding: 10px 20px; } table.highlighttable { width: 100%; } table.highlighttable td { padding: 0; } a em.std-term { color: #007f00; } a:hover em.std-term { text-decoration: underline; } .download { font-family: "Nobile", sans-serif; font-weight: normal; font-style: normal; } tt.xref { font-weight: normal; font-style: normal; } fdb-1.4.9+dfsg1/sphinx/fdbtheme/static/dialog-note.png0000644000215700017510000000305612431143162021454 0ustar rstuartitPNG  IHDR szzsBIT|dIDATX[lgn{.k5ƀcSJ(iHREIUTJ}@}ᩴTU<4m_@MV$vHk3]ok>}2Mck&>[vd@UEN9pnJE+S%|*~'ȞQiFCCCmL6%6uc_-9;|gˆj><88(DI|ne0@ G ayͼ?O8uuh'.v?r⨮.$$HsՔVuR)4u١Cۇ ұvGm ʏLrgH6Q}Ak ځžHgeEvv@h=vWQ x;9=1^w3{nwOP[s\%8푠:~MP^~'/M!O[X:/0 @frK WQ{OoE~W^W^9J)N|67=ϋe'Px(@NM,Ww t.=}~/MuA.$}--B@RHsHʇCK'e%n!SK{F R\p8u*@y!{A'` "eyS`@MI.$-dv;%^R8LO""`+-KS@SHHHӐ2XD$IĖk)!ǐiDo;"g\n-ܿ;P s&2; Ӵl\}++,f[.ḳ;[޺Uc ېqϧ Yנf,޽(X"Ċ3jU3~*_$=&Xw]/\DoƥV)#u\r.HY .ayN_I&inA ZW!s>| \1szO'GGo?#Uwsx16~ŷyv*řtßKzky0qH6Lѯ<7g'U 8/sU g'ӓYVB kw7dࠦ Ȥ;@#wp_}j> p} o펑[>]բC,vvZ[ʮnF|l?K |\x'U?c] WzM[ 61tY`-e,albb/Bk+a/xx_34vP|sޏ-XCr*{%m\-UT`Xg*7^ъVVjb8e= +?F)QWb,B_OxǣIENDB`fdb-1.4.9+dfsg1/sphinx/fdbtheme/static/dialog-seealso.png0000644000215700017510000000273612431143162022146 0ustar rstuartitPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<pIDATXŖ[lUߙٝݶR)޸GBT MVcFYD|GQLLKb$5ATB@*ZJwv/s;nn|9̜93Aqx|ڗvܳB~PpUB)O+yX<sY:h9]@ڪze/ *Fn,Rǧ5" <_Ϫ7r5.mmǧh WYf. لrbgO[MfWkO(<9|RMH6a ȃ{f(p%69mOsg- _vW-D B0L)08 lf1;XTrYEoe^=tVN,{lC5:&$[H։'EMҵt\{WO0ԩV/|tGWkTB0nm6OԔr$d '4-X§Uŵݠ> ?${0w$(q@ qnoѿHd ۣX Rf@!Gy0dP98rJmglij@tHMZ|G;X99'@Dw s4ɍKSFPHiQl:ysKoOm:H)ʁƑΎ`aq(|Dpr&wN AMȤ>ND$aJ(i[XtlCN @id6aO$pj{EU_c΋MW0%3(4vz9s;7N tYf<ȔK63ۓ>H2܆D$3!QPuQ݊JW'Dҥ,f@e։U?V!R%lf'$ˤ eS|LI8gM {% endblock %} {% block header %} {%- if logo %} {%- endif %} {% endblock %} {%- block sidebarlogo %}{%- endblock %} {%- block sidebarsourcelink %}{%- endblock %} fdb-1.4.9+dfsg1/sphinx/reference.txt0000644000215700017510000003202712431143162016176 0ustar rstuartit ============= FDB Reference ============= .. module:: fdb :synopsis: Python Database API 2.0 Compliant driver for Firebird Module globals ============== .. data:: __version__ Current driver version, string. .. data:: apilevel String constant stating the supported DB API level (2.0). .. data:: threadsafety Integer constant stating the level of thread safety the interface supports. Curretly `1` = Threads may share the module, but not connections. .. data:: paramstyle String constant stating the type of parameter marker formatting expected by the interface. `'qmark'` = Question mark style, e.g. '...WHERE name=?' .. data:: DESCRIPTION_NAME .. data:: DESCRIPTION_TYPE_CODE .. data:: DESCRIPTION_DISPLAY_SIZE .. data:: DESCRIPTION_INTERNAL_SIZE .. data:: DESCRIPTION_PRECISION .. data:: DESCRIPTION_SCALE .. data:: DESCRIPTION_NULL_OK Helper constants for work with :attr:`Cursor.description` content. .. data:: ISOLATION_LEVEL_READ_COMMITED_LEGACY TPB for R/W WAIT READ COMMITTED NO RECORD VERSION transaction. .. data:: ISOLATION_LEVEL_READ_COMMITED TPB for R/W WAIT READ COMMITTED RECORD VERSION transaction. .. data:: ISOLATION_LEVEL_REPEATABLE_READ .. data:: ISOLATION_LEVEL_SNAPSHOT TPB's for R/W WAIT SNAPSHOT transaction. .. data:: ISOLATION_LEVEL_SERIALIZABLE .. data:: ISOLATION_LEVEL_SNAPSHOT_TABLE_STABILITY TPB's for R/W WAIT SNAPSHOT TABLE STABILITY transaction. .. data:: ISOLATION_LEVEL_READ_COMMITED_RO TPB for R/O WAIT READ COMMITTED RECORD VERSION transaction. .. data:: MAX_BLOB_SEGMENT_SIZE .. data:: charset_map Python dictionary that maps Firebird character set names (key) to Python character sets (value). .. data:: ODS_FB_20 .. data:: ODS_FB_21 .. data:: ODS_FB_25 ODS version numbers introduced by Firebird engine version. Exceptions ========== .. autoexception:: Warning :show-inheritance: .. autoexception:: Error :show-inheritance: .. autoexception:: InterfaceError :show-inheritance: .. autoexception:: DatabaseError :show-inheritance: .. autoexception:: DataError :show-inheritance: .. autoexception:: OperationalError :show-inheritance: .. autoexception:: IntegrityError :show-inheritance: .. autoexception:: InternalError :show-inheritance: .. autoexception:: ProgrammingError :show-inheritance: .. autoexception:: NotSupportedError :show-inheritance: .. autoexception:: TransactionConflict :show-inheritance: This is the exception inheritance layout:: StandardError |__Warning |__Error |__InterfaceError |__DatabaseError |__DataError |__OperationalError |__IntegrityError |__InternalError |__ProgrammingError |__NotSupportedError Functions ========= .. autofunction:: connect .. autofunction:: create_database .. autofunction:: load_api Classes ======= Connection ---------- .. autoclass:: Connection :member-order: groupwise :members: :inherited-members: .. autoclass:: ConnectionWithSchema :member-order: groupwise :members: :undoc-members: .. note:: For list of methods see :class:`fdb.schema.Schema`. Cursor ------ .. autoclass:: Cursor :member-order: groupwise :members: :inherited-members: :undoc-members: Transaction ----------- .. autoclass:: Transaction :member-order: groupwise :members: :inherited-members: :undoc-members: PreparedStatement ----------------- .. autoclass:: PreparedStatement :member-order: groupwise :members: :inherited-members: :undoc-members: ConnectionGroup --------------- .. autoclass:: ConnectionGroup :member-order: groupwise :members: :inherited-members: :undoc-members: TransactionContext ------------------ .. autoclass:: TransactionContext :member-order: groupwise :members: :inherited-members: :undoc-members: EventConduit ------------ .. autoclass:: EventConduit :member-order: groupwise :members: :inherited-members: :undoc-members: BlobReader ---------- .. autoclass:: BlobReader :member-order: groupwise :members: :inherited-members: :undoc-members: TPB --- .. autoclass:: TPB :member-order: groupwise :members: :undoc-members: TableReservation ---------------- .. autoclass:: TableReservation :member-order: groupwise :members: :inherited-members: :undoc-members: Internally used classes exposed to driver users =============================================== .. module:: fdb.fbcore :synopsis: Implementation of Firebird driver RowMapping ---------- .. autoclass:: _RowMapping :member-order: groupwise :members: :inherited-members: :undoc-members: EventBlock ---------- .. autoclass:: EventBlock :member-order: groupwise :members: :inherited-members: :undoc-members: .. _services_api: Services ======== .. module:: fdb.services :synopsis: Submodule for work with Firebird Services Module globals -------------- .. data:: SHUT_LEGACY .. data:: SHUT_NORMAL .. data:: SHUT_MULTI .. data:: SHUT_SINGLE .. data:: SHUT_FULL These constants are to be passed as the `shutdown_mode` parameter to :meth:`Connection.shutdown` and :meth:`Connection.bring_online`. .. data:: SHUT_FORCE .. data:: SHUT_DENY_NEW_TRANSACTIONS .. data:: SHUT_DENY_NEW_ATTACHMENTS These constants are to be passed as the `shutdown_method` parameter to :meth:`Connection.shutdown` .. data:: WRITE_FORCED .. data:: WRITE_BUFFERED These constants are to be passed as the `mode` parameter to :meth:`Connection.setWriteMode` .. data:: ACCESS_READ_WRITE .. data:: ACCESS_READ_ONLY These constants are to be passed as the `mode` parameter to :meth:`Connection.setAccessMode` .. data:: CAPABILITY_MULTI_CLIENT .. data:: CAPABILITY_REMOTE_HOP .. data:: CAPABILITY_SERVER_CONFIG .. data:: CAPABILITY_QUOTED_FILENAME .. data:: CAPABILITY_NO_SERVER_SHUTDOWN These constants are return values of :meth:`Connection.get_server_capabilities` Functions --------- .. autofunction:: connect Connection ---------- .. autoclass:: Connection :member-order: groupwise :members: :inherited-members: :undoc-members: User ---- .. autoclass:: User :member-order: groupwise :members: :inherited-members: :undoc-members: Database schema =============== .. module:: fdb.schema :synopsis: Submodule for work with database metadata (schema) Functions --------- .. autofunction:: get_grants .. autofunction:: isKeyword Schema ------ .. autoclass:: Schema :member-order: groupwise :members: :inherited-members: :undoc-members: BaseSchemaItem -------------- .. autoclass:: BaseSchemaItem :member-order: groupwise :members: :inherited-members: :undoc-members: Collation --------- .. autoclass:: Collation :member-order: groupwise :members: :inherited-members: :undoc-members: CharacterSet ------------ .. autoclass:: CharacterSet :member-order: groupwise :members: :inherited-members: :undoc-members: DatabaseException ----------------- .. autoclass:: DatabaseException :member-order: groupwise :members: :inherited-members: :undoc-members: Sequence -------- .. autoclass:: Sequence :member-order: groupwise :members: :inherited-members: :undoc-members: Index ----- .. autoclass:: Index :member-order: groupwise :members: :inherited-members: :undoc-members: TableColumn ----------- .. autoclass:: TableColumn :member-order: groupwise :members: :inherited-members: :undoc-members: ViewColumn ---------- .. autoclass:: ViewColumn :member-order: groupwise :members: :inherited-members: :undoc-members: Domain ------ .. autoclass:: Domain :member-order: groupwise :members: :inherited-members: :undoc-members: Dependency ---------- .. autoclass:: Dependency :member-order: groupwise :members: :inherited-members: :undoc-members: Constraint ---------- .. autoclass:: Constraint :member-order: groupwise :members: :inherited-members: :undoc-members: Table ----- .. autoclass:: Table :member-order: groupwise :members: :inherited-members: :undoc-members: View ---- .. autoclass:: View :member-order: groupwise :members: :inherited-members: :undoc-members: Trigger ------- .. autoclass:: Trigger :member-order: groupwise :members: :inherited-members: :undoc-members: ProcedureParameter ------------------ .. autoclass:: ProcedureParameter :member-order: groupwise :members: :inherited-members: :undoc-members: Procedure --------- .. autoclass:: Procedure :member-order: groupwise :members: :inherited-members: :undoc-members: Role ---- .. autoclass:: Role :member-order: groupwise :members: :inherited-members: :undoc-members: FunctionArgument ---------------- .. autoclass:: FunctionArgument :member-order: groupwise :members: :inherited-members: :undoc-members: Function -------- .. autoclass:: Function :member-order: groupwise :members: :inherited-members: :undoc-members: DatabaseFile ------------ .. autoclass:: DatabaseFile :member-order: groupwise :members: :inherited-members: :undoc-members: Shadow ------ .. autoclass:: Shadow :member-order: groupwise :members: :inherited-members: :undoc-members: Privilege ------------- .. autoclass:: Privilege :member-order: groupwise :members: :inherited-members: :undoc-members: SchemaVisitor ------------- .. autoclass:: SchemaVisitor :member-order: groupwise :members: :inherited-members: :undoc-members: Monitoring information ====================== .. module:: fdb.monitor :synopsis: Submodule for work with database monitoring tables Constants --------- .. data:: SHUTDOWN_MODE_ONLINE .. data:: SHUTDOWN_MODE_MULTI .. data:: SHUTDOWN_MODE_SINGLE .. data:: SHUTDOWN_MODE_FULL Shutdown modes for :attr:`DatabaseInfo.shutdown_mode`. .. data:: BACKUP_STATE_NORMAL .. data:: BACKUP_STATE_STALLED .. data:: BACKUP_STATE_MERGE Backup states for :attr:`DatabaseInfo.backup_state`. .. data:: STATE_IDLE .. data:: STATE_ACTIVE States for :attr:`AttachmentInfo.state`, :attr:`TransactionInfo.state`. and :attr:`StatementInfo.state`. .. data:: ISOLATION_CONSISTENCY .. data:: ISOLATION_CONCURRENCY .. data:: ISOLATION_READ_COMMITTED_RV .. data:: ISOLATION_READ_COMMITTED_NO_RV Isolation modes for :attr:`TransactionInfo.isolation_mode`. .. data:: INFINITE_WAIT .. data:: NO_WAIT Special timeout values for :attr:`TransactionInfo.lock_timeout`. .. data:: STAT_DATABASE .. data:: STAT_ATTACHMENT .. data:: STAT_TRANSACTION .. data:: STAT_STATEMENT .. data:: STAT_CALL Group codes for :attr:`IOStatsInfo.group`. Monitor ------- .. autoclass:: Monitor :member-order: groupwise :members: :inherited-members: :undoc-members: BaseInfoItem ------------ .. autoclass:: BaseInfoItem :member-order: groupwise :members: :inherited-members: :undoc-members: DatabaseInfo ------------ .. autoclass:: DatabaseInfo :member-order: groupwise :members: :inherited-members: :undoc-members: AttachmentInfo -------------- .. autoclass:: AttachmentInfo :member-order: groupwise :members: :inherited-members: :undoc-members: TransactionInfo --------------- .. autoclass:: TransactionInfo :member-order: groupwise :members: :inherited-members: :undoc-members: StatementInfo ------------- .. autoclass:: StatementInfo :member-order: groupwise :members: :inherited-members: :undoc-members: CallStackInfo ------------- .. autoclass:: CallStackInfo :member-order: groupwise :members: :inherited-members: :undoc-members: IOStatsInfo ----------- .. autoclass:: IOStatsInfo :member-order: groupwise :members: :inherited-members: :undoc-members: ContextVariableInfo ------------------- .. autoclass:: ContextVariableInfo :member-order: groupwise :members: :inherited-members: :undoc-members: Utilities ========= .. module:: fdb.utils :synopsis: Submodule with various classes and functions Functions --------- .. autofunction:: update_meta .. autofunction:: iter_class_properties .. autofunction:: iter_class_variables .. autofunction:: embed_attributes LateBindingProperty ------------------- .. autoclass:: LateBindingProperty :member-order: groupwise :members: Iterator -------- .. autoclass:: Iterator :member-order: groupwise :members: __iter__, next, __next__ :inherited-members: :undoc-members: EmbeddedProperty ---------------- .. autoclass:: EmbeddedProperty :member-order: groupwise :members: EmbeddedAttribute ----------------- .. autoclass:: EmbeddedAttribute :member-order: groupwise :members: .. module:: fdb.blr :synopsis: Python ctypes interface to Firebird client library (BLR) .. module:: fdb.ibase :synopsis: Python ctypes interface to Firebird client library ctypes interface to Firebird client library =========================================== :ref:`ctypes ` interface to `fbclient.so/dll` is defined in submodule :mod:`fdb.ibase` and :mod:`fdb.blr`. .. autoclass:: fbclient_API :member-order: groupwise :members: fdb-1.4.9+dfsg1/sphinx/license.txt0000644000215700017510000000003512431143162015654 0ustar rstuartit.. include:: ../LICENSE.TXT fdb-1.4.9+dfsg1/sphinx/getting-started.txt0000644000215700017510000002163012431143162017343 0ustar rstuartit ######################## Getting Started with FDB ######################## Installation ************ FDB is written as pure-Python module on top of Firebird client library (fbclient.so/dll) using ctypes_, so *make sure you have Firebird client properly installed before you try to install FDB*, otherwise the installation will fail. FDB supports Firebird version 2.0 and higher. FDB is distributed as `setuptools`_ package, so you'll need setuptools or `compatible package `_ installed to install FDB properly. Installation from PYPI_ ======================= Run easy_install or pip:: $ pip install fdb or:: $ easy_install fdb Installation from source ======================== Download the source tarball, uncompress it, then run the install command:: $ curl -O http://pypi.python.org/packages/source/f/fdb/fdb-1.2.tar.gz $ tar -xzvf fdb-1.2.tar.gz $ cd fdb-1.2 $ python setup.py install .. _setuptools: https://bitbucket.org/pypa/setuptools .. _PYPI: http://pypi.python.org .. _ctypes: http://docs.python.org/library/ctypes.html Quick-start Guide ***************** This brief tutorial aims to get the reader started by demonstrating elementary usage of FDB. It is not a comprehensive Python Database API tutorial, nor is it comprehensive in its coverage of anything else. The numerous advanced features of FDB are covered in another section of this documentation, which is not in a tutorial format, though it is replete with examples. Connecting to a Database ======================== **Example 1** A database connection is typically established with code such as this: .. sourcecode:: python import fdb # The server is named 'bison'; the database file is at '/temp/test.db'. con = fdb.connect(dsn='bison:/temp/test.db', user='sysdba', password='pass') # Or, equivalently: con = fdb.connect( host='bison', database='/temp/test.db', user='sysdba', password='pass' ) **Example 2** Suppose we want to connect to the database in SQL Dialect 1 and specifying UTF-8 as the character set of the connection: .. sourcecode:: python import fdb con = fdb.connect( dsn='bison:/temp/test.db', user='sysdba', password='pass', dialect=1, # necessary for all dialect 1 databases charset='UTF8' # specify a character set for the connection ) Executing SQL Statements ======================== For this section, suppose we have a table defined and populated by the following SQL code: .. sourcecode:: sql create table languages ( name varchar(20), year_released integer ); insert into languages (name, year_released) values ('C', 1972); insert into languages (name, year_released) values ('Python', 1991); **Example 1** This example shows the *simplest* way to print the entire contents of the `languages` table: .. sourcecode:: python import fdb con = fdb.connect(dsn='/temp/test.db', user='sysdba', password='masterkey') # Create a Cursor object that operates in the context of Connection con: cur = con.cursor() # Execute the SELECT statement: cur.execute("select * from languages order by year_released") # Retrieve all rows as a sequence and print that sequence: print cur.fetchall() Sample output: .. sourcecode:: python [('C', 1972), ('Python', 1991)] **Example 2** Here's another trivial example that demonstrates various ways of fetching a single row at a time from a `SELECT`-cursor: .. sourcecode:: python import fdb con = fdb.connect(dsn='/temp/test.db', user='sysdba', password='masterkey') cur = con.cursor() SELECT = "select name, year_released from languages order by year_released" # 1. Iterate over the rows available from the cursor, unpacking the # resulting sequences to yield their elements (name, year_released): cur.execute(SELECT) for (name, year_released) in cur: print '%s has been publicly available since %d.' % (name, year_released) # 2. Equivalently: cur.execute(SELECT) for row in cur: print '%s has been publicly available since %d.' % (row[0], row[1]) # 3. Using mapping-iteration rather than sequence-iteration: cur.execute(SELECT) for row in cur.itermap(): print '%(name)s has been publicly available since %(year_released)d.' % row Sample output: .. sourcecode:: python C has been publicly available since 1972. Python has been publicly available since 1991. C has been publicly available since 1972. Python has been publicly available since 1991. C has been publicly available since 1972. Python has been publicly available since 1991. **Example 3** The following program is a simplistic table printer (applied in this example to `languages`): .. sourcecode:: python import fdb TABLE_NAME = 'languages' SELECT = 'select * from %s order by year_released' % TABLE_NAME con = fdb.connect(dsn='/temp/test.db', user='sysdba', password='masterkey') cur = con.cursor() cur.execute(SELECT) # Print a header. for fieldDesc in cur.description: print fieldDesc[fdb.DESCRIPTION_NAME].ljust(fieldDesc[fdb.DESCRIPTION_DISPLAY_SIZE]) , print # Finish the header with a newline. print '-' * 78 # For each row, print the value of each field left-justified within # the maximum possible width of that field. fieldIndices = range(len(cur.description)) for row in cur: for fieldIndex in fieldIndices: fieldValue = str(row[fieldIndex]) fieldMaxWidth = cur.description[fieldIndex][fdb.DESCRIPTION_DISPLAY_SIZE] print fieldValue.ljust(fieldMaxWidth) , print # Finish the row with a newline. Sample output: .. sourcecode:: python NAME YEAR_RELEASED ------------------------------------------------------------------------------ C 1972 Python 1991 **Example 4** Let's insert more languages: .. sourcecode:: python import fdb con = fdb.connect(dsn='/temp/test.db', user='sysdba', password='masterkey') cur = con.cursor() newLanguages = [ ('Lisp', 1958), ('Dylan', 1995), ] cur.executemany("insert into languages (name, year_released) values (?, ?)", newLanguages ) # The changes will not be saved unless the transaction is committed explicitly: con.commit() Note the use of a *parameterized* SQL statement above. When dealing with repetitive statements, this is much faster and less error-prone than assembling each SQL statement manually. (You can read more about parameterized SQL statements in the section on :ref:`Prepared Statements `.) After running Example 4, the table printer from Example 3 would print: .. sourcecode:: python NAME YEAR_RELEASED ------------------------------------------------------------------------------ Lisp 1958 C 1972 Python 1991 Dylan 1995 Calling Stored Procedures ========================= Firebird supports stored procedures written in a proprietary procedural SQL language. Firebird stored procedures can have *input* parameters and/or *output* parameters. Some databases support *input/output* parameters, where the same parameter is used for both input and output; Firebird does not support this. It is important to distinguish between procedures that *return a result set* and procedures that *populate and return their output parameters exactly once*. Conceptually, the latter "return their output parameters" like a Python function, whereas the former "yield result rows" like a Python generator. Firebird's *server-side* procedural SQL syntax makes no such distinction, but *client-side* SQL code (and C API code) must. A result set is retrieved from a stored procedure by `SELECT`ing from the procedure, whereas output parameters are retrieved with an `EXECUTE PROCEDURE` statement. To *retrieve a result set* from a stored procedure with FDB, use code such as this: .. sourcecode:: python cur.execute("select output1, output2 from the_proc(?, ?)", (input1, input2)) # Ordinary fetch code here, such as: for row in cur: ... # process row con.commit() # If the procedure had any side effects, commit them. To *execute* a stored procedure and *access its output parameters*, use code such as this: .. sourcecode:: python cur.callproc("the_proc", (input1, input2)) # If there are output parameters, retrieve them as though they were the # first row of a result set. For example: outputParams = cur.fetchone() con.commit() # If the procedure had any side effects, commit them. This latter is not very elegant; it would be preferable to access the procedure's output parameters as the return value of `Cursor.callproc()`. The Python DB API specification requires the current behavior, however. fdb-1.4.9+dfsg1/sphinx/differences-from-kdb.txt0000644000215700017510000001232412431143162020212 0ustar rstuartit============================ Differences from KInterbasDB ============================ No need for initialization ========================== FDB doesn't support various configurations of automatic type translations like KDB, so it's no longer necessary to initialize the driver before any feature is used. Distributed transactions ======================== Support for :ref:`Distributed Transactions ` works slightly differently than in KDB. FDB uses :class:`~fdb.ConnectionGroup` class like KDB with the same interface, but DT is not bound to main transaction of individual connections managed by group. That means that :class:`~fdb.Cursor` instances obtained from :class:`~fdb.Connection` don't work in DT if connection is part of ConnectionGroup, but work normally in connection context. To get Cursor for specific connection that works in DT, use :meth:`fdb.ConnectionGroup.cursor()` method and pass the connection as parameter. We believe that this arrangement is more logical and flexible than KDB's way. Transaction context for cursor objects depends on how cursor is obtained/created: a) :meth:`fdb.Connection.cursor()` - Works in context of "main" transaction for connection. b) :meth:`fdb.Transaction.cursor()` - Works in context of this transaction. c) :meth:`fdb.ConnectionGroup.cursor()` - Works in context of Distributed Transaction Stream BLOBs ============ Firebird supports two types of BLOBs, stream and segmented. The database stores segmented BLOBs in chunks. Each chunk starts with a two byte length indicator followed by however many bytes of data were passed as a segment. Stream BLOBs are stored as a continuous array of data bytes with no length indicators included. Both types of BLOBs could be accessed by the same API functions, but only stream BLOBs support seek operation (via `isc_seek_blob function`). FDB implements stream BLOBs as file-like objects. On input, you can simply pass any file-like object (only 'read' method is required) as parameter value for BLOB column. For example: .. code-block:: python f = open('filename.ext', 'rb') cur.execute('insert into T (MyBLOB) values (?)',[f]) f.close() On output, stream BLOBs are represented by BlobReader instances on request. To request streamed access to BLOB, you have to use prepared statement for your query and call its `set_stream_blob(column_name)` method. Stream access is not allowed for cursors because cursors cache prepared statements internally, which would lead to dangerous situations (BlobReader life-time management) and anomalies (stream access when it's not required). Example: .. code-block:: python p = cursor.prep('select first 1 MyBLOB from T') p.set_stream_blob('MyBLOB') cur.execute(p) row = cur.fetchone() blob_reader = row[1] print blob_reader.readlines() blob_reader.close() Whenever you use stream access to BLOB, FDB opens or creates the underlying BLOB value as stream one. On input it means that true stream BLOB is created in database, but on output it depends on how BLOB value was actually created. If BLOB was created as stream one, you can use the seek method of BlobReader, but if it was created as regular BLOB, any call to seek will raise an error:: SQLCODE: -685 - invalid ARRAY or BLOB operation - invalid BLOB type for operation You can read BLOBs created as stream ones as fully materialized, and regular ones in stream mode (without seek) without any problems, and that same apply for input - you can create values in the same column as stream or regular ones interchangeably. From your point of view, stream BLOBs are just different interface to BLOB values, with single exception - `BlobReader.seek()` will throw an exception if you'd call it on BLOB value that was not created as stream BLOB. To work with stream BLOBs, you don't need to use `cursor.set_type_trans_in/out` methods like in KDB, i.e. calls to: .. code-block:: python cur.set_type_trans_in ({'BLOB': {'mode': 'stream'}}) cur.set_type_trans_out({'BLOB': {'mode': 'stream'}}) To write (create) stream BLOB value, simply pass file-like object as parameter to your INSERT/UPDATE statements where BLOB value is expected. To read BLOB value as stream, use prepared statement and register interest to get BlobReader instead fully materialized value via set_stream_blob() calls for each BLOB value (column name) you want to get this way. :class:`~fdb.BlobReader` supports iteration protocol, and read(), readline(), readlines(), seek(), tell(), flush() (as noop) and close() methods. It does NOT support chunks() method of KInterbasDB.BlobReader. It is not strictly necessary to close BlobReader instances explicitly. A BlobReader object will be automatically closed by its __del__ method when it goes out of scope, or when its Connection, PreparedStatement closes, whichever comes first. However, it is always a better idea to close resources explicitly (via try...finally) than to rely on artifacts of the Python implementation. You will also encounter errors if BLOB value was deleted from database before BlobReader is closed, so the odds that this may happen are higher if you do not close it explicitly. Services API ============ Support for Firebird Services was :ref:`completelly reworked ` in FDB. fdb-1.4.9+dfsg1/setup.py0000755000215700017510000000227412431143160013702 0ustar rstuartit#!/usr/bin/env python """fdb package is a set of Firebird RDBMS bindings for python. It works on Python 2.6+ and Python 3.x. """ from setuptools import setup, find_packages from fdb import __version__ classifiers = [ 'Development Status :: 5 - Production/Stable', 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Topic :: Database', ] setup(name='fdb', version=__version__, description = 'Firebird RDBMS bindings for Python.', url='http://www.firebirdsql.org/en/python-devel-status/', classifiers=classifiers, keywords=['Firebird'], license='BSD', author='Pavel Cisar', author_email='pcisar@users.sourceforge.net', long_description=__doc__, install_requires=[], setup_requires=[], packages=find_packages(exclude=['ez_setup']), test_suite='nose.collector', #include_package_data=True, package_data={'': ['*.txt'], 'test':'fbtest.fdb'}, #message_extractors={'fdb': [ #('**.py', 'python', None), #('public/**', 'ignore', None)]}, zip_safe=False, entry_points=""" """, ) fdb-1.4.9+dfsg1/PKG-INFO0000644000215700017510000000117112544565035013273 0ustar rstuartitMetadata-Version: 1.1 Name: fdb Version: 1.4.9 Summary: Firebird RDBMS bindings for Python. Home-page: http://www.firebirdsql.org/en/python-devel-status/ Author: Pavel Cisar Author-email: pcisar@users.sourceforge.net License: BSD Description: fdb package is a set of Firebird RDBMS bindings for python. It works on Python 2.6+ and Python 3.x. Keywords: Firebird Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Topic :: Database fdb-1.4.9+dfsg1/setup.cfg0000644000215700017510000000016012544565035014014 0ustar rstuartit[egg_info] tag_build = tag_date = 0 tag_svn_revision = 0 [build_sphinx] source-dir = sphinx all-files = True fdb-1.4.9+dfsg1/fdb.egg-info/0000755000215700017510000000000012544565035014423 5ustar rstuartitfdb-1.4.9+dfsg1/fdb.egg-info/not-zip-safe0000644000215700017510000000000112431143160016633 0ustar rstuartit fdb-1.4.9+dfsg1/fdb.egg-info/SOURCES.txt0000644000215700017510000000464212544565035016315 0ustar rstuartitLICENSE.TXT MANIFEST.in PKG-INFO README setup.cfg setup.py docs/.buildinfo docs/changelog.html docs/differences-from-kdb.html docs/genindex.html docs/getting-started.html docs/index.html docs/license.html docs/listinv.py docs/objects.inv docs/py-modindex.html docs/python-db-api-compliance.html docs/reference.html docs/search.html docs/searchindex.js docs/usage-guide.html docs/_sources/changelog.txt docs/_sources/differences-from-kdb.txt docs/_sources/getting-started.txt docs/_sources/index.txt docs/_sources/license.txt docs/_sources/python-db-api-compliance.txt docs/_sources/reference.txt docs/_sources/usage-guide.txt docs/_static/ajax-loader.gif docs/_static/basic.css docs/_static/comment-bright.png docs/_static/comment-close.png docs/_static/comment.png docs/_static/dialog-note.png docs/_static/dialog-seealso.png docs/_static/dialog-topic.png docs/_static/dialog-warning.png docs/_static/doctools.js docs/_static/down-pressed.png docs/_static/down.png docs/_static/epub.css docs/_static/fdbtheme.css docs/_static/file.png docs/_static/footerbg.png docs/_static/headerbg.png docs/_static/ie6.css docs/_static/jquery.js docs/_static/middlebg.png docs/_static/minus.png docs/_static/plus.png docs/_static/pygments.css docs/_static/searchtools.js docs/_static/transparent.gif docs/_static/underscore.js docs/_static/up-pressed.png docs/_static/up.png docs/_static/websupport.js fdb/__init__.py fdb/blr.py fdb/fbcore.py fdb/ibase.py fdb/monitor.py fdb/schema.py fdb/services.py fdb/utils.py fdb.egg-info/PKG-INFO fdb.egg-info/SOURCES.txt fdb.egg-info/dependency_links.txt fdb.egg-info/entry_points.txt fdb.egg-info/not-zip-safe fdb.egg-info/top_level.txt sphinx/Makefile sphinx/changelog.txt sphinx/conf.py sphinx/differences-from-kdb.txt sphinx/getting-started.txt sphinx/index.txt sphinx/license.txt sphinx/python-db-api-compliance.txt sphinx/reference.txt sphinx/requirements.txt sphinx/usage-guide.txt sphinx/fdbtheme/layout.html sphinx/fdbtheme/theme.conf sphinx/fdbtheme/static/dialog-note.png sphinx/fdbtheme/static/dialog-seealso.png sphinx/fdbtheme/static/dialog-topic.png sphinx/fdbtheme/static/dialog-warning.png sphinx/fdbtheme/static/epub.css sphinx/fdbtheme/static/fdbtheme.css_t sphinx/fdbtheme/static/footerbg.png sphinx/fdbtheme/static/headerbg.png sphinx/fdbtheme/static/ie6.css sphinx/fdbtheme/static/middlebg.png sphinx/fdbtheme/static/transparent.gif test/fbtest.fdb test/fbtest20.fdb test/fbtest21.fdb test/fbtest25.fdb test/testfdb.pyfdb-1.4.9+dfsg1/fdb.egg-info/PKG-INFO0000644000215700017510000000117112544565035015520 0ustar rstuartitMetadata-Version: 1.1 Name: fdb Version: 1.4.9 Summary: Firebird RDBMS bindings for Python. Home-page: http://www.firebirdsql.org/en/python-devel-status/ Author: Pavel Cisar Author-email: pcisar@users.sourceforge.net License: BSD Description: fdb package is a set of Firebird RDBMS bindings for python. It works on Python 2.6+ and Python 3.x. Keywords: Firebird Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Topic :: Database fdb-1.4.9+dfsg1/fdb.egg-info/dependency_links.txt0000644000215700017510000000000112544565035020471 0ustar rstuartit fdb-1.4.9+dfsg1/fdb.egg-info/entry_points.txt0000644000215700017510000000000512544565035017714 0ustar rstuartit fdb-1.4.9+dfsg1/fdb.egg-info/top_level.txt0000644000215700017510000000000412544565035017147 0ustar rstuartitfdb fdb-1.4.9+dfsg1/MANIFEST.in0000644000215700017510000000007312431143162013720 0ustar rstuartitinclude LICENSE.TXT include test/fbtest.fdb include docs/* fdb-1.4.9+dfsg1/README0000644000215700017510000000052212431143162013041 0ustar rstuartitFDB package is a set of Firebird RDBMS bindings for Python. It works on Python 2.6+ and Python 3.x. FDB is replacement for discontinued KInterbasDB library, and as such it's designed to be as much compatible with KInterbasDB as possible, but there are some differences. See FDB docuentation for full description of these differences. fdb-1.4.9+dfsg1/fdb/0000755000215700017510000000000012544565035012731 5ustar rstuartitfdb-1.4.9+dfsg1/fdb/__init__.py0000644000215700017510000002251212431143162015030 0ustar rstuartit#coding:utf-8 # # PROGRAM/MODULE: fdb # FILE: __init__.py # DESCRIPTION: Python driver for Firebird # CREATED: 8.10.2011 # # 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 Pavel Cisar # # Copyright (c) 2011 Pavel Cisar # and all contributors signed below. # # All Rights Reserved. # Contributor(s): ______________________________________. # # See LICENSE.TXT for details. from fdb.fbcore import * from fdb.fbcore import __version__ from fdb import services #from fdb import schema #from fdb import utils __all__ = (# Common with KInterbasDB 'BINARY', 'Binary', 'BlobReader', 'Connection', 'ConnectionGroup', 'Cursor', 'DATETIME', 'DBAPITypeObject', 'DESCRIPTION_DISPLAY_SIZE', 'DESCRIPTION_INTERNAL_SIZE', 'DESCRIPTION_NAME', 'DESCRIPTION_NULL_OK', 'DESCRIPTION_PRECISION', 'DESCRIPTION_SCALE', 'DESCRIPTION_TYPE_CODE', 'DIST_TRANS_MAX_DATABASES', 'DataError', 'DatabaseError', 'Date', 'DateFromTicks', 'Error', 'EventConduit', 'IntegrityError', 'InterfaceError', 'InternalError', 'NUMBER', 'NotSupportedError', 'OperationalError', 'PreparedStatement', 'ProgrammingError', 'ROWID', 'STRING', 'TPB', 'TableReservation', 'Time', 'TimeFromTicks', 'TimestampFromTicks', 'Transaction', 'TransactionConflict', 'Warning', '__version__', 'apilevel', 'connect', 'create_database', 'frb_info_att_charset', 'isc_dpb_activate_shadow', 'isc_dpb_address_path', 'isc_dpb_allocation', 'isc_dpb_begin_log', 'isc_dpb_buffer_length', 'isc_dpb_cache_manager', 'isc_dpb_cdd_pathname', 'isc_dpb_connect_timeout', 'isc_dpb_damaged', 'isc_dpb_dbkey_scope', 'isc_dpb_debug', 'isc_dpb_delete_shadow', 'isc_dpb_disable_journal', 'isc_dpb_disable_wal', 'isc_dpb_drop_walfile', 'isc_dpb_dummy_packet_interval', 'isc_dpb_enable_journal', 'isc_dpb_encrypt_key', 'isc_dpb_force_write', 'isc_dpb_garbage_collect', 'isc_dpb_gbak_attach', 'isc_dpb_gfix_attach', 'isc_dpb_gsec_attach', 'isc_dpb_gstat_attach', 'isc_dpb_interp', 'isc_dpb_journal', 'isc_dpb_lc_ctype', 'isc_dpb_lc_messages', 'isc_dpb_license', 'isc_dpb_no_garbage_collect', 'isc_dpb_no_reserve', 'isc_dpb_num_buffers', 'isc_dpb_number_of_users', 'isc_dpb_old_dump_id', 'isc_dpb_old_file', 'isc_dpb_old_file_size', 'isc_dpb_old_num_files', 'isc_dpb_old_start_file', 'isc_dpb_old_start_page', 'isc_dpb_old_start_seqno', 'isc_dpb_online', 'isc_dpb_online_dump', 'isc_dpb_overwrite', 'isc_dpb_page_size', 'isc_dpb_password', 'isc_dpb_password_enc', 'isc_dpb_quit_log', 'isc_dpb_reserved', 'isc_dpb_sec_attach', 'isc_dpb_set_db_charset', 'isc_dpb_set_db_readonly', 'isc_dpb_set_db_sql_dialect', 'isc_dpb_set_page_buffers', 'isc_dpb_shutdown', 'isc_dpb_shutdown_delay', 'isc_dpb_sql_dialect', 'isc_dpb_sql_role_name', 'isc_dpb_sweep', 'isc_dpb_sweep_interval', 'isc_dpb_sys_user_name', 'isc_dpb_sys_user_name_enc', 'isc_dpb_trace', 'isc_dpb_user_name', 'isc_dpb_verify', 'isc_dpb_version1', 'isc_dpb_wal_backup_dir', 'isc_dpb_wal_bufsize', 'isc_dpb_wal_chkptlen', 'isc_dpb_wal_grp_cmt_wait', 'isc_dpb_wal_numbufs', 'isc_dpb_working_directory', 'isc_info_active_tran_count', 'isc_info_active_transactions', 'isc_info_allocation', 'isc_info_attachment_id', 'isc_info_backout_count', 'isc_info_base_level', 'isc_info_bpage_errors', 'isc_info_creation_date', 'isc_info_cur_log_part_offset', 'isc_info_cur_logfile_name', 'isc_info_current_memory', 'isc_info_db_class', 'isc_info_db_id', 'isc_info_db_provider', 'isc_info_db_read_only', 'isc_info_db_size_in_pages', 'isc_info_db_sql_dialect', 'isc_info_delete_count', 'isc_info_dpage_errors', 'isc_info_expunge_count', 'isc_info_fetches', 'isc_info_firebird_version', 'isc_info_forced_writes', 'isc_info_implementation', 'isc_info_insert_count', 'isc_info_ipage_errors', 'isc_info_isc_version', 'isc_info_license', 'isc_info_limbo', 'isc_info_logfile', 'isc_info_marks', 'isc_info_max_memory', 'isc_info_next_transaction', 'isc_info_no_reserve', 'isc_info_num_buffers', 'isc_info_num_wal_buffers', 'isc_info_ods_minor_version', 'isc_info_ods_version', 'isc_info_oldest_active', 'isc_info_oldest_snapshot', 'isc_info_oldest_transaction', 'isc_info_page_errors', 'isc_info_page_size', 'isc_info_ppage_errors', 'isc_info_purge_count', 'isc_info_read_idx_count', 'isc_info_read_seq_count', 'isc_info_reads', 'isc_info_record_errors', 'isc_info_set_page_buffers', 'isc_info_sql_stmt_commit', 'isc_info_sql_stmt_ddl', 'isc_info_sql_stmt_delete', 'isc_info_sql_stmt_exec_procedure', 'isc_info_sql_stmt_get_segment', 'isc_info_sql_stmt_insert', 'isc_info_sql_stmt_put_segment', 'isc_info_sql_stmt_rollback', 'isc_info_sql_stmt_savepoint', 'isc_info_sql_stmt_select', 'isc_info_sql_stmt_select_for_upd', 'isc_info_sql_stmt_set_generator', 'isc_info_sql_stmt_start_trans', 'isc_info_sql_stmt_update', 'isc_info_sweep_interval', 'isc_info_tpage_errors', 'isc_info_tra_access', 'isc_info_tra_concurrency', 'isc_info_tra_consistency', 'isc_info_tra_id', 'isc_info_tra_isolation', 'isc_info_tra_lock_timeout', 'isc_info_tra_no_rec_version', 'isc_info_tra_oldest_active', 'isc_info_tra_oldest_interesting', 'isc_info_tra_oldest_snapshot', 'isc_info_tra_read_committed', 'isc_info_tra_readonly', 'isc_info_tra_readwrite', 'isc_info_tra_rec_version', 'isc_info_update_count', 'isc_info_user_names', 'isc_info_version', 'isc_info_wal_avg_grpc_size', 'isc_info_wal_avg_io_size', 'isc_info_wal_buffer_size', 'isc_info_wal_ckpt_length', 'isc_info_wal_cur_ckpt_interval', 'isc_info_wal_grpc_wait_usecs', 'isc_info_wal_num_commits', 'isc_info_wal_num_io', 'isc_info_wal_prv_ckpt_fname', 'isc_info_wal_prv_ckpt_poffset', 'isc_info_wal_recv_ckpt_fname', 'isc_info_wal_recv_ckpt_poffset', 'isc_info_window_turns', 'isc_info_writes', 'isc_tpb_autocommit', 'isc_tpb_commit_time', 'isc_tpb_concurrency', 'isc_tpb_consistency', 'isc_tpb_exclusive', 'isc_tpb_ignore_limbo', 'isc_tpb_lock_read', 'isc_tpb_lock_timeout', 'isc_tpb_lock_write', 'isc_tpb_no_auto_undo', 'isc_tpb_no_rec_version', 'isc_tpb_nowait', 'isc_tpb_protected', 'isc_tpb_read', 'isc_tpb_read_committed', 'isc_tpb_rec_version', 'isc_tpb_restart_requests', 'isc_tpb_shared', 'isc_tpb_verb_time', 'isc_tpb_version3', 'isc_tpb_wait', 'isc_tpb_write', 'paramstyle', 'threadsafety', # New in FDB 'ISOLATION_LEVEL_READ_COMMITED', 'ISOLATION_LEVEL_READ_COMMITED_LEGACY', 'ISOLATION_LEVEL_REPEATABLE_READ', 'ISOLATION_LEVEL_SERIALIZABLE', 'ISOLATION_LEVEL_SNAPSHOT', 'ISOLATION_LEVEL_SNAPSHOT_TABLE_STABILITY', 'ISOLATION_LEVEL_READ_COMMITED_RO', 'MAX_BLOB_SEGMENT_SIZE', 'SQL_ARRAY', 'SQL_BLOB', 'SQL_DOUBLE', 'SQL_D_FLOAT', 'SQL_FLOAT', 'SQL_INT64', 'SQL_LONG', 'SQL_QUAD', 'SQL_SHORT', 'SQL_TEXT', 'SQL_TIMESTAMP', 'SQL_TYPE_DATE', 'SQL_TYPE_TIME', 'SQL_VARYING', 'SUBTYPE_DECIMAL', 'SUBTYPE_NUMERIC', 'build_dpb', 'charset_map', 'isc_info_end', 'isc_sqlcode', 'bs', ) # Present in KDB but missing in FDB # 'BASELINE_TYPE_TRANSLATION_FACILITIES', # 'CT_COMMIT', 'CT_DEFAULT', 'CT_NONTRANSPARENT', 'CT_ROLLBACK', 'CT_VETO', # 'ConduitWasClosed', 'ConnectionTimedOut', 'DEFAULT_CONCURRENCY_LEVEL', # 'ExternallyVisibleMainTransaction', 'FB_API_VER', 'Timestamp', # '_ALL_EXCEPTION_CLASSES', '_CONNECTION_TIMEOUT_SUPPORTED', # '_Cursor_execute_exception_type_filter', '_DATABASE_INFO_CODES_WITH_COUNT_RESULTS', # '_DATABASE_INFO_CODES_WITH_INT_RESULT', '_DATABASE_INFO_CODES_WITH_TIMESTAMP_RESULT', # '_DATABASE_INFO__KNOWN_LOW_LEVEL_EXCEPTIONS', '_DPBBuilder', # '_DPB_CODES_WITH_STRING_VALUE', '_DPB_CODE_WITH_INT_VALUE', # '_EVENT_HANDLING_SUPPORTED', '_FS_ENCODING', '_MINIMAL_TYPE_TRANS_TYPES', # '_NORMAL_TYPE_TRANS_IN', '_NORMAL_TYPE_TRANS_OUT', '_OUT_TRANS_FUNC_SAMPLE_ARGS', # '_TRANSACTION_CONFLICT_RAW_CODES', # '__timestamp__', '_addDatabaseInfoCodeIfPresent', '_connection_timeout', # '_ensureInitialized', '_extractDatabaseInfoCounts', # '_guessTextualBlobEncodingWhenUsingFB20AndEarlier', '_k', '_kinterbasdb', # '_look_up_array_descriptor', '_look_up_array_subtype', # '_make_output_translator_return_type_dict_from_trans_dict', # '_normalizeDatabaseIdentifier', '_request_buffer_builder', '_trans_info', # '_trans_require_dict', '_validateTPB', 'default_tpb', 'get_concurrency_level', # 'init', 'initialized', 'k_exceptions', 'portable_int', 'raw_byte_to_int', # 'raw_timestamp_to_tuple']fdb-1.4.9+dfsg1/fdb/schema.py0000644000215700017510000046310012542466114014543 0ustar rstuartit#coding:utf-8 # # PROGRAM: fdb # MODULE: schema.py # DESCRIPTION: Database schema # CREATED: 10.5.2013 # # 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 Pavel Cisar # # Copyright (c) 2013 Pavel Cisar # and all contributors signed below. # # All Rights Reserved. # Contributor(s): ______________________________________. import sys import os import fdb #from . import fbcore as fdb from fdb.utils import LateBindingProperty import string import weakref from itertools import groupby # Firebird Field Types FBT_SMALLINT = 7 FBT_INTEGER = 8 FBT_QUAD = 9 FBT_FLOAT = 10 FBT_CHAR = 14 FBT_DOUBLE_PRECISION = 27 FBT_DATE = 35 FBT_VARCHAR = 37 FBT_CSTRING = 40 FBT_BLOB_ID = 45 FBT_BLOB = 261 FBT_SQL_DATE = 12 FBT_SQL_TIME = 13 FBT_SQL_TIMESTAMP = 35 FBT_BIGINT = 16 MAX_INTSUBTYPES = 2 MAX_BLOBSUBTYPES = 8 TRIGGER_TYPE_SHIFT = 13 TRIGGER_TYPE_MASK = (0x3 << TRIGGER_TYPE_SHIFT) TRIGGER_TYPE_DML = (0 << TRIGGER_TYPE_SHIFT) TRIGGER_TYPE_DB = (1 << TRIGGER_TYPE_SHIFT) COLUMN_TYPES = {FBT_SMALLINT: 'SMALLINT', FBT_INTEGER: 'INTEGER', FBT_QUAD: 'QUAD', FBT_FLOAT: 'FLOAT', FBT_CHAR: 'CHAR', FBT_DOUBLE_PRECISION: 'DOUBLE PRECISION', FBT_VARCHAR: 'VARCHAR', FBT_CSTRING: 'CSTRING', FBT_BLOB_ID: 'BLOB_ID', FBT_BLOB: 'BLOB', FBT_SQL_TIME: 'TIME', FBT_SQL_DATE: 'DATE', FBT_SQL_TIMESTAMP: 'TIMESTAMP', FBT_BIGINT: 'BIGINT' } INTEGRAL_SUBTYPES = ('UNKNOWN','NUMERIC','DECIMAL') BLOB_SUBTYPES = ('BINARY','TEXT','BLR','ACL','RANGES','SUMMARY', 'FORMAT','TRANSACTION_DESCRIPTION','EXTERNAL_FILE_DESCRIPTION') TRIGGER_PREFIX_TYPES = ['BEFORE','AFTER'] TRIGGER_SUFFIX_TYPES = ['','INSERT','UPDATE','DELETE'] TRIGGER_DB_TYPES = ['CONNECT','DISCONNECT','TRANSACTION START', 'TRANSACTION COMMIT','TRANSACTION ROLLBACK'] COLLATION_PAD_SPACE = 1 COLLATION_CASE_INSENSITIVE = 2 COLLATION_ACCENT_INSENSITIVE = 4 INDEX_TYPE_ASCENDING = 'ASCENDING' INDEX_TYPE_DESCENDING = 'DESCENDING' INDEX_TYPES = [INDEX_TYPE_ASCENDING,INDEX_TYPE_DESCENDING] RELATION_TYPE_TABLE = 0 RELATION_TYPE_VIEW = 1 RELATION_TYPE_GTT = 5 RELATION_TYPE_GTT_PRESERVE = 4 PROCPAR_DATATYPE = 0 PROCPAR_DOMAIN = 1 PROCPAR_TYPE_OF_DOMAIN = 2 PROCPAR_TYPE_OF_COLUMN = 3 #--- Functions def get_grants(privileges,grantors=None): """Get list of minimal set of SQL GRANT statamenets necessary to grant specified privileges. :param list privileges: List of :class:`Privilege` instances. :param list grantors: List of standard grantor names. Generates GRANTED BY clause for privileges granted by user that's not in list. """ tp = {'S':'SELECT','I':'INSERT','U':'UPDATE','D':'DELETE','R':'REFERENCES'} def skey(item): return (item.user_name,item.user_type,item.grantor_name, item.subject_name,item.subject_type,item.has_grant(), item.privilege in tp,item.privilege, str(item.field_name),) def gkey(item): return (item.user_name,item.user_type,item.grantor_name, item.subject_name,item.subject_type,item.has_grant(), item.privilege in tp,) def gkey2(item): return item.privilege grants = [] p = list(privileges) p.sort(key=skey) for k, g in groupby(p,gkey): g = list(g) item = g[0] if item.has_grant(): admin_option = ' WITH %s OPTION' % ('ADMIN' if item.privilege == 'M' else 'GRANT') else: admin_option = '' uname = item.user_name user = item.user if isinstance(user,Procedure): utype = 'PROCEDURE ' elif isinstance(user,Trigger): utype = 'TRIGGER ' elif isinstance(user,View): utype = 'VIEW ' else: utype = '' sname = item.subject_name if (grantors is not None) and (item.grantor_name not in grantors): granted_by = ' GRANTED BY %s' % item.grantor_name else: granted_by = '' priv_list = [] for k,items in groupby(g,gkey2): items = list(items) item = items[0] if item.privilege in tp: privilege = tp[item.privilege] if len(items) > 1: privilege += '(%s)' % ','.join(i.field_name for i in items if i.field_name) elif item.field_name is not None: privilege += '(%s)' % item.field_name priv_list.append(privilege) elif item.privilege == 'X': # procedure privilege = 'EXECUTE ON PROCEDURE ' else: # role membership privilege = '' if priv_list: privilege = ', '.join(priv_list) privilege += ' ON ' grants.append('GRANT %s%s TO %s%s%s%s' % (privilege,sname,utype, uname,admin_option,granted_by)) return grants def isKeyword(ident): "Returns True if `ident` is Firebird keyword." return ident in ['ABS','ACCENT','ACOS','ACTION','ACTIVE','ADD','ADMIN', 'AFTER','ALL','ALTER','ALWAYS','AND','ANY','AS','ASC', 'ASCENDING','ASCII_CHAR','ASCII_VAL','ASIN','AT','ATAN', 'ATAN2','AUTO','AUTONOMOUS','AVG','BACKUP','BEFORE', 'BEGIN','BETWEEN','BIGINT','BIN_AND','BIN_NOT','BIN_OR', 'BIN_SHL','BIN_SHR','BIN_XOR','BIT_LENGTH','BLOB','BLOCK', 'BOTH','BREAK','BY','CALLER','CASCADE','CASE','CAST', 'CEIL','CEILING','CHAR','CHAR_LENGTH','CHAR_TO_UUID', 'CHARACTER','CHARACTER_LENGTH','CHECK','CLOSE','COALESCE', 'COLLATE','COLLATION','COLUMN','COMMENT','COMMIT', 'COMMITTED','COMMON','COMPUTED','CONDITIONAL','CONNECT', 'CONSTRAINT','CONTAINING','COS','COSH','COT','COUNT', 'CREATE','CROSS','CSTRING','CURRENT','CURRENT_CONNECTION', 'CURRENT_DATE','CURRENT_ROLE','CURRENT_TIME', 'CURRENT_TIMESTAMP','CURRENT_TRANSACTION','CURRENT_USER', 'CURSOR','DATA','DATABASE','DATE','DATEADD','DATEDIFF', 'DAY','DEC','DECIMAL','DECLARE','DECODE','DEFAULT', 'DELETE','DELETING','DESC','DESCENDING','DESCRIPTOR', 'DIFFERENCE','DISCONNECT','DISTINCT','DO','DOMAIN', 'DOUBLE','DROP','ELSE','END','ENTRY_POINT','ESCAPE', 'EXCEPTION','EXECUTE','EXISTS','EXIT','EXP','EXTERNAL', 'EXTRACT','FETCH','FILE','FILTER','FIRST','FIRSTNAME', 'FLOAT','FLOOR','FOR','FOREIGN','FREE_IT','FROM','FULL', 'FUNCTION','GDSCODE','GEN_ID','GEN_UUID','GENERATED', 'GENERATOR','GLOBAL','GRANT','GRANTED','GROUP','HASH', 'HAVING','HOUR','IF','IGNORE','IIF','IN','INACTIVE', 'INDEX','INNER','INPUT_TYPE','INSENSITIVE','INSERT', 'INSERTING','INT','INTEGER','INTO','IS','ISOLATION','JOIN', 'KEY','LAST','LASTNAME','LEADING','LEAVE','LEFT','LENGTH', 'LEVEL','LIKE','LIMBO','LIST','LN','LOCK','LOG','LOG10', 'LONG','LOWER','LPAD','MANUAL','MAPPING','MATCHED', 'MATCHING','MAX','MAXIMUM_SEGMENT','MAXVALUE','MERGE', 'MIDDLENAME','MILLISECOND','MIN','MINUTE','MINVALUE','MOD', 'MODULE_NAME','MONTH','NAMES','NATIONAL','NATURAL','NCHAR', 'NEXT','NO','NOT','NULL','NULLIF','NULLS','NUMERIC', 'OCTET_LENGTH','OF','ON','ONLY','OPEN','OPTION','OR', 'ORDER','OS_NAME','OUTER','OUTPUT_TYPE','OVERFLOW', 'OVERLAY','PAD','PAGE','PAGE_SIZE','PAGES','PARAMETER', 'PASSWORD','PI','PLACING','PLAN','POSITION','POST_EVENT', 'POWER','PRECISION','PRESERVE','PRIMARY','PRIVILEGES', 'PROCEDURE','PROTECTED','RAND','RDB$DB_KEY','READ','REAL', 'RECORD_VERSION','RECREATE','RECURSIVE','REFERENCES', 'RELEASE','REPLACE','REQUESTS','RESERV','RESERVING', 'RESTART','RESTRICT','RETAIN','RETURNING','RETURNING_VALUES', 'RETURNS','REVERSE','REVOKE','RIGHT','ROLE','ROLLBACK', 'ROUND','ROW_COUNT','ROWS','RPAD','SAVEPOINT','SCALAR_ARRAY', 'SCHEMA','SECOND','SEGMENT','SELECT','SENSITIVE','SEQUENCE', 'SET','SHADOW','SHARED','SIGN','SIMILAR','SIN','SINGULAR', 'SINH','SIZE','SKIP','SMALLINT','SNAPSHOT','SOME','SORT', 'SOURCE','SPACE','SQLCODE','SQLSTATE','SQRT','STABILITY', 'START','STARTING','STARTS','STATEMENT','STATISTICS', 'SUB_TYPE','SUBSTRING','SUM','SUSPEND','TABLE','TAN','TANH', 'TEMPORARY','THEN','TIME','TIMEOUT','TIMESTAMP','TO', 'TRAILING','TRANSACTION','TRIGGER','TRIM','TRUNC','TWO_PHASE', 'TYPE','UNCOMMITTED','UNDO','UNION','UNIQUE','UPDATE', 'UPDATING','UPPER','USER','USING','UUID_TO_CHAR','VALUE', 'VALUES','VARCHAR','VARIABLE','VARYING','VIEW','WAIT','WEEK', 'WEEKDAY','WHEN','WHERE','WHILE','WITH','WORK','WRITE', 'YEAR','YEARDAY'] def escape_single_quotes(text): return text.replace("'","''") #--- Exceptions #--- Classes class Schema(object): """This class represents database schema. """ #: Datatype declaration methods for procedure parameters: key = numID, value = name enum_param_type_from = {PROCPAR_DATATYPE: 'DATATYPE', PROCPAR_DOMAIN: 'DOMAIN', PROCPAR_TYPE_OF_DOMAIN: 'TYPE OF DOMAIN', PROCPAR_TYPE_OF_COLUMN: 'TYPE OF COLUMN'} #: Object types: key = numID, value = type_name enum_object_types = dict() #: Object type codes: key = type_name, value = numID enum_object_type_codes = dict() #: Character set names: key = numID, value = charset_name enum_character_set_names = dict() #: Field types: key = numID, value = type_name enum_field_types = dict() #: Field sub types: key = numID, value = type_name enum_field_subtypes = dict() #: Function types: key = numID, value = type_name enum_function_types = dict() #: Mechanism Types: key = numID, value = type_name enum_mechanism_types = dict() #: Parameter Mechanism Types: key = numID, value = type_name enum_parameter_mechanism_types = dict() #: Procedure Types: key = numID, value = type_name enum_procedure_types = dict() #: Relation Types: key = numID, value = type_name enum_relation_types = dict() #: System Flag Types: key = numID, value = type_name enum_system_flag_types = dict() #: Transaction State Types: key = numID, value = type_name enum_transaction_state_types = dict() #: Trigger Types: key = numID, value = type_name enum_trigger_types = dict() #: option switch: Always quote db object names on output opt_always_quote = False def __init__(self): self._con = None self._ic = None self.__internal = False def __del__(self): if not self.closed: self._close() def __get_closed(self): return self._con is None def __fail_if_closed(self): if self.closed: raise fdb.ProgrammingError("Schema is not binded to connection.") def _close(self): self._ic.close() self._con = None self._ic = None def _set_as_internal(self): """Mark this instance as `internal` (embedded). This blocks calls to :meth:`bind` and :meth:`close`.""" self.__internal = True self._con = weakref.proxy(self._con) def __object_by_name(self,list,name): if name is None: return None for o in list: if o.name == name: return o return None def __clear(self,data=None): if data: data = data.lower() if data not in ['tables','view','domains','indices','dependencies', 'generators','sequences','triggers','procedures', 'constraints','collations','character sets', 'exceptions','roles','functions','files','shadows', 'privileges','users']: raise fdb.ProgrammingError("Unknown metadata category '%s'" % data) if (not data or data == 'tables'): self.__tables = None if (not data or data == 'views'): self.__views = None if (not data or data == 'domains'): self.__domains = None if (not data or data == 'indices'): self.__indices = None self.__constraint_indices = None if (not data or data == 'dependencies'): self.__dependencies = None if (not data or data in ['generators','sequences']): self.__generators = None if (not data or data == 'triggers'): self.__triggers = None if (not data or data == 'procedures'): self.__procedures = None if (not data or data == 'constraints'): self.__constraints = None if (not data or data == 'collations'): self.__collations = None if (not data or data == 'character sets'): self.__character_sets = None if (not data or data == 'exceptions'): self.__exceptions = None if (not data or data == 'roles'): self.__roles = None if (not data or data == 'functions'): self.__functions = None if (not data or data == 'files'): self.__files = None if (not data or data == 'shadows'): self.__shadows = None if (not data or data == 'privileges'): self.__privileges = None if (not data or data == 'users'): self.__users = None #--- protected def _select_row(self,cmd,params=None): if params: self._ic.execute(cmd,params) else: self._ic.execute(cmd) return self._ic.fetchonemap() def _select(self,cmd,params=None): if params: self._ic.execute(cmd,params) else: self._ic.execute(cmd) return self._ic.itermap() def _get_field_dimensions(self,field): return [(r[0],r[1]) for r in self._ic.execute("""SELECT r.RDB$LOWER_BOUND, r.RDB$UPPER_BOUND FROM RDB$FIELD_DIMENSIONS r where r.RDB$FIELD_NAME = '%s' order by r.RDB$DIMENSION""" % field.name)] def _get_item(self,name,itype,subname=None): if itype == 0: # Relation return self.get_table(name) elif itype == 1: # View return self.get_view(name) elif itype == 2: # Trigger return self.get_trigger(name) elif itype == 5: # Procedure return self.get_procedure(name) elif itype == 8: # User result = self.__object_by_name(self._get_users(),name) if not result: result = fdb.services.User(name) self.__users.append(result) return result elif itype == 9: # Field return self.get_table(name).get_column(subname) elif itype == 10: # Index return self.get_index(name) elif itype == 13: # Role return self.get_role(name) elif itype == 14: # Generator return self.get_sequence(name) elif itype == 15: # UDF return self.get_function(name) elif itype == 17: # Collation return self.get_collation(name) else: raise fdb.ProgrammingError('Unsupported subject type') #--- special attribute access methods def _get_description(self): return self.__description def _get_default_character_set(self): return self.get_character_set(self._default_charset_name) def _get_owner_name(self): return self.__owner def _get_security_class(self): return self.__security_class def _get_collations(self): if self.__collations is None: self.__fail_if_closed() self._ic.execute("select * from rdb$collations") self.__collations = [Collation(self,row) for row in self._ic.itermap()] return self.__collations def _get_character_sets(self): if self.__character_sets is None: self.__fail_if_closed() self._ic.execute("select * from rdb$character_sets") self.__character_sets = [CharacterSet(self,row) for row in self._ic.itermap()] return self.__character_sets def _get_exceptions(self): if self.__exceptions is None: self.__fail_if_closed() self._ic.execute("select * from rdb$exceptions") self.__exceptions = [DatabaseException(self,row) for row in self._ic.itermap()] return self.__exceptions def _get_all_domains(self): if self.__domains is None: self.__fail_if_closed() self._ic.execute("""select RDB$FIELD_NAME, RDB$VALIDATION_SOURCE, RDB$COMPUTED_SOURCE, RDB$DEFAULT_SOURCE, RDB$FIELD_LENGTH, RDB$FIELD_SCALE, RDB$FIELD_TYPE, RDB$FIELD_SUB_TYPE, RDB$DESCRIPTION, RDB$SYSTEM_FLAG, RDB$SEGMENT_LENGTH, RDB$EXTERNAL_LENGTH, RDB$EXTERNAL_SCALE, RDB$EXTERNAL_TYPE, RDB$DIMENSIONS, RDB$NULL_FLAG, RDB$CHARACTER_LENGTH, RDB$COLLATION_ID, RDB$CHARACTER_SET_ID, RDB$FIELD_PRECISION from RDB$FIELDS""") self.__domains = [Domain(self,row) for row in self._ic.itermap()] return self.__domains def _get_domains(self): return [d for d in self._get_all_domains() if not d.issystemobject()] def _get_sysdomains(self): return [d for d in self._get_all_domains() if d.issystemobject()] def _get_all_tables(self): if self.__tables is None: self.__fail_if_closed() self._ic.execute("select * from rdb$relations where rdb$view_blr is null") self.__tables = [Table(self,row) for row in self._ic.itermap()] return self.__tables def _get_tables(self): return [t for t in self._get_all_tables() if not t.issystemobject()] def _get_systables(self): return [t for t in self._get_all_tables() if t.issystemobject()] def _get_all_views(self): if self.__views is None: self.__fail_if_closed() self._ic.execute("select * from rdb$relations where rdb$view_blr is not null") self.__views = [View(self,row) for row in self._ic.itermap()] return self.__views def _get_views(self): return [v for v in self._get_all_views() if not v.issystemobject()] def _get_sysviews(self): return [v for v in self._get_all_views() if v.issystemobject()] def _get_constraint_indices(self): if self.__constraint_indices is None: self.__fail_if_closed() self._ic.execute("""select RDB$INDEX_NAME, RDB$CONSTRAINT_NAME from RDB$RELATION_CONSTRAINTS where RDB$INDEX_NAME is not null""") self.__constraint_indices = dict([(key.strip(),value.strip()) for key, value in self._ic]) return self.__constraint_indices def _get_all_indices(self): if self.__indices is None: self.__fail_if_closed() # Dummy call to _get_constraint_indices() is necessary as # Index.issystemobject() that is called in Index.__init__() will # drop result from internal cursor and we'll not load all indices. self._get_constraint_indices() self._ic.execute("""select RDB$INDEX_NAME, RDB$RELATION_NAME, RDB$INDEX_ID, RDB$UNIQUE_FLAG, RDB$DESCRIPTION, RDB$SEGMENT_COUNT, RDB$INDEX_INACTIVE, RDB$INDEX_TYPE, RDB$FOREIGN_KEY, RDB$SYSTEM_FLAG, RDB$EXPRESSION_SOURCE, RDB$STATISTICS from RDB$INDICES""") self.__indices = [Index(self,row) for row in self._ic.itermap()] return self.__indices def _get_indices(self): return [i for i in self._get_all_indices() if not i.issystemobject()] def _get_sysindices(self): return [i for i in self._get_all_indices() if i.issystemobject()] def _get_all_generators(self): if self.__generators is None: self.__fail_if_closed() self._ic.execute("select * from rdb$generators") self.__generators = [Sequence(self,row) for row in self._ic.itermap()] return self.__generators def _get_generators(self): return [g for g in self._get_all_generators() if not g.issystemobject()] def _get_sysgenerators(self): return [g for g in self._get_all_generators() if g.issystemobject()] def _get_all_triggers(self): if self.__triggers is None: self.__fail_if_closed() self._ic.execute("""select RDB$TRIGGER_NAME, RDB$RELATION_NAME, RDB$TRIGGER_SEQUENCE, RDB$TRIGGER_TYPE, RDB$TRIGGER_SOURCE, RDB$DESCRIPTION, RDB$TRIGGER_INACTIVE, RDB$SYSTEM_FLAG, RDB$FLAGS from RDB$TRIGGERS""") self.__triggers = [Trigger(self,row) for row in self._ic.itermap()] return self.__triggers def _get_triggers(self): return [g for g in self._get_all_triggers() if not g.issystemobject()] def _get_systriggers(self): return [g for g in self._get_all_triggers() if g.issystemobject()] def _get_all_procedures(self): if self.__procedures is None: self.__fail_if_closed() cols = ['RDB$PROCEDURE_NAME', 'RDB$PROCEDURE_ID', 'RDB$PROCEDURE_INPUTS', 'RDB$PROCEDURE_OUTPUTS', 'RDB$DESCRIPTION', 'RDB$PROCEDURE_SOURCE', 'RDB$SECURITY_CLASS', 'RDB$OWNER_NAME', 'RDB$SYSTEM_FLAG'] if self._con.ods >= fdb.ODS_FB_21: cols.extend(['RDB$PROCEDURE_TYPE','RDB$VALID_BLR']) self._ic.execute("select %s from rdb$procedures" % ','.join(cols)) self.__procedures = [Procedure(self,row) for row in self._ic.itermap()] return self.__procedures def _get_procedures(self): return [p for p in self._get_all_procedures() if not p.issystemobject()] def _get_sysprocedures(self): return [p for p in self._get_all_procedures() if p.issystemobject()] def _get_constraints(self): if self.__constraints is None: self.__fail_if_closed() # Dummy call to _get_all_tables() is necessary as # Constraint.issystemobject() that is called in Constraint.__init__() # will drop result from internal cursor and we'll not load all constraints. self._get_all_tables() self._ic.execute("""select * from rdb$relation_constraints C left outer join rdb$ref_constraints R on C.rdb$constraint_name = R.rdb$constraint_name left outer join rdb$check_constraints K on C.rdb$constraint_name = K.rdb$constraint_name""") self.__constraints = [Constraint(self,row) for row in self._ic.itermap()] # Check constrains need special care because they're doubled # (select above returns two records for them with different trigger names) checks = [c for c in self.__constraints if c.ischeck()] self.__constraints = [c for c in self.__constraints if not c.ischeck()] dchecks = {} for check in checks: dchecks.setdefault(check.name,list()).append(check) for checklist in dchecks.values(): names = [c._attributes['RDB$TRIGGER_NAME'] for c in checklist] check = checklist[0] check._attributes['RDB$TRIGGER_NAME'] = names self.__constraints.append(check) return self.__constraints def _get_roles(self): if self.__roles is None: self.__fail_if_closed() self._ic.execute("select * from rdb$roles") self.__roles = [Role(self,row) for row in self._ic.itermap()] return self.__roles def _get_dependencies(self): if self.__dependencies is None: self.__fail_if_closed() self._ic.execute("select * from rdb$dependencies") self.__dependencies = [Dependency(self,row) for row in self._ic.itermap()] return self.__dependencies def _get_all_functions(self): if self.__functions is None: self.__fail_if_closed() self._ic.execute("""select RDB$FUNCTION_NAME, RDB$FUNCTION_TYPE, RDB$DESCRIPTION, RDB$MODULE_NAME, RDB$ENTRYPOINT, RDB$RETURN_ARGUMENT, RDB$SYSTEM_FLAG from rdb$functions""") self.__functions = [Function(self,row) for row in self._ic.itermap()] return self.__functions def _get_functions(self): return [p for p in self._get_all_functions() if not p.issystemobject()] def _get_sysfunctions(self): return [p for p in self._get_all_functions() if p.issystemobject()] def _get_files(self): if self.__files is None: self.__fail_if_closed() self._ic.execute("""select RDB$FILE_NAME, RDB$FILE_SEQUENCE, RDB$FILE_START, RDB$FILE_LENGTH from RDB$FILES where RDB$SHADOW_NUMBER = 0 order by RDB$FILE_SEQUENCE""") self.__files = [DatabaseFile(self,row) for row in self._ic.itermap()] return self.__files def _get_shadows(self): if self.__shadows is None: self.__fail_if_closed() self._ic.execute("""select RDB$FILE_FLAGS, RDB$SHADOW_NUMBER from RDB$FILES where RDB$SHADOW_NUMBER > 0 AND RDB$FILE_SEQUENCE = 0 order by RDB$SHADOW_NUMBER""") self.__shadows = [Shadow(self,row) for row in self._ic.itermap()] return self.__shadows def _get_privileges(self): if self.__privileges is None: self.__fail_if_closed() self._ic.execute("""select RDB$USER, RDB$GRANTOR, RDB$PRIVILEGE, RDB$GRANT_OPTION, RDB$RELATION_NAME, RDB$FIELD_NAME, RDB$USER_TYPE, RDB$OBJECT_TYPE FROM RDB$USER_PRIVILEGES""") self.__privileges = [Privilege(self,row) for row in self._ic.itermap()] return self.__privileges def _get_users(self): if self.__users is None: self.__fail_if_closed() self._ic.execute("select distinct(RDB$USER) FROM RDB$USER_PRIVILEGES") self.__users = [fdb.services.User(row[0].strip()) for row in self._ic] return self.__users #--- Properties #: True if link to :class:`~fdb.Connection` is closed. closed = property(__get_closed) description = LateBindingProperty(_get_description,None,None, "Database description or None if it doesn't have a description.") owner_name = LateBindingProperty(_get_owner_name,None,None, "Database owner name.") default_character_set = LateBindingProperty(_get_default_character_set,None,None, "Default :class:`CharacterSet` for database") security_class = LateBindingProperty(_get_security_class,None,None, "Can refer to the security class applied as databasewide access control limits.") collations = LateBindingProperty(_get_collations,None,None, "List of all collations in database.\nItems are :class:`Collation` objects.") character_sets = LateBindingProperty(_get_character_sets,None,None, "List of all character sets in database.\nItems are :class:`CharacterSet` objects.") exceptions = LateBindingProperty(_get_exceptions,None,None, "List of all exceptions in database.\nItems are :class:`DatabaseException` objects.") generators = LateBindingProperty(_get_generators,None,None, "List of all user generators in database.\nItems are :class:`Sequence` objects.") sysgenerators = LateBindingProperty(_get_sysgenerators,None,None, "List of all system generators in database.\nItems are :class:`Sequence` objects.") sequences = LateBindingProperty(_get_generators,None,None, "List of all user generators in database.\nItems are :class:`Sequence` objects.") syssequences = LateBindingProperty(_get_sysgenerators,None,None, "List of all system generators in database.\nItems are :class:`Sequence` objects.") domains = LateBindingProperty(_get_domains,None,None, "List of all user domains in database.\nItems are :class:`Domain` objects.") sysdomains = LateBindingProperty(_get_sysdomains,None,None, "List of all system domains in database.\nItems are :class:`Domain` objects.") indices = LateBindingProperty(_get_indices,None,None, "List of all user indices in database.\nItems are :class:`Index` objects.") sysindices = LateBindingProperty(_get_sysindices,None,None, "List of all system indices in database.\nItems are :class:`Index` objects.") tables = LateBindingProperty(_get_tables,None,None, "List of all user tables in database.\nItems are :class:`Table` objects.") systables = LateBindingProperty(_get_systables,None,None, "List of all system tables in database.\nItems are :class:`Table` objects.") views = LateBindingProperty(_get_views,None,None, "List of all user views in database.\nItems are :class:`View` objects.") sysviews = LateBindingProperty(_get_sysviews,None,None, "List of all system views in database.\nItems are :class:`View` objects.") triggers = LateBindingProperty(_get_triggers,None,None, "List of all user triggers in database.\nItems are :class:`Trigger` objects.") systriggers = LateBindingProperty(_get_systriggers,None,None, "List of all system triggers in database.\nItems are :class:`Trigger` objects.") procedures = LateBindingProperty(_get_procedures,None,None, "List of all user procedures in database.\nItems are :class:`Procedure` objects.") sysprocedures = LateBindingProperty(_get_sysprocedures,None,None, "List of all system procedures in database.\nItems are :class:`Procedure` objects.") constraints = LateBindingProperty(_get_constraints,None,None, "List of all constraints in database.\nItems are :class:`Constraint` objects.") roles = LateBindingProperty(_get_roles,None,None, "List of all roles in database.\nItems are :class:`Role` objects.") dependencies = LateBindingProperty(_get_dependencies,None,None, "List of all dependencies in database.\nItems are :class:`Dependency` objects.") functions = LateBindingProperty(_get_functions,None,None, "List of all user functions defined in database.\nItems are :class:`Function` objects.") sysfunctions = LateBindingProperty(_get_sysfunctions,None,None, "List of all system functions defined in database.\nItems are :class:`Function` objects.") files = LateBindingProperty(_get_files,None,None, "List of all extension files defined for database.\nItems are :class:`DatabaseFile` objects.") shadows = LateBindingProperty(_get_shadows,None,None, "List of all shadows defined for database.\nItems are :class:`Shadow` objects.") privileges = LateBindingProperty(_get_privileges,None,None, "List of all privileges defined for database.\nItems are :class:`Privilege` objects.") #--- Public def bind(self, connection): """Bind this instance to specified :class:`~fdb.Connection`. :param connection: :class:`~fdb.Connection` instance. :raises ProgrammingError: If Schema object was set as internal (via :meth:`_set_as_internal`). """ if self.__internal: raise fdb.ProgrammingError("Call to 'bind' not allowed for embedded Schema.") if self._con: self.close() self._con = connection self._ic = self._con.query_transaction.cursor() self.__clear() self._ic.execute('select * from RDB$DATABASE') row = self._ic.fetchonemap() self.__description = row['RDB$DESCRIPTION'] self._default_charset_name = row['RDB$CHARACTER_SET_NAME'].strip() self.__security_class = row['RDB$SECURITY_CLASS'] if self.__security_class: self.__security_class = self.__security_class.strip() self._ic.execute("select RDB$OWNER_NAME from RDB$RELATIONS where RDB$RELATION_NAME = 'RDB$DATABASE'") self.__owner = self._ic.fetchone()[0].strip() # Load enumerate types defined in RDB$TYPES table enum_select = 'select RDB$TYPE, RDB$TYPE_NAME from RDB$TYPES where RDB$FIELD_NAME = ?' def enum_dict(enum_type): return dict((key,value.strip()) for key, value in self._ic.execute(enum_select,(enum_type,))) # Object types self.enum_object_types = enum_dict('RDB$OBJECT_TYPE') # Object type codes self.enum_object_type_codes = dict(((value,key) for key,value in self.enum_object_types.items())) # Character set names self.enum_character_set_names = enum_dict('RDB$CHARACTER_SET_NAME') # Field types self.enum_field_types = enum_dict('RDB$FIELD_TYPE') # Field sub types self.enum_field_subtypes = enum_dict('RDB$FIELD_SUB_TYPE') # Function types self.enum_function_types = enum_dict('RDB$FUNCTION_TYPE') # Mechanism Types self.enum_mechanism_types = enum_dict('RDB$MECHANISM') # Parameter Mechanism Types self.enum_parameter_mechanism_types = enum_dict('RDB$PARAMETER_MECHANISM') # Procedure Types self.enum_procedure_types = enum_dict('RDB$PROCEDURE_TYPE') if not self.enum_procedure_types: self.enum_procedure_types = {0: 'LEGACY', 1: 'SELECTABLE', 2: 'EXECUTABLE'} # Relation Types self.enum_relation_types = enum_dict('RDB$RELATION_TYPE') # System Flag Types self.enum_system_flag_types = enum_dict('RDB$SYSTEM_FLAG') # Transaction State Types self.enum_transaction_state_types = enum_dict('RDB$TRANSACTION_STATE') # Trigger Types self.enum_trigger_types = enum_dict('RDB$TRIGGER_TYPE') def close(self): """Sever link to :class:`~fdb.Connection`. :raises ProgrammingError: If Schema object was set as internal (via :meth:`_set_as_internal`). """ if self.__internal: raise fdb.ProgrammingError("Call to 'close' not allowed for embedded Schema.") self._close() self.__clear() def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitSchema(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitSchema(self) #--- Basic Database manipulation routines def clear(self): "Drop all cached metadata objects." self.__clear() def reload(self,data=None): """Drop all or specified category of cached metadata objects, so they're reloaded from database on next reference. :param string data: `None` or name of metadata category. Recognized (case insensitive) names of metadata categories: - tables - views - domain - indices - dependencies - generators - sequences - triggers - procedures - constraints - collations - character sets - exceptions - roles - functions - files - shadows - privileges - users :raises ProgrammingError: For undefined metadata category. .. note:: Also commits query transaction. """ self.__clear(data) if not self.closed: self._ic.transaction.commit() def ismultifile(self): "Returns true if database has multiple files." return len(self.files) > 0 def get_collation(self,name): """Get :class:`Collation` by name. :param string name: Collation name. :returns: :class:`Collation` with specified name or `None`. """ return self.__object_by_name(self._get_collations(),name) def get_character_set(self,name): """Get :class:`CharacterSet` by name. :param string name: Character set name. :returns: :class:`CharacterSet` with specified name or `None`. """ return self.__object_by_name(self._get_character_sets(),name) def get_exception(self,name): """Get :class:`DatabaseException` by name. :param string name: Exception name. :returns: :class:`DatabaseException` with specified name or `None`. """ return self.__object_by_name(self._get_exceptions(),name) def get_generator(self,name): """Get :class:`Sequence` by name. :param string name: Sequence name. :returns: :class:`Sequence` with specified name or `None`. """ return self.__object_by_name(self._get_all_generators(),name) get_sequence = get_generator def get_index(self,name): """Get :class:`Index` by name. :param string name: Index name. :returns: :class:`Index` with specified name or `None`. """ return self.__object_by_name(self._get_all_indices(),name) def get_domain(self,name): """Get :class:`Domain` by name. :param string name: Domain name. :returns: :class:`Domain` with specified name or `None`. """ return self.__object_by_name(self._get_all_domains(),name) def get_table(self,name): """Get :class:`Table` by name. :param string name: Table name. :returns: :class:`Table` with specified name or `None`. """ return self.__object_by_name(self._get_all_tables(),name) def get_view(self,name): """Get :class:`View` by name. :param string name: View name. :returns: :class:`View` with specified name or `None`. """ return self.__object_by_name(self._get_all_views(),name) def get_trigger(self,name): """Get :class:`Trigger` by name. :param string name: Trigger name. :returns: :class:`Trigger` with specified name or `None`. """ return self.__object_by_name(self._get_all_triggers(),name) def get_procedure(self,name): """Get :class:`Procedure` by name. :param string name: Procedure name. :returns: :class:`Procedure` with specified name or `None`. """ return self.__object_by_name(self._get_all_procedures(),name) def get_constraint(self,name): """Get :class:`Constraint` by name. :param string name: Constraint name. :returns: :class:`Constraint` with specified name or `None`. """ return self.__object_by_name(self._get_constraints(),name) def get_role(self,name): """Get :class:`Role` by name. :param string name: Role name. :returns: :class:`Role` with specified name or `None`. """ return self.__object_by_name(self._get_roles(),name) def get_function(self,name): """Get :class:`Function` by name. :param string name: Function name. :returns: :class:`Function` with specified name or `None`. """ return self.__object_by_name(self._get_all_functions(),name) def get_collation_by_id(self,charset_id,collation_id): """Get :class:`Collation` by ID. :param integer charset_id: Character set ID. :param integer collation_id: Collation ID. :returns: :class:`Collation` with specified ID or `None`. """ for collation in self._get_collations(): if (collation._attributes['RDB$CHARACTER_SET_ID'] == charset_id) and (collation.id == collation_id): return collation else: return None def get_character_set_by_id(self,id): """Get :class:`CharacterSet` by ID. :param integer name: CharacterSet ID. :returns: :class:`CharacterSet` with specified ID or `None`. """ for charset in self._get_character_sets(): if charset.id == id: return charset else: return None def get_privileges_of(self,user, user_type=None): """Get list of all privileges granted to user/database object. :param user: User name or instance of class that represents possible user. Allowed classes are :class:`~fdb.services.User`, :class:`Table`, :class:`View`, :class:`Procedure`, :class:`Trigger` or :class:`Role`. :param int user_type: **Required if** `user` is provided as string name. Numeric code for user type, see :attr:`Schema.enum_object_types`. :returns: List of :class:`Privilege` objects. :raises ProgrammingError: For unknown `user_type` code. """ if isinstance(user,(fdb.StringType,fdb.UnicodeType)): if (user_type is None) or (user_type not in self.enum_object_types): raise fdb.ProgrammingError("Unknown user_type code.") else: uname = user utype = [user_type] elif isinstance(user,(Table,View,Procedure,Trigger,Role)): uname = user.name utype = user._type_code elif isinstance(user,fdb.services.User): uname = user.name utype = [8] return [p for p in self.privileges if ((p.user_name == uname) and (p.user_type in utype))] class BaseSchemaItem(object): """Base class for all database schema objects. """ #: Weak reference to parent :class:`Schema` instance. schema = None def __init__(self,schema,attributes): self.schema = schema if type(schema) == weakref.ProxyType else weakref.proxy(schema) self._type_code = [] self._attributes = dict(attributes) self._actions = [] #--- protected def _strip_attribute(self,attr): if self._attributes.get(attr): self._attributes[attr] = self._attributes[attr].strip() def _check_params(self,params,param_names): p = set(params.keys()) n = set(param_names) if not p.issubset(n): raise fdb.ProgrammingError("Unsupported parameter(s) '%s'" % ','.join(p.difference(n))) def _needs_quoting(self,ident): if not ident: return False if self.schema.opt_always_quote: return True if len(ident) >= 1 and ident[0] not in string.ascii_uppercase: return True for char in ident: if char not in string.ascii_uppercase + string.digits + '$_': return True return isKeyword(ident) def _get_quoted_ident(self,ident): if self._needs_quoting(ident): return '"%s"' % ident else: return ident def _get_name(self): return None def _get_description(self): return self._attributes.get('RDB$DESCRIPTION') def _get_actions(self): return self._actions def _get_recreate_sql(self,**params): return 'RE'+self._get_create_sql(**params) def _get_create_or_alter_sql(self,**params): return 'CREATE OR ALTER' + self._get_create_sql(**params)[6:] #--- properties name = LateBindingProperty(_get_name,None,None, "Database object name or None if object doesn't have a name.") description = LateBindingProperty(_get_description,None,None, "Database object description or None if object doesn't have a description.") actions = LateBindingProperty(_get_actions,None,None, "List of supported SQL operations on metadata object instance.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitMetadatItem(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitMetadataItem(self) def issystemobject(self): "Returns True if this database object is system object." return True if self._attributes.get('RDB$SYSTEM_FLAG',False) else False def get_quoted_name(self): "Returns quoted (if necessary) name." if self._needs_quoting(self.name): return '"%s"' % self.name else: return self.name def get_dependents(self): "Returns list of all database objects that depend on this one." return [d for d in self.schema.dependencies if d.depended_on_name == self.name and d.depended_on_type in self._type_code] def get_dependencies(self): "Returns list of database objects that this object depend on." return [d for d in self.schema.dependencies if d.dependent_name == self.name and d.dependent_type in self._type_code] def get_sql_for(self,action,**params): """Returns SQL command for specified action on metadata object. Supported actions are defined by :attr:`actions` list. :raises ProgrammingError: For unsupported action or wrong parameters passed. """ _action = action.lower() if _action in self._actions: _call = getattr(self,'_get_%s_sql' % _action) return _call(**params) else: raise fdb.ProgrammingError("Unsupported action '%s'" % action) class Collation(BaseSchemaItem): """Represents collation. Supported SQL actions: - User collation: create, drop - System collation: none """ def __init__(self,schema,attributes): super(Collation,self).__init__(schema,attributes) self._strip_attribute('RDB$COLLATION_NAME') self._strip_attribute('RDB$BASE_COLLATION_NAME') self._strip_attribute('RDB$FUNCTION_NAME') if not self.issystemobject(): self._actions = ['create','drop'] #--- Protected def _get_drop_sql(self,**params): self._check_params(params,[]) return 'DROP COLLATION %s' % self.get_quoted_name() def _get_create_sql(self,**params): self._check_params(params,[]) base_sql = """CREATE COLLATION %s FOR %s %s %s %s %s %s""" % (self.get_quoted_name(), self.character_set.get_quoted_name(), ("FROM EXTERNAL ('%s')" % self._attributes['RDB$BASE_COLLATION_NAME'] if self.isbasedonexternal() else "FROM %s" % self.base_collation.get_quoted_name()), 'PAD SPACE' if self.ispadded() else 'NO PAD', 'CASE INSENSITIVE' if self.iscaseinsensitive() else 'CASE SENSITIVE', 'ACCENT INSENSITIVE' if self.isaccentinsensitive() else 'ACCENT SENSITIVE', "'%s'" % self.specific_attributes if self.specific_attributes else '') return base_sql.strip() def _get_name(self): return self._attributes['RDB$COLLATION_NAME'] def _get_id(self): return self._attributes['RDB$COLLATION_ID'] def _get_character_set(self): """Return :class:`CharacterSet` object to which this collation belongs. """ return self.schema.get_character_set_by_id(self._attributes['RDB$CHARACTER_SET_ID']) def _get_base_collation(self): base_name = self._attributes['RDB$BASE_COLLATION_NAME'] return self.schema.get_collation(base_name) if base_name else None def _get_attributes(self): return self._attributes['RDB$COLLATION_ATTRIBUTES'] def _get_specific_attributes(self): return self._attributes['RDB$SPECIFIC_ATTRIBUTES'] def _get_function_name(self): return self._attributes['RDB$FUNCTION_NAME'] #--- Properties id = LateBindingProperty(_get_id,None,None,"Collation ID.") character_set = LateBindingProperty(_get_character_set,None,None, "Character set object associated with collation.") base_collation = LateBindingProperty(_get_base_collation,None,None, "Base Collation object that's extended by this one or None.") attributes = LateBindingProperty(_get_attributes,None,None, "Collation attributes.") specific_attributes = LateBindingProperty(_get_specific_attributes,None,None, "Collation specific attributes.") function_name = LateBindingProperty(_get_function_name,None,None, "Not currently used.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitCollation(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitCollation(self) def ispadded(self): """Returns True if collation has PAD SPACE attribute.""" return bool(self.attributes & COLLATION_PAD_SPACE) def iscaseinsensitive(self): "Returns True if collation has CASE INSENSITIVE attribute." return bool(self.attributes & COLLATION_CASE_INSENSITIVE) def isaccentinsensitive(self): "Returns True if collation has ACCENT INSENSITIVE attribute." return bool(self.attributes & COLLATION_ACCENT_INSENSITIVE) def isbasedonexternal(self): "Returns True if collation is based on external collation definition." return (self._attributes['RDB$BASE_COLLATION_NAME'] and not self.base_collation) class CharacterSet(BaseSchemaItem): """Represents character set. Supported SQL actions: alter(collation=Collation instance or collation name) """ def __init__(self,schema,attributes): super(CharacterSet,self).__init__(schema,attributes) self._strip_attribute('RDB$CHARACTER_SET_NAME') self._strip_attribute('RDB$DEFAULT_COLLATE_NAME') self._actions = ['alter'] #--- protected def _get_alter_sql(self,**params): self._check_params(params,['collation']) collation = params.get('collation') if collation: return ('ALTER CHARACTER SET %s SET DEFAULT COLLATION %s' % (self.name, collation.name if isinstance(collation,Collation) else collation)) else: raise fdb.ProgrammingError("Missing required parameter: 'collation'.") def _get_name(self): return self._attributes['RDB$CHARACTER_SET_NAME'] def _get_id(self): return self._attributes['RDB$CHARACTER_SET_ID'] def _get_bytes_per_character(self): return self._attributes['RDB$BYTES_PER_CHARACTER'] def _get_default_collate(self): return self.get_collation(self._attributes['RDB$DEFAULT_COLLATE_NAME']) def _get_collations(self): r = [c for c in self.schema.collations if c._attributes['RDB$CHARACTER_SET_ID'] == self.id] return r #--- properties id = LateBindingProperty(_get_id,None,None,"Character set ID.") bytes_per_character = LateBindingProperty(_get_bytes_per_character,None,None, "Size of characters in bytes.") default_collate = LateBindingProperty(_get_default_collate,None,None, "Collate object of default collate.") collations = LateBindingProperty(_get_collations,None,None, "List of Collations associated with character set.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitCharacterSet(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitCharacterSet(self) def get_collation(self,name): """Return :class:`Collation` object with specified name that belongs to this character set. """ for col in self.collations: if col.name == name: return col return None def get_collation_by_id(self,id): """Return :class:`Collation` object with specified id that belongs to this character set. """ for col in self.collations: if col.id == id: return col return None class DatabaseException(BaseSchemaItem): """Represents database exception. Supported SQL actions: - User exception: create, recreate, alter(message=string), create_or_alter, drop - System exception: none """ def __init__(self,schema,attributes): super(DatabaseException,self).__init__(schema,attributes) self._type_code = [7,] self._strip_attribute('RDB$EXCEPTION_NAME') if not self.issystemobject(): self._actions = ['create','recreate','alter','create_or_alter','drop'] #--- Protected def _get_create_sql(self,**params): self._check_params(params,[]) return "CREATE EXCEPTION %s '%s'" % (self.get_quoted_name(), escape_single_quotes(self.message)) def _get_alter_sql(self,**params): self._check_params(params,['message']) message = params.get('message') if message: return "ALTER EXCEPTION %s '%s'" % (self.get_quoted_name(), escape_single_quotes(message)) else: raise fdb.ProgrammingError("Missing required parameter: 'message'.") def _get_drop_sql(self,**params): self._check_params(params,[]) return 'DROP EXCEPTION %s' % self.get_quoted_name() def _get_name(self): return self._attributes['RDB$EXCEPTION_NAME'] def _get_id(self): return self._attributes['RDB$EXCEPTION_NUMBER'] def _get_message(self): return self._attributes['RDB$MESSAGE'] #--- Properties id = LateBindingProperty(_get_id,None,None, "System-assigned unique exception number.") message = LateBindingProperty(_get_message,None,None,"Custom message text.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitException(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitException(self) class Sequence(BaseSchemaItem): """Represents database generator/sequence. Supported SQL actions: - User sequence: create, alter(value=number), drop - System sequence: none """ def __init__(self,schema,attributes): super(Sequence,self).__init__(schema,attributes) self._type_code = [14,] self._strip_attribute('RDB$GENERATOR_NAME') if not self.issystemobject(): self._actions = ['create','alter','drop'] #--- protected def _get_create_sql(self,**params): self._check_params(params,[]) return 'CREATE SEQUENCE %s' % self.get_quoted_name() def _get_alter_sql(self,**params): self._check_params(params,['value']) value = params.get('value') if value is not None: return "ALTER SEQUENCE %s RESTART WITH %d" % (self.get_quoted_name(),value) else: raise fdb.ProgrammingError("Missing required parameter: 'value'.") def _get_drop_sql(self,**params): self._check_params(params,[]) return 'DROP SEQUENCE %s' % self.get_quoted_name() def _get_name(self): return self._attributes['RDB$GENERATOR_NAME'] def _get_id(self): return self._attributes['RDB$GENERATOR_ID'] def _get_value(self): return self.schema._select_row("select GEN_ID(%s,0) from RDB$DATABASE" % self.name)['GEN_ID'] #--- Properties id = LateBindingProperty(_get_id,None,None,"Internal ID number of the sequence.") value = LateBindingProperty(_get_value,None,None,"Current sequence value.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitGenerator(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitGenerator(self) class TableColumn(BaseSchemaItem): """Represents table column. Supported SQL actions: - User column: alter(name=string,datatype=string_SQLTypeDef,position=number, expression=computed_by_expr), drop - System column: none """ def __init__(self,schema,table,attributes): super(TableColumn,self).__init__(schema,attributes) self._type_code = [3,9] self.__table = weakref.proxy(table) self._strip_attribute('RDB$FIELD_NAME') self._strip_attribute('RDB$RELATION_NAME') self._strip_attribute('RDB$FIELD_SOURCE') self._strip_attribute('RDB$SECURITY_CLASS') if not self.issystemobject(): self._actions = ['alter','drop'] #--- Protected def _get_alter_sql(self,**params): self._check_params(params,['expression','datatype','name','position']) new_expr = params.get('expression') new_type = params.get('datatype') new_name = params.get('name') new_position = params.get('position') if new_expr and not self.iscomputed(): raise fdb.ProgrammingError("Change from persistent column to computed" " is not allowed.") elif self.iscomputed() and (new_type and not new_expr): raise fdb.ProgrammingError("Change from computed column to persistent" " is not allowed.") sql = 'ALTER TABLE %s ALTER COLUMN %s' % (self.table.get_quoted_name(), self.get_quoted_name()) if new_name: return '%s TO %s' % (sql,self._get_quoted_ident(new_name)) elif new_position: return '%s POSITION %d' % (sql,new_position) elif new_type or new_expr: result = sql if new_type: result += ' TYPE %s' % new_type if new_expr: result += ' COMPUTED BY %s' % new_expr return result else: raise fdb.ProgrammingError("Parameter required.") def _get_drop_sql(self,**params): self._check_params(params,[]) return 'ALTER TABLE %s DROP %s' % (self.table.get_quoted_name(), self.get_quoted_name()) def _get_name(self): return self._attributes['RDB$FIELD_NAME'] def _get_table(self): return self.__table def _get_domain(self): return self.schema.get_domain(self._attributes['RDB$FIELD_SOURCE']) def _get_position(self): return self._attributes['RDB$FIELD_POSITION'] def _get_security_class(self): return self._attributes['RDB$SECURITY_CLASS'] def _get_default(self): result = self._attributes.get('RDB$DEFAULT_SOURCE') if result: if result.upper().startswith('DEFAULT '): result = result[8:] return result def _get_collation(self): return self.schema.get_collation_by_id(self.domain._attributes['RDB$CHARACTER_SET_ID'], self._attributes['RDB$COLLATION_ID']) def _get_datatype(self): return self.domain.datatype def _get_privileges(self): return [p for p in self.schema.privileges if (p.subject_name == self.table.name and p.field_name == self.name and p.subject_type in self.table._type_code)] #--- Properties table = LateBindingProperty(_get_table,None,None, "The Table object this column belongs to.") domain = LateBindingProperty(_get_domain,None,None, "Domain object this column is based on.") position = LateBindingProperty(_get_position,None,None, "Column's sequence number in row.") security_class = LateBindingProperty(_get_security_class,None,None, "Security class name or None.") default = LateBindingProperty(_get_default,None,None, "Default value for column or None.") collation = LateBindingProperty(_get_collation,None,None, "Collation object or None.") datatype = LateBindingProperty(_get_datatype,None,None, "Comlete SQL datatype definition.") privileges = LateBindingProperty(_get_privileges,None,None, "List of :class:`Privilege` objects granted to this object.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitTableColumn(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitTableColumn(self) def get_dependents(self): "Return list of all database objects that depend on this one." return [d for d in self.schema.dependencies if d.depended_on_name == self._attributes['RDB$RELATION_NAME'] and d.depended_on_type == 0 and d.field_name == self.name] def get_dependencies(self): "Return list of database objects that this object depend on." return [d for d in self.schema.dependencies if d.dependent_name == self._attributes['RDB$RELATION_NAME'] and d.dependent_type == 0 and d.field_name == self.name] def get_computedby(self): "Returns (string) extression for column computation or None." return self.domain.expression def iscomputed(self): "Returns True if column is computed." return bool(self.domain.expression) def isdomainbased(self): "Returns True if column is based on user domain." return not self.domain.issystemobject() def isnullable(self): "Returns True if column can accept NULL values." return not self._attributes['RDB$NULL_FLAG'] def iswritable(self): "Returns True if column is writable (i.e. it's not computed etc.)." return bool(self._attributes['RDB$UPDATE_FLAG']) def has_default(self): "Returns True if column has default value." return bool(self._attributes.get('RDB$DEFAULT_SOURCE')) class Index(BaseSchemaItem): """Represents database index. Supported SQL actions: - User index: create, activate, deactivate, recompute, drop - System index: recompute """ def __init__(self,schema,attributes): super(Index,self).__init__(schema,attributes) self._type_code = [6,10] self.__segment_names = None self.__segment_statistics = None self._strip_attribute('RDB$INDEX_NAME') self._strip_attribute('RDB$RELATION_NAME') self._strip_attribute('RDB$FOREIGN_KEY') if self.issystemobject(): self._actions = ['recompute'] else: self._actions = ['create','activate','deactivate','recompute','drop'] #--- Protected def _get_create_sql(self,**params): self._check_params(params,[]) return """CREATE %s%s INDEX %s ON %s %s""" % ('UNIQUE ' if self.isunique() else '', self.index_type, self.get_quoted_name(),self.table.name, 'COMPUTED BY %s' % self.expression if self.isexpression() else '(%s)' % ','.join(self.segment_names)) def _get_activate_sql(self,**params): self._check_params(params,[]) return 'ALTER INDEX %s ACTIVE' % self.get_quoted_name() def _get_deactivate_sql(self,**params): self._check_params(params,[]) return 'ALTER INDEX %s INACTIVE' % self.get_quoted_name() def _get_recompute_sql(self,**params): self._check_params(params,[]) return 'SET STATISTICS INDEX %s' % self.get_quoted_name() def _get_drop_sql(self,**params): self._check_params(params,[]) return 'DROP INDEX %s' % self.get_quoted_name() def _get_name(self): return self._attributes['RDB$INDEX_NAME'] def _get_table(self): return self.schema.get_table(self._attributes['RDB$RELATION_NAME']) def _get_id(self): return self._attributes['RDB$INDEX_ID'] def _get_index_type(self): return (INDEX_TYPE_DESCENDING if self._attributes['RDB$INDEX_TYPE'] == 1 else INDEX_TYPE_ASCENDING) def _get_partner_index(self): pname = self._attributes['RDB$FOREIGN_KEY'] return self.schema.get_index(pname) if pname else None def _get_expression(self): return self._attributes['RDB$EXPRESSION_SOURCE'] def _get_statistics(self): return self._attributes['RDB$STATISTICS'] def _get_segments(self): return [self.table.get_column(colname) for colname in self.segment_names] def _get_segment_names(self): if self.__segment_names is None: if self._attributes['RDB$SEGMENT_COUNT'] > 0: self.__segment_names = [r['RDB$FIELD_NAME'].strip() for r in self.schema._select("""select rdb$field_name from rdb$index_segments where rdb$index_name = ? order by rdb$field_position""",(self.name,))] else: self.__segment_names = [] return self.__segment_names def _get_segment_statistics(self): if self.__segment_statistics is None: if self._attributes['RDB$SEGMENT_COUNT'] > 0: if self.schema._con.ods >= fdb.ODS_FB_21: self.__segment_statistics = [r['RDB$STATISTICS'] for r in self.schema._select("""select RDB$STATISTICS from rdb$index_segments where rdb$index_name = ? order by rdb$field_position""",(self.name,))] else: self.__segment_statistics = [None for x in range(self._attributes['RDB$SEGMENT_COUNT'])] else: self.__segment_statistics = [] return self.__segment_statistics def _get_constraint(self): const_name = self.schema._get_constraint_indices().get(self.name) if const_name: return self.schema.get_constraint(const_name) else: return None #--- Properties table = LateBindingProperty(_get_table,None,None, "The :class:`Table` instance the index applies to.") id = LateBindingProperty(_get_id,None,None, "Internal number ID of the index.") index_type = LateBindingProperty(_get_index_type,None,None, "ASCENDING or DESCENDING.") partner_index = LateBindingProperty(_get_partner_index,None,None, "Associated unique/primary key :class:`Index` instance, or None.") expression = LateBindingProperty(_get_expression,None,None, "Source of an expression or None.") statistics = LateBindingProperty(_get_statistics,None,None, "Latest selectivity of the index.") segment_names = LateBindingProperty(_get_segment_names,None,None, "List of index segment names.") segment_statistics = LateBindingProperty(_get_segment_statistics,None,None, "List of index segment statistics (for ODS 11.1 and higher).") segments = LateBindingProperty(_get_segments,None,None, "List of index segments as :class:`TableColumn` instances.") constraint = LateBindingProperty(_get_constraint,None,None, ":class:`Constraint` instance that uses this index or None.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitIndex(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitIndex(self) def issystemobject(self): "Returns True if this database object is system object." return bool(self._attributes['RDB$SYSTEM_FLAG'] or (self.isenforcer() and self.name.startswith('RDB$'))) def isexpression(self): "Returns True if index is expression index." return not self.segments def isunique(self): "Returns True if index is UNIQUE." return self._attributes['RDB$UNIQUE_FLAG'] == 1 def isinactive(self): "Returns True if index is INACTIVE." return self._attributes['RDB$INDEX_INACTIVE'] == 1 def isenforcer(self): "Returns True if index is used to enforce a constraint." return self.name in self.schema._get_constraint_indices() class ViewColumn(BaseSchemaItem): """Represents view column. Supported SQL actions: none """ def __init__(self,schema,view,attributes): super(ViewColumn,self).__init__(schema,attributes) self._type_code = [3,9] self.__view = weakref.proxy(view) self._strip_attribute('RDB$FIELD_NAME') self._strip_attribute('RDB$BASE_FIELD') self._strip_attribute('RDB$RELATION_NAME') self._strip_attribute('RDB$FIELD_SOURCE') self._strip_attribute('RDB$SECURITY_CLASS') self._strip_attribute('BASE_RELATION') #--- Protected def _get_name(self): return self._attributes['RDB$FIELD_NAME'] def _get_base_field(self): bfield = self._attributes['RDB$BASE_FIELD'] if bfield: brel = self._attributes['BASE_RELATION'] relation = self.schema.get_table(brel) if relation: return relation.get_column(bfield) relation = self.schema.get_view(brel) if relation: return relation.get_column(bfield) relation = self.schema.get_procedure(brel) if relation: return relation.get_outparam(bfield) raise fdb.OperationalError("Can't locate base relation.") return None def _get_view(self): return self.__view def _get_domain(self): return self.schema.get_domain(self._attributes['RDB$FIELD_SOURCE']) def _get_position(self): return self._attributes['RDB$FIELD_POSITION'] def _get_security_class(self): return self._attributes['RDB$SECURITY_CLASS'] def _get_collation(self): return self.schema.get_collation_by_id(self.domain._attributes['RDB$CHARACTER_SET_ID'], self._attributes['RDB$COLLATION_ID']) def _get_datatype(self): return self.domain.datatype def _get_privileges(self): return [p for p in self.schema.privileges if (p.subject_name == self.view.name and p.field_name == self.name and p.subject_type == 0)] # Views are logged as Tables in RDB$USER_PRIVILEGES #--- Properties base_field = LateBindingProperty(_get_base_field,None,None, "The source column from the base relation. Result could be either " ":class:`TableColumn`, :class:`ViewColumn` or :class:`ProcedureParameter` " "instance or None.") view = LateBindingProperty(_get_view,None,None, "View object this column belongs to.") domain = LateBindingProperty(_get_domain,None,None, "Domain object this column is based on.") position = LateBindingProperty(_get_position,None,None, "Column's sequence number in row.") security_class = LateBindingProperty(_get_security_class,None,None, "Security class name or None.") collation = LateBindingProperty(_get_collation,None,None, "Collation object or None.") datatype = LateBindingProperty(_get_datatype,None,None, "Comlete SQL datatype definition.") privileges = LateBindingProperty(_get_privileges,None,None, "List of :class:`Privilege` objects granted to this object.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitViewColumn(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitViewColumn(self) def get_dependents(self): "Return list of all database objects that depend on this one." return [d for d in self.schema.dependencies if d.depended_on_name == self._attributes['RDB$RELATION_NAME'] and d.depended_on_type == 1 and d.field_name == self.name] def get_dependencies(self): "Return list of database objects that this object depend on." return [d for d in self.schema.dependencies if d.dependent_name == self._attributes['RDB$RELATION_NAME'] and d.dependent_type == 1 and d.field_name == self.name] def isnullable(self): "Returns True if column is NULLABLE." return not self._attributes['RDB$NULL_FLAG'] def iswritable(self): "Returns True if column is writable." return bool(self._attributes['RDB$UPDATE_FLAG']) class Domain(BaseSchemaItem): """Represents SQl Domain. Supported SQL actions: - User domain: create, alter(name=string,default=string_definition_or_None, check=string_definition_or_None,datatype=string_SQLTypeDef), drop - System domain: none """ def __init__(self,schema,attributes): super(Domain,self).__init__(schema,attributes) self._type_code = [9] self._strip_attribute('RDB$FIELD_NAME') if not self.issystemobject(): self._actions = ['create','alter','drop'] #--- Protected def _get_create_sql(self,**params): self._check_params(params,[]) sql = 'CREATE DOMAIN %s AS %s' % (self.get_quoted_name(),self.datatype) if self.has_default(): sql += ' DEFAULT %s' % self.default if self.isvalidated(): sql += ' ' + self.validation if self._attributes['RDB$COLLATION_ID']: sql += 'COLLATE %s' % self._attributes['RDB$COLLATION_ID'] return sql def _get_alter_sql(self,**params): self._check_params(params,['name','default','check','datatype']) new_name = params.get('name') new_default = params.get('default','') new_constraint = params.get('check','') new_type = params.get('datatype') sql = 'ALTER DOMAIN %s' % self.get_quoted_name() if len(params) > 1: raise fdb.ProgrammingError("Only one parameter allowed.") if new_name: return '%s TO %s' % (sql,self._get_quoted_ident(new_name)) elif new_default != '': return ('%s SET DEFAULT %s' % (sql,new_default) if new_default else '%s DROP DEFAULT' % sql) elif new_constraint != '': return ('%s ADD CHECK (%s)' % (sql,new_constraint) if new_constraint else '%s DROP CONSTRAINT' % sql) elif new_type: return '%s TYPE %s' % (sql,new_type) else: raise fdb.ProgrammingError("Parameter required.") def _get_drop_sql(self,**params): self._check_params(params,[]) return 'DROP DOMAIN %s' % self.get_quoted_name() def _get_name(self): return self._attributes['RDB$FIELD_NAME'] def _get_expression(self): return self._attributes['RDB$COMPUTED_SOURCE'] def _get_validation(self): return self._attributes['RDB$VALIDATION_SOURCE'] def _get_default(self): result = self._attributes.get('RDB$DEFAULT_SOURCE') if result: if result.upper().startswith('DEFAULT '): result = result[8:] return result def _get_length(self): return self._attributes['RDB$FIELD_LENGTH'] def _get_scale(self): return self._attributes['RDB$FIELD_SCALE'] def _get_field_type(self): return self._attributes['RDB$FIELD_TYPE'] def _get_sub_type(self): return self._attributes['RDB$FIELD_SUB_TYPE'] def _get_segment_length(self): return self._attributes['RDB$SEGMENT_LENGTH'] def _get_external_length(self): return self._attributes['RDB$EXTERNAL_LENGTH'] def _get_external_scale(self): return self._attributes['RDB$EXTERNAL_SCALE'] def _get_external_type(self): return self._attributes['RDB$EXTERNAL_TYPE'] def _get_dimensions(self): if self._attributes['RDB$DIMENSIONS']: return self.schema._get_field_dimensions(self) else: return [] def _get_character_length(self): return self._attributes['RDB$CHARACTER_LENGTH'] def _get_collation(self): return self.schema.get_collation_by_id(self._attributes['RDB$CHARACTER_SET_ID'], self._attributes['RDB$COLLATION_ID']) def _get_character_set(self): return self.schema.get_character_set_by_id(self._attributes['RDB$CHARACTER_SET_ID']) def _get_precision(self): return self._attributes['RDB$FIELD_PRECISION'] def _get_datatype(self): l = [] precision_known = False if self.field_type in (FBT_SMALLINT,FBT_INTEGER,FBT_BIGINT): if self.precision != None: if (self.sub_type > 0) and (self.sub_type < MAX_INTSUBTYPES): l.append('%s(%d, %d)' % \ (INTEGRAL_SUBTYPES[self.sub_type],self.precision,-self.scale)) precision_known = True if not precision_known: if (self.field_type == FBT_SMALLINT) and (self.scale < 0): l.append('NUMERIC(4, %d)' % -self.scale) elif (self.field_type == FBT_INTEGER) and (self.scale < 0): l.append('NUMERIC(9, %d)' % -self.scale) elif (self.field_type == FBT_DOUBLE_PRECISION) and (self.scale < 0): l.append('NUMERIC(15, %d)' % -self.scale) else: l.append(COLUMN_TYPES[self.field_type]) if self.field_type in (FBT_CHAR,FBT_VARCHAR): l.append('(%d)' % (self.length if self.character_length == None else self.character_length)) if self._attributes['RDB$DIMENSIONS'] != None: l.append('[%s]' % ', '.join('%d' % u if l == 1 else '%d:%d' % (l,u) for l,u in self.dimensions)) if self.field_type == FBT_BLOB: if self.sub_type >= 0 and self.sub_type <= MAX_BLOBSUBTYPES: l.append(' SUB_TYPE %s' % BLOB_SUBTYPES[self.sub_type]) else: l.append(' SUB_TYPE %d' % self.sub_type) l.append(' SEGMENT SIZE %d' % self.segment_length) if self.field_type in (FBT_CHAR,FBT_VARCHAR,FBT_BLOB): if self._attributes['RDB$CHARACTER_SET_ID'] is not None and \ (self.character_set.name != self.schema.default_character_set.name) or \ self._attributes['RDB$COLLATION_ID']: if (self._attributes['RDB$CHARACTER_SET_ID'] is not None): l.append(' CHARACTER SET %s' % self.character_set.name) if self._attributes['RDB$COLLATION_ID'] is not None: cname = self.collation.name if self.character_set._attributes['RDB$DEFAULT_COLLATE_NAME'] != cname: l.append(' COLLATE %s' % cname) return ''.join(l) #--- Properties expression = LateBindingProperty(_get_expression,None,None, "Expression that defines the COMPUTED BY column or None.") validation = LateBindingProperty(_get_validation,None,None, "CHECK constraint for the domain or None.") default = LateBindingProperty(_get_default,None,None, "Expression that defines the default value or None.") length = LateBindingProperty(_get_length,None,None, "Length of the column in bytes.") scale = LateBindingProperty(_get_scale,None,None, "Negative number representing the scale of NUMBER and DECIMAL column.") field_type = LateBindingProperty(_get_field_type,None,None, "Number code of the data type defined for the column.") sub_type = LateBindingProperty(_get_sub_type,None,None,"BLOB subtype.") segment_length = LateBindingProperty(_get_segment_length,None,None, "For BLOB columns, a suggested length for BLOB buffers.") external_length = LateBindingProperty(_get_external_length,None,None, "Length of field as it is in an external table. Always 0 for regular tables.") external_scale = LateBindingProperty(_get_external_scale,None,None, "Scale factor of an integer field as it is in an external table.") external_type = LateBindingProperty(_get_external_type,None,None, "Data type of the field as it is in an external table.") dimensions = LateBindingProperty(_get_dimensions,None,None, "List of dimension definition pairs if column is an array type. Always empty for non-array columns.") character_length = LateBindingProperty(_get_character_length,None,None, "Length of CHAR and VARCHAR column, in characters (not bytes).") collation = LateBindingProperty(_get_collation,None,None, "Collation object for a character column or None.") character_set = LateBindingProperty(_get_character_set,None,None, "CharacterSet object for a character or text BLOB column, or None.") precision = LateBindingProperty(_get_precision,None,None, "Indicates the number of digits of precision available to the data type of the column.") datatype = LateBindingProperty(_get_datatype,None,None, "Comlete SQL datatype definition.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitDomain(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitDomain(self) def issystemobject(self): "Return True if this database object is system object." return (self._attributes['RDB$SYSTEM_FLAG'] == 1) or self.name.startswith('RDB$') def isnullable(self): "Returns True if domain is not defined with NOT NULL." return not self._attributes['RDB$NULL_FLAG'] def iscomputed(self): "Returns True if domain is computed." return bool(self._attributes['RDB$COMPUTED_SOURCE']) def isvalidated(self): "Returns True if domain has validation constraint." return bool(self._attributes['RDB$VALIDATION_SOURCE']) def isarray(self): "Returns True if domain defines an array." return bool(self._attributes['RDB$DIMENSIONS']) def has_default(self): "Returns True if domain has default value." return bool(self._attributes['RDB$DEFAULT_SOURCE']) class Dependency(BaseSchemaItem): """Maps dependency between database objects. Supported SQL actions: none """ def __init__(self,schema,attributes): super(Dependency,self).__init__(schema,attributes) self._strip_attribute('RDB$DEPENDENT_NAME') self._strip_attribute('RDB$DEPENDED_ON_NAME') self._strip_attribute('RDB$FIELD_NAME') #--- Protected def _get_dependent_name(self): return self._attributes['RDB$DEPENDENT_NAME'] def _get_dependent_type(self): return self._attributes['RDB$DEPENDENT_TYPE'] def _get_field_name(self): return self._attributes['RDB$FIELD_NAME'] def _get_depended_on_name(self): return self._attributes['RDB$DEPENDED_ON_NAME'] def _get_depended_on_type(self): return self._attributes['RDB$DEPENDED_ON_TYPE'] def _get_dependent(self): if self.dependent_type == 0: # TABLE t = self.schema.get_table(self.dependent_name) elif self.dependent_type == 1: # VIEW return self.schema.get_view(self.dependent_name) elif self.dependent_type == 2: # TRIGGER return self.schema.get_trigger(self.dependent_name) elif self.dependent_type == 3: # COMPUTED FIELD (i.e. DOMAIN) return self.schema.get_domain(self.dependent_name) elif self.dependent_type == 4: ## ToDo: Implement handler for VALIDATION if necessary return None elif self.dependent_type == 5: #PROCEDURE return self.schema.get_procedure(self.dependent_name) elif self.dependent_type == 6: # EXPRESSION INDEX return self.schema.get_index(self.dependent_name) elif self.dependent_type == 7: # EXCEPTION return self.schema.get_exception(self.dependent_name) elif self.dependent_type == 8: ## ToDo: Implement handler for USER if necessary return None elif self.dependent_type == 9: # FIELD (i.e. DOMAIN) return self.schema.get_domain(self.dependent_name) elif self.dependent_type == 10: # INDEX return self.schema.get_index(self.dependent_name) elif self.dependent_type == 11: ## ToDo: Implement handler for DEPENDENT COUNT if necessary return None elif self.dependent_type == 12: ## ToDo: Implement handler for USER GROUP if necessary return None elif self.dependent_type == 13: # ROLE return self.schema.get_role(self.dependent_name) elif self.dependent_type == 14: # GENERATOR return self.schema.get_generator(self.dependent_name) elif self.dependent_type == 15: # UDF return self.schema.get_function(self.dependent_name) elif self.dependent_type == 16: ## ToDo: Implement handler for BLOB_FILTER return None return None def _get_depended_on(self): if self.depended_on_type == 0: # TABLE t = self.schema.get_table(self.depended_on_name) if self.field_name: return t.get_column(self.field_name) else: return t elif self.depended_on_type == 1: # VIEW return self.schema.get_view(self.depended_on_name) elif self.depended_on_type == 2: # TRIGGER return self.schema.get_trigger(self.depended_on_name) elif self.depended_on_type == 3: # COMPUTED FIELD (i.e. DOMAIN) return self.schema.get_domain(self.depended_on_name) elif self.depended_on_type == 4: ## ToDo: Implement handler for VALIDATION if necessary return None elif self.depended_on_type == 5: #PROCEDURE return self.schema.get_procedure(self.depended_on_name) elif self.depended_on_type == 6: # EXPRESSION INDEX return self.schema.get_index(self.depended_on_name) elif self.depended_on_type == 7: # EXCEPTION return self.schema.get_exception(self.depended_on_name) elif self.depended_on_type == 8: ## ToDo: Implement handler for USER if necessary return None elif self.depended_on_type == 9: # FIELD (i.e. DOMAIN) return self.schema.get_domain(self.depended_on_name) elif self.depended_on_type == 10: # INDEX return self.schema.get_index(self.depended_on_name) elif self.depended_on_type == 11: ## ToDo: Implement handler for DEPENDENT COUNT if necessary return None elif self.depended_on_type == 12: ## ToDo: Implement handler for USER GROUP if necessary return None elif self.depended_on_type == 13: # ROLE return self.schema.get_role(self.depended_on_name) elif self.depended_on_type == 14: # GENERATOR return self.schema.get_generator(self.depended_on_name) elif self.depended_on_type == 15: # UDF return self.schema.get_function(self.depended_on_name) elif self.depended_on_type == 16: ## ToDo: Implement handler for BLOB_FILTER return None return None #--- Properties dependent = LateBindingProperty(_get_dependent,None,None, "Dependent database object.") dependent_name = LateBindingProperty(_get_dependent_name,None,None, "Dependent database object name.") dependent_type = LateBindingProperty(_get_dependent_type,None,None, "Dependent database object type.") field_name = LateBindingProperty(_get_field_name,None,None, "Name of one column in `depended on` object.") depended_on = LateBindingProperty(_get_depended_on,None,None, "Database object on which dependent depends.") depended_on_name = LateBindingProperty(_get_depended_on_name,None,None, "Name of db object on which dependent depends.") depended_on_type = LateBindingProperty(_get_depended_on_type,None,None, "Type of db object on which dependent depends.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitDependency(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitDependency(self) def issystemobject(self): "Returns True as dependency entries are considered as system objects." return True def get_dependents(self): "Returns empty list because Dependency object never has dependents." return [] def get_dependencies(self): "Returns empty list because Dependency object never has dependencies." return [] class Constraint(BaseSchemaItem): """Represents table or column constraint. Supported SQL actions: - Constraint on user table except NOT NULL constraint: create, drop - Constraint on system table: none """ def __init__(self,schema,attributes): super(Constraint,self).__init__(schema,attributes) self._strip_attribute('RDB$CONSTRAINT_NAME') self._strip_attribute('RDB$CONSTRAINT_TYPE') self._strip_attribute('RDB$RELATION_NAME') self._strip_attribute('RDB$DEFERRABLE') self._strip_attribute('RDB$INITIALLY_DEFERRED') self._strip_attribute('RDB$INDEX_NAME') self._strip_attribute('RDB$TRIGGER_NAME') self._strip_attribute('RDB$CONST_NAME_UQ') self._strip_attribute('RDB$MATCH_OPTION') self._strip_attribute('RDB$UPDATE_RULE') self._strip_attribute('RDB$DELETE_RULE') if not (self.issystemobject() or self.isnotnull()): self._actions = ['create','drop'] #--- Protected def _get_create_sql(self,**params): self._check_params(params,[]) const_def = 'ALTER TABLE %s ADD ' % self.table.get_quoted_name() if not self.name.startswith('INTEG_'): const_def += 'CONSTRAINT %s\n ' % self.get_quoted_name() if self.ischeck(): const_def += self.triggers[0].source elif self.ispkey() or self.isunique(): const_def += 'PRIMARY KEY' if self.ispkey() else 'UNIQUE' i = self.index const_def += ' (%s)' % ','.join(i.segment_names) if not i.issystemobject(): const_def += '\n USING %s INDEX %s' % (i.index_type,i.get_quoted_name()) elif self.isfkey(): const_def += 'FOREIGN KEY (%s)\n ' % ','.join(self.index.segment_names) p = self.partner_constraint const_def += 'REFERENCES %s (%s)' % (p.table.get_quoted_name(), ','.join(p.index.segment_names)) if self.delete_rule != 'RESTRICT': const_def += '\n ON DELETE %s' % self.delete_rule if self.update_rule != 'RESTRICT': const_def += '\n ON UPDATE %s' % self.update_rule i = self.index if not i.issystemobject(): const_def += '\n USING %s INDEX %s' % (i.index_type,i.get_quoted_name()) else: raise fdb.OperationalError("Unrecognized constraint type '%s'" % self.constraint_type) return const_def def _get_drop_sql(self,**params): self._check_params(params,[]) return 'ALTER TABLE %s DROP CONSTRAINT %s' % (self.table.get_quoted_name(), self.get_quoted_name()) def _get_name(self): return self._attributes['RDB$CONSTRAINT_NAME'] def _get_constraint_type(self): return self._attributes['RDB$CONSTRAINT_TYPE'] def _get_table(self): return self.schema.get_table(self._attributes['RDB$RELATION_NAME']) def _get_index(self): return self.schema.get_index(self._attributes['RDB$INDEX_NAME']) def _get_trigger_names(self): if self.ischeck(): return self._attributes['RDB$TRIGGER_NAME'] else: return [] def _get_triggers(self): return [self.schema.get_trigger(tname) for tname in self.trigger_names] def _get_column_name(self): if self.isnotnull(): return self._attributes['RDB$TRIGGER_NAME'] else: return None def _get_partner_constraint(self): return self.schema.get_constraint(self._attributes['RDB$CONST_NAME_UQ']) def _get_match_option(self): return self._attributes['RDB$MATCH_OPTION'] def _get_update_rule(self): return self._attributes['RDB$UPDATE_RULE'] def _get_delete_rule(self): return self._attributes['RDB$DELETE_RULE'] #--- Properties constraint_type = LateBindingProperty(_get_constraint_type,None,None, "primary key/unique/foreign key/check/not null.") table = LateBindingProperty(_get_table,None,None, ":class:`Table` instance this constraint applies to.") index = LateBindingProperty(_get_index,None,None, ":class:`Index` instance that enforces the constraint.\n`None` if constraint is not primary key/unique or foreign key.") trigger_names = LateBindingProperty(_get_trigger_names,None,None, "For a CHECK constraint contains trigger names that enforce the constraint.") triggers = LateBindingProperty(_get_triggers,None,None, "For a CHECK constraint contains :class:`Trigger` instances that enforce the constraint.") column_name = LateBindingProperty(_get_column_name,None,None, "For a NOT NULL constraint, this is the name of the column to which the constraint applies.") partner_constraint = LateBindingProperty(_get_partner_constraint,None,None, "For a FOREIGN KEY constraint, this is the unique or primary key :class:`Constraint` referred.") match_option = LateBindingProperty(_get_match_option,None,None, "For a FOREIGN KEY constraint only. Current value is FULL in all cases.") update_rule = LateBindingProperty(_get_update_rule,None,None, "For a FOREIGN KEY constraint, this is the action applicable to when primary key is updated.") delete_rule = LateBindingProperty(_get_delete_rule,None,None, "For a FOREIGN KEY constraint, this is the action applicable to when primary key is deleted.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitConstraint(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitConstraint(self) def issystemobject(self): "Returns True if this database object is system object." return self.schema.get_table(self._attributes['RDB$RELATION_NAME']).issystemobject() def isnotnull(self): "Returns True if it's NOT NULL constraint." return self.constraint_type == 'NOT NULL' def ispkey(self): "Returns True if it's PRIMARY KEY constraint." return self.constraint_type == 'PRIMARY KEY' def isfkey(self): "Returns True if it's FOREIGN KEY constraint." return self.constraint_type == 'FOREIGN KEY' def isunique(self): "Returns True if it's UNIQUE constraint." return self.constraint_type == 'UNIQUE' def ischeck(self): "Returns True if it's CHECK constraint." return self.constraint_type == 'CHECK' def isdeferrable(self): "Returns True if it's DEFERRABLE constraint." return self._attributes['RDB$DEFERRABLE'] != 'NO' def isdeferred(self): "Returns True if it's INITIALLY DEFERRED constraint." return self._attributes['RDB$INITIALLY_DEFERRED'] != 'NO' class Table(BaseSchemaItem): """Represents Table in database. Supported SQL actions: - User table: create, recreate, drop - System table: none """ def __init__(self,schema,attributes): super(Table,self).__init__(schema,attributes) self._type_code = [0,] self.__columns = None self._strip_attribute('RDB$RELATION_NAME') self._strip_attribute('RDB$OWNER_NAME') self._strip_attribute('RDB$SECURITY_CLASS') self._strip_attribute('RDB$DEFAULT_CLASS') if not self.issystemobject(): self._actions = ['create','recreate','drop'] #--- Protected def _get_create_sql(self,**params): self._check_params(params,[]) tabdef = 'CREATE %sTABLE %s' % ('GLOBAL TEMPORARY ' if self.isgtt() else '', self.get_quoted_name()) if self.isexternal(): tabdef += " EXTERNAL FILE '%s'\n" % self.external_file tabdef += '\n(' partdefs = [] for col in self.columns: coldef = '\n %s ' % col.get_quoted_name() collate = '' if col.isdomainbased(): coldef += '%s' % col.domain.get_quoted_name() elif col.iscomputed(): coldef += 'COMPUTED BY %s' % col.get_computedby() else: datatype = col.datatype if datatype.rfind(' COLLATE ') > 0: datatype, collate = datatype.split(' COLLATE ') coldef += '%s' % datatype if col.has_default(): coldef += ' DEFAULT %s' % col.default if not col.isnullable(): coldef += ' NOT NULL' if col._attributes['RDB$COLLATION_ID'] is not None: cname = col.collation.name if col.domain.character_set._attributes['RDB$DEFAULT_COLLATE_NAME'] != cname: collate = cname if collate: coldef += ' COLLATE %s' % collate partdefs.append(coldef) if self.has_pkey(): pk = self.primary_key pkdef = '\n ' if not pk.name.startswith('INTEG_'): pkdef += 'CONSTRAINT %s\n ' % pk.get_quoted_name() i = pk.index pkdef += 'PRIMARY KEY (%s)' % ','.join(i.segment_names) if not i.issystemobject(): pkdef += '\n USING %s INDEX %s' % (i.index_type,i.get_quoted_name()) partdefs.append(pkdef) for uq in self.constraints: if uq.isunique(): uqdef = '\n ' if not uq.name.startswith('INTEG_'): uqdef += 'CONSTRAINT %s\n ' % uq.get_quoted_name() i = uq.index uqdef += 'UNIQUE (%s)' % ','.join(i.segment_names) if not i.issystemobject(): uqdef += '\n USING %s INDEX %s' % (i.index_type,i.get_quoted_name()) partdefs.append(uqdef) tabdef += ','.join(partdefs) tabdef += '\n)' return tabdef def _get_drop_sql(self,**params): self._check_params(params,[]) return 'DROP TABLE %s' % self.get_quoted_name() def _get_name(self): return self._attributes['RDB$RELATION_NAME'] def _get_id(self): return self._attributes['RDB$RELATION_ID'] def _get_dbkey_length(self): return self._attributes['RDB$DBKEY_LENGTH'] def _get_format(self): return self._attributes['RDB$FORMAT'] def _get_table_type(self): return self.schema.enum_relation_types.get(self._attributes.get('RDB$RELATION_TYPE'), 'PERSISTENT') def _get_security_class(self): return self._attributes['RDB$SECURITY_CLASS'] def _get_external_file(self): return self._attributes['RDB$EXTERNAL_FILE'] def _get_owner_name(self): return self._attributes['RDB$OWNER_NAME'] def _get_default_class(self): return self._attributes['RDB$DEFAULT_CLASS'] def _get_flags(self): return self._attributes['RDB$FLAGS'] def _get_indices(self): return [i for i in self.schema._get_all_indices() if i._attributes['RDB$RELATION_NAME'] == self.name] def _get_triggers(self): return [t for t in self.schema.triggers if t._attributes['RDB$RELATION_NAME'] == self.name] def _get_constraints(self): return [c for c in self.schema.constraints if c._attributes['RDB$RELATION_NAME'] == self.name] def _get_columns(self): if self.__columns is None: self.__columns = [TableColumn(self.schema,self,row) for row in self.schema._select("""select RDB$FIELD_NAME, RDB$RELATION_NAME, RDB$FIELD_SOURCE, RDB$FIELD_POSITION, RDB$UPDATE_FLAG, RDB$FIELD_ID, RDB$DESCRIPTION, RDB$SYSTEM_FLAG, RDB$SECURITY_CLASS, RDB$NULL_FLAG, RDB$DEFAULT_SOURCE, RDB$COLLATION_ID from RDB$RELATION_FIELDS where RDB$RELATION_NAME = ? order by RDB$FIELD_POSITION""",(self.name,))] return self.__columns def _get_primary_key(self): for const in self.constraints: if const.ispkey(): return const return None def _get_foreign_keys(self): return [c for c in self.constraints if c.isfkey()] def _get_privileges(self): return [p for p in self.schema.privileges if ((p.subject_name == self.name) and (p.subject_type in self._type_code))] #--- Properties id = LateBindingProperty(_get_id,None,None,"Internam number ID for the table.") dbkey_length = LateBindingProperty(_get_dbkey_length,None,None, "Length of the RDB$DB_KEY column in bytes.") format = LateBindingProperty(_get_format,None,None, "Internal format ID for the table.") table_type = LateBindingProperty(_get_table_type,None,None,"Table type.") security_class = LateBindingProperty(_get_security_class,None,None, "Security class that define access limits to the table.") external_file = LateBindingProperty(_get_external_file,None,None, "Full path to the external data file, if any.") owner_name = LateBindingProperty(_get_owner_name,None,None, "User name of table's creator.") default_class = LateBindingProperty(_get_default_class,None,None, "Default security class.") flags = LateBindingProperty(_get_flags,None,None,"Internal flags.") primary_key = LateBindingProperty(_get_primary_key,None,None, "PRIMARY KEY :class:`Constraint` for this table or None.") foreign_keys = LateBindingProperty(_get_foreign_keys,None,None, "List of FOREIGN KEY :class:`Constraint` instances for this table.") columns = LateBindingProperty(_get_columns,None,None, "Returns list of columns defined for table.\nItems are :class:`TableColumn` objects.") constraints = LateBindingProperty(_get_constraints,None,None, "Returns list of constraints defined for table.\nItems are :class:`Constraint` objects.") indices = LateBindingProperty(_get_indices,None,None, "Returns list of indices defined for table.\nItems are :class:`Index` objects.") triggers = LateBindingProperty(_get_triggers,None,None, "Returns list of triggers defined for table.\nItems are :class:`Trigger` objects.") privileges = LateBindingProperty(_get_privileges,None,None, "List of :class:`Privilege` objects granted to this object.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitTable(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitTable(self) def get_column(self,name): "Return :class:`TableColumn` object with specified name." for col in self.columns: if col.name == name: return col return None def isgtt(self): "Returns True if table is GLOBAL TEMPORARY table." return self.table_type.startswith('GLOBAL_TEMPORARY') def ispersistent(self): "Returns True if table is persistent one." return self.table_type in ['PERSISTENT','EXTERNAL'] def isexternal(self): "Returns True if table is external table." return bool(self.external_file) def has_pkey(self): "Returns True if table has PRIMARY KEY defined." for const in self.constraints: if const.ispkey(): return True return False def has_fkey(self): "Returns True if table has any FOREIGN KEY constraint." for const in self.constraints: if const.isfkey(): return True return False class View(BaseSchemaItem): """Represents database View. Supported SQL actions: - User views: create, recreate, alter(columns=string_or_list,query=string,check=bool), create_or_alter, drop - System views: none """ def __init__(self,schema,attributes): super(View,self).__init__(schema,attributes) self._type_code = [1,] self.__columns = None self._strip_attribute('RDB$RELATION_NAME') self._strip_attribute('RDB$VIEW_SOURCE') self._strip_attribute('RDB$OWNER_NAME') self._strip_attribute('RDB$SECURITY_CLASS') self._strip_attribute('RDB$DEFAULT_CLASS') if not self.issystemobject(): self._actions = ['create','recreate','alter','create_or_alter','drop'] #--- Protected def _get_create_sql(self,**params): self._check_params(params,[]) return "CREATE VIEW %s (%s)\n AS\n %s" % (self.get_quoted_name(), ','.join([col.get_quoted_name() for col in self.columns]),self.sql) def _get_alter_sql(self,**params): self._check_params(params,['columns','query','check']) columns = params.get('columns') if isinstance(columns,(list,tuple)): columns = ','.join(columns) query = params.get('query') check = params.get('check',False) if query: return "ALTER VIEW %s %s\n AS\n %s" % (self.get_quoted_name(), '(%s)' % columns if columns else '', '%s\n WITH CHECK OPTION' % query if check else query) else: raise fdb.ProgrammingError("Missing required parameter: 'query'.") def _get_drop_sql(self,**params): self._check_params(params,[]) return 'DROP VIEW %s' % self.get_quoted_name() def _get_name(self): return self._attributes['RDB$RELATION_NAME'] def _get_sql(self): return self._attributes['RDB$VIEW_SOURCE'] def _get_id(self): return self._attributes['RDB$RELATION_ID'] def _get_dbkey_length(self): return self._attributes['RDB$DBKEY_LENGTH'] def _get_format(self): return self._attributes['RDB$FORMAT'] def _get_security_class(self): return self._attributes['RDB$SECURITY_CLASS'] def _get_owner_name(self): return self._attributes['RDB$OWNER_NAME'] def _get_default_class(self): return self._attributes['RDB$DEFAULT_CLASS'] def _get_flags(self): return self._attributes['RDB$FLAGS'] def _get_triggers(self): return [t for t in self.schema.triggers if t._attributes['RDB$RELATION_NAME'] == self.name] def _get_columns(self): if self.__columns is None: self.__columns = [ViewColumn(self.schema,self,row) for row in self.schema._select("""select r.RDB$FIELD_NAME, r.RDB$RELATION_NAME, r.RDB$FIELD_SOURCE, r.RDB$FIELD_POSITION, r.RDB$UPDATE_FLAG, r.RDB$FIELD_ID, r.RDB$DESCRIPTION, r.RDB$SYSTEM_FLAG, r.RDB$SECURITY_CLASS, r.RDB$NULL_FLAG, r.RDB$DEFAULT_SOURCE, r.RDB$COLLATION_ID, r.RDB$BASE_FIELD, v.RDB$RELATION_NAME as BASE_RELATION from RDB$RELATION_FIELDS r left join RDB$VIEW_RELATIONS v on r.RDB$VIEW_CONTEXT = v.RDB$VIEW_CONTEXT where r.RDB$RELATION_NAME = ? order by RDB$FIELD_POSITION""",(self.name,))] return self.__columns def _get_privileges(self): return [p for p in self.schema.privileges if ((p.subject_name == self.name) and (p.subject_type == 0))] # Views are logged as Tables in RDB$USER_PRIVILEGES #--- Properties id = LateBindingProperty(_get_id,None,None,"Internal number ID for the view.") sql= LateBindingProperty(_get_sql,None,None,"The query specification.") dbkey_length = LateBindingProperty(_get_dbkey_length,None,None, "Length of the RDB$DB_KEY column in bytes.") format = LateBindingProperty(_get_format,None,None,"Internal format ID for the view.") security_class = LateBindingProperty(_get_security_class,None,None, "Security class that define access limits to the view.") owner_name = LateBindingProperty(_get_owner_name,None,None,"User name of view's creator.") default_class = LateBindingProperty(_get_default_class,None,None,"Default security class.") flags = LateBindingProperty(_get_flags,None,None,"Internal flags.") columns = LateBindingProperty(_get_columns,None,None, "Returns list of columns defined for view.\nItems are :class:`ViewColumn` objects.") triggers = LateBindingProperty(_get_triggers,None,None, "Returns list of triggers defined for view.\nItems are :class:`Trigger` objects.") privileges = LateBindingProperty(_get_privileges,None,None, "List of :class:`Privilege` objects granted to this object.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitView(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitView(self) def get_column(self,name): "Return :class:`TableColumn` object with specified name." for col in self.columns: if col.name == name: return col return None def get_trigger(self,name): "Return :class:`Trigger` object with specified name." for t in self.triggers: if t.name == name: return t return None def has_checkoption(self): "Returns True if View has WITH CHECK OPTION defined." return "WITH CHECK OPTION" in self.sql.upper() class Trigger(BaseSchemaItem): """Represents trigger. Supported SQL actions: - User trigger: create, recreate, create_or_alter, drop, alter(fire_on=string,active=bool,sequence=int,declare=string_or_list, code=string_or_list) - System trigger: none """ def __init__(self,schema,attributes): super(Trigger,self).__init__(schema,attributes) self._type_code = [2,] self._strip_attribute('RDB$TRIGGER_NAME') self._strip_attribute('RDB$RELATION_NAME') if not self.issystemobject(): self._actions = ['create','recreate','alter','create_or_alter','drop'] #--- Protected def _get_create_sql(self,**params): self._check_params(params,[]) result = 'CREATE TRIGGER %s' % self.get_quoted_name() if self._attributes['RDB$RELATION_NAME']: result += ' FOR %s' % self.relation.get_quoted_name() result += ' %s\n%s POSITION %d\n%s' % ('ACTIVE' if self.isactive() else 'INACTIVE', self.get_type_as_string(), self.sequence,self.source) return result def _get_alter_sql(self,**params): self._check_params(params,['fire_on','active','sequence','declare','code']) action = params.get('fire_on') active = params.get('active') sequence = params.get('sequence') declare = params.get('declare') code = params.get('code') # header = '' if active is not None: header += ' ACTIVE' if active else ' INACTIVE' if action is not None: dbaction = action.upper().startswith('ON ') if ((dbaction and not self.isdbtrigger()) or (not dbaction and self.isdbtrigger())): raise fdb.ProgrammingError("Trigger type change is not allowed.") header += '\n %s' % action if sequence is not None: header += '\n POSITION %d' % sequence # if code is not None: if declare is None: d = '' elif isinstance(declare,(list,tuple)): d = '' for x in declare: d += ' %s\n' % x else: d = '%s\n' % declare if isinstance(code,(list,tuple)): c = '' for x in code: c += ' %s\n' % x else: c = '%s\n' % code body = '\nAS\n%sBEGIN\n%sEND' % (d,c) else: body = '' # if not (header or body): raise fdb.ProgrammingError("Header or body definition required.") return 'ALTER TRIGGER %s%s%s' % (self.get_quoted_name(),header,body) def _get_drop_sql(self,**params): self._check_params(params,[]) return 'DROP TRIGGER %s' % self.get_quoted_name() def _get_action_time(self): return (self.trigger_type + 1) & 1 def _get_action_type(self,slot): return ((self.trigger_type + 1) >> (slot * 2 - 1)) & 3 def _get_name(self): return self._attributes['RDB$TRIGGER_NAME'] def _get_relation(self): relname = self._attributes['RDB$RELATION_NAME'] rel = self.schema.get_table(relname) if not rel: rel = self.schema.get_view(relname) return rel def _get_sequence(self): return self._attributes['RDB$TRIGGER_SEQUENCE'] def _get_trigger_type(self): return self._attributes['RDB$TRIGGER_TYPE'] def _get_source(self): return self._attributes['RDB$TRIGGER_SOURCE'] def _get_flags(self): return self._attributes['RDB$FLAGS'] def _istype(self,type_code): atype = self._get_action_type(1) if atype == type_code: return True atype = self._get_action_type(2) if atype and atype == type_code: return True atype = self._get_action_type(3) if atype and atype == type_code: return True return False #--- Properties relation = LateBindingProperty(_get_relation,None,None, ":class:`Table` or :class:`View` that the trigger is for, or None for database triggers") sequence = LateBindingProperty(_get_sequence,None,None, "Sequence (position) of trigger. Zero usually means no sequence defined.") trigger_type = LateBindingProperty(_get_trigger_type,None,None, "Numeric code for trigger type that define what event and when are covered by trigger.") source = LateBindingProperty(_get_source,None,None,"PSQL source code.") flags = LateBindingProperty(_get_flags,None,None,"Internal flags.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitTrigger(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitTrigger(self) def isactive(self): "Returns True if this trigger is active." return self._attributes['RDB$TRIGGER_INACTIVE'] == 0 def isbefore(self): "Returns True if this trigger is set for BEFORE action." return self._get_action_time() == 0 def isafter(self): "Returns True if this trigger is set for AFTER action." return self._get_action_time() == 1 def isdbtrigger(self): "Returns True if this trigger is database trigger." return (self.trigger_type & TRIGGER_TYPE_MASK) == TRIGGER_TYPE_DB def isinsert(self): "Returns True if this trigger is set for INSERT operation." return self._istype(1) def isupdate(self): "Returns True if this trigger is set for UPDATE operation." return self._istype(2) def isdelete(self): "Returns True if this trigger is set for DELETE operation." return self._istype(3) def get_type_as_string(self): "Return string with action and operation specification." l = [] if self.isdbtrigger(): l.append('ON '+TRIGGER_DB_TYPES[self.trigger_type & ~TRIGGER_TYPE_DB]) else: l.append(TRIGGER_PREFIX_TYPES[self._get_action_time()]) l.append(TRIGGER_SUFFIX_TYPES[self._get_action_type(1)]) sufix = self._get_action_type(2) if sufix: l.append('OR') l.append(TRIGGER_SUFFIX_TYPES[sufix]) sufix = self._get_action_type(3) if sufix: l.append('OR') l.append(TRIGGER_SUFFIX_TYPES[sufix]) return ' '.join(l) class ProcedureParameter(BaseSchemaItem): """Represents procedure parameter. Supported SQL actions: none. """ def __init__(self,schema,proc,attributes): super(ProcedureParameter,self).__init__(schema,attributes) self.__proc = proc self._strip_attribute('RDB$PARAMETER_NAME') self._strip_attribute('RDB$PROCEDURE_NAME') self._strip_attribute('RDB$FIELD_SOURCE') self._strip_attribute('RDB$RELATION_NAME') self._strip_attribute('RDB$FIELD_NAME') #--- Protected def _get_name(self): return self._attributes['RDB$PARAMETER_NAME'] def _get_procedure(self): return self.schema.get_procedure(self._attributes['RDB$PROCEDURE_NAME']) def _get_sequence(self): return self._attributes['RDB$PARAMETER_NUMBER'] def _get_domain(self): return self.schema.get_domain(self._attributes['RDB$FIELD_SOURCE']) def _get_datatype(self): return self.domain.datatype def _get_type_from(self): m = self.mechanism if m is None: return PROCPAR_DATATYPE elif m == 0: return PROCPAR_DATATYPE if self.domain.issystemobject() else PROCPAR_DOMAIN elif m == 1: if self._attributes.get('RDB$RELATION_NAME') is None: return PROCPAR_TYPE_OF_DOMAIN else: return PROCPAR_TYPE_OF_COLUMN else: raise fdb.InternalError("Unknown parameter mechanism code: %d" % m) def _get_default(self): result = self._attributes.get('RDB$DEFAULT_SOURCE') if result: if result.upper().startswith('= '): result = result[2:] elif result.upper().startswith('DEFAULT '): result = result[8:] return result def _get_collation(self): cid = self._attributes.get('RDB$COLLATION_ID') return (None if cid is None else self.schema.get_collation_by_id(self.domain._attributes['RDB$CHARACTER_SET_ID'],cid)) def _get_mechanism(self): return self._attributes.get('RDB$PARAMETER_MECHANISM') def _get_column(self): rname = self._attributes.get('RDB$RELATION_NAME') return (None if rname is None else self.schema.get_table(rname).get_column(self._attributes['RDB$FIELD_NAME'])) #--- Properties procedure = LateBindingProperty(_get_procedure,None,None, "Name of the stored procedure.") sequence = LateBindingProperty(_get_sequence,None,None, "Sequence (position) of parameter.") domain = LateBindingProperty(_get_domain,None,None, ":class:`Domain` for this parameter.") datatype = LateBindingProperty(_get_datatype,None,None, "Comlete SQL datatype definition.") type_from = LateBindingProperty(_get_type_from,None,None, "Numeric code. See :attr:`Schema.enum_param_type_from`.`") # FB 2.1 default = LateBindingProperty(_get_default,None,None,"Default value.") collation = LateBindingProperty(_get_collation,None,None, ":class:`collation` for this parameter.") mechanism = LateBindingProperty(_get_mechanism,None,None, "Parameter mechanism code.") # FB 2.5 column = LateBindingProperty(_get_column,None,None, ":class:`TableColumn` for this parameter.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitProcedureParameter(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitProcedureParameter(self) def get_sql_definition(self): "Returns SQL definition for parameter." typedef = self.datatype if self.type_from == PROCPAR_DOMAIN: typedef = self.domain.get_quoted_name() elif self.type_from == PROCPAR_TYPE_OF_DOMAIN: typedef = 'TYPE OF %s' % self.domain.get_quoted_name() elif self.type_from == PROCPAR_TYPE_OF_COLUMN: typedef = 'TYPE OF COLUMN %s.%s' % (self.column.table.get_quoted_name(), self.column.get_quoted_name()) result = '%s %s%s' % (self.get_quoted_name(),typedef, '' if self.isnullable() else ' NOT NULL') c = self.collation if c is not None: result += ' COLLATE %s' % c.get_quoted_name() if self.isinput() and self.has_default(): result += ' = %s' % self.default return result def isinput(self): "Returns True if parameter is INPUT parameter." return self._attributes['RDB$PARAMETER_TYPE'] == 0 def isnullable(self): "Returns True if parameter allows NULL." return not bool(self._attributes.get('RDB$NULL_FLAG')) def has_default(self): "Returns True if parameter has default value." return bool(self._attributes.get('RDB$DEFAULT_SOURCE')) class Procedure(BaseSchemaItem): """Represents stored procedure. Supported SQL actions: - User procedure: create(no_code=bool), recreate(no_code=bool), create_or_alter(no_code=bool), drop, alter(input=string_or_list,output=string_or_list,declare=string_or_list, code=string_or_list) - System procedure: none """ def __init__(self,schema,attributes): super(Procedure,self).__init__(schema,attributes) self._type_code = [5,] self.__inputParams = self.__outputParams = None self._strip_attribute('RDB$PROCEDURE_NAME') self._strip_attribute('RDB$OWNER_NAME') self._strip_attribute('RDB$SECURITY_CLASS') self.__ods = schema._con.ods if not self.issystemobject(): self._actions = ['create','recreate','alter','create_or_alter','drop'] #--- Protected def _get_create_sql(self,**params): self._check_params(params,['no_code']) no_code = params.get('no_code') result = 'CREATE PROCEDURE %s' % self.get_quoted_name() if self.has_input(): if self._attributes['RDB$PROCEDURE_INPUTS'] == 1: result += ' (%s)\n' % self.input_params[0].get_sql_definition() else: result += ' (\n' for p in self.input_params: result += ' %s%s\n' % (p.get_sql_definition(), '' if p.sequence+1 == self._attributes['RDB$PROCEDURE_INPUTS'] else ',') result += ')\n' else: result += '\n' if self.has_output(): if self._attributes['RDB$PROCEDURE_OUTPUTS'] == 1: result += 'RETURNS (%s)\n' % self.output_params[0].get_sql_definition() else: result += 'RETURNS (\n' for p in self.output_params: result += ' %s%s\n' % (p.get_sql_definition(), '' if p.sequence+1 == self._attributes['RDB$PROCEDURE_OUTPUTS'] else ',') result += ')\n' return result+'AS\n'+('BEGIN\nEND' if no_code else self.source) def _get_alter_sql(self,**params): self._check_params(params,['input','output','declare','code']) inpars = params.get('input') outpars = params.get('output') declare = params.get('declare') code = params.get('code') if code is None: raise fdb.ProgrammingError("Missing required parameter: 'code'.") # header = '' if inpars is not None: if isinstance(inpars,(list,tuple)): numpars = len(inpars) if numpars == 1: header = ' (%s)\n' % inpars else: header = ' (\n' i = 1 for p in inpars: header += ' %s%s\n' % (p,'' if i == numpars else ',') i += 1 header += ')\n' else: header = ' (%s)\n' % inpars # if outpars is not None: if not header: header += '\n' if isinstance(outpars,(list,tuple)): numpars = len(outpars) if numpars == 1: header += 'RETURNS (%s)\n' % outpars else: header += 'RETURNS (\n' i = 1 for p in outpars: header += ' %s%s\n' % (p,'' if i == numpars else ',') i += 1 header += ')\n' else: header += 'RETURNS (%s)\n' % outpars # if code: if declare is None: d = '' elif isinstance(declare,(list,tuple)): d = '' for x in declare: d += ' %s\n' % x else: d = '%s\n' % declare if isinstance(code,(list,tuple)): c = '' for x in code: c += ' %s\n' % x else: c = '%s\n' % code body = '%sAS\n%sBEGIN\n%sEND' % ('' if header else '\n',d,c) else: body = '%sAS\nBEGIN\nEND' % ('' if header else '\n') # return 'ALTER PROCEDURE %s%s%s' % (self.get_quoted_name(),header,body) def _get_drop_sql(self,**params): self._check_params(params,[]) return 'DROP PROCEDURE %s' % self.get_quoted_name() def __param_columns(self): cols = ['RDB$PARAMETER_NAME','RDB$PROCEDURE_NAME','RDB$PARAMETER_NUMBER', 'RDB$PARAMETER_TYPE','RDB$FIELD_SOURCE','RDB$DESCRIPTION', 'RDB$SYSTEM_FLAG'] if self.__ods >= fdb.ODS_FB_21: cols.extend(['RDB$DEFAULT_SOURCE','RDB$COLLATION_ID','RDB$NULL_FLAG', 'RDB$PARAMETER_MECHANISM']) if self.__ods >= fdb.ODS_FB_25: cols.extend(['RDB$FIELD_NAME','RDB$RELATION_NAME']) return ','.join(cols) def _get_name(self): return self._attributes['RDB$PROCEDURE_NAME'] def _get_id(self): return self._attributes['RDB$PROCEDURE_ID'] def _get_source(self): return self._attributes['RDB$PROCEDURE_SOURCE'] def _get_security_class(self): return self._attributes['RDB$SECURITY_CLASS'] def _get_owner_name(self): return self._attributes['RDB$OWNER_NAME'] def _get_input_params(self): if self.__inputParams is None: if self.has_input(): self.__inputParams = [ProcedureParameter(self.schema,self,row) for row in self.schema._select("""select %s from rdb$procedure_parameters where rdb$procedure_name = ? and rdb$parameter_type = 0 order by rdb$parameter_number""" % self.__param_columns(),(self.name,))] else: self.__inputParams = [] return self.__inputParams def _get_output_params(self): if self.__outputParams is None: if self.has_output(): self.__outputParams = [ProcedureParameter(self.schema,self,row) for row in self.schema._select("""select %s from rdb$procedure_parameters where rdb$procedure_name = ? and rdb$parameter_type = 1 order by rdb$parameter_number""" % self.__param_columns(),(self.name,))] else: self.__outputParams = [] return self.__outputParams def _get_proc_type(self): return self._attributes.get('RDB$PROCEDURE_TYPE',0) def _get_valid_blr(self): result = self._attributes.get('RDB$VALID_BLR') return bool(result) if result is not None else None def _get_privileges(self): return [p for p in self.schema.privileges if ((p.subject_name == self.name) and (p.subject_type in self._type_code))] #--- Properties id = LateBindingProperty(_get_id,None,None,"Internal unique ID number.") source = LateBindingProperty(_get_source,None,None,"PSQL source code.") security_class = LateBindingProperty(_get_security_class,None,None, "Security class that define access limits to the procedure.") owner_name = LateBindingProperty(_get_owner_name,None,None, "User name of procedure's creator.") input_params = LateBindingProperty(_get_input_params,None,None, "List of input parameters.\nInstances are :class:`ProcedureParameter` instances.") output_params = LateBindingProperty(_get_output_params,None,None, "List of output parameters.\nInstances are :class:`ProcedureParameter` instances.") privileges = LateBindingProperty(_get_privileges,None,None, "List of :class:`Privilege` objects granted to this object.") # FB 2.1 proc_type = LateBindingProperty(_get_proc_type,None,None, "Procedure type code. See :attr:`fdb.Connection.enum_procedure_types`.") valid_blr = LateBindingProperty(_get_valid_blr,None,None, "Procedure BLR invalidation flag. Coul be True/False or None.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitProcedure(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitProcedure(self) def get_param(self,name): "Returns :class:`ProcedureParameter` with specified name or None" for p in self.output_params: if p.name == name: return p for p in self.input_params: if p.name == name: return p return None def has_input(self): "Returns True if procedure has any input parameters." return bool(self._attributes['RDB$PROCEDURE_INPUTS']) def has_output(self): "Returns True if procedure has any output parameters." return bool(self._attributes['RDB$PROCEDURE_OUTPUTS']) class Role(BaseSchemaItem): """Represents user role. Supported SQL actions: - User role: create, drop - System role: none """ def __init__(self,schema,attributes): super(Role,self).__init__(schema,attributes) self._type_code = [13,] self._strip_attribute('RDB$ROLE_NAME') self._strip_attribute('RDB$OWNER_NAME') if not self.issystemobject(): self._actions = ['create','drop'] #--- Protected def _get_create_sql(self,**params): self._check_params(params,[]) return 'CREATE ROLE %s' % self.get_quoted_name() def _get_drop_sql(self,**params): self._check_params(params,[]) return 'DROP ROLE %s' % self.get_quoted_name() def _get_name(self): return self._attributes['RDB$ROLE_NAME'] def _get_owner_name(self): return self._attributes['RDB$OWNER_NAME'] def _get_privileges(self): return [p for p in self.schema.privileges if ((p.subject_name == self.name) and (p.subject_type in self._type_code))] #--- Properties owner_name = LateBindingProperty(_get_owner_name,None,None,"User name of role owner.") privileges = LateBindingProperty(_get_privileges,None,None, "List of :class:`Privilege` objects granted to this object.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitRole(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitRole(self) class FunctionArgument(BaseSchemaItem): """Represets UDF argument. Supported SQL actions: none. """ def __init__(self,schema,function,attributes): super(FunctionArgument,self).__init__(schema,attributes) self._type_code = [15,] self.__function = function self._strip_attribute('RDB$FUNCTION_NAME') #--- Protected def _get_name(self): return self._attributes['RDB$FUNCTION_NAME']+'_'+str(self._get_position()) def _get_function(self): return self.__function #return self.schema.get_function(self._attributes['RDB$FUNCTION_NAME']) def _get_position(self): return self._attributes['RDB$ARGUMENT_POSITION'] def _get_mechanism(self): return abs(self._attributes['RDB$MECHANISM']) def _get_length(self): return self._attributes['RDB$FIELD_LENGTH'] def _get_scale(self): return self._attributes['RDB$FIELD_SCALE'] def _get_field_type(self): return self._attributes['RDB$FIELD_TYPE'] def _get_sub_type(self): return self._attributes['RDB$FIELD_SUB_TYPE'] def _get_character_length(self): return self._attributes['RDB$CHARACTER_LENGTH'] def _get_character_set(self): return self.schema.get_character_set_by_id(self._attributes['RDB$CHARACTER_SET_ID']) def _get_precision(self): return self._attributes['RDB$FIELD_PRECISION'] def _get_datatype(self): l = [] precision_known = False if self.field_type in (FBT_SMALLINT,FBT_INTEGER,FBT_BIGINT): if self.precision != None: if (self.sub_type > 0) and (self.sub_type < MAX_INTSUBTYPES): l.append('%s(%d, %d)' % \ (INTEGRAL_SUBTYPES[self.sub_type],self.precision,-self.scale)) precision_known = True if not precision_known: if (self.field_type == FBT_SMALLINT) and (self.scale < 0): l.append('NUMERIC(4, %d)' % -self.scale) elif (self.field_type == FBT_INTEGER) and (self.scale < 0): l.append('NUMERIC(9, %d)' % -self.scale) elif (self.field_type == FBT_DOUBLE_PRECISION) and (self.scale < 0): l.append('NUMERIC(15, %d)' % -self.scale) else: l.append(COLUMN_TYPES[self.field_type]) if self.field_type in (FBT_CHAR,FBT_VARCHAR,FBT_CSTRING): l.append('(%d)' % (self.length if (self.character_length is None) else self.character_length)) if self.field_type == FBT_BLOB: if self.sub_type >= 0 and self.sub_type <= MAX_BLOBSUBTYPES: if self.sub_type > 0: l.append(' SUB_TYPE %s' % BLOB_SUBTYPES[self.sub_type]) else: l.append(' SUB_TYPE %d' % self.sub_type) if self.field_type in (FBT_CHAR,FBT_VARCHAR,FBT_CSTRING,FBT_BLOB): if self._attributes['RDB$CHARACTER_SET_ID'] is not None and \ (self.character_set.name != self.schema.default_character_set.name): l.append(' CHARACTER SET %s' % self.character_set.name) return ''.join(l) #--- Properties function = LateBindingProperty(_get_function,None,None, ":class:`Function` to which this argument belongs.") position = LateBindingProperty(_get_position,None,None,"Argument position.") mechanism = LateBindingProperty(_get_mechanism,None,None,"How argument is passed.") field_type = LateBindingProperty(_get_field_type,None,None, "Number code of the data type defined for the argument.") length = LateBindingProperty(_get_length,None,None, "Length of the argument in bytes.") scale = LateBindingProperty(_get_scale,None,None, "Negative number representing the scale of NUMBER and DECIMAL argument.") precision = LateBindingProperty(_get_precision,None,None, "Indicates the number of digits of precision available to the data type of the argument.") sub_type = LateBindingProperty(_get_sub_type,None,None,"BLOB subtype.") character_length = LateBindingProperty(_get_character_length,None,None, "Length of CHAR and VARCHAR column, in characters (not bytes).") character_set = LateBindingProperty(_get_character_set,None,None, ":class:`CharacterSet` for a character/text BLOB argument, or None.") datatype = LateBindingProperty(_get_datatype,None,None, "Comlete SQL datatype definition.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitFunctionArgument(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitFunctionArgument(self) def get_sql_definition(self): "Returns SQL definition for parameter." return '%s%s%s' % (self.datatype, ' BY DESCRIPTOR' if self.isbydescriptor() else '', ' BY VALUE' if self.isbyvalue() and self.isreturning() else '', ) def isbyvalue(self): "Returns True if argument is passed by value." return self.mechanism == 0 def isbyreference(self): "Returns True if argument is passed by reference." return self.mechanism in [1,5] def isbydescriptor(self,any=False): """Returns True if argument is passed by descriptor. :param bool any: If True, method returns True if any kind of descriptor is used (including BLOB and ARRAY descriptors). """ return self.mechanism in [2,3,4] if any else self.mechanism == 2 def iswithnull(self): "Returns True if argument is passed by reference with NULL support." return self.mechanism == 5 def isfreeit(self): "Returns True if (return) argument is declared as FREE_IT." return self._attributes['RDB$MECHANISM'] < 0 def isreturning(self): "Returns True if argument represents return value for function." return self.position == self.function._attributes['RDB$RETURN_ARGUMENT'] class Function(BaseSchemaItem): """Represents user defined function. Supported SQL actions: - User UDF: declare, drop - System UDF: none """ def __init__(self,schema,attributes): super(Function,self).__init__(schema,attributes) self._type_code = [15,] self.__arguments = None self.__returns = None self._strip_attribute('RDB$FUNCTION_NAME') self._strip_attribute('RDB$MODULE_NAME') self._strip_attribute('RDB$ENTRYPOINT') if not self.issystemobject(): self._actions = ['declare','drop'] #--- Protected def _get_declare_sql(self,**params): self._check_params(params,[]) fdef = 'DECLARE EXTERNAL FUNCTION %s\n' % self.get_quoted_name() for p in self.arguments: fdef += ' %s%s\n' % (p.get_sql_definition(), '' if p.position == len(self.arguments) else ',') if self.has_return(): fdef += 'RETURNS %s%s\n' % ('PARAMETER %d' % self._attributes['RDB$RETURN_ARGUMENT'] if self.has_return_argument() else self.returns.get_sql_definition(), ' FREE_IT' if self.returns.isfreeit() else '') return "%sENTRY_POINT '%s'\nMODULE_NAME '%s'" % (fdef,self.entrypoint, self.module_name) def _get_drop_sql(self,**params): self._check_params(params,[]) return 'DROP EXTERNAL FUNCTION %s' % self.get_quoted_name() def _load_arguments(self,mock=None): self.__arguments = [FunctionArgument(self.schema,self,row) for row in (mock if mock else self.schema._select("""select * from rdb$function_arguments where rdb$function_name = ? order by rdb$argument_position""",(self.name,)))] rarg = self._attributes['RDB$RETURN_ARGUMENT'] if rarg is not None: for a in self.__arguments: if a.position == rarg: self.__returns = weakref.ref(a) def _get_name(self): return self._attributes['RDB$FUNCTION_NAME'] def _get_module_name(self): return self._attributes['RDB$MODULE_NAME'] def _get_entrypoint(self): return self._attributes['RDB$ENTRYPOINT'] def _get_returns(self): if self.__arguments is None: self._load_arguments() return self.__returns if self.__returns is None else self.__returns() def _get_arguments(self): if self.__arguments is None: self._load_arguments() return [a for a in self.__arguments if a.position != 0] #--- Properties module_name = LateBindingProperty(_get_module_name,None,None,"Module name.") entrypoint = LateBindingProperty(_get_entrypoint,None,None,"Entrypoint in module.") returns = LateBindingProperty(_get_returns,None,None, "Returning :class:`FunctionArgument` or None.") arguments = LateBindingProperty(_get_arguments,None,None, "List of function arguments. Items are :class:`FunctionArgument` instances.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitFunction(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitFunction(self) def has_arguments(self): "Returns True if function has input arguments." return bool(self.arguments) def has_return(self): "Returns True if function returns a value." return (self.returns is not None) def has_return_argument(self): "Returns True if function returns a value in input argument." return (self.returns.position != 0 if self.returns is not None else False) class DatabaseFile(BaseSchemaItem): """Represents database extension file. Supported SQL actions: create """ def __init__(self,schema,attributes): super(DatabaseFile,self).__init__(schema,attributes) self._type_code = [] self._strip_attribute('RDB$FILE_NAME') #--- Protected def _get_name(self): return 'FILE_%d' % self.sequence def _get_filename(self): return self._attributes['RDB$FILE_NAME'] def _get_sequence(self): return self._attributes['RDB$FILE_SEQUENCE'] def _get_start(self): return self._attributes['RDB$FILE_START'] def _get_length(self): return self._attributes['RDB$FILE_LENGTH'] #--- Properties filename = LateBindingProperty(_get_filename,None,None,"File name.") sequence = LateBindingProperty(_get_sequence,None,None,"File sequence number.") start = LateBindingProperty(_get_start,None,None,"File start page number.") length = LateBindingProperty(_get_length,None,None,"File length in pages.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitDatabaseFile(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitDatabaseFile(self) def issystemobject(self): "Returns True." return True class Shadow(BaseSchemaItem): """Represents database shadow. Supported SQL actions: create, drop """ SHADOW_INACTIVE = 2 SHADOW_MANUAL = 4 SHADOW_CONDITIONAL = 16 def __init__(self,schema,attributes): super(Shadow,self).__init__(schema,attributes) self._type_code = [] self.__files = None self._actions = ['create','drop'] def _get_create_sql(self,**params): self._check_params(params,[]) result = 'CREATE SHADOW %d %s%s' % (self.id,'MANUAL' if self.ismanual() else 'AUTO', ' CONDITIONAL' if self.isconditional() else '') if len(self.files) == 1: result += " '%s'" % self.files[0].filename else: f = self.files[0] result += " '%s'%s\n" % (f.filename, ' LENGTH %d' % f.length if f.length > 0 else '') for f in self.files[1:]: result += " FILE '%s'%s%s" % (f.filename, ' STARTING AT %d' % f.start if f.start > 0 else '', ' LENGTH %d' % f.length if f.length > 0 else '') if f.sequence < len(self.files)-1: result += '\n' return result def _get_drop_sql(self,**params): self._check_params(params,[]) return 'DROP SHADOW %d' % self.id def _get_name(self): return 'SHADOW_%d' % self.id def _get_id(self): return self._attributes['RDB$SHADOW_NUMBER'] def _get_flags(self): return self._attributes['RDB$FILE_FLAGS'] def _get_files(self): if self.__files is None: self.__files = [DatabaseFile(self,row) for row in self.schema._select(""" select RDB$FILE_NAME, RDB$FILE_SEQUENCE, RDB$FILE_START, RDB$FILE_LENGTH from RDB$FILES where RDB$SHADOW_NUMBER = ? order by RDB$FILE_SEQUENCE""",(self._attributes['RDB$SHADOW_NUMBER'],))] return self.__files #--- Properties id = LateBindingProperty(_get_id,None,None,"Shadow ID number.") flags = LateBindingProperty(_get_flags,None,None,"Shadow flags.") files = LateBindingProperty(_get_files,None,None, "List of shadow files. Items are :class:`DatabaseFile` instances.") #--- Public def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitShadow(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitShadow(self) def issystemobject(self): "Returns False." return False def ismanual(self): "Returns True if it's MANUAL shadow." return bool(self.flags & self.SHADOW_MANUAL) def isinactive(self): "Returns True if it's INACTIVE shadow." return bool(self.flags & self.SHADOW_INACTIVE) def isconditional(self): "Returns True if it's CONDITIONAL shadow." return bool(self.flags & self.SHADOW_CONDITIONAL) class Privilege(BaseSchemaItem): """Represents priviledge to database object. Supported SQL actions: grant(grantors),revoke(grantors,grant_option) """ def __init__(self,schema,attributes): super(Privilege,self).__init__(schema,attributes) self._type_code = [] self._actions = ['grant','revoke'] self._strip_attribute('RDB$USER') self._strip_attribute('RDB$GRANTOR') self._strip_attribute('RDB$PRIVILEGE') self._strip_attribute('RDB$RELATION_NAME') self._strip_attribute('RDB$FIELD_NAME') def _get_grant_sql(self,**params): self._check_params(params,['grantors']) grantors = params.get('grantors') privileges = {'S':'SELECT','I':'INSERT','U':'UPDATE','D':'DELETE','R':'REFERENCES'} admin_option = ' WITH GRANT OPTION' if self.has_grant() else '' if self.privilege in privileges: privilege = privileges[self.privilege] if self.field_name is not None: privilege += '(%s)' % self.field_name privilege += ' ON ' elif self.privilege == 'X': # procedure privilege = 'EXECUTE ON PROCEDURE ' else: # role membership privilege = '' admin_option = ' WITH ADMIN OPTION' if self.has_grant() else '' user = self.user if isinstance(user,Procedure): utype = 'PROCEDURE ' elif isinstance(user,Trigger): utype = 'TRIGGER ' elif isinstance(user,View): utype = 'VIEW ' else: utype = '' if (grantors is not None) and (self.grantor_name not in grantors): granted_by = ' GRANTED BY %s' % self.grantor_name else: granted_by = '' return 'GRANT %s%s TO %s%s%s%s' % (privilege,self.subject_name,utype, self.user_name,admin_option,granted_by) def _get_revoke_sql(self,**params): self._check_params(params,['grant_option','grantors']) grantors = params.get('grantors') option_only = params.get('grant_option',False) if option_only and not self.has_grant(): raise fdb.ProgrammingError("Can't revoke grant option that wasn't granted.") privileges = {'S':'SELECT','I':'INSERT','U':'UPDATE','D':'DELETE','R':'REFERENCES'} admin_option = 'GRANT OPTION FOR ' if self.has_grant() and option_only else '' if self.privilege in privileges: privilege = privileges[self.privilege] if self.field_name is not None: privilege += '(%s)' % self.field_name privilege += ' ON ' elif self.privilege == 'X': # procedure privilege = 'EXECUTE ON PROCEDURE ' else: # role membership privilege = '' admin_option = 'ADMIN OPTION FOR' if self.has_grant() and option_only else '' user = self.user if isinstance(user,Procedure): utype = 'PROCEDURE ' elif isinstance(user,Trigger): utype = 'TRIGGER ' elif isinstance(user,View): utype = 'VIEW ' else: utype = '' if (grantors is not None) and (self.grantor_name not in grantors): granted_by = ' GRANTED BY %s' % self.grantor_name else: granted_by = '' return 'REVOKE %s%s%s FROM %s%s%s' % (admin_option,privilege, self.subject_name,utype, self.user_name,granted_by) def _get_user(self): return self.schema._get_item(self._attributes['RDB$USER'], self._attributes['RDB$USER_TYPE']) def _get_grantor(self): return fdb.services.User(self._attributes['RDB$GRANTOR']) def _get_privilege(self): return self._attributes['RDB$PRIVILEGE'] def _get_subject(self): rname = self._attributes['RDB$RELATION_NAME'] result = self.schema._get_item(rname, self.subject_type, self.field_name) if result is None and self.subject_type == 0: # Views are logged as tables, so try again for view code result = self.schema._get_item(rname, 1, self.field_name) return result def _get_user_name(self): return self._attributes['RDB$USER'] def _get_user_type(self): return self._attributes['RDB$USER_TYPE'] def _get_grantor_name(self): return self._attributes['RDB$GRANTOR'] def _get_subject_name(self): return self._attributes['RDB$RELATION_NAME'] def _get_subject_type(self): return self._attributes['RDB$OBJECT_TYPE'] def _get_field_name(self): return self._attributes['RDB$FIELD_NAME'] #--- Properties user = LateBindingProperty(_get_user,None,None, "Grantee. Either :class:`~fdb.services.User`, :class:`Role`, " \ ":class:`Procedure`, :class:`Trigger` or :class:`View` object.") grantor = LateBindingProperty(_get_grantor,None,None, "Grantor :class:`~fdb.services.User` object.") privilege = LateBindingProperty(_get_privilege,None,None,"Privilege code.") subject = LateBindingProperty(_get_subject,None,None, "Priviledge subject. Either :class:`Role`, :class:`Table`, :class:`View` " \ "or :class:`Procedure` object.") user_name = LateBindingProperty(_get_user_name,None,None,"User name.") user_type = LateBindingProperty(_get_user_type,None,None,"User type.") grantor_name = LateBindingProperty(_get_grantor_name,None,None,"Grantor name.") subject_name = LateBindingProperty(_get_subject_name,None,None,"Subject name.") subject_type = LateBindingProperty(_get_subject_type,None,None,"Subject type.") field_name = LateBindingProperty(_get_field_name,None,None,"Field name.") def accept_visitor(self,visitor): """Visitor Pattern support. Calls `visitPrivilege(self)` on parameter object. :param visitor: Visitor object of Vistior Pattern. """ visitor.visitPrivilege(self) def has_grant(self): "Returns True if privilege comes with GRANT OPTION." return bool(self._attributes['RDB$GRANT_OPTION']) def issystemobject(self): "Returns True." return True def isselect(self): "Returns True if this is SELECT privilege." return self.privilege == 'S' def isinsert(self): "Returns True if this is INSERT privilege." return self.privilege == 'I' def isupdate(self): "Returns True if this is UPDATE privilege." return self.privilege == 'U' def isdelete(self): "Returns True if this is DELETE privilege." return self.privilege == 'D' def isexecute(self): "Returns True if this is EXECUTE privilege." return self.privilege == 'X' def isreference(self): "Returns True if this is REFERENCE privilege." return self.privilege == 'R' def ismembership(self): "Returns True if this is ROLE membership privilege." return self.privilege == 'M' class SchemaVisitor(object): """Helper class for implementation of schema Visitor. Implements all `visit*` methods supported by schema classes as calls to :meth:`default_action`. """ def default_action(self,obj): "Does nothing." pass def visitSchema(self,schema): self.default_action(schema) def visitMetadataItem(self,item): self.default_action(item) def visitCollation(self,collation): self.default_action(collation) def visitCharacterSet(self,character_set): self.default_action(character_set) def visitException(self,exception): self.default_action(exception) def visitGenerator(self,generator): self.default_action(generator) def visitTableColumn(self,column): self.default_action(column) def visitIndex(self,index): self.default_action(index) def visitViewColumn(self,column): self.default_action(column) def visitDomain(self,domain): self.default_action(domain) def visitDependency(self,dependency): self.default_action(dependency) def visitConstraint(self,constraint): self.default_action(constraint) def visitTable(self,table): self.default_action(table) def visitView(self,view): self.default_action(view) def visitTrigger(self,trigger): self.default_action(trigger) def visitProcedureParameter(self,param): self.default_action(param) def visitProcedure(self,procedure): self.default_action(procedure) def visitRole(self,role): self.default_action(role) def visitFunctionArgument(self,arg): self.default_action(arg) def visitFunction(self,function): self.default_action(function) def visitDatabaseFile(self,dbfile): self.default_action(dbfile) def visitShadow(self,shadow): self.default_action(shadow) fdb-1.4.9+dfsg1/fdb/ibase.py0000644000215700017510000022647412542250241014371 0ustar rstuartit#coding:utf-8 # # PROGRAM/MODULE: fdb # FILE: ibase.py # DESCRIPTION: Python ctypes interface to Firebird client library # CREATED: 6.10.2011 # # 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 Pavel Cisar # # Copyright (c) 2011 Pavel Cisar # and all contributors signed below. # # All Rights Reserved. # Contributor(s): Philippe Makowski # ______________________________________. # # See LICENSE.TXT for details. from ctypes import * from ctypes.util import find_library import sys import locale import types import operator import platform import os PYTHON_MAJOR_VER = sys.version_info[0] #------------------- if PYTHON_MAJOR_VER == 3: from queue import PriorityQueue def nativestr(st,charset="latin-1"): if st == None: return st elif isinstance(st, bytes): return st.decode(charset) else: return st def b(st,charset="latin-1"): if st == None: return st elif isinstance(st, bytes): return st else: try: return st.encode(charset) except UnicodeEncodeError: return st def s(st): return st ord2 = lambda x: x if type(x) == IntType else ord(x) if sys.version_info[1] <= 1: def int2byte(i): return bytes((i,)) else: # This is about 2x faster than the implementation above on 3.2+ int2byte = operator.methodcaller("to_bytes", 1, "big") def mychr(i): return i mybytes = bytes myunicode = str mylong = int StringType = str IntType = int LongType = int FloatType = float ListType = list UnicodeType = str TupleType = tuple xrange = range else: from Queue import PriorityQueue def nativestr(st,charset="latin-1"): if st == None: return st elif isinstance(st, unicode): return st.encode(charset) else: return st def b(st,charset="latin-1"): if st == None: return st elif isinstance(st, types.StringType): return st else: try: return st.encode(charset) except UnicodeEncodeError: return st int2byte = chr s = str ord2 = ord def mychr(i): return chr(i) mybytes = str myunicode = unicode mylong = long StringType = types.StringType IntType = types.IntType LongType = types.LongType FloatType = types.FloatType ListType = types.ListType UnicodeType = types.UnicodeType TupleType = types.TupleType xrange = xrange # Support routines from ctypesgen generated file. # As of ctypes 1.0, ctypes does not support custom error-checking # functions on callbacks, nor does it support custom datatypes on # callbacks, so we must ensure that all callbacks return # primitive datatypes. # # Non-primitive return values wrapped with UNCHECKED won't be # typechecked, and will be converted to c_void_p. def UNCHECKED(type): if (hasattr(type, "_type_") and isinstance(type._type_, str) and type._type_ != "P"): return type else: return c_void_p # ibase.h FB_API_VER = 25 MAX_BLOB_SEGMENT_SIZE = 65535 # Event queue operation (and priority) codes OP_DIE = 1 OP_RECORD_AND_REREGISTER = 2 charset_map = { # DB CHAR SET NAME : PYTHON CODEC NAME (CANONICAL) # ------------------------------------------------------------------------- None : locale.getpreferredencoding(), 'NONE' : locale.getpreferredencoding(), 'OCTETS' : None, # Allow to pass through unchanged. 'UNICODE_FSS' : 'utf_8', 'UTF8' : 'utf_8', # (Firebird 2.0+) 'SJIS_0208' : 'shift_jis', 'EUCJ_0208' : 'euc_jp', 'DOS737' : 'cp737', 'DOS437' : 'cp437', 'DOS850' : 'cp850', 'DOS865' : 'cp865', 'DOS860' : 'cp860', 'DOS863' : 'cp863', 'DOS775' : 'cp775', 'DOS862' : 'cp862', 'DOS864' : 'cp864', 'ISO8859_1' : 'iso8859_1', 'ISO8859_2' : 'iso8859_2', 'ISO8859_3' : 'iso8859_3', 'ISO8859_4' : 'iso8859_4', 'ISO8859_5' : 'iso8859_5', 'ISO8859_6' : 'iso8859_6', 'ISO8859_7' : 'iso8859_7', 'ISO8859_8' : 'iso8859_8', 'ISO8859_9' : 'iso8859_9', 'ISO8859_13' : 'iso8859_13', 'KSC_5601' : 'euc_kr', 'DOS852' : 'cp852', 'DOS857' : 'cp857', 'DOS861' : 'cp861', 'DOS866' : 'cp866', 'DOS869' : 'cp869', 'WIN1250' : 'cp1250', 'WIN1251' : 'cp1251', 'WIN1252' : 'cp1252', 'WIN1253' : 'cp1253', 'WIN1254' : 'cp1254', 'BIG_5' : 'big5', 'GB_2312' : 'gb2312', 'WIN1255' : 'cp1255', 'WIN1256' : 'cp1256', 'WIN1257' : 'cp1257', 'KOI8-R' : 'koi8_r', # (Firebird 2.0+) 'KOI8-U' : 'koi8_u', # (Firebird 2.0+) 'WIN1258' : 'cp1258', # (Firebird 2.0+) } DB_CHAR_SET_NAME_TO_PYTHON_ENCODING_MAP = charset_map # C integer limit constants SHRT_MIN = -32767 SHRT_MAX = 32767 USHRT_MAX = 65535 INT_MIN = -2147483648 INT_MAX = 2147483647 LONG_MIN = -9223372036854775808 LONG_MAX = 9223372036854775807 SSIZE_T_MIN = INT_MIN SSIZE_T_MAX = INT_MAX # Constants DSQL_close = 1 DSQL_drop = 2 DSQL_unprepare = 4 SQLDA_version1 = 1 # Type codes SQL_TEXT = 452 SQL_VARYING = 448 SQL_SHORT = 500 SQL_LONG = 496 SQL_FLOAT = 482 SQL_DOUBLE = 480 SQL_D_FLOAT = 530 SQL_TIMESTAMP = 510 SQL_BLOB = 520 SQL_ARRAY = 540 SQL_QUAD = 550 SQL_TYPE_TIME = 560 SQL_TYPE_DATE = 570 SQL_INT64 = 580 SUBTYPE_NUMERIC = 1 SUBTYPE_DECIMAL = 2 # Internal type codes (for example used by ARRAY descriptor) blr_text = 14 blr_text2 = 15 blr_short = 7 blr_long = 8 blr_quad = 9 blr_float = 10 blr_double = 27 blr_d_float = 11 blr_timestamp = 35 blr_varying = 37 blr_varying2 = 38 blr_blob = 261 blr_cstring = 40 blr_cstring2 = 41 blr_blob_id = 45 blr_sql_date = 12 blr_sql_time = 13 blr_int64 = 16 blr_blob2 = 17 # Added in FB 2.1 blr_domain_name = 18 blr_domain_name2 = 19 blr_not_nullable = 20 # Added in FB 2.5 blr_column_name = 21 blr_column_name2 = 22 blr_domain_type_of = 0 blr_domain_full = 1 # Rest of BLR is defined in fdb.blr # Database parameter block stuff isc_dpb_version1 = 1 isc_dpb_cdd_pathname = 1 isc_dpb_allocation = 2 isc_dpb_journal = 3 isc_dpb_page_size = 4 isc_dpb_num_buffers = 5 isc_dpb_buffer_length = 6 isc_dpb_debug = 7 isc_dpb_garbage_collect = 8 isc_dpb_verify = 9 isc_dpb_sweep = 10 isc_dpb_enable_journal = 11 isc_dpb_disable_journal = 12 isc_dpb_dbkey_scope = 13 isc_dpb_number_of_users = 14 isc_dpb_trace = 15 isc_dpb_no_garbage_collect = 16 isc_dpb_damaged = 17 isc_dpb_license = 18 isc_dpb_sys_user_name = 19 isc_dpb_encrypt_key = 20 isc_dpb_activate_shadow = 21 isc_dpb_sweep_interval = 22 isc_dpb_delete_shadow = 23 isc_dpb_force_write = 24 isc_dpb_begin_log = 25 isc_dpb_quit_log = 26 isc_dpb_no_reserve = 27 isc_dpb_user_name = 28 isc_dpb_password = 29 isc_dpb_password_enc = 30 isc_dpb_sys_user_name_enc = 31 isc_dpb_interp = 32 isc_dpb_online_dump = 33 isc_dpb_old_file_size = 34 isc_dpb_old_num_files = 35 isc_dpb_old_file = 36 isc_dpb_old_start_page = 37 isc_dpb_old_start_seqno = 38 isc_dpb_old_start_file = 39 isc_dpb_drop_walfile = 40 isc_dpb_old_dump_id = 41 isc_dpb_wal_backup_dir = 42 isc_dpb_wal_chkptlen = 43 isc_dpb_wal_numbufs = 44 isc_dpb_wal_bufsize = 45 isc_dpb_wal_grp_cmt_wait = 46 isc_dpb_lc_messages = 47 isc_dpb_lc_ctype = 48 isc_dpb_cache_manager = 49 isc_dpb_shutdown = 50 isc_dpb_online = 51 isc_dpb_shutdown_delay = 52 isc_dpb_reserved = 53 isc_dpb_overwrite = 54 isc_dpb_sec_attach = 55 isc_dpb_disable_wal = 56 isc_dpb_connect_timeout = 57 isc_dpb_dummy_packet_interval = 58 isc_dpb_gbak_attach = 59 isc_dpb_sql_role_name = 60 isc_dpb_set_page_buffers = 61 isc_dpb_working_directory = 62 isc_dpb_sql_dialect = 63 isc_dpb_set_db_readonly = 64 isc_dpb_set_db_sql_dialect = 65 isc_dpb_gfix_attach = 66 isc_dpb_gstat_attach = 67 isc_dpb_set_db_charset = 68 isc_dpb_gsec_attach = 69 isc_dpb_address_path = 70 # Added in FB 2.1 isc_dpb_process_id = 71 isc_dpb_no_db_triggers = 72 isc_dpb_trusted_auth = 73 isc_dpb_process_name = 74 # Added in FB 2.5 isc_dpb_trusted_role = 75 isc_dpb_org_filename = 76 isc_dpb_utf8_filename = 77 isc_dpb_ext_call_depth = 78 # structural codes isc_info_end = 1 isc_info_truncated = 2 isc_info_error = 3 isc_info_data_not_ready = 4 isc_info_length = 126 isc_info_flag_end = 127 isc_info_req_select_count = 13 isc_info_req_insert_count = 14 isc_info_req_update_count = 15 isc_info_req_delete_count = 16 # DB Info item codes isc_info_db_id = 4 isc_info_reads = 5 isc_info_writes = 6 isc_info_fetches = 7 isc_info_marks = 8 isc_info_implementation = 11 isc_info_isc_version = 12 isc_info_base_level = 13 isc_info_page_size = 14 isc_info_num_buffers = 15 isc_info_limbo = 16 isc_info_current_memory = 17 isc_info_max_memory = 18 isc_info_window_turns = 19 isc_info_license = 20 isc_info_allocation = 21 isc_info_attachment_id = 22 isc_info_read_seq_count = 23 isc_info_read_idx_count = 24 isc_info_insert_count = 25 isc_info_update_count = 26 isc_info_delete_count = 27 isc_info_backout_count = 28 isc_info_purge_count = 29 isc_info_expunge_count = 30 isc_info_sweep_interval = 31 isc_info_ods_version = 32 isc_info_ods_minor_version = 33 isc_info_no_reserve = 34 isc_info_logfile = 35 isc_info_cur_logfile_name = 36 isc_info_cur_log_part_offset = 37 isc_info_num_wal_buffers = 38 isc_info_wal_buffer_size = 39 isc_info_wal_ckpt_length = 40 isc_info_wal_cur_ckpt_interval = 41 isc_info_wal_prv_ckpt_fname = 42 isc_info_wal_prv_ckpt_poffset = 43 isc_info_wal_recv_ckpt_fname = 44 isc_info_wal_recv_ckpt_poffset = 45 isc_info_wal_grpc_wait_usecs = 47 isc_info_wal_num_io = 48 isc_info_wal_avg_io_size = 49 isc_info_wal_num_commits = 50 isc_info_wal_avg_grpc_size = 51 isc_info_forced_writes = 52 isc_info_user_names = 53 isc_info_page_errors = 54 isc_info_record_errors = 55 isc_info_bpage_errors = 56 isc_info_dpage_errors = 57 isc_info_ipage_errors = 58 isc_info_ppage_errors = 59 isc_info_tpage_errors = 60 isc_info_set_page_buffers = 61 isc_info_db_sql_dialect = 62 isc_info_db_read_only = 63 isc_info_db_size_in_pages = 64 # Values 65 -100 unused to avoid conflict with InterBase frb_info_att_charset = 101 isc_info_db_class = 102 isc_info_firebird_version = 103 isc_info_oldest_transaction = 104 isc_info_oldest_active = 105 isc_info_oldest_snapshot = 106 isc_info_next_transaction = 107 isc_info_db_provider = 108 isc_info_active_transactions = 109 isc_info_active_tran_count = 110 isc_info_creation_date = 111 isc_info_db_file_size = 112 # added in FB 2.1 fb_info_page_contents = 113 # added in FB 2.5 isc_info_db_last_value = (fb_info_page_contents + 1) isc_info_version = isc_info_isc_version # Blob information items isc_info_blob_num_segments = 4 isc_info_blob_max_segment = 5 isc_info_blob_total_length = 6 isc_info_blob_type = 7 # Transaction information items isc_info_tra_id = 4 isc_info_tra_oldest_interesting = 5 isc_info_tra_oldest_snapshot = 6 isc_info_tra_oldest_active = 7 isc_info_tra_isolation = 8 isc_info_tra_access = 9 isc_info_tra_lock_timeout = 10 # isc_info_tra_isolation responses isc_info_tra_consistency = 1 isc_info_tra_concurrency = 2 isc_info_tra_read_committed = 3 # isc_info_tra_read_committed options isc_info_tra_no_rec_version = 0 isc_info_tra_rec_version = 1 # isc_info_tra_access responses isc_info_tra_readonly = 0 isc_info_tra_readwrite = 1 # SQL information items isc_info_sql_select = 4 isc_info_sql_bind = 5 isc_info_sql_num_variables = 6 isc_info_sql_describe_vars = 7 isc_info_sql_describe_end = 8 isc_info_sql_sqlda_seq = 9 isc_info_sql_message_seq = 10 isc_info_sql_type = 11 isc_info_sql_sub_type = 12 isc_info_sql_scale = 13 isc_info_sql_length = 14 isc_info_sql_null_ind = 15 isc_info_sql_field = 16 isc_info_sql_relation = 17 isc_info_sql_owner = 18 isc_info_sql_alias = 19 isc_info_sql_sqlda_start = 20 isc_info_sql_stmt_type = 21 isc_info_sql_get_plan = 22 isc_info_sql_records = 23 isc_info_sql_batch_fetch = 24 isc_info_sql_relation_alias = 25 # SQL information return values isc_info_sql_stmt_select = 1 isc_info_sql_stmt_insert = 2 isc_info_sql_stmt_update = 3 isc_info_sql_stmt_delete = 4 isc_info_sql_stmt_ddl = 5 isc_info_sql_stmt_get_segment = 6 isc_info_sql_stmt_put_segment = 7 isc_info_sql_stmt_exec_procedure = 8 isc_info_sql_stmt_start_trans = 9 isc_info_sql_stmt_commit = 10 isc_info_sql_stmt_rollback = 11 isc_info_sql_stmt_select_for_upd = 12 isc_info_sql_stmt_set_generator = 13 isc_info_sql_stmt_savepoint = 14 # Transaction parameter block stuff isc_tpb_version1 = 1 isc_tpb_version3 = 3 isc_tpb_consistency = 1 isc_tpb_concurrency = 2 isc_tpb_shared = 3 isc_tpb_protected = 4 isc_tpb_exclusive = 5 isc_tpb_wait = 6 isc_tpb_nowait = 7 isc_tpb_read = 8 isc_tpb_write = 9 isc_tpb_lock_read = 10 isc_tpb_lock_write = 11 isc_tpb_verb_time = 12 isc_tpb_commit_time = 13 isc_tpb_ignore_limbo = 14 isc_tpb_read_committed = 15 isc_tpb_autocommit = 16 isc_tpb_rec_version = 17 isc_tpb_no_rec_version = 18 isc_tpb_restart_requests = 19 isc_tpb_no_auto_undo = 20 isc_tpb_lock_timeout = 21 # BLOB parameter buffer isc_bpb_version1 = 1 isc_bpb_source_type = 1 isc_bpb_target_type = 2 isc_bpb_type = 3 isc_bpb_source_interp = 4 isc_bpb_target_interp = 5 isc_bpb_filter_parameter = 6 # Added in FB 2.1 isc_bpb_storage = 7 isc_bpb_type_segmented = 0 isc_bpb_type_stream = 1 # Added in FB 2.1 isc_bpb_storage_main = 0 isc_bpb_storage_temp = 2 # BLOB codes isc_segment = 335544366 isc_segstr_eof = 335544367 # Services API # Service parameter block stuff isc_spb_current_version = 2 isc_spb_version = isc_spb_current_version isc_spb_user_name = isc_dpb_user_name isc_spb_sys_user_name = isc_dpb_sys_user_name isc_spb_sys_user_name_enc = isc_dpb_sys_user_name_enc isc_spb_password = isc_dpb_password isc_spb_password_enc = isc_dpb_password_enc isc_spb_command_line = 105 isc_spb_dbname = 106 isc_spb_verbose = 107 isc_spb_options = 108 isc_spb_address_path = 109 # Added in FB 2.1 isc_spb_process_id = 110 isc_spb_trusted_auth = 111 isc_spb_process_name = 112 # Added in FB 2.5 isc_spb_trusted_role = 113 # Service action items isc_action_svc_backup = 1 # Starts database backup process on the server isc_action_svc_restore = 2 # Starts database restore process on the server isc_action_svc_repair = 3 # Starts database repair process on the server isc_action_svc_add_user = 4 # Adds a new user to the security database isc_action_svc_delete_user = 5 # Deletes a user record from the security database isc_action_svc_modify_user = 6 # Modifies a user record in the security database isc_action_svc_display_user = 7 # Displays a user record from the security database isc_action_svc_properties = 8 # Sets database properties isc_action_svc_add_license = 9 # Adds a license to the license file isc_action_svc_remove_license = 10 # Removes a license from the license file isc_action_svc_db_stats = 11 # Retrieves database statistics isc_action_svc_get_ib_log = 12 # Retrieves the InterBase log file from the server isc_action_svc_get_fb_log = 12 # Retrieves the Firebird log file from the server # Added in FB 2.5 isc_action_svc_nbak = 20 isc_action_svc_nrest = 21 isc_action_svc_trace_start = 22 isc_action_svc_trace_stop = 23 isc_action_svc_trace_suspend = 24 isc_action_svc_trace_resume = 25 isc_action_svc_trace_list = 26 isc_action_svc_set_mapping = 27 isc_action_svc_drop_mapping = 28 isc_action_svc_display_user_adm = 29 isc_action_svc_last = 30 # Service information items isc_info_svc_svr_db_info = 50 # Retrieves the number of attachments and databases */ isc_info_svc_get_config = 53 # Retrieves the parameters and values for IB_CONFIG */ isc_info_svc_version = 54 # Retrieves the version of the services manager */ isc_info_svc_server_version = 55 # Retrieves the version of the Firebird server */ isc_info_svc_implementation = 56 # Retrieves the implementation of the Firebird server */ isc_info_svc_capabilities = 57 # Retrieves a bitmask representing the server's capabilities */ isc_info_svc_user_dbpath = 58 # Retrieves the path to the security database in use by the server */ isc_info_svc_get_env = 59 # Retrieves the setting of $FIREBIRD */ isc_info_svc_get_env_lock = 60 # Retrieves the setting of $FIREBIRD_LCK */ isc_info_svc_get_env_msg = 61 # Retrieves the setting of $FIREBIRD_MSG */ isc_info_svc_line = 62 # Retrieves 1 line of service output per call */ isc_info_svc_to_eof = 63 # Retrieves as much of the server output as will fit in the supplied buffer */ isc_info_svc_timeout = 64 # Sets / signifies a timeout value for reading service information */ isc_info_svc_limbo_trans = 66 # Retrieve the limbo transactions */ isc_info_svc_running = 67 # Checks to see if a service is running on an attachment */ isc_info_svc_get_users = 68 # Returns the user information from isc_action_svc_display_users */ # Parameters for isc_action_{add|del|mod|disp)_user isc_spb_sec_userid = 5 isc_spb_sec_groupid = 6 isc_spb_sec_username = 7 isc_spb_sec_password = 8 isc_spb_sec_groupname = 9 isc_spb_sec_firstname = 10 isc_spb_sec_middlename = 11 isc_spb_sec_lastname = 12 isc_spb_sec_admin = 13 # Parameters for isc_action_svc_backup isc_spb_bkp_file = 5 isc_spb_bkp_factor = 6 isc_spb_bkp_length = 7 isc_spb_bkp_ignore_checksums = 0x01 isc_spb_bkp_ignore_limbo = 0x02 isc_spb_bkp_metadata_only = 0x04 isc_spb_bkp_no_garbage_collect = 0x08 isc_spb_bkp_old_descriptions = 0x10 isc_spb_bkp_non_transportable = 0x20 isc_spb_bkp_convert = 0x40 isc_spb_bkp_expand = 0x80 isc_spb_bkp_no_triggers = 0x8000 # Parameters for isc_action_svc_properties isc_spb_prp_page_buffers = 5 isc_spb_prp_sweep_interval = 6 isc_spb_prp_shutdown_db = 7 isc_spb_prp_deny_new_attachments = 9 isc_spb_prp_deny_new_transactions = 10 isc_spb_prp_reserve_space = 11 isc_spb_prp_write_mode = 12 isc_spb_prp_access_mode = 13 isc_spb_prp_set_sql_dialect = 14 isc_spb_prp_activate = 0x0100 isc_spb_prp_db_online = 0x0200 isc_spb_prp_force_shutdown = 41 isc_spb_prp_attachments_shutdown = 42 isc_spb_prp_transactions_shutdown = 43 isc_spb_prp_shutdown_mode = 44 isc_spb_prp_online_mode = 45 # Parameters for isc_spb_prp_shutdown_mode and isc_spb_prp_online_mode isc_spb_prp_sm_normal = 0 isc_spb_prp_sm_multi = 1 isc_spb_prp_sm_single = 2 isc_spb_prp_sm_full = 3 # Parameters for isc_spb_prp_reserve_space isc_spb_prp_res_use_full = 35 isc_spb_prp_res = 36 # Parameters for isc_spb_prp_write_mode isc_spb_prp_wm_async = 37 isc_spb_prp_wm_sync = 38 # Parameters for isc_spb_prp_access_mode isc_spb_prp_am_readonly = 39 isc_spb_prp_am_readwrite = 40 # Parameters for isc_action_svc_repair isc_spb_rpr_commit_trans = 15 isc_spb_rpr_rollback_trans = 34 isc_spb_rpr_recover_two_phase = 17 isc_spb_tra_id = 18 isc_spb_single_tra_id = 19 isc_spb_multi_tra_id = 20 isc_spb_tra_state = 21 isc_spb_tra_state_limbo = 22 isc_spb_tra_state_commit = 23 isc_spb_tra_state_rollback = 24 isc_spb_tra_state_unknown = 25 isc_spb_tra_host_site = 26 isc_spb_tra_remote_site = 27 isc_spb_tra_db_path = 28 isc_spb_tra_advise = 29 isc_spb_tra_advise_commit = 30 isc_spb_tra_advise_rollback = 31 isc_spb_tra_advise_unknown = 33 isc_spb_rpr_validate_db = 0x01 isc_spb_rpr_sweep_db = 0x02 isc_spb_rpr_mend_db = 0x04 isc_spb_rpr_list_limbo_trans = 0x08 isc_spb_rpr_check_db = 0x10 isc_spb_rpr_ignore_checksum = 0x20 isc_spb_rpr_kill_shadows = 0x40 isc_spb_rpr_full = 0x80 # Parameters for isc_action_svc_restore isc_spb_res_buffers = 9 isc_spb_res_page_size = 10 isc_spb_res_length = 11 isc_spb_res_access_mode = 12 isc_spb_res_fix_fss_data = 13 isc_spb_res_fix_fss_metadata = 14 isc_spb_res_metadata_only = 0x04 isc_spb_res_deactivate_idx = 0x0100 isc_spb_res_no_shadow = 0x0200 isc_spb_res_no_validity = 0x0400 isc_spb_res_one_at_a_time = 0x0800 isc_spb_res_replace = 0x1000 isc_spb_res_create = 0x2000 isc_spb_res_use_all_space = 0x4000 # Parameters for isc_spb_res_access_mode isc_spb_res_am_readonly = isc_spb_prp_am_readonly isc_spb_res_am_readwrite = isc_spb_prp_am_readwrite # Parameters for isc_info_svc_svr_db_info isc_spb_num_att = 5 isc_spb_num_db = 6 # Parameters for isc_info_svc_db_stats isc_spb_sts_data_pages = 0x01 isc_spb_sts_db_log = 0x02 isc_spb_sts_hdr_pages = 0x04 isc_spb_sts_idx_pages = 0x08 isc_spb_sts_sys_relations = 0x10 isc_spb_sts_record_versions = 0x20 isc_spb_sts_table = 0x40 isc_spb_sts_nocreation = 0x80 # Parameters for isc_action_svc_nbak isc_spb_nbk_level = 5 isc_spb_nbk_file = 6 isc_spb_nbk_direct = 7 isc_spb_nbk_no_triggers = 0x01 # trace isc_spb_trc_id = 1 isc_spb_trc_name = 2 isc_spb_trc_cfg = 3 #------------------- STRING = c_char_p WSTRING = c_wchar_p blb_got_eof = 0 blb_got_fragment = -1 blb_got_full_segment = 1 blb_seek_relative = 1 blb_seek_from_tail = 2 # Implementation codes isc_info_db_impl_rdb_vms = 1 isc_info_db_impl_rdb_eln = 2 isc_info_db_impl_rdb_eln_dev = 3 isc_info_db_impl_rdb_vms_y = 4 isc_info_db_impl_rdb_eln_y = 5 isc_info_db_impl_jri = 6 isc_info_db_impl_jsv = 7 isc_info_db_impl_isc_apl_68K = 25 isc_info_db_impl_isc_vax_ultr = 26 isc_info_db_impl_isc_vms = 27 isc_info_db_impl_isc_sun_68k = 28 isc_info_db_impl_isc_os2 = 29 isc_info_db_impl_isc_sun4 = 30 isc_info_db_impl_isc_hp_ux = 31 isc_info_db_impl_isc_sun_386i = 32 isc_info_db_impl_isc_vms_orcl = 33 isc_info_db_impl_isc_mac_aux = 34 isc_info_db_impl_isc_rt_aix = 35 isc_info_db_impl_isc_mips_ult = 36 isc_info_db_impl_isc_xenix = 37 isc_info_db_impl_isc_dg = 38 isc_info_db_impl_isc_hp_mpexl = 39 isc_info_db_impl_isc_hp_ux68K = 40 isc_info_db_impl_isc_sgi = 41 isc_info_db_impl_isc_sco_unix = 42 isc_info_db_impl_isc_cray = 43 isc_info_db_impl_isc_imp = 44 isc_info_db_impl_isc_delta = 45 isc_info_db_impl_isc_next = 46 isc_info_db_impl_isc_dos = 47 isc_info_db_impl_m88K = 48 isc_info_db_impl_unixware = 49 isc_info_db_impl_isc_winnt_x86 = 50 isc_info_db_impl_isc_epson = 51 isc_info_db_impl_alpha_osf = 52 isc_info_db_impl_alpha_vms = 53 isc_info_db_impl_netware_386 = 54 isc_info_db_impl_win_only = 55 isc_info_db_impl_ncr_3000 = 56 isc_info_db_impl_winnt_ppc = 57 isc_info_db_impl_dg_x86 = 58 isc_info_db_impl_sco_ev = 59 isc_info_db_impl_i386 = 60 isc_info_db_impl_freebsd = 61 isc_info_db_impl_netbsd = 62 isc_info_db_impl_darwin_ppc = 63 isc_info_db_impl_sinixz = 64 isc_info_db_impl_linux_sparc = 65 isc_info_db_impl_linux_amd64 = 66 isc_info_db_impl_freebsd_amd64 = 67 isc_info_db_impl_winnt_amd64 = 68 isc_info_db_impl_linux_ppc = 69 isc_info_db_impl_darwin_x86 = 70 isc_info_db_impl_linux_mipsel = 71 # changed in 2.1, it was isc_info_db_impl_sun_amd64 in 2.0 # Added in FB 2.1 isc_info_db_impl_linux_mips = 72 isc_info_db_impl_darwin_x64 = 73 isc_info_db_impl_sun_amd64 = 74 isc_info_db_impl_linux_arm = 75 isc_info_db_impl_linux_ia64 = 76 isc_info_db_impl_darwin_ppc64 = 77 isc_info_db_impl_linux_s390x = 78 isc_info_db_impl_linux_s390 = 79 isc_info_db_impl_linux_sh = 80 isc_info_db_impl_linux_sheb = 81 # Added in FB 2.5 isc_info_db_impl_linux_hppa = 82 isc_info_db_impl_linux_alpha = 83 isc_info_db_impl_last_value = (isc_info_db_impl_linux_alpha + 1) # Info DB provider isc_info_db_code_rdb_eln = 1 isc_info_db_code_rdb_vms = 2 isc_info_db_code_interbase = 3 isc_info_db_code_firebird = 4 isc_info_db_code_last_value = (isc_info_db_code_firebird+1) # Info db class isc_info_db_class_access = 1 isc_info_db_class_y_valve = 2 isc_info_db_class_rem_int = 3 isc_info_db_class_rem_srvr = 4 isc_info_db_class_pipe_int = 7 isc_info_db_class_pipe_srvr = 8 isc_info_db_class_sam_int = 9 isc_info_db_class_sam_srvr = 10 isc_info_db_class_gateway = 11 isc_info_db_class_cache = 12 isc_info_db_class_classic_access = 13 isc_info_db_class_server_access = 14 isc_info_db_class_last_value = (isc_info_db_class_server_access+1) # status codes isc_segment = 335544366 FB_API_HANDLE = c_uint if platform.architecture() == ('64bit', 'WindowsPE'): intptr_t = c_longlong uintptr_t = c_ulonglong else: intptr_t = c_long uintptr_t = c_ulong ISC_STATUS = intptr_t ISC_STATUS_PTR = POINTER(ISC_STATUS) ISC_STATUS_ARRAY = ISC_STATUS * 20 FB_SQLSTATE_STRING = c_char * (5 + 1) ISC_LONG = c_int ISC_ULONG = c_uint ISC_SHORT = c_short ISC_USHORT = c_ushort ISC_UCHAR = c_ubyte ISC_SCHAR = c_char ISC_INT64 = c_longlong ISC_UINT64 = c_ulonglong ISC_DATE = c_int ISC_TIME = c_uint class ISC_TIMESTAMP(Structure): pass ISC_TIMESTAMP._fields_ = [ ('timestamp_date', ISC_DATE), ('timestamp_time', ISC_TIME), ] class GDS_QUAD_t(Structure): pass GDS_QUAD_t._fields_ = [ ('gds_quad_high', ISC_LONG), ('gds_quad_low', ISC_ULONG), ] GDS_QUAD = GDS_QUAD_t ISC_QUAD = GDS_QUAD_t isc_att_handle = FB_API_HANDLE isc_blob_handle = FB_API_HANDLE isc_db_handle = FB_API_HANDLE isc_req_handle = FB_API_HANDLE isc_stmt_handle = FB_API_HANDLE isc_svc_handle = FB_API_HANDLE isc_tr_handle = FB_API_HANDLE isc_resv_handle = ISC_LONG FB_SHUTDOWN_CALLBACK = CFUNCTYPE(UNCHECKED(c_int), c_int, c_int, POINTER(None)) ISC_CALLBACK = CFUNCTYPE(None) ISC_PRINT_CALLBACK = CFUNCTYPE(None, c_void_p, c_short, STRING) ISC_VERSION_CALLBACK = CFUNCTYPE(None, c_void_p, STRING) ISC_EVENT_CALLBACK = CFUNCTYPE(None, POINTER(ISC_UCHAR), c_ushort, POINTER(ISC_UCHAR)) class ISC_ARRAY_BOUND(Structure): pass ISC_ARRAY_BOUND._fields_ = [ ('array_bound_lower', c_short), ('array_bound_upper', c_short), ] class ISC_ARRAY_DESC(Structure): pass ISC_ARRAY_DESC._fields_ = [ ('array_desc_dtype', ISC_UCHAR), ('array_desc_scale', ISC_UCHAR), ## was ISC_SCHAR), ('array_desc_length', c_ushort), ('array_desc_field_name', ISC_SCHAR * 32), ('array_desc_relation_name', ISC_SCHAR * 32), ('array_desc_dimensions', c_short), ('array_desc_flags', c_short), ('array_desc_bounds', ISC_ARRAY_BOUND * 16), ] class ISC_BLOB_DESC(Structure): pass ISC_BLOB_DESC._fields_ = [ ('blob_desc_subtype', c_short), ('blob_desc_charset', c_short), ('blob_desc_segment_size', c_short), ('blob_desc_field_name', ISC_UCHAR * 32), ('blob_desc_relation_name', ISC_UCHAR * 32), ] class isc_blob_ctl(Structure): pass isc_blob_ctl._fields_ = [ ('ctl_source', CFUNCTYPE(ISC_STATUS)), ('ctl_source_handle', POINTER(isc_blob_ctl)), ('ctl_to_sub_type', c_short), ('ctl_from_sub_type', c_short), ('ctl_buffer_length', c_ushort), ('ctl_segment_length', c_ushort), ('ctl_bpb_length', c_ushort), ('ctl_bpb', STRING), ('ctl_buffer', POINTER(ISC_UCHAR)), ('ctl_max_segment', ISC_LONG), ('ctl_number_segments', ISC_LONG), ('ctl_total_length', ISC_LONG), ('ctl_status', POINTER(ISC_STATUS)), ('ctl_data', c_long * 8), ] ISC_BLOB_CTL = POINTER(isc_blob_ctl) class bstream(Structure): pass bstream._fields_ = [ ('bstr_blob', isc_blob_handle), ('bstr_buffer', POINTER(c_char)), # STRING ('bstr_ptr', POINTER(c_char)), # STRING ('bstr_length', c_short), ('bstr_cnt', c_short), ('bstr_mode', c_char), ] BSTREAM = bstream FB_BLOB_STREAM = POINTER(bstream) # values for enumeration 'blob_lseek_mode' blob_lseek_mode = c_int # enum # values for enumeration 'blob_get_result' blob_get_result = c_int # enum class blobcallback(Structure): pass blobcallback._fields_ = [ ('blob_get_segment', CFUNCTYPE(c_short, c_void_p, POINTER(ISC_UCHAR), c_ushort, POINTER(ISC_USHORT))), ('blob_handle', c_void_p), ('blob_number_segments', ISC_LONG), ('blob_max_segment', ISC_LONG), ('blob_total_length', ISC_LONG), ('blob_put_segment', CFUNCTYPE(None, c_void_p, POINTER(ISC_UCHAR), c_ushort)), ('blob_lseek', CFUNCTYPE(ISC_LONG, c_void_p, c_ushort, c_int)), ] BLOBCALLBACK = POINTER(blobcallback) class paramdsc(Structure): pass paramdsc._fields_ = [ ('dsc_dtype', ISC_UCHAR), ('dsc_scale', c_byte), ('dsc_length', ISC_USHORT), ('dsc_sub_type', c_short), ('dsc_flags', ISC_USHORT), ('dsc_address', POINTER(ISC_UCHAR)), ] PARAMDSC = paramdsc class paramvary(Structure): pass paramvary._fields_ = [ ('vary_length', ISC_USHORT), ('vary_string', ISC_UCHAR * 1), ] PARAMVARY = paramvary class ISC_TEB(Structure): pass ISC_TEB._fields_ = [ ('db_ptr', POINTER(isc_db_handle)), ('tpb_len', ISC_SHORT), ('tpb_ptr', STRING) ] class XSQLVAR(Structure): pass XSQLVAR._fields_ = [ ('sqltype', ISC_SHORT), ('sqlscale', ISC_SHORT), ('sqlsubtype', ISC_SHORT), ('sqllen', ISC_SHORT), ('sqldata', POINTER(c_char)), # STRING), ('sqlind', POINTER(ISC_SHORT)), ('sqlname_length', ISC_SHORT), ('sqlname', ISC_SCHAR * 32), ('relname_length', ISC_SHORT), ('relname', ISC_SCHAR * 32), ('ownname_length', ISC_SHORT), ('ownname', ISC_SCHAR * 32), ('aliasname_length', ISC_SHORT), ('aliasname', ISC_SCHAR * 32), ] class XSQLDA(Structure): pass XSQLDA._fields_ = [ ('version', ISC_SHORT), ('sqldaid', ISC_SCHAR * 8), ('sqldabc', ISC_LONG), ('sqln', ISC_SHORT), ('sqld', ISC_SHORT), ('sqlvar', XSQLVAR * 1), ] XSQLDA_PTR = POINTER(XSQLDA) def portable_int (buf): pass class USER_SEC_DATA(Structure): pass USER_SEC_DATA._fields_ = [ ('sec_flags', c_short), ('uid', c_int), ('gid', c_int), ('protocol', c_int), ('server', STRING), ('user_name', STRING), ('password', STRING), ('group_name', STRING), ('first_name', STRING), ('middle_name', STRING), ('last_name', STRING), ('dba_user_name', STRING), ('dba_password', STRING), ] RESULT_VECTOR = ISC_ULONG * 15 # values for enumeration 'db_info_types' db_info_types = c_int # enum # values for enumeration 'info_db_implementations' info_db_implementations = c_int # enum # values for enumeration 'info_db_class' info_db_class = c_int # enum # values for enumeration 'info_db_provider' info_db_provider = c_int # enum class imaxdiv_t(Structure): pass imaxdiv_t._fields_ = [ ('quot', c_long), ('rem', c_long), ] intmax_t = c_long int8_t = c_int8 int16_t = c_int16 int32_t = c_int32 int64_t = c_int64 uint8_t = c_uint8 uint16_t = c_uint16 uint32_t = c_uint32 uint64_t = c_uint64 int_least8_t = c_byte int_least16_t = c_short int_least32_t = c_int int_least64_t = c_long uint_least8_t = c_ubyte uint_least16_t = c_ushort uint_least32_t = c_uint uint_least64_t = c_ulong int_fast8_t = c_byte int_fast16_t = c_long int_fast32_t = c_long int_fast64_t = c_long uint_fast8_t = c_ubyte uint_fast16_t = c_ulong uint_fast32_t = c_ulong uint_fast64_t = c_ulong ptrdiff_t = c_long size_t = c_ulong uintmax_t = c_ulong class fbclient_API(object): """Firebird Client API interface object. Loads Firebird Client Library and exposes API functions as member methods. Uses :ref:`ctypes ` for bindings. """ def __init__(self,fb_library_name=None): if fb_library_name is None: if sys.platform == 'darwin': fb_library_name = find_library('Firebird') # Next elif is necessary hotfix for ctypes issue # http://bugs.python.org/issue16283 elif sys.platform == 'win32': fb_library_name = find_library('fbclient.dll') if not fb_library_name: # let's try windows registry if PYTHON_MAJOR_VER == 3: import winreg else: import _winreg as winreg # try find via installed Firebird server baseKey = 'SOFTWARE\Firebird Project\Firebird Server\Instances' key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, baseKey) instFold = winreg.QueryValueEx(key,'DefaultInstance') fb_library_name = os.path.join(os.path.join(instFold[0], 'bin'), 'fbclient.dll') else: fb_library_name = find_library('fbclient') if not fb_library_name: try: x = CDLL('libfbclient.so') fb_library_name = 'libfbclient.so' except: pass if not fb_library_name: raise Exception("The location of Firebird Client Library could not be determined.") elif not os.path.exists(fb_library_name): raise Exception("Firebird Client Library '%s' not found" % fb_library_name) if sys.platform in ['win32', 'cygwin', 'os2', 'os2emx']: fb_library = WinDLL(fb_library_name) else: fb_library = CDLL(fb_library_name) self.isc_attach_database = fb_library.isc_attach_database self.isc_attach_database.restype = ISC_STATUS self.isc_attach_database.argtypes = [POINTER(ISC_STATUS), c_short, STRING, POINTER(isc_db_handle), c_short, STRING] self.isc_array_gen_sdl = fb_library.isc_array_gen_sdl self.isc_array_gen_sdl.restype = ISC_STATUS self.isc_array_gen_sdl.argtypes = [POINTER(ISC_STATUS), POINTER(ISC_ARRAY_DESC), POINTER(ISC_SHORT), POINTER(ISC_UCHAR), POINTER(ISC_SHORT)] self.isc_array_get_slice = fb_library.isc_array_get_slice self.isc_array_get_slice.restype = ISC_STATUS self.isc_array_get_slice.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), POINTER(ISC_QUAD), POINTER(ISC_ARRAY_DESC), c_void_p, POINTER(ISC_LONG)] self.isc_array_lookup_bounds = fb_library.isc_array_lookup_bounds self.isc_array_lookup_bounds.restype = ISC_STATUS self.isc_array_lookup_bounds.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), STRING, STRING, POINTER(ISC_ARRAY_DESC)] self.isc_array_lookup_desc = fb_library.isc_array_lookup_desc self.isc_array_lookup_desc.restype = ISC_STATUS self.isc_array_lookup_desc.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), STRING, STRING, POINTER(ISC_ARRAY_DESC)] self.isc_array_set_desc = fb_library.isc_array_set_desc self.isc_array_set_desc.restype = ISC_STATUS self.isc_array_set_desc.argtypes = [POINTER(ISC_STATUS), STRING, STRING, POINTER(c_short), POINTER(c_short), POINTER(c_short), POINTER(ISC_ARRAY_DESC)] self.isc_array_put_slice = fb_library.isc_array_put_slice self.isc_array_put_slice.restype = ISC_STATUS self.isc_array_put_slice.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), POINTER(ISC_QUAD), POINTER(ISC_ARRAY_DESC), c_void_p, POINTER(ISC_LONG)] self.isc_blob_default_desc = fb_library.isc_blob_default_desc self.isc_blob_default_desc.restype = None self.isc_blob_default_desc.argtypes = [POINTER(ISC_BLOB_DESC), POINTER(ISC_UCHAR), POINTER(ISC_UCHAR)] self.isc_blob_gen_bpb = fb_library.isc_blob_gen_bpb self.isc_blob_gen_bpb.restype = ISC_STATUS self.isc_blob_gen_bpb.argtypes = [POINTER(ISC_STATUS), POINTER(ISC_BLOB_DESC), POINTER(ISC_BLOB_DESC), c_ushort, POINTER(ISC_UCHAR), POINTER(c_ushort)] self.isc_blob_info = fb_library.isc_blob_info self.isc_blob_info.restype = ISC_STATUS self.isc_blob_info.argtypes = [POINTER(ISC_STATUS), POINTER(isc_blob_handle), c_short, STRING, c_short, POINTER(c_char)] self.isc_blob_lookup_desc = fb_library.isc_blob_lookup_desc self.isc_blob_lookup_desc.restype = ISC_STATUS self.isc_blob_lookup_desc.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), POINTER(ISC_UCHAR), POINTER(ISC_UCHAR), POINTER(ISC_BLOB_DESC), POINTER(ISC_UCHAR)] self.isc_blob_set_desc = fb_library.isc_blob_set_desc self.isc_blob_set_desc.restype = ISC_STATUS self.isc_blob_set_desc.argtypes = [POINTER(ISC_STATUS), POINTER(ISC_UCHAR), POINTER(ISC_UCHAR), c_short, c_short, c_short, POINTER(ISC_BLOB_DESC)] self.isc_cancel_blob = fb_library.isc_cancel_blob self.isc_cancel_blob.restype = ISC_STATUS self.isc_cancel_blob.argtypes = [POINTER(ISC_STATUS), POINTER(isc_blob_handle)] self.isc_cancel_events = fb_library.isc_cancel_events self.isc_cancel_events.restype = ISC_STATUS self.isc_cancel_events.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(ISC_LONG)] self.isc_close_blob = fb_library.isc_close_blob self.isc_close_blob.restype = ISC_STATUS self.isc_close_blob.argtypes = [POINTER(ISC_STATUS), POINTER(isc_blob_handle)] self.isc_commit_retaining = fb_library.isc_commit_retaining self.isc_commit_retaining.restype = ISC_STATUS self.isc_commit_retaining.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle)] self.isc_commit_transaction = fb_library.isc_commit_transaction self.isc_commit_transaction.restype = ISC_STATUS self.isc_commit_transaction.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle)] self.isc_create_blob = fb_library.isc_create_blob self.isc_create_blob.restype = ISC_STATUS self.isc_create_blob.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), POINTER(isc_blob_handle), POINTER(ISC_QUAD)] self.isc_create_blob2 = fb_library.isc_create_blob2 self.isc_create_blob2.restype = ISC_STATUS self.isc_create_blob2.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), POINTER(isc_blob_handle), POINTER(ISC_QUAD), c_short, STRING] self.isc_create_database = fb_library.isc_create_database self.isc_create_database.restype = ISC_STATUS self.isc_create_database.argtypes = [POINTER(ISC_STATUS), c_short, STRING, POINTER(isc_db_handle), c_short, STRING, c_short] self.isc_database_info = fb_library.isc_database_info self.isc_database_info.restype = ISC_STATUS self.isc_database_info.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), c_short, STRING, c_short, STRING] self.isc_decode_date = fb_library.isc_decode_date self.isc_decode_date.restype = None self.isc_decode_date.argtypes = [POINTER(ISC_QUAD), c_void_p] self.isc_decode_sql_date = fb_library.isc_decode_sql_date self.isc_decode_sql_date.restype = None self.isc_decode_sql_date.argtypes = [POINTER(ISC_DATE), c_void_p] self.isc_decode_sql_time = fb_library.isc_decode_sql_time self.isc_decode_sql_time.restype = None self.isc_decode_sql_time.argtypes = [POINTER(ISC_TIME), c_void_p] self.isc_decode_timestamp = fb_library.isc_decode_timestamp self.isc_decode_timestamp.restype = None self.isc_decode_timestamp.argtypes = [POINTER(ISC_TIMESTAMP), c_void_p] self.isc_detach_database = fb_library.isc_detach_database self.isc_detach_database.restype = ISC_STATUS self.isc_detach_database.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle)] self.isc_drop_database = fb_library.isc_drop_database self.isc_drop_database.restype = ISC_STATUS self.isc_drop_database.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle)] self.isc_dsql_allocate_statement = fb_library.isc_dsql_allocate_statement self.isc_dsql_allocate_statement.restype = ISC_STATUS self.isc_dsql_allocate_statement.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_stmt_handle)] self.isc_dsql_alloc_statement2 = fb_library.isc_dsql_alloc_statement2 self.isc_dsql_alloc_statement2.restype = ISC_STATUS self.isc_dsql_alloc_statement2.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_stmt_handle)] self.isc_dsql_describe = fb_library.isc_dsql_describe self.isc_dsql_describe.restype = ISC_STATUS self.isc_dsql_describe.argtypes = [POINTER(ISC_STATUS), POINTER(isc_stmt_handle), c_ushort, POINTER(XSQLDA)] self.isc_dsql_describe_bind = fb_library.isc_dsql_describe_bind self.isc_dsql_describe_bind.restype = ISC_STATUS self.isc_dsql_describe_bind.argtypes = [POINTER(ISC_STATUS), POINTER(isc_stmt_handle), c_ushort, POINTER(XSQLDA)] self.isc_dsql_exec_immed2 = fb_library.isc_dsql_exec_immed2 self.isc_dsql_exec_immed2.restype = ISC_STATUS self.isc_dsql_exec_immed2.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), c_ushort, STRING, c_ushort, POINTER(XSQLDA), POINTER(XSQLDA)] self.isc_dsql_execute = fb_library.isc_dsql_execute self.isc_dsql_execute.restype = ISC_STATUS self.isc_dsql_execute.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle), POINTER(isc_stmt_handle), c_ushort, POINTER(XSQLDA)] self.isc_dsql_execute2 = fb_library.isc_dsql_execute2 self.isc_dsql_execute2.restype = ISC_STATUS self.isc_dsql_execute2.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle), POINTER(isc_stmt_handle), c_ushort, POINTER(XSQLDA), POINTER(XSQLDA)] self.isc_dsql_execute_immediate = fb_library.isc_dsql_execute_immediate self.isc_dsql_execute_immediate.restype = ISC_STATUS self.isc_dsql_execute_immediate.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), c_ushort, STRING, c_ushort, POINTER(XSQLDA)] self.isc_dsql_fetch = fb_library.isc_dsql_fetch self.isc_dsql_fetch.restype = ISC_STATUS self.isc_dsql_fetch.argtypes = [POINTER(ISC_STATUS), POINTER(isc_stmt_handle), c_ushort, POINTER(XSQLDA)] self.isc_dsql_finish = fb_library.isc_dsql_finish self.isc_dsql_finish.restype = ISC_STATUS self.isc_dsql_finish.argtypes = [POINTER(isc_db_handle)] self.isc_dsql_free_statement = fb_library.isc_dsql_free_statement self.isc_dsql_free_statement.restype = ISC_STATUS self.isc_dsql_free_statement.argtypes = [POINTER(ISC_STATUS), POINTER(isc_stmt_handle), c_ushort] self.isc_dsql_insert = fb_library.isc_dsql_insert self.isc_dsql_insert.restype = ISC_STATUS self.isc_dsql_insert.argtypes = [POINTER(ISC_STATUS), POINTER(isc_stmt_handle), c_ushort, POINTER(XSQLDA)] self.isc_dsql_prepare = fb_library.isc_dsql_prepare self.isc_dsql_prepare.restype = ISC_STATUS self.isc_dsql_prepare.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle), POINTER(isc_stmt_handle), c_ushort, STRING, c_ushort, POINTER(XSQLDA)] self.isc_dsql_set_cursor_name = fb_library.isc_dsql_set_cursor_name self.isc_dsql_set_cursor_name.restype = ISC_STATUS self.isc_dsql_set_cursor_name.argtypes = [POINTER(ISC_STATUS), POINTER(isc_stmt_handle), STRING, c_ushort] self.isc_dsql_sql_info = fb_library.isc_dsql_sql_info self.isc_dsql_sql_info.restype = ISC_STATUS self.isc_dsql_sql_info.argtypes = [POINTER(ISC_STATUS), POINTER(isc_stmt_handle), c_short, STRING, c_short, STRING] self.isc_encode_date = fb_library.isc_encode_date self.isc_encode_date.restype = None self.isc_encode_date.argtypes = [c_void_p, POINTER(ISC_QUAD)] self.isc_encode_sql_date = fb_library.isc_encode_sql_date self.isc_encode_sql_date.restype = None self.isc_encode_sql_date.argtypes = [c_void_p, POINTER(ISC_DATE)] self.isc_encode_sql_time = fb_library.isc_encode_sql_time self.isc_encode_sql_time.restype = None self.isc_encode_sql_time.argtypes = [c_void_p, POINTER(ISC_TIME)] self.isc_encode_timestamp = fb_library.isc_encode_timestamp self.isc_encode_timestamp.restype = None self.isc_encode_timestamp.argtypes = [c_void_p, POINTER(ISC_TIMESTAMP)] self.isc_event_counts = fb_library.isc_event_counts self.isc_event_counts.restype = None self.isc_event_counts.argtypes = [POINTER(RESULT_VECTOR), c_short, POINTER(ISC_UCHAR), POINTER(ISC_UCHAR)] self.isc_expand_dpb = fb_library.isc_expand_dpb self.isc_expand_dpb.restype = None self.isc_expand_dpb.argtypes = [POINTER(STRING), POINTER(c_short)] self.isc_modify_dpb = fb_library.isc_modify_dpb self.isc_modify_dpb.restype = c_int self.isc_modify_dpb.argtypes = [POINTER(STRING), POINTER(c_short), c_ushort, STRING, c_short] self.isc_free = fb_library.isc_free self.isc_free.restype = ISC_LONG self.isc_free.argtypes = [STRING] self.isc_get_segment = fb_library.isc_get_segment self.isc_get_segment.restype = ISC_STATUS self.isc_get_segment.argtypes = [POINTER(ISC_STATUS), POINTER(isc_blob_handle), POINTER(c_ushort), c_ushort, c_void_p] #self.isc_get_segment.argtypes = [POINTER(ISC_STATUS), POINTER(isc_blob_handle), # POINTER(c_ushort), c_ushort, POINTER(c_char)] self.isc_get_slice = fb_library.isc_get_slice self.isc_get_slice.restype = ISC_STATUS self.isc_get_slice.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), POINTER(ISC_QUAD), c_short, STRING, c_short, POINTER(ISC_LONG), ISC_LONG, c_void_p, POINTER(ISC_LONG)] self.isc_interprete = fb_library.isc_interprete self.isc_interprete.restype = ISC_LONG self.isc_interprete.argtypes = [STRING, POINTER(POINTER(ISC_STATUS))] self.fb_interpret = fb_library.fb_interpret self.fb_interpret.restype = ISC_LONG self.fb_interpret.argtypes = [STRING, c_uint, POINTER(POINTER(ISC_STATUS))] self.isc_open_blob = fb_library.isc_open_blob self.isc_open_blob.restype = ISC_STATUS self.isc_open_blob.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), POINTER(isc_blob_handle), POINTER(ISC_QUAD)] self.isc_open_blob2 = fb_library.isc_open_blob2 self.isc_open_blob2.restype = ISC_STATUS self.isc_open_blob2.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), POINTER(isc_blob_handle), POINTER(ISC_QUAD), ISC_USHORT, STRING] # POINTER(ISC_UCHAR) self.isc_prepare_transaction2 = fb_library.isc_prepare_transaction2 self.isc_prepare_transaction2.restype = ISC_STATUS self.isc_prepare_transaction2.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle), ISC_USHORT, POINTER(ISC_UCHAR)] self.isc_print_sqlerror = fb_library.isc_print_sqlerror self.isc_print_sqlerror.restype = None self.isc_print_sqlerror.argtypes = [ISC_SHORT, POINTER(ISC_STATUS)] self.isc_print_status = fb_library.isc_print_status self.isc_print_status.restype = ISC_STATUS self.isc_print_status.argtypes = [POINTER(ISC_STATUS)] self.isc_put_segment = fb_library.isc_put_segment self.isc_put_segment.restype = ISC_STATUS self.isc_put_segment.argtypes = [POINTER(ISC_STATUS), POINTER(isc_blob_handle), c_ushort, c_void_p] #self.isc_put_segment.argtypes = [POINTER(ISC_STATUS), POINTER(isc_blob_handle), # c_ushort, STRING] self.isc_put_slice = fb_library.isc_put_slice self.isc_put_slice.restype = ISC_STATUS self.isc_put_slice.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), POINTER(ISC_QUAD), c_short, STRING, c_short, POINTER(ISC_LONG), ISC_LONG, c_void_p] self.isc_que_events = fb_library.isc_que_events self.isc_que_events.restype = ISC_STATUS self.isc_que_events.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(ISC_LONG), c_short, POINTER(ISC_UCHAR), ISC_EVENT_CALLBACK, POINTER(ISC_UCHAR)] self.isc_rollback_retaining = fb_library.isc_rollback_retaining self.isc_rollback_retaining.restype = ISC_STATUS self.isc_rollback_retaining.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle)] self.isc_rollback_transaction = fb_library.isc_rollback_transaction self.isc_rollback_transaction.restype = ISC_STATUS self.isc_rollback_transaction.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle)] self.isc_start_multiple = fb_library.isc_start_multiple self.isc_start_multiple.restype = ISC_STATUS self.isc_start_multiple.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle), c_short, c_void_p] if sys.platform in ['win32', 'cygwin', 'os2', 'os2emx']: P_isc_start_transaction = CFUNCTYPE(ISC_STATUS, POINTER(ISC_STATUS), POINTER(isc_tr_handle), c_short, POINTER(isc_db_handle), c_short, STRING) self.isc_start_transaction = P_isc_start_transaction(('isc_start_transaction', fb_library)) else: self.isc_start_transaction = fb_library.isc_start_transaction self.isc_start_transaction.restype = ISC_STATUS self.isc_start_transaction.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle), c_short, POINTER(isc_db_handle), c_short, STRING] self.isc_sqlcode = fb_library.isc_sqlcode self.isc_sqlcode.restype = ISC_LONG self.isc_sqlcode.argtypes = [POINTER(ISC_STATUS)] self.isc_sql_interprete = fb_library.isc_sql_interprete self.isc_sql_interprete.restype = None self.isc_sql_interprete.argtypes = [c_short, STRING, c_short] self.isc_transaction_info = fb_library.isc_transaction_info self.isc_transaction_info.restype = ISC_STATUS self.isc_transaction_info.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle), c_short, STRING, c_short, STRING] self.isc_transact_request = fb_library.isc_transact_request self.isc_transact_request.restype = ISC_STATUS self.isc_transact_request.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), c_ushort, STRING, c_ushort, STRING, c_ushort, STRING] self.isc_vax_integer = fb_library.isc_vax_integer self.isc_vax_integer.restype = ISC_LONG self.isc_vax_integer.argtypes = [STRING, c_short] self.isc_portable_integer = fb_library.isc_portable_integer self.isc_portable_integer.restype = ISC_INT64 self.isc_portable_integer.argtypes = [POINTER(ISC_UCHAR), c_short] self.isc_add_user = fb_library.isc_add_user self.isc_add_user.restype = ISC_STATUS self.isc_add_user.argtypes = [POINTER(ISC_STATUS), POINTER(USER_SEC_DATA)] self.isc_delete_user = fb_library.isc_delete_user self.isc_delete_user.restype = ISC_STATUS self.isc_delete_user.argtypes = [POINTER(ISC_STATUS), POINTER(USER_SEC_DATA)] self.isc_modify_user = fb_library.isc_modify_user self.isc_modify_user.restype = ISC_STATUS self.isc_modify_user.argtypes = [POINTER(ISC_STATUS), POINTER(USER_SEC_DATA)] self.isc_compile_request = fb_library.isc_compile_request self.isc_compile_request.restype = ISC_STATUS self.isc_compile_request.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_req_handle), c_short, STRING] self.isc_compile_request2 = fb_library.isc_compile_request2 self.isc_compile_request2.restype = ISC_STATUS self.isc_compile_request2.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_req_handle), c_short, STRING] self.isc_ddl = fb_library.isc_ddl self.isc_ddl.restype = ISC_STATUS self.isc_ddl.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), c_short, STRING] self.isc_prepare_transaction = fb_library.isc_prepare_transaction self.isc_prepare_transaction.restype = ISC_STATUS self.isc_prepare_transaction.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle)] self.isc_receive = fb_library.isc_receive self.isc_receive.restype = ISC_STATUS self.isc_receive.argtypes = [POINTER(ISC_STATUS), POINTER(isc_req_handle), c_short, c_short, c_void_p, c_short] self.isc_reconnect_transaction = fb_library.isc_reconnect_transaction self.isc_reconnect_transaction.restype = ISC_STATUS self.isc_reconnect_transaction.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), c_short, STRING] self.isc_release_request = fb_library.isc_release_request self.isc_release_request.restype = ISC_STATUS self.isc_release_request.argtypes = [POINTER(ISC_STATUS), POINTER(isc_req_handle)] self.isc_request_info = fb_library.isc_request_info self.isc_request_info.restype = ISC_STATUS self.isc_request_info.argtypes = [POINTER(ISC_STATUS), POINTER(isc_req_handle), c_short, c_short, STRING, c_short, STRING] self.isc_seek_blob = fb_library.isc_seek_blob self.isc_seek_blob.restype = ISC_STATUS self.isc_seek_blob.argtypes = [POINTER(ISC_STATUS), POINTER(isc_blob_handle), c_short, ISC_LONG, POINTER(ISC_LONG)] self.isc_send = fb_library.isc_send self.isc_send.restype = ISC_STATUS self.isc_send.argtypes = [POINTER(ISC_STATUS), POINTER(isc_req_handle), c_short, c_short, c_void_p, c_short] self.isc_start_and_send = fb_library.isc_start_and_send self.isc_start_and_send.restype = ISC_STATUS self.isc_start_and_send.argtypes = [POINTER(ISC_STATUS), POINTER(isc_req_handle), POINTER(isc_tr_handle), c_short, c_short, c_void_p, c_short] self.isc_start_request = fb_library.isc_start_request self.isc_start_request.restype = ISC_STATUS self.isc_start_request.argtypes = [POINTER(ISC_STATUS), POINTER(isc_req_handle), POINTER(isc_tr_handle), c_short] self.isc_unwind_request = fb_library.isc_unwind_request self.isc_unwind_request.restype = ISC_STATUS self.isc_unwind_request.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle), c_short] self.isc_wait_for_event = fb_library.isc_wait_for_event self.isc_wait_for_event.restype = ISC_STATUS self.isc_wait_for_event.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), c_short, POINTER(ISC_UCHAR), POINTER(ISC_UCHAR)] self.isc_close = fb_library.isc_close self.isc_close.restype = ISC_STATUS self.isc_close.argtypes = [POINTER(ISC_STATUS), STRING] self.isc_declare = fb_library.isc_declare self.isc_declare.restype = ISC_STATUS self.isc_declare.argtypes = [POINTER(ISC_STATUS), STRING, STRING] self.isc_describe = fb_library.isc_describe self.isc_describe.restype = ISC_STATUS self.isc_describe.argtypes = [POINTER(ISC_STATUS), STRING, POINTER(XSQLDA)] self.isc_describe_bind = fb_library.isc_describe_bind self.isc_describe_bind.restype = ISC_STATUS self.isc_describe_bind.argtypes = [POINTER(ISC_STATUS), STRING, POINTER(XSQLDA)] self.isc_execute = fb_library.isc_execute self.isc_execute.restype = ISC_STATUS self.isc_execute.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle), STRING, POINTER(XSQLDA)] self.isc_execute_immediate = fb_library.isc_execute_immediate self.isc_execute_immediate.restype = ISC_STATUS self.isc_execute_immediate.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), POINTER(c_short), STRING] self.isc_fetch = fb_library.isc_fetch self.isc_fetch.restype = ISC_STATUS self.isc_fetch.argtypes = [POINTER(ISC_STATUS), STRING, POINTER(XSQLDA)] self.isc_open = fb_library.isc_open self.isc_open.restype = ISC_STATUS self.isc_open.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle), STRING, POINTER(XSQLDA)] self.isc_prepare = fb_library.isc_prepare self.isc_prepare.restype = ISC_STATUS self.isc_prepare.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), STRING, POINTER(c_short), STRING, POINTER(XSQLDA)] self.isc_dsql_execute_m = fb_library.isc_dsql_execute_m self.isc_dsql_execute_m.restype = ISC_STATUS self.isc_dsql_execute_m.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle), POINTER(isc_stmt_handle), c_ushort, STRING, c_ushort, c_ushort, STRING] self.isc_dsql_execute2_m = fb_library.isc_dsql_execute2_m self.isc_dsql_execute2_m.restype = ISC_STATUS self.isc_dsql_execute2_m.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle), POINTER(isc_stmt_handle), c_ushort, STRING, c_ushort, c_ushort, STRING, c_ushort, STRING, c_ushort, c_ushort, STRING] self.isc_dsql_execute_immediate_m = fb_library.isc_dsql_execute_immediate_m self.isc_dsql_execute_immediate_m.restype = ISC_STATUS self.isc_dsql_execute_immediate_m.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), c_ushort, STRING, c_ushort, c_ushort, STRING, c_ushort, c_ushort, STRING] self.isc_dsql_exec_immed3_m = fb_library.isc_dsql_exec_immed3_m self.isc_dsql_exec_immed3_m.restype = ISC_STATUS self.isc_dsql_exec_immed3_m.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), c_ushort, STRING, c_ushort, c_ushort, STRING, c_ushort, c_ushort, STRING, c_ushort, STRING, c_ushort, c_ushort, STRING] self.isc_dsql_fetch_m = fb_library.isc_dsql_fetch_m self.isc_dsql_fetch_m.restype = ISC_STATUS self.isc_dsql_fetch_m.argtypes = [POINTER(ISC_STATUS), POINTER(isc_stmt_handle), c_ushort, STRING, c_ushort, c_ushort, STRING] self.isc_dsql_insert_m = fb_library.isc_dsql_insert_m self.isc_dsql_insert_m.restype = ISC_STATUS self.isc_dsql_insert_m.argtypes = [POINTER(ISC_STATUS), POINTER(isc_stmt_handle), c_ushort, STRING, c_ushort, c_ushort, STRING] self.isc_dsql_prepare_m = fb_library.isc_dsql_prepare_m self.isc_dsql_prepare_m.restype = ISC_STATUS self.isc_dsql_prepare_m.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle), POINTER(isc_stmt_handle), c_ushort, STRING, c_ushort, c_ushort, STRING, c_ushort, STRING] self.isc_dsql_release = fb_library.isc_dsql_release self.isc_dsql_release.restype = ISC_STATUS self.isc_dsql_release.argtypes = [POINTER(ISC_STATUS), STRING] self.isc_embed_dsql_close = fb_library.isc_embed_dsql_close self.isc_embed_dsql_close.restype = ISC_STATUS self.isc_embed_dsql_close.argtypes = [POINTER(ISC_STATUS), STRING] self.isc_embed_dsql_declare = fb_library.isc_embed_dsql_declare self.isc_embed_dsql_declare.restype = ISC_STATUS self.isc_embed_dsql_declare.argtypes = [POINTER(ISC_STATUS), STRING, STRING] self.isc_embed_dsql_describe = fb_library.isc_embed_dsql_describe self.isc_embed_dsql_describe.restype = ISC_STATUS self.isc_embed_dsql_describe.argtypes = [POINTER(ISC_STATUS), STRING, c_ushort, POINTER(XSQLDA)] self.isc_embed_dsql_describe_bind = fb_library.isc_embed_dsql_describe_bind self.isc_embed_dsql_describe_bind.restype = ISC_STATUS self.isc_embed_dsql_describe_bind.argtypes = [POINTER(ISC_STATUS), STRING, c_ushort, POINTER(XSQLDA)] self.isc_embed_dsql_execute = fb_library.isc_embed_dsql_execute self.isc_embed_dsql_execute.restype = ISC_STATUS self.isc_embed_dsql_execute.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle), STRING, c_ushort, POINTER(XSQLDA)] self.isc_embed_dsql_execute2 = fb_library.isc_embed_dsql_execute2 self.isc_embed_dsql_execute2.restype = ISC_STATUS self.isc_embed_dsql_execute2.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle), STRING, c_ushort, POINTER(XSQLDA), POINTER(XSQLDA)] self.isc_embed_dsql_execute_immed = fb_library.isc_embed_dsql_execute_immed self.isc_embed_dsql_execute_immed.restype = ISC_STATUS self.isc_embed_dsql_execute_immed.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), c_ushort, STRING, c_ushort, POINTER(XSQLDA)] self.isc_embed_dsql_fetch = fb_library.isc_embed_dsql_fetch self.isc_embed_dsql_fetch.restype = ISC_STATUS self.isc_embed_dsql_fetch.argtypes = [POINTER(ISC_STATUS), STRING, c_ushort, POINTER(XSQLDA)] self.isc_embed_dsql_fetch_a = fb_library.isc_embed_dsql_fetch_a self.isc_embed_dsql_fetch_a.restype = ISC_STATUS self.isc_embed_dsql_fetch_a.argtypes = [POINTER(ISC_STATUS), POINTER(c_int), STRING, ISC_USHORT, POINTER(XSQLDA)] self.isc_embed_dsql_open = fb_library.isc_embed_dsql_open self.isc_embed_dsql_open.restype = ISC_STATUS self.isc_embed_dsql_open.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle), STRING, c_ushort, POINTER(XSQLDA)] self.isc_embed_dsql_open2 = fb_library.isc_embed_dsql_open2 self.isc_embed_dsql_open2.restype = ISC_STATUS self.isc_embed_dsql_open2.argtypes = [POINTER(ISC_STATUS), POINTER(isc_tr_handle), STRING, c_ushort, POINTER(XSQLDA), POINTER(XSQLDA)] self.isc_embed_dsql_insert = fb_library.isc_embed_dsql_insert self.isc_embed_dsql_insert.restype = ISC_STATUS self.isc_embed_dsql_insert.argtypes = [POINTER(ISC_STATUS), STRING, c_ushort, POINTER(XSQLDA)] self.isc_embed_dsql_prepare = fb_library.isc_embed_dsql_prepare self.isc_embed_dsql_prepare.restype = ISC_STATUS self.isc_embed_dsql_prepare.argtypes = [POINTER(ISC_STATUS), POINTER(isc_db_handle), POINTER(isc_tr_handle), STRING, c_ushort, STRING, c_ushort, POINTER(XSQLDA)] self.isc_embed_dsql_release = fb_library.isc_embed_dsql_release self.isc_embed_dsql_release.restype = ISC_STATUS self.isc_embed_dsql_release.argtypes = [POINTER(ISC_STATUS), STRING] self.BLOB_open = fb_library.BLOB_open self.BLOB_open.restype = POINTER(BSTREAM) self.BLOB_open.argtypes = [isc_blob_handle, STRING, c_int] self.BLOB_put = fb_library.BLOB_put self.BLOB_put.restype = c_int self.BLOB_put.argtypes = [ISC_SCHAR, POINTER(BSTREAM)] self.BLOB_close = fb_library.BLOB_close self.BLOB_close.restype = c_int self.BLOB_close.argtypes = [POINTER(BSTREAM)] self.BLOB_get = fb_library.BLOB_get self.BLOB_get.restype = c_int self.BLOB_get.argtypes = [POINTER(BSTREAM)] self.BLOB_display = fb_library.BLOB_display self.BLOB_display.restype = c_int self.BLOB_display.argtypes = [POINTER(ISC_QUAD), isc_db_handle, isc_tr_handle, STRING] self.BLOB_dump = fb_library.BLOB_dump self.BLOB_dump.restype = c_int self.BLOB_dump.argtypes = [POINTER(ISC_QUAD), isc_db_handle, isc_tr_handle, STRING] self.BLOB_edit = fb_library.BLOB_edit self.BLOB_edit.restype = c_int self.BLOB_edit.argtypes = [POINTER(ISC_QUAD), isc_db_handle, isc_tr_handle, STRING] self.BLOB_load = fb_library.BLOB_load self.BLOB_load.restype = c_int self.BLOB_load.argtypes = [POINTER(ISC_QUAD), isc_db_handle, isc_tr_handle, STRING] self.BLOB_text_dump = fb_library.BLOB_text_dump self.BLOB_text_dump.restype = c_int self.BLOB_text_dump.argtypes = [POINTER(ISC_QUAD), isc_db_handle, isc_tr_handle, STRING] self.BLOB_text_load = fb_library.BLOB_text_load self.BLOB_text_load.restype = c_int self.BLOB_text_load.argtypes = [POINTER(ISC_QUAD), isc_db_handle, isc_tr_handle, STRING] self.Bopen = fb_library.Bopen self.Bopen.restype = POINTER(BSTREAM) self.Bopen.argtypes = [POINTER(ISC_QUAD), isc_db_handle, isc_tr_handle, STRING] self.isc_ftof = fb_library.isc_ftof self.isc_ftof.restype = ISC_LONG self.isc_ftof.argtypes = [STRING, c_ushort, STRING, c_ushort] self.isc_print_blr = fb_library.isc_print_blr self.isc_print_blr.restype = ISC_STATUS self.isc_print_blr.argtypes = [STRING, ISC_PRINT_CALLBACK, c_void_p, c_short] self.isc_set_debug = fb_library.isc_set_debug self.isc_set_debug.restype = None self.isc_set_debug.argtypes = [c_int] self.isc_qtoq = fb_library.isc_qtoq self.isc_qtoq.restype = None self.isc_qtoq.argtypes = [POINTER(ISC_QUAD), POINTER(ISC_QUAD)] self.isc_vtof = fb_library.isc_vtof self.isc_vtof.restype = None self.isc_vtof.argtypes = [STRING, STRING, c_ushort] self.isc_vtov = fb_library.isc_vtov self.isc_vtov.restype = None self.isc_vtov.argtypes = [STRING, STRING, c_short] self.isc_version = fb_library.isc_version self.isc_version.restype = c_int self.isc_version.argtypes = [POINTER(isc_db_handle), ISC_VERSION_CALLBACK, c_void_p] # deprecated #self.isc_reset_fpe = fb_library.isc_reset_fpe #self.isc_reset_fpe.restype = ISC_LONG #self.isc_reset_fpe.argtypes = [ISC_USHORT] self.isc_service_attach = fb_library.isc_service_attach self.isc_service_attach.restype = ISC_STATUS self.isc_service_attach.argtypes = [POINTER(ISC_STATUS), c_ushort, STRING, POINTER(isc_svc_handle), c_ushort, STRING] self.isc_service_detach = fb_library.isc_service_detach self.isc_service_detach.restype = ISC_STATUS self.isc_service_detach.argtypes = [POINTER(ISC_STATUS), POINTER(isc_svc_handle)] self.isc_service_query = fb_library.isc_service_query self.isc_service_query.restype = ISC_STATUS self.isc_service_query.argtypes = [POINTER(ISC_STATUS), POINTER(isc_svc_handle), POINTER(isc_resv_handle), c_ushort, STRING, c_ushort, STRING, c_ushort, STRING] self.isc_service_start = fb_library.isc_service_start self.isc_service_start.restype = ISC_STATUS self.isc_service_start.argtypes = [POINTER(ISC_STATUS), POINTER(isc_svc_handle), POINTER(isc_resv_handle), c_ushort, STRING] self.isc_get_client_version = fb_library.isc_get_client_version self.isc_get_client_version.restype = None self.isc_get_client_version.argtypes = [STRING] self.isc_get_client_major_version = fb_library.isc_get_client_major_version self.isc_get_client_major_version.restype = c_int self.isc_get_client_major_version.argtypes = [] self.isc_get_client_minor_version = fb_library.isc_get_client_minor_version self.isc_get_client_minor_version.restype = c_int self.isc_get_client_minor_version.argtypes = [] #self.imaxabs = fb_library.imaxabs #self.imaxabs.restype = intmax_t #self.imaxabs.argtypes = [intmax_t] #self.imaxdiv = fb_library.imaxdiv #self.imaxdiv.restype = imaxdiv_t #self.imaxdiv.argtypes = [intmax_t, intmax_t] #self.strtoimax = fb_library.strtoimax #self.strtoimax.restype = intmax_t #self.strtoimax.argtypes = [STRING, POINTER(STRING), c_int] #self.strtoumax = fb_library.strtoumax #self.strtoumax.restype = uintmax_t #self.strtoumax.argtypes = [STRING, POINTER(STRING), c_int] #self.wcstoimax = fb_library.wcstoimax #self.wcstoimax.restype = intmax_t #self.wcstoimax.argtypes = [WSTRING, POINTER(WSTRING), c_int] #self.wcstoumax = fb_library.wcstoumax #self.wcstoumax.restype = uintmax_t #self.wcstoumax.argtypes = [WSTRING, POINTER(WSTRING), c_int] self.P_isc_event_block = CFUNCTYPE(ISC_LONG,POINTER(POINTER(ISC_UCHAR)), POINTER(POINTER(ISC_UCHAR)), ISC_USHORT) self.C_isc_event_block = self.P_isc_event_block(('isc_event_block',fb_library)) self.P_isc_event_block_args = self.C_isc_event_block.argtypes def isc_event_block(self,event_buffer,result_buffer,*args): if len(args) > 15: raise Exception("isc_event_block takes no more than 15 event names") newargs = list(self.P_isc_event_block_args) for x in args: newargs.append(STRING) self.C_isc_event_block.argtypes = newargs result = self.C_isc_event_block(event_buffer,result_buffer,len(args),*args) return result fdb-1.4.9+dfsg1/fdb/utils.py0000644000215700017510000001517212431144632014440 0ustar rstuartit#coding:utf-8 # # PROGRAM: fdb # MODULE: utils.py # DESCRIPTION: Various utility classes and functions # CREATED: 10.5.2013 # # 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 Pavel Cisar # # Copyright (c) 2013 Pavel Cisar # and all contributors signed below. # # All Rights Reserved. # Contributor(s): ______________________________________. def update_meta (self, other): "Helper function for :class:`LateBindingProperty` class." self.__name__ = other.__name__ self.__doc__ = other.__doc__ self.__dict__.update(other.__dict__) return self class LateBindingProperty (property): """Peroperty class that binds to getter/setter/deleter methods when **instance** of class that define the property is created. This allows you to override these methods in descendant classes (if they are not private) without necessity to redeclare the property itself in descendant class. Recipe from Tim Delaney, 2005/03/31 http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/408713 :: class C(object): def getx(self): print 'C.getx' return self._x def setx(self, x): print 'C.setx' self._x = x def delx(self): print 'C.delx' del self._x x = LateBindingProperty(getx, setx, delx) class D(C): def setx(self, x): print 'D.setx' super(D, self).setx(x) def delx(self): print 'D.delx' super(D, self).delx() c = C() c.x = 1 c.x c.x del c.x print d = D() d.x = 1 d.x d.x del d.x This has the advantages that: a. You get back an actual property object (with attendant memory savings, performance increases, etc); b. It's the same syntax as using property(fget, fset, fdel, doc) except for the name; c. It will fail earlier (when you define the class as opposed to when you use it). d. It's shorter ;) e. If you inspect the property you will get back functions with the correct __name__, __doc__, etc. """ def __new__(self, fget=None, fset=None, fdel=None, doc=None): if fget is not None: def __get__(obj, objtype=None, name=fget.__name__): fget = getattr(obj, name) return fget() fget = update_meta(__get__, fget) if fset is not None: def __set__(obj, value, name=fset.__name__): fset = getattr(obj, name) return fset(value) fset = update_meta(__set__, fset) if fdel is not None: def __delete__(obj, name=fdel.__name__): fdel = getattr(obj, name) return fdel() fdel = update_meta(__delete__, fdel) return property(fget, fset, fdel, doc) class Iterator(object): """Generic iterator implementation. """ def __init__(self, method, sentinel = None): """ :param method: Callable without parameters that returns next item. :param sentinel: Value that when returned by `method` indicates the end of sequence. """ self.getnext = method self.sentinel = sentinel self.exhausted = False def __iter__(self): return self def next(self): if self.exhausted: raise StopIteration else: result = self.getnext() self.exhausted = (result == self.sentinel) if self.exhausted: raise StopIteration else: return result __next__ = next class EmbeddedProperty(property): """Property class that forwards calls to getter/setter/deleter methods to respective property methods of another object. This class allows you to "inject" properties from embedded object into class definition of parent object.""" def __init__(self,obj,prop): """ :param string obj: Attribute name with embedded object. :param property prop: Property instance from embedded object. """ self.obj = obj self.prop = prop self.__doc__ = prop.__doc__ def __get__(self,obj,objtype): if obj is None: return self return self.prop.__get__(getattr(obj,self.obj)) def __set__(self,obj,val): self.prop.__set__(getattr(obj,self.obj),val) def __delete__(self,obj): self.prop.__delete__(getattr(obj,self.obj)) class EmbeddedAttribute(property): """Property class that gets/sets attribute of another object. This class allows you to "inject" attributes from embedded object into class definition of parent object.""" def __init__(self,obj,attr): """ :param string obj: Attribute name with embedded object. :param string attr: Attribute name from embedded object. """ self.obj = obj self.attr = attr self.__doc__ = attr.__doc__ def __get__(self,obj,objtype): if obj is None: return self return getattr(getattr(obj,self.obj),self.attr) def __set__(self,obj,val): setattr(getattr(obj,self.obj),self.attr,val) def iter_class_properties(cls): """Iterator that yields `name, property` pairs for all properties in class. :param class cls: Class object.""" for varname in vars(cls): value = getattr(cls, varname) if isinstance(value, property): yield varname, value def iter_class_variables(cls): """Iterator that yields names of all non-callable attributes in class. :param class cls: Class object.""" for varname in vars(cls): value = getattr(cls, varname) if not (isinstance(value, property) or callable(value)): yield varname def embed_attributes(from_class,attr): """Class decorator that injects properties and non-callable attributes from another class instance embedded in class instances. :param class from_class: Class that should extend decorated class. :param string attr: Attribute name that holds instance of embedded class within decorated class instance.""" def d(class_): for pname,prop in iter_class_properties(from_class): if not hasattr(class_,pname): setattr(class_,pname,EmbeddedProperty(attr,prop)) for attrname in iter_class_variables(from_class): if not hasattr(class_,attrname): setattr(class_,attrname,EmbeddedAttribute(attr,attrname)) return class_ return d fdb-1.4.9+dfsg1/fdb/blr.py0000644000215700017510000001260412431143162014051 0ustar rstuartit#coding:utf-8 # # PROGRAM/MODULE: fdb # FILE: blr.py # DESCRIPTION: BLR-related definitions # CREATED: 12.6.2013 # # 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 Pavel Cisar # # Copyright (c) 2011 Pavel Cisar # and all contributors signed below. # # All Rights Reserved. # Contributor(s): Philippe Makowski # ______________________________________. # # See LICENSE.TXT for details. blr_inner = 0 blr_left = 1 blr_right = 2 blr_full = 3 blr_gds_code = 0 blr_sql_code = 1 blr_exception = 2 blr_trigger_code = 3 blr_default_code = 4 blr_raise = 5 blr_exception_msg = 6 blr_version4 = 4 blr_version5 = 5 blr_eoc = 76 blr_end = 255 blr_assignment = 1 blr_begin = 2 blr_dcl_variable = 3 blr_message = 4 blr_erase = 5 blr_fetch = 6 blr_for = 7 blr_if = 8 blr_loop = 9 blr_modify = 10 blr_handler = 11 blr_receive = 12 blr_select = 13 blr_send = 14 blr_store = 15 blr_label = 17 blr_leave = 18 blr_store2 = 19 blr_post = 20 blr_literal = 21 blr_dbkey = 22 blr_field = 23 blr_fid = 24 blr_parameter = 25 blr_variable = 26 blr_average = 27 blr_count = 28 blr_maximum = 29 blr_minimum = 30 blr_total = 31 blr_add = 34 blr_subtract = 35 blr_multiply = 36 blr_divide = 37 blr_negate = 38 blr_concatenate = 39 blr_substring = 40 blr_parameter2 = 41 blr_from = 42 blr_via = 43 blr_parameter2_old = 44 blr_user_name = 44 blr_null = 45 blr_equiv = 46 blr_eql = 47 blr_neq = 48 blr_gtr = 49 blr_geq = 50 blr_lss = 51 blr_leq = 52 blr_containing = 53 blr_matching = 54 blr_starting = 55 blr_between = 56 blr_or = 57 blr_and = 58 blr_not = 59 blr_any = 60 blr_missing = 61 blr_unique = 62 blr_like = 63 blr_rse = 67 blr_first = 68 blr_project = 69 blr_sort = 70 blr_boolean = 71 blr_ascending = 72 blr_descending = 73 blr_relation = 74 blr_rid = 75 blr_union = 76 blr_map = 77 blr_group_by = 78 blr_aggregate = 79 blr_join_type = 80 blr_agg_count = 83 blr_agg_max = 84 blr_agg_min = 85 blr_agg_total = 86 blr_agg_average = 87 blr_parameter3 = 88 blr_run_max = 89 blr_run_min = 90 blr_run_total = 91 blr_run_average = 92 blr_agg_count2 = 93 blr_agg_count_distinct = 94 blr_agg_total_distinct = 95 blr_agg_average_distinct = 96 blr_function = 100 blr_gen_id = 101 blr_prot_mask = 102 blr_upcase = 103 blr_lock_state = 104 blr_value_if = 105 blr_matching2 = 106 blr_index = 107 blr_ansi_like = 108 blr_seek = 112 blr_continue = 0 blr_forward = 1 blr_backward = 2 blr_bof_forward = 3 blr_eof_backward = 4 blr_run_count = 118 blr_rs_stream = 119 blr_exec_proc = 120 blr_procedure = 124 blr_pid = 125 blr_exec_pid = 126 blr_singular = 127 blr_abort = 128 blr_block = 129 blr_error_handler = 130 blr_cast = 131 blr_start_savepoint = 134 blr_end_savepoint = 135 # Access plan items blr_plan = 139 blr_merge = 140 blr_join = 141 blr_sequential = 142 blr_navigational = 143 blr_indices = 144 blr_retrieve = 145 blr_relation2 = 146 blr_rid2 = 147 blr_set_generator = 150 blr_ansi_any = 151 blr_exists = 152 blr_record_version = 154 blr_stall = 155 blr_ansi_all = 158 blr_extract = 159 # sub parameters for blr_extract blr_extract_year = 0 blr_extract_month = 1 blr_extract_day = 2 blr_extract_hour = 3 blr_extract_minute = 4 blr_extract_second = 5 blr_extract_weekday = 6 blr_extract_yearday = 7 # Added in FB 2.1 blr_extract_millisecond = 8 blr_extract_week = 9 blr_current_date = 160 blr_current_timestamp = 161 blr_current_time = 162 # Those codes reuse BLR code space blr_post_arg = 163 blr_exec_into = 164 blr_user_savepoint = 165 blr_dcl_cursor = 166 blr_cursor_stmt = 167 blr_current_timestamp2 = 168 blr_current_time2 = 169 blr_agg_list = 170 blr_agg_list_distinct = 171 blr_modify2 = 172 # FB 1.0 specific BLR blr_current_role = 174 blr_skip = 175 # FB 1.5 specific BLR blr_exec_sql = 176 blr_internal_info = 177 blr_nullsfirst = 178 blr_writelock = 179 blr_nullslast = 180 # FB 2.0 specific BLR blr_lowcase = 181 blr_strlen = 182 # sub parameter for blr_strlen blr_strlen_bit = 0 blr_strlen_char = 1 blr_strlen_octet = 2 blr_trim = 183 # first sub parameter for blr_trim blr_trim_both = 0 blr_trim_leading = 1 blr_trim_trailing = 2 # second sub parameter for blr_trim blr_trim_spaces = 0 blr_trim_characters = 1 # These codes are actions for user-defined savepoints blr_savepoint_set = 0 blr_savepoint_release = 1 blr_savepoint_undo = 2 blr_savepoint_release_single = 3 # These codes are actions for cursors blr_cursor_open = 0 blr_cursor_close = 1 blr_cursor_fetch = 2 # FB 2.1 specific BLR blr_init_variable = 184 blr_recurse = 185 blr_sys_function = 186 # FB 2.5 specific BLR blr_auto_trans = 187 blr_similar = 188 blr_exec_stmt = 189 # subcodes of blr_exec_stmt blr_exec_stmt_inputs = 1 # input parameters count blr_exec_stmt_outputs = 2 # output parameters count blr_exec_stmt_sql = 3 blr_exec_stmt_proc_block = 4 blr_exec_stmt_data_src = 5 blr_exec_stmt_user = 6 blr_exec_stmt_pwd = 7 blr_exec_stmt_tran = 8 # not implemented yet blr_exec_stmt_tran_clone = 9 # make transaction parameters equal to current transaction blr_exec_stmt_privs = 10 blr_exec_stmt_in_params = 11 # not named input parameters blr_exec_stmt_in_params2 = 12 # named input parameters blr_exec_stmt_out_params = 13 # output parameters blr_exec_stmt_role = 14 blr_stmt_expr = 190 blr_derived_expr = 191 fdb-1.4.9+dfsg1/fdb/monitor.py0000644000215700017510000010607712414532345014777 0ustar rstuartit#coding:utf-8 # # PROGRAM: fdb # MODULE: monitor.py # DESCRIPTION: Database monitoring # CREATED: 10.5.2013 # # 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 Pavel Cisar # # Copyright (c) 2013 Pavel Cisar # and all contributors signed below. # # All Rights Reserved. # Contributor(s): ______________________________________. import sys import os import fdb from fdb.utils import LateBindingProperty import weakref # Current shutdown mode SHUTDOWN_MODE_ONLINE = 0 SHUTDOWN_MODE_MULTI = 1 SHUTDOWN_MODE_SINGLE = 2 SHUTDOWN_MODE_FULL = 3 # Current physical backup state BACKUP_STATE_NORMAL = 0 BACKUP_STATE_STALLED = 1 BACKUP_STATE_MERGE = 2 # State STATE_IDLE = 0 STATE_ACTIVE = 1 # Flags FLAG_NOT_SET = 0 FLAG_SET = 1 # Transaction solation mode ISOLATION_CONSISTENCY = 0 ISOLATION_CONCURRENCY = 1 ISOLATION_READ_COMMITTED_RV = 2 ISOLATION_READ_COMMITTED_NO_RV = 3 # Wait mode INFINITE_WAIT = -1 NO_WAIT = 0 # Statistics group STAT_DATABASE = 0 STAT_ATTACHMENT = 1 STAT_TRANSACTION = 2 STAT_STATEMENT = 3 STAT_CALL = 4 class Monitor(object): """Class for access to Firebird monitoring tables. """ def __init__(self): self._con = None self._ic = None self.__internal = False def __del__(self): if not self.closed: self._close() def __get_closed(self): return self._con is None def __fail_if_closed(self): if self.closed: raise fdb.ProgrammingError("Monitor is not binded to connection.") def _close(self): self._ic.close() self._con = None self._ic = None def _set_as_internal(self): """Mark this instance as `internal` (embedded). This blocks calls to :meth:`bind` and :meth:`close`.""" self.__internal = True self._con = weakref.proxy(self._con) #--- protected def _get_database(self): if self.__database is None: self.__fail_if_closed() if self._con.ods >= fdb.ODS_FB_21: self._ic.execute("select * from mon$database") self.__database = DatabaseInfo(self,self._ic.fetchonemap()) else: self.__database = [] return self.__database def _get_attachments(self): if self.__attachments is None: self.__fail_if_closed() if self._con.ods >= fdb.ODS_FB_21: self._ic.execute("select * from mon$attachments") self.__attachments = [AttachmentInfo(self,row) for row in self._ic.itermap()] else: self.__attachments = [] return self.__attachments def _get_this_attachment(self): return self.get_attachment(self._con.db_info(fdb.isc_info_attachment_id)) def _get_transactions(self): if self.__transactions is None: self.__fail_if_closed() if self._con.ods >= fdb.ODS_FB_21: self._ic.execute("select * from mon$transactions") self.__transactions = [TransactionInfo(self,row) for row in self._ic.itermap()] else: self.__transactions = [] return self.__transactions def _get_statements(self): if self.__statements is None: self.__fail_if_closed() if self._con.ods >= fdb.ODS_FB_21: self._ic.execute("select * from mon$statements") self.__statements = [StatementInfo(self,row) for row in self._ic.itermap()] else: self.__statements = [] return self.__statements def _get_callstack(self): if self.__callstack is None: self.__fail_if_closed() if self._con.ods >= fdb.ODS_FB_21: self._ic.execute("select * from mon$call_stack") self.__callstack = [CallStackInfo(self,row) for row in self._ic.itermap()] else: self.__callstack = [] return self.__callstack def _get_iostats(self): if self.__iostats is None: self.__fail_if_closed() if self._con.ods >= fdb.ODS_FB_25: self._ic.execute("""SELECT r.MON$STAT_ID, r.MON$STAT_GROUP, r.MON$RECORD_SEQ_READS, r.MON$RECORD_IDX_READS, r.MON$RECORD_INSERTS, r.MON$RECORD_UPDATES, r.MON$RECORD_DELETES, r.MON$RECORD_BACKOUTS, r.MON$RECORD_PURGES, r.MON$RECORD_EXPUNGES, io.MON$PAGE_FETCHES, io.MON$PAGE_MARKS, io.MON$PAGE_READS, io.MON$PAGE_WRITES, m.MON$MEMORY_ALLOCATED, m.MON$MEMORY_USED, m.MON$MAX_MEMORY_ALLOCATED, m.MON$MAX_MEMORY_USED FROM MON$RECORD_STATS r join MON$IO_STATS io on r.MON$STAT_ID = io.MON$STAT_ID and r.MON$STAT_GROUP = io.MON$STAT_GROUP join MON$MEMORY_USAGE m on r.MON$STAT_ID = m.MON$STAT_ID and r.MON$STAT_GROUP = m.MON$STAT_GROUP""") elif self._con.ods >= fdb.ODS_FB_21: self._ic.execute("""SELECT r.MON$STAT_ID, r.MON$STAT_GROUP, r.MON$RECORD_SEQ_READS, r.MON$RECORD_IDX_READS, r.MON$RECORD_INSERTS, r.MON$RECORD_UPDATES, r.MON$RECORD_DELETES, r.MON$RECORD_BACKOUTS, r.MON$RECORD_PURGES, r.MON$RECORD_EXPUNGES, io.MON$PAGE_FETCHES, io.MON$PAGE_MARKS, io.MON$PAGE_READS, io.MON$PAGE_WRITES FROM MON$RECORD_STATS r join MON$IO_STATS io on r.MON$STAT_ID = io.MON$STAT_ID and r.MON$STAT_GROUP = io.MON$STAT_GROUP""") if self._con.ods >= fdb.ODS_FB_21: self.__iostats = [IOStatsInfo(self,row) for row in self._ic.itermap()] else: self.__iostats = [] return self.__iostats def _get_variables(self): if self.__variables is None: self.__fail_if_closed() if self._con.ods >= fdb.ODS_FB_25: self._ic.execute("select * from mon$context_variables") self.__variables = [ContextVariableInfo(self,row) for row in self._ic.itermap()] else: self.__variables = [] return self.__variables #--- Properties #: True if link to :class:`~fdb.Connection` is closed. closed = property(__get_closed) db = LateBindingProperty(_get_database,None,None, ":class:`DatabaseInfo` object for attached database.") attachments = LateBindingProperty(_get_attachments,None,None, "List of all attachments.\nItems are :class:`AttachmentInfo` objects.") this_attachment = LateBindingProperty(_get_this_attachment,None,None, ":class:`AttachmentInfo` object for current connection.") transactions = LateBindingProperty(_get_transactions,None,None, "List of all transactions.\nItems are :class:`TransactionInfo` objects.") statements = LateBindingProperty(_get_statements,None,None, "List of all statements.\nItems are :class:`StatementInfo` objects.") callstack = LateBindingProperty(_get_callstack,None,None, "List with complete call stack.\nItems are :class:`CallStackInfo` objects.") iostats = LateBindingProperty(_get_iostats,None,None, "List of all I/O statistics.\nItems are :class:`IOStatsInfo` objects.") variables = LateBindingProperty(_get_variables,None,None, "List of all context variables.\nItems are :class:`ContextVariableInfo` objects.") #--- Public def bind(self, connection): """Bind this instance to specified :class:`~fdb.Connection`. :param connection: :class:`~fdb.Connection` instance. :raises ProgrammingError: If Monitor object was set as internal (via :meth:`_set_as_internal`) or database has ODS lower than 11.1. """ if self.__internal: raise fdb.ProgrammingError("Call to 'bind' not allowed for embedded Monitor.") if self._con: self.close() if connection.ods < fdb.ODS_FB_21: raise fdb.ProgrammingError("Monitoring tables are available only " \ "for databases with ODS 11.1 and higher.") self._con = connection self._ic = self._con.trans(fdb.ISOLATION_LEVEL_READ_COMMITED_RO).cursor() self.clear() def close(self): """Sever link to :class:`~fdb.Connection`. :raises ProgrammingError: If Monitor object was set as internal (via :meth:`_set_as_internal`). """ if self.__internal: raise fdb.ProgrammingError("Call to 'close' not allowed for embedded Monitor.") self._close() self.clear() def clear(self): """Drop all cached information objects. Force reload of fresh monitoring information on next reference.""" self.__database = None self.__attachments = None self.__transactions = None self.__statements = None self.__callstack = None self.__iostats = None self.__variables = None if not self.closed: self._ic.transaction.commit() def refresh(self): "Reloads fresh monitoring information." self.__fail_if_closed() self._ic.transaction.commit() self.clear() self._get_database() def get_attachment(self,id): """Get :class:`AttachmentInfo` by ID. :param int id: Attachment ID. :returns: :class:`AttachmentInfo` with specified ID or `None`. """ for attachment in self.attachments: if attachment.id == id: return attachment else: return None def get_transaction(self,id): """Get :class:`TransactionInfo` by ID. :param int id: Transaction ID. :returns: :class:`TransactionInfo` with specified ID or `None`. """ for transaction in self.transactions: if transaction.id == id: return transaction else: return None def get_statement(self,id): """Get :class:`StatementInfo` by ID. :param int id: Statement ID. :returns: :class:`StatementInfo` with specified ID or `None`. """ for statement in self.statements: if statement.id == id: return statement else: return None def get_call(self,id): """Get :class:`CallStackInfo` by ID. :param int id: Callstack ID. :returns: :class:`CallStackInfo` with specified ID or `None`. """ for call in self.callstack: if call.id == id: return call else: return None class BaseInfoItem(object): "Base class for all database monitoring objects." #: Weak reference to parent :class:`Monitor` instance. monitor = None def __init__(self,monitor,attributes): self.monitor = monitor if type(monitor) == weakref.ProxyType else weakref.proxy(monitor) self._attributes = dict(attributes) #--- protected def _strip_attribute(self,attr): if self._attributes.get(attr): self._attributes[attr] = self._attributes[attr].strip() #--- Protected def _get_stat_id(self): return self._attributes.get('MON$STAT_ID') #--- properties stat_id = LateBindingProperty(_get_stat_id,None,None,"Internal ID.") class DatabaseInfo(BaseInfoItem): "Information about attached database." def __init__(self,monitor,attributes): super(DatabaseInfo,self).__init__(monitor,attributes) self._strip_attribute('MON$DATABASE_NAME') #--- Protected def __get_name(self): return self._attributes['MON$DATABASE_NAME'] def __get_page_size(self): return self._attributes['MON$PAGE_SIZE'] def __get_ods(self): return float('%d.%d' % (self._attributes['MON$ODS_MAJOR'], self._attributes['MON$ODS_MINOR'])) def __get_oit(self): return self._attributes['MON$OLDEST_TRANSACTION'] def __get_oat(self): return self._attributes['MON$OLDEST_ACTIVE'] def __get_ost(self): return self._attributes['MON$OLDEST_SNAPSHOT'] def __get_next_transaction(self): return self._attributes['MON$NEXT_TRANSACTION'] def __get_cache_size(self): return self._attributes['MON$PAGE_BUFFERS'] def __get_sql_dialect(self): return self._attributes['MON$SQL_DIALECT'] def __get_shutdown_mode(self): return self._attributes['MON$SHUTDOWN_MODE'] def __get_sweep_interval(self): return self._attributes['MON$SWEEP_INTERVAL'] def __get_read_only(self): return bool(self._attributes['MON$READ_ONLY']) def __get_forced_writes(self): return bool(self._attributes['MON$FORCED_WRITES']) def __get_reserve_space(self): return bool(self._attributes['MON$RESERVE_SPACE']) def __get_created(self): return self._attributes['MON$CREATION_DATE'] def __get_pages(self): return self._attributes['MON$PAGES'] def __get_backup_state(self): return self._attributes['MON$BACKUP_STATE'] def __get_iostats(self): for io in self.monitor.iostats: if (io.stat_id == self.stat_id) and (io.group == STAT_DATABASE): return io return None #--- properties name = property(__get_name,None,None, "Database pathname or alias.") page_size = property(__get_page_size,None,None, "Size of database page in bytes.") ods = property(__get_ods,None,None, "On-Disk Structure (ODS) version number.") oit = property(__get_oit,None,None, "Transaction ID of the oldest [interesting] transaction.") oat = property(__get_oat,None,None, "Transaction ID of the oldest active transaction.") ost = property(__get_ost,None,None, "Transaction ID of the Oldest Snapshot, i.e., the number of the OAT " \ "when the last garbage collection was done.") next_transaction = property(__get_next_transaction,None,None, "Transaction ID of the next transaction that will be started.") cache_size = property(__get_cache_size,None,None, "Number of pages allocated in the page cache.") sql_dialect = property(__get_sql_dialect,None,None, "SQL dialect of the database.") shutdown_mode = property(__get_shutdown_mode,None,None, "Current shutdown mode.") sweep_interval = property(__get_sweep_interval,None,None, "The sweep interval configured in the database header. " \ "Value 0 indicates that sweeping is disabled.") read_only = property(__get_read_only,None,None, "True if database is Read Only.") forced_writes = property(__get_forced_writes,None,None, "True if database uses synchronous writes.") reserve_space = property(__get_reserve_space,None,None, "True if database reserves space on data pages.") created = property(__get_created,None,None, "Creation date and time, i.e., when the database was created or last restored.") pages = property(__get_pages,None,None, "Number of pages allocated on disk.") backup_state = property(__get_backup_state,None,None, "Current state of database with respect to nbackup physical backup.") iostats = property(__get_iostats,None,None, ":class:`IOStatsInfo` for this object.") class AttachmentInfo(BaseInfoItem): "Information about attachment (connection) to database." def __init__(self,monitor,attributes): super(AttachmentInfo,self).__init__(monitor,attributes) self._strip_attribute('MON$ATTACHMENT_NAME') self._strip_attribute('MON$USER') self._strip_attribute('MON$ROLE') self._strip_attribute('MON$REMOTE_PROTOCOL') self._strip_attribute('MON$REMOTE_ADDRESS') self._strip_attribute('MON$REMOTE_PROCESS') #--- Protected def __get_id(self): return self._attributes['MON$ATTACHMENT_ID'] def __get_server_pid(self): return self._attributes['MON$SERVER_PID'] def __get_state(self): return self._attributes['MON$STATE'] def __get_name(self): return self._attributes['MON$ATTACHMENT_NAME'] def __get_user(self): return self._attributes['MON$USER'] def __get_role(self): return self._attributes['MON$ROLE'] def __get_remote_protocol(self): return self._attributes['MON$REMOTE_PROTOCOL'] def __get_remote_address(self): return self._attributes['MON$REMOTE_ADDRESS'] def __get_remote_pid(self): return self._attributes['MON$REMOTE_PID'] def __get_remote_process(self): return self._attributes['MON$REMOTE_PROCESS'] def __get_character_set(self): return self.monitor._con.schema.get_character_set_by_id(self._attributes['MON$CHARACTER_SET_ID']) def __get_timestamp(self): return self._attributes['MON$TIMESTAMP'] def _get_transactions(self): return [t for t in self.monitor.transactions if t._attributes['MON$ATTACHMENT_ID'] == self.id] def _get_statements(self): return [s for s in self.monitor.statements if s._attributes['MON$ATTACHMENT_ID'] == self.id] def _get_variables(self): return [s for s in self.monitor.variables if s._attributes['MON$ATTACHMENT_ID'] == self.id] def __get_iostats(self): for io in self.monitor.iostats: if (io.stat_id == self.stat_id) and (io.group == STAT_ATTACHMENT): return io return None #--- properties id = property(__get_id,None,None, "Attachment ID.") server_pid = property(__get_server_pid,None,None, "Server process ID.") state = property(__get_state,None,None, "Attachment state (idle/active).") name = property(__get_name,None,None, "Database pathname or alias.") user = property(__get_user,None,None, "User name.") role = property(__get_role,None,None, "Role name.") remote_protocol = property(__get_remote_protocol,None,None, "Remote protocol name.") remote_address = property(__get_remote_address,None,None, "Remote address.") remote_pid = property(__get_remote_pid,None,None, "Remote client process ID.") remote_process = property(__get_remote_process,None,None, "Remote client process pathname.") character_set = property(__get_character_set,None,None, ":class:`~fdb.schema.CharacterSet` for this attachment.") timestamp = property(__get_timestamp,None,None, "Attachment date/time.") transactions = LateBindingProperty(_get_transactions,None,None, "List of transactions associated with attachment.\nItems are :class:`TransactionInfo` objects.") statements = LateBindingProperty(_get_statements,None,None, "List of statements associated with attachment.\nItems are :class:`StatementInfo` objects.") variables = LateBindingProperty(_get_variables,None,None, "List of variables associated with attachment.\nItems are :class:`ContextVariableInfo` objects.") iostats = property(__get_iostats,None,None, ":class:`IOStatsInfo` for this object.") #--- Public def isactive(self): "Returns True if attachment is active." return self.state == STATE_ACTIVE def isidle(self): "Returns True if attachment is idle." return self.state == STATE_IDLE def isgcallowed(self): "Returns True if Garbage Collection is enabled for this attachment." return bool(self._attributes['MON$GARBAGE_COLLECTION']) def terminate(self): """Terminates client session associated with this attachment. :raises ProgrammingError: If database has ODS lower than 11.2 or this attachement is current session. """ if self.monitor._con.ods < fdb.ODS_FB_25: raise fdb.ProgrammingError("Attachments could be terminated only " \ "for databases with ODS 11.2 and higher.") elif self is self.monitor.this_attachment: raise fdb.ProgrammingError("Can't terminate current session.") else: self.monitor._ic.execute('delete from mon$attachments where mon$attachment_id = ?', (self.id,)) class TransactionInfo(BaseInfoItem): "Information about transaction." def __init__(self,monitor,attributes): super(TransactionInfo,self).__init__(monitor,attributes) #--- Protected def __get_id(self): return self._attributes['MON$TRANSACTION_ID'] def __get_attachment(self): return self.monitor.get_attachment(self._attributes['MON$ATTACHMENT_ID']) def __get_state(self): return self._attributes['MON$STATE'] def __get_timestamp(self): return self._attributes['MON$TIMESTAMP'] def __get_top(self): return self._attributes['MON$TOP_TRANSACTION'] def __get_oldest(self): return self._attributes['MON$OLDEST_TRANSACTION'] def __get_oldest_active(self): return self._attributes['MON$OLDEST_ACTIVE'] def __get_isolation_mode(self): return self._attributes['MON$ISOLATION_MODE'] def __get_lock_timeout(self): return self._attributes['MON$LOCK_TIMEOUT'] def _get_statements(self): return [s for s in self.monitor.statements if s._attributes['MON$TRANSACTION_ID'] == self.id] def _get_variables(self): return [s for s in self.monitor.variables if s._attributes['MON$TRANSACTION_ID'] == self.id] def __get_iostats(self): for io in self.monitor.iostats: if (io.stat_id == self.stat_id) and (io.group == STAT_TRANSACTION): return io return None #--- properties id = property(__get_id,None,None, "Transaction ID.") attachment = property(__get_attachment,None,None, ":class:`AttachmentInfo` instance to which this transaction belongs.") state = property(__get_state,None,None, "Transaction state (idle/active).") timestamp = property(__get_timestamp,None,None, "Transaction start date/time.") top = property(__get_top,None,None, "Top transaction.") oldest = property(__get_oldest,None,None, "Oldest transaction (local OIT).") oldest_active = property(__get_oldest_active,None,None, "Oldest active transaction (local OAT).") isolation_mode = property(__get_isolation_mode,None,None, "Transaction isolation mode code.") lock_timeout = property(__get_lock_timeout,None,None, "Lock timeout.") statements = LateBindingProperty(_get_statements,None,None, "List of statements associated with transaction.\nItems are :class:`StatementInfo` objects.") variables = LateBindingProperty(_get_variables,None,None, "List of variables associated with transaction.\nItems are :class:`ContextVariableInfo` objects.") iostats = property(__get_iostats,None,None, ":class:`IOStatsInfo` for this object.") #--- Public def isactive(self): "Returns True if transaction is active." return self.state == STATE_ACTIVE def isidle(self): "Returns True if transaction is idle." return self.state == STATE_IDLE def isreadonly(self): "Returns True if transaction is Read Only." return self._attributes['MON$READ_ONLY'] == FLAG_SET #return bool(self._attributes['MON$READ_ONLY']) def isautocommit(self): "Returns True for autocommited transaction." return self._attributes['MON$AUTO_COMMIT'] == FLAG_SET #return bool(self._attributes['MON$AUTO_COMMIT']) def isautoundo(self): "Returns True for transaction with automatic undo." return self._attributes['MON$AUTO_UNDO'] == FLAG_SET #return bool(self._attributes['MON$AUTO_UNDO']) class StatementInfo(BaseInfoItem): "Information about executed SQL statement." def __init__(self,monitor,attributes): super(StatementInfo,self).__init__(monitor,attributes) self._strip_attribute('MON$SQL_TEXT') #--- Protected def __get_id(self): return self._attributes['MON$STATEMENT_ID'] def __get_attachment(self): return self.monitor.get_attachment(self._attributes['MON$ATTACHMENT_ID']) def __get_transaction(self): tr = self._attributes['MON$TRANSACTION_ID'] return None if tr is None else self.monitor.get_transaction(tr) def __get_state(self): return self._attributes['MON$STATE'] def __get_timestamp(self): return self._attributes['MON$TIMESTAMP'] def __get_sql_text(self): return self._attributes['MON$SQL_TEXT'] def __get_callstack(self): callstack = [x for x in self.monitor.callstack if ((x._attributes['MON$STATEMENT_ID'] == self.id) and (x._attributes['MON$CALLER_ID'] is None))] if len(callstack) > 0: item = callstack[0] while item is not None: caller_id = item.id item = None for x in self.monitor.callstack: if x._attributes['MON$CALLER_ID'] == caller_id: callstack.append(x) item = x break return callstack def __get_iostats(self): for io in self.monitor.iostats: if (io.stat_id == self.stat_id) and (io.group == STAT_STATEMENT): return io return None #--- properties id = property(__get_id,None,None, "Statement ID.") attachment = property(__get_attachment,None,None, ":class:`AttachmentInfo` instance to which this statement belongs.") transaction = property(__get_transaction,None,None, ":class:`TransactionInfo` instance to which this statement belongs or None.") state = property(__get_state,None,None, "Statement state (idle/active).") timestamp = property(__get_timestamp,None,None, "Statement start date/time.") sql_text = property(__get_sql_text,None,None, "Statement text, if appropriate.") callstack = property(__get_callstack,None,None, "List with call stack for statement.\nItems are :class:`CallStackInfo` objects.") iostats = property(__get_iostats,None,None, ":class:`IOStatsInfo` for this object.") #--- Public def isactive(self): "Returns True if statement is active." return self.state == STATE_ACTIVE def isidle(self): "Returns True if statement is idle." return self.state == STATE_IDLE def terminate(self): """Terminates execution of statement. :raises ProgrammingError: If this attachement is current session. """ if self.attachment == self.monitor.this_attachment: raise fdb.ProgrammingError("Can't terminate statement from current session.") else: self.monitor._ic.execute('delete from mon$statements where mon$statement_id = ?', (self.id,)) class CallStackInfo(BaseInfoItem): "Information about PSQL call (stack frame)." def __init__(self,monitor,attributes): super(CallStackInfo,self).__init__(monitor,attributes) self._strip_attribute('MON$OBJECT_NAME') #--- Protected def __get_id(self): return self._attributes['MON$CALL_ID'] def __get_statement(self): return self.monitor.get_statement(self._attributes['MON$STATEMENT_ID']) def __get_caller(self): return self.monitor.get_call(self._attributes['MON$CALLER_ID']) def __get_dbobject(self): obj_name = self._attributes['MON$OBJECT_NAME'] obj_type = self._attributes['MON$OBJECT_TYPE'] if obj_type == 5: # procedure return self.monitor._con.schema.get_procedure(obj_name) elif obj_type == 2: # trigger return self.monitor._con.schema.get_trigger(obj_name) else: raise fdb.ProgrammingError("Unrecognized object type '%d'" % obj_type) def __get_timestamp(self): return self._attributes['MON$TIMESTAMP'] def __get_line(self): return self._attributes['MON$SOURCE_LINE'] def __get_column(self): return self._attributes['MON$SOURCE_COLUMN'] def __get_iostats(self): for io in self.monitor.iostats: if (io.stat_id == self.stat_id) and (io.group == STAT_CALL): return io return None #--- properties id = property(__get_id,None,None, "Call ID.") statement = property(__get_statement,None,None, "Top-level :class:`StatementInfo` instance to which this call stack entry belongs.") caller = property(__get_caller,None,None, "Call stack entry (:class:`CallStackInfo`) of the caller.") dbobject = property(__get_dbobject,None,None, "PSQL object. :class:`~fdb.schema.Procedure` or :class:`~fdb.schema.Trigger` instance.") timestamp = property(__get_timestamp,None,None, "Request start date/time.") line = property(__get_line,None,None, "SQL source line number.") column = property(__get_column,None,None, "SQL source column number.") iostats = property(__get_iostats,None,None, ":class:`IOStatsInfo` for this object.") #--- Public class IOStatsInfo(BaseInfoItem): "Information about page and row level I/O operations, and about memory consumption." def __init__(self,monitor,attributes): super(IOStatsInfo,self).__init__(monitor,attributes) #--- Protected def __get_owner(self): def find(seq): for x in seq: if x.stat_id == self.stat_id: return x return None obj_type = self.group if obj_type == STAT_DATABASE: return self.monitor.db elif obj_type == STAT_ATTACHMENT: return find(self.monitor.attachments) elif obj_type == STAT_TRANSACTION: return find(self.monitor.transactions) elif obj_type == STAT_STATEMENT: return find(self.monitor.statements) elif obj_type == STAT_CALL: return find(self.monitor.callstack) else: raise fdb.ProgrammingError("Unrecognized stat group '%d'" % obj_type) def __get_group(self): return self._attributes['MON$STAT_GROUP'] def __get_reads(self): return self._attributes['MON$PAGE_READS'] def __get_writes(self): return self._attributes['MON$PAGE_WRITES'] def __get_fetches(self): return self._attributes['MON$PAGE_FETCHES'] def __get_marks(self): return self._attributes['MON$PAGE_MARKS'] def __get_seq_reads(self): return self._attributes['MON$RECORD_SEQ_READS'] def __get_idx_reads(self): return self._attributes['MON$RECORD_IDX_READS'] def __get_inserts(self): return self._attributes['MON$RECORD_INSERTS'] def __get_updates(self): return self._attributes['MON$RECORD_UPDATES'] def __get_deletes(self): return self._attributes['MON$RECORD_DELETES'] def __get_backouts(self): return self._attributes['MON$RECORD_BACKOUTS'] def __get_purges(self): return self._attributes['MON$RECORD_PURGES'] def __get_expunges(self): return self._attributes['MON$RECORD_EXPUNGES'] def __get_memory_used(self): return self._attributes.get('MON$MEMORY_USED') def __get_memory_allocated(self): return self._attributes.get('MON$MEMORY_ALLOCATED') def __get_max_memory_used(self): return self._attributes.get('MON$MAX_MEMORY_USED') def __get_max_memory_allocated(self): return self._attributes.get('MON$MAX_MEMORY_ALLOCATED') #--- properties owner = property(__get_owner,None,None, """Object that owns this IOStats instance. Could be either :class:`DatabaseInfo`, :class:`AttachmentInfo`, :class:`TransactionInfo`, :class:`StatementInfo` or :class:`CallStackInfo` instance.""") group = property(__get_group,None,None, "Object group code.") reads = property(__get_reads,None,None, "Number of page reads.") writes = property(__get_writes,None,None, "Number of page writes.") fetches = property(__get_fetches,None,None, "Number of page fetches.") marks = property(__get_marks,None,None, "Number of pages with changes pending.") seq_reads = property(__get_seq_reads,None,None, "Number of records read sequentially.") idx_reads = property(__get_idx_reads,None,None, "Number of records read via an index.") inserts = property(__get_inserts,None,None, "Number of inserted records.") updates = property(__get_updates,None,None, "Number of updated records.") deletes = property(__get_deletes,None,None, "Number of deleted records.") backouts = property(__get_backouts,None,None, "Number of records where a new primary record version or a change to " \ "an existing primary record version is backed out due to rollback or " \ "savepoint undo.") purges = property(__get_purges,None,None, "Number of records where record version chain is being purged of " \ "versions no longer needed by OAT or younger transactions.") expunges = property(__get_expunges,None,None, "Number of records where record version chain is being deleted due to " \ "deletions by transactions older than OAT.") memory_used = property(__get_memory_used,None,None, "Number of bytes currently in use.") memory_allocated = property(__get_memory_allocated,None,None, "Number of bytes currently allocated at the OS level.") max_memory_used = property(__get_max_memory_used,None,None, "Maximum number of bytes used by this object.") max_memory_allocated = property(__get_max_memory_allocated,None,None, "Maximum number of bytes allocated from the operating system by this object.") #--- Public class ContextVariableInfo(BaseInfoItem): "Information about context variable." def __init__(self,monitor,attributes): super(ContextVariableInfo,self).__init__(monitor,attributes) self._strip_attribute('MON$VARIABLE_NAME') self._strip_attribute('MON$VARIABLE_VALUE') #--- Protected def __get_attachment(self): return self.monitor.get_attachment(self._attributes['MON$ATTACHMENT_ID']) def __get_transaction(self): tr = self._attributes['MON$TRANSACTION_ID'] return None if tr is None else self.monitor.get_transaction(tr) def __get_name(self): return self._attributes['MON$VARIABLE_NAME'] def __get_value(self): return self._attributes['MON$VARIABLE_VALUE'] #--- properties attachment = property(__get_attachment,None,None, ":class:`AttachmentInfo` instance to which this context variable belongs or None.") transaction = property(__get_transaction,None,None, ":class:`TransactionInfo` instance to which this context variable belongs or None.") name = property(__get_name,None,None,"Context variable name.") value = property(__get_value,None,None,"Value of context variable.") #--- Public def isattachmentvar(self): "Returns True if variable is associated to attachment context." return self._attributes['MON$ATTACHMENT_ID'] is not None def istransactionvar(self): "Returns True if variable is associated to transaction context." return self._attributes['MON$TRANSACTION_ID'] is not None fdb-1.4.9+dfsg1/fdb/services.py0000644000215700017510000023076512542251147015135 0ustar rstuartit#coding:utf-8 # # PROGRAM/MODULE: fdb # FILE: services.py # DESCRIPTION: Python driver for Firebird # CREATED: 19.11.2011 # # 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 Pavel Cisar # # Copyright (c) 2011 Pavel Cisar # and all contributors signed below. # # All Rights Reserved. # Contributor(s): Philippe Makowski # ______________________________________. # # See LICENSE.TXT for details. import fdb import sys import os import fdb.ibase as ibase import ctypes import struct import warnings import datetime api = None # The following SHUT_* constants are to be passed as the `shutdown_mode` # parameter to Connection.shutdown: SHUT_LEGACY = -1 SHUT_NORMAL = ibase.isc_spb_prp_sm_normal SHUT_MULTI = ibase.isc_spb_prp_sm_multi SHUT_SINGLE = ibase.isc_spb_prp_sm_single SHUT_FULL = ibase.isc_spb_prp_sm_full # The following SHUT_* constants are to be passed as the `shutdown_method` # parameter to Connection.shutdown: SHUT_FORCE = ibase.isc_spb_prp_shutdown_db SHUT_DENY_NEW_TRANSACTIONS = ibase.isc_spb_prp_deny_new_transactions SHUT_DENY_NEW_ATTACHMENTS = ibase.isc_spb_prp_deny_new_attachments # The following WRITE_* constants are to be passed as the `mode` parameter # to Connection.set_write_mode: WRITE_FORCED = ibase.isc_spb_prp_wm_sync WRITE_BUFFERED = ibase.isc_spb_prp_wm_async # The following ACCESS_* constants are to be passed as the `mode` parameter # to Connection.set_access_mode: ACCESS_READ_WRITE = ibase.isc_spb_prp_am_readwrite ACCESS_READ_ONLY = ibase.isc_spb_prp_am_readonly # The following CAPABILITY_* constants are return values of `get_server_capabilities` CAPABILITY_MULTI_CLIENT = 0x2 CAPABILITY_REMOTE_HOP = 0x4 CAPABILITY_SERVER_CONFIG = 0x200 CAPABILITY_QUOTED_FILENAME = 0x400 CAPABILITY_NO_SERVER_SHUTDOWN = 0x100 def _checkString(st): if ibase.PYTHON_MAJOR_VER == 3: try: if isinstance(st, str): # In str instances, Python allows any character # Since Firebird's # Services API only works (properly) with ASCII, we need to make # sure there are no non-ASCII characters in s. st.encode('ASCII') else: if not isinstance(st, ibase.mybytes): raise TypeError('String argument to Services API must be' ' of type %s, not %s.' % (type(ibase.mybytes),type(st)) ) except UnicodeEncodeError: raise TypeError("The database engine's Services API only works" " properly with ASCII string parameters, so str instances that" " contain non-ASCII characters are disallowed." ) else: try: if isinstance(st, ibase.UnicodeType): # In str instances, Python allows any character in the "default # encoding", which is typically not ASCII. Since Firebird's # Services API only works (properly) with ASCII, we need to make # sure there are no non-ASCII characters in s, even though we # already know s is a str instance. st.encode('ASCII') else: if not isinstance(st, ibase.mybytes): raise TypeError('String argument to Services API must be' ' of type %s, not %s.' % (type(ibase.mybytes),type(st)) ) except UnicodeError: raise TypeError("The database engine's Services API only works" " properly with ASCII string parameters, so str instances that" " contain non-ASCII characters, and all unicode instances, are" " disallowed." ) def _string2spb(spb, code, st): myslen = len(st) _numeric2spb(spb, code, myslen, numCType='H') myformat = str(myslen) + 's' # The length, then 's'. spb.append(struct.pack(myformat, st)) def _numeric2spb(spb, code, num, numCType='I'): # numCType is one of the pack format characters specified by the Python # standard library module 'struct'. _code2spb(spb, code) (numericFormat, numericBytes) = _renderSizedIntegerForSPB(num, numCType) spb.append(struct.pack(numericFormat, numericBytes)) def _code2spb(spb, code): (myformat, mybytes) = _renderSizedIntegerForSPB(code, 'b') spb.append(struct.pack(myformat, mybytes)) def _vax_inverse(i, myformat): # Apply the inverse of _ksrv.isc_vax_integer to a Python integer; return # the raw bytes of the resulting value. iRaw = struct.pack(myformat, i) iConv = api.isc_vax_integer(iRaw, len(iRaw)) iConvRaw = struct.pack(myformat, iConv) return iConvRaw def _renderSizedIntegerForSPB(i, myformat): # In order to prepare the Python integer i for inclusion in a Services # API action request buffer, the byte sequence of i must be reversed, which # will make i unrepresentible as a normal Python integer. # Therefore, the rendered version of i must be stored in a raw byte # buffer. # This function returns a 2-tuple containing: # 1. the calculated struct.pack-compatible format string for i # 2. the Python string containing the SPB-compatible raw binary rendering # of i # # Example: # To prepare the Python integer 12345 for storage as an unsigned int in a # SPB, use code such as this: # (iPackFormat, iRawBytes) = _renderSizedIntegerForSPB(12345, 'I') # spbBytes = struct.pack(iPackFormat, iRawBytes) # destFormat = '%ds' % struct.calcsize(myformat) destVal = _vax_inverse(i, myformat) return (destFormat, destVal) def connect(host='service_mgr', user=os.environ.get('ISC_USER', 'sysdba'), password=os.environ.get('ISC_PASSWORD', None) ): """Establishes a connection to the Services Manager. :param string host: (optional) Host machine specification. Local by default. :param string user: (optional) Administrative user name. Defaults to content of environment variable `'ISC_USER'` or `'SYSDBA'`. :param string password: Administrative user password. Default is content of environment variable `'ISC_PASSWORD'`. .. note:: By definition, a Services Manager connection is bound to a particular host. Therefore, the database specified as a parameter to methods such as `getStatistics` MUST NOT include the host name of the database server. """ setattr(sys.modules[__name__],'api',fdb.load_api()) if password is None: raise fdb.ProgrammingError('A password is required to use' ' the Services Manager.') _checkString(host) _checkString(user) _checkString(password) # The database engine's Services API requires that connection strings # conform to one of the following formats: # 1. 'service_mgr' - Connects to the Services Manager on localhost. # 2. 'hostname:service_mgr' - Connects to the Services Manager on the # server named hostname. # # This Python function glosses over the database engine's rules as follows: # - If the $host parameter is not supplied, the connection defaults to # the local host. # - If the $host parameter is supplied, the ':service_mgr' suffix is # optional (the suffix will be appended automatically if necessary). # # Of course, this scheme would collapse if someone actually had a host # named 'service_mgr', and supplied the connection string 'service_mgr' # with the intent of connecting to that host. In that case, the connection # would be attempted to the local host, not to the host named # 'service_mgr'. An easy workaround would be to supply the following # connection string: # 'service_mgr:service_mgr'. if not host.endswith('service_mgr'): if host and not host.endswith(':'): host += ':' host += 'service_mgr' return Connection(host, user, password) class Connection(object): """ Represents a sevice connection between the database client (the Python process) and the database server. .. important:: DO NOT create instances of this class directly! Use only :func:`connect` to get Connection instances. .. tip:: Connection supports the iterator protocol, yielding lines of result like :meth:`readline`. """ QUERY_TYPE_PLAIN_INTEGER = 1 QUERY_TYPE_PLAIN_STRING = 2 QUERY_TYPE_RAW = 3 def __init__(self, host, user, password, charset=None): self.__fetching = False self._svc_handle = ibase.isc_svc_handle(0) self._isc_status = ibase.ISC_STATUS_ARRAY() self._result_buffer = ctypes.create_string_buffer(ibase.USHRT_MAX) self._line_buffer = [] self.__eof = False self.charset = charset self.host = ibase.b(host) self.user = ibase.b(user) self.password = ibase.b(password) if len(self.host) + len(self.user) + len(self.password) > 118: raise fdb.ProgrammingError("The combined length of host, user and" " password can't exceed 118 bytes.") # spb_length = 2 + 1 + 1 + len(self.user) + 1 + 1 + len(self.password) spb = fdb.bs([ibase.isc_spb_version, ibase.isc_spb_current_version, ibase.isc_spb_user_name, len(self.user)]) + self.user + \ fdb.bs([ibase.isc_spb_password, len(self.password)]) + self.password api.isc_service_attach(self._isc_status, len(self.host), self.host, self._svc_handle, len(spb), spb) if fdb.db_api_error(self._isc_status): raise fdb.exception_from_status(fdb.DatabaseError, self._isc_status, "Services/isc_service_attach:") # Get Firebird engine version verstr = self.get_server_version() x = verstr.split() if x[0].find('V') > 0: (x,self.__version) = x[0].split('V') elif x[0].find('T') > 0: (x,self.__version) = x[0].split('T') else: # Unknown version self.__version = '0.0.0.0' x = self.__version.split('.') self.__engine_version = float('%s.%s' % (x[0],x[1])) def __del__(self): self.close() def next(self): """Return the next result line from service manager. Part of *iterator protocol*. :raises StopIteration: If there are no further lines. """ line = self.readline() if line is not None: return line else: self.__fetching = False raise StopIteration __next__ = next def __iter__(self): return self def __check_active(self): if not self._svc_handle: raise ProgrammingError("Connection object is detached from service manager") def __get_closed(self): return True if self._svc_handle else False def __get_fetching(self): return self.__fetching def __read_buffer(self, init=''): request = fdb.bs([ibase.isc_info_svc_to_eof]) spb = ibase.b('') api.isc_service_query(self._isc_status, self._svc_handle, None, len(spb), spb, len(request), request, ibase.USHRT_MAX, self._result_buffer) if fdb.db_api_error(self._isc_status): raise fdb.exception_from_status(fdb.DatabaseError, self._isc_status, "Services/isc_service_query:") (result, _) = self._extract_string(self._result_buffer, 1) if ord(self._result_buffer[_]) == ibase.isc_info_end: self.__eof = True if init: result = init + result self._line_buffer = result.split('\n') def __fetchline(self): if self._line_buffer: if len(self._line_buffer) == 1 and not self.__eof: self.__read_buffer(self._line_buffer.pop(0)) return self._line_buffer.pop(0) else: if not self.__eof: self.__read_buffer() if self._line_buffer: return self._line_buffer.pop(0) self.__fetching = False return None def __get_version(self): return self.__version def __get_engine_version(self): return self.__engine_version def _bytes_to_str(self, sb): ### Todo: verify handling of P version differences, refactor if ibase.PYTHON_MAJOR_VER == 3: return sb.decode(ibase.charset_map.get(self.charset, self.charset)) else: return sb.encode(ibase.charset_map.get(self.charset, self.charset)) def _str_to_bytes(self, st): ### Todo: verify handling of P version differences, refactor if ibase.PYTHON_MAJOR_VER == 3: return st.encode(ibase.charset_map.get(self.charset, self.charset)) else: return st def _extract_int(self, raw, index): new_index = index + ctypes.sizeof(ctypes.c_ushort) return (fdb.bytes_to_int(raw[index:new_index]), new_index) def _extract_string(self, raw, index): (size, index) = self._extract_int(raw, index) new_index = index + size ### Todo: verify handling of P version differences, refactor if ibase.PYTHON_MAJOR_VER == 3: return (str(raw[index:new_index], ibase.charset_map.get(self.charset, self.charset)), new_index) else: return (str(raw[index:new_index]), new_index) def _Q(self, code, result_type, timeout=-1): if code < 0 or code > ibase.USHRT_MAX: raise fdb.ProgrammingError("The service query request_buf code" " must fall between 0 and %d," " inclusive." % ibase.USHRT_MAX) result = None result_size = 1024 request = fdb.bs([code]) if timeout == -1: spb = ibase.b('') else: spb = fdb.bs(ibase.isc_info_svc_timeout, timeout) while True: result_buffer = ctypes.create_string_buffer(result_size) api.isc_service_query(self._isc_status, self._svc_handle, None, len(spb), spb, len(request), request, result_size, result_buffer) if fdb.db_api_error(self._isc_status): raise fdb.exception_from_status(fdb.DatabaseError, self._isc_status, "Services/isc_service_query:") if ord(result_buffer[0]) == ibase.isc_info_truncated: if result_size == ibase.USHRT_MAX: raise fdb.InternalError("Database C API constraints maximum" "result buffer size to %d" % ibase.USHRT_MAX) else: result_size = result_size * 4 if result_size > ibase.USHRT_MAX: result_size = ibase.USHRT_MAX continue break if result_type == self.QUERY_TYPE_PLAIN_INTEGER: (result, _) = self._extract_int(result_buffer, 1) elif result_type == self.QUERY_TYPE_PLAIN_STRING: (result, _) = self._extract_string(result_buffer, 1) elif result_type == self.QUERY_TYPE_RAW: size = result_size - 1 while result_buffer[size] == '\0': size -= 1 result = ibase.s(result_buffer[:size]) return result def _get_isc_info_svc_svr_db_info(self): num_attachments = -1 databases = [] raw = self._QR(ibase.isc_info_svc_svr_db_info) # assert raw[-1] == api.int2byte(ibase.isc_info_flag_end) pos = 1 # Ignore raw[0]. upper_limit = len(raw) - 1 while pos < upper_limit: cluster = ibase.ord2(raw[pos]) pos += 1 if cluster == ibase.isc_spb_num_att: # Number of attachments. (num_attachments, pos) = self._extract_int(raw, pos) elif cluster == ibase.isc_spb_num_db: # Number of databases # attached to. # Do nothing except to advance pos; the number of databases # can be had from len(databases). (_, pos) = self._extract_int(raw, pos) elif cluster == ibase.isc_spb_dbname: (db_name, pos) = self._extract_string(raw, pos) databases.append(db_name) return (num_attachments, databases) def _QI(self, code): return self._Q(code, self.QUERY_TYPE_PLAIN_INTEGER) def _QS(self, code): return self._Q(code, self.QUERY_TYPE_PLAIN_STRING) def _QR(self, code): return self._Q(code, self.QUERY_TYPE_RAW) def _action_thin(self, request_buffer): if len(request_buffer) > ibase.USHRT_MAX: raise fdb.ProgrammingError("The size of the request buffer" " must not exceed %d." % ibase.USHRT_MAX) api.isc_service_start(self._isc_status, self._svc_handle, None, len(request_buffer), request_buffer) if fdb.db_api_error(self._isc_status): raise fdb.exception_from_status(fdb.OperationalError, self._isc_status, "Unable to perform the requested Service API action:") return None def _act(self, request_buffer): return self._action_thin(request_buffer.render()) def _act_and_return_textual_results(self, request_buffer): self._act(request_buffer) return self._collect_unformatted_results() def _collect_unformatted_results(self, line_separator='\n'): # YYY: It might be desirable to replace this function with a more # performant version based on ibase.isc_info_svc_to_eof rather than # ibase.isc_info_svc_line; the function's interface is transparent # either way. # This enhancement should be a very low priority; the Service Manager # API is not typically used for performance-intensive operations. resultLines = [] while 1: try: line = self._QS(ibase.isc_info_svc_line) except fdb.OperationalError: # YYY: It is routine for actions such as RESTORE to raise an # exception at the end of their output. We ignore any such # exception and assume that it was expected, which is somewhat # risky. For example, suppose the network connection is broken # while the client is receiving the action's output... break if not line: break resultLines.append(line) return line_separator.join(resultLines) def _repair_action(self, database, partial_req_buf, line_separator='\n'): # Begin constructing the request buffer (incorporate the one passed as # param $partial_req_buf). full_req_buf = _ServiceActionRequestBuilder(ibase.isc_action_svc_repair) # The filename of the database must be specified regardless of the # action sub-action being perfomed. full_req_buf.add_database_name(database) # Incorporate the caller's partial request buffer. full_req_buf.extend(partial_req_buf) self._action_thin(full_req_buf.render()) # Return the results to the caller synchronously (in this case, there # won't be any textual results, but issuing this call will helpfully # cause the program to block until the Services Manager is finished # with the action). return self._collect_unformatted_results(line_separator=line_separator) def _validate_companion_string_numeric_sequences(self,strings, numbers, string_caption, number_caption): # The core constraint here is that len(numbers) must equal len(strings) - 1 stringsCount = len(strings) numbersCount = len(numbers) requiredNumbersCount = stringsCount - 1 if numbersCount != requiredNumbersCount: raise ValueError( 'Since you passed %d %s, you must %s corresponding %s.' % (stringsCount, string_caption, ('pass %d' % requiredNumbersCount if requiredNumbersCount > 0 else 'not pass any'), number_caption) ) def _exclude_elements_of_types(self, seq, types_to_exclude): if not isinstance(types_to_exclude, tuple): types_to_exclude = tuple(types_to_exclude) return [element for element in seq if not isinstance(element, types_to_exclude)] def _require_str_or_tuple_of_str(self, x): if isinstance(x, str): x = (x,) elif isinstance(x, ibase.myunicode): # We know the following call to _checkString will raise an exception, # but calling it anyway allows us to centralize the error message # generation: _checkString(x) ### Todo: verify handling of P version differences, refactor? for el in x: _checkString(el) return x def _property_action(self, database, partial_req_buf): # Begin constructing the request buffer (incorporate the one passed as # param $partialReqBuf). full_req_buf = _ServiceActionRequestBuilder( ibase.isc_action_svc_properties) # The filename of the database must be specified regardless of the # action sub-action being perfomed. full_req_buf.add_database_name(database) # Incorporate the caller's partial request buffer. full_req_buf.extend(partial_req_buf) self._action_thin(full_req_buf.render()) # Return the results to the caller synchronously # because it blocks until there's been some resolution of the action. return self._collect_unformatted_results() def _property_action_with_one_num_code(self, database, code, num, num_ctype = 'I'): reqBuf = _ServiceActionRequestBuilder() reqBuf.add_numeric(code, num, numCType=num_ctype) return self._property_action(database, reqBuf) def close(self): """Close the connection now (rather than whenever `__del__` is called). The connection will be unusable from this point forward; an :exc:`Error` (or subclass) exception will be raised if any operation is attempted with the connection. """ if self._svc_handle: api.isc_service_detach(self._isc_status, self._svc_handle) if fdb.db_api_error(self._isc_status): raise fdb.exception_from_status(fdb.DatabaseError, self._isc_status, "Services/isc_service_detach:") self._svc_handle = None self.__fetching = False def readline(self): """Get next line of textual output from last service query. :returns string: Output line. """ if self.__fetching: return self.__fetchline() else: return None def readlines(self): """Get list of remaining output lines from last service query. :returns list: Service output. :raises ProgrammingError: When service is not in :attr:`fetching` mode. """ return [line for line in self] def isrunning(self): """Returns True if service is running. .. note:: Some services like :meth:`backup` or :meth:`sweep` may take time to comlete, so they're called asynchronously. Until they're finished, no other async service could be started. """ return self._QI(ibase.isc_info_svc_running) > 0 def wait(self): """Wait until running service completes. """ if self.isrunning: x = 1 while x: x = self.__fetchline() self.__fetching = False def get_service_manager_version(self): """Get Firebird Service Manager version number. :returns integer: Version number. """ self.__check_active() return self._QI(ibase.isc_info_svc_version) def get_server_version(self): """Get Firebird version. :returns string: Firebird version (example: 'LI-V2.5.2.26536 Firebird 2.5'). """ self.__check_active() return self._QS(ibase.isc_info_svc_server_version) def get_architecture(self): """Get Firebird Server architecture. :returns string: Architecture (example: 'Firebird/linux AMD64'). """ self.__check_active() return self._QS(ibase.isc_info_svc_implementation) def get_home_directory(self): """Get Firebird Home (installation) Directory. :returns string: Directory path. """ self.__check_active() return self._QS(ibase.isc_info_svc_get_env) def get_security_database_path(self): """Get full path to Firebird security database. :returns string: Path (path+filename) to security database. """ self.__check_active() return self._QS(ibase.isc_info_svc_user_dbpath) def get_lock_file_directory(self): """Get directory location for Firebird lock files. :returns string: Directory path. """ self.__check_active() return self._QS(ibase.isc_info_svc_get_env_lock) def get_server_capabilities(self): """Get list of Firebird capabilities. :returns tuple: Capability info codes for each capability reported by server. Next fdb.services constants define possible info codes returned:: CAPABILITY_MULTI_CLIENT CAPABILITY_REMOTE_HOP CAPABILITY_SERVER_CONFIG CAPABILITY_QUOTED_FILENAME CAPABILITY_NO_SERVER_SHUTDOWN Example:: >>>fdb.services.CAPABILITY_REMOTE_HOP in svc.get_server_capabilities() True """ self.__check_active() capabilities = self._QI(ibase.isc_info_svc_capabilities) return tuple([x for x in (CAPABILITY_MULTI_CLIENT, CAPABILITY_REMOTE_HOP, CAPABILITY_SERVER_CONFIG, CAPABILITY_QUOTED_FILENAME, CAPABILITY_NO_SERVER_SHUTDOWN) if capabilities & x]) def get_message_file_directory(self): """Get directory with Firebird message file. :returns string: Directory path. """ self.__check_active() return self._QS(ibase.isc_info_svc_get_env_msg) def get_connection_count(self): """Get number of attachments to server. :returns integer: Directory path. """ self.__check_active() return self._get_isc_info_svc_svr_db_info()[0] def get_attached_database_names(self): """Get list of attached databases. :returns list: Filenames of attached databases. """ self.__check_active() return self._get_isc_info_svc_svr_db_info()[1] def get_log(self, callback=None): """Request content of Firebird Server log. **(ASYNC service)** :param function callback: Function to call back with each output line. Function must accept only one parameter: line of output. If `callback` is not specified, log content could be retrieved through :meth:`readline`, :meth:`readlines`, iteration over `Connection` or ignored via call to :meth:`wait`. .. note:: Until log content is not fully fetched from service (or ignored via :meth:`wait`), any attempt to start another asynchronous service will fail with exception. """ self.__check_active() self._act(_ServiceActionRequestBuilder(ibase.isc_action_svc_get_ib_log)) self.__fetching = True self.__eof = False if callback: for line in self: callback(line) def get_limbo_transaction_ids(self, database): """Get list of transactions in limbo. :param string database: Database filename or alias. :returns list: Transaction IDs. :raises InternalError: When can't process the result buffer. """ self.__check_active() _checkString(database) reqBuf = _ServiceActionRequestBuilder() reqBuf.add_option_mask(ibase.isc_spb_rpr_list_limbo_trans) raw = self._repair_action(database, reqBuf, line_separator='') raw = ibase.b(raw) nBytes = len(raw) transIDs = [] i = 0 while i < nBytes: byte = ibase.ord2(raw[i]) if byte in (ibase.isc_spb_single_tra_id, ibase.isc_spb_multi_tra_id): # The transaction ID is a 32-bit integer that begins # immediately after position i. transID = struct.unpack('i', raw[i + 1:i + 5])[0] i += 5 # Advance past the marker byte and the 32-bit integer. transIDs.append(transID) else: raise fdb.InternalError('Unable to process buffer contents' ' beginning at position %d.' % i) return transIDs def _resolve_limbo_transaction(self, resolution, database, transaction_id): _checkString(database) reqBuf = _ServiceActionRequestBuilder() reqBuf.add_numeric(resolution, transaction_id) self._repair_action(database, reqBuf) def commit_limbo_transaction(self, database, transaction_id): """Resolve limbo transaction with commit. :param string database: Database filename or alias. :param integer transaction_id: ID of Transaction to resolve. """ self.__check_active() self._resolve_limbo_transaction(ibase.isc_spb_rpr_commit_trans, database, transaction_id) def rollback_limbo_transaction(self, database, transaction_id): """Resolve limbo transaction with rollback. :param string database: Database filename or alias. :param integer transaction_id: ID of Transaction to resolve. """ self.__check_active() self._resolve_limbo_transaction(ibase.isc_spb_rpr_rollback_trans, database, transaction_id) def get_statistics(self, database, show_only_db_log_pages=0, show_only_db_header_pages=0, show_user_data_pages=1, show_user_index_pages=1, # 2004.06.06: False by default b/c gstat behaves that way: show_system_tables_and_indexes=0, show_record_versions=0, callback=None ): """Request database statisctics. **(ASYNC service)** :param string database: Database specification. :param integer show_only_db_log_pages: `1` to analyze only log pages. :param integer show_only_db_header_pages: `1` to analyze only database header. When set, all other parameters are ignored. :param integer show_user_data_pages: `0` to skip user data analysis. :param integer show_user_index_pages: `0` to skip user index analysis. :param integer show_system_tables_and_indexes: `1` to analyze system tables and indices. :param integer show_record_versions: `1` to analyze record versions. :param function callback: Function to call back with each output line. Function must accept only one parameter: line of output. If `callback` is not specified, statistical report could be retrieved through :meth:`readline`, :meth:`readlines`, iteration over `Connection` or ignored via call to :meth:`wait`. .. note:: Until report is not fully fetched from service (or ignored via :meth:`wait`), any attempt to start another asynchronous service will fail with exception. """ self.__check_active() _checkString(database) reqBuf = _ServiceActionRequestBuilder(ibase.isc_action_svc_db_stats) # Request for header negates all other options if show_only_db_header_pages: show_only_db_log_pages = show_user_data_pages = 0 show_user_index_pages = show_system_tables_and_indexes =0 show_record_versions = 0 optionMask = 0 if show_user_data_pages: optionMask |= ibase.isc_spb_sts_data_pages if show_only_db_log_pages: optionMask |= ibase.isc_spb_sts_db_log if show_only_db_header_pages: optionMask |= ibase.isc_spb_sts_hdr_pages if show_user_index_pages: optionMask |= ibase.isc_spb_sts_idx_pages if show_system_tables_and_indexes: optionMask |= ibase.isc_spb_sts_sys_relations if show_record_versions: optionMask |= ibase.isc_spb_sts_record_versions reqBuf.add_database_name(database) reqBuf.add_option_mask(optionMask) self._act(reqBuf) self.__fetching = True self.__eof = False if callback: for line in self: callback(line) # Backup and Restore methods: def backup(self, source_database, dest_filenames, dest_file_sizes=(), #factor=None, # YYY:What is this? # Backup operation optionMask: ignore_checksums=0, ignore_limbo_transactions=0, metadata_only=0, collect_garbage=1, transportable=1, convert_external_tables_to_internal=0, compressed=1, no_db_triggers=0, callback=None ): """Request logical (GBAK) database backup. **(ASYNC service)** :param string source_database: Source database specification. :param dest_filenames: Backup file(s) specification. :type dest_filenames: string or tuple of strings :param dest_file_sizes: (optional) specification of backup file max. sizes. :type dest_file_sizes: tuple of integers :param integer ignore_checksums: `1` to ignore checksums. :param integer ignore_limbo_transactions: `1` to ignore limbo transactions. :param integer metadata_only: `1` to create only metadata backup. :param integer collect_garbage: `0` to skip garbage collection. :param integer transportable: `0` to do not create transportable backup. :param integer convert_external_tables_to_internal: `1` to convert external table to internal ones. :param integer compressed: `0` to create uncompressed backup. :param integer no_db_triggers: `1` to disable database triggers temporarily. :param function callback: Function to call back with each output line. Function must accept only one parameter: line of output. If `callback` is not specified, backup log could be retrieved through :meth:`readline`, :meth:`readlines`, iteration over `Connection` or ignored via call to :meth:`wait`. .. note:: Until backup report is not fully fetched from service (or ignored via :meth:`wait`), any attempt to start another asynchronous service will fail with exception. """ self.__check_active() # Begin parameter validation section. _checkString(source_database) dest_filenames = self._require_str_or_tuple_of_str(dest_filenames) destFilenamesCount = len(dest_filenames) # 2004.07.17: YYY: Temporary warning: # Current (1.5.1) versions of the database engine appear to hang the # Services API request when it contains more than 11 destFilenames if destFilenamesCount > 11: warnings.warn( 'Current versions of the database engine appear to hang when' ' passed a request to generate a backup with more than 11' ' constituents.', RuntimeWarning ) if destFilenamesCount > 9999: raise fdb.ProgrammingError("The database engine cannot output a" " single source database to more than 9999 backup files." ) self._validate_companion_string_numeric_sequences( dest_filenames, dest_file_sizes, 'destination filenames', 'destination file sizes' ) if len(self._exclude_elements_of_types(dest_file_sizes, (int, ibase.mylong))) > 0: raise TypeError("Every element of destFileSizes must be an int" " or long." ) destFileSizesCount = len(dest_file_sizes) # The following should have already been checked by # _validateCompanionStringNumericSequences. assert destFileSizesCount == destFilenamesCount - 1 # End parameter validation section. # Begin option bitmask setup section. optionMask = 0 if ignore_checksums: optionMask |= ibase.isc_spb_bkp_ignore_checksums if ignore_limbo_transactions: optionMask |= ibase.isc_spb_bkp_ignore_limbo if metadata_only: optionMask |= ibase.isc_spb_bkp_metadata_only if not collect_garbage: optionMask |= ibase.isc_spb_bkp_no_garbage_collect if not transportable: optionMask |= ibase.isc_spb_bkp_non_transportable if convert_external_tables_to_internal: optionMask |= ibase.isc_spb_bkp_convert if not compressed: optionMask |= ibase.isc_spb_bkp_expand if no_db_triggers: optionMask |= ibase.isc_spb_bkp_no_triggers # End option bitmask setup section. # Construct the request buffer. request = _ServiceActionRequestBuilder(ibase.isc_action_svc_backup) # Source database filename: request.add_database_name(source_database) # Backup filenames and sizes: request.add_string_numeric_pairs_sequence( ibase.isc_spb_bkp_file, dest_filenames, ibase.isc_spb_bkp_length, dest_file_sizes ) # Options bitmask: request.add_numeric(ibase.isc_spb_options, optionMask) # Tell the service to make its output available to us. request.add_code(ibase.isc_spb_verbose) # Done constructing the request buffer. self._act(request) self.__fetching = True self.__eof = False if callback: for line in self: callback(line) def restore(self, source_filenames, dest_filenames, dest_file_pages=(), page_size=None, cache_buffers=None, access_mode_read_only=0, replace=0, deactivate_indexes=0, do_not_restore_shadows=0, do_not_enforce_constraints=0, commit_after_each_table=0, use_all_page_space=0, no_db_triggers=0, metadata_only=0, callback=None): """Request database restore from logical (GBAK) backup. **(ASYNC service)** :param source_filenames: Backup file(s) specification. :type source_filenames: string or tuple of strings :param dest_filenames: Database file(s) specification. :type dest_filenames: string or tuple of strings :param dest_file_pages: (optional) specification of database file max. # of pages. :type dest_file_pages: tuple of integers :param integer page_size: (optional) Page size. :param integer cache_buffers: (optional) Size of page-cache for this database. :param integer access_mode_read_only: `1` to create R/O database. :param integer replace: `1` to replace existing database. :param integer deactivate_indexes: `1` to do not activate indices. :param integer do_not_restore_shadows: `1` to do not restore shadows. :param integer do_not_enforce_constraints: `1` to do not enforce constraints during restore. :param integer commit_after_each_table: `1` to commit after each table is restored. :param integer use_all_page_space: `1` to use all space on data pages. :param integer no_db_triggers: `1` to disable database triggers temporarily. :param integer metadata_only: `1` to restore only database metadata. :param function callback: Function to call back with each output line. Function must accept only one parameter: line of output. If `callback` is not specified, restore log could be retrieved through :meth:`readline`, :meth:`readlines`, iteration over `Connection` or ignored via call to :meth:`wait`. .. note:: Until restore report is not fully fetched from service (or ignored via :meth:`wait`), any attempt to start another asynchronous service will fail with exception. """ self.__check_active() # Begin parameter validation section. source_filenames = self._require_str_or_tuple_of_str(source_filenames) dest_filenames = self._require_str_or_tuple_of_str(dest_filenames) self._validate_companion_string_numeric_sequences( dest_filenames, dest_file_pages, 'destination filenames', 'destination file page counts' ) # End parameter validation section. # Begin option bitmask setup section. optionMask = 0 if replace: optionMask |= ibase.isc_spb_res_replace else: optionMask |= ibase.isc_spb_res_create if deactivate_indexes: optionMask |= ibase.isc_spb_res_deactivate_idx if do_not_restore_shadows: optionMask |= ibase.isc_spb_res_no_shadow if do_not_enforce_constraints: optionMask |= ibase.isc_spb_res_no_validity if commit_after_each_table: optionMask |= ibase.isc_spb_res_one_at_a_time if use_all_page_space: optionMask |= ibase.isc_spb_res_use_all_space if no_db_triggers: optionMask |= ibase.isc_spb_bkp_no_triggers if metadata_only: optionMask |= ibase.isc_spb_bkp_metadata_only # End option bitmask setup section. # Construct the request buffer. request = _ServiceActionRequestBuilder(ibase.isc_action_svc_restore) # Backup filenames: request.add_string_sequence(ibase.isc_spb_bkp_file, source_filenames) # Database filenames: request.add_string_numeric_pairs_sequence( ibase.isc_spb_dbname, dest_filenames, ibase.isc_spb_res_length, dest_file_pages ) # Page size of the restored database: if page_size: request.add_numeric(ibase.isc_spb_res_page_size, page_size) # cacheBuffers is the number of default cache buffers to configure for # attachments to the restored database: if cache_buffers: request.add_numeric(ibase.isc_spb_res_buffers, cache_buffers) # accessModeReadOnly controls whether the restored database is # "mounted" in read only or read-write mode: if access_mode_read_only: accessMode = ibase.isc_spb_prp_am_readonly else: accessMode = ibase.isc_spb_prp_am_readwrite request.add_numeric(ibase.isc_spb_res_access_mode, accessMode, numCType='B' ) # Options bitmask: request.add_numeric(ibase.isc_spb_options, optionMask) # Tell the service to make its output available to us. request.add_code(ibase.isc_spb_verbose) # Done constructing the request buffer. self._act(request) self.__fetching = True self.__eof = False if callback: for line in self: callback(line) # nbackup methods: def nbackup(self, source_database, dest_filename, nbackup_level=0, no_db_triggers=0): """Perform physical (NBACKUP) database backup. :param string source_database: Source database specification. :param dest_filename: Backup file specification. :param integer nbackup_level: Incremental backup level. :param integer no_db_triggers: `1` to disable database triggers temporarily. .. note:: Method call will not return until action is finished. """ self.__check_active() # Begin parameter validation section. _checkString(source_database) _checkString(dest_filename) dest_filename = ibase.b(dest_filename) # Begin option bitmask setup section. optionMask = 0 if no_db_triggers: optionMask |= ibase.isc_spb_bkp_no_triggers # End option bitmask setup section. # Construct the request buffer. request = _ServiceActionRequestBuilder(ibase.isc_action_svc_nbak) # Source database filename: request.add_database_name(source_database) # Backup filename: request.add_string(ibase.isc_spb_nbk_file, dest_filename) # backup level request.add_numeric(ibase.isc_spb_nbk_level, nbackup_level) # Options bitmask: request.add_numeric(ibase.isc_spb_options, optionMask) # Done constructing the request buffer. self._act(request) self.wait() def nrestore(self, source_filenames, dest_filename, no_db_triggers=0): """Perform restore from physical (NBACKUP) database backup. :param source_filenames: Backup file(s) specification. :type source_filenames: string or tuple of strings :param dest_filename: Database file specification. :param integer no_db_triggers: `1` to disable database triggers temporarily. .. note:: Method call will not return until action is finished. """ self.__check_active() # Begin parameter validation section. source_filenames = self._require_str_or_tuple_of_str(source_filenames) _checkString(dest_filename) dest_filename = ibase.b(dest_filename) # Begin option bitmask setup section. optionMask = 0 if no_db_triggers: optionMask |= ibase.isc_spb_bkp_no_triggers # End option bitmask setup section. # Construct the request buffer. request = _ServiceActionRequestBuilder(ibase.isc_action_svc_nrest) # Source database filename: request.add_string(ibase.isc_spb_dbname, dest_filename) # Backup filenames: request.add_string_sequence(ibase.isc_spb_nbk_file, source_filenames) # Options bitmask: request.add_numeric(ibase.isc_spb_options, optionMask) # Done constructing the request buffer. self._act(request) self.wait() # Trace def trace_start(self, config, name=None): """Start new trace session. **(ASYNC service)** :param string config: Trace session configuration. :param string name: (optional) Trace session name. :returns integer: Trace session ID. :raises DatabaseError: When session ID is not returned on start. Trace session output could be retrieved through :meth:`readline`, :meth:`readlines`, iteration over `Connection` or ignored via call to :meth:`wait`. .. note:: Until session output is not fully fetched from service (or ignored via :meth:`wait`), any attempt to start another asynchronous service including call to any `trace_` method will fail with exception. """ self.__check_active() if not name == None: _checkString(name) _checkString(config) # Construct the request buffer. reqBuf = _ServiceActionRequestBuilder(ibase.isc_action_svc_trace_start) # trace name: if not name == None: reqBuf.add_string(ibase.isc_spb_trc_name, name) # trace configuration: reqBuf.add_string(ibase.isc_spb_trc_cfg, config) self._act(reqBuf) self.__fetching = True self.__eof = False response = self._Q(ibase.isc_info_svc_line, self.QUERY_TYPE_PLAIN_STRING) if response.startswith('Trace session ID'): return int(response.split()[3]) else: # response should contain the error message raise fdb.DatabaseError(response) def trace_stop(self, trace_id): """Stop trace session. :param integer trace_id: Trace session ID. :returns string: Text with confirmation that session was stopped. :raises DatabaseError: When trace session is not stopped. :raises OperationalError: When server can't perform requested operation. """ self.__check_active() # Construct the request buffer. reqBuf = _ServiceActionRequestBuilder(ibase.isc_action_svc_trace_stop) reqBuf.add_numeric(ibase.isc_spb_trc_id, trace_id) response = self._act_and_return_textual_results(reqBuf) if not response.startswith("Trace session ID %i stopped" % trace_id): # response should contain the error message raise fdb.DatabaseError(response) return response def trace_suspend(self, trace_id): """Suspend trace session. :param integer trace_id: Trace session ID. :returns string: Text with confirmation that session was paused. :raises DatabaseError: When trace session is not paused. :raises OperationalError: When server can't perform requested operation. """ self.__check_active() # Construct the request buffer. reqBuf = _ServiceActionRequestBuilder( ibase.isc_action_svc_trace_suspend) reqBuf.add_numeric(ibase.isc_spb_trc_id, trace_id) response = self._act_and_return_textual_results(reqBuf) if not response.startswith("Trace session ID %i paused" % trace_id): # response should contain the error message raise fdb.DatabaseError(response) return response def trace_resume(self, trace_id): """Resume trace session. :param integer trace_id: Trace session ID. :returns string: Text with confirmation that session was resumed. :raises DatabaseError: When trace session is not resumed. :raises OperationalError: When server can't perform requested operation. """ self.__check_active() # Construct the request buffer. reqBuf = _ServiceActionRequestBuilder( ibase.isc_action_svc_trace_resume) reqBuf.add_numeric(ibase.isc_spb_trc_id, trace_id) response = self._act_and_return_textual_results(reqBuf) if not response.startswith("Trace session ID %i resumed" % trace_id): # response should contain the error message raise fdb.DatabaseError(response) return response def trace_list(self): """Get information about existing trace sessions. :returns dictionary: Mapping `SESSION_ID -> SESSION_PARAMS` Session parameters is another dictionary with next keys: :name: (string) (optional) Session name if specified. :date: (datetime.datetime) Session start date and time. :user: (string) Trace user name. :flags: (list of strings) Session flags. :raises OperationalError: When server can't perform requested operation. """ self.__check_active() # Construct the request buffer. reqBuf = _ServiceActionRequestBuilder(ibase.isc_action_svc_trace_list) # Get and parse the returned list. session_list = self._act_and_return_textual_results(reqBuf) result = {} session_id = None for line in session_list.split('\n'): if not line.strip(): session_id = None elif line.startswith("Session ID:"): session_id = int(line.split(':')[1].strip()) result[session_id] = dict() elif line.lstrip().startswith("name:"): result[session_id]["name"] = line.split(':')[1].strip() elif line.lstrip().startswith("user:"): result[session_id]["user"] = line.split(':')[1].strip() elif line.lstrip().startswith("date:"): result[session_id]["date"] = datetime.datetime.strptime( line.split(':',1)[1].strip(), '%Y-%m-%d %H:%M:%S') elif line.lstrip().startswith("flags:"): result[session_id]["flags"] = line.split(':')[1].strip().split(',') else: raise fdb.OperationalError("Unexpected line in trace session list:`%s`" % line) return result # Database property alteration methods: def set_default_page_buffers(self, database, n): """Set individual page cache size for Database. :param string database: Database filename or alias. :param integer n: Number of pages. """ self.__check_active() _checkString(database) self._property_action_with_one_num_code(database, ibase.isc_spb_prp_page_buffers, n) def set_sweep_interval(self, database, n): """Set treshold for automatic sweep. :param string database: Database filename or alias. :param integer n: Sweep treshold, or `0` to disable automatic sweep. """ self.__check_active() _checkString(database) self._property_action_with_one_num_code(database, ibase.isc_spb_prp_sweep_interval, n) def set_reserve_page_space(self, database, reserve_space): """Set data page space reservation policy. :param string database: Database filename or alias. :param boolean reserve_space: `True` to reserve space, `False` to do not. """ self.__check_active() _checkString(database) if reserve_space: reserveCode = ibase.isc_spb_prp_res else: reserveCode = ibase.isc_spb_prp_res_use_full self._property_action_with_one_num_code(database, ibase.isc_spb_prp_reserve_space, reserveCode, num_ctype='b') def set_write_mode(self, database, mode): """Set Disk Write Mode: Sync (forced writes) or Async (buffered). :param string database: Database filename or alias. :param integer mode: One from following constants: :data:`~fdb.services.WRITE_FORCED` or :data:`~fdb.services.WRITE_BUFFERED` """ self.__check_active() _checkString(database) if mode not in (WRITE_FORCED, WRITE_BUFFERED): raise ValueError('mode must be one of the following constants:' ' fdb.services.WRITE_FORCED, fdb.services.WRITE_BUFFERED.') self._property_action_with_one_num_code(database, ibase.isc_spb_prp_write_mode, mode, num_ctype='b') def set_access_mode(self, database, mode): """Set Database Access mode: Read Only or Read/Write :param string database: Database filename or alias. :param integer mode: One from following constants: :data:`~fdb.services.ACCESS_READ_WRITE` or :data:`~fdb.services.ACCESS_READ_ONLY` """ self.__check_active() _checkString(database) if mode not in (ACCESS_READ_WRITE, ACCESS_READ_ONLY): raise ValueError('mode must be one of the following constants:' ' fdb.services.ACCESS_READ_WRITE, fdb.services.ACCESS_READ_ONLY.') self._property_action_with_one_num_code(database, ibase.isc_spb_prp_access_mode, mode, num_ctype='b') def set_sql_dialect(self, database, dialect): """Set SQL Dialect for Database. :param string database: Database filename or alias. :param integer dialect: `1` or `3`. """ self.__check_active() _checkString(database) # The IB 6 API Guide says that dialect "must be 1 or 3", but other # dialects may become valid in future versions, so don't require # dialect in (1, 3) self._property_action_with_one_num_code(database, ibase.isc_spb_prp_set_sql_dialect, dialect) def activate_shadow(self, database): """Activate Database Shadow(s). :param string database: Database filename or alias. """ self.__check_active() _checkString(database) reqBuf = _ServiceActionRequestBuilder() reqBuf.add_option_mask(ibase.isc_spb_prp_activate) self._property_action(database, reqBuf) # Database repair/maintenance methods: def shutdown(self, database, shutdown_mode, shutdown_method, timeout): """Database shutdown. :param string database: Database filename or alias. :param integer shutdown_mode: One from following constants: :data:`~fdb.services.SHUT_LEGACY`, :data:`~fdb.services.SHUT_SINGLE`, :data:`~fdb.services.SHUT_MULTI` or :data:`~fdb.services.SHUT_FULL`. :param integer shutdown_method: One from following constants: :data:`~fdb.services.SHUT_FORCE`, :data:`~fdb.services.SHUT_DENY_NEW_TRANSACTIONS` or :data:`~fdb.services.SHUT_DENY_NEW_ATTACHMENTS`. :param integer timeout: Time in seconds, that the shutdown must complete in. .. seealso:: See also :meth:`~Connection.bring_online` method. """ self.__check_active() _checkString(database) if shutdown_mode not in (SHUT_LEGACY, SHUT_SINGLE, SHUT_MULTI, SHUT_FULL): raise ValueError('shutdown_mode must be one of the following' ' constants: fdb.services.SHUT_LEGACY, fdb.services.SHUT_SINGLE,' ' fdbfdb.services.SHUT_MULTI,' ' fdb.services.SHUT_FULL.') if shutdown_method not in (SHUT_FORCE, SHUT_DENY_NEW_TRANSACTIONS, SHUT_DENY_NEW_ATTACHMENTS): raise ValueError('shutdown_method must be one of the following' ' constants: fdb.services.SHUT_FORCE,' ' fdb.services.SHUT_DENY_NEW_TRANSACTIONS,' ' fdb.services.SHUT_DENY_NEW_ATTACHMENTS.') reqBuf = _ServiceActionRequestBuilder() if shutdown_mode != SHUT_LEGACY: reqBuf.add_numeric(ibase.isc_spb_prp_shutdown_mode, shutdown_mode, numCType='B') reqBuf.add_numeric(shutdown_method, timeout, numCType='I') self._property_action(database, reqBuf) def bring_online(self, database, online_mode=SHUT_NORMAL): """Bring previously shut down database back online. :param string database: Database filename or alias. :param integer online_mode: (Optional) One from following constants: :data:`~fdb.services.SHUT_LEGACY`, :data:`~fdb.services.SHUT_SINGLE`, :data:`~fdb.services.SHUT_MULTI` or :data:`~fdb.services.SHUT_NORMAL` (**Default**). .. seealso:: See also :meth:`~Connection.shutdown` method. """ self.__check_active() _checkString(database) if online_mode not in (SHUT_LEGACY, SHUT_NORMAL,SHUT_SINGLE, SHUT_MULTI): raise ValueError('online_mode must be one of the following' ' constants: fdb.services.SHUT_LEGACY, fdb.services.SHUT_NORMAL,' ' fdbfdb.services.SHUT_SINGLE,' ' fdb.services.SHUT_MULTI.') reqBuf = _ServiceActionRequestBuilder() if online_mode == SHUT_LEGACY: reqBuf.add_option_mask(ibase.isc_spb_prp_db_online) else: reqBuf.add_numeric(ibase.isc_spb_prp_online_mode, online_mode, numCType='B') self._property_action(database, reqBuf) def sweep(self, database): """Perform Database Sweep. .. note:: Method call will not return until sweep is finished. :param string database: Database filename or alias. """ self.__check_active() _checkString(database) reqBuf = _ServiceActionRequestBuilder() optionMask = ibase.isc_spb_rpr_sweep_db reqBuf.add_option_mask(optionMask) return self._repair_action(database, reqBuf) def repair(self, database, read_only_validation=0, ignore_checksums=0, kill_unavailable_shadows=0, mend_database=0, validate_database=1, validate_record_fragments=1): """Database Validation and Repair. :param string database: Database filename or alias. :param integer read_only_validation: `1` to prevent any database changes. :param integer ignore_checksums: `1` to ignore page checksum errors. :param integer kill_unavailable_shadows: `1` to kill unavailable shadows. :param integer mend_database: `1` to fix database for backup. :param integer validate_database: `0` to skip database validation. :param integer validate_record_fragments: `0` to skip validation of record fragments. .. note:: Method call will not return until action is finished. """ self.__check_active() _checkString(database) # YYY: With certain option combinations, this method raises errors # that may not be very comprehensible to a Python programmer who's not # well versed with IB/FB. Should option combination filtering be # done right here instead of leaving that responsibility to the # database engine? # I think not, since any filtering done in this method is liable to # become outdated, or to inadvertently enforce an unnecessary, # crippling constraint on a certain option combination that the # database engine would have allowed. reqBuf = _ServiceActionRequestBuilder() optionMask = 0 if read_only_validation: optionMask |= ibase.isc_spb_rpr_check_db if ignore_checksums: optionMask |= ibase.isc_spb_rpr_ignore_checksum if kill_unavailable_shadows: optionMask |= ibase.isc_spb_rpr_kill_shadows if mend_database: optionMask |= ibase.isc_spb_rpr_mend_db if validate_database: optionMask |= ibase.isc_spb_rpr_validate_db if validate_record_fragments: optionMask |= ibase.isc_spb_rpr_full reqBuf.add_option_mask(optionMask) return self._repair_action(database, reqBuf) # 2003.07.12: Removed method resolveLimboTransactions (dropped plans to # support that operation from kinterbasdb since transactions IDs are not # exposed at the Python level and I don't consider limbo transaction # resolution compelling enough to warrant exposing transaction IDs). # User management methods: def get_users(self, user_name=None): """Get information about user(s). :param string user_name: (Optional) When specified, returns information only about user with specified user name. :returns list: :class:`User` instances. """ self.__check_active() if user_name is not None: if isinstance(user_name, ibase.myunicode): _checkString(user_name) user_name = ibase.b(user_name) reqBuf = _ServiceActionRequestBuilder( ibase.isc_action_svc_display_user ) if user_name: user_name = user_name.upper() reqBuf.add_string(ibase.isc_spb_sec_username, user_name) self._act(reqBuf) raw = self._QR(ibase.isc_info_svc_get_users) users = [] curUser = None pos = 1 # Ignore raw[0]. upper_limit = len(raw) - 1 while pos < upper_limit: cluster = ibase.ord2(raw[pos]) pos += 1 if cluster == ibase.isc_spb_sec_username: if curUser is not None: users.append(curUser) curUser = None (user_name, pos) = self._extract_string(raw, pos) curUser = User(user_name) elif cluster == ibase.isc_spb_sec_password: (password, pos) = self._extract_string(raw, pos) curUser.password = password elif cluster == ibase.isc_spb_sec_firstname: (firstName, pos) = self._extract_string(raw, pos) curUser.first_name = firstName elif cluster == ibase.isc_spb_sec_middlename: (middleName, pos) = self._extract_string(raw, pos) curUser.middle_name = middleName elif cluster == ibase.isc_spb_sec_lastname: (lastName, pos) = self._extract_string(raw, pos) curUser.last_name = lastName elif cluster == ibase.isc_spb_sec_groupid: (groupId, pos) = self._extract_int(raw, pos) curUser.group_id = groupId elif cluster == ibase.isc_spb_sec_userid: (userId, pos) = self._extract_int(raw, pos) curUser.user_id = userId # Handle the last user: if curUser is not None: users.append(curUser) curUser = None return users def add_user(self, user): """Add new user. :param user: Instance of :class:`User` with **at least** its :attr:`~User.name` and :attr:`~User.password` attributes specified as non-empty values. All other attributes are optional. :type user: :class:`User` .. note:: This method ignores the :attr:`~User.user_id` and :attr:`~User.group_id` attributes of :class:`~User` regardless of their values. """ self.__check_active() if not user.name: raise fdb.ProgrammingError('You must specify a username.') else: _checkString(user.name) user.name = ibase.b(user.name) if not user.password: raise fdb.ProgrammingError('You must specify a password.') else: _checkString(user.password) user.password = ibase.b(user.password) reqBuf = _ServiceActionRequestBuilder(ibase.isc_action_svc_add_user) reqBuf.add_string(ibase.isc_spb_sec_username, user.name) reqBuf.add_string(ibase.isc_spb_sec_password, user.password) if user.first_name: user.first_name = ibase.b(user.first_name) reqBuf.add_string(ibase.isc_spb_sec_firstname, user.first_name) if user.middle_name: user.middle_name = ibase.b(user.middle_name) reqBuf.add_string(ibase.isc_spb_sec_middlename, user.middle_name) if user.last_name: user.last_name = ibase.b(user.last_name) reqBuf.add_string(ibase.isc_spb_sec_lastname, user.last_name) self._act_and_return_textual_results(reqBuf) def modify_user(self, user): """Modify user information. :param user: Instance of :class:`User` with **at least** its :attr:`~User.name` attribute specified as non-empty value. :type user: :class:`User` .. note:: This method sets :attr:`~User.first_name`, :attr:`~User.middle_name` and :attr:`~User.last_name` to their actual values, and ignores the :attr:`~User.user_id` and :attr:`~User.group_id` attributes regardless of their values. :attr:`~User.password` is set **only** when it has value. """ self.__check_active() reqBuf = _ServiceActionRequestBuilder(ibase.isc_action_svc_modify_user) if isinstance(user.name, str): user.name = ibase.b(user.name) reqBuf.add_string(ibase.isc_spb_sec_username, user.name) if isinstance(user.password, str): user.password = ibase.b(user.password) reqBuf.add_string(ibase.isc_spb_sec_password, user.password) # Change the optional attributes whether they're empty or not. if isinstance(user.first_name, str): user.first_name = ibase.b(user.first_name) reqBuf.add_string(ibase.isc_spb_sec_firstname, user.first_name) if isinstance(user.middle_name, str): user.middle_name = ibase.b(user.middle_name) reqBuf.add_string(ibase.isc_spb_sec_middlename, user.middle_name) if isinstance(user.last_name, str): user.last_name = ibase.b(user.last_name) reqBuf.add_string(ibase.isc_spb_sec_lastname, user.last_name) self._act_and_return_textual_results(reqBuf) def remove_user(self, user): """Remove user. :param user: User name or Instance of :class:`User` with **at least** its :attr:`~User.name` attribute specified as non-empty value. :type user: string or :class:`User` """ self.__check_active() if isinstance(user, User): username = user.name else: _checkString(user) user = ibase.b(user) username = user reqBuf = _ServiceActionRequestBuilder(ibase.isc_action_svc_delete_user) reqBuf.add_string(ibase.isc_spb_sec_username, username) self._act_and_return_textual_results(reqBuf) def user_exists(self, user): """Check for user's existence. :param user: User name or Instance of :class:`User` with **at least** its :attr:`~User.name` attribute specified as non-empty value. :type user: string or :class:`User` :returns boolean: `True` when the specified user exists. """ self.__check_active() if isinstance(user, User): username = user.name else: username = user return len(self.get_users(user_name=username)) > 0 #: (Read Only) `True` if connection is closed. closed = property(__get_closed) #: (Read Only) `True` if connection is fetching result. fetching = property(__get_fetching) #: (Read Only) (string) Firebird version number string of connected server. #: Uses Firebird version numbers in form: major.minor.subrelease.build version = property(__get_version) #: (Read Only) (float) Firebird version number of connected server. Only major.minor version. engine_version = property(__get_engine_version) class User(object): def __init__(self, name=None): if name: _checkString(name) self.name = name.upper() else: #: User `login` name (username). self.name = None #: Password. Not returned by user output methods, but must be #: specified to add a user. self.password = None #: First name. self.first_name = None #: Middle name self.middle_name = None #: Last name self.last_name = None # The user id and group id are not fully supported. For details, see # the documentation of the "User Management Methods" of # services.Connection. #: User ID self.user_id = None #: User group ID self.group_id = None def __str__(self): return '' % ( (self.name is None and 'without a name') or 'named "%s"' % self.name) def load_information(self,svc): """Load information about user from server. :param svc: Open service connection. :type svc: :class:`Connection` :returns: True if information was successfuly retrieved, False otherwise. :raises ProgrammingError: If user name is not defined. """ if self.name is None: raise fdb.ProgrammingError("Can't load information about user without name.") user = svc.get_users(self.name) if len(user) > 0: self.first_name = user.first_name self.middle_name = user.middle_name self.last_name = user.last_name self.user_id = user.user_id self.group_id = user.group_id return len(user) > 0 class _ServiceActionRequestBuilder(object): # This private class helps public facilities in this module to build # the binary action request buffers required by the database Services API # using high-level, easily comprehensible syntax. def __init__(self, clusterIdentifier=None): self._buffer = [] if clusterIdentifier: self.add_code(clusterIdentifier) def __str__(self): return self.render() def extend(self, otherRequestBuilder): self._buffer.append(otherRequestBuilder.render()) def add_code(self, code): _code2spb(self._buffer, code) def add_string(self, code, s): # _checkString(s) _string2spb(self._buffer, code, ibase.b(s)) def add_string_sequence(self, code, stringSequence): for s in stringSequence: self.add_string(code, s) def add_string_numeric_pairs_sequence(self, stringCode, stringSequence, numericCode, numericSequence): stringCount = len(stringSequence) numericCount = len(numericSequence) if numericCount != stringCount - 1: raise ValueError("Numeric sequence must contain exactly one less" " element than its companion string sequence." ) i = 0 while i < stringCount: self.add_string(stringCode, stringSequence[i]) if i < numericCount: self.add_numeric(numericCode, numericSequence[i]) i += 1 def add_numeric(self, code, n, numCType='I'): _numeric2spb(self._buffer, code, n, numCType=numCType) def add_option_mask(self, optionMask): self.add_numeric(ibase.isc_spb_options, optionMask) def add_database_name(self, databaseName): # 2003.07.20: Issue a warning for a hostname-containing databaseName # because it will cause isc_service_start to raise an inscrutable error # message with Firebird 1.5 (though it would not have raised an error # at all with Firebird 1.0 and earlier). ### Todo: verify handling of P version differences, refactor databaseName = ibase.b(databaseName,fdb.fbcore._FS_ENCODING) if ibase.PYTHON_MAJOR_VER == 3: colonIndex = (databaseName.decode(fdb.fbcore._FS_ENCODING)).find(':') else: colonIndex = databaseName.find(':') if colonIndex != -1: # This code makes no provision for platforms other than Windows # that allow colons in paths (such as MacOS). Some of # kinterbasdb's current implementation (e.g., event handling) is # constrained to Windows or POSIX anyway. if not sys.platform.lower().startswith('win') or ( # This client process is running on Windows. # # Files that don't exist might still be valid if the connection # is to a server other than the local machine. not os.path.exists(ibase.nativestr(databaseName,fdb.fbcore._FS_ENCODING)) # "Guess" that if the colon falls within the first two # characters of the string, the pre-colon portion refers to a # Windows drive letter rather than to a remote host. # This isn't guaranteed to be correct. and colonIndex > 1 ): warnings.warn( ' Unlike conventional DSNs, Services API database names' ' must not include the host name; remove the "%s" from' ' your database name.' ' (Firebird 1.0 will accept this, but Firebird 1.5 will' ' raise an error.)' % databaseName[:colonIndex + 1], UserWarning ) self.add_string(ibase.isc_spb_dbname, databaseName) def render(self): return ibase.b('').join(self._buffer)fdb-1.4.9+dfsg1/fdb/fbcore.py0000644000215700017510000070210112544557571014552 0ustar rstuartit#coding:utf-8 # # PROGRAM/MODULE: fdb # FILE: fbcore.py # DESCRIPTION: Python driver for Firebird # CREATED: 8.10.2011 # # 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 Pavel Cisar # # Copyright (c) 2011 Pavel Cisar # and all contributors signed below. # # All Rights Reserved. # Contributor(s): Philippe Makowski # ______________________________________. # # See LICENSE.TXT for details. import sys import os import ctypes import struct import time import datetime import decimal import weakref import threading from . import ibase from . import schema from . import monitor from . import utils try: # Python 2 from itertools import izip_longest except ImportError: # Python 3 from itertools import zip_longest as izip_longest from fdb.ibase import (frb_info_att_charset, isc_dpb_activate_shadow, isc_dpb_address_path, isc_dpb_allocation, isc_dpb_begin_log, isc_dpb_buffer_length, isc_dpb_cache_manager, isc_dpb_cdd_pathname, isc_dpb_connect_timeout, isc_dpb_damaged, isc_dpb_dbkey_scope, isc_dpb_debug, isc_dpb_delete_shadow, isc_dpb_disable_journal, isc_dpb_disable_wal, isc_dpb_drop_walfile, isc_dpb_dummy_packet_interval, isc_dpb_enable_journal, isc_dpb_encrypt_key, isc_dpb_force_write, isc_dpb_garbage_collect, isc_dpb_gbak_attach, isc_dpb_gfix_attach, isc_dpb_gsec_attach, isc_dpb_gstat_attach, isc_dpb_interp, isc_dpb_journal, isc_dpb_lc_ctype, isc_dpb_lc_messages, isc_dpb_license, isc_dpb_no_garbage_collect, isc_dpb_no_reserve, isc_dpb_num_buffers, isc_dpb_number_of_users, isc_dpb_old_dump_id, isc_dpb_old_file, isc_dpb_old_file_size, isc_dpb_old_num_files, isc_dpb_old_start_file, isc_dpb_old_start_page, isc_dpb_old_start_seqno, isc_dpb_online, isc_dpb_online_dump, isc_dpb_overwrite, isc_dpb_page_size, isc_dpb_password, isc_dpb_password_enc, isc_dpb_quit_log, isc_dpb_reserved, isc_dpb_sec_attach, isc_dpb_set_db_charset, isc_dpb_set_db_readonly, isc_dpb_set_db_sql_dialect, isc_dpb_set_page_buffers, isc_dpb_shutdown, isc_dpb_shutdown_delay, isc_dpb_sql_dialect, isc_dpb_sql_role_name, isc_dpb_sweep, isc_dpb_sweep_interval, isc_dpb_sys_user_name, isc_dpb_sys_user_name_enc, isc_dpb_trace, isc_dpb_user_name, isc_dpb_verify, isc_dpb_version1, isc_dpb_wal_backup_dir, isc_dpb_wal_bufsize, isc_dpb_wal_chkptlen, isc_dpb_wal_grp_cmt_wait, isc_dpb_wal_numbufs, isc_dpb_working_directory, isc_info_active_tran_count, isc_info_end, isc_info_truncated, isc_info_sql_stmt_type, isc_info_sql_get_plan, isc_info_sql_records, isc_info_req_select_count, isc_info_req_insert_count, isc_info_req_update_count, isc_info_req_delete_count, isc_info_blob_total_length, isc_info_blob_max_segment, isc_info_active_transactions, isc_info_allocation, isc_info_attachment_id, isc_info_backout_count, isc_info_base_level, isc_info_bpage_errors, isc_info_creation_date, isc_info_cur_log_part_offset, isc_info_cur_logfile_name, isc_info_current_memory, isc_info_db_class, isc_info_db_id, isc_info_db_provider, isc_info_db_read_only, isc_info_db_size_in_pages, isc_info_db_sql_dialect, isc_info_delete_count, isc_info_dpage_errors, isc_info_expunge_count, isc_info_fetches, isc_info_firebird_version, isc_info_forced_writes, isc_info_implementation, isc_info_insert_count, isc_info_ipage_errors, isc_info_isc_version, isc_info_license, isc_info_limbo, isc_info_logfile, isc_info_marks, isc_info_max_memory, isc_info_next_transaction, isc_info_no_reserve, isc_info_num_buffers, isc_info_num_wal_buffers, isc_info_ods_minor_version, isc_info_ods_version, isc_info_oldest_active, isc_info_oldest_snapshot, isc_info_oldest_transaction, isc_info_page_errors, isc_info_page_size, isc_info_ppage_errors, isc_info_purge_count, isc_info_read_idx_count, isc_info_read_seq_count, isc_info_reads, isc_info_record_errors, isc_info_set_page_buffers, isc_info_sql_stmt_commit, isc_info_sql_stmt_ddl, isc_info_sql_stmt_delete, isc_info_sql_stmt_exec_procedure, isc_info_sql_stmt_get_segment, isc_info_sql_stmt_insert, isc_info_sql_stmt_put_segment, isc_info_sql_stmt_rollback, isc_info_sql_stmt_savepoint, isc_info_sql_stmt_select, isc_info_sql_stmt_select_for_upd, isc_info_sql_stmt_set_generator, isc_info_sql_stmt_start_trans, isc_info_sql_stmt_update, isc_info_sweep_interval, isc_info_tpage_errors, isc_info_tra_access, isc_info_tra_concurrency, isc_info_tra_consistency, isc_info_tra_id, isc_info_tra_isolation, isc_info_tra_lock_timeout, isc_info_tra_no_rec_version, isc_info_tra_oldest_active, isc_info_tra_oldest_interesting, isc_info_tra_oldest_snapshot, isc_info_tra_read_committed, isc_info_tra_readonly, isc_info_tra_readwrite, isc_info_tra_rec_version, isc_info_update_count, isc_info_user_names, isc_info_version, isc_info_wal_avg_grpc_size, isc_info_wal_avg_io_size, isc_info_wal_buffer_size, isc_info_wal_ckpt_length, isc_info_wal_cur_ckpt_interval, isc_info_wal_grpc_wait_usecs, isc_info_wal_num_commits, isc_info_wal_num_io, isc_info_wal_prv_ckpt_fname, isc_info_wal_prv_ckpt_poffset, isc_info_wal_recv_ckpt_fname, isc_info_wal_recv_ckpt_poffset, isc_info_window_turns, isc_info_writes, isc_tpb_autocommit, isc_tpb_commit_time, isc_tpb_concurrency, isc_tpb_consistency, isc_tpb_exclusive, isc_tpb_ignore_limbo, isc_tpb_lock_read, isc_tpb_lock_timeout, isc_tpb_lock_write, isc_tpb_no_auto_undo, isc_tpb_no_rec_version, isc_tpb_nowait, isc_tpb_protected, isc_tpb_read, isc_tpb_read_committed, isc_tpb_rec_version, isc_tpb_restart_requests, isc_tpb_shared, isc_tpb_verb_time, isc_tpb_version3, isc_tpb_wait, isc_tpb_write, b, s, ord2, int2byte, mychr, mybytes, myunicode, mylong, StringType, IntType, LongType, FloatType, ListType, UnicodeType, TupleType, xrange, charset_map, #isc_sqlcode, isc_sql_interprete, fb_interpret, isc_dsql_execute_immediate, XSQLDA_PTR, ISC_SHORT, ISC_LONG, ISC_SCHAR, ISC_UCHAR, ISC_QUAD, SHRT_MIN, SHRT_MAX, USHRT_MAX, INT_MIN, INT_MAX, LONG_MIN, LONG_MAX, SQL_TEXT, SQL_VARYING, SQL_SHORT, SQL_LONG, SQL_FLOAT, SQL_DOUBLE, SQL_D_FLOAT, SQL_TIMESTAMP, SQL_BLOB, SQL_ARRAY, SQL_QUAD, SQL_TYPE_TIME, SQL_TYPE_DATE, SQL_INT64, SUBTYPE_NUMERIC, SUBTYPE_DECIMAL, MAX_BLOB_SEGMENT_SIZE, ISC_INT64, XSQLVAR, ISC_TEB, RESULT_VECTOR, ISC_STATUS, ISC_STATUS_ARRAY, ISC_STATUS_PTR, ISC_EVENT_CALLBACK, ISC_ARRAY_DESC, blr_varying, blr_varying2, blr_text, blr_text2, blr_short, blr_long, blr_int64, blr_float, blr_d_float, blr_double, blr_timestamp, blr_sql_date, blr_sql_time, SQLDA_version1, isc_segment, isc_db_handle, isc_tr_handle, isc_stmt_handle, isc_blob_handle, fbclient_API ) PYTHON_MAJOR_VER = sys.version_info[0] if PYTHON_MAJOR_VER != 3: from exceptions import NotImplementedError __version__ = '1.4.9' apilevel = '2.0' threadsafety = 1 paramstyle = 'qmark' def load_api(fb_library_name=None): """Initializes bindings to Firebird Client Library unless they are already initialized. Called automatically by :func:`fdb.connect` and :func:`fdb.create_database`. :param string fb_library_name: (optional) Path to Firebird Client Library. When it's not specified, FDB does its best to locate appropriate client library. :returns: :class:`fdb.ibase.fbclient_API` instance. """ if not hasattr(sys.modules[__name__],'api'): setattr(sys.modules[__name__],'api',fbclient_API(fb_library_name)) return getattr(sys.modules[__name__],'api') # Exceptions required by Python Database API class Warning(Exception): """Exception raised for important warnings like data truncations while inserting, etc.""" pass class Error(Exception): """Exception that is the base class of all other error exceptions. You can use this to catch all errors with one single 'except' statement. Warnings are not considered errors and thus should not use this class as base.""" pass class InterfaceError(Error): """Exception raised for errors that are related to the database interface rather than the database itself.""" pass class DatabaseError(Error): "Exception raised for errors that are related to the database." pass #def __init__(self,msg, sqlcode=0,error_code=0): #self.sqlcode = sqlcode #self.error_code = error_code #self.msg = msg class DataError(DatabaseError): """Exception raised for errors that are due to problems with the processed data like division by zero, numeric value out of range, etc.""" pass class OperationalError(DatabaseError): """Exception raised for errors that are related to the database's operation and not necessarily under the control of the programmer, e.g. an unexpected disconnect occurs, the data source name is not found, a transaction could not be processed, a memory allocation error occurred during processing, etc.""" pass class IntegrityError(DatabaseError): """Exception raised when the relational integrity of the database is affected, e.g. a foreign key check fails.""" pass class InternalError(DatabaseError): """Exception raised when the database encounters an internal error, e.g. the cursor is not valid anymore, the transaction is out of sync, etc.""" pass class ProgrammingError(DatabaseError): """Exception raised for programming errors, e.g. table not found or already exists, syntax error in the SQL statement, wrong number of parameters specified, etc.""" pass class NotSupportedError(DatabaseError): """Exception raised in case a method or database API was used which is not supported by the database""" pass class TransactionConflict(DatabaseError): pass # Named positional constants to be used as indices into the description # attribute of a cursor (these positions are defined by the DB API spec). # For example: # nameOfFirstField = cursor.description[0][kinterbasdb.DESCRIPTION_NAME] DESCRIPTION_NAME = 0 DESCRIPTION_TYPE_CODE = 1 DESCRIPTION_DISPLAY_SIZE = 2 DESCRIPTION_INTERNAL_SIZE = 3 DESCRIPTION_PRECISION = 4 DESCRIPTION_SCALE = 5 DESCRIPTION_NULL_OK = 6 # Types Required by Python DB-API 2.0 def Date(year, month, day): return datetime.date(year, month, day) def Time(hour, minite, second): return datetime.time(hour, minite, second) def DateFromTicks(ticks): return apply(Date, time.localtime(ticks)[:3]) def TimeFromTicks(ticks): return apply(Time, time.localtime(ticks)[3:6]) def TimestampFromTicks(ticks): return apply(Timestamp, time.localtime(ticks)[:6]) def Binary(b): return b class DBAPITypeObject: def __init__(self, *values): self.values = values def __cmp__(self, other): if other in self.values: return 0 if other < self.values: return 1 else: return -1 STRING = DBAPITypeObject(str) if PYTHON_MAJOR_VER == 3: BINARY = DBAPITypeObject(bytes) else: BINARY = DBAPITypeObject(str) NUMBER = DBAPITypeObject(int, decimal.Decimal) DATETIME = DBAPITypeObject(datetime.datetime, datetime.date, datetime.time) ROWID = DBAPITypeObject() _FS_ENCODING = sys.getfilesystemencoding() DIST_TRANS_MAX_DATABASES = 16 def bs(byte_array): return bytes(byte_array) if PYTHON_MAJOR_VER == 3 else ''.join((chr(c) for c in byte_array)) ISOLATION_LEVEL_READ_COMMITED_LEGACY = bs([isc_tpb_version3, isc_tpb_write, isc_tpb_wait, isc_tpb_read_committed, isc_tpb_no_rec_version]) ISOLATION_LEVEL_READ_COMMITED = bs([isc_tpb_version3, isc_tpb_write, isc_tpb_wait, isc_tpb_read_committed, isc_tpb_rec_version]) ISOLATION_LEVEL_REPEATABLE_READ = bs([isc_tpb_version3, isc_tpb_write, isc_tpb_wait, isc_tpb_concurrency]) ISOLATION_LEVEL_SNAPSHOT = ISOLATION_LEVEL_REPEATABLE_READ ISOLATION_LEVEL_SERIALIZABLE = bs([isc_tpb_version3, isc_tpb_write, isc_tpb_wait, isc_tpb_consistency]) ISOLATION_LEVEL_SNAPSHOT_TABLE_STABILITY = ISOLATION_LEVEL_SERIALIZABLE ISOLATION_LEVEL_READ_COMMITED_RO = bs([isc_tpb_version3, isc_tpb_read, isc_tpb_wait, isc_tpb_read_committed, isc_tpb_rec_version]) # ODS constants ODS_FB_20 = 11.0 ODS_FB_21 = 11.1 ODS_FB_25 = 11.2 ODS_FB_30 = 12.0 # Private constants _SIZE_OF_SHORT = ctypes.sizeof(ctypes.c_short) _tenTo = [10 ** x for x in range(20)] if PYTHON_MAJOR_VER != 3: del x __xsqlda_cache = {} __tebarray_cache = {} _DATABASE_INFO_CODES_WITH_INT_RESULT = ( isc_info_allocation, isc_info_no_reserve, isc_info_db_sql_dialect, isc_info_ods_minor_version, isc_info_ods_version, isc_info_page_size, isc_info_current_memory, isc_info_forced_writes, isc_info_max_memory, isc_info_num_buffers, isc_info_sweep_interval, isc_info_limbo, isc_info_attachment_id, isc_info_fetches, isc_info_marks, isc_info_reads, isc_info_writes, isc_info_set_page_buffers, isc_info_db_read_only, isc_info_db_size_in_pages, isc_info_page_errors, isc_info_record_errors, isc_info_bpage_errors, isc_info_dpage_errors, isc_info_ipage_errors, isc_info_ppage_errors, isc_info_tpage_errors, isc_info_oldest_transaction, isc_info_oldest_active, isc_info_oldest_snapshot, isc_info_next_transaction, isc_info_active_tran_count, ) _DATABASE_INFO_CODES_WITH_COUNT_RESULTS = ( isc_info_backout_count, isc_info_delete_count, isc_info_expunge_count, isc_info_insert_count, isc_info_purge_count, isc_info_read_idx_count, isc_info_read_seq_count, isc_info_update_count ) _DATABASE_INFO_CODES_WITH_TIMESTAMP_RESULT = (isc_info_creation_date,) _DATABASE_INFO__KNOWN_LOW_LEVEL_EXCEPTIONS = (isc_info_user_names,) def xsqlda_factory(size): if size in __xsqlda_cache: cls = __xsqlda_cache[size] else: class XSQLDA(ctypes.Structure): pass XSQLDA._fields_ = [ ('version', ISC_SHORT), ('sqldaid', ISC_SCHAR * 8), ('sqldabc', ISC_LONG), ('sqln', ISC_SHORT), ('sqld', ISC_SHORT), ('sqlvar', XSQLVAR * size), ] __xsqlda_cache[size] = XSQLDA cls = XSQLDA xsqlda = cls() xsqlda.version = SQLDA_version1 xsqlda.sqln = size return xsqlda def tebarray_factory(size): if size in __tebarray_cache: cls = __tebarray_cache[size] else: cls = ISC_TEB * size __xsqlda_cache[size] = cls teb_array = cls() return teb_array buf_pointer = ctypes.POINTER(ctypes.c_char) def is_dead_proxy(obj): return isinstance(obj,weakref.ProxyType) and not dir(obj) def b2u(st, charset): "Decode to unicode if charset is defined. For conversion of result set data." if charset: return st.decode(charset) else: return st def p3fix(st, charset): """For P3 convert bytes to string using connection charset, P2 as is. For conversion of info results to native strings.""" if PYTHON_MAJOR_VER == 3: return st.decode(charset) else: return st def inc_pointer(pointer): t = type(pointer) p = ctypes.cast(pointer,ctypes.c_void_p) p.value += 1 return ctypes.cast(p,t) def bytes_to_bint(b): # Read as big endian len_b = len(b) if len_b == 1: fmt = 'B' elif len_b == 2: fmt = '>H' elif len_b == 4: fmt = '>L' elif len_b == 8: fmt = '>Q' else: raise InternalError return struct.unpack(fmt, b)[0] def bytes_to_int(b): # Read as little endian. len_b = len(b) if len_b == 1: fmt = 'b' elif len_b == 2: fmt = ' 0 def exception_from_status(error, status, preamble=None): msglist = [] msg = ctypes.create_string_buffer(512) if preamble: msglist.append(preamble) sqlcode = api.isc_sqlcode(status) error_code = status[1] msglist.append('- SQLCODE: %i' % sqlcode) #isc_sql_interprete(sqlcode, msg, 512) #if PYTHON_MAJOR_VER == 3: #### Todo: trouble? decode from connection charset? #msglist.append('- ' + (msg.value).decode('utf_8')) #else: #msglist.append('- ' + msg.value) pvector = ctypes.cast(ctypes.addressof(status), ISC_STATUS_PTR) while True: result = api.fb_interpret(msg, 512, pvector) if result != 0: if PYTHON_MAJOR_VER == 3: ### Todo: trouble? decode from connection charset? msglist.append('- ' + (msg.value).decode('utf_8')) else: msglist.append('- ' + msg.value) else: break return error('\n'.join(msglist), sqlcode, error_code) def build_dpb(user, password, sql_dialect, role, charset, buffers, force_write, no_reserve, db_key_scope): params = [int2byte(isc_dpb_version1)] def addString(codeAsByte, s): if PYTHON_MAJOR_VER == 3 or isinstance(s,UnicodeType): s = s.encode(charset_map.get(charset, charset)) sLen = len(s) if sLen >= 256: # Because the length is denoted in the DPB by a single byte. raise ProgrammingError("Individual component of database" " parameter buffer is too large. Components must be less" " than 256 bytes." ) myformat = 'cc%ds' % sLen # like 'cc50s' for a 50-byte string newEntry = struct.pack(myformat, int2byte(codeAsByte), int2byte(sLen), s) params.append(newEntry) def addByte(codeAsByte, value): if (not isinstance(value, (int, mylong)) or value < 0 or value > 255): raise ProgrammingError("The value for an integer DPB code must be" " an int or long with a value between 0 and 255." ) newEntry = struct.pack('ccc', int2byte(codeAsByte), b('\x01'), int2byte(value)) params.append(newEntry) def addInt(codeAsByte, value): if not isinstance(value, (int, mylong)): raise ProgrammingError("The value for an integer DPB code must be" " an int or long." ) newEntry = struct.pack('=ccI', int2byte(codeAsByte), b('\x04'), value) params.append(newEntry) if user: addString(isc_dpb_user_name, user) if password: addString(isc_dpb_password, password) if role: addString(isc_dpb_sql_role_name, role) if sql_dialect: addByte(isc_dpb_sql_dialect, sql_dialect) if charset: addString(isc_dpb_lc_ctype, charset.upper()) if buffers: addInt(isc_dpb_num_buffers, buffers) if force_write: addByte(isc_dpb_force_write, force_write) if no_reserve: addByte(isc_dpb_no_reserve, no_reserve) if db_key_scope: addByte(isc_dpb_dbkey_scope, db_key_scope) return b('').join(params) def connect(dsn='', user=None, password=None, host=None, port=3050, database=None, sql_dialect=3, role=None, charset=None, buffers=None, force_write=None, no_reserve=None, db_key_scope=None, isolation_level=ISOLATION_LEVEL_READ_COMMITED, connection_class=None, fb_library_name=None): """ Establish a connection to database. :param dsn: Connection string in format [host[/port]]:database :param string user: User name. If not specified, fdb attempts to use ISC_USER envar. :param string password: User password. If not specified, fdb attempts to use ISC_PASSWORD envar. :param string host: Server host machine specification. :param integer port: Port used by Firebird server **(not used)**. :param string database: Database specification (file spec. or alias) :param sql_dialect: SQL Dialect for connection. :type sql_dialect): 1, 2 or 3 :param string role: User role. :param string charset: Character set for connection. :param integer buffers: Page case size override for connection. :param integer force_writes: Forced writes override for connection. :param integer no_reserve: Page space reservation override for connection. :param integer db_key_scope: DBKEY scope override for connection. :param isolation_level: Default transaction isolation level for connection **(not used)**. :type isolation_level: 0, 1, 2 or 3 :param connection_class: Custom connection class :type connection_class: subclass of :class:`Connection` :param string fb_library_name: Full path to Firebird client library. See :func:`~fdb.load_api` for details. :returns: Connection to database. :rtype: :class:`Connection` instance. :raises ProgrammingError: For bad parameter values. :raises DatabaseError: When connection cannot be established. .. important:: You may specify the database using either `dns` or `database` (with optional `host`), but not both. Examples: .. code-block:: python con = fdb.connect(dsn='host:/path/database.fdb', user='sysdba', password='pass', charset='UTF8') con = fdb.connect(host='myhost', database='/path/database.fdb', user='sysdba', password='pass', charset='UTF8') """ load_api(fb_library_name) if connection_class == None: connection_class = Connection if not issubclass(connection_class,Connection): raise ProgrammingError("'connection_class' must be subclass of Connection") if not user: user = os.environ.get('ISC_USER', None) if not password: password = os.environ.get('ISC_PASSWORD', None) if sql_dialect not in [1, 2, 3]: raise ProgrammingError("SQl Dialect must be either 1, 2 or 3") if ((not dsn and not host and not database) or (dsn and (host or database)) or (host and not database) ): raise ProgrammingError( "Must supply one of:\n" " 1. keyword argument dsn='host:/path/to/database'\n" " 2. both keyword arguments host='host' and" " database='/path/to/database'\n" " 3. only keyword argument database='/path/to/database'" ) if not dsn: if host and host.endswith(':'): raise ProgrammingError("Host must not end with a colon." " You should specify host='%s' rather than host='%s'." % (host[:-1], host) ) elif host: dsn = '%s:%s' % (host, database) else: dsn = database dsn = b(dsn,_FS_ENCODING) if charset: charset = charset.upper() dpb = build_dpb(user, password, sql_dialect, role, charset, buffers, force_write, no_reserve, db_key_scope) _isc_status = ISC_STATUS_ARRAY() _db_handle = isc_db_handle(0) api.isc_attach_database(_isc_status, len(dsn), dsn, _db_handle, len(dpb), dpb) if db_api_error(_isc_status): raise exception_from_status(DatabaseError, _isc_status, "Error while connecting to database:") return connection_class(_db_handle, dpb, sql_dialect, charset, isolation_level) def create_database(sql='', sql_dialect=3, dsn='', user=None, password=None, host=None, port=3050, database=None, page_size=None, length=None, charset=None, files=None, connection_class=None, fb_library_name=None): """ Creates a new database. Parameters could be specified either by supplied "CREATE DATABASE" statement, or set of database parameters. :param sql: "CREATE DATABASE" statement. :param sql_dialect: SQL Dialect for newly created database. :type sql_dialect: 1 or 3 :param dsn: Connection string in format [host[/port]]:database :param string user: User name. If not specified, fdb attempts to use ISC_USER envar. :param string password: User password. If not specified, fdb attempts to use ISC_PASSWORD envar. :param string host: Server host machine specification. :param integer port: Port used by Firebird server **(not used)**. :param string database: Database specification (file spec. or alias) :param integer page_size: Database page size. :param integer length: Database size in pages. :param string charset: Character set for connection. :param string files: Specification of secondary database files. :param connection_class: Custom connection class :type connection_class: subclass of :class:`Connection` :param string fb_library_name: Full path to Firebird client library. See :func:`~fdb.load_api` for details. :returns: Connection to the newly created database. :rtype: :class:`Connection` instance. :raises ProgrammingError: For bad parameter values. :raises DatabaseError: When database creation fails. Example: .. code-block:: python con = fdb.create_database("create database '/temp/db.fdb' user 'sysdba' password 'pass'") con = fdb.create_database(dsn='/temp/db.fdb',user='sysdba',password='pass',page_size=8192) """ load_api(fb_library_name) if connection_class == None: connection_class = Connection if not issubclass(connection_class,Connection): raise ProgrammingError("'connection_class' must be subclass of Connection") # Database to create must be specified by either `sql` or other parameters. if sql: if isinstance(sql, myunicode): sql = sql.encode(_FS_ENCODING) else: if not user: user = os.environ.get('ISC_USER', None) if not password: password = os.environ.get('ISC_PASSWORD', None) if sql_dialect not in [1, 2, 3]: raise ProgrammingError("SQl Dialect must be either 1, 2 or 3") if ((not dsn and not host and not database) or (dsn and (host or database)) or (host and not database) ): raise ProgrammingError( "Must supply one of:\n" " 1. keyword argument dsn='host:/path/to/database'\n" " 2. both keyword arguments host='host' and" " database='/path/to/database'\n" " 3. only keyword argument database='/path/to/database'" ) if not dsn: if host and host.endswith(':'): raise ProgrammingError("Host must not end with a colon." " You should specify host='%s' rather than host='%s'." % (host[:-1], host) ) elif host: dsn = '%s:%s' % (host, database) else: dsn = database dsn = b(dsn,_FS_ENCODING) # Parameter checks sql = "create database '%s' user '%s' password '%s'" % (dsn,user,password) if page_size: sql = '%s page_size %i' % (sql,page_size) if length: sql = '%s length %i' % (sql,length) if charset: sql = '%s default character set %s' % (sql,charset.upper()) if files: sql = '%s %s' % (sql,files) isc_status = ISC_STATUS_ARRAY(0) trans_handle = isc_tr_handle(0) db_handle = isc_db_handle(0) xsqlda = xsqlda_factory(1) # For yet unknown reason, the isc_dsql_execute_immediate segfaults when # NULL (None) is passed as XSQLDA, so we provide one here api.isc_dsql_execute_immediate(isc_status, db_handle, trans_handle, ctypes.c_ushort(len(sql)), sql, sql_dialect, ctypes.cast(ctypes.pointer(xsqlda),XSQLDA_PTR)) if db_api_error(isc_status): raise exception_from_status(DatabaseError, isc_status, "Error while creating database:") return connection_class(db_handle) class _weakref_callback(object): """Wraps callback function used in weakrefs so it's called only if still exists. """ def __init__(self, func): self.__funcref = weakref.ref(func) def __call__(self, *args, **kwargs): func = self.__funcref() if func: func(*args, **kwargs) class TransactionContext(object): """Context Manager that manages transaction for object passed to constructor. Performs `rollback` if exception is thrown inside code block, otherwise performs `commit` at the end of block. Example:: with TransactionContext(my_transaction): cursor.execute('insert into tableA (x,y) values (?,?)',(x,y)) cursor.execute('insert into tableB (x,y) values (?,?)',(x,y)) """ #: Transaction-like object this instance manages. transaction = None def __init__(self,transaction): """ :param transaction: Any object that supports `begin()`, `commit()` and `rollback()`. """ self.transaction = transaction def __enter__(self): self.transaction.begin() return self.transaction def __exit__(self, exc_type, exc_val, exc_tb): if exc_type == None: self.transaction.commit() else: self.transaction.rollback() class Connection(object): """ Represents a connection between the database client (the Python process) and the database server. .. important:: DO NOT create instances of this class directly! Use only :func:`connect` or :func:`create_database` to get Connection instances. """ # PEP 249 (Python DB API 2.0) extensions Warning = Warning Error = Error InterfaceError = InterfaceError DatabaseError = DatabaseError DataError = DataError OperationalError = OperationalError IntegrityError = IntegrityError InternalError = InternalError ProgrammingError = ProgrammingError NotSupportedError = NotSupportedError #: (integer) sql_dialect for this connection, do not change. sql_dialect = 3 def __init__(self, db_handle, dpb=None, sql_dialect=3, charset=None, isolation_level=ISOLATION_LEVEL_READ_COMMITED): """ :param db_handle: Database handle provided by factory function. :param dpb: Database Parameter Block associated with database handle. :param integer sql_dialect: SQL Dialect associated with database handle. :param string charset: Character set associated with database handle. """ if charset: self.__charset = charset.upper() else: self.__charset = None self._python_charset = charset_map.get(self.charset, self.charset) self._default_tpb = isolation_level # Main transaction self._main_transaction = Transaction([self], default_tpb=self._default_tpb) # ReadOnly ReadCommitted transaction self._query_transaction = Transaction([self], default_tpb=ISOLATION_LEVEL_READ_COMMITED_RO) self._transactions = [self._main_transaction,self._query_transaction] self.__precision_cache = {} self.__sqlsubtype_cache = {} self.__conduits = [] self.__group = None self.__schema = None self.__monitor = None self.__ods = None # (integer) sql_dialect for this connection, do not change. self.sql_dialect = sql_dialect self._dpb = dpb self._isc_status = ISC_STATUS_ARRAY() self._db_handle = db_handle # Cursor for internal use self.__ic = self.query_transaction.cursor() self.__ic._set_as_internal() # Get Firebird engine version verstr = self.db_info([isc_info_firebird_version])[isc_info_firebird_version] x = verstr.split() if x[0].find('V') > 0: (x,self.__version) = x[0].split('V') elif x[0].find('T') > 0: (x,self.__version) = x[0].split('T') else: # Unknown version self.__version = '0.0.0.0' x = self.__version.split('.') self.__engine_version = float('%s.%s' % (x[0],x[1])) def __remove_group(self, group_ref): self.__group = None def __ensure_group_membership(self, must_be_member, err_msg): if must_be_member: if self.group is None: raise ProgrammingError(err_msg) else: if self.group is not None: raise ProgrammingError(err_msg) def __check_attached(self): if self._db_handle == None: raise ProgrammingError("Connection object is detached from database") def __close(self, detach=True): if self._db_handle != None: if self.__schema: self.__schema._close() if self.__monitor: self.__monitor._close() self.__ic.close() del self.__ic try: for conduit in self.__conduits: conduit.close() for transaction in self._transactions: transaction.default_action = 'rollback' # Required by Python DB API 2.0 transaction.close() if detach: api.isc_detach_database(self._isc_status, self._db_handle) finally: self._db_handle = None def __get_main_transaction(self): return self._main_transaction def __get_query_transaction(self): return self._query_transaction def __get_transactions(self): return tuple(self._transactions) def __get_closed(self): return self._db_handle == None def __get_server_version(self): return self.db_info([isc_info_version])[isc_info_version] def __get_firebird_version(self): return self.db_info([isc_info_firebird_version])[isc_info_firebird_version] def __get_version(self): return self.__version def __get_engine_version(self): return self.__engine_version def __get_default_tpb(self): return self._default_tpb def __set_default_tpb(self, value): self._default_tpb = _validateTPB(value) def __get_charset(self): return self.__charset def __set_charset(self, value): # More informative error message: raise AttributeError("A connection's 'charset' property can be" " specified upon Connection creation as a keyword argument to" " fdb.connect, but it cannot be modified thereafter." ) def __get_group(self): if self.__group: return self.__group() else: return None def __get_ods(self): if not self.__ods: raw = self.db_info([ibase.isc_info_ods_version, ibase.isc_info_ods_minor_version]) self.__ods = float('%d.%d' % (raw[ibase.isc_info_ods_version], raw[ibase.isc_info_ods_minor_version])) return self.__ods def __parse_date(self, raw_value): "Convert raw data to datetime.date" nday = bytes_to_int(raw_value) + 678882 century = (4 * nday - 1) // 146097 nday = 4 * nday - 1 - 146097 * century day = nday // 4 nday = (4 * day + 3) // 1461 day = 4 * day + 3 - 1461 * nday day = (day + 4) // 4 month = (5 * day - 3) // 153 day = 5 * day - 3 - 153 * month day = (day + 5) // 5 year = 100 * century + nday if month < 10: month += 3 else: month -= 9 year += 1 return year, month, day def __parse_time(self, raw_value): "Convert raw data to datetime.time" n = bytes_to_int(raw_value) s = n // 10000 m = s // 60 h = m // 60 m = m % 60 s = s % 60 return (h, m, s, (n % 10000) * 100) def _get_schema(self): if not self.__schema: self.__schema = schema.Schema() self.__schema.bind(self) self.__schema._set_as_internal() return self.__schema def _get_monitor(self): if not self.__monitor: if self.ods >= ODS_FB_21: self.__monitor = monitor.Monitor() self.__monitor.bind(self) self.__monitor._set_as_internal() else: raise ProgrammingError("Monitoring tables are available only " \ "for databases with ODS 11.1 and higher.") return self.__monitor def _get_array_sqlsubtype(self, relation, column): subtype = self.__sqlsubtype_cache.get((relation,column)) if subtype is not None: return subtype self.__ic.execute("SELECT FIELD_SPEC.RDB$FIELD_SUB_TYPE" " FROM RDB$FIELDS FIELD_SPEC, RDB$RELATION_FIELDS REL_FIELDS" " WHERE" " FIELD_SPEC.RDB$FIELD_NAME = REL_FIELDS.RDB$FIELD_SOURCE" " AND REL_FIELDS.RDB$RELATION_NAME = ?" " AND REL_FIELDS.RDB$FIELD_NAME = ?", (p3fix(relation,self._python_charset), p3fix(column,self._python_charset))) result = self.__ic.fetchone() self.__ic.close() if result: self.__sqlsubtype_cache[(relation,column)] = result[0] return result[0] def _determine_field_precision(self, sqlvar): if sqlvar.relname_length == 0 or sqlvar.sqlname_length == 0: # Either or both field name and relation name are not provided, # so we cannot determine field precision. It's normal situation # for example for queries with dynamically computed fields return 0 # Special case for automatic RDB$DB_KEY fields. if ((sqlvar.sqlname_length == 6 and sqlvar.sqlname == 'DB_KEY') or (sqlvar.sqlname_length == 10 and sqlvar.sqlname == 'RDB$DB_KEY')): return 0 precision = self.__precision_cache.get((sqlvar.relname, sqlvar.sqlname)) if precision is not None: return precision # First, try table self.__ic.execute("SELECT FIELD_SPEC.RDB$FIELD_PRECISION" " FROM RDB$FIELDS FIELD_SPEC," " RDB$RELATION_FIELDS REL_FIELDS" " WHERE" " FIELD_SPEC.RDB$FIELD_NAME =" " REL_FIELDS.RDB$FIELD_SOURCE" " AND REL_FIELDS.RDB$RELATION_NAME = ?" " AND REL_FIELDS.RDB$FIELD_NAME = ?", (p3fix(sqlvar.relname,self._python_charset), p3fix(sqlvar.sqlname,self._python_charset))) result = self.__ic.fetchone() self.__ic.close() if result: self.__precision_cache[(sqlvar.relname,sqlvar.sqlname)] = result[0] return result[0] # Next, try stored procedure output parameter self.__ic.execute("SELECT FIELD_SPEC.RDB$FIELD_PRECISION" " FROM RDB$FIELDS FIELD_SPEC," " RDB$PROCEDURE_PARAMETERS REL_FIELDS" " WHERE" " FIELD_SPEC.RDB$FIELD_NAME =" " REL_FIELDS.RDB$FIELD_SOURCE" " AND RDB$PROCEDURE_NAME = ?" " AND RDB$PARAMETER_NAME = ?" " AND RDB$PARAMETER_TYPE = 1", (p3fix(sqlvar.relname,self._python_charset), p3fix(sqlvar.sqlname,self._python_charset))) result = self.__ic.fetchone() self.__ic.close() if result: self.__precision_cache[(sqlvar.relname,sqlvar.sqlname)] = result[0] return result[0] # We ran out of options return 0 def drop_database(self): """Drops the database to which this connection is attached. Unlike plain file deletion, this method behaves responsibly, in that it removes shadow files and other ancillary files for this database. :raises ProgrammingError: When connection is a member of a :class:`ConnectionGroup`. :raises DatabaseError: When error is returned from server. """ self.__ensure_group_membership(False, "Cannot drop database via" " connection that is part of a ConnectionGroup.") saved_handle = isc_db_handle(self._db_handle.value) self.__close(detach=False) api.isc_drop_database(self._isc_status, saved_handle) if db_api_error(self._isc_status): self._db_handle = saved_handle raise exception_from_status(DatabaseError, self._isc_status, "Error while dropping database:") def execute_immediate(self, sql): """Executes a statement in context of :attr:`main_transaction` without caching its prepared form. Automatically starts transaction if it's not already started. :param string sql: SQL statement to execute. .. important:: **The statement must not be of a type that returns a result set.** In most cases (especially cases in which the same statement – perhaps a parameterized statement – is executed repeatedly), it is better to create a cursor using the connection’s cursor method, then execute the statement using one of the cursor’s execute methods. :param string sql: SQL statement to execute. :raises ProgrammingError: When connection is closed. :raises DatabaseError: When error is returned from server. """ self.__check_attached() self.main_transaction.execute_immediate(sql) def database_info(self, info_code, result_type): """Wraps the Firebird C API function `isc_database_info`. For documentation, see the IB 6 API Guide section entitled "Requesting information about an attachment" (p. 51). Note that this method is a VERY THIN wrapper around the FB C API function `isc_database_info`. This method does NOT attempt to interpret its results except with regard to whether they are a string or an integer. For example, requesting `isc_info_user_names` will return a string containing a raw succession of length-name pairs. A thicker wrapper might interpret those raw results and return a Python tuple, but it would need to handle a multitude of special cases in order to cover all possible isc_info_* items. :param integer info_code: One of the `isc_info_*` constants. :param string result_type: Must be either ‘s’ if you expect a string result, or ‘i’ if you expect an integer result. :raises DatabaseError: When error is returned from server. :raises OperationalError: When returned information is bigger than SHRT_MAX. :raises InternalError: On unexpected processing condition. :raises ValueError: On illegal `result_type` value. .. seealso:: Extracting data with the database_info function is rather clumsy. See :meth:`db_info` for higher-level means of accessing the same information. .. note:: Some of the information available through this method would be more easily retrieved with the Services API (see submodule :mod:`fdb.services`). """ self.__check_attached() request_buffer = bs([info_code]) buf_size = 256 while True: res_buf = int2byte(0) * buf_size api.isc_database_info(self._isc_status, self._db_handle, len(request_buffer), request_buffer, len(res_buf), res_buf) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Error while requesting database information:") i = buf_size - 1 while i >= 0: if res_buf[i] != mychr(0): break else: i -= 1 if ord2(res_buf[i]) == isc_info_truncated: if buf_size < SHRT_MAX: buf_size *= 2 if buf_size > SHRT_MAX: buf_size = SHRT_MAX continue else: raise OperationalError("Result is too large to fit into" " buffer of size SHRT_MAX, yet underlying info " " function only accepts buffers with size <= SHRT_MAX.") else: break if ord2(res_buf[i]) != isc_info_end: raise InternalError("Exited request loop sucessfuly, but" " res_buf[i] != sc_info_end.") if request_buffer[0] != res_buf[0]: raise InternalError("Result code does not match request code.") if result_type.upper() == 'I': return bytes_to_int(res_buf[3:3 + bytes_to_int(res_buf[1:3])]) elif (result_type.upper() == 'S' and info_code not in _DATABASE_INFO__KNOWN_LOW_LEVEL_EXCEPTIONS): # The result buffers for a few request codes don't follow the generic # conventions, so we need to return their full contents rather than # omitting the initial infrastructural bytes. return ctypes.string_at(res_buf[3:], i - 3) elif result_type.upper() == 'S': return ctypes.string_at(res_buf, i) else: raise ValueError("Unknown result type requested " "(must be 'i' or 's').") def db_info(self, request): """ Higher-level convenience wrapper around the :meth:`database_info` method that parses the output of `database_info` into Python-friendly objects instead of returning raw binary buffers in the case of complex result types. :param request: Single `fdb.isc_info_*` info request code or a sequence of such codes. :returns: Mapping of (info request code -> result). :raises ValueError: When requested code is not recognized. :raises OperationalError: On unexpected processing condition. """ def _extractDatabaseInfoCounts(buf): # Extract a raw binary sequence # of (unsigned short, signed int) pairs into # a corresponding Python dictionary. uShortSize = struct.calcsize(' number of connections by that user. res = {} for un in usernames: res[un] = res.get(un, 0) + 1 results[infoCode] = res elif infoCode in _DATABASE_INFO_CODES_WITH_INT_RESULT: results[infoCode] = self.database_info(infoCode, 'i') elif infoCode in _DATABASE_INFO_CODES_WITH_COUNT_RESULTS: buf = self.database_info(infoCode, 's') countsByRelId = _extractDatabaseInfoCounts(buf) # Decided not to convert the relation IDs to relation names # for two reasons: # 1) Performance + Principle of Least Surprise # If the client program is trying to do some delicate # performance measurements, it's not helpful for # kinterbasdb to be issuing unexpected queries behind the # scenes. # 2) Field RDB$RELATIONS.RDB$RELATION_NAME is a CHAR field, # which means its values emerge from the database with # trailing whitespace, yet it's not safe in general to # strip that whitespace because actual relation names can # have trailing whitespace (think # 'create table "table1 " (f1 int)'). results[infoCode] = countsByRelId elif infoCode in _DATABASE_INFO_CODES_WITH_TIMESTAMP_RESULT: buf = self.database_info(infoCode, 's') yyyy, mm, dd = self.__parse_date(buf[:4]) h, m, s, ms = self.__parse_time(buf[4:]) results[infoCode] = datetime.datetime(yyyy, mm, dd, h, m, s, ms) else: raise ValueError('Unrecognized database info code %s' % str(infoCode)) if requestIsSingleton: return results[request[0]] else: return results def transaction_info(self, info_code, result_type): """Returns information about active transaction. Thin wrapper around Firebird API `isc_transaction_info` call. Operates on :attr:`main_transaction`. See :meth:`Transaction.transaction_info` for details. :param integer info_code: One from next constants: * isc_info_tra_id * isc_info_tra_oldest_interesting * isc_info_tra_oldest_snapshot * isc_info_tra_oldest_active * isc_info_tra_isolation * isc_info_tra_access * isc_info_tra_lock_timeout See Firebird API Guide for details. :param string result_type: String code for result type: * ‘i’ for Integer * ‘s’ fro String :returns: Decoded response(s) for specified request code(s). When multiple requests are passed, returns a dictionary where key is the request code and value is the response from server. :raises ProgrammingError: When transaction is not active. :raises OperationalError: When result is too large to fit into buffer of size SHRT_MAX. :raises InternalError: On unexpected processing condition. :raises ValueError: On illegal result_type value. """ return self._main_transaction.transaction_info(info_code, result_type) def trans_info(self, request): """Pythonic wrapper around :meth:`transaction_info()` call. Operates on :attr:`main_transaction`. See :meth:`Transaction.trans_info` for details. :param request: One or more information request codes (see :meth:`transaction_info` for details). Multiple codes must be passed as tuple. :returns: Decoded response(s) for specified request code(s). When multiple requests are passed, returns a dictionary where key is the request code and value is the response from server. :raises ProgrammingError: When transaction is not active. :raises OperationalError: When result is too large to fit into buffer of size SHRT_MAX. :raises InternalError: On unexpected processing condition. """ return self._main_transaction.trans_info(request) def trans(self, default_tpb=None): """Creates a new :class:`Transaction` that operates within the context of this connection. Cursors can be created within that Transaction via its :meth:`~Transaction.cursor()` method. :param default_tpb: (optional) Transaction Parameter Block for newly created Transaction. If not specified, :attr:`default_tpb` is used. :type default_tpb: :class:`TPB` instance, list/tuple of `isc_tpb_*` constants or `bytestring` :raises ProgrammingError: If Connection is :attr:`closed`. """ self.__check_attached() if default_tpb: _tpb = default_tpb else: _tpb = self._default_tpb transaction = Transaction([self], default_tpb =_tpb) self._transactions.append(transaction) return transaction def close(self): """Close the connection now (rather than whenever `__del__` is called). The connection will be unusable from this point forward; an :exc:`Error` (or subclass) exception will be raised if any operation is attempted with the connection. The same applies to all cursor and transaction objects trying to use the connection. Also closes all :class:`EventConduit`, :class:`Cursor` and :class:`Transaction` instances associated with this connection. :raises ProgrammingError: When connection is a member of a :class:`ConnectionGroup`. """ self.__ensure_group_membership(False, "Cannot close a connection that" " is a member of a ConnectionGroup.") self.__close() def begin(self, tpb=None): """Starts a transaction explicitly. Operates on :attr:`main_transaction`. See :meth:`Transaction.begin` for details. :param tpb: (Optional) Transaction Parameter Buffer for newly started transaction. If not specified, :attr:`default_tpb` is used. :type tpb: :class:`TPB` instance, list/tuple of `isc_tpb_*` constants or `bytestring` """ self.__check_attached() self._main_transaction.begin(tpb) def savepoint(self, name): """Establishes a named SAVEPOINT for current transaction. Operates on :attr:`main_transaction`. See :meth:`Transaction.savepoint` for details. :param string name: Name for savepoint. :raises ProgrammingError: If Connection is :attr:`closed`. Example: .. code-block:: python con.savepoint('BEGINNING_OF_SOME_SUBTASK') ... con.rollback(savepoint='BEGINNING_OF_SOME_SUBTASK') """ self.__check_attached() return self._main_transaction.savepoint(name) def commit(self, retaining=False): """Commit pending transaction to the database. Operates on :attr:`main_transaction`. See :meth:`Transaction.commit` for details. :param boolean retaining: (Optional) Indicates whether the transactional context of the transaction being resolved should be recycled. :raises ProgrammingError: If Connection is :attr:`closed`. """ self.__check_attached() self._main_transaction.commit(retaining) def rollback(self, retaining=False, savepoint=None): """Causes the the database to roll back to the start of pending transaction. Operates on :attr:`main_transaction`. See :meth:`Transaction.rollback` for details. :param boolean retaining: (Optional) Indicates whether the transactional context of the transaction being resolved should be recycled. :param string savepoint: (Optional) Causes the transaction to roll back only as far as the designated savepoint, rather than rolling back entirely. :raises ProgrammingError: If Connection is :attr:`closed`. """ self.__check_attached() self._main_transaction.rollback(retaining, savepoint) def cursor(self): """Return a new :class:`Cursor` instance using the connection associated with :attr:`main_transaction`. See :meth:`Transaction.cursor` for details. :raises ProgrammingError: If Connection is :attr:`closed`. """ self.__check_attached() return self.main_transaction.cursor() def event_conduit(self,event_names): """Creates a conduit through which database event notifications will flow into the Python program. :param event_names: A sequence of string event names. :returns: An :class:`EventConduit` instance. """ conduit = EventConduit(self._db_handle,event_names) self.__conduits.append(conduit) return conduit def __del__(self): if self._db_handle != None: self.__close() def _set_group(self, group): # This package-private method allows ConnectionGroup's membership # management functionality to bypass the conceptually read-only nature # of the Connection.group property. if group: self.__group = weakref.ref(group, _weakref_callback(self.__remove_group)) else: self.__group = None #: (Read Only) :class:`ConnectionGroup` this Connection belongs to, or None. group = property(__get_group) #: (Read Only) (string) Connection Character set name. charset = property(__get_charset, __set_charset) #: (Read Only) (tuple) :class:`Transaction` instances associated with this connection. transactions = property(__get_transactions) #: (Read Only) Main :class:`Transaction` instance for this connection #: Connection methods :meth:`begin`, :meth:`savepoint`, :meth:`commit` and #: :meth:`rollback` are delegated to this transaction object. main_transaction = property(__get_main_transaction) #: (Read Only) Special "query" :class:`Transaction` instance for this connection. #: This is ReadOnly ReadCommitted transaction that could be active indefinitely #: without blocking garbage collection. It's used internally to query metadata, #: but it's generally useful. query_transaction = property(__get_query_transaction) #: (Read/Write) Deafult Transaction Parameter Block used for all newly started transactions. default_tpb = property(__get_default_tpb, __set_default_tpb) #: (Read Only) True if connection is closed. closed = property(__get_closed) #: (Read Only) (string) Version string returned by server for this connection. #: This version string contains InterBase-friendly engine version number, i.e. #: version that takes into account inherited IB version number. #: For example it's 'LI-V6.3.2.26540 Firebird 2.5' for Firebird 2.5.2 server_version = property(__get_server_version) #: (Read Only) (string) Version string returned by server for this connection. #: This version string contains Firebird engine version number, i.e. #: version that DOES NOT takes into account inherited IB version number. #: For example it's 'LI-V2.5.2.26540 Firebird 2.5' for Firebird 2.5.2 firebird_version = property(__get_firebird_version) #: (Read Only) (string) Firebird version number string of connected server. #: Uses Firebird version numbers in form: major.minor.subrelease.build version = property(__get_version) #: (Read Only) (float) Firebird version number of connected server. Only major.minor version. engine_version = property(__get_engine_version) #: (Read Only) (:class:`~fdb.schema.Schema`) Database metadata object. schema = utils.LateBindingProperty(_get_schema) #: (Read Only) (float) On-Disk Structure (ODS) version. ods = property(__get_ods) #: (Read Only) (:class:`~fdb.monitor.Monitor`) Database monitoring object. monitor = utils.LateBindingProperty(_get_monitor) @utils.embed_attributes(schema.Schema,'schema') class ConnectionWithSchema(Connection): """:class:`Connection` descendant that exposes all attributes of encapsulated :class:`~fdb.schema.Schema` instance directly as connection attributes, except :meth:`~fdb.schema.Schema.close` and :meth:`~fdb.schema.Schema.bind`, and those attributes that are already defined by Connection class. .. note:: Use `connection_class` parametr of :func:`connect` or :func:`create_database` to create connections with direct schema interface. """ def __init__(self, db_handle, dpb=None, sql_dialect=3, charset=None, isolation_level=ISOLATION_LEVEL_READ_COMMITED): super(ConnectionWithSchema,self).__init__(db_handle,dpb,sql_dialect,charset, isolation_level) self.__schema = schema.Schema() self.__schema.bind(self) self.__schema._set_as_internal() # Injecting callables bound to embedded Schema instance for attr in dir(self.__schema): if not (attr.find('__') >= 0 or attr.startswith('_') or attr in ['close','bind'] or hasattr(self,attr)): val = getattr(self.__schema,attr) if callable(val): setattr(self,attr,val) def _get_schema(self): return self.__schema class EventBlock(object): """Represents Firebird API structure for block of events. .. warning: Internaly used class not intended for direct use. """ #: List of registered event names event_names = [] #: length of internal event buffer buf_length = 0 #: Event ID event_id = 0 #: Event buffer event_buf = None #: Result buffer result_buf = None def __init__(self,queue,db_handle,event_names): self.__first = True def callback(result, length, updated): ctypes.memmove(result, updated, length) self.__queue.put((ibase.OP_RECORD_AND_REREGISTER, self)) return 0 self.__queue = weakref.proxy(queue) self._db_handle = db_handle self._isc_status = ISC_STATUS_ARRAY(0) self.event_names = list(event_names) self.__results = RESULT_VECTOR(0) self.__closed = False self.__callback = ISC_EVENT_CALLBACK(callback) self.event_buf = ctypes.pointer(ISC_UCHAR(0)) self.result_buf = ctypes.pointer(ISC_UCHAR(0)) self.buf_length = 0 self.event_id = ISC_LONG(0) self.buf_length = api.isc_event_block(ctypes.pointer(self.event_buf), ctypes.pointer(self.result_buf), *[b(x) for x in event_names]) def _begin(self): self.__wait_for_events() def __lt__(self,other): return self.event_id.value < other.event_id.value def __wait_for_events(self): api.isc_que_events(self._isc_status,self._db_handle,self.event_id, self.buf_length,self.event_buf, self.__callback,self.result_buf) if db_api_error(self._isc_status): self.close() raise exception_from_status(DatabaseError, self._isc_status, "Error while waiting for events:") def count_and_reregister(self): "Count event occurences and reregister interest in futrther notifications." result = {} api.isc_event_counts(self.__results, self.buf_length, self.event_buf, self.result_buf) if self.__first: # Ignore the first call, it's for setting up the table self.__first = False self.__wait_for_events() return None for i in xrange(len(self.event_names)): result[self.event_names[i]] = int(self.__results[i]) self.__wait_for_events() return result def close(self): "Close this block canceling managed events." if not self.closed: api.isc_cancel_events(self._isc_status,self._db_handle,self.event_id) self.__closed = True del self.__callback if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Error while canceling events:") def __get_closed(self): return self.__closed def __del__(self): self.close() #: (ReadOnly) True if block is closed for business closed = property(__get_closed) class EventConduit(object): """Represents a conduit through which database event notifications will flow into the Python program. .. important:: DO NOT create instances of this class directly! Use only :meth:`Connection.event_conduit` to get EventConduit instances. Notifications of any events are not accumulated until :meth:`begin` method is called. From the moment the :meth:`begin` method is called, notifications of any events that occur will accumulate asynchronously within the conduit’s internal queue until the conduit is closed either explicitly (via the :meth:`close` method) or implicitly (via garbage collection). `EventConduit` implements context manager protocol to call method :meth:`begin` and :meth:`close` automatically. Example: .. code-block:: python with connection.event_conduit( ('event_a', 'event_b') ) as conduit: events = conduit.wait() process_events(events) """ def __init__(self,db_handle,event_names): """ :param db_handle: Database handle. :param event_names: List of strings that represent event names. """ self._db_handle = db_handle self._isc_status = ISC_STATUS_ARRAY(0) self.__event_names = list(event_names) self.__events = {}.fromkeys(self.__event_names,0) self.__event_blocks = [] self.__closed = False self.__queue = ibase.PriorityQueue() self.__events_ready = threading.Event() self.__blocks = [[x for x in y if x] for y in izip_longest(*[iter(event_names)]*15)] self.__initialized = False def __enter__(self): self.begin() return self def __exit__(self, exc_type, exc_val, exc_tb): self.close() def begin(self): """Starts listening for events. Must be called directly or through context manager interface.""" def event_process(queue): while True: operation, data = queue.get() if operation == ibase.OP_RECORD_AND_REREGISTER: events = data.count_and_reregister() if events: for key,value in events.items(): self.__events[key] += value self.__events_ready.set() elif operation == ibase.OP_DIE: return self.__initialized = True self.__process_thread = threading.Thread(target=event_process, args=(self.__queue,)) self.__process_thread.start() for block_events in self.__blocks: event_block = EventBlock(self.__queue, self._db_handle, block_events) self.__event_blocks.append(event_block) event_block._begin() def wait(self,timeout=None): """Wait for events. Blocks the calling thread until at least one of the events occurs, or the specified timeout (if any) expires. :param timeout: Number of seconds (use a float to indicate fractions of seconds). If not even one of the relevant events has occurred after timeout seconds, this method will unblock and return None. The default timeout is infinite. :type timeout: integer or float :returns: `None` if the wait timed out, otherwise a dictionary that maps `event_name -> event_occurrence_count`. Example: .. code-block:: python >>>conduit = connection.event_conduit( ('event_a', 'event_b') ) >>>conduit.begin() >>>conduit.wait() { 'event_a': 1, 'event_b': 0 } In the example above `event_a` occurred once and `event_b` did not occur at all. """ if not self.__initialized: raise ProgrammingError("Event collection not initialized. It's necessary to call begin().") if not self.closed: self.__events_ready.wait(timeout) return self.__events.copy() def flush(self): """Clear any event notifications that have accumulated in the conduit’s internal queue. """ if not self.closed: self.__events_ready.clear() self.__events = {}.fromkeys(self.__event_names,0) def close(self): """Cancels the standing request for this conduit to be notified of events. After this method has been called, this EventConduit object is useless, and should be discarded. """ if not self.closed: self.__queue.put((ibase.OP_DIE,self)) self.__process_thread.join() for block in self.__event_blocks: block.close() self.__closed = True def __get_closed(self): return self.__closed def __del__(self): self.close() #: (Read Only) (boolean) True if conduit is closed. closed = property(__get_closed) class PreparedStatement(object): """Represents a prepared statement, an "inner" database cursor, which is used to manage the SQL statement execution and context of a fetch operation. .. important:: DO NOT create instances of this class directly! Use only :meth:`Cursor.prep` to get PreparedStatement instances. .. note:: PreparedStatements are bound to :class:`Cursor` instance that created them, and using them with other Cursor would report an error. """ #: Constant for internal use by this class. Do not change! RESULT_SET_EXHAUSTED = 100 #: Constant for internal use by this class. Do not change! NO_FETCH_ATTEMPTED_YET = -1 #: :class:`Cursor` instance that manages this PreparedStatement. Do not change! cursor = None #: (integer) An integer code that can be matched against the statement #: type constants in the isc_info_sql_stmt_* series. Do not change! statement_type = 0 #: The number of input parameters the statement requires. Do not change! n_input_params = 0 #: The number of output fields the statement produces. Do not change! n_output_params = 0 def __init__(self, operation, cursor, internal=True): self.__sql = operation self.__internal = internal if internal: self.cursor = weakref.proxy(cursor, _weakref_callback(self.__cursor_deleted)) else: self.cursor = cursor self._stmt_handle = None self._isc_status = ISC_STATUS_ARRAY() # Internal XSQLDA structure for output values. self._out_sqlda = xsqlda_factory(10) # Internal XSQLDA structure for input values. self._in_sqlda = xsqlda_factory(10) # Internal list to save original input SQLDA structures when they has # to temporarily augmented. self._in_sqlda_save = [] # (integer) An integer code that can be matched against the statement # type constants in the isc_info_sql_stmt_* series. self.statement_type = None self.__streamed_blobs = [] self.__blob_readers = [] self.__executed = False self.__prepared = False self.__closed = False self.__description = None self.__output_cache = None self._last_fetch_status = ISC_STATUS(self.NO_FETCH_ATTEMPTED_YET) connection = self.cursor._connection self.__charset = connection.charset self.__python_charset = connection._python_charset self.__sql_dialect = connection.sql_dialect # allocate statement handle self._stmt_handle = isc_stmt_handle(0) api.isc_dsql_allocate_statement(self._isc_status, connection._db_handle, self._stmt_handle) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Error while allocating SQL statement:") # prepare statement op = b(operation,self.__python_charset) api.isc_dsql_prepare(self._isc_status, self.cursor._transaction._tr_handle, self._stmt_handle, len(op),op, self.__sql_dialect, ctypes.cast(ctypes.pointer(self._out_sqlda), XSQLDA_PTR)) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Error while preparing SQL statement:") # Determine statement type info = b(' ') * 20 api.isc_dsql_sql_info(self._isc_status, self._stmt_handle, 1, bs([isc_info_sql_stmt_type]), len(info), info) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Error while determining SQL statement type:") if ord2(info[0]) != isc_info_sql_stmt_type: raise InternalError("Cursor.execute, determine statement type:\n" "first byte must be 'isc_info_sql_stmt_type'") self.statement_type = bytes_to_int(info[3:3 + bytes_to_int(info[1:3])]) # Init XSQLDA for input parameters api.isc_dsql_describe_bind(self._isc_status, self._stmt_handle, self.__sql_dialect, ctypes.cast(ctypes.pointer(self._in_sqlda), XSQLDA_PTR)) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Error while determining SQL statement parameters:") if self._in_sqlda.sqld > self._in_sqlda.sqln: self._in_sqlda = xsqlda_factory(self._in_sqlda.sqld) api.isc_dsql_describe_bind(self._isc_status, self._stmt_handle, self.__sql_dialect, ctypes.cast(ctypes.pointer(self._in_sqlda), XSQLDA_PTR)) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Error while determining SQL statement parameters:") # The number of input parameters the statement requires. self.n_input_params = self._in_sqlda.sqld # record original type and size information so it can be restored for # subsequent executions (mind the implicit string conversions!) for sqlvar in self._in_sqlda.sqlvar[:self.n_input_params]: self._in_sqlda_save.append((sqlvar.sqltype, sqlvar.sqllen)) # Init output XSQLDA api.isc_dsql_describe(self._isc_status, self._stmt_handle, self.__sql_dialect, ctypes.cast(ctypes.pointer(self._out_sqlda), XSQLDA_PTR)) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Error while determining SQL statement output:") if self._out_sqlda.sqld > self._out_sqlda.sqln: self._out_sqlda = xsqlda_factory(self._out_sqlda.sqld) api.isc_dsql_describe(self._isc_status, self._stmt_handle, self.__sql_dialect, ctypes.cast(ctypes.pointer(self._out_sqlda), XSQLDA_PTR)) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Error while determining SQL statement output:") # The number of output fields the statement produces. self.n_output_params = self._out_sqlda.sqld self.__coerce_XSQLDA(self._out_sqlda) self.__prepared = True self._name = None def __cursor_deleted(self,obj): self.cursor = None def __get_name(self): return self._name def __set_name(self,name): if self._name: raise ProgrammingError("Cursor's name has already been declared") self._set_cursor_name(name) def __get_closed(self): return self.__closed def __get_plan(self): buf_size = 256 while True: info = b(' ') * buf_size api.isc_dsql_sql_info(self._isc_status, self._stmt_handle, 2, bs([isc_info_sql_get_plan,isc_info_end]), len(info), info) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Error while determining rowcount:") if ord2(info[0]) == isc_info_truncated: if buf_size < SHRT_MAX: buf_size *= 2 if buf_size > SHRT_MAX: buf_size = SHRT_MAX continue else: return "Plan is too big" else: break if ord2(info[0]) == isc_info_end: return None if ord2(info[0]) != isc_info_sql_get_plan: raise IndentationError("Unexpected code in result buffer while" " querying SQL plan.") size = bytes_to_uint(info[1:_SIZE_OF_SHORT + 1]) # Skip first byte: a new line ### Todo: Better handling of P version specifics result = ctypes.string_at(info[_SIZE_OF_SHORT + 2:], size - 1) if PYTHON_MAJOR_VER == 3: return b2u(result,self.__python_charset) #return result.decode(charset_map.get(self.__charset,self.__charset)) else: return result def __get_sql(self): return self.__sql def __is_fixed_point(self, dialect, data_type, subtype, scale): return ((data_type in [SQL_SHORT, SQL_LONG, SQL_INT64] and (subtype or scale) ) or ((dialect < 3) and scale and (data_type in [SQL_DOUBLE, SQL_D_FLOAT])) ) def __get_external_data_type_name(self, dialect, data_type, subtype, scale): if data_type == SQL_TEXT: return 'CHAR' elif data_type == SQL_VARYING: return 'VARCHAR' elif self.__is_fixed_point(dialect, data_type, subtype, scale): if subtype == SUBTYPE_NUMERIC: return 'NUMERIC' elif subtype == SUBTYPE_DECIMAL: return 'DECIMAL' else: return 'NUMERIC/DECIMAL' elif data_type == SQL_SHORT: return 'SMALLINT' elif data_type == SQL_LONG: return 'INTEGER' elif data_type == SQL_INT64: return 'BIGINT' elif data_type == SQL_FLOAT: return 'FLOAT' elif data_type in [SQL_DOUBLE, SQL_D_FLOAT]: return 'DOUBLE' elif data_type == SQL_TIMESTAMP: return 'TIMESTAMP' elif data_type == SQL_TYPE_DATE: return 'DATE' elif data_type == SQL_TYPE_TIME: return 'TIME' elif data_type == SQL_BLOB: return 'BLOB' else: return 'UNKNOWN' def __get_internal_data_type_name(self, data_type): if data_type == SQL_TEXT: return 'SQL_TEXT' elif data_type == SQL_VARYING: return 'SQL_VARYING' elif data_type == SQL_SHORT: return 'SQL_SHORT' elif data_type == SQL_LONG: return 'SQL_LONG' elif data_type == SQL_INT64: return 'SQL_INT64' elif data_type == SQL_FLOAT: return 'SQL_FLOAT' elif data_type in [SQL_DOUBLE, SQL_D_FLOAT]: return 'SQL_DOUBLE' elif data_type == SQL_TIMESTAMP: return 'SQL_TIMESTAMP' elif data_type == SQL_TYPE_DATE: return 'SQL_TYPE_DATE' elif data_type == SQL_TYPE_TIME: return 'SQL_TYPE_TIME' elif data_type == SQL_BLOB: return 'SQL_BLOB' else: return 'UNKNOWN' def __get_description(self): if not self.__description: desc = [] if self.__prepared and (self._out_sqlda.sqld > 0): for sqlvar in self._out_sqlda.sqlvar[:self._out_sqlda.sqld]: # Field name (or alias) sqlname = p3fix(sqlvar.sqlname[:sqlvar.sqlname_length], self.__python_charset) alias = p3fix(sqlvar.aliasname[:sqlvar.aliasname_length], self.__python_charset) if alias != sqlname: sqlname = alias # Type information intsize = sqlvar.sqllen vartype = sqlvar.sqltype & ~1 scale = sqlvar.sqlscale precision = 0 if vartype in [SQL_TEXT, SQL_VARYING]: vtype = StringType dispsize = sqlvar.sqllen elif (vartype in [SQL_SHORT, SQL_LONG, SQL_INT64] and (sqlvar.sqlsubtype or scale)): vtype = decimal.Decimal precision = (self.cursor._connection._determine_field_precision(sqlvar)) dispsize = 20 elif vartype == SQL_SHORT: vtype = IntType dispsize = 6 elif vartype == SQL_LONG: vtype = IntType dispsize = 11 elif vartype == SQL_INT64: vtype = LongType dispsize = 20 elif vartype in [SQL_FLOAT, SQL_DOUBLE, SQL_D_FLOAT]: # Special case, dialect 1 DOUBLE/FLOAT # could be Fixed point if (self.__sql_dialect < 3) and scale: vtype = decimal.Decimal precision = (self.cursor._connection._determine_field_precision(sqlvar)) else: vtype = FloatType dispsize = 17 elif vartype == SQL_BLOB: scale = sqlvar.sqlsubtype vtype = StringType dispsize = 0 elif vartype == SQL_TIMESTAMP: vtype = datetime.datetime dispsize = 22 elif vartype == SQL_TYPE_DATE: vtype = datetime.date dispsize = 10 elif vartype == SQL_TYPE_TIME: vtype = datetime.time dispsize = 11 elif vartype == SQL_ARRAY: vtype = ListType dispsize = -1 else: vtype = None dispsize = -1 desc.append(tuple([sqlname, vtype, dispsize, intsize, precision, scale, bool(sqlvar.sqltype & 1)])) self.__description = tuple(desc) return self.__description def __get_rowcount(self): result = -1 if (self.__executed and self.statement_type in [isc_info_sql_stmt_select, isc_info_sql_stmt_insert, isc_info_sql_stmt_update, isc_info_sql_stmt_delete]): info = b(' ') * 64 api.isc_dsql_sql_info(self._isc_status, self._stmt_handle, 2, bs([isc_info_sql_records, isc_info_end]), len(info), info) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Error while determining rowcount:") if ord2(info[0]) != isc_info_sql_records: raise InternalError("Cursor.get_rowcount:\n" "first byte must be 'isc_info_sql_records'") res_walk = 3 short_size = ctypes.sizeof(ctypes.c_short) while ord2(info[res_walk]) != isc_info_end: cur_count_type = ord2(info[res_walk]) res_walk += 1 size = bytes_to_uint(info[res_walk:res_walk + short_size]) res_walk += short_size count = bytes_to_uint(info[res_walk:res_walk + size]) if ((cur_count_type == isc_info_req_select_count and self.statement_type == isc_info_sql_stmt_select) or (cur_count_type == isc_info_req_insert_count and self.statement_type == isc_info_sql_stmt_insert) or (cur_count_type == isc_info_req_update_count and self.statement_type == isc_info_sql_stmt_update) or (cur_count_type == isc_info_req_delete_count and self.statement_type == isc_info_sql_stmt_delete) ): result = count res_walk += size return result def _parse_date(self, raw_value): "Convert raw data to datetime.date" nday = bytes_to_int(raw_value) + 678882 century = (4 * nday - 1) // 146097 nday = 4 * nday - 1 - 146097 * century day = nday // 4 nday = (4 * day + 3) // 1461 day = 4 * day + 3 - 1461 * nday day = (day + 4) // 4 month = (5 * day - 3) // 153 day = 5 * day - 3 - 153 * month day = (day + 5) // 5 year = 100 * century + nday if month < 10: month += 3 else: month -= 9 year += 1 return year, month, day def _parse_time(self, raw_value): "Convert raw data to datetime.time" n = bytes_to_int(raw_value) s = n // 10000 m = s // 60 h = m // 60 m = m % 60 s = s % 60 return (h, m, s, (n % 10000) * 100) def _convert_date(self, v): # Convert datetime.date to BLR format data i = v.month + 9 jy = v.year + (i // 12) - 1 jm = i % 12 c = jy // 100 jy -= 100 * c j = ((146097 * c) // 4 + (1461 * jy) // 4 + (153 * jm + 2) // 5 + v.day - 678882) return int_to_bytes(j, 4) def _convert_time(self, v): # Convert datetime.time to BLR format time t = ((v.hour * 3600 + v.minute * 60 + v.second) * 10000 + v.microsecond // 100) return int_to_bytes(t, 4) def _convert_timestamp(self, v): # Convert datetime.datetime or datetime.date # to BLR format timestamp if isinstance(v, datetime.datetime): return self._convert_date(v.date()) + self._convert_time(v.time()) elif isinstance(v, datetime.date): return self._convert_date(v) + self._convert_time(datetime.time()) else: raise ValueError("datetime.datetime or datetime.date expected") def _check_integer_range(self, value, dialect, data_type, subtype, scale): if data_type == SQL_SHORT: vmin = SHRT_MIN vmax = SHRT_MAX elif data_type == SQL_LONG: vmin = INT_MIN vmax = INT_MAX elif data_type == SQL_INT64: vmin = LONG_MIN vmax = LONG_MAX if (value < vmin) or (value > vmax): msg = """numeric overflow: value %s (%s scaled for %d decimal places) is of too great a magnitude to fit into its internal storage type %s, which has range [%s,%s].""" % (str(value), self.__get_external_data_type_name(dialect, data_type, subtype, scale), scale, self.__get_internal_data_type_name(data_type), str(vmin), str(vmax)) raise ProgrammingError(msg, -802) def __coerce_XSQLDA(self, xsqlda): """Allocate space for SQLVAR data. """ for sqlvar in xsqlda.sqlvar[:self._out_sqlda.sqld]: if sqlvar.sqltype & 1: sqlvar.sqlind = ctypes.pointer(ISC_SHORT(0)) vartype = sqlvar.sqltype & ~1 if vartype in [SQL_TEXT, SQL_VARYING]: sqlvar.sqldata = ctypes.create_string_buffer(sqlvar.sqllen + 2) elif vartype == SQL_SHORT: sqlvar.sqldata = ctypes.cast(ctypes.create_string_buffer( sqlvar.sqllen),buf_pointer) elif vartype == SQL_LONG: sqlvar.sqldata = ctypes.cast(ctypes.create_string_buffer( sqlvar.sqllen),buf_pointer) elif vartype == SQL_INT64: sqlvar.sqldata = ctypes.cast(ctypes.create_string_buffer( sqlvar.sqllen),buf_pointer) elif vartype == SQL_FLOAT: sqlvar.sqldata = ctypes.cast(ctypes.create_string_buffer( sqlvar.sqllen),buf_pointer) elif vartype == SQL_DOUBLE: sqlvar.sqldata = ctypes.cast(ctypes.create_string_buffer( sqlvar.sqllen),buf_pointer) elif vartype == SQL_D_FLOAT: sqlvar.sqldata = ctypes.cast(ctypes.create_string_buffer( sqlvar.sqllen),buf_pointer) elif vartype == SQL_BLOB: sqlvar.sqldata = ctypes.cast(ctypes.create_string_buffer( sqlvar.sqllen),buf_pointer) elif vartype == SQL_TIMESTAMP: sqlvar.sqldata = ctypes.cast(ctypes.create_string_buffer( sqlvar.sqllen),buf_pointer) elif vartype == SQL_TYPE_DATE: sqlvar.sqldata = ctypes.cast(ctypes.create_string_buffer( sqlvar.sqllen),buf_pointer) elif vartype == SQL_TYPE_TIME: sqlvar.sqldata = ctypes.cast(ctypes.create_string_buffer( sqlvar.sqllen),buf_pointer) elif vartype == SQL_ARRAY: sqlvar.sqldata = ctypes.cast(ctypes.create_string_buffer( sqlvar.sqllen),buf_pointer) else: pass def __XSQLDA2Tuple(self, xsqlda): """Move data from output XSQLDA to result tuple. """ values = [] for sqlvar in xsqlda.sqlvar[:xsqlda.sqld]: value = '' vartype = sqlvar.sqltype & ~1 scale = sqlvar.sqlscale # NULL handling if ((sqlvar.sqltype & 1) != 0) and (bool(sqlvar.sqlind) and sqlvar.sqlind.contents.value == -1): value = None elif vartype == SQL_TEXT: value = ctypes.string_at(sqlvar.sqldata,sqlvar.sqllen) #value = sqlvar.sqldata[:sqlvar.sqllen] ### Todo: verify handling of P version differences if ((self.__charset or PYTHON_MAJOR_VER == 3) and sqlvar.sqlsubtype != 1): # non OCTETS value = b2u(value,self.__python_charset) # CHAR with multibyte encoding requires special handling if sqlvar.sqlsubtype in (4, 69): # UTF8 and GB18030 reallength = sqlvar.sqllen // 4 elif sqlvar.sqlsubtype == 3: # UNICODE_FSS reallength = sqlvar.sqllen // 3 else: reallength = sqlvar.sqllen value = value[:reallength] elif vartype == SQL_VARYING: size = bytes_to_uint(sqlvar.sqldata[:2]) #value = ctypes.string_at(sqlvar.sqldata[2],2+size) ### Todo: verify handling of P version differences if PYTHON_MAJOR_VER == 3: value = bytes(sqlvar.sqldata[2:2 + size]) else: value = str(sqlvar.sqldata[2:2 + size]) if ((self.__charset or PYTHON_MAJOR_VER == 3) and sqlvar.sqlsubtype != 1): # non OCTETS value = b2u(value,self.__python_charset) elif vartype in [SQL_SHORT, SQL_LONG, SQL_INT64]: value = bytes_to_int(sqlvar.sqldata[:sqlvar.sqllen]) # It's scalled integer? if (sqlvar.sqlsubtype or scale): value = decimal.Decimal(value) / _tenTo[abs(scale)] elif vartype == SQL_TYPE_DATE: yyyy, mm, dd = self._parse_date(sqlvar.sqldata[:sqlvar.sqllen]) value = datetime.date(yyyy, mm, dd) elif vartype == SQL_TYPE_TIME: h, m, s, ms = self._parse_time(sqlvar.sqldata[:sqlvar.sqllen]) value = datetime.time(h, m, s, ms) elif vartype == SQL_TIMESTAMP: yyyy, mm, dd = self._parse_date(sqlvar.sqldata[:4]) h, m, s, ms = self._parse_time(sqlvar.sqldata[4:sqlvar.sqllen]) value = datetime.datetime(yyyy, mm, dd, h, m, s, ms) elif vartype == SQL_FLOAT: value = struct.unpack('f', sqlvar.sqldata[:sqlvar.sqllen])[0] elif vartype == SQL_DOUBLE: value = struct.unpack('d', sqlvar.sqldata[:sqlvar.sqllen])[0] elif vartype == SQL_BLOB: val = sqlvar.sqldata[:sqlvar.sqllen] blobid = ISC_QUAD(bytes_to_uint(val[:4]), bytes_to_uint(val[4:sqlvar.sqllen])) # Check if stream BLOB is requested instead materialized one use_stream = False if self.__streamed_blobs: # Get the BLOB name sqlname = p3fix(sqlvar.sqlname[:sqlvar.sqlname_length], self.__python_charset) alias = p3fix(sqlvar.aliasname[:sqlvar.aliasname_length], self.__python_charset) if alias != sqlname: sqlname = alias if sqlname in self.__streamed_blobs: use_stream = True if use_stream: # Stream BLOB value = BlobReader(blobid,self.cursor._connection._db_handle, self.cursor._transaction._tr_handle, sqlvar.sqlsubtype == 1, self.__charset) self.__blob_readers.append(value) else: # Materialized BLOB blob_handle = isc_blob_handle() api.isc_open_blob2(self._isc_status, self.cursor._connection._db_handle, self.cursor._transaction._tr_handle, blob_handle, blobid, 0, None) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Cursor.read_output_blob/isc_open_blob2:") # Get BLOB total length and max. size of segment result = ctypes.cast(ctypes.create_string_buffer(20), buf_pointer) api.isc_blob_info(self._isc_status, blob_handle, 2, bs([isc_info_blob_total_length, isc_info_blob_max_segment]), 20, result) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Cursor.read_output_blob/isc_blob_info:") offset = 0 while bytes_to_uint(result[offset]) != isc_info_end: code = bytes_to_uint(result[offset]) offset += 1 if code == isc_info_blob_total_length: length = bytes_to_uint(result[offset:offset + 2]) blob_length = bytes_to_uint(result[ offset + 2:offset + 2 + length]) offset += length + 2 elif code == isc_info_blob_max_segment: length = bytes_to_uint(result[offset:offset + 2]) segment_size = bytes_to_uint(result[ offset + 2:offset + 2 + length]) offset += length + 2 # Load BLOB allow_incomplete_segment_read = False status = ISC_STATUS(0) blob = ctypes.create_string_buffer(blob_length) bytes_read = 0 bytes_actually_read = ctypes.c_ushort(0) while bytes_read < blob_length: status = api.isc_get_segment(self._isc_status, blob_handle, bytes_actually_read, min(segment_size, blob_length - bytes_read), ctypes.byref( blob, bytes_read)) if status != 0: if ((status == isc_segment) and allow_incomplete_segment_read): bytes_read += bytes_actually_read.value else: raise exception_from_status(DatabaseError, self._isc_status, "Cursor.read_output_blob/isc_get_segment:") else: bytes_read += bytes_actually_read.value # Finish api.isc_close_blob(self._isc_status, blob_handle) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Cursor.read_otput_blob/isc_close_blob:") value = blob.raw if ((self.__charset or PYTHON_MAJOR_VER == 3) and sqlvar.sqlsubtype == 1): value = b2u(value,self.__python_charset) elif vartype == SQL_ARRAY: value = [] val = sqlvar.sqldata[:sqlvar.sqllen] arrayid = ISC_QUAD(bytes_to_uint(val[:4]), bytes_to_uint(val[4:sqlvar.sqllen])) arraydesc = ISC_ARRAY_DESC(0) sqlsubtype = self.cursor._connection._get_array_sqlsubtype(sqlvar.relname, sqlvar.sqlname) api.isc_array_lookup_bounds(self._isc_status, self.cursor._connection._db_handle, self.cursor._transaction._tr_handle, sqlvar.relname, sqlvar.sqlname, arraydesc) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Cursor.read_otput_array/isc_array_lookup_bounds:") value_type = arraydesc.array_desc_dtype value_scale = arraydesc.array_desc_scale value_size = arraydesc.array_desc_length if value_type in (blr_varying,blr_varying2): value_size += 2 dimensions = [] total_num_elements = 1 for dimension in xrange(arraydesc.array_desc_dimensions): bounds = arraydesc.array_desc_bounds[dimension] dimensions.append((bounds.array_bound_upper+1)-bounds.array_bound_lower) total_num_elements *= dimensions[dimension] total_size = total_num_elements * value_size buf = ctypes.create_string_buffer(total_size) value_buffer = ctypes.cast(buf, buf_pointer) tsize = ISC_LONG(total_size) api.isc_array_get_slice(self._isc_status, self.cursor._connection._db_handle, self.cursor._transaction._tr_handle, arrayid, arraydesc, value_buffer, tsize) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Cursor.read_otput_array/isc_array_get_slice:") (value,bufpos) = self.__extract_db_array_to_list(value_size, value_type, sqlsubtype, value_scale, 0, dimensions, value_buffer,0) values.append(value) return tuple(values) def __extract_db_array_to_list(self,esize,dtype,subtype,scale,dim,dimensions, buf,bufpos): """Extracts ARRRAY column data from buffer to Python list(s). """ value = [] if dim == len(dimensions)-1: for i in xrange(dimensions[dim]): if dtype in (blr_text,blr_text2): val = ctypes.string_at(buf[bufpos:bufpos+esize],esize) ### Todo: verify handling of P version differences if ((self.__charset or PYTHON_MAJOR_VER == 3) and subtype != 1): # non OCTETS val = b2u(val,self.__python_charset) # CHAR with multibyte encoding requires special handling if subtype in (4, 69): # UTF8 and GB18030 reallength = esize // 4 elif subtype == 3: # UNICODE_FSS reallength = esize // 3 else: reallength = esize val = val[:reallength] elif dtype in (blr_varying,blr_varying2): val = ctypes.string_at(buf[bufpos:bufpos+esize]) if ((self.__charset or PYTHON_MAJOR_VER == 3) and subtype != 1): # non OCTETS val = b2u(val,self.__python_charset) elif dtype in (blr_short,blr_long,blr_int64): val = bytes_to_int(buf[bufpos:bufpos+esize]) if (subtype or scale): val = decimal.Decimal(val) / _tenTo[abs(256-scale)] elif dtype == blr_float: val = struct.unpack('f', buf[bufpos:bufpos+esize])[0] elif dtype in (blr_d_float,blr_double): val = struct.unpack('d', buf[bufpos:bufpos+esize])[0] elif dtype == blr_timestamp: yyyy, mm, dd = self._parse_date(buf[bufpos:bufpos+4]) h, m, s, ms = self._parse_time(buf[bufpos+4:bufpos+esize]) val = datetime.datetime(yyyy, mm, dd, h, m, s, ms) elif dtype == blr_sql_date: yyyy, mm, dd = self._parse_date(buf[bufpos:bufpos+esize]) val = datetime.date(yyyy, mm, dd) elif dtype == blr_sql_time: h, m, s, ms = self._parse_time(buf[bufpos:bufpos+esize]) val = datetime.time(h, m, s, ms) else: raise OperationalError("Unsupported Firebird ARRAY subtype: %i" % dtype) value.append(val) bufpos += esize else: for i in xrange(dimensions[dim]): (val,bufpos) = self.__extract_db_array_to_list(esize,dtype,subtype,scale,dim+1,dimensions,buf,bufpos) value.append(val) return (value,bufpos) def __copy_list_to_db_array(self,esize,dtype,subtype,scale,dim,dimensions, value,buf,bufpos): """Copies Python list(s) to ARRRAY column data buffer. """ valuebuf = None if dtype in (blr_text,blr_text2): valuebuf = ctypes.create_string_buffer(bs([0]),esize) elif dtype in (blr_varying,blr_varying2): valuebuf = ctypes.create_string_buffer(bs([0]),esize) elif dtype in (blr_short,blr_long,blr_int64): if esize == 2: valuebuf = ISC_SHORT(0) elif esize == 4: valuebuf = ISC_LONG(0) elif esize == 8: valuebuf = ISC_INT64(0) else: raise OperationalError("Unsupported number type") elif dtype == blr_float: valuebuf = ctypes.create_string_buffer(bs([0]),esize) elif dtype in (blr_d_float,blr_double): valuebuf = ctypes.create_string_buffer(bs([0]),esize) elif dtype == blr_timestamp: valuebuf = ctypes.create_string_buffer(bs([0]),esize) elif dtype == blr_sql_date: valuebuf = ctypes.create_string_buffer(bs([0]),esize) elif dtype == blr_sql_time: valuebuf = ctypes.create_string_buffer(bs([0]),esize) else: raise OperationalError("Unsupported Firebird ARRAY subtype: %i" % dtype) if valuebuf == None: raise NotImplementedError("ARRAY") self.__fill_db_array_buffer(esize,dtype, subtype,scale, dim,dimensions, value,valuebuf, buf,bufpos) def __fill_db_array_buffer(self,esize,dtype,subtype,scale,dim,dimensions, value,valuebuf,buf,bufpos): if dim == len(dimensions)-1: for i in xrange(dimensions[dim]): if dtype in (blr_text,blr_text2, blr_varying,blr_varying2): val = value[i] if isinstance(val, UnicodeType): val = val.encode(self.__python_charset) if len(val) > esize: raise ValueError("ARRAY value of parameter is too long," " expected %i, found %i" % (esize, len(val))) valuebuf.value = val ctypes.memmove(ctypes.byref(buf,bufpos),valuebuf,esize) elif dtype in (blr_short,blr_long,blr_int64): if (subtype or scale): val = value[i] if isinstance(val, decimal.Decimal): val = int((val * _tenTo[256-abs(scale)]).to_integral()) elif isinstance(val, (int, mylong, float,)): val = int(val * _tenTo[256-abs(scale)]) else: raise TypeError('Objects of type %s are not ' ' acceptable input for' ' a fixed-point column.' % str(type(val))) valuebuf.value = val else: if esize == 2: valuebuf.value = value[i] elif esize == 4: valuebuf.value = value[i] elif esize == 8: valuebuf.value = value[i] else: raise OperationalError("Unsupported type") ctypes.memmove(ctypes.byref(buf,bufpos), ctypes.byref(valuebuf), esize) elif dtype == blr_float: valuebuf.value = struct.pack('f', value[i]) ctypes.memmove(ctypes.byref(buf,bufpos),valuebuf,esize) elif dtype in (blr_d_float,blr_double): valuebuf.value = struct.pack('d', value[i]) ctypes.memmove(ctypes.byref(buf,bufpos),valuebuf,esize) elif dtype == blr_timestamp: valuebuf.value = self._convert_timestamp(value[i]) ctypes.memmove(ctypes.byref(buf,bufpos),valuebuf,esize) elif dtype == blr_sql_date: valuebuf.value = self._convert_date(value[i]) ctypes.memmove(ctypes.byref(buf,bufpos),valuebuf,esize) elif dtype == blr_sql_time: valuebuf.value = self._convert_time(value[i]) ctypes.memmove(ctypes.byref(buf,bufpos),valuebuf,esize) else: raise OperationalError("Unsupported Firebird ARRAY subtype: %i" % dtype) bufpos += esize else: for i in xrange(dimensions[dim]): bufpos = self.__fill_db_array_buffer(esize,dtype,subtype, scale,dim+1, dimensions,value[i], valuebuf,buf,bufpos) return bufpos def __validate_array_value(self,dim,dimensions,value_type,sqlsubtype, value_scale,value): """Validates whether Python list(s) passed as ARRAY column value matches column definition (length, structure and value types). """ ok = isinstance(value,(ibase.ListType,ibase.TupleType)) ok = ok and (len(value) == dimensions[dim]) if not ok: return False for i in xrange(dimensions[dim]): if dim == len(dimensions)-1: # leaf: check value type if value_type in (blr_text,blr_text2, blr_varying,blr_varying2): ok = isinstance(value[i],(ibase.StringType,ibase.UnicodeType)) elif value_type in (blr_short,blr_long,blr_int64): if (sqlsubtype or value_scale): ok = isinstance(value[i],decimal.Decimal) else: ok = isinstance(value[i],ibase.IntType) elif value_type == blr_float: ok = isinstance(value[i],ibase.FloatType) elif value_type in (blr_d_float,blr_double): ok = isinstance(value[i],ibase.FloatType) elif value_type == blr_timestamp: ok = isinstance(value[i],datetime.datetime) elif value_type == blr_sql_date: ok = isinstance(value[i],datetime.date) elif value_type == blr_sql_time: ok = isinstance(value[i],datetime.time) else: ok = False else: # non-leaf: recurse down ok = ok and self.__validate_array_value(dim+1,dimensions,value_type, sqlsubtype,value_scale, value[i]) if not ok: return False return ok def __Tuple2XSQLDA(self, xsqlda, parameters): """Move data from parameters to input XSQLDA. """ for i in xrange(xsqlda.sqld): sqlvar = xsqlda.sqlvar[i] value = parameters[i] vartype = sqlvar.sqltype & ~1 scale = sqlvar.sqlscale # NULL handling if value == None: # Set the null flag whether sqlvar definition allows it or not, # to give BEFORE triggers to act on value without # our interference. if (sqlvar.sqltype & 1) == 0: # NULLs were not allowed, so set it allowed or FB will complain sqlvar.sqltype += 1 sqlvar.sqlind = ctypes.pointer(ISC_SHORT(-1)) sqlvar.sqldata = None else: # if sqlvar allows null, allocate the null flag # I don't know whether it's necessary, # but we'll do it anyway for safety if ((sqlvar.sqltype & 1) != 0): sqlvar.sqlind = ctypes.pointer(ISC_SHORT(0)) # Fill in value by type if ((vartype != SQL_BLOB and isinstance(value, (StringType, UnicodeType))) or vartype in [SQL_TEXT, SQL_VARYING]): # Place for Implicit Conversion of Input Parameters # to Strings if not isinstance(value, (UnicodeType,StringType,ibase.mybytes)): value = str(value) # Place for Implicit Conversion of Input Parameters # from Strings if isinstance(value, UnicodeType): value = value.encode(self.__python_charset) if vartype in [SQL_TEXT, SQL_VARYING] and len(value) > sqlvar.sqllen: raise ValueError("Value of parameter (%i) is too long," " expected %i, found %i" % (i, sqlvar.sqllen, len(value))) sqlvar.sqltype = SQL_TEXT | (sqlvar.sqltype & 1) sqlvar.sqllen = ctypes.c_short(len(value)) sqlvar.sqldata = ctypes.cast(ctypes.pointer( ctypes.create_string_buffer(value)), buf_pointer) elif vartype in [SQL_SHORT, SQL_LONG, SQL_INT64]: # It's scalled integer? if (sqlvar.sqlsubtype or scale): if isinstance(value, decimal.Decimal): value = int( (value * _tenTo[abs(scale)]).to_integral()) elif isinstance(value, (int, mylong, float,)): value = int(value * _tenTo[abs(scale)]) else: raise TypeError('Objects of type %s are not ' ' acceptable input for' ' a fixed-point column.' % str(type(value))) self._check_integer_range(value, self.__sql_dialect, vartype, sqlvar.sqlsubtype, sqlvar.sqlscale) sqlvar.sqldata = ctypes.cast(ctypes.pointer( ctypes.create_string_buffer( int_to_bytes(value, sqlvar.sqllen))), buf_pointer) elif vartype == SQL_TYPE_DATE: sqlvar.sqldata = ctypes.cast(ctypes.pointer( ctypes.create_string_buffer( self._convert_date(value))), buf_pointer) elif vartype == SQL_TYPE_TIME: sqlvar.sqldata = ctypes.cast(ctypes.pointer( ctypes.create_string_buffer( self._convert_time(value))), buf_pointer) elif vartype == SQL_TIMESTAMP: sqlvar.sqldata = ctypes.cast(ctypes.pointer( ctypes.create_string_buffer( self._convert_timestamp(value))), buf_pointer) elif vartype == SQL_FLOAT: sqlvar.sqldata = ctypes.cast( ctypes.pointer(ctypes.create_string_buffer( struct.pack('f', value))), buf_pointer) elif vartype == SQL_DOUBLE: sqlvar.sqldata = ctypes.cast( ctypes.pointer(ctypes.create_string_buffer( struct.pack('d', value))), buf_pointer) elif vartype == SQL_BLOB: blobid = ISC_QUAD(0, 0) blob_handle = isc_blob_handle() if hasattr(value,'read'): # It seems we've got file-like object, use stream BLOB api.isc_create_blob2(self._isc_status, self.cursor._connection._db_handle, self.cursor._transaction._tr_handle, blob_handle, blobid, 4, bs([ibase.isc_bpb_version1, ibase.isc_bpb_type,1, ibase.isc_bpb_type_stream])) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Cursor.write_input_blob/isc_create_blob2:") sqlvar.sqldata = ctypes.cast(ctypes.pointer(blobid), buf_pointer) blob = ctypes.create_string_buffer(MAX_BLOB_SEGMENT_SIZE) value_chunk = value.read(MAX_BLOB_SEGMENT_SIZE) blob.raw = ibase.b(value_chunk) while len(value_chunk) > 0: api.isc_put_segment(self._isc_status, blob_handle, len(value_chunk), ctypes.byref(blob) ) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Cursor.write_input_blob/isc_put_segment:") ctypes.memset(blob,0,MAX_BLOB_SEGMENT_SIZE) value_chunk = value.read(MAX_BLOB_SEGMENT_SIZE) blob.raw = ibase.b(value_chunk) api.isc_close_blob(self._isc_status, blob_handle) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Cursor.write_input_blob/isc_close_blob:") else: # Non-stream BLOB if isinstance(value, myunicode): if sqlvar.sqlsubtype == 1: value = value.encode(self.__python_charset) else: raise TypeError('Unicode strings are not' ' acceptable input for' ' a non-textual BLOB column.') blob = ctypes.create_string_buffer(value) api.isc_create_blob2(self._isc_status, self.cursor._connection._db_handle, self.cursor._transaction._tr_handle, blob_handle, blobid, 0, None) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Cursor.write_input_blob/isc_create_blob2:") sqlvar.sqldata = ctypes.cast(ctypes.pointer(blobid), buf_pointer) total_size = len(value) bytes_written_so_far = 0 bytes_to_write_this_time = MAX_BLOB_SEGMENT_SIZE while (bytes_written_so_far < total_size): if ( (total_size - bytes_written_so_far) < MAX_BLOB_SEGMENT_SIZE ): bytes_to_write_this_time = (total_size - bytes_written_so_far) api.isc_put_segment(self._isc_status, blob_handle, bytes_to_write_this_time, ctypes.byref(blob, bytes_written_so_far ) ) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Cursor.write_input_blob/isc_put_segment:") bytes_written_so_far += bytes_to_write_this_time api.isc_close_blob(self._isc_status, blob_handle) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Cursor.write_input_blob/isc_close_blob:") elif vartype == SQL_ARRAY: arrayid = ISC_QUAD(0,0) arrayid_ptr = ctypes.pointer(arrayid) arraydesc = ISC_ARRAY_DESC(0) sqlvar.sqldata = ctypes.cast(ctypes.pointer(arrayid), buf_pointer) sqlsubtype = self.cursor._connection._get_array_sqlsubtype(sqlvar.relname, sqlvar.sqlname) api.isc_array_lookup_bounds(self._isc_status, self.cursor._connection._db_handle, self.cursor._transaction._tr_handle, sqlvar.relname, sqlvar.sqlname, arraydesc) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Cursor.write_otput_array/isc_array_lookup_bounds:") value_type = arraydesc.array_desc_dtype value_scale = arraydesc.array_desc_scale value_size = arraydesc.array_desc_length if value_type in (blr_varying,blr_varying2): value_size += 2 dimensions = [] total_num_elements = 1 for dimension in xrange(arraydesc.array_desc_dimensions): bounds = arraydesc.array_desc_bounds[dimension] dimensions.append((bounds.array_bound_upper+1)-bounds.array_bound_lower) total_num_elements *= dimensions[dimension] total_size = total_num_elements * value_size # Validate value to make sure it matches the array structure if not self.__validate_array_value(0,dimensions,value_type, sqlsubtype, value_scale,value): raise ValueError("Incorrect ARRAY field value.") value_buffer = ctypes.create_string_buffer(total_size) tsize = ISC_LONG(total_size) self.__copy_list_to_db_array(value_size,value_type, sqlsubtype,value_scale, 0, dimensions, value,value_buffer,0) api.isc_array_put_slice(self._isc_status, self.cursor._connection._db_handle, self.cursor._transaction._tr_handle, arrayid_ptr, arraydesc, value_buffer, tsize) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Cursor.read_otput_array/isc_array_put_slice:") sqlvar.sqldata = ctypes.cast(arrayid_ptr,buf_pointer) def _free_handle(self): if self._stmt_handle != None and not self.__closed: self.__executed = False self.__closed = True self.__output_cache = None self._name = None while len(self.__blob_readers) > 0: self.__blob_readers.pop().close() if self.statement_type == isc_info_sql_stmt_select: api.isc_dsql_free_statement(self._isc_status, self._stmt_handle, ibase.DSQL_close) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Error while releasing SQL statement handle:") def _close(self): if self._stmt_handle != None: while len(self.__blob_readers) > 0: self.__blob_readers.pop().close() stmt_handle = self._stmt_handle self._stmt_handle = None self.__executed = False self.__prepared = False self.__closed = True self.__description = None self.__output_cache = None self._name = None if is_dead_proxy(self.cursor): self.cursor = None connection = self.cursor._connection if self.cursor else None if (not connection) or (connection and not connection.closed): api.isc_dsql_free_statement(self._isc_status, stmt_handle, ibase.DSQL_drop) if (db_api_error(self._isc_status) and (self._isc_status[1] not in [335544528,335544485])): raise exception_from_status(DatabaseError, self._isc_status, "Error while closing SQL statement:") def _execute(self, parameters=None): # Bind parameters if parameters: if not isinstance(parameters, (ListType, TupleType)): raise TypeError("parameters must be list or tuple") if len(parameters) > self._in_sqlda.sqln: raise ProgrammingError("Statement parameter sequence contains" " %d parameters, but only %d are allowed" % (len(parameters), self._in_sqlda.sqln)) # Restore original type and size information for input parameters i = 0 for sqlvar in self._in_sqlda.sqlvar[:self.n_input_params]: sqlvar.sqltype, sqlvar.sqllen = self._in_sqlda_save[i] i += 1 self.__Tuple2XSQLDA(self._in_sqlda, parameters) xsqlda_in = ctypes.cast(ctypes.pointer(self._in_sqlda), XSQLDA_PTR) else: xsqlda_in = None # Execute the statement if ((self.statement_type == isc_info_sql_stmt_exec_procedure) and (self._out_sqlda.sqld > 0)): # NOTE: We have to pass xsqlda_out only for statements that return # single row xsqlda_out = ctypes.cast(ctypes.pointer(self._out_sqlda), XSQLDA_PTR) api.isc_dsql_execute2(self._isc_status, self.cursor._transaction._tr_handle, self._stmt_handle, self.__sql_dialect, xsqlda_in, xsqlda_out) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Error while executing Stored Procedure:") # The result was returned immediately, but we have to provide it # via fetch*() calls as Python DB API requires. However, it's not # possible to call fetch on open such statement, so we'll cache # the result and return it in fetchone instead calling fetch. self.__output_cache = self.__XSQLDA2Tuple(self._out_sqlda) else: api.isc_dsql_execute2(self._isc_status, self.cursor._transaction._tr_handle, self._stmt_handle, self.__sql_dialect, xsqlda_in, None) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Error while executing SQL statement:") self.__output_cache = None self.__executed = True self.__closed = False self._last_fetch_status = ISC_STATUS(self.NO_FETCH_ATTEMPTED_YET) def _fetchone(self): if (self._last_fetch_status == self.RESULT_SET_EXHAUSTED and not self.__output_cache): return None if self.__executed: if self.__output_cache: if self._last_fetch_status == self.RESULT_SET_EXHAUSTED: self._free_handle() return None else: self._last_fetch_status = self.RESULT_SET_EXHAUSTED return self.__output_cache else: if self.n_output_params == 0: raise DatabaseError("Attempt to fetch row of results after statement that does not produce result set.") self._last_fetch_status = api.isc_dsql_fetch( self._isc_status, self._stmt_handle, self.__sql_dialect, ctypes.cast(ctypes.pointer(self._out_sqlda), XSQLDA_PTR)) if self._last_fetch_status == 0: return self.__XSQLDA2Tuple(self._out_sqlda) elif self._last_fetch_status == self.RESULT_SET_EXHAUSTED: self._free_handle() return None else: if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Cursor.fetchone:") elif self.__closed: raise ProgrammingError("Cannot fetch from closed cursor.") else: raise ProgrammingError("Cannot fetch from this cursor because" " it has not executed a statement.") def _set_cursor_name(self, name): api.isc_dsql_set_cursor_name(self._isc_status, self._stmt_handle, b(name), 0) if db_api_error(self._isc_status): raise exception_from_status(OperationalError, self._isc_status, "Could not set cursor name:") self._name = name def set_stream_blob(self,blob_name): """Specify a BLOB column(s) to work in `stream` mode instead classic, materialized mode. :param blob_name: Single name or sequence of column names. Name must be in format as it's stored in database (refer to :attr:`description` for real value). :type blob_name: string or sequence .. important:: BLOB name is **permanently** added to the list of BLOBs handled as `stream` BLOBs by this instance. :param string blob_name: Name of BLOB column. """ if isinstance(blob_name,ibase.StringType): self.__streamed_blobs.append(blob_name) else: self.__streamed_blobs.extend(blob_name) def __del__(self): if self._stmt_handle != None: self._close() def close(self): """Drops the resources associated with executed prepared statement, but keeps it prepared for another execution. """ self._free_handle() #: (Read Only) (string) SQL command this PreparedStatement executes. sql = property(__get_sql) #: (Read Only) Sequence of 7-item sequences. #: Each of these sequences contains information describing one result column: #: (name, type_code, display_size,internal_size, precision, scale, null_ok) description = property(__get_description) #: (Read Only) (integer) Specifies the number of rows that the last execution #: produced (for DQL statements like select) or affected (for DML statements #: like update or insert ). #: #: The attribute is -1 in case the statement was not yet executed #: or the rowcount of the operation is not determinable by the interface. rowcount = property(__get_rowcount) #: (Read Only) (string) A string representation of the execution plan generated #: for this statement by the database engine’s optimizer. plan = property(__get_plan) #: (Read/Write) (string) Name for the SQL cursor. This property can be #: ignored entirely if you don’t need to use it. name = property(__get_name, __set_name) #: (Read Only) (boolean) True if closed. Note that closed means that PS #: statement handle was closed for further fetching, releasing server resources, #: but wasn't dropped, and couldbe still used for another execution. closed = property(__get_closed) class Cursor(object): """Represents a database cursor, which is used to execute SQL statement and manage the context of a fetch operation. .. important:: DO NOT create instances of this class directly! Use only :meth:`Connection.cursor`, :meth:`Transaction.cursor` and :meth:`ConnectionGroup.cursor` to get Cursor instances that operate in desired context. .. note:: Cursor is actually a high-level wrapper around :class:`PreparedStatement` instance(s) that handle the actual SQL statement execution and result management. .. tip:: Cursor supports the iterator protocol, yielding tuples of values like :meth:`fetchone`. """ #: (Read/Write) As required by the Python DB API 2.0 spec, the value of this #: attribute is observed with respect to the :meth:`fetchmany` method. However, #: changing the value of this attribute does not make any difference in fetch #: efficiency because the database engine only supports fetching a single row #: at a time. arraysize = 1 def __init__(self, connection, transaction): """ .. important:: The association between a Cursor and its :class:`Transaction` and :class:`Connection` is set when the Cursor is created, and cannot be changed during the lifetime of that Cursor. :param connection: :class:`Connection` instance this cursor should be bound to. :param transaction: :class:`Transaction` instance this cursor should be bound to. """ self._connection = connection self._transaction = transaction self._ps = None # current prepared statement def next(self): """Return the next item from the container. Part of *iterator protocol*. :raises StopIteration: If there are no further items. """ row = self.fetchone() if row: return row else: raise StopIteration __next__ = next def __iter__(self): return self def __get_description(self): return self._ps.description def __get_rowcount(self): if self._ps: return self._ps.rowcount else: return -1 def __get_name(self): if self._ps: return self._ps._name else: return None def __set_name(self, name): if name == None or not isinstance(name, StringType): raise ProgrammingError("The name attribute can only be set to a" " string, and cannot be deleted") if not self._ps: raise ProgrammingError("This cursor has not yet executed a" " statement, so setting its name attribute" " would be meaningless") if self._ps._name: raise ProgrammingError("Cursor's name has already been declared in" " context of currently executed statement") self._ps._set_cursor_name(name) def __get_plan(self): if self._ps != None: return self._ps.plan else: return None def __get_connection(self): return self._connection def __get_transaction(self): return self._transaction def __connection_deleted(self,obj): self._connection = None def __ps_deleted(self,obj): self._ps = None def _set_as_internal(self): self._connection = weakref.proxy(self._connection, _weakref_callback(self.__connection_deleted)) def callproc(self, procname, parameters=None): """Call a stored database procedure with the given name. The result of the call is available through the standard fetchXXX() methods. :param string procname: Stored procedure name. :param parameters: (Optional) Sequence of parameters. Must contain one entry for each argument that the procedure expects. :type parameters: List or Tuple :returns: parameters, as required by Python DB API 2.0 Spec. :raises TypeError: When parameters is not List or Tuple. :raises ProgrammingError: When more parameters than expected are suplied. :raises DatabaseError: When error is returned by server. """ if not parameters: params = [] else: if isinstance(parameters, (ListType, TupleType)): params = parameters else: raise TypeError("callproc paremeters must be List or Tuple") sql = ('EXECUTE PROCEDURE ' + procname + ' ' + ','.join('?' * len(params))) self.execute(sql, params) return parameters def close(self): """Close the cursor now (rather than whenever `__del__` is called). Closes any currently open :class:`PreparedStatement`. However, the cursor is still bound to :class:`Connection` and :class:`Transaction`, so it could be still used to execute SQL statements. Also the cache with prepared statements is left intact. .. warning:: FDB's implementation of Cursor somewhat violates the Python DB API 2.0, which requires that cursor will be unusable after call to `close`; and an Error (or subclass) exception should be raised if any operation is attempted with the cursor. If you’ll take advantage of this anomaly, your code would be less portable to other Python DB API 2.0 compliant drivers. """ if is_dead_proxy(self._ps): self._ps = None if self._ps != None: self._ps.close() self._ps = None def execute(self, operation, parameters=None): """Prepare and execute a database operation (query or command). .. note:: Execution is handled by :class:`PreparedStatement` that is either supplied as `operation` parameter, or created internally when `operation` is a string. Internally created PreparedStatements are stored in cache for later reuse, when the same `operation` string is used again. :returns: self, so call to execute could be used as iterator. :param operation: SQL command specification. :type operation: string or :class:`PreparedStatement` instance :param parameters: (Optional) Sequence of parameters. Must contain one entry for each argument that the operation expects. :type parameters: List or Tuple :raises ValueError: When operation PreparedStatement belongs to different Cursor instance. :raises TypeError: When parameters is not List or Tuple. :raises ProgrammingError: When more parameters than expected are suplied. :raises DatabaseError: When error is returned by server. """ if self._ps != None: self._ps.close() if not self._transaction.active: self._transaction.begin() if isinstance(operation, PreparedStatement): if operation.cursor is not self: raise ValueError("PreparedStatement was created by different Cursor.") self._ps = weakref.proxy(operation, _weakref_callback(self.__ps_deleted)) else: self._ps = PreparedStatement(operation, self, True) self._ps._execute(parameters) # return self so `execute` call could be used as iterable return self def prep(self, operation): """Create prepared statement for repeated execution. .. note:: Returned :class:`PreparedStatement` instance is bound to its Cursor instance via strong reference, and is not stored in Cursor's internal cache of prepared statements. :param string operation: SQL command :returns: :class:`PreparedStatement` instance. :raises DatabaseError: When error is returned by server. :raises InternalError: On unexpected processing condition. """ if not self._transaction.active: self._transaction.begin() return PreparedStatement(operation, self, False) def executemany(self, operation, seq_of_parameters): """Prepare a database operation (query or command) and then execute it against all parameter sequences or mappings found in the sequence `seq_of_parameters`. .. note:: This function simply calls :meth:`execute` in a loop, feeding it with parameters from `seq_of_parameters`. Because `execute` caches `PreparedStatements`, calling `executemany` is equally efective as direct use of prepared statement and calling `execute` in a loop directly in application. :returns: self, so call to executemany could be used as iterator. :param operation: SQL command specification. :type operation: string or :class:`PreparedStatement` instance :param seq_of_parameters: Sequence of sequences of parameters. Must contain one sequence of parameters for each execution that has one entry for each argument that the operation expects. :type seq_of_parameters: List or Tuple :raises ValueError: When operation PreparedStatement belongs to different Cursor instance. :raises TypeError: When seq_of_parameters is not List or Tuple. :raises ProgrammingError: When there are more parameters in any sequence than expected. :raises DatabaseError: When error is returned by server. """ for parameters in seq_of_parameters: self.execute(operation, parameters) return self def fetchone(self): """Fetch the next row of a query result set. :returns: tuple of returned values, or None when no more data is available. :raises DatabaseError: When error is returned by server. :raises ProgrammingError: When underlying :class:`PreparedStatement` is closed, statement was not yet executed, or unknown status is returned by fetch operation. """ if self._ps: return self._ps._fetchone() else: raise ProgrammingError("Cannot fetch from this cursor because" " it has not executed a statement.") def fetchmany(self, size=arraysize): """Fetch the next set of rows of a query result, returning a sequence of sequences (e.g. a list of tuples). An empty sequence is returned when no more rows are available. The number of rows to fetch per call is specified by the parameter. If it is not given, the cursor’s arraysize determines the number of rows to be fetched. The method does try to fetch as many rows as indicated by the size parameter. If this is not possible due to the specified number of rows not being available, fewer rows may be returned. :param integer size: Max. number of rows to fetch. :returns: List of tuples, where each tuple is one row of returned values. :raises DatabaseError: When error is returned by server. :raises ProgrammingError: When underlying :class:`PreparedStatement` is closed, statement was not yet executed, or unknown status is returned by fetch operation. """ i = 0 result = [] while i < size: row = self.fetchone() if row: result.append(row) i += 1 else: return result return result def fetchall(self): """Fetch all (remaining) rows of a query result. :returns: List of tuples, where each tuple is one row of returned values. :raises DatabaseError: When error is returned by server. :raises ProgrammingError: When underlying :class:`PreparedStatement` is closed, statement was not yet executed, or unknown status is returned by fetch operation. """ return [row for row in self] def fetchonemap(self): """Fetch the next row of a query result set like :meth:`fetchone`, except that it returns a mapping of field name to field value, rather than a tuple. :returns: :class:`fbcore._RowMapping` of returned values, or None when no more data is available. :raises DatabaseError: When error is returned by server. :raises ProgrammingError: When underlying :class:`PreparedStatement` is closed, statement was not yet executed, or unknown status is returned by fetch operation. """ row = self.fetchone() if row: row = _RowMapping(self.description, row) return row def fetchmanymap(self, size=arraysize): """Fetch the next set of rows of a query result, like :meth:`fetchmany`, except that it returns a list of mappings of field name to field value, rather than a list of tuples. :param integer size: Max. number of rows to fetch. :returns: List of :class:`fbcore._RowMapping` instances, one such instance for each row. :raises DatabaseError: When error is returned by server. :raises ProgrammingError: When underlying :class:`PreparedStatement` is closed, statement was not yet executed, or unknown status is returned by fetch operation. """ i = 0 result = [] while i < size: row = self.fetchonemap() if row: result.append(row) i += 1 else: return result return result def fetchallmap(self): """Fetch all (remaining) rows of a query result like :meth:`fetchall`, except that it returns a list of mappings of field name to field value, rather than a list of tuples. :returns: List of :class:`fbcore._RowMapping` instances, one such instance for each row. :raises DatabaseError: When error is returned by server. :raises ProgrammingError: When underlying :class:`PreparedStatement` is closed, statement was not yet executed, or unknown status is returned by fetch operation. """ return [row for row in self.itermap()] def iter(self): """Equivalent to the :meth:`fetchall`, except that it returns iterator rather than materialized list. :returns: Iterator that yields tuple of values like :meth:`fetchone`. """ return self def itermap(self): """Equivalent to the :meth:`fetchallmap`, except that it returns iterator rather than materialized list. :returns: Iterator that yields :class:`fbcore._RowMapping` instance like :meth:`fetchonemap`. """ return utils.Iterator(self.fetchonemap, None) def setinputsizes(self, sizes): """Required by Python DB API 2.0, but pointless for Firebird, so it does nothing.""" pass def setoutputsize(self, size, column=None): """Required by Python DB API 2.0, but pointless for Firebird, so it does nothing.""" pass def set_stream_blob(self,blob_name): """Specify a BLOB column(s) to work in `stream` mode instead classic, materialized mode for already executed statement. :param blob_name: Single name or sequence of column names. Name must be in format as it's stored in database (refer to :attr:`description` for real value). :type blob_name: string or sequence .. important:: BLOB name is **permanently** added to the list of BLOBs handled as `stream` BLOBs by current :class:`PreparedStatement` instance. If instance is stored in internal cache of prepared statements, the same command executed repeatedly will retain this setting. :param string blob_name: Name of BLOB column. :raises ProgrammingError: """ if self._ps: self._ps.set_stream_blob(blob_name) else: raise ProgrammingError def __del__(self): self.close() #: (Read Only) Sequence of 7-item sequences. #: Each of these sequences contains information describing one result column: #: (name, type_code, display_size,internal_size, precision, scale, null_ok) #: #: If cursor doesn't have a prepared statement, the value is None. description = property(__get_description) #: (Read Only) (integer) Specifies the number of rows that the last executeXXX() #: produced (for DQL statements like select) or affected (for DML statements #: like update or insert ). #: #: The attribute is -1 in case no executeXXX() has been performed on the cursor #: or the rowcount of the last operation is not determinable by the interface. #: #: .. note:: #: #: The database engine's own support for the determination of #: “rows affected”/”rows selected” is quirky. The database engine only #: supports the determination of rowcount for INSERT, UPDATE, DELETE, #: and SELECT statements. When stored procedures become involved, row #: count figures are usually not available to the client. Determining #: rowcount for SELECT statements is problematic: the rowcount is reported #: as zero until at least one row has been fetched from the result set, #: and the rowcount is misreported if the result set is larger than 1302 #: rows. The server apparently marshals result sets internally in batches #: of 1302, and will misreport the rowcount for result sets larger than #: 1302 rows until the 1303rd row is fetched, result sets larger than 2604 #: rows until the 2605th row is fetched, and so on, in increments of 1302. rowcount = property(__get_rowcount) #: (Read/Write) (string) Name for the SQL cursor. This property can be #: ignored entirely if you don’t need to use it. name = property(__get_name, __set_name) #: (Read Only) (string) A string representation of the execution plan #: for last executed statement generated by the database engine’s optimizer. #: `None` if no statement was executed. plan = property(__get_plan) #: (Read Only) (:class:`Connection`) PEP 249 Extension. #: Reference to the :class:`Connection` object on which the cursor was created. connection = property(__get_connection) #: (Read Only) (:class:`Transaction`) #: Reference to the :class:`Transaction` object on which the cursor was created. transaction = property(__get_transaction) class Transaction(object): """Represents a transaction context, which is used to execute SQL statement. .. important:: DO NOT create instances of this class directly! :class:`Connection` and :class:`ConnectionGroup` manage Transaction internally, surfacing all important methods directly in their interfaces. If you want additional transactions independent from :attr:`Connection.main_transaction`, use :meth:`Connection.trans` method to obtain such `Transaction` instance. """ #: (Read/Write) Transaction Parameter Block. default_tpb = ISOLATION_LEVEL_READ_COMMITED #: (Read/Write) Default action on active transaction when it's closed. #: Accepted values: commit, rollback default_action = 'commit' def __init__(self, connections, default_tpb=None, default_action='commit'): """ :param iterable connections: Sequence of (up to 16) :class:`Connection` instances. :param default_tpb: Transaction Parameter Block for this transaction. If `None` is specified, uses `ISOLATION_LEVEL_READ_COMMITED`. :type default_tpb: :class:`TPB` instance, list/tuple of `isc_tpb_*` constants or `bytestring` :param default_action: Action taken when active transaction is ended automatically (during :meth:`close` or :meth:`begin`). :type default_action: string 'commit' or 'rollback' :raises ProgrammingError: When zero or more than 16 connections are given. """ if len(connections) > 16: raise ProgrammingError("Transaction can't accept more than 16 Connections") elif len(connections) == 0: raise ProgrammingError("Transaction requires at least one Connection") self._connections = [weakref.ref(c) for c in connections] self.__python_charset = connections[0]._python_charset if default_tpb == None: self.default_tpb = ISOLATION_LEVEL_READ_COMMITED else: self.default_tpb = default_tpb self.default_action = default_action self._cursors = [] # Weak references to cursors self._isc_status = ISC_STATUS_ARRAY() self._tr_handle = None self.__closed = False def __remove_cursor(self, cursor_ref): self._cursors.remove(cursor_ref) def __get_closed(self): return self.__closed #return self._tr_handle == None def __get_active(self): return self._tr_handle != None def __get_cursors(self): return [x() for x in self._cursors] def __check_active(self): if not self.active: raise ProgrammingError("Transaction object is not active") def __close_cursors(self): for cursor in self._cursors: c = cursor() if c: c.close() def __con_in_list(self,connection): for con in self._connections: if con() == connection: return True return False def __get_default_action(self): return self.__default_action def __set_default_action(self,action): action = action.lower() if not action in ('commit','rollback'): raise ProgrammingError("Transaction's default action must be either" "'commit' or 'rollback'.") else: self.__default_action = action def execute_immediate(self, sql): """Executes a statement without caching its prepared form on **all connections** this transaction is bound to. Automatically starts transaction if it's not already started. :param string sql: SQL statement to execute. .. important:: **The statement must not be of a type that returns a result set.** In most cases (especially cases in which the same statement – perhaps a parameterized statement – is executed repeatedly), it is better to create a cursor using the connection’s cursor method, then execute the statement using one of the cursor’s execute methods. :param string sql: SQL statement to execute. :raises DatabaseError: When error is returned from server. """ if not self.active: self.begin() for connection in self._connections: con = connection() sql = b(sql, con._python_charset) api.isc_execute_immediate(self._isc_status, con._db_handle, self._tr_handle, ctypes.c_short(len(sql)), sql) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Error while executing SQL statement:") def _finish(self): if self._tr_handle != None: try: if self.default_action == 'commit': self.commit() else: self.rollback() except Exception as e: self._tr_handle = None raise e def begin(self, tpb=None): """Starts a transaction explicitly. :param tpb: (optional) Transaction Parameter Block for newly created Transaction. If not specified, :attr:`default_tpb` is used. :type tpb: :class:`TPB` instance, list/tuple of `isc_tpb_*` constants or `bytestring` .. note:: Calling this method directly is never required; a transaction will be started implicitly if necessary. .. important:: If the physical transaction is unresolved when this method is called, a :meth:`commit` or :meth:`rollback` will be performed first, accordingly to :attr:`default_action` value. :raises DatabaseError: When error is returned by server. :raises ProgrammingError: When TPB is in usupported format, or transaction is permanently :attr:`closed`. """ if self.__closed: raise ProgrammingError("Transaction is permanently closed.") self._finish() # Make sure that previous transaction (if any) is ended self._tr_handle = isc_tr_handle(0) _tpb = tpb if tpb else self.default_tpb if isinstance(_tpb, TPB): _tpb = _tpb.render() elif isinstance(_tpb, (ListType, TupleType)): _tpb = bs(_tpb) elif not isinstance(_tpb, mybytes): raise ProgrammingError("TPB must be either string, list/tuple of" " numeric constants or TPB instance.") ### Todo: verify handling of P version differences if PYTHON_MAJOR_VER == 3: if int2byte(_tpb[0]) != bs([isc_tpb_version3]): _tpb = bs([isc_tpb_version3]) + _tpb else: if _tpb[0] != bs([isc_tpb_version3]): _tpb = bs([isc_tpb_version3]) + _tpb if len(self._connections) == 1: api.isc_start_transaction(self._isc_status, self._tr_handle, 1, self._connections[0]()._db_handle, len(_tpb), _tpb) if db_api_error(self._isc_status): self._tr_handle = None raise exception_from_status(DatabaseError, self._isc_status, "Error while starting transaction:") elif len(self._connections) > 1: cnum = len(self._connections) teb_array = tebarray_factory(cnum) for i in xrange(cnum): teb_array[i].db_ptr = ctypes.pointer(self._connections[i]()._db_handle) teb_array[i].tpb_len = len(_tpb) teb_array[i].tpb_ptr = _tpb api.isc_start_multiple(self._isc_status, self._tr_handle, cnum, teb_array ) if db_api_error(self._isc_status): self._tr_handle = None raise exception_from_status(DatabaseError, self._isc_status, "Error while starting transaction:") def commit(self, retaining=False): """Commit any pending transaction to the database. .. note:: If transaction is not active, this method does nothing, because the consensus among Python DB API experts is that transactions should always be started implicitly, even if that means allowing a `commit()` or `rollback()` without an actual transaction. :param boolean retaining: Indicates whether the transactional context of the transaction being resolved should be recycled. :raises DatabaseError: When error is returned by server as response to commit. """ if not self.active: return if retaining: api.isc_commit_retaining(self._isc_status, self._tr_handle) else: self.__close_cursors() api.isc_commit_transaction(self._isc_status, self._tr_handle) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Error while commiting transaction:") if not retaining: self._tr_handle = None def rollback(self, retaining=False, savepoint=None): """Rollback any pending transaction to the database. .. note:: If transaction is not active, this method does nothing, because the consensus among Python DB API experts is that transactions should always be started implicitly, even if that means allowing a `commit()` or `rollback()` without an actual transaction. :param boolean retaining: Indicates whether the transactional context of the transaction being resolved should be recycled. Mutually exclusive with 'savepoint`. :param string savepoint: Savepoint name. Causes the transaction to roll back only as far as the designated savepoint, rather than rolling back entirely. Mutually exclusive with 'retaining`. :raises ProgrammingError: If both `savepoint` and `retaining` are specified. :raises DatabaseError: When error is returned by server as response to rollback. """ if not self.active: return if retaining and savepoint: raise ProgrammingError("Can't rollback to savepoint while" " retaining context") if savepoint: self.execute_immediate('rollback to %s' % savepoint) else: if retaining: api.isc_rollback_retaining(self._isc_status, self._tr_handle) else: self.__close_cursors() api.isc_rollback_transaction(self._isc_status, self._tr_handle) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Error while rolling back transaction:") if not retaining: self._tr_handle = None def close(self): """Permanently closes the Transaction object and severs its associations with other objects (:class:`Cursor` and :class:`Connection` instances). .. important:: If the physical transaction is unresolved when this method is called, a :meth:`commit` or :meth:`rollback` will be performed first, accordingly to :attr:`default_action` value. """ exc = None try: self._finish() except Exception as e: exc = e del self._cursors[:] del self._connections[:] self.__closed = True if exc: raise exc def savepoint(self, name): """Establishes a savepoint with the specified name. .. note:: If transaction is bound to multiple connections, savepoint is created on all of them. .. important:: Because savepoint is created not through Firebird API (there is no such API call), but by executing `SAVEPOINT ` SQL statement, calling this method starts the transaction if it was not yet started. :param string name: Savepoint name. """ self.execute_immediate('SAVEPOINT %s' % name) def cursor(self,connection = None): """Creates a new :class:`Cursor` that will operate in the context of this Transaction. :param connection: **Required only when** Transaction is bound to multiple `Connections`, to specify to which `Connection` the returned Cursor should be bound. :type connection: :class:`Connection` instance :raises ProgrammingError: When transaction operates on multiple `Connections` and: `connection` parameter is not specified, or specified `connection` is not among `Connections` this Transaction is bound to. """ if len(self._connections) > 1: if not connection: raise ProgrammingError("Transaction.cursor on multiple connections" " requires 'connection' parameter") if not self.__con_in_list(connection): raise ProgrammingError("Transaction.cursor connection not in" " list of connections for this transaction") con = connection else: con = self._connections[0]() c = Cursor(con, self) self._cursors.append(weakref.ref(c, _weakref_callback(self.__remove_cursor))) return c def trans_info(self, request): """Pythonic wrapper around :meth:`transaction_info` call. :param request: One or more information request codes (see :meth:`transaction_info` for details). Multiple codes must be passed as tuple. :returns: Decoded response(s) for specified request code(s). When multiple requests are passed, returns a dictionary where key is the request code and value is the response from server. """ # We process request as a sequence of info codes, even if only one code # was supplied by the caller. requestIsSingleton = isinstance(request, int) if requestIsSingleton: request = (request,) results = {} for infoCode in request: # The global().get(...) workaround is here because only recent # versions of FB expose constant isc_info_tra_isolation: if infoCode == globals().get('isc_info_tra_isolation', -1): buf = self.transaction_info(infoCode, 's') buf = buf[1 + struct.calcsize('h'):] if len(buf) == 1: results[infoCode] = bytes_to_uint(buf) else: # For isolation level isc_info_tra_read_committed, the # first byte indicates the isolation level # (isc_info_tra_read_committed), while the second indicates # the record version flag (isc_info_tra_rec_version or # isc_info_tra_no_rec_version). isolationLevelByte, recordVersionByte = struct.unpack('cc', buf) isolationLevel = bytes_to_uint(isolationLevelByte) recordVersion = bytes_to_uint(recordVersionByte) results[infoCode] = (isolationLevel, recordVersion) else: # At the time of this writing (2006.02.09), # isc_info_tra_isolation is the only known return value of # isc_transaction_info that's not a simple integer. results[infoCode] = self.transaction_info(infoCode, 'i') if requestIsSingleton: return results[request[0]] else: return results def transaction_info(self, info_code, result_type): """Return information about active transaction. This is very thin wrapper around Firebird API `isc_transaction_info` call. :param integer info_code: One from the `isc_info_tra_*` constants. :param result_type: Code for result type. :type result_type: string 's' or 'i' :raises ProgrammingError: If transaction is not active. :raises OperationalError: When result is too large to fit into buffer of size SHRT_MAX. :raises InternalError: On unexpected processing condition. :raises ValueError: When illegal result type code is specified. """ self.__check_active() request_buffer = bs([info_code]) buf_size = 256 while True: res_buf = int2byte(0) * buf_size api.isc_transaction_info(self._isc_status, self._tr_handle, len(request_buffer), request_buffer, len(res_buf), res_buf) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Error while requesting transaction information:") i = buf_size - 1 while i >= 0: if res_buf[i] != mychr(0): break else: i -= 1 if ord2(res_buf[i]) == isc_info_truncated: if buf_size < SHRT_MAX: buf_size *= 2 if buf_size > SHRT_MAX: buf_size = SHRT_MAX continue else: raise OperationalError("Result is too large to fit into" " buffer of size SHRT_MAX, yet underlying info" " function only accepts buffers with size <= SHRT_MAX.") else: break if ord2(res_buf[i]) != isc_info_end: raise InternalError("Exited request loop sucessfuly, but" " res_buf[i] != sc_info_end.") if request_buffer[0] != res_buf[0]: raise InternalError("Result code does not match request code.") if result_type.upper() == 'I': return bytes_to_uint(res_buf[3:3 + bytes_to_int(res_buf[1:3])]) elif result_type.upper() == 'S': return p3fix(ctypes.string_at(res_buf, i),self.__python_charset) else: raise ValueError("Unknown result type requested (must be 'i'" "or 's').") def prepare(self): """Manually triggers the first phase of a two-phase commit (2PC). .. note:: Direct use of this method is optional; if preparation is not triggered manually, it will be performed implicitly by `commit()` in a 2PC. """ self.__check_active() api.isc_prepare_transaction(self._isc_status, self._tr_handle) if db_api_error(self._isc_status): self.rollback() raise exception_from_status(DatabaseError, self._isc_status, "Error while preparing transaction:") def __del__(self): if self._tr_handle != None: self.close() #: (Read Only) True if transaction is closed. closed = property(__get_closed) #: (Read Only) True if transaction is active. active = property(__get_active) #: (Read Only) List of :class:`Cursor` objects associated with this Transaction. cursors = property(__get_cursors) #: (Read/Write) (string) 'commit' or 'rollback', action to be #: taken when physical transaction has to be ended automatically. #: **Default is 'commit'**. default_action = property(__get_default_action,__set_default_action) class ConnectionGroup(object): """Manager for distributed transactions, i.e. transactions that span multiple databases. .. tip:: ConnectionGroup supports `in` operator to check membership of connections. """ # XXX: ConnectionGroup objects currently are not thread-safe. Since # separate Connections can be manipulated simultaneously by different # threads in kinterbasdb, it would make sense for a container of multiple # connections to be safely manipulable simultaneously by multiple threads. # XXX: Adding two connections to the same database freezes the DB client # library. However, I've no way to detect with certainty whether any given # con1 and con2 are connected to the same database, what with database # aliases, IP host name aliases, remote-vs-local protocols, etc. # Therefore, a warning must be added to the docs. def __init__(self, connections=()): """ :param iterable connections: Sequence of :class:`Connection` instances. .. seealso:: See :meth:`add` for list of exceptions the constructor may throw. """ self._cons = [] self._transaction = None self._default_tpb = ISOLATION_LEVEL_READ_COMMITED for con in connections: self.add(con) def __del__(self): self.disband() def __get_default_tpb(self): return self._default_tpb def __set_default_tpb(self, value): self._default_tpb = _validateTPB(value) def disband(self): """Forcefully deletes all connections from connection group. .. note:: If transaction is active, it’s canceled (**rollback**). .. note:: Any error during transaction finalization doesn't stop the disband process, however the exception catched is eventually reported. """ exc = None if self._transaction: try: self._transaction.default_action = 'rollback' self._transaction.close() except Exception as e: exc = e self._transaction = None self.clear() if exc: raise exc # Membership methods: def add(self, con): """Adds active connection to the group. :param con: A :class:`Connection` instance to add to this group. :raises TypeError: When `con` is not :class:`Connection` instance. :raises ProgrammingError: When `con` is already member of this or another group, or :attr:`~Connection.closed`. When this group has unresolved transaction or contains 16 connections. """ ### CONTRAINTS ON $con: ### # con must be an instance of kinterbasdb.Connection: if not isinstance(con, Connection): raise TypeError("con must be an instance of fdb.Connection") # con cannot already be a member of this group: if con in self: raise ProgrammingError("con is already a member of this group.") # con cannot belong to more than one group at a time: if con.group: raise ProgrammingError("con is already a member of another group;" " it cannot belong to more than one group at once.") # con must be connected to a database; it must not have been closed. if con.closed: raise ProgrammingError("con has been closed; it cannot join a group.") #if con._timeout_enabled: #raise ProgrammingError('Connections with timeout enabled cannot' #' participate in distributed transactions.') ### CONTRAINTS ON $self: ### # self cannot accept new members while self has an unresolved # transaction: self.__require_transaction_state(False, "Cannot add connection to group that has an unresolved transaction.") self.__drop_transaction() # self cannot have more than DIST_TRANS_MAX_DATABASES members: if self.count() >= DIST_TRANS_MAX_DATABASES: raise ProgrammingError("The database engine limits the number of" " database handles that can participate in a single" " distributed transaction to %d or fewer; this group already" " has %d members." % (DIST_TRANS_MAX_DATABASES, self.count()) ) ### CONTRAINTS FINISHED ### # Can't set con.group directly (read-only); must use package-private # method. con._set_group(self) self._cons.append(con) def remove(self, con): """Removes specified connection from group. :param con: A :class:`Connection` instance to remove. :raises ProgrammingError: When `con` doesn't belong to this group or transaction is active. """ if con not in self: raise ProgrammingError("con is not a member of this group.") assert con.group is self self.__require_transaction_state(False, "Cannot remove connection from group that has an unresolved transaction.") self.__drop_transaction() con._set_group(None) self._cons.remove(con) def clear(self): """Removes all connections from group. :raises ProgrammingError: When transaction is active. """ self.__require_transaction_state(False, "Cannot clear group that has an unresolved transaction.") self.__drop_transaction() for con in self.members(): self.remove(con) assert self.count() == 0 def cursor(self, connection): """Creates a new :class:`Cursor` that will operate in the context of distributed transaction and specific :class:`Connection` that belongs to this group. .. note:: Automatically starts transaction if it's not already started. :param connection: :class:`Connection` instance. :raises ProgrammingError: When group is empty or specified `connection` doesn't belong to this group. """ if not self._transaction: self.__require_non_empty_group('start') self._transaction = Transaction(self._cons) return self._transaction.cursor(connection) def members(self): "Returns list of connection objects that belong to this group." return self._cons[:] # return a *copy* of the internal list def count(self): "Returns number of :class:`Connection` objects that belong to this group." return len(self._cons) def contains(self, con): """Returns True if specified connection belong to this group. :param con: :class:`Connection` instance. """ return con in self._cons __contains__ = contains # alias to support the 'in' operator def __iter__(self): return iter(self._cons) def __drop_transaction(self): if self._transaction: self._transaction.close() self._transaction = None def __require_transaction_state(self, must_be_active, err_msg=''): transaction = self._transaction if ( (must_be_active and transaction is None) or (not must_be_active and (transaction is not None and transaction.active)) ): raise ProgrammingError(err_msg) def __require_non_empty_group(self, operation_name): if self.count() == 0: raise ProgrammingError("Cannot %s distributed transaction with" " an empty ConnectionGroup." % operation_name) def __ensure_transaction(self): if not self._transaction: self.__require_non_empty_group('start') self._transaction = Transaction(self._cons, default_tpb=self.default_tpb) # Transactional methods: def execute_immediate(self, sql): """Executes a statement on all member connections without caching its prepared form. Automatically starts transaction if it's not already started. :param string sql: SQL statement to execute. .. important:: **The statement must not be of a type that returns a result set.** In most cases (especially cases in which the same statement – perhaps a parameterized statement – is executed repeatedly), it is better to create a cursor using the connection’s cursor method, then execute the statement using one of the cursor’s execute methods. :param string sql: SQL statement to execute. :raises DatabaseError: When error is returned from server. """ self.__ensure_transaction() self._transaction.execute_immediate(sql) def begin(self, tpb=None): """Starts distributed transaction over member connections. :param tpb: (Optional) Transaction Parameter Buffer for newly started transaction. If not specified, :attr:`default_tpb` is used. :type tpb: :class:`TPB` instance, list/tuple of `isc_tpb_*` constants or `bytestring` :raises ProgrammingError: When group is empty or has active transaction. """ self.__require_transaction_state(False, "Must resolve current transaction before starting another.") self.__ensure_transaction() self._transaction.begin(tpb) def savepoint(self, name): """Establishes a named SAVEPOINT on all member connections. See :meth:`Transaction.savepoint` for details. :param string name: Name for savepoint. :raises ProgrammingError: When group is empty. """ self.__require_non_empty_group('savepoint') return self._transaction.savepoint(name) def prepare(self): """ Manually triggers the first phase of a two-phase commit (2PC). Use of this method is optional; if preparation is not triggered manually, it will be performed implicitly by commit() in a 2PC. """ self.__require_non_empty_group('prepare') self.__require_transaction_state(True,"This group has no transaction to prepare.") self._transaction.prepare() def commit(self, retaining=False): """Commits distributed transaction over member connections using 2PC. .. note:: If transaction is not active, this method does nothing, because the consensus among Python DB API experts is that transactions should always be started implicitly, even if that means allowing a `commit()` or `rollback()` without an actual transaction. :param boolean retaining: Indicates whether the transactional context of the transaction being resolved should be recycled. :raises ProgrammingError: When group is empty. """ self.__require_non_empty_group('commit') # The consensus among Python DB API experts is that transactions should # always be started implicitly, even if that means allowing a commit() # or rollback() without an actual transaction. if self._transaction is None: return self._transaction.commit(retaining) def rollback(self, retaining=False, savepoint=None): """Rollbacks distributed transaction over member connections. .. note:: If transaction is not active, this method does nothing, because the consensus among Python DB API experts is that transactions should always be started implicitly, even if that means allowing a `commit()` or `rollback()` without an actual transaction. :param boolean retaining: Indicates whether the transactional context of the transaction being resolved should be recycled. :raises ProgrammingError: When group is empty. """ self.__require_non_empty_group('rollback') # The consensus among Python DB API experts is that transactions should # always be started implicitly, even if that means allowing a commit() # or rollback() without an actual transaction. if self._transaction is None: return self._transaction.rollback(retaining, savepoint) #: (Read/Write) Deafult Transaction Parameter Block used for transactions. default_tpb = property(__get_default_tpb, __set_default_tpb) class BlobReader(object): """BlobReader is a “file-like” class, so it acts much like a file instance opened in `rb` mode. .. important:: DO NOT create instances of this class directly! BlobReader instances are returned automatically in place of output BLOB values when `stream` BLOB access is requested via :meth:`PreparedStatement.set_stream_blob`. .. tip:: BlobReader supports iterator protocol, yielding lines like :meth:`readline`. """ def __init__(self, blobid, db_handle, tr_handle, is_text, charset): self.__closed = False self.__mode = 'rb' self.__bytes_read = 0 self.__pos = 0 self.__index = 0 #self.__bstream = api.Bopen(blobid, db_handle, tr_handle, self.__mode) self.__db_handle = db_handle self.__tr_handle = tr_handle self.__is_text = is_text self.__charset = charset self.__python_charset = charset_map.get(charset,charset) self.__blobid = blobid self.__opened = False self._blob_handle = isc_blob_handle() self._isc_status = ISC_STATUS_ARRAY() def __ensure_open(self): if self.closed: raise ProgrammingError("BlobReader is closed.") if not self.__opened: self.__open() def __open(self): api.isc_open_blob2(self._isc_status, self.__db_handle, self.__tr_handle, self._blob_handle, self.__blobid, 4, bs([ibase.isc_bpb_version1, ibase.isc_bpb_type,1, ibase.isc_bpb_type_stream])) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Cursor.read_output_blob/isc_open_blob2:") # Get BLOB total length and max. size of segment result = ctypes.cast(ctypes.create_string_buffer(20), buf_pointer) api.isc_blob_info(self._isc_status, self._blob_handle, 2, bs([isc_info_blob_total_length, isc_info_blob_max_segment]), 20, result) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "Cursor.read_output_blob/isc_blob_info:") offset = 0 while bytes_to_uint(result[offset]) != isc_info_end: code = bytes_to_uint(result[offset]) offset += 1 if code == isc_info_blob_total_length: length = bytes_to_uint(result[offset:offset + 2]) self._blob_length = bytes_to_uint(result[ offset + 2:offset + 2 + length]) offset += length + 2 elif code == isc_info_blob_max_segment: length = bytes_to_uint(result[offset:offset + 2]) self._segment_size = bytes_to_uint(result[ offset + 2:offset + 2 + length]) offset += length + 2 # Create internal buffer self.__buf = ctypes.create_string_buffer(self._segment_size) self.__buf_pos = 0 self.__buf_data = 0 self.__opened = True def __reset_buffer(self): ctypes.memset(self.__buf,0,self._segment_size) self.__buf_pos = 0 self.__buf_data = 0 def __BLOB_get(self): self.__reset_buffer() # Load BLOB allow_incomplete_segment_read = False status = ISC_STATUS(0) bytes_read = 0 bytes_actually_read = ctypes.c_ushort(0) status = api.isc_get_segment(self._isc_status, self._blob_handle, bytes_actually_read, self._segment_size, ctypes.byref(self.__buf)) if status != 0: if status == ibase.isc_segstr_eof: self.__buf_data = 0 elif ((status == isc_segment) and allow_incomplete_segment_read): self.__buf_data = bytes_actually_read.value else: raise exception_from_status(DatabaseError, self._isc_status, "BlobReader.__BLOB_get/isc_get_segment:") else: self.__buf_data = bytes_actually_read.value def close(self): """Closes the Reader. Like :meth:`file.close`. :raises DatabaseError: When error is returned by server. """ if self.__opened and not self.closed: self.__closed = True api.isc_close_blob(self._isc_status, self._blob_handle) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "BlobReader.close/isc_close_blob:") def flush(self): """Flush the internal buffer. Like :meth:`file.flush`. Does nothing as it's pointless for reader.""" pass def next(self): """Return the next line from the BLOB. Part of *iterator protocol*. :raises StopIteration: If there are no further lines. """ line = self.readline() if line: return line else: raise StopIteration __next__ = next def __iter__(self): return self def read(self, size = -1): """Read at most size bytes from the file (less if the read hits EOF before obtaining size bytes). If the size argument is negative or omitted, read all data until EOF is reached. The bytes are returned as a string object. An empty string is returned when EOF is encountered immediately. Like :meth:`file.read`. :raises ProgrammingError: When reader is closed. .. note:: Performs automatic conversion to `unicode` for TEXT BLOBs, if used Python is v3 or `connection charset` is defined. """ self.__ensure_open() if size >= 0: to_read = min(size,self._blob_length - self.__pos) else: to_read = self._blob_length - self.__pos return_size = to_read result = ctypes.create_string_buffer(return_size) pos = 0 while to_read > 0: to_copy = min(to_read, self.__buf_data - self.__buf_pos) if to_copy == 0: self.__BLOB_get() to_copy = min(to_read, self.__buf_data - self.__buf_pos) if to_copy == 0: # BLOB EOF break ctypes.memmove(ctypes.byref(result,pos), ctypes.byref(self.__buf,self.__buf_pos), to_copy) pos += to_copy self.__pos += to_copy self.__buf_pos += to_copy to_read -= to_copy result = result.raw[:return_size] if (self.__charset or PYTHON_MAJOR_VER == 3) and self.__is_text: result = b2u(result,self.__python_charset) return result def readline(self): """Read one entire line from the file. A trailing newline character is kept in the string (but may be absent when a file ends with an incomplete line). An empty string is returned when EOF is encountered immediately. Like :meth:`file.readline`. :raises ProgrammingError: When reader is closed. .. note:: Performs automatic conversion to `unicode` for TEXT BLOBs, if used Python is v3 or `connection charset` is defined. """ self.__ensure_open() line = [] to_read = self._blob_length - self.__pos to_copy = 0 found = False while to_read > 0 and not found: to_scan = min(to_read, self.__buf_data - self.__buf_pos) if to_scan == 0: self.__BLOB_get() to_scan = min(to_read, self.__buf_data - self.__buf_pos) if to_scan == 0: # BLOB EOF break pos = 0 result = '' while pos < to_scan: if self.__buf[self.__buf_pos+pos] == ibase.b('\n'): found = True pos += 1 break pos += 1 result = ctypes.string_at(ctypes.byref(self.__buf,self.__buf_pos), pos) if (self.__charset or PYTHON_MAJOR_VER == 3) and self.__is_text: result = b2u(result,self.__python_charset) line.append(result) self.__buf_pos += pos self.__pos += pos to_read -= pos return ''.join(line) def readlines(self, sizehint = None): """Read until EOF using :meth:`readline` and return a list containing the lines thus read. The optional sizehint argument (if present) is ignored. Like :meth:`file.readlines`. .. note:: Performs automatic conversion to `unicode` for TEXT BLOBs, if used Python is v3 or `connection charset` is defined. """ result = [] line = self.readline() while line: result.append(line) line = self.readline() return result def seek(self, offset, whence = os.SEEK_SET): """Set the file’s current position, like stdio‘s `fseek()`. See :meth:`file.seek` details. :param integer offset: Offset from specified position. :param whence: (Optional) Context for offset. :type whence: os.SEEK_SET, os.SEEK_CUR or os.SEEK_END :raises ProgrammingError: When reader is closed. .. warning:: If BLOB was NOT CREATED as `stream` BLOB, this method raises :exc:`DatabaseError` exception. This constraint is set by Firebird. """ self.__ensure_open() pos = ISC_LONG(0) api.isc_seek_blob (self._isc_status, self._blob_handle, whence, ISC_LONG(offset), ctypes.byref(pos)) if db_api_error(self._isc_status): raise exception_from_status(DatabaseError, self._isc_status, "BlobReader.seek/isc_blob_info:") self.__pos = pos.value self.__reset_buffer() def tell(self): """Return current position in BLOB, like stdio‘s `ftell()` and :meth:`file.tell`.""" return self.__pos def __get_closed(self): return self.__closed def __get_mode(self): return self.__mode def __del__(self): self.close() #: (Read Only) (boolean) True is BlobReader is closed. closed = property(__get_closed) #: (Read Only) (string) File mode - always "rb" mode = property(__get_mode) class _RowMapping(object): """An internal dictionary-like class that wraps a row of results in order to map field name to field value. .. warning:: We make ABSOLUTELY NO GUARANTEES about the return value of the `fetch(one|many|all)` methods except that it is a sequence indexed by field position, and no guarantees about the return value of the `fetch(one|many|all)map` methods except that it is a mapping of field name to field value. Therefore, client programmers should NOT rely on the return value being an instance of a particular class or type. """ def __init__(self, description, row): self._description = description fields = self._fields = {} pos = 0 for fieldSpec in description: # It's possible for a result set from the database engine to return # multiple fields with the same name, but kinterbasdb's key-based # row interface only honors the first (thus setdefault, which won't # store the position if it's already present in self._fields). fields.setdefault(fieldSpec[DESCRIPTION_NAME], row[pos]) pos += 1 def __len__(self): return len(self._fields) def __getitem__(self, fieldName): fields = self._fields # Straightforward, unnormalized lookup will work if the fieldName is # already uppercase and/or if it refers to a database field whose # name is case-sensitive. if fieldName in fields: return fields[fieldName] else: fieldNameNormalized = _normalizeDatabaseIdentifier(fieldName) try: return fields[fieldNameNormalized] except KeyError: raise KeyError('Result set has no field named "%s". The field' ' name must be one of: (%s)' % (fieldName, ', '.join(fields.keys())) ) def get(self, fieldName, defaultValue=None): try: return self[fieldName] except KeyError: return defaultValue def __contains__(self, fieldName): try: self[fieldName] except KeyError: return False else: return True def __str__(self): # Return an easily readable dump of this row's field names and their # corresponding values. return '' % ', '.join([ '%s = %s' % (fieldName, self[fieldName]) for fieldName in self._fields.keys() ]) def keys(self): # Note that this is an *ordered* list of keys. return [fieldSpec[DESCRIPTION_NAME] for fieldSpec in self._description] def values(self): # Note that this is an *ordered* list of values. return [self[fieldName] for fieldName in self.keys()] def items(self): return [(fieldName, self[fieldName]) for fieldName in self.keys()] def iterkeys(self): for fieldDesc in self._description: yield fieldDesc[DESCRIPTION_NAME] __iter__ = iterkeys def itervalues(self): for fieldName in self: yield self[fieldName] def iteritems(self): for fieldName in self: yield fieldName, self[fieldName] class _RequestBufferBuilder(object): def __init__(self, clusterIdentifier=None): self.clear() if clusterIdentifier: self._addCode(clusterIdentifier) def render(self): # Convert the RequestBufferBuilder's components to a binary Python str. return b('').join(self._buffer) def clear(self): self._buffer = [] def _extend(self, otherRequestBuilder): self._buffer.append(otherRequestBuilder.render()) def _addRaw(self, rawBuf): assert isinstance(rawBuf, mybytes) self._buffer.append(rawBuf) def _addCode(self, code): self._code2reqbuf(self._buffer, code) def _code2reqbuf(self, reqBuf, code): if isinstance(code, str): assert len(code) == 1 code = ord(code) # The database engine considers little-endian integers "portable"; they # need to have been converted to little-endianness before being sent # across the network. reqBuf.append(struct.pack(' UINT_MAX): raise ValueError('Lock resolution must be either None' ' or a non-negative int number of seconds between 0 and' ' %d.' % UINT_MAX) self._lock_timeout = lock_timeout #: (integer) Required lock timeout or None. #: #: **Default:** `None` lock_timeout = property(_get_lock_timeout, _set_lock_timeout) # table_reservation property (an instance of TableReservation): def _get_table_reservation(self): if self._table_reservation is None: self._table_reservation = TableReservation() return self._table_reservation def _set_table_reservation_access(self, _): raise ProgrammingError('Instead of changing the value of the' ' .table_reservation object itself, you must change its *elements*' ' by manipulating it as though it were a dictionary that mapped' '\n "TABLE_NAME": (sharingMode, accessMode)' '\nFor example:' '\n tpbBuilder.table_reservation["MY_TABLE"] =' ' (kinterbasdb.isc_tpb_protected, kinterbasdb.isc_tpb_lock_write)' ) #: (:class:`TableReservation`) Table reservation specification. #: #: **Default:** `None`. #: #: Instead of changing the value of the TableReservation object itself, you #: must change its elements by manipulating it as though it were a dictionary #: that mapped “TABLE_NAME”: (sharingMode, accessMode) For example: #: #: .. code-block:: python #: #: tpb.table_reservation["MY_TABLE"] = (fdb.isc_tpb_protected, fdb.isc_tpb_lock_write) table_reservation = property(_get_table_reservation, _set_table_reservation_access) class TableReservation(object): """A dictionary-like helper class that maps “TABLE_NAME”: (sharingMode, accessMode). It performs validation of values assigned to keys. """ _MISSING = object() _SHARING_MODE_STRS = { isc_tpb_shared: 'isc_tpb_shared', isc_tpb_protected: 'isc_tpb_protected', isc_tpb_exclusive: 'isc_tpb_exclusive', } _ACCESS_MODE_STRS = { isc_tpb_lock_read: 'isc_tpb_lock_read', isc_tpb_lock_write: 'isc_tpb_lock_write', } def __init__(self): self._res = {} def copy(self): # A shallow copy is fine. import copy return copy.copy(self) def render(self): """Create valid `table access parameter block` according to current key/value pairs. :returns: (string) Table access definition block. """ if not self: return b('') frags = [] _ = frags.append for tableName, resDefs in self.iteritems(): tableNameLenWithTerm = len(b(tableName)) + 1 for (sharingMode, accessMode) in resDefs: _(int2byte(accessMode)) _(struct.pack('' frags = ['') return ''.join(frags) def keys(self): return self._res.keys() def values(self): return self._res.values() def items(self): return self._res.items() def iterkeys(self): return self._res.iterkeys() def itervalues(self): return self._res.itervalues() def iteritems(self): ### Todo: verify handling of P version differences if PYTHON_MAJOR_VER == 3: return self._res.items() else: return self._res.iteritems() def __setitem__(self, key, value): key = self._validateKey(key) key = _normalizeDatabaseIdentifier(key) # If the += operator is being applied, the form of value will be like: # [(sharingMode0, accessMode0), ..., newSharingMode, newAccessMode] # For the sake of convenience, we detect this situation and handle it # "naturally". if isinstance(value, list) and len(value) >= 3: otherValues = value[:-2] value = tuple(value[-2:]) else: otherValues = None if ( (not isinstance(value, tuple)) or len(value) != 2 or value[0] not in (isc_tpb_shared, isc_tpb_protected, isc_tpb_exclusive) or value[1] not in (isc_tpb_lock_read, isc_tpb_lock_write) ): raise ValueError('Table reservation entry must be a 2-tuple of' ' the following form:\n' 'element 0: sharing mode (one of (isc_tpb_shared,' ' isc_tpb_protected, isc_tpb_exclusive))\n' 'element 1: access mode (one of (isc_tpb_lock_read,' ' isc_tpb_lock_write))\n' '%s is not acceptable.' % str(value) ) if otherValues is None: value = [value] else: otherValues.append(value) value = otherValues self._res[key] = value def _validateKey(self, key): ### Todo: verify handling of P version differences, refactor if PYTHON_MAJOR_VER == 3: keyMightBeAcceptable = isinstance(key, str) if keyMightBeAcceptable and isinstance(key, str): try: key.encode('ASCII') except UnicodeEncodeError: keyMightBeAcceptable = False if not keyMightBeAcceptable: raise TypeError('Only str keys are allowed.') else: keyMightBeAcceptable = isinstance(key, basestring) if keyMightBeAcceptable and isinstance(key, unicode): try: key = key.encode('ASCII') except UnicodeEncodeError: keyMightBeAcceptable = False if not keyMightBeAcceptable: raise TypeError('Only str keys are allowed.') return key def _validateTPB(tpb): if isinstance(tpb, TPB): # TPB's accessor methods perform their own validation, and its # render method takes care of infrastructural trivia. return tpb elif isinstance(tpb, (ListType, TupleType)): return tpb elif not (isinstance(tpb, mybytes) and len(tpb) > 0): raise ProgrammingError('TPB must be non-unicode string of length > 0') # The kinterbasdb documentation promises (or at least strongly implies) # that if the user tries to set a TPB that does not begin with # isc_tpb_version3, kinterbasdb will automatically supply that # infrastructural value. This promise might cause problems in the future, # when isc_tpb_version3 is superseded. A possible solution would be to # check the first byte against all known isc_tpb_versionX version flags, # like this: # if tpb[0] not in (isc_tpb_version3, ..., isc_tpb_versionN): # tpb = isc_tpb_version3 + tpb # That way, compatibility with old versions of the DB server would be # maintained, but client code could optionally specify a newer TPB version. if tpb[0] != isc_tpb_version3: tpb = isc_tpb_version3 + tpb return tpb def _normalizeDatabaseIdentifier(ident): if ident.startswith('"') and ident.endswith('"'): # Quoted name; leave the case of the field name untouched, but # strip the quotes. return ident[1:-1] else: # Everything else is normalized to uppercase to support case- # insensitive lookup. return ident.upper() fdb-1.4.9+dfsg1/test/0000755000215700017510000000000012544565035013155 5ustar rstuartitfdb-1.4.9+dfsg1/test/fbtest25.fdb0000644000215700017510000470000012544564035015270 0ustar rstuartit90c    w2 f  N908` 90909090L|`D( dH,     h L 0       l P 4       p T 8       t X <       x \ @ $  hL0 E D CBA@?>=<;:9876543210/.-,+*)('&%$#"!                90T9090QRSU90Z7;7;90V90^dR<<dR<<90+X 90]dR<<z! <%I>%I>! <dR<<90  FHIJKLMNOPUUU90[pL;\=<i ;\; ;=<pL;90 G90W=<Y=<=<=<9090|?}???9090k===90 90 _*>*>90 90 90 U90 萚;萚;90 U90 `sm<1 C=1 C=sm<90 90 vw9090a??9090b??9090l9090~*=*=9090x= =y??= =9090{9090c.=.=.=.=9090==9090dL<g<&=&==g<L<9090e%I=%I=9090f&<=<=<&<90909090p=q===9090m><><? ? ?><=><9090nى<tى<ى<ى<9090ob;ub;6W=b;b;9090rL>sL>L>L>90U90??90 90 90$I`QUMhPT \T d L RX Z U O\ S P R` V T R\ Z PRdTRV\ZTYTWURXPZVD^\RDB$FIELD_PRECISION RDB$FIELDS RDB$FIELD_PRECISION RDB$CHARACTER_SET_ID RDB$FIELDS RDB$CHARACTER_SET_ID RDB$COLLATION_ID RDB$FIELDS RDB$COLLATION_ID RDB$CHARACTER_LENGTH RDB$FIELDS RDB$FIELD_LENGTH RDB$NULL_FLAG RDB$FIELDS RDB$NULL_FLAG RDB$DIMENSIONS RDB$FIELDS RDB$DIMENSIONS RDB$EXTERNAL_TYPE RDB$FIELDS RDB$FIELD_TYPE RDB$EXTERNAL_SCALE RDB$FIELDS RDB$FIELD_SCALE RDB$EXTERNAL_LENGTH RDB$FIELDS RDB$FIELD_LENGTH RDB$EDIT_STRING RDB$FIELDS RDB$EDIT_STRING RDB$SEGMENT_LENGTH RDB$FIELDS RDB$SEGMENT_LENGTH RDB$QUERY_HEADER RDB$FIELDS RDB$QUERY_HEADER RDB$SYSTEM_FLAG RDB$FIELDS RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$FIELDS RDB$DESCRIPTION RDB$MISSING_SOURCE RDB$FIELDS RDB$SOURCE   RDB$MISSING_VALUE RDB$FIELDS RDB$VALUE   RDB$FIELD_SUB_TYPE RDB$FIELDS RDB$FIELD_SUB_TYPE   RDB$FIELD_TYPE RDB$FIELDS RDB$FIELD_TYPE   RDB$FIELD_SCALE RDB$FIELDS RDB$FIELD_SCALE   RDB$FIELD_LENGTH RDB$FIELDS RDB$FIELD_LENGTH RDB$DEFAULT_SOURCE RDB$FIELDS RDB$SOURCE RDB$DEFAULT_VALUE RDB$FIELDS RDB$VALUE RDB$COMPUTED_SOURCE RDB$FIELDS RDB$SOURCE RDB$COMPUTED_BLR RDB$FIELDS RDB$VALUE RDB$VALIDATION_SOURCE RDB$FIELDS RDB$SOURCE RDB$VALIDATION_BLR RDB$FIELDS RDB$VALIDATION_BLR RDB$QUERY_NAME RDB$FIELDS RDB$FIELD_NAME RDB$FIELD_NAME RDB$FIELDS RDB$FIELD_NAME RDB$CHARACTER_SET_NAME RDB$DATABASE RDB$CHARACTER_SET_NAME RDB$SECURITY_CLASS RDB$DATABASE RDB$SECURITY_CLASS RDB$RELATION_ID RDB$DATABASE RDB$RELATION_ID RDB$DESCRIPTION RDB$DATABASE RDB$DESCRIPTION RDB$PAGE_TYPE RDB$PAGES RDB$PAGE_TYPE RDB$PAGE_SEQUENCE RDB$PAGES RDB$PAGE_SEQUENCE RDB$RELATION_ID RDB$PAGES RDB$RELATION_ID RDB$PAGE_NUMBER RDB$PAGES RDB$PAGE_NUMBER 90,,O=CKDpL(F CS` E$ : : E\ A > G <P E L Ax G0 E Q L@ N >GlI(C?G|QhC(@CD\BB@DHID*\z RDB$FORMATS SQL$3 SYSDBA SQL$DEFAULT3  RDB$PAGES SQL$2 SYSDBA SQL$DEFAULT2  RDB$ROLES SQL$1 SYSDBA SQL$DEFAULT1 EX_ RDB$FIELDS SYSDBA DRDB$EXCEPTIONS SYSDBA &RDB$TRIGGER_NAMERDB$RELATION_NAMERDB$TRIGGER_SEQUENCERDB$TRIGGER_TYPERDB$TRIGGER_SOURCERDB$TRIGGER_BLRRDB$DESCRIPTIONRDB$TRIGGER_INACTIVERDB$SYSTEM_FLAG RDB$FLAGS RDB$VALID_BLR RDB$DEBUG_INFO RDB$TRIGGER_2 RDB$TRIGGER_21 RDB$TRIGGER_22 RDB$TRIGGER_3 RDB$USER RDB$GRANTORRDB$PRIVILEGERDB$GRANT_OPTIONRDB$RELATION_NAMERDB$FIELD_NAMERDB$USER_TYPERDB$OBJECT_TYPE RDB$TRIGGER_1 RDB$TRIGGER_31 RDB$TRIGGER_32 RDB$TRIGGER_33 RDB$TRIGGER_8 RDB$TRIGGER_9)MON$MEMORY_USAGE SYSDBA (MON$CONTEXT_VARIABLES SYSDBA ' MON$RECORD_STATS SYSDBA &MON$IO_STATS SYSDBA % MON$CALL_STACK SYSDBA $MON$STATEMENTS SYSDBA # MON$TRANSACTIONS SYSDBA "MON$ATTACHMENTS SYSDBA !MON$DATABASE SYSDBA  RDB$BACKUP_HISTORY SYSDBA  RDB$ROLES SYSDBA  RDB$COLLATIONS SYSDBA  RDB$CHARACTER_SETS SYSDBA RDB$PROCEDURE_PARAMETERS SYSDBA RDB$PROCEDURES SYSDBA RDB$LOG_FILES SYSDBA RDB$CHECK_CONSTRAINTS SYSDBA RDB$REF_CONSTRAINTS SYSDBA RDB$RELATION_CONSTRAINTS SYSDBA RDB$FIELD_DIMENSIONS SYSDBA RDB$GENERATORS SYSDBA RDB$TRANSACTIONS SYSDBA RDB$USER_PRIVILEGES *SYSDBA RDB$TRIGGER_MESSAGES SYSDBA  RDB$FILTERS SYSDBA  RDB$FUNCTION_ARGUMENTS SYSDBA RDB$FUNCTIONS SYSDBA  RDB$DEPENDENCIES SYSDBA   RDB$TRIGGERS +SYSDBA   RDB$TYPES SYSDBA   RDB$FILES SYSDBA  RDB$SECURITY_CLASSES SYSDBA  RDB$FORMATS SYSDBA RDB$VIEW_RELATIONS SYSDBA RDB$RELATIONS SYSDBA RDB$RELATION_FIELDS SYSDBA  RDB$INDICES SYSDBA RDB$INDEX_SEGMENTS SYSDBA  RDB$FIELDS SYSDBA RDB$DATABASE SYSDBA  RDB$PAGES SYSDBA 90"TPZbZ@M Y M< U U Y0 X T W0 S R V0 S Ut a ][\[]c8_]U _]dY[cD]YRDB$NULL_FLAG RDB$RELATION_FIELDS RDB$NULL_FLAG RDB$COMPLEX_NAME RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$SECURITY_CLASS RDB$RELATION_FIELDS RDB$SECURITY_CLASS RDB$SYSTEM_FLAG RDB$RELATION_FIELDS RDB$SYSTEM_FLAG   RDB$DEFAULT_VALUE RDB$RELATION_FIELDS RDB$VALUE   RDB$DESCRIPTION RDB$RELATION_FIELDS RDB$DESCRIPTION   RDB$VIEW_CONTEXT RDB$RELATION_FIELDS RDB$VIEW_CONTEXT   RDB$FIELD_ID RDB$RELATION_FIELDS RDB$FIELD_ID   RDB$UPDATE_FLAG RDB$RELATION_FIELDS RDB$SYSTEM_FLAG RDB$QUERY_HEADER RDB$RELATION_FIELDS RDB$QUERY_HEADER RDB$FIELD_POSITION RDB$RELATION_FIELDS RDB$FIELD_POSITION RDB$EDIT_STRING RDB$RELATION_FIELDS RDB$EDIT_STRING RDB$BASE_FIELD RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$QUERY_NAME RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$FIELD_SOURCE RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$RELATION_NAME RDB$RELATION_FIELDS RDB$RELATION_NAME RDB$FIELD_NAME RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$STATISTICS RDB$INDICES RDB$STATISTICS   RDB$EXPRESSION_SOURCE RDB$INDICES RDB$SOURCE   RDB$EXPRESSION_BLR RDB$INDICES RDB$VALUE   RDB$SYSTEM_FLAG RDB$INDICES RDB$SYSTEM_FLAG   RDB$FOREIGN_KEY RDB$INDICES RDB$RELATION_NAME RDB$INDEX_TYPE RDB$INDICES RDB$SYSTEM_FLAG RDB$INDEX_INACTIVE RDB$INDICES RDB$SYSTEM_FLAG RDB$SEGMENT_COUNT RDB$INDICES RDB$SEGMENT_COUNT RDB$DESCRIPTION RDB$INDICES RDB$DESCRIPTION RDB$UNIQUE_FLAG RDB$INDICES RDB$SYSTEM_FLAG RDB$INDEX_ID RDB$INDICES RDB$INDEX_ID RDB$RELATION_NAME RDB$INDICES RDB$RELATION_NAME RDB$INDEX_NAME RDB$INDICES RDB$INDEX_NAME RDB$STATISTICS RDB$INDEX_SEGMENTS RDB$STATISTICS RDB$FIELD_POSITION RDB$INDEX_SEGMENTS RDB$FIELD_POSITION RDB$FIELD_NAME RDB$INDEX_SEGMENTS RDB$FIELD_NAME RDB$INDEX_NAME RDB$INDEX_SEGMENTS RDB$INDEX_NAME 90$[D_KRLW U UD W K OL [ ] WD O i O, \ O Y( V`h^^KpIQ^lN ^IhWQSlQWKRDB$FIELD_NAME RDB$TYPES RDB$FIELD_NAME RDB$SHADOW_NUMBER RDB$FILES RDB$SHADOW_NUMBER RDB$FILE_FLAGS RDB$FILES RDB$FILE_FLAGS RDB$FILE_LENGTH RDB$FILES RDB$FILE_LENGTH RDB$FILE_START RDB$FILES RDB$FILE_START RDB$FILE_SEQUENCE RDB$FILES RDB$FILE_SEQUENCE RDB$FILE_NAME RDB$FILES RDB$FILE_NAME RDB$DESCRIPTION RDB$SECURITY_CLASSES RDB$DESCRIPTION  RDB$ACL RDB$SECURITY_CLASSES RDB$ACL RDB$SECURITY_CLASS RDB$SECURITY_CLASSES RDB$SECURITY_CLASS RDB$DESCRIPTOR RDB$FORMATS RDB$DESCRIPTOR RDB$FORMAT RDB$FORMATS RDB$FORMAT RDB$RELATION_ID RDB$FORMATS RDB$RELATION_ID RDB$CONTEXT_NAME RDB$VIEW_RELATIONS RDB$CONTEXT_NAME RDB$VIEW_CONTEXT RDB$VIEW_RELATIONS RDB$VIEW_CONTEXT RDB$RELATION_NAME RDB$VIEW_RELATIONS RDB$RELATION_NAME RDB$VIEW_NAME RDB$VIEW_RELATIONS RDB$RELATION_NAME RDB$RELATION_TYPE RDB$RELATIONS RDB$RELATION_TYPE  RDB$FLAGS RDB$RELATIONS RDB$SYSTEM_FLAG RDB$DEFAULT_CLASS RDB$RELATIONS RDB$SECURITY_CLASS RDB$OWNER_NAME RDB$RELATIONS RDB$USER   RDB$EXTERNAL_DESCRIPTION RDB$RELATIONS RDB$EXTERNAL_DESCRIPTION   RDB$RUNTIME RDB$RELATIONS RDB$RUNTIME   RDB$EXTERNAL_FILE RDB$RELATIONS RDB$FILE_NAME   RDB$SECURITY_CLASS RDB$RELATIONS RDB$SECURITY_CLASS   RDB$RELATION_NAME RDB$RELATIONS RDB$RELATION_NAME RDB$FIELD_ID RDB$RELATIONS RDB$FIELD_ID RDB$FORMAT RDB$RELATIONS RDB$FORMAT RDB$DBKEY_LENGTH RDB$RELATIONS RDB$DBKEY_LENGTH RDB$SYSTEM_FLAG RDB$RELATIONS RDB$SYSTEM_FLAG RDB$RELATION_ID RDB$RELATIONS RDB$RELATION_ID RDB$DESCRIPTION RDB$RELATIONS RDB$DESCRIPTION RDB$VIEW_SOURCE RDB$RELATIONS RDB$SOURCE RDB$VIEW_BLR RDB$RELATIONS RDB$VIEW_BLR RDB$COLLATION_ID RDB$RELATION_FIELDS RDB$COLLATION_ID RDB$DEFAULT_SOURCE RDB$RELATION_FIELDS RDB$SOURCE 90#M`O SSdRZ `P X T VL V [ VH P R RH X ` X0 ]_xU[UlWUX\^U^8i\\ ^`RDB$FIELD_LENGTH RDB$FUNCTION_ARGUMENTS RDB$FIELD_LENGTH RDB$FIELD_SCALE RDB$FUNCTION_ARGUMENTS RDB$FIELD_SCALE RDB$FIELD_TYPE RDB$FUNCTION_ARGUMENTS RDB$FIELD_TYPE RDB$MECHANISM RDB$FUNCTION_ARGUMENTS RDB$MECHANISM RDB$ARGUMENT_POSITION RDB$FUNCTION_ARGUMENTS RDB$FIELD_POSITION RDB$FUNCTION_NAME RDB$FUNCTION_ARGUMENTS RDB$FUNCTION_NAME RDB$SYSTEM_FLAG RDB$FUNCTIONS RDB$SYSTEM_FLAG RDB$RETURN_ARGUMENT RDB$FUNCTIONS RDB$FIELD_POSITION RDB$ENTRYPOINT RDB$FUNCTIONS RDB$EXTERNAL_NAME RDB$MODULE_NAME RDB$FUNCTIONS RDB$FILE_NAME RDB$DESCRIPTION RDB$FUNCTIONS RDB$DESCRIPTION RDB$QUERY_NAME RDB$FUNCTIONS RDB$FIELD_NAME RDB$FUNCTION_TYPE RDB$FUNCTIONS RDB$FUNCTION_TYPE RDB$FUNCTION_NAME RDB$FUNCTIONS RDB$FUNCTION_NAME RDB$DEPENDED_ON_TYPE RDB$DEPENDENCIES RDB$OBJECT_TYPE RDB$DEPENDENT_TYPE RDB$DEPENDENCIES RDB$OBJECT_TYPE RDB$FIELD_NAME RDB$DEPENDENCIES RDB$FIELD_NAME RDB$DEPENDED_ON_NAME RDB$DEPENDENCIES RDB$GENERIC_NAME RDB$DEPENDENT_NAME RDB$DEPENDENCIES RDB$GENERIC_NAME RDB$DEBUG_INFO RDB$TRIGGERS RDB$DEBUG_INFO   RDB$VALID_BLR RDB$TRIGGERS RDB$SYSTEM_FLAG    RDB$FLAGS RDB$TRIGGERS RDB$SYSTEM_FLAG   RDB$SYSTEM_FLAG RDB$TRIGGERS RDB$SYSTEM_FLAG RDB$TRIGGER_INACTIVE RDB$TRIGGERS RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$TRIGGERS RDB$DESCRIPTION RDB$TRIGGER_BLR RDB$TRIGGERS RDB$TRIGGER_BLR RDB$TRIGGER_SOURCE RDB$TRIGGERS RDB$SOURCE RDB$TRIGGER_TYPE RDB$TRIGGERS RDB$TRIGGER_TYPE RDB$TRIGGER_SEQUENCE RDB$TRIGGERS RDB$TRIGGER_SEQUENCE RDB$RELATION_NAME RDB$TRIGGERS RDB$RELATION_NAME RDB$TRIGGER_NAME RDB$TRIGGERS RDB$TRIGGER_NAME RDB$SYSTEM_FLAG RDB$TYPES RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$TYPES RDB$DESCRIPTION RDB$TYPE_NAME RDB$TYPES RDB$TYPE_NAME  RDB$TYPE RDB$TYPES RDB$GENERIC_TYPE 90"d0jh`f S U` S V [P \ S Z< d V ID R Y ^( `[p[]ZLfVr(XZtXXVhZXXRDB$UPPER_BOUND RDB$FIELD_DIMENSIONS RDB$BOUND RDB$LOWER_BOUND RDB$FIELD_DIMENSIONS RDB$BOUND RDB$DIMENSION RDB$FIELD_DIMENSIONS RDB$DIMENSION RDB$FIELD_NAME RDB$FIELD_DIMENSIONS RDB$FIELD_NAME RDB$DESCRIPTION RDB$GENERATORS RDB$DESCRIPTION RDB$SYSTEM_FLAG RDB$GENERATORS RDB$SYSTEM_FLAG RDB$GENERATOR_ID RDB$GENERATORS RDB$GENERATOR_ID RDB$GENERATOR_NAME RDB$GENERATORS RDB$GENERATOR_NAME RDB$TRANSACTION_DESCRIPTION RDB$TRANSACTIONS RDB$TRANSACTION_DESCRIPTION RDB$TIMESTAMP RDB$TRANSACTIONS RDB$TIMESTAMP RDB$TRANSACTION_STATE RDB$TRANSACTIONS RDB$TRANSACTION_STATE RDB$TRANSACTION_ID RDB$TRANSACTIONS RDB$TRANSACTION_ID RDB$OBJECT_TYPE RDB$USER_PRIVILEGES RDB$OBJECT_TYPE RDB$USER_TYPE RDB$USER_PRIVILEGES RDB$OBJECT_TYPE RDB$FIELD_NAME RDB$USER_PRIVILEGES RDB$FIELD_NAME RDB$RELATION_NAME RDB$USER_PRIVILEGES RDB$GENERIC_NAME RDB$GRANT_OPTION RDB$USER_PRIVILEGES RDB$SYSTEM_FLAG RDB$PRIVILEGE RDB$USER_PRIVILEGES RDB$PRIVILEGE RDB$GRANTOR RDB$USER_PRIVILEGES RDB$USER  RDB$USER RDB$USER_PRIVILEGES RDB$USER RDB$MESSAGE RDB$TRIGGER_MESSAGES RDB$MESSAGE RDB$MESSAGE_NUMBER RDB$TRIGGER_MESSAGES RDB$MESSAGE_NUMBER RDB$TRIGGER_NAME RDB$TRIGGER_MESSAGES RDB$TRIGGER_NAME RDB$SYSTEM_FLAG RDB$FILTERS RDB$SYSTEM_FLAG RDB$OUTPUT_SUB_TYPE RDB$FILTERS RDB$FIELD_SUB_TYPE RDB$INPUT_SUB_TYPE RDB$FILTERS RDB$FIELD_SUB_TYPE RDB$ENTRYPOINT RDB$FILTERS RDB$EXTERNAL_NAME RDB$MODULE_NAME RDB$FILTERS RDB$FILE_NAME RDB$DESCRIPTION RDB$FILTERS RDB$DESCRIPTION RDB$FUNCTION_NAME RDB$FILTERS RDB$FUNCTION_NAME RDB$CHARACTER_LENGTH RDB$FUNCTION_ARGUMENTS RDB$FIELD_LENGTH   RDB$FIELD_PRECISION RDB$FUNCTION_ARGUMENTS RDB$FIELD_PRECISION RDB$CHARACTER_SET_ID RDB$FUNCTION_ARGUMENTS RDB$CHARACTER_SET_ID RDB$FIELD_SUB_TYPE RDB$FUNCTION_ARGUMENTS RDB$FIELD_SUB_TYPE 90"d0jfh`h `@ _ c| _$ V Vh a a MX [ W _D [UX<XdpeXXd\^PdP V\\TTbRDB$PARAMETER_NAME RDB$PROCEDURE_PARAMETERS RDB$PARAMETER_NAME RDB$DEBUG_INFO RDB$PROCEDURES RDB$DEBUG_INFO   RDB$VALID_BLR RDB$PROCEDURES RDB$SYSTEM_FLAG   RDB$PROCEDURE_TYPE RDB$PROCEDURES RDB$PROCEDURE_TYPE   RDB$SYSTEM_FLAG RDB$PROCEDURES RDB$SYSTEM_FLAG   RDB$RUNTIME RDB$PROCEDURES RDB$RUNTIME   RDB$OWNER_NAME RDB$PROCEDURES RDB$USER RDB$SECURITY_CLASS RDB$PROCEDURES RDB$SECURITY_CLASS RDB$PROCEDURE_BLR RDB$PROCEDURES RDB$PROCEDURE_BLR RDB$PROCEDURE_SOURCE RDB$PROCEDURES RDB$SOURCE RDB$DESCRIPTION RDB$PROCEDURES RDB$DESCRIPTION RDB$PROCEDURE_OUTPUTS RDB$PROCEDURES RDB$PROCEDURE_PARAMETERS RDB$PROCEDURE_INPUTS RDB$PROCEDURES RDB$PROCEDURE_PARAMETERS RDB$PROCEDURE_ID RDB$PROCEDURES RDB$PROCEDURE_ID RDB$PROCEDURE_NAME RDB$PROCEDURES RDB$PROCEDURE_NAME RDB$FILE_FLAGS RDB$LOG_FILES RDB$FILE_FLAGS RDB$FILE_P_OFFSET RDB$LOG_FILES RDB$FILE_P_OFFSET RDB$FILE_PARTITIONS RDB$LOG_FILES RDB$FILE_PARTITIONS RDB$FILE_LENGTH RDB$LOG_FILES RDB$FILE_LENGTH RDB$FILE_SEQUENCE RDB$LOG_FILES RDB$FILE_SEQUENCE RDB$FILE_NAME RDB$LOG_FILES RDB$FILE_NAME RDB$TRIGGER_NAME RDB$CHECK_CONSTRAINTS RDB$TRIGGER_NAME RDB$CONSTRAINT_NAME RDB$CHECK_CONSTRAINTS RDB$CONSTRAINT_NAME RDB$DELETE_RULE RDB$REF_CONSTRAINTS RDB$RULE RDB$UPDATE_RULE RDB$REF_CONSTRAINTS RDB$RULE RDB$MATCH_OPTION RDB$REF_CONSTRAINTS RDB$MATCH_OPTION RDB$CONST_NAME_UQ RDB$REF_CONSTRAINTS RDB$CONSTRAINT_NAME RDB$CONSTRAINT_NAME RDB$REF_CONSTRAINTS RDB$CONSTRAINT_NAME RDB$INDEX_NAME RDB$RELATION_CONSTRAINTS RDB$INDEX_NAME RDB$INITIALLY_DEFERRED RDB$RELATION_CONSTRAINTS RDB$DEFERRABLE RDB$DEFERRABLE RDB$RELATION_CONSTRAINTS RDB$DEFERRABLE RDB$RELATION_NAME RDB$RELATION_CONSTRAINTS RDB$RELATION_NAME RDB$CONSTRAINT_TYPE RDB$RELATION_CONSTRAINTS RDB$CONSTRAINT_TYPE RDB$CONSTRAINT_NAME RDB$RELATION_CONSTRAINTS RDB$CONSTRAINT_NAME 90!h,lh`b b `@ \ ^| b \ hX ` f d, ] nT hfZ4\`leXZTbbV@X\chX\bRDB$EXCEPTION_NUMBER RDB$EXCEPTIONS RDB$EXCEPTION_NUMBER RDB$EXCEPTION_NAME RDB$EXCEPTIONS RDB$EXCEPTION_NAME RDB$SPECIFIC_ATTRIBUTES RDB$COLLATIONS RDB$SPECIFIC_ATTRIBUTES RDB$BASE_COLLATION_NAME RDB$COLLATIONS RDB$COLLATION_NAME RDB$FUNCTION_NAME RDB$COLLATIONS RDB$FUNCTION_NAME RDB$DESCRIPTION RDB$COLLATIONS RDB$DESCRIPTION RDB$SYSTEM_FLAG RDB$COLLATIONS RDB$SYSTEM_FLAG RDB$COLLATION_ATTRIBUTES RDB$COLLATIONS RDB$GENERIC_TYPE RDB$CHARACTER_SET_ID RDB$COLLATIONS RDB$CHARACTER_SET_ID RDB$COLLATION_ID RDB$COLLATIONS RDB$COLLATION_ID RDB$COLLATION_NAME RDB$COLLATIONS RDB$COLLATION_NAME RDB$BYTES_PER_CHARACTER RDB$CHARACTER_SETS RDB$FIELD_LENGTH RDB$FUNCTION_NAME RDB$CHARACTER_SETS RDB$FUNCTION_NAME RDB$DESCRIPTION RDB$CHARACTER_SETS RDB$DESCRIPTION RDB$SYSTEM_FLAG RDB$CHARACTER_SETS RDB$SYSTEM_FLAG RDB$CHARACTER_SET_ID RDB$CHARACTER_SETS RDB$CHARACTER_SET_ID RDB$DEFAULT_COLLATE_NAME RDB$CHARACTER_SETS RDB$COLLATION_NAME RDB$NUMBER_OF_CHARACTERS RDB$CHARACTER_SETS RDB$NUMBER_OF_CHARACTERS RDB$FORM_OF_USE RDB$CHARACTER_SETS RDB$GENERIC_NAME RDB$CHARACTER_SET_NAME RDB$CHARACTER_SETS RDB$CHARACTER_SET_NAME RDB$RELATION_NAME RDB$PROCEDURE_PARAMETERS RDB$RELATION_NAME   RDB$FIELD_NAME RDB$PROCEDURE_PARAMETERS RDB$FIELD_NAME   RDB$PARAMETER_MECHANISM RDB$PROCEDURE_PARAMETERS RDB$MECHANISM   RDB$NULL_FLAG RDB$PROCEDURE_PARAMETERS RDB$NULL_FLAG   RDB$COLLATION_ID RDB$PROCEDURE_PARAMETERS RDB$COLLATION_ID   RDB$DEFAULT_SOURCE RDB$PROCEDURE_PARAMETERS RDB$SOURCE RDB$DEFAULT_VALUE RDB$PROCEDURE_PARAMETERS RDB$VALUE RDB$SYSTEM_FLAG RDB$PROCEDURE_PARAMETERS RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$PROCEDURE_PARAMETERS RDB$DESCRIPTION RDB$FIELD_SOURCE RDB$PROCEDURE_PARAMETERS RDB$FIELD_NAME RDB$PARAMETER_TYPE RDB$PROCEDURE_PARAMETERS RDB$PARAMETER_TYPE RDB$PARAMETER_NUMBER RDB$PROCEDURE_PARAMETERS RDB$PARAMETER_NUMBER RDB$PROCEDURE_NAME RDB$PROCEDURE_PARAMETERS RDB$PROCEDURE_NAME 90%PXXXDpKS St R X ^l N L Xx M( P Q Q ^ Yh [ \V`TXZXRVVTTJLdVSNtKZI MON$USER MON$ATTACHMENTS RDB$USER MON$ATTACHMENT_NAME MON$ATTACHMENTS RDB$FILE_NAME2  MON$STATE MON$ATTACHMENTS RDB$STATE MON$SERVER_PID MON$ATTACHMENTS RDB$PID MON$ATTACHMENT_ID MON$ATTACHMENTS RDB$ATTACHMENT_ID MON$BACKUP_STATE MON$DATABASE RDB$BACKUP_STATE MON$STAT_ID MON$DATABASE RDB$STAT_ID  MON$PAGES MON$DATABASE RDB$COUNTER MON$CREATION_DATE MON$DATABASE RDB$TIMESTAMP MON$RESERVE_SPACE MON$DATABASE RDB$SYSTEM_FLAG MON$FORCED_WRITES MON$DATABASE RDB$SYSTEM_FLAG   MON$READ_ONLY MON$DATABASE RDB$SYSTEM_FLAG   MON$SWEEP_INTERVAL MON$DATABASE RDB$SWEEP_INTERVAL   MON$SHUTDOWN_MODE MON$DATABASE RDB$SHUTDOWN_MODE   MON$SQL_DIALECT MON$DATABASE RDB$SQL_DIALECT   MON$PAGE_BUFFERS MON$DATABASE RDB$PAGE_BUFFERS MON$NEXT_TRANSACTION MON$DATABASE RDB$TRANSACTION_ID MON$OLDEST_SNAPSHOT MON$DATABASE RDB$TRANSACTION_ID MON$OLDEST_ACTIVE MON$DATABASE RDB$TRANSACTION_ID MON$OLDEST_TRANSACTION MON$DATABASE RDB$TRANSACTION_ID MON$ODS_MINOR MON$DATABASE RDB$ODS_NUMBER MON$ODS_MAJOR MON$DATABASE RDB$ODS_NUMBER MON$PAGE_SIZE MON$DATABASE RDB$PAGE_SIZE MON$DATABASE_NAME MON$DATABASE RDB$FILE_NAME2 RDB$FILE_NAME RDB$BACKUP_HISTORY RDB$FILE_NAME  RDB$SCN RDB$BACKUP_HISTORY RDB$SCN  RDB$GUID RDB$BACKUP_HISTORY RDB$GUID RDB$BACKUP_LEVEL RDB$BACKUP_HISTORY RDB$BACKUP_LEVEL RDB$TIMESTAMP RDB$BACKUP_HISTORY RDB$TIMESTAMP RDB$BACKUP_ID RDB$BACKUP_HISTORY RDB$BACKUP_ID RDB$SYSTEM_FLAG RDB$ROLES RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$ROLES RDB$DESCRIPTION RDB$OWNER_NAME RDB$ROLES RDB$USER RDB$ROLE_NAME RDB$ROLES RDB$USER RDB$SYSTEM_FLAG RDB$EXCEPTIONS RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$EXCEPTIONS RDB$DESCRIPTION RDB$MESSAGE RDB$EXCEPTIONS RDB$MESSAGE 90$IT_]N@a S ^0 Y O V, \ L T, _ bh ] ^ ZT VXVTPPZL\JR\N NFlXPWlVRVMON$SOURCE_LINE MON$CALL_STACK RDB$SOURCE_INFO MON$TIMESTAMP MON$CALL_STACK RDB$TIMESTAMP MON$OBJECT_TYPE MON$CALL_STACK RDB$OBJECT_TYPE MON$OBJECT_NAME MON$CALL_STACK RDB$GENERIC_NAME MON$CALLER_ID MON$CALL_STACK RDB$CALL_ID MON$STATEMENT_ID MON$CALL_STACK RDB$STATEMENT_ID MON$CALL_ID MON$CALL_STACK RDB$CALL_ID MON$STAT_ID MON$STATEMENTS RDB$STAT_ID MON$SQL_TEXT MON$STATEMENTS RDB$SOURCE MON$TIMESTAMP MON$STATEMENTS RDB$TIMESTAMP  MON$STATE MON$STATEMENTS RDB$STATE MON$TRANSACTION_ID MON$STATEMENTS RDB$TRANSACTION_ID MON$ATTACHMENT_ID MON$STATEMENTS RDB$ATTACHMENT_ID MON$STATEMENT_ID MON$STATEMENTS RDB$STATEMENT_ID MON$STAT_ID MON$TRANSACTIONS RDB$STAT_ID   MON$AUTO_UNDO MON$TRANSACTIONS RDB$SYSTEM_FLAG   MON$AUTO_COMMIT MON$TRANSACTIONS RDB$SYSTEM_FLAG   MON$READ_ONLY MON$TRANSACTIONS RDB$SYSTEM_FLAG   MON$LOCK_TIMEOUT MON$TRANSACTIONS RDB$LOCK_TIMEOUT MON$ISOLATION_MODE MON$TRANSACTIONS RDB$ISOLATION_MODE MON$OLDEST_ACTIVE MON$TRANSACTIONS RDB$TRANSACTION_ID MON$OLDEST_TRANSACTION MON$TRANSACTIONS RDB$TRANSACTION_ID MON$TOP_TRANSACTION MON$TRANSACTIONS RDB$TRANSACTION_ID MON$TIMESTAMP MON$TRANSACTIONS RDB$TIMESTAMP  MON$STATE MON$TRANSACTIONS RDB$STATE MON$ATTACHMENT_ID MON$TRANSACTIONS RDB$ATTACHMENT_ID MON$TRANSACTION_ID MON$TRANSACTIONS RDB$TRANSACTION_ID MON$STAT_ID MON$ATTACHMENTS RDB$STAT_ID   MON$REMOTE_PROCESS MON$ATTACHMENTS RDB$FILE_NAME2   MON$GARBAGE_COLLECTION MON$ATTACHMENTS RDB$SYSTEM_FLAG   MON$TIMESTAMP MON$ATTACHMENTS RDB$TIMESTAMP   MON$CHARACTER_SET_ID MON$ATTACHMENTS RDB$CHARACTER_SET_ID   MON$REMOTE_PID MON$ATTACHMENTS RDB$PID MON$REMOTE_ADDRESS MON$ATTACHMENTS RDB$REMOTE_ADDRESS MON$REMOTE_PROTOCOL MON$ATTACHMENTS RDB$REMOTE_PROTOCOL  MON$ROLE MON$ATTACHMENTS RDB$USER 90 &XXNDRpO P Q| O4 H V Y$ Y Wt W W Xl V X YT cdf@HVT8YX]>AH=??@L< =E: JOB_CODE JOB JOBCODE JOB_COUNTRY JOB COUNTRYNAME  JOB_TITLE JOB RDB$2 LANGUAGE_REQ JOB RDB$4  JOB_GRADE JOB JOBGRADE MIN_SALARY JOB SALARY MAX_SALARY JOB SALARY JOB_REQUIREMENT JOB RDB$3  COUNTRY COUNTRY COUNTRYNAME  CURRENCY COUNTRY RDB$1  JOB_CODE JOB JOBCODE JOB_COUNTRY JOB COUNTRYNAME  JOB_TITLE JOB RDB$2 LANGUAGE_REQ JOB RDB$4  JOB_GRADE JOB JOBGRADE MIN_SALARY JOB SALARY MAX_SALARY JOB SALARY JOB_REQUIREMENT JOB RDB$3  COUNTRY COUNTRY COUNTRYNAME  CURRENCY COUNTRY RDB$1 MON$MAX_MEMORY_ALLOCATED MON$MEMORY_USAGE RDB$COUNTER MON$MAX_MEMORY_USED MON$MEMORY_USAGE RDB$COUNTER MON$MEMORY_ALLOCATED MON$MEMORY_USAGE RDB$COUNTER MON$MEMORY_USED MON$MEMORY_USAGE RDB$COUNTER MON$STAT_GROUP MON$MEMORY_USAGE RDB$STAT_GROUP MON$STAT_ID MON$MEMORY_USAGE RDB$STAT_ID MON$VARIABLE_VALUE MON$CONTEXT_VARIABLES RDB$CONTEXT_VAR_VALUE MON$VARIABLE_NAME MON$CONTEXT_VARIABLES RDB$CONTEXT_VAR_NAME MON$TRANSACTION_ID MON$CONTEXT_VARIABLES RDB$TRANSACTION_ID MON$ATTACHMENT_ID MON$CONTEXT_VARIABLES RDB$ATTACHMENT_ID MON$RECORD_EXPUNGES MON$RECORD_STATS RDB$COUNTER   MON$RECORD_PURGES MON$RECORD_STATS RDB$COUNTER MON$RECORD_BACKOUTS MON$RECORD_STATS RDB$COUNTER MON$RECORD_DELETES MON$RECORD_STATS RDB$COUNTER MON$RECORD_UPDATES MON$RECORD_STATS RDB$COUNTER MON$RECORD_INSERTS MON$RECORD_STATS RDB$COUNTER MON$RECORD_IDX_READS MON$RECORD_STATS RDB$COUNTER MON$RECORD_SEQ_READS MON$RECORD_STATS RDB$COUNTER MON$STAT_GROUP MON$RECORD_STATS RDB$STAT_GROUP MON$STAT_ID MON$RECORD_STATS RDB$STAT_ID MON$PAGE_MARKS MON$IO_STATS RDB$COUNTER MON$PAGE_FETCHES MON$IO_STATS RDB$COUNTER MON$PAGE_WRITES MON$IO_STATS RDB$COUNTER MON$PAGE_READS MON$IO_STATS RDB$COUNTER MON$STAT_GROUP MON$IO_STATS RDB$STAT_GROUP MON$STAT_ID MON$IO_STATS RDB$STAT_ID MON$STAT_ID MON$CALL_STACK RDB$STAT_ID MON$SOURCE_COLUMN MON$CALL_STACK RDB$SOURCE_INFO 9024:P=3083P08 4 6x 3D 2 . 4 3t 5@ 1 > 3 ;X 5 6 8 6x 6< < 3 < 1d 1, 8523X29::h;05725T8 4431L8pRDB$DESCRIPTOR PxRDB$MECHANISM xRDB$OBJECT_TYPE xRDB$TRIGGER_TYPE xRDB$GENERIC_TYPE xRDB$TRIGGER_SEQUENCE pRDB$RUNTIME PxRDB$DIMENSIONS pRDB$TYPE_NAME xRDB$EXTERNAL_NAME pRDB$FUNCTION_NAME pRDB$GENERIC_NAME pRDB$TRIGGER_NAME pRDB$TRIGGER_BLR PxRDB$FILE_FLAGS xRDB$FILE_LENGTH xRDB$FILE_START xRDB$FILE_SEQUENCE pRDB$FILE_NAME2 %xRDB$FILE_NAME % pRDB$ACL PpRDB$SECURITY_CLASS  pRDB$VALUE PpRDB$VALIDATION_BLR PpRDB$VIEW_BLR PxRDB$FIELD_SUB_TYPE pRDB$SOURCE PxRDB$SEGMENT_LENGTH xRDB$SEGMENT_COUNT pRDB$RELATION_NAME xRDB$RELATION_ID pRDB$QUERY_HEADER PxRDB$PAGE_TYPE xRDB$PAGE_SEQUENCE xRDB$PAGE_NUMBER xRDB$DBKEY_LENGTH xRDB$FORMAT xRDB$FIELD_TYPE xRDB$FIELD_SCALE xRDB$FIELD_POSITION xRDB$FIELD_LENGTH pRDB$INDEX_NAME xRDB$INDEX_ID xRDB$SYSTEM_FLAG pRDB$FIELD_NAME xRDB$FIELD_ID xRDB$EDIT_STRING %pRDB$DESCRIPTION PpRDB$CONTEXT_NAME xRDB$VIEW_CONTEXT 90256T9 1E/p6<21 B 5P < 4 - 1 2P 1 = 7 (t ;H * = . 5h 7, ; 4 < <D < 86@\8 <4<t<<8571d48, +E5T65xRDB$ATTACHMENT_ID xRDB$PROCEDURE_TYPE xRDB$RELATION_TYPE pRDB$SPECIFIC_ATTRIBUTES P xRDB$SCN  xRDB$GUID &xRDB$BACKUP_LEVEL xRDB$BACKUP_ID xRDB$FIELD_PRECISION xRDB$FILE_P_OFFSET xRDB$EXCEPTION_NUMBER pRDB$EXCEPTION_NAME xRDB$NUMBER_OF_CHARACTERS xRDB$COLLATION_ID pRDB$COLLATION_NAME xRDB$CHARACTER_SET_ID pRDB$CHARACTER_SET_NAME xRDB$PARAMETER_TYPE xRDB$PARAMETER_NUMBER pRDB$PARAMETER_NAME pRDB$PROCEDURE_NAME xRDB$PROCEDURE_PARAMETERS xRDB$PROCEDURE_ID pRDB$PROCEDURE_BLR PxRDB$FILE_PARTITIONS  xRDB$RULE  RESTRICTLxRDB$MATCH_OPTION    FULLLxRDB$DEFERRABLE    NOLxRDB$CONSTRAINT_TYPE  pRDB$CONSTRAINT_NAME xRDB$NULL_FLAG xRDB$STATISTICS xRDB$DIMENSION  xRDB$BOUND xRDB$GENERATOR_ID pRDB$GENERATOR_NAME xRDB$SHADOW_NUMBER pRDB$EXTERNAL_DESCRIPTION PxRDB$PRIVILEGE  pRDB$USER xRDB$MESSAGE_NUMBER xRDB$MESSAGE %pRDB$TRANSACTION_DESCRIPTION PxRDB$TIMESTAMP #xRDB$TRANSACTION_STATE xRDB$TRANSACTION_ID xRDB$FUNCTION_TYPE 9084/l/@+-21t4<53 6 /` =$ < 6 4 4P 2 8 ; 3p 84 9 - , /x /H / %;;H7<9$ ''XK+l'L0.0O=8) ),-)X),)%6*-X& pDEPTNO  pPROJNO  pCUSTNO  pJOBCODE % pJOBGRADE  0pSALARY   < 0pBUDGET   < 0p{PRODTYPE  % < pPONUMBER  pRDB$9 %% pRDB$12  pRDB$11   pRDB$10 % pRDB$9 %% pRDB$8 # pRDB$7 % pRDB$6 % pRDB$5 % pRDB$4 % pRDB$3  pRDB$2 % pRDB$1  %  pPONUMBER  >| >@ 9 > : 7T 7 : = >T A = = ;X = ??;XA 79<x0@6d7 265h342625\4$6:3 RDB$INDEX_32 RDB$TRANSACTION_ID  X_X_RDINRDINININ RDRDX_B$# RDB$INDEX_43 RDB$INDEX! RDB$INDEX_42 RDB$CONSTRAINT_T RDB$INDEX_42 RDB$RELATION RDB$INDEX_41 RDB$FOREIG RDB$INDEX_40 RDB$TRIGGER RDB$INDEX_39 RDB$ROLE RDB$INDEX_38 RDB$RELATION RDB$INDEX_37 RDB$TYPE RDB$INDEX_36 RDB$FIELD RDB$INDEX_35 RDB$TRIGGER RDB$INDEX_34 RDB$RELATION  RDB$INDEX_33 RDB$VIEW  RDB$INDEX_31 RDB$RELATION RDB$INDEX_30 RDB$USER ? RDB$INDEX_29 RDB$RELATION_NAME `? RDB$INDEX_28 RDB$DEPENDED_ON_NAME  RDB$INDEX_27 RDB$DEPENDENT_NAME  RDB$INDEX_26 RDB$CHARACTER_SET_ID @l}{?RDB RDB$INDEX_26 RDB$COLLATION_ID ? RDB$INDEX_25 RDB$CHARACTER_SET_ID  ;? RDB$INDEX_24 RDB$EXCEPTION_NUMBER ? RDB$INDEX_23 RDB$EXCEPTION_NAME ? RDB$INDEX_22 RDB$PROCEDURE_ID ? RDB$INDEX_21 RDB$PROCEDURE_NAME ? RDB$INDEX_20 RDB$COLLATION_NAME @l}{? RDB$INDEX_19 RDB$CHARACTER_SET_NAME  ;? RDB$INDEX_18 RDB$PARAMETER_NAME ? RDB$INDEX_18 RDB$PROCEDURE_NAME ?RD RDB$INDEX_17 RDB$OUTPUT_SUB_TYPE RD RDB$INDEX_17 RDB$INPUT_SUB_TYPE  RDB$INDEX_16 RDB$FORMAT  ? RDB$INDEX_16 RDB$RELATION_ID  ? RDB$INDEX_15 RDB$RELATION_NAME Sa? RDB$INDEX_15 RDB$FIELD_NAME  k? RDB$INDEX_14 RDB$CONSTRAINT_NAME ? RDB$INDEX_13 RDB$CONSTRAINT_NAME $I?  RDB$INDEX_12 RDB$CONSTRAINT_NAME ? RDB$INDEX_11 RDB$GENERATOR_NAME E? RDB$INDEX_10 RDB$FUNCTION_NAME ? RDB$INDEX_9 RDB$FUNCTION_NAME ? RDB$INDEX_8 RDB$TRIGGER_NAME `? RDB$INDEX_7 RDB$SECURITY_CLASS `UU? RDB$INDEX_6 RDB$INDEX_NAME L? RDB$INDEX_5 RDB$INDEX_NAME L? RDB$INDEX_4 RDB$RELATION_NAME `? RDB$INDEX_3 RDB$FIELD_SOURCE is? RDB$INDEX_2 RDB$FIELD_NAME p? RDB$INDEX_1 RDB$RELATION_ID `? RDB$INDEX_0 RDB$RELATION_NAME `?p90+6P RDB$TRIGGER ARCOUNTRYUSTOMER DEPARTMENTEMPLOYEE_PROJECTJOBMON$ATTACHMENTS CALL_STACKONTEXT_VARIABLESDATABASEIO_STATS  MEMORY_USAGE RECORD_STATS STATEMENTS TRANSACTIONS PHONE_LISTROJECT _DEPT_BUDGETRDB$BACKUP_HISTORYCHARACTER_SETSECK_CONSTRAINTS OLLATIONSDATABASE  EPENDENCIES EXCEPTIONSFIELDS _DIMENSIONS LESTERSORMATSUNCTIONS _ARGUMENTS GENERATORSINDEX_SEGMENTSICES LOG_FILESPAGES ROCEDURES _PARAMETERSREF_CONSTRAINTSLATIONS _CONSTRAINTS FIELDSOLES SECURITY_CLASSES TRANSACTIONS IGGERS _MESSAGES YPESUSER_PRIVILEGESVIEW_RELATIONSSALARY_HISTORYEST234 4 905,@|A<@DGlA(D J BX @ H Ex O, J J JT @ < N| I4 E D E` E DIEH??HxE8@ADlD IF<\@=D<THH0RDB$INDEX_43 RDB$RELATION_CONSTRAINTS RDB$INDEX_33 RDB$VIEW_RELATIONS $INRDB$INDEX_32 RDB$TRANSACTIONS $INRDB$INDEX_30 RDB$USER_PRIVILEGES INRDB$INDEX_27 RDB$DEPENDENCIES NRDB$INDEX_24 RDB$EXCEPTIONS NRDB$INDEX_21 RDB$PROCEDURES NRDB$INDEX_19 RDB$CHARACTER_SETS DRDB$INDEX_16 RDB$FORMATS INRDB$INDEX_13 RDB$REF_CONSTRAINTS RDB$INDEX_9 RDB$FUNCTIONS $INRDB$INDEX_6 RDB$INDEX_SEGMENTS RDB$INDEX_3 RDB$RELATION_FIELDS $IN/RDB$INDEX_42 RDB$RELATION_CONSTRAINTS .RDB$INDEX_41 RDB$INDICES -RDB$INDEX_40 RDB$CHECK_CONSTRAINTS RDB$INDEX_39 RDB$ROLES ?,RDB$INDEX_38 RDB$TRIGGERS +RDB$INDEX_37 RDB$TYPES RDB$INDEX_36 RDB$FIELD_DIMENSIONS ?URDB$INDEX_35 RDB$TRIGGER_MESSAGES `UU?RDB$INDEX_34 RDB$VIEW_RELATIONS ?RDB$INDEX_33 RDB$VIEW_RELATIONS ?RDB$INDEX_32 RDB$TRANSACTIONS $INRDB$INDEX_31 RDB$INDICES  A?RDB$INDEX_30 RDB$USER_PRIVILEGES ?RDB$INDEX_29 RDB$USER_PRIVILEGES `?RDB$INDEX_28 RDB$DEPENDENCIES RDB$INDEX_27 RDB$DEPENDENCIES RDB$INDEX_26 RDB$COLLATIONS @l}{?RDB$INDEX_25 RDB$CHARACTER_SETS  ;? RDB$INDEX_24 RDB$EXCEPTIONS RDB$INDEX_23 RDB$EXCEPTIONS ?RDB$INDEX_22 RDB$PROCEDURES ?RDB$INDEX_21 RDB$PROCEDURES RDB$INDEX_20 RDB$COLLATIONS @l}{?RDB$INDEX_19 RDB$CHARACTER_SETS  ;?EX_RDB$INDEX_18 RDB$PROCEDURE_PARAMETERS ?RDB$INDEX_17 RDB$FILTERS RDB$INDEX_16 RDB$FORMATS  ?RDB$INDEX_15 RDB$RELATION_FIELDS Sa?RDB$INDEX_14 RDB$CHECK_CONSTRAINTS ?RDB$INDEX_13 RDB$REF_CONSTRAINTS $I?RDB$INDEX_12 RDB$RELATION_CONSTRAINTS ?RDB$INDEX_11 RDB$GENERATORS E?RDB$INDEX_10 RDB$FUNCTION_ARGUMENTS ?RDB$INDEX_9 RDB$FUNCTIONS ?RDB$INDEX_8 RDB$TRIGGERS `?RDB$INDEX_7 RDB$SECURITY_CLASSES `UU?GRDB$INDEX_6 RDB$INDEX_SEGMENTS RDB$INDEX_5 RDB$INDICES L?RDB$INDEX_4 RDB$RELATION_FIELDS `?DRDB$INDEX_3 RDB$RELATION_FIELDS RDB$INDEX_2 RDB$FIELDS p?RDB$INDEX_1 RDB$RELATIONS `?ARDB$INDEX_0 RDB$RELATIONS p90,I2'@z{|}abcdefghijk "$&(*,.0123456789:;<=>?@ABCD` @`a @`d  p90%"7PRDB$V ADDRESSLINEBUDGET COUNTRYNAMEUSTNODEPTNOEMPNO FIRSTNAMEJOBCODEGRADELASTNAME PHONENUMBER ONUMBERRODTYPEJNO RDB$1012123456789301234545678920123456789301234567894012345678123459150123940123456756789601234501234567896014567%0389ACL  TTACHMENT_ID BACKUP_ID LEVEL STATEOUNDCALL_IDHARACTER_SET_IDNAME OLLATION_IDNAME NSTRAINT_NAMETYPE TEXT_NAME VAR_NAMEVALUE UNTER DBKEY_LENGTH EBUG_INFOFERRABLE SCRIPTION ORIMENSION S EDIT_STRING XCEPTION_NAMEUMBERTERNAL_DESCRIPTION NAMEFIELD_ID LENGTH NAME POSITION RECISION SCALE UB_TYPE TYPELE_FLAGS LENGTH NAME 2 PARTITIONS _OFFSET SEQUENCE TART ORMAT UNCTION_NAME TYPE GENERATOR_IDNAME IC_NAME  TYPEUIDINDEX_ID NAME  SOLATION_MODE  LOCK_TIMEOUT MATCH_OPTIONECHANISMSSAGE _NUMBER NULL_FLAGMBER_OF_CHARACTERS OBJECT_TYPE DS_NUMBER PAGE_BUFFERS NUMBER SEQUENCE IZE TYPERAMETER_MECHANISM NAMEUMBERTYPEIDRIVILEGE  OCEDURE_BLR ID NAME  PARAMETERSTYPE QUERY_HEADER RELATION_ID NAME TYPE  MOTE_ADDRESS  PROTOCOLULE NTIMESCN ECURITY_CLASS GMENT_COUNT LENGTH HADOW_NUMBER UTDOWN_MODEOURCE _INFOPECIFIC_ATTRIBUTES QL_DIALECTTATE MENT_IDISTICS_GROUP ID WEEP_INTERVAL YSTEM_FLAG TIMESTAMPRANSACTION_DESCRIPTIONIDSTATE IGGER_BLR NAME  SEQUENCE TYPE YPE_NAMEUSERVALIDATION_BLRUEIEW_BLR CONTEXTSALARY ARY ARY Y Y ARY p90+ cP RDB$BACKUP_ FIELD_SCALE aPROCEDURE_ TRANSACTION_K ADDRESSLINEK JBUDGETRD COUNTRYNAMED K K KUSTNOSJDEPTNOJKRJEMPNOKKRRRS K FIRSTNAMEK K DJOBCODEKDGRADEKKLASTNAMEKKJ PHONENUMBERK K SONUMBER RRODTYPESRJNORRDRDB$1R0R1R2Z1Z2Y3Z4Z5Z6Z7Y8Y9R3Y0Y1Z2Y3Z4Z5R4R5R6R7K8K9D2K0K1K2S3S4S5S6S7S8S9D3S0S1D4Y81Y2Y3Y4S5Y91J5R39 R40L1R2L3R4L5L6R7J6KZ50Z1Z2Z3Z4Z5Z6Z7Z8Z9Z60Z1Z4Z5Z6K7KZ03K8K9ACL 5 TTACHMENT_ID<<C4 BACKUP_ID4 LEVEL5 STATEOUND <CALL_ID< HARACTER_SET_ID--;NAME- OLLATION_ID-- -NAME-- % NSTRAINT_NAME%%% %TYPE TEXT_NAMEC VAR_NAMECVALUE5UNTERC C C C C C C C C C C C C D D D  DBKEY_LENGTH EBUG_INFO&%FERRABLE% SCRIPTION&,--44 ORIMENSION S EDIT_STRING- XCEPTION_NAME-UMBER TERNAL_DESCRIPTION NAME FIELD_ID  LENGTH- NAME,- POSITION RECISION SCALE UB_TYPE TYPELE_FLAGS% LENGTH%  NAME   % 4 4 25;% PARTITIONS% _OFFSET SEQUENCE% TARTORMAT  UNCTION_NAME-- TYPE GENERATOR_IDNAME IC_NAME-<  TYPE-4UIDINDEX_ID NAME%< SOLATION_MODE < LOCK_TIMEOUT% MATCH_OPTION ECHANISM- SSAGE4  _NUMBER NULL_FLAG - -MBER_OF_CHARACTERS OBJECT_TYPE<4 DS_NUMBER44 PAGE_BUFFERS NUMBER SEQUENCE4 IZE TYPE & RAMETER_NAME,UMBER,TYPE 5ID; RIVILEGE& OCEDURE_BLR%ID%NAME,& PARAMETERS& &TYPE QUERY_HEADER RELATION_ID NAME%- TYPE; MOTE_ADDRESS; PROTOCOL%ULE% NTIME& 4SCN ECURITY_CLASS& GMENT_COUNT LENGTH HADOW_NUMBER5 UTDOWN_MODE OURCE     & - < < _INFOC-PECIFIC_ATTRIBUTES4 QL_DIALECT 5TATE< < < MENT_ID<ISTICS C_GROUPCC5 ID< < < C C C C 5 WEEP_INTERVAL YSTEM_FLAG&&,--44555;<<< TIMESTAMP4 5 ; < < < RANSACTION_DESCRIPTIONID4444<<<<<CSTATE IGGER_BLR NAME% SEQUENCE TYPEYPE_NAME USER&445; VALIDATION_BLR UE   - IEW_BLR  CONTEXTDSALARYDJR R  p90+JPPROJECT RDB$INDICESpSALES ZARZZZZZZZZZZZZZZDCOUNTRYDKUSTOMERKKKKKKKKKKKJ DEPARTMENTJ J J J J J JEMPLOYEEKKKKKKKKKKR_PROJECTRDJOBDDDDDDD 5MON$ATTACHMENTS5555;;;;;;;;<< CALL_STACK<<<<<<CCCONTEXT_VARIABLESCCC4DATABASE4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 CIO_STATSC C C C C C MEMORY_USAGECCDDDC RECORD_STATSCCCCCCCCC< STATEMENTS<<<<<<< TRANSACTIONS<<<<<<<<<<<< K PHONE_LISTK K K K K RROJECTRRRRR _DEPT_BUDGETRRRR4RDB$BACKUP_HISTORY44444-CHARACTER_SETS--------%ECK_CONSTRAINTS%- OLLATIONS--------DATABASE  EPENDENCIES- EXCEPTIONS-444FIELDS      _DIMENSIONSLES     TERS      ORMATS  UNCTIONS        _ARGUMENTS GENERATORSINDEX_SEGMENTSICES            % LOG_FILES% % % % % PAGES % ROCEDURES%&&&&&&&&&&&& & _PARAMETERS,,,,,,-------%REF_CONSTRAINTS%%%%LATIONS                % _CONSTRAINTS%%%%% FIELDS 4OLES4 4 4 SECURITY_CLASSES TRANSACTIONSIGGERS            _MESSAGESYPES    USER_PRIVILEGESVIEW_RELATIONSRSALARY_HISTORYRRRRRSESSSSSSSSSSSSSZTY2YYYYYYZZZZZZZZZS3YYYYL4LLLRRRRR R p90.'PBUDGETXCHANGEX USTNAMEX REGIONMAXSALXINSALXNAMEXEEDX PRODTYPEXQTYXRDB$114 FOREIGN10 3 5 6 8 9 21 3 5 6 3 6 8 9INDEX_0 1 0 1 2 3 4 5 6 7 8 9 2 0 1 2 3 4 5 6 7 8 9 3 0 1 2 3 4 5 6 7 8 9 4 0 1 2 3 4 5 6 7 8 5 6 7 8 9PRIMARY1 2 4 7 2 0 2 4 5 7 SALESTATXUPDATERX p90,"<'P BUDGETXCHANGEXUSTNAMEXREGION MAXSALXINSALXNAMEXEEDX PRODTYPEX QTYX RDB$114  FOREIGN10 3 5 6 8 9 21 3 5 6 3 6 8 9  INDEX_0 1 0 1 2 3 4 5 6 7 8 9 2 0 1 2 3 4 5 6  7 8 9 3 0 1 2 3 4 5 6 7 8 9 4 0 1 2  3 4  5 6 7 8 5 6 7 8 9PRIMARY1 2 4  7  2  0   2 4 5 7 SALESTATX UPDATERX p90 'PSQL$10123456892012345678935678940123456789506789DEFAULT1 0 1 2 3 4 5 6 7 8 9 2 0 1 2 3 4 5 6 7 8 9 3 0 1 2 3 4 5 6 7 8 9 4 0 5 6 7 8 9 p90p 'PCHECK_1%0%1%2&3&4&5&6&7&8,92,0-1-2-3-4-5-6-7-834567%8%9-POST_NEW_ORDER RDB$TRIGGER_1 0 1 2 3 4 5 6 7 8 9 2 0 1 2 3 4 5 6 7 8 9 3 0 1 2 3 4 5 6 4 5 6 8 9%SAVE_SALARY_CHANGE% ET_CUST_NO EMP_NO- TR_CONNECT-MULTI p90J'PRDB$GET_CONTEXT SET_CONTEXT p90OY'PRDB$GET_CONTEXT SET_CONTEXT p90'P CUST_NO_GEN EMP_NO_GENRDB$BACKUP_HISTORYCONSTRAINT_NAME EXCEPTIONS  FIELD_NAME  INDEX_NAME PROCEDURESSECURITY_CLASS  TRIGGER_NAME SQL$DEFAULT p90!o'PINTEG_10123456789201234567893012345678940123456789501234567896012345678970123456789809 p90Ut'PINTEG_11728931640178 56 61 778 p903'PINTEG_1234892012345630237842345950123478962345678970123459809 p90, gMDMON$ATTACHMENT_IDMON$PMEMORY_ RECORD_KADDRESS_LINE1CUSTOMERK2CUSTOMERS GEDSALESJBUDGETDEPARTMENTZC1ARZTZ2Y3R4 Z0ARYT2Z1ARYT2 Z2ARZT2Z3ARYT2Z4ARZT2Z5ARZT2Y6T2Z2ARZT2Y3Z3ARYT2Y3Z4ARZT2S3 Z5ARZT2Y3Z6ARZT2 Z7ARZT2 Z8ARYT2Z9ARYT2RHANGE_DATESALARY_HISTORYK ITYCUSTOMERKONTACT_FIRSTCUSTOMERK LASTCUSTOMERDUNTRYCOUNTRYK USTOMERDURRENCYCOUNTRYKSTOMERCUSTOMERK_NOCUSTOMERS SALESR _NONET4 R OCTETST4L UTF8T4RWIN1250T4SDATE_NEEDEDSALESJEPARTMENTDEPARTMENTJT_NODEPARTMENT K EMPLOYEER PROJ_DEPT_BUDGET SISCOUNTSALESKEMP_NOEMPLOYEER _PROJECTK PHONE_LISTR SALARY_HISTORY KFIRST_NAMEEMPLOYEEK PHONE_LISTR SCAL_YEARPROJ_DEPT_BUDGETKULL_NAMEEMPLOYEEJHEAD_DEPTDEPARTMENTKIRE_DATEEMPLOYEESITEM_TYPESALES KJOB_CODEEMPLOYEE D JOBKUNTRYEMPLOYEE DJOBKGRADEEMPLOYEEDJOBDREQUIREMENTJOB D TITLEJOB DLANGUAGE_REQJOBKST_NAMEEMPLOYEEK PHONE_LISTJOCATIONDEPARTMENTK PHONE_LISTDMAX_SALARYJOBDIN_SALARYJOBJNGR_NODEPARTMENT 5*ON$ATTACHMENT_IDMON$ATTACHMENTSCCONTEXT_VARIABLES< STATEMENTS<TRANSACTIONS 5NAMEMON$ATTACHMENTS <!UTO_COMMITMON$TRANSACTIONS < UNDOMON$TRANSACTIONS5BACKUP_STATEMON$DATABASE< CALLER_IDMON$CALL_STACK< _IDMON$CALL_STACK;%HARACTER_SET_IDMON$ATTACHMENTS5!REATION_DATEMON$DATABASE4"DATABASE_NAMEMON$DATABASE5"FORCED_WRITESMON$DATABASE;+GARBAGE_COLLECTIONMON$ATTACHMENTS<'ISOLATION_MODEMON$TRANSACTIONS <"LOCK_TIMEOUTMON$TRANSACTIONSD,MAX_MEMORY_ALLOCATEDMON$MEMORY_USAGEDUSEDMON$MEMORY_USAGED&EMORY_ALLOCATEDMON$MEMORY_USAGECUSEDMON$MEMORY_USAGE4"NEXT_TRANSACTIONMON$DATABASE< OBJECT_NAMEMON$CALL_STACK<TYPEMON$CALL_STACK4DS_MAJORMON$DATABASE4 INORMON$DATABASE4!LDEST_ACTIVEMON$DATABASE<TRANSACTIONS4SNAPSHOTMON$DATABASE4TRANSACTIONMON$DATABASE<$TRANSACTIONS5PAGESMON$DATABASE4 _BUFFERSMON$DATABASE C FETCHESMON$IO_STATSC MARKSMON$IO_STATS C READSMON$IO_STATS4 SIZEMON$DATABASE C WRITESMON$IO_STATS5READ_ONLYMON$DATABASE <TRANSACTIONSC%CORD_BACKOUTSMON$RECORD_STATSCDELETESMON$RECORD_STATSCEXPUNGESMON$RECORD_STATSCIDX_READSMON$RECORD_STATSCNSERTSMON$RECORD_STATSCPURGESMON$RECORD_STATSCSEQ_READSMON$RECORD_STATSCUPDATESMON$RECORD_STATS;$MOTE_ADDRESSMON$ATTACHMENTS;PIDMON$ATTACHMENTS;ROCESSMON$ATTACHMENTS;TOCOLMON$ATTACHMENTS5 SERVE_SPACEMON$DATABASE;OLEMON$ATTACHMENTS 5!SERVER_PIDMON$ATTACHMENTS5!HUTDOWN_MODEMON$DATABASEC$OURCE_COLUMNMON$CALL_STACK<LINEMON$CALL_STACK_4QL_DIALECTMON$DATABASEASEEDURE_PARAMETERSRELATION_FIELDS-NAMERDB$COLLATIONS$MPLEX_NAMERDB$RELATION_FIELDS UTED_BLRRDB$FIELDS SOURCERDB$FIELDS%,NSTRAINT_NAMERDB$CHECK_CONSTRAINTS%REF_CONSTRAINTS %!LATION_CONSTRAINTS %$TYPERDB$RELATION_CONSTRAINTS% %_NAME_UQRDB$REF_CONSTRAINTS "TEXT_NAMERDB$VIEW_RELATIONSDBKEY_LENGTHRDB$RELATIONS &EBUG_INFORDB$PROCEDURES TRIGGERS"FAULT_CLASSRDB$RELATIONS -$OLLATE_NAMERDB$CHARACTER_SETSSOURCERDB$FIELDS-PROCEDURE_PARAMETERSRELATION_FIELDSVALUERDB$FIELDS-PROCEDURE_PARAMETERS RELATION_FIELDSN% )ERRABLERDB$RELATION_CONSTRAINTSp90j/ mRDB$E]FIELD_PORMW  PAcRELATION_NAMERDB$%2RDB$DEFERRABLERDB$RELATION_CONSTRAINTS%$LETE_RULERDB$REF_CONSTRAINTS%PENDED_ON_NAMERDB$DEPENDENCIESTYPERDB$DEPENDENCIESNT_NAMERDB$DEPENDENCIESTYPERDB$DEPENDENCIES -#SCRIPTIONRDB$CHARACTER_SETS- OLLATIONS DATABASE 4 EXCEPTIONSFIELDSLTERS UNCTIONS GENERATORSINDICES& PROCEDURES,% _PARAMETERS RELATIONS $_FIELDS4OLESSECURITY_CLASSES TRIGGERSYPESORRDB$FORMATS&IMENSIONRDB$FIELD_DIMENSIONSSRDB$FIELDSEDIT_STRINGRDB$FIELDSRELATION_FIELDSNTRYPOINTRDB$FILTERS UNCTIONS-$XCEPTION_NAMERDB$EXCEPTIONS-UMBERRDB$EXCEPTIONSPRESSION_BLRRDB$INDICESSOURCERDB$INDICES 'TERNAL_DESCRIPTIONRDB$RELATIONS FILERDB$RELATIONSLENGTHRDB$FIELDSSCALERDB$FIELDSTYPERDB$FIELDSFIELD_IDRDB$RELATIONS _FIELDS LENGTHRDB$FIELDSUNCTION_ARGUMENTS NAMERDB$DEPENDENCIESFIELDS _DIMENSIONSINDEX_SEGMENTS-PROCEDURE_PARAMETERSRELATION_FIELDSTYPESUSER_PRIVILEGES #POSITIONRDB$INDEX_SEGMENTSRELATION_FIELDSRECISIONRDB$FIELDS UNCTION_ARGUMENTS SCALERDB$FIELDSUNCTION_ARGUMENTS,$OURCERDB$PROCEDURE_PARAMETERSRELATION_FIELDSUB_TYPERDB$FIELDS UNCTION_ARGUMENTS TYPERDB$FIELDS UNCTION_ARGUMENTSLE_FLAGSRDB$FILES% LOG_FILES LENGTHRDB$FILES% LOG_FILES4 NAMERDB$BACKUP_HISTORYFILES% LOG_FILES% PARTITIONSRDB$LOG_FILES% _OFFSETRDB$LOG_FILES SEQUENCERDB$FILES% LOG_FILES TARTRDB$FILESLAGSRDB$RELATIONS TRIGGERSOREIGN_KEYRDB$INDICES MATRDB$FORMATS RELATIONS- _OF_USERDB$CHARACTER_SETS-)UNCTION_NAMERDB$CHARACTER_SETS- OLLATIONSFILTERS UNCTIONS ) _ARGUMENTSTYPERDB$FUNCTIONS GENERATOR_IDRDB$GENERATORSNAMERDB$GENERATORS  RANTORRDB$USER_PRIVILEGES  _OPTIONRDB$USER_PRIVILEGES4UIDRDB$BACKUP_HISTORYINDEX_IDRDB$INDICESNACTIVERDB$INDICES NAMERDB$INDEX_SEGMENTSICES%RELATION_CONSTRAINTS TYPERDB$INDICES%4ITIALLY_DEFERREDRDB$RELATION_CONSTRAINTSPUT_SUB_TYPERDB$FILTERS'LOWER_BOUNDRDB$FIELD_DIMENSIONS%&MATCH_OPTIONRDB$REF_CONSTRAINTS )ECHANISMRDB$FUNCTION_ARGUMENTS 4SSAGERDB$EXCEPTIONS TRIGGER_MESSAGES$_NUMBERRDB$TRIGGER_MESSAGESISSING_SOURCERDB$FIELDSVALUERDB$FIELDSODULE_NAMERDB$FILTERS UNCTIONSNULL_FLAGRDB$FIELDS-PROCEDURE_PARAMETERSRELATION_FIELDS --MBER_OF_CHARACTERSRDB$CHARACTER_SETS&OBJECT_TYPERDB$USER_PRIVILEGES UTPUT_SUB_TYPERDB$FILTERS&WNER_NAMERDB$PROCEDURES  RELATIONS 4OLESPAGE_NUMBERRDB$PAGES SEQUENCERDB$PAGES TYPERDB$PAGES-4RAMETER_MECHANISMRDB$PROCEDURE_PARAMETERS &%NAMERDB$PROCEDURE_PARAMETERS,$UMBERRDB$PROCEDURE_PARAMETERS,%TYPERDB$PROCEDURE_PARAMETERS %RIVILEGERDB$USER_PRIVILEGES&#OCEDURE_BLRRDB$PROCEDURES%IDRDB$PROCEDURES&NPUTSRDB$PROCEDURES%NAMERDB$PROCEDURES,* _PARAMETERS&OUTPUTSRDB$PROCEDURES&SOURCERDB$PROCEDURES &TYPERDB$PROCEDURESQUERY_HEADERRDB$FIELDSRELATION_FIELDS NAMERDB$FIELDS UNCTIONSRELATION_FIELDSRELATION_IDRDB$DATABASEFORMATSPAGES RELATIONSNAMERDB$INDICES-PROCEDURE_PARAMETERS RELATIONS %)_CONSTRAINTS*FIELDS TRIGGERSUSER_PRIVILEGESRVIEW_RELATIONSp90'`g4#MON$SQL_DIALECTMON$DATABASE%h1RDB$DEFERRABLERDB$RELATION_CONSTRAINTSj*RELATION_NAMERDB$VIEW_RELATIONS p90hmKRDB$SYSTEM_FLAGRDB$<UP0RDB$RELATION_NAMERDB$VIEW_RELATIONSTYPERDB$RELATIONS"TURN_ARGUMENTRDB$FUNCTIONS 4OLE_NAMERDB$ROLES&UNTIMERDB$PROCEDURES  RELATIONS4SCNRDB$BACKUP_HISTORY!ECURITY_CLASSRDB$DATABASE& PROCEDURES  RELATIONS)_FIELDSSECURITY_CLASSESGMENT_COUNTRDB$INDICESLENGTHRDB$FIELDSHADOW_NUMBERRDB$FILES-)PECIFIC_ATTRIBUTESRDB$COLLATIONS$TATISTICSRDB$INDEX_SEGMENTSICES -$YSTEM_FLAGRDB$CHARACTER_SETS- OLLATIONS 4 EXCEPTIONSFIELDSLTERS  UNCTIONS GENERATORSINDICES& PROCEDURES,% _PARAMETERS RELATIONS $_FIELDS4OLES TRIGGERSYPES4%TIMESTAMPRDB$BACKUP_HISTORYTRANSACTIONS0RANSACTION_DESCRIPTIONRDB$TRANSACTIONSIDRDB$TRANSACTIONSSTATERDB$TRANSACTIONSIGGER_BLRRDB$TRIGGERSINACTIVERDB$TRIGGERS%NAMERDB$CHECK_CONSTRAINTS TRIGGERS" _MESSAGESSEQUENCERDB$TRIGGERSOURCERDB$TRIGGERSTYPERDB$TRIGGERS YPERDB$TYPES _NAMERDB$TYPESUNIQUE_FLAGRDB$INDICES%PDATE_FLAGRDB$RELATION_FIELDS%RULERDB$REF_CONSTRAINTS%PER_BOUNDRDB$FIELD_DIMENSIONS SERRDB$USER_PRIVILEGES "_TYPERDB$USER_PRIVILEGES  VALIDATION_BLRRDB$FIELDS SOURCERDB$FIELDS & _BLRRDB$PROCEDURES TRIGGERSIEW_BLRRDB$RELATIONS  CONTEXTRDB$RELATION_FIELDSVIEW_RELATIONS NAMERDB$VIEW_RELATIONS SOURCERDB$RELATIONSJSALARYEMPLOYEESES_REPSALESSHIP_DATESALESKTATE_PROVINCECUSTOMER RTEAM_LEADERPROJECT SOTAL_VALUESALESR UPDATER_IDSALARY_HISTORYL V_NONET4L OCTETST4R UTF8T4LWIN1250T4 p90-='@` @`   a @`d  p90('@ p90'ADD_EMP_PROJEMP_NOPROJ_IDLL_LANGSCODEUNTRYGRADELANG DELETE_EMPLOYEEEMP_NUM PT_BUDGETDNO TOTGET_EMP_PROJEMP_NOPROJ_IDMAIL_LABELCUST_NOLINE123456 ORG_CHARTDEPARTMENTEMP_CNT  HEAD_DEPT MNGR_NAMETITLESHIP_ORDERPO_NUMOW_LANGSCODETYGRADE LANGUAGESUB_TOT_BUDGETAVG_BUDGET HEAD_DEPT MAX_BUDGET IN_BUDGET TOT_BUDGET p90v'PASCII BIG_5CP943CYRLDOS43773775850278601234569 EUCJ_0208GB18030K _2312 ISO8859_1 323456789 KOI8RU SC_5601NEXTONEOCTETS SJIS_0208TIS620 UNICODE_FSSTF8WIN125012345678 p90L,PNASCII BIG_5S_BACP943C_UNICODES_CZ YRLDA_DAB_CSYDAN865EU437850ESP437850FIN437RA437850C850 63ITA437850NLD437850OR865PLKTB850G860 RUSSLOVE437850TRKUK437850S437850 E_DE OS437 73775850278601234569 U_NLEN_UKSS_ES_CI_AI UCJ_0208 FI_FI R_CA FR_CI_AIGB18030_UNICODEK_UNICODE _2312 ISO8859_1 323456789_HUNPLK_IST_IT KOI8R _RUU_UASC_5601  DICTIONARYLT_LT NEXTONE_NOXT_DEUESPFRAITA USOCTETS PDOX_ASCIICSY YRLHUN INTLSLNORDAN4PLKSLOWEDFINT_BRPTXW_CSYYRL GREEKHUNDC INTL 850 NORDAN4PLKSLOV PAN WEDFIN TURK SJIS_0208V_SV TEST_COLLATEIS620_UNICODE UCS_BASICNICODE_CI _AIFSSTF8WIN12501_UA 2 3 4567_EELT V8_CZ_CI_AI PTBR p90'P ADD_EMP_PROJLL_LANGS DELETE_EMPLOYEE PT_BUDGET GET_EMP_PROJ MAIL_LABEL ORG_CHART SHIP_ORDEROW_LANGS UB_TOT_BUDGET p90R'@ "$ p90 'PCUSTOMER_CHECK ON_HOLDORDER_ALREADY_SHIPPEDREASSIGN_SALESUNKNOWN_EMP_ID p90>'@ p90@'@"$&(*,.0123567ABCDFGHIJKLMN OP@Q@ p90#2@s"$&(*,.012 3567ABCDFGHIJ  K LMN OP@Q@$&(*, 356DFGIJ  K N OPQ@$&(356FIJ N$&(356I JN$&35FI J$&35FI J$&5FI J$&5FI $&5FI"$&5$$&5&$5($5,5.5051525_I p90 4P ORG_CHART % ADD_EMP_PROJ% % % LL_LANGS     CHECK_1012345678920123456783456789DELETE_EMPLOYEE PT_BUDGET    % GET_EMP_PROJ% %  MAIL_LABEL           ORG_CHART          PHONE_LIST     RDB$17319SAVE_SALARY_CHANGE ET_CUST_NO EMP_NO  HIP_ORDER           OW_LANGS     UB_TOT_BUDGET% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % p90t 9PSALARY_HISTORYCUSTOMER_CHECK ON_HOLD_NO_GEN DEPARTMENT               % T_BUDGETEMPLOYEE_PROJECT%%%%%% _NO_GENJOBORDER_ALREADY_SHIPPEDPROJECT  _DEPT_BUDGETREASSIGN_SALES SALARY_HISTORYES HOW_LANGS %UNKNOWN_EMP_ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID % % % % % % % % % % p90%'0PSALES  ADD_EMP_PROJ LL_LANGS RCOUNTRYUSTOMER DELETE_EMPLOYEEPARTMENT       T_BUDGET EMPLOYEE_PROJECT  GET_EMP_PROJ JOB MAIL_LABEL  ORG_CHART  PHONE_LIST         ROJECT _DEPT_BUDGET RDB$FORMATS PAGES ROLES SALARY_HISTORYES HIP_ORDER OW_LANGS  UB_TOT_BUDGETT234      p90%='PPUBLICSYSDBA      p90 'PCOUNTRYUSTOMER DEPARTMENT    EMPLOYEE_PROJECTJOBPROJECT _DEPT_BUDGETRDB$BACKUP_HISTORYCHARACTER_SETSECK_CONSTRAINTS OLLATIONS DEPENDENCIES EXCEPTIONSFIELDS _DIMENSIONSLTERS ORMATS UNCTIONS _ARGUMENTS  GENERATORSINDEX_SEGMENTSICES   PROCEDURES _PARAMETERS REF_CONSTRAINTSLATIONS _CONSTRAINTS FIELDSOLESSECURITY_CLASSES TRANSACTIONSIGGERS  _MESSAGESYPESUSER_PRIVILEGESVIEW_RELATIONSSALARY_HISTORYES p90('@ p90 9'P PHONE_LIST p90B'P DEPARTMENTEMPLOYEE p90'P RDB$TRIGGER_1 0 2 3 4 5 7 8 9 2 0 1 2 3 4 5 6 3 1 2 3 6 5 9 p90j|'PRDB$13465123456789601456 p90 ,2PFBREACLTIVENSISCII7 TTACHMENTBIG5 _5NARYLOB_FILTER IDROOLEANY_ISC_DESCRIPTOR REFERENCE _WITH_NULLSCALAR_ARRAY_DESCRIPTORVALUE MS_DESCRIPTORCALLHECK_CONSTRAINTOLLATIONMMITTED PUTED_FIELD NCURRENCYNECTSISTENCYP943C STRINGYRLDATABASEEEBUG_INFORMATION ISCONNECTOS43773775850278601234569_437 737 758502786012345699364950UBLEEUCJ_0208XCEPTION ECUTABLEPRESSION_INDEXTERNAL_FILE_DESCRIPTIONFIELDLOATORMAT ULL_SHUTDOWNGB180302312K _2312ENERATORLOBAL_TEMPORARY_DELETEPRESERVEIDLENDEX T64 SO-8859-13 2 3 4 5 6 7 8 988591323456789 _1  3 2 3 4 5 6 7 8 9 KOI8RUSC5601 _5601LATIN123457 EGACYIMBOONGMERGEULTI_USER_SHUTDOWNNEXTONE RMALOCTETSNLINE PERSISTENT OST_ERASEMODIFYSTORERE_ERASEMODIFYSTOREOCEDUREQLIUADRANGESEAD_COMMITTED_NO_VERSIONVERSIONFERENTIAL_CONSTRAINT LATIONOLELED_BACK  SELECTABLEHORTINGLE_USER_SHUTDOWNJIS_0208QL_TEXTTALLEDTEMENTUMMARYYSTEMTEXT IMESTAMPS620 RANSACTION  _COMMIT DESCRIPTION  ROLLBACK START IGGER YPE OFUDF NICODE_FSSSASCIIER_GROUPTF-88_FSS VALIDATIONUERYING IEW_CHECKRTUALWIN125012345678_1250123456789364950 p90 'P--COUNTRY%USTOMER%%EMPLOYEE%JOBPROJ_DEPT_BUDGETRDB$CHECK_CONSTRAINTS EXCEPTIONSFIELDS GENERATORSINDEX_SEGMENTSICES  PROCEDURESREF_CONSTRAINTSLATIONS  _CONSTRAINTS FIELDSTRIGGERS   USER_PRIVILEGESSALARY_HISTORY%%ES%&&&&&&,,--------- p90B'P RDB$ADMIN TEST_ROLE p90-'P CHANGE_DATEECK_1012345678920123456783456789OUNTRYURRENCYSTOMER_NO DEPARTMENT T_NOISCOUNT EMP_NO FIRST_NAME SCAL_YEAR HIRE_DATEJOB_CODEUNTRY GRADE TITLE LAST_NAME MAX_SALARY IN_SALARY OLD_SALARY RDER_DATE STATUSPERCENT_CHANGE O_NUMBERROJ_IDNAME QTY_ORDEREDSALARY TOTAL_VALUE UPDATER_ID p90 'P`abcdefghijklmnopqrstuvwxyz{|}~`abcdefghijkopqrstwxyz|}~adeghjklopqsuwxy  RDB$PRIMARY1  2  2 2 5   7    p907J@pSALARY_HISTORYCOUNTRYNOT NULL PRIMARY KEYUSTOMERCHECK FOREIGN KEY NOT NULL PRIMARY KEYDEPARTMENTFOREIGN KEY  NOT NULL PRIMARY KEYUNIQUEEMPLOYEECHECK FOREIGN KEY NOT NULL PRIMARY KEY _PROJECTFOREIGN KEY" NOT NULL PRIMARY KEY  JOBCHECK  FOREIGN KEY NOT NULL  PRIMARY KEYPROJECTFOREIGN KEY NOT NULL PRIMARY KEY UNIQUE _DEPT_BUDGETCHECK FOREIGN KEY"  NOT NULL PRIMARY KEYSALARY_HISTORYCHECK FOREIGN KEY NOT NULL PRIMARY KEY ESCHECK FOREIGN KEY NOT NULL  PRIMARY KEY p90 'P`bcdefghklmqrstuvwxy}`deijklrstuvwz{|`abcdefghijklpqRDB$114 FOREIGN10 3 5 6 8 9 21 3 5 6 3 6 8 9PRIMARY1 2 4 7 2 0 2 4 5 7 90)754\6 ;:9p8<4 - / /x 4H . , 0 1| 9D 8 , 1 1| 4D 5 5 - -x 2@ 5 , - . 3L 1 ,33-X0(0/1,h-802-0t.@2.,-30P2 RDB$PRIMARY2 JOB_CODE $I?T PARRDRDNO' RDB$PRIMARY2 JOB_COUN% RDB$PRIMARY2 JOB_GR#9 RDB$FOREIGN10 MNBUDGETX BUDGET $I? / RDB$FOREIGN6 HEAD RDB$PRIMARY5 DEPT_NO  a?RDB$4 DEPARTMENT  a?_NNAMEX FIRST_NAME  a?NAMEX LAST_NAME ?EX"7 RDB$FOREIGN9 JOB_COUN"5 RDB$FOREIGN9 JOB_GR"3 RDB$FOREIGN9 JOB!1 RDB$FOREIGN8 DE RDB$PRIMARY7 EMP_NO  a?22 CUSTREGION CITY  ? CUSTREGION COUNTRY E? CUSTNAMEX CUSTOMER  ?*G RDB$FOREIGN23 CO RDB$PRIMARY22 CUST_NO  ? PRODTYPEX PROJ_NAME `UU? PRODTYPEX PRODUCT ?$; RDB$FOREIGN13 TEAM_L RDB$PRIMARY12 PROJ_ID `UU?RDB$11 PROJ_NAME `UU?&? RDB$FOREIGN16 PR%= RDB$FOREIGN15 E  RDB$PRIMARY14 PROJ_ID $I?QT  RDB$PRIMARY14 EMP_NO E? (C RDB$FOREIGN19 PR'A RDB$FOREIGN18 DE  RDB$PRIMARY17 DEPT_NO `UU?D  RDB$PRIMARY17 PROJ_ID  q?S  RDB$PRIMARY17 FISCAL_YEAR ? CHANGEX CHANGE_DATE `UU? UPDATERX UPDATER_ID `UU?ME)E RDB$FOREIGN21 E  RDB$PRIMARY20 UPDATER_ID ?  RDB$PRIMARY20 CHANGE_DATE ?  RDB$PRIMARY20 EMP_NO ?QTYX QTY_ORDERED E?QTYX ITEM_TYPE `UU? SALESTATX PAID `UU? SALESTATX ORDER_STATUS `UU?NEEDX DATE_NEEDED E?,K RDB$FOREIGN26 SALE+I RDB$FOREIGN25 CU RDB$PRIMARY24 PO_NUMBER ? RDB$INDEX_48 RDB$FIELD_NAME ? RDB$INDEX_48 RDB$RELATION_NAME ? RDB$INDEX_47 RDB$FIELD_SOURCE ? RDB$INDEX_46 RDB$GENERATOR_ID E? RDB$INDEX_45 RDB$FUNCTION_NAME  RDB$INDEX_44 RDB$BACKUP_ID  RDB$INDEX_44 RDB$BACKUP_LEVEL x90 ('P 90ZHG|<4ELJd8 DDD / 3 0L @ L 8 8P @ P Pp @ P P 0h 8$ D 4 8p H@ 0 48DLD ,4<hH44H4x@L, ,8|`D|P, RDB$FOREIGN26 SALES  RDB$PRIMARDB$INDEX_10 RDB$FUNCTION_ARGUMENTS  RDB$INDEX_8 RDB$TRIGGERS RDB$INDEX_7 RDB$SECURITY_CLASSES L?ELARDB$INDEX_5 RDB$INDICES BRDB$INDEX_4 RDB$RELATION_FIELDS is?RDB$INDEX_2 RDB$FIELDS RDB$INDEX_1 RDB$RELATIONS `?RDB$INDEX_0 RDB$RELATIONS RDB$INDEX_48 RDB$PROCEDURE_PARAMETERS NRDB$INDEX_47 RDB$PROCEDURE_PARAMETERS DRDB$INDEX_46 RDB$GENERATORS  RDB$INDEX_45 RDB$FILTERS RDB$INDEX_44 RDB$BACKUP_HISTORY ?D ?$I?N`?  a?NRs? FRDB$PRIMARY1 COUNTRY  D MAXSALX JOB  B MINSALX JOB HRDB$FOREIGN3 JOB RDB$PRIM @RDB$PRIMARY2 JOB # RDB$FOREIGN10 DEPARTMENT RDB$PRIM > BUDGETX DEPARTMENT   JRDB$FOREIGN6 DEPARTMENT  RDB$PRIMA <RDB$PRIMARY5 DEPARTMENT  : RDB$4 DEPARTMENT  8 NAMEX EMPLOYEE" RDB$FOREIGN9 EMPLOYEE RDB$PRI! RDB$FOREIGN8 EMPLOYEE RDB$PRI6RDB$PRIMARY7 EMPLOYEE  4CUSTREGION CUSTOMER  2 CUSTNAMEX CUSTOMER* RDB$FOREIGN23 CUSTOMER  RDB$PRIMAR0RDB$PRIMARY22 CUSTOMER  . PRODTYPEX PROJECT $ RDB$FOREIGN13 PROJECT RDB$PRI,RDB$PRIMARY12 PROJECT  * RDB$11 PROJECT &  RDB$FOREIGN16 EMPLOYEE_PROJECT  RDB$PRIMAR% RDB$FOREIGN15 EMPLOYEE_PROJECT  RDB$PRIMAR (RDB$PRIMARY14 EMPLOYEE_PROJECT ( RDB$FOREIGN19 PROJ_DEPT_BUDGET  RDB$PRIMAR'  RDB$FOREIGN18 PROJ_DEPT_BUDGET  RDB$PRIMAR &RDB$PRIMARY17 PROJ_DEPT_BUDGET   $ CHANGEX SALARY_HISTORY   " UPDATERX SALARY_HISTORY ) RDB$FOREIGN21 SALARY_HISTORY RDB$PRIM  RDB$PRIMARY20 SALARY_HISTORY  QTYX SALES  SALESTATX SALES `UU?N NEEDX SALES E?D+ RDB$FOREIGN25 SALES  RDB$PRIMARDB$PRIMARY24 SALES ?RDB$INDEX_48 RDB$PROCEDURE_PARAMETERS ?RDB$INDEX_47 RDB$PROCEDURE_PARAMETERS ?RDB$INDEX_46 RDB$GENERATORS E?5 RDB$INDEX_45 RDB$FILTERS RDB$INDEX_44 RDB$BACKUP_HISTORY p90('P p90 V'@ "$& p90'PRDB$3234567894012345678950123456789601234 p90j'`abcdefghijklmnopqrstuvwxyz{|}~` 90 112d101236\4(1 4 4 1X 1$ 2 6 5 4L 4 7 8 7\ H J B 4` 7, 3 8 =t =, FB8t989:89P69@ALC525l<487RDB$OBJECT_TYPE PROCEDURE RDB$OBJECT_TYPE VALIDATION RDB$OBJECT_TYPE COMPUTED_FIELD RDB$OBJECT_TYPE TRIGGER RDB$OBJECT_TYPE VIEW RDB$OBJECT_TYPE RELATION RDB$TRIGGER_TYPE  TRANSACTION_ROLLBACK RDB$TRIGGER_TYPE  TRANSACTION_COMMIT RDB$TRIGGER_TYPE  TRANSACTION_START RDB$TRIGGER_TYPE  DISCONNECT RDB$TRIGGER_TYPE CONNECT RDB$TRIGGER_TYPE POST_ERASE RDB$TRIGGER_TYPE PRE_ERASE RDB$TRIGGER_TYPE POST_MODIFY RDB$TRIGGER_TYPE PRE_MODIFY RDB$TRIGGER_TYPE POST_STORE RDB$TRIGGER_TYPE PRE_STORE  RDB$MECHANISM BY_REFERENCE_WITH_NULL  RDB$MECHANISM BY_SCALAR_ARRAY_DESCRIPTOR  RDB$MECHANISM BY_ISC_DESCRIPTOR  RDB$MECHANISM BY_VMS_DESCRIPTOR  RDB$MECHANISM BY_REFERENCE  RDB$MECHANISM BY_VALUE RDB$FUNCTION_TYPE BOOLEAN RDB$FUNCTION_TYPE VALUE RDB$FIELD_SUB_TYPE  DEBUG_INFORMATION RDB$FIELD_SUB_TYPE EXTERNAL_FILE_DESCRIPTION RDB$FIELD_SUB_TYPE TRANSACTION_DESCRIPTION RDB$FIELD_SUB_TYPE FORMAT RDB$FIELD_SUB_TYPE SUMMARY RDB$FIELD_SUB_TYPE RANGES RDB$FIELD_SUB_TYPE ACL RDB$FIELD_SUB_TYPE BLR RDB$FIELD_SUB_TYPE TEXT RDB$FIELD_SUB_TYPE BINARY RDB$FIELD_TYPE INT64 RDB$FIELD_TYPE  TIME RDB$FIELD_TYPE  DATE RDB$FIELD_TYPE -BLOB_ID RDB$FIELD_TYPE (CSTRING RDB$FIELD_TYPE BLOB RDB$FIELD_TYPE %VARYING RDB$FIELD_TYPE #TIMESTAMP RDB$FIELD_TYPE DOUBLE RDB$FIELD_TYPE  FLOAT RDB$FIELD_TYPE  QUAD RDB$FIELD_TYPE LONG RDB$FIELD_TYPE SHORT RDB$FIELD_TYPE TEXT 90 0>7T2 3382H71 9 7d 9$ = ? 1| 4H 1 > D 8P 9 4 8 7` I G 6 ;h ;, ;=+.`/(5CD`=$;<GTJ 4644H78MON$STAT_GROUP TRANSACTION MON$STAT_GROUP ATTACHMENT MON$STAT_GROUP DATABASE MON$BACKUP_STATE MERGE MON$BACKUP_STATE STALLED MON$BACKUP_STATE NORMAL MON$ISOLATION_MODE READ_COMMITTED_NO_VERSION MON$ISOLATION_MODE READ_COMMITTED_VERSION MON$ISOLATION_MODE CONCURRENCY MON$ISOLATION_MODE CONSISTENCY MON$SHUTDOWN_MODE FULL_SHUTDOWN MON$SHUTDOWN_MODE SINGLE_USER_SHUTDOWN MON$SHUTDOWN_MODE MULTI_USER_SHUTDOWN MON$SHUTDOWN_MODE ONLINE  MON$STATE STALLED  MON$STATE ACTIVE  MON$STATE IDLE RDB$PARAMETER_MECHANISM TYPE OF RDB$PARAMETER_MECHANISM NORMAL RDB$PROCEDURE_TYPE EXECUTABLE RDB$PROCEDURE_TYPE SELECTABLE RDB$PROCEDURE_TYPE LEGACY RDB$RELATION_TYPE GLOBAL_TEMPORARY_DELETE RDB$RELATION_TYPE GLOBAL_TEMPORARY_PRESERVE RDB$RELATION_TYPE VIRTUAL RDB$RELATION_TYPE EXTERNAL RDB$RELATION_TYPE VIEW RDB$RELATION_TYPE PERSISTENT RDB$SYSTEM_FLAG VIEW_CHECK RDB$SYSTEM_FLAG REFERENTIAL_CONSTRAINT RDB$SYSTEM_FLAG CHECK_CONSTRAINT RDB$SYSTEM_FLAG QLI RDB$SYSTEM_FLAG SYSTEM RDB$SYSTEM_FLAG USER RDB$TRANSACTION_STATE ROLLED_BACK RDB$TRANSACTION_STATE COMMITTED RDB$TRANSACTION_STATE LIMBO RDB$OBJECT_TYPE COLLATION RDB$OBJECT_TYPE BLOB_FILTER RDB$OBJECT_TYPE UDF RDB$OBJECT_TYPE GENERATOR RDB$OBJECT_TYPE  ROLE RDB$OBJECT_TYPE USER_GROUP RDB$OBJECT_TYPE  INDEX RDB$OBJECT_TYPE  FIELD RDB$OBJECT_TYPE USER RDB$OBJECT_TYPE EXCEPTION RDB$OBJECT_TYPE EXPRESSION_INDEX 90 /61\8 ;:@h9(> > ;p ;4 ; > >t >4 > > >t >4 > > ?x ;< ; ; ; ;L 9 ;;;\; ;;;l<0<<<|<@9<<<L=:<RDB$CHARACTER_SET_NAME 9GB_2312 RDB$CHARACTER_SET_NAME 8BIG_5 RDB$CHARACTER_SET_NAME ,KSC_5601 RDB$CHARACTER_SET_NAME <WIN1257 RDB$CHARACTER_SET_NAME ;WIN1256 RDB$CHARACTER_SET_NAME :WIN1255 RDB$CHARACTER_SET_NAME NEXT RDB$CHARACTER_SET_NAME 7WIN1254 RDB$CHARACTER_SET_NAME 6WIN1253 RDB$CHARACTER_SET_NAME 5WIN1252 RDB$CHARACTER_SET_NAME 4WIN1251 RDB$CHARACTER_SET_NAME 3WIN1250 RDB$CHARACTER_SET_NAME 1DOS869 RDB$CHARACTER_SET_NAME 0DOS866 RDB$CHARACTER_SET_NAME DOS864 RDB$CHARACTER_SET_NAME DOS862 RDB$CHARACTER_SET_NAME DOS858 RDB$CHARACTER_SET_NAME DOS775 RDB$CHARACTER_SET_NAME DOS737 RDB$CHARACTER_SET_NAME 2CYRL RDB$CHARACTER_SET_NAME DOS863 RDB$CHARACTER_SET_NAME /DOS861 RDB$CHARACTER_SET_NAME DOS860 RDB$CHARACTER_SET_NAME .DOS857 RDB$CHARACTER_SET_NAME -DOS852 RDB$CHARACTER_SET_NAME (ISO8859_13 RDB$CHARACTER_SET_NAME 'ISO8859_9 RDB$CHARACTER_SET_NAME &ISO8859_8 RDB$CHARACTER_SET_NAME %ISO8859_7 RDB$CHARACTER_SET_NAME $ISO8859_6 RDB$CHARACTER_SET_NAME #ISO8859_5 RDB$CHARACTER_SET_NAME "ISO8859_4 RDB$CHARACTER_SET_NAME ISO8859_3 RDB$CHARACTER_SET_NAME ISO8859_2 RDB$CHARACTER_SET_NAME ISO8859_1 RDB$CHARACTER_SET_NAME DOS865 RDB$CHARACTER_SET_NAME DOS850 RDB$CHARACTER_SET_NAME DOS437 RDB$CHARACTER_SET_NAME EUCJ_0208 RDB$CHARACTER_SET_NAME SJIS_0208 RDB$CHARACTER_SET_NAME UTF8 RDB$CHARACTER_SET_NAME UNICODE_FSS RDB$CHARACTER_SET_NAME ASCII RDB$CHARACTER_SET_NAME OCTETS RDB$CHARACTER_SET_NAME NONE MON$STAT_GROUP CALL MON$STAT_GROUP STATEMENT 90 .::L<;8;`<$; < ;p <0 = : 9| 9@ < < < >H = ; 9 >P = ; ? >T = ;?>X=;?>\=?>=\?>=?\>=?RDB$CHARACTER_SET_NAME &ISO-8859-8 RDB$CHARACTER_SET_NAME &ISO88598 RDB$CHARACTER_SET_NAME &ISO8859_8 RDB$CHARACTER_SET_NAME %ISO-8859-7 RDB$CHARACTER_SET_NAME %ISO88597 RDB$CHARACTER_SET_NAME %ISO8859_7 RDB$CHARACTER_SET_NAME $ISO-8859-6 RDB$CHARACTER_SET_NAME $ISO88596 RDB$CHARACTER_SET_NAME $ISO8859_6 RDB$CHARACTER_SET_NAME #ISO-8859-5 RDB$CHARACTER_SET_NAME #ISO88595 RDB$CHARACTER_SET_NAME #ISO8859_5 RDB$CHARACTER_SET_NAME "ISO-8859-4 RDB$CHARACTER_SET_NAME "LATIN4 RDB$CHARACTER_SET_NAME "ISO88594 RDB$CHARACTER_SET_NAME "ISO8859_4 RDB$CHARACTER_SET_NAME ISO-8859-3 RDB$CHARACTER_SET_NAME LATIN3 RDB$CHARACTER_SET_NAME ISO88593 RDB$CHARACTER_SET_NAME ISO8859_3 RDB$CHARACTER_SET_NAME ISO-8859-2 RDB$CHARACTER_SET_NAME LATIN2 RDB$CHARACTER_SET_NAME ISO88592 RDB$CHARACTER_SET_NAME ISO8859_2 RDB$CHARACTER_SET_NAME ANSI RDB$CHARACTER_SET_NAME LATIN1 RDB$CHARACTER_SET_NAME ISO88591 RDB$CHARACTER_SET_NAME ISO8859_1 RDB$CHARACTER_SET_NAME DOS_865 RDB$CHARACTER_SET_NAME DOS_850 RDB$CHARACTER_SET_NAME DOS_437 RDB$CHARACTER_SET_NAME EUCJ RDB$CHARACTER_SET_NAME SJIS RDB$CHARACTER_SET_NAME UTF-8 RDB$CHARACTER_SET_NAME SQL_TEXT RDB$CHARACTER_SET_NAME UTF_FSS RDB$CHARACTER_SET_NAME ASCII7 RDB$CHARACTER_SET_NAME USASCII RDB$CHARACTER_SET_NAME BINARY RDB$CHARACTER_SET_NAME EGB18030 RDB$CHARACTER_SET_NAME DCP943C RDB$CHARACTER_SET_NAME CGBK RDB$CHARACTER_SET_NAME BTIS620 RDB$CHARACTER_SET_NAME AWIN1258 RDB$CHARACTER_SET_NAME @KOI8U RDB$CHARACTER_SET_NAME ?KOI8R 90 &>=D;??>H;@ < <T < < < <d <( < < <t <8 < = =x =8 = = =x =8 ==<<D<9<<T;<<RDB$CHARACTER_SET_NAME 9WIN_936 RDB$CHARACTER_SET_NAME 9DOS_936 RDB$CHARACTER_SET_NAME 9GB2312 RDB$CHARACTER_SET_NAME 8WIN_950 RDB$CHARACTER_SET_NAME 8DOS_950 RDB$CHARACTER_SET_NAME 8BIG5 RDB$CHARACTER_SET_NAME ,WIN_949 RDB$CHARACTER_SET_NAME ,DOS_949 RDB$CHARACTER_SET_NAME ,KSC5601 RDB$CHARACTER_SET_NAME AWIN_1258 RDB$CHARACTER_SET_NAME <WIN_1257 RDB$CHARACTER_SET_NAME ;WIN_1256 RDB$CHARACTER_SET_NAME :WIN_1255 RDB$CHARACTER_SET_NAME 7WIN_1254 RDB$CHARACTER_SET_NAME 6WIN_1253 RDB$CHARACTER_SET_NAME 5WIN_1252 RDB$CHARACTER_SET_NAME 4WIN_1251 RDB$CHARACTER_SET_NAME 3WIN_1250 RDB$CHARACTER_SET_NAME 1DOS_869 RDB$CHARACTER_SET_NAME 0DOS_866 RDB$CHARACTER_SET_NAME DOS_864 RDB$CHARACTER_SET_NAME DOS_862 RDB$CHARACTER_SET_NAME DOS_858 RDB$CHARACTER_SET_NAME DOS_775 RDB$CHARACTER_SET_NAME DOS_737 RDB$CHARACTER_SET_NAME DOS_863 RDB$CHARACTER_SET_NAME /DOS_861 RDB$CHARACTER_SET_NAME DOS_860 RDB$CHARACTER_SET_NAME .DOS_857 RDB$CHARACTER_SET_NAME -DOS_852 RDB$CHARACTER_SET_NAME (ISO-8859-13 RDB$CHARACTER_SET_NAME (LATIN7 RDB$CHARACTER_SET_NAME (ISO885913 RDB$CHARACTER_SET_NAME (ISO8859_13 RDB$CHARACTER_SET_NAME 'ISO-8859-9 RDB$CHARACTER_SET_NAME 'LATIN5 RDB$CHARACTER_SET_NAME 'ISO88599 RDB$CHARACTER_SET_NAME 'ISO8859_9 904*/t-89 +55l/</ / 5 5d 5, 5 5 5 5L 5 5 7 /| /L / / / + /` /0 / / / /p /< 1 111l1@+ 111p3@- 1--x1H/)/1 GB18030 GB18030 E CP943C CP943C DGBK GBK C TIS620 TIS620 B WIN1258 WIN1258 A KOI8U KOI8U @ KOI8R KOI8R ? GB_2312 GB_2312 9 BIG_5 BIG_5 8 KSC_5601 KSC_5601 , WIN1257 WIN1257 < WIN1256 WIN1256 ; WIN1255 WIN1255 :NEXT NEXT  WIN1254 WIN1254 7 WIN1253 WIN1253 6 WIN1252 WIN1252 5 WIN1251 WIN1251 4 WIN1250 WIN1250 3 DOS869 DOS869 1 DOS866 DOS866 0 DOS864 DOS864  DOS862 DOS862  DOS858 DOS858  DOS775 DOS775  DOS737 DOS737  CYRL CYRL 2 DOS863 DOS863  DOS861 DOS861 / DOS860 DOS860   DOS857 DOS857 . DOS852 DOS852 -ISO8859_13 ISO8859_13 ( ISO8859_9 ISO8859_9 ' ISO8859_8 ISO8859_8 & ISO8859_7 ISO8859_7 % ISO8859_6 ISO8859_6 $ ISO8859_5 ISO8859_5 # ISO8859_4 ISO8859_4 " ISO8859_3 ISO8859_3  ISO8859_2 ISO8859_2  ISO8859_1 ISO8859_1  DOS865 DOS865   DOS850 DOS850   DOS437 DOS437   EUCJ_0208 EUCJ_0208  SJIS_0208 SJIS_0208 UTF8 UTF8 UNICODE_FSS UNICODE_FSS  ASCII ASCII  OCTETS OCTETS NONE NONE 90> $#l)H" (&58`'8'$ ) ( +l (D ( ( ( ( (| (T ', ' $ ( ( (h (@ ( ( ( ( 'x 'T $( + ( ( ' $h $D $ $$$$$l$$E,$$$h$D$E2.\<4'$ CS_CZ  ISO8859_2 `FR_FR_CI_AI FR_FR :SPECIALS-FIRST=1ES_ES_CI_AI 8'''DISABLE-COMPRESSIONS=1;SPECIALS-FIRST=1 PT_BR  PT_PT  EN_US  EN_UK   SV_SV   ES_ES  1'''DISABLE-COMPRESSIONS=1;SPECIALS-FIRST=1 NO_NO   IT_IT  IS_IS  DE_DE  FR_CA  FR_FR  FI_FI  DU_NL  DA_DA  ISO8859_1  DB_NOR865   DB_DAN865  PDOX_NORDAN4   DOS865   DB_US850   DB_UK850   DB_SVE850   DB_PTB850   DB_NLD850   DB_ITA850   DB_FRA850   DB_ESP850   DB_DEU850   DB_FRC850   DOS850   DB_US437   DB_UK437   DB_SVE437   DB_NLD437   DB_ITA437   DB_FRA437   DB_FIN437   DB_ESP437   DB_DEU437  PDOX_SWEDFIN   PDOX_INTL  PDOX_ASCII   DOS437   EUCJ_0208  SJIS_0208 `UNICODE_CI_AI UNICODE `UNICODE_CI UNICODE UNICODE  UCS_BASIC UTF8 UNICODE_FSS  ASCII  OCTETS NONE 90>&&'`'8'''''p(L$($% % % '` '8 ' ' $ % $x (T $, ' $ ( " %l (H $$ $ $ $ $ $p $H % & ( & ' &\ $4 % +%')d%<'**'*h'@%(%'"|% NXT_US NEXT  PXW_TURK 7 WIN1254 7 PXW_GREEK 6 WIN1253 6 WIN_PTBR 5PXW_SWEDFIN 5 PXW_SPAN 5PXW_NORDAN4 5PXW_INTL850 5 PXW_INTL 5 WIN1252 5WIN1251_UA 4 PXW_CYRL 4 WIN1251 4WIN_CZ_CI_AI 3 WIN_CZ 3 BS_BA 3 PXW_HUN 3 PXW_SLOV 3 PXW_PLK 3 PXW_HUNDC 3 PXW_CSY 3 WIN1250 3 DOS869 1 DOS866 0 DOS864  DOS862  DOS858  DOS775  DOS737   PDOX_CYRL 2 DB_RUS 2CYRL 2 DB_FRC863  DOS863  PDOX_ISL / DOS861 / DB_PTG860   DOS860   DB_TRK . DOS857 . PDOX_SLO - PDOX_HUN - PDOX_PLK - PDOX_CSY - DB_SLO - DB_PLK - DB_CSY - DOS852 - LT_LT (ISO8859_13 ( ISO8859_9 ' ISO8859_8 & ISO8859_7 % ISO8859_6 $ ISO8859_5 # ISO8859_4 " ISO8859_3  ISO_PLK  ISO_HUN 90&&&`&8%%%))d)<& - # % #t 'P #( ' % $ - !\ *8 $ - % .d I$ =`TEST_COLLATE ~3WIN_CZ +++DISABLE-COMPRESSIONS=0;DISABLE-EXPANSIONS=0GB18030_UNICODE E GB18030 ECP943C_UNICODE D CP943C DGBK_UNICODE CGBK CTIS620_UNICODE B TIS620 B WIN1258 A KOI8U_UA @ KOI8U @ KOI8R_RU ? KOI8R ? GB_2312 9 BIG_5 8KSC_DICTIONARY , KSC_5601 ,WIN1257_LV <WIN1257_LT <WIN1257_EE < WIN1257 < WIN1256 ; WIN1255 : NXT_ESP  NXT_ITA  NXT_FRA  NXT_DEU 90-&|*L/ */64P2 / 1 / 3T 1$ 0 3 # $ CUST_NO_GEN   EMP_NO_GEN  RDB$BACKUP_HISTORY  Nbackup technologyRDB$TRIGGER_NAME  Implicit trigger nameRDB$INDEX_NAME  Implicit index nameRDB$FIELD_NAME Implicit domain nameRDB$CONSTRAINT_NAME Implicit constraint nameRDB$EXCEPTIONS    Exception IDRDB$PROCEDURES    Procedure ID SQL$DEFAULT RDB$SECURITY_CLASS  90 2( P90 "Ed-Iz PI<B</RDB$SYSTEM_FLAGLRDB$TRIGGER_2 RDB$TRIGGERS  /RDB$SYSTEM_FLAGLRDB$TRIGGER_9 RDB$USER_PRIVILEGES  \ \ \ /RDB$OBJECT_TYPE;>>:0RDB$OWNER_NAMERDB$OWNER_NAME0RDB$OWNER_NAMEg,LRDB$TRIGGER_4 RDB$RELATIONS  ***=RDB$OWNER_NAMEg,RDB$OWNER_NAMELRDB$TRIGGER_3 RDB$TRIGGERS  90  MX i J, Jt i0 CbCpD4<DRDB$TRIGGER_22 RDB$TRIGGERS  CJRDB$CHECK_CONSTRAINTSJRDB$RELATION_CONSTRAINTSG:/RDB$TRIGGER_NAMERDB$TRIGGER_NAME:/RDB$CONSTRAINT_NAMERDB$CONSTRAINT_NAME/RDB$CONSTRAINT_TYPECHECK;::::::::.RDB$TRIGGER_NAMERDB$TRIGGER_NAME.RDB$RELATION_NAMERDB$RELATION_NAME.RDB$TRIGGER_SEQUENCERDB$TRIGGER_SEQUENCE.RDB$TRIGGER_TYPERDB$TRIGGER_TYPE.RDB$TRIGGER_BLRRDB$TRIGGER_BLR.RDB$TRIGGER_INACTIVERDB$TRIGGER_INACTIVE.RDB$SYSTEM_FLAGRDB$SYSTEM_FLAG. RDB$FLAGS RDB$FLAGS.RDB$DEBUG_INFORDB$DEBUG_INFOLRDB$TRIGGER_21 RDB$TRIGGERS  CJRDB$CHECK_CONSTRAINTSJRDB$RELATION_CONSTRAINTSG:/RDB$TRIGGER_NAMERDB$TRIGGER_NAME:/RDB$CONSTRAINT_NAMERDB$CONSTRAINT_NAME/RDB$CONSTRAINT_TYPECHECKLRDB$TRIGGER_20 RDB$INDICES  DDD>>:0RDB$OWNER_NAMERDB$OWNER_NAME0RDB$OWNER_NAMEg,LRDB$TRIGGER_28 RDB$PROCEDURES  mmm=RDB$OWNER_NAMEg,RDB$OWNER_NAME=RDB$PROCEDURE_IDeRDB$PROCEDURESRDB$PROCEDURE_IDLRDB$TRIGGER_27 RDB$RELATION_FIELDS  CJRDB$CHECK_CONSTRAINTSJRDB$RELATION_CONSTRAINTSG:/RDB$FIELD_NAMERDB$TRIGGER_NAME:/RDB$CONSTRAINT_NAMERDB$CONSTRAINT_NAME:/RDB$RELATION_NAMERDB$RELATION_NAME/RDB$CONSTRAINT_TYPENOT NULLLRDB$TRIGGER_24 RDB$RELATION_FIELDS  [[[x =$ R > xCpP CsDQD9tM(K9MPKGjPIGjLLL93PERCENT_CHANGE1PERCENT_CHANGE2check_constraintL)))CHECK (percent_change between -50 and 50) @CHECK_7 SALARY_HISTORY   LLL93PERCENT_CHANGE1PERCENT_CHANGE2check_constraintL)))CHECK (percent_change between -50 and 50) @CHECK_6 PROJ_DEPT_BUDGET   ///3 FISCAL_YEARcheck_constraintLCHECK (FISCAL_YEAR >= 1993) @CHECK_5 PROJ_DEPT_BUDGET   ///3 FISCAL_YEARcheck_constraintLCHECK (FISCAL_YEAR >= 1993)@SET_EMP_NO EMPLOYEE   333=EMP_NOe EMP_NO_GENEMP_NOLUUUAS BEGIN if (new.emp_no is null) then new.emp_no = gen_id(emp_no_gen, 1); END @CHECK_4 EMPLOYEE   93SALARY+CJJOBG::/JOB_CODEJOB_CODE/ JOB_GRADE JOB_GRADE/ JOB_COUNTRY JOB_COUNTRY MIN_SALARY-1SALARY+CJJOBG::/JOB_CODEJOB_CODE/ JOB_GRADE JOB_GRADE/ JOB_COUNTRY JOB_COUNTRY MAX_SALARY-check_constraintLCHECK ( salary >= (SELECT min_salary FROM job WHERE job.job_code = employee.job_code AND job.job_grade = employee.job_grade AND job.job_country = employee.job_country) AND salary <= (SELECT max_salary FROM job WHERE job.job_code = employee.job_code AND job.job_grade = employee.job_grade AND job.job_country = employee.job_country)) @CHECK_3 EMPLOYEE   93SALARY+CJJOBG::/JOB_CODEJOB_CODE/ JOB_GRADE JOB_GRADE/ JOB_COUNTRY JOB_COUNTRY MIN_SALARY-1SALARY+CJJOBG::/JOB_CODEJOB_CODE/ JOB_GRADE JOB_GRADE/ JOB_COUNTRY JOB_COUNTRY MAX_SALARY-check_constraintLCHECK ( salary >= (SELECT min_salary FROM job WHERE job.job_code = employee.job_code AND job.job_grade = employee.job_grade AND job.job_country = employee.job_country) AND salary <= (SELECT max_salary FROM job WHERE job.job_code = employee.job_code AND job.job_grade = employee.job_grade AND job.job_country = employee.job_country)) @CHECK_2 JOB   4442 MIN_SALARY MAX_SALARYcheck_constraintLCHECK (min_salary < max_salary) @CHECK_1 JOB   4442 MIN_SALARY MAX_SALARYcheck_constraintLCHECK (min_salary < max_salary)RDB$TRIGGER_36 RDB$FIELDS  ;:/RDB$FIELD_LENGTHRDB$FIELD_LENGTH:/RDB$FIELD_TYPERDB$FIELD_TYPE:/RDB$COLLATION_IDRDB$COLLATION_ID/RDB$CHARACTER_SET_IDRDB$CHARACTER_SET_IDSYSDBAQB SQL$DEFAULT28  5SYSDBASQL$38  2SYSDBA,Y SQL$DEFAULT27  (SYSDBAYSQL$37   LSYSDBAY SQL$DEFAULT26   SYSDBASQL$36  AULSYSDBA SY SQL$DEFAULT25  @SYSDBADBASQL$35  <SYSDBA: SQL$DEFAULT24  6SYSDBASQL$34  4SYSDBA2 SQL$DEFAULT23  .SYSDBA SQL$33  *SYSDBADBA( w SQL$DEFAULT22  $SYSDBA wSQL$32   SYSDBADBAw  SQL$DEFAULT21  SYSDBASQL$31  SYSDBASY P SQL$DEFAULT20  SYSDBA- SQL$DEFAULT16  9-SQL$10  8- SQL$DEFAULT15  --SQL$16  ,- SQL$DEFAULT14  +P  SQ- SQL$DEFAULT13  /-SQL$15  .- SQL$DEFAULT12  ;-SQL$9  :- SQL$DEFAULT11  1-SQL$14  0- SQL$DEFAULT10  3-SQL$13  2- SQL$DEFAULT9  5-SQL$12  4- SQL$DEFAULT8  7-SQL$11  6- SQL$DEFAULT7  -SQL$7  - SQL$DEFAULT6  -SQL$6  - SQL$DEFAULT5  -SQL$5  PSQL$30  - SQL$DEFAULT4  SYSDBA-SQL$4  -SQL$17  * SQL$DEFAULT3   SYSDBASQL$3  SYSDBA SQL$DEFAULT2  SYSDBASQL$2  SYSDBA SQL$DEFAULT1  SYSDBASQL$1  SYSDBA90/;;L;;;;\; ; ; ;l ;0 ; = =p =0 = = =t 98 9 9 9 9L 5 5 5 5l 50 <<<|<@<:::P::<<`<$<<9p9499 SYSDBA SYSDBA D PROJECT  SYSDBA SYSDBA U PROJECT  SYSDBA SYSDBA I PROJECT  SYSDBA SYSDBA S PROJECT  SYSDBA SYSDBA R PHONE_LIST  SYSDBA SYSDBA D PHONE_LIST  SYSDBA SYSDBA U PHONE_LIST  SYSDBA SYSDBA I PHONE_LIST  SYSDBA SYSDBA S PHONE_LIST  SYSDBA SYSDBA R EMPLOYEE  SYSDBA SYSDBA D EMPLOYEE  SYSDBA SYSDBA U EMPLOYEE  SYSDBA SYSDBA I EMPLOYEE  SYSDBA SYSDBA S EMPLOYEE  SYSDBA SYSDBA R DEPARTMENT  SYSDBA SYSDBA D DEPARTMENT  SYSDBA SYSDBA U DEPARTMENT  SYSDBA SYSDBA I DEPARTMENT  SYSDBA SYSDBA S DEPARTMENT  SYSDBA SYSDBA R JOB  SYSDBA SYSDBA D JOB  SYSDBA SYSDBA U JOB  SYSDBA SYSDBA I JOB  SYSDBA SYSDBA S JOB  SYSDBA SYSDBA R COUNTRY  SYSDBA SYSDBA D COUNTRY  SYSDBA SYSDBA U COUNTRY  SYSDBA SYSDBA I COUNTRY  SYSDBA SYSDBA S COUNTRY  PUBLIC SYSDBA S RDB$FORMATS  SYSDBA SYSDBA R RDB$FORMATS  SYSDBA SYSDBA D RDB$FORMATS  SYSDBA SYSDBA U RDB$FORMATS  SYSDBA SYSDBA I RDB$FORMATS  SYSDBA SYSDBA S RDB$FORMATS  PUBLIC SYSDBA S RDB$PAGES  SYSDBA SYSDBA R RDB$PAGES  SYSDBA SYSDBA D RDB$PAGES  SYSDBA SYSDBA U RDB$PAGES  SYSDBA SYSDBA I RDB$PAGES  SYSDBA SYSDBA S RDB$PAGES  PUBLIC SYSDBA S RDB$ROLES  SYSDBA SYSDBA R RDB$ROLES  SYSDBA SYSDBA D RDB$ROLES  SYSDBA SYSDBA U RDB$ROLES  SYSDBA SYSDBA I RDB$ROLES  SYSDBA SYSDBA S RDB$ROLES 90 90;*&*X&X7****T*(*& & & *\ &0 + &7 & *d &8 * * + + +\ +4 & * + * *X *, * & & * *X *, * ***|*T&(****x*L* ,'//d18,0 pRDB$17  pRDB$31  pRDB$664   pRDB$491 P pRDB$485 P pRDB$484 (%  pRDB$483 (  pRDB$482  pRDB$481 P pRDB$64 % pRDB$63 % pRDB$62 % pRDB$61 % pRDB$60 % pRDB$59 % pRDB$58  pRDB$57 % pRDB$56  pRDB$55 (( pRDB$54 (( pRDB$53 (( pRDB$52 (( pRDB$51 (( pRDB$50 (( pRDB$49  pRDB$48  pRDB$47  pRDB$46  pRDB$45  pRDB$44  pRDB$43   pRDB$42  pRDB$41  pRDB$40   pRDB$39   pRDB$38   pRDB$37   pRDB$36  pRDB$35  pRDB$34  pRDB$33  pRDB$32  pRDB$31  pRDB$30   pRDB$29   pRDB$28  pRDB$27  pRDB$26 # pRDB$25 # pRDB$24 # pRDB$23 % pRDB$22  pRDB$21  %  pRDB$20 % pRDB$19 % pRDB$18 % pRDB$17  pRDB$16  pRDB$15 % pRDB$14 # pRDB$13 90?0/P' //++h/8// / ' '` '4 + + ' ' '` -4 , , ' ' ,` ,8 ' + / / +T +$ 0 0 + +p +D + 6:N(U?Cd=8,Wxg0H9/,\;(3502`,$;*h@PP?22299/000:104999=LJJJCHECK (VALUE = '000' OR (VALUE > '0' AND VALUE <= '999') OR VALUE IS NULL)   /gLCHECK (VALUE = UPPER (VALUE))1LCHECK (VALUE > 1000)199999LCHECK (VALUE > '99999')8LCHECK (VALUE BETWEEN 0 AND 6)1LCHECK (VALUE > 0):1'4L***CHECK (VALUE > 10000 AND VALUE <= 2000000)III999/software/hardware/other/N/AL999CHECK (VALUE IN ('software', 'hardware', 'other', 'N/A'))7VLCHECK (VALUE STARTING WITH 'V')%%%'' LAST_NAME,  FIRST_NAMEL!!!(last_name || ', ' || first_name)777" OLD_SALARY%$ OLD_SALARYPERCENT_CHANGEdL000(old_salary + old_salary * percent_change / 100)# SHIP_DATE ORDER_DATEL(ship_date - order_date) pRDB$661  pRDB$660   pRDB$659  pRDB$658  pRDB$657   pRDB$656   pRDB$655   pRDB$654 # pRDB$653  pRDB$652 % pRDB$651  pRDB$650  pRDB$135  pRDB$134  pRDB$133  pRDB$132   pRDB$131  pRDB$130  pRDB$129 P pRDB$128 # pRDB$127   pRDB$126   pRDB$125  %  pRDB$124  pRDB$123  pRDB$122  pRDB$121  pRDB$547 x% pRDB$546  pRDB$545 %3 pRDB$544 3 pRDB$543 % pRDB$542  pRDB$541 % pRDB$540  pRDB$539  pRDB$682 pRDB$6  pRDB$665  90#$%h%D$%$(!(\%4% % % % %l %D % %RDB$661 RDB$660 RDB$659 RDB$658 RDB$657 RDB$656 RDB$655 RDB$654 RDB$653 RDB$652 RDB$652 RDB$651 RDB$651 RDB$651 RDB$6 RDB$665 RDB$664 RDB$13 RDB$4 90  ,::L:::X ,:$ 1,: : 1 : , %X 1 1 ,0 % 1 0 1 ,d % 1( d 18 , % 1\ 1l , %( 1 1, %\14%1,}  SQL$DEFAULT40  SYSDBA} SQL$50  SYSDBA} 'P  SQL$DEFAULT39  SYSDBAP SQL$49  SYSDBAP "  SQL$DEFAULT38  SYSDBA SQL$48  SYSDBA   SQL$DEFAULT37  SYSDBA SQL$47  SYSDBA   SQL$DEFAULT36  SYSDBA SQL$46  SYSDBA ] SQL$DEFAULT35  SYSDBA]SQL$45  SYSDBA] SQL$DEFAULT34  SYSDBASQL$44  SYSDBA SQL$DEFAULT33  SYSDBA   SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  p90hg}| DMON$RDB$A COMP4#MON$SQL_DIALECTMON$DATABASE< TEXTMON$STATEMENTS 5TATEMON$ATTACHMENTS< STATEMENTS<TRANSACTIONS< MENT_IDMON$CALL_STACK< STATEMENTS C _GROUPMON$IO_STATSCMEMORY_USAGECRECORD_STATS< IDMON$ATTACHMENTSC CALL_STACK5 DATABASE C IO_STATSCMEMORY_USAGECRECORD_STATS< STATEMENTS <TRANSACTIONS5!WEEP_INTERVALMON$DATABASE;!TIMESTAMPMON$ATTACHMENTS< CALL_STACK< STATEMENTS<TRANSACTIONS<&OP_TRANSACTIONMON$TRANSACTIONSC-RANSACTION_IDMON$CONTEXT_VARIABLES< STATEMENTS<TRANSACTIONS 5USERMON$ATTACHMENTSC.VARIABLE_NAMEMON$CONTEXT_VARIABLESC#VALUEMON$CONTEXT_VARIABLESR NEW_SALARYSALARY_HISTORYR OLD_SALARYSALARY_HISTORYKN_HOLDCUSTOMERSRDER_DATESALESSSTATUSSALESS PAIDSALESR$ERCENT_CHANGESALARY_HISTORYKHONE_EXTEMPLOYEE K PHONE_LISTK NOCUSTOMERJ DEPARTMENT K PHONE_LISTKOSTAL_CODECUSTOMERS_NUMBERSALES RRODUCTPROJECTR$JECTED_BUDGETPROJ_DEPT_BUDGET R_DESCPROJECTRIDEMPLOYEE_PROJECTR PROJECTR_DEPT_BUDGET RNAMEPROJECT SQTY_ORDEREDSALESR&UART_HEAD_CNTPROJ_DEPT_BUDGET"RDB$ACLRDB$SECURITY_CLASSES 3RGUMENT_POSITIONRDB$FUNCTION_ARGUMENTS4%BACKUP_IDRDB$BACKUP_HISTORY4LEVELRDB$BACKUP_HISTORY-(SE_COLLATION_NAMERDB$COLLATIONS FIELDRDB$RELATION_FIELDS-.YTES_PER_CHARACTERRDB$CHARACTER_SETS CHARACTER_LENGTHRDB$FIELDS UNCTION_ARGUMENTS -SET_IDRDB$CHARACTER_SETS- OLLATIONSFIELDS UNCTION_ARGUMENTS-NAMERDB$CHARACTER_SETS$ DATABASE-)OLLATION_ATTRIBUTESRDB$COLLATIONS-IDRDB$COLLATIONSFIELDS-PROCEDURE_PARAMETERSRELATION_FIELDS-NAMERDB$COLLATIONS$MPLEX_NAMERDB$RELATION_FIELDS UTED_BLRRDB$FIELDS SOURCERDB$FIELDS%,NSTRAINT_NAMERDB$CHECK_CONSTRAINTS%REF_CONSTRAINTS %!LATION_CONSTRAINTS %$TYPERDB$RELATION_CONSTRAINTS% %_NAME_UQRDB$REF_CONSTRAINTS "TEXT_NAMERDB$VIEW_RELATIONSDBKEY_LENGTHRDB$RELATIONS &EBUG_INFORDB$PROCEDURES TRIGGERS"FAULT_CLASSRDB$RELATIONS -$OLLATE_NAMERDB$CHARACTER_SETSSOURCERDB$FIELDS-PROCEDURE_PARAMETERSRELATION_FIELDSVALUERDB$FIELDS-PROCEDURE_PARAMETERS RELATION_FIELDSN% )ERRABLERDB$RELATION_CONSTRAINTS90 .<.d0 W>?HAE ? >T )( + T EL > E ;<@ J C Ap G P N| Q8 DL(TF\H=ACPD,!*OlB(D:F`B(879|7 EMP_NO LOCATION PHONE_LIST RDB$6 LOCATION  EMP_NO PHONE_LIST EMPNO EMP_NO  LAST_NAME PHONE_LIST LASTNAME LAST_NAME PH PHONE_EXT PHONE_LIST RDB$7 PHONE_EXT   PHONE_NO PHONE_LIST PHONENUMBER PHONE_NO  C_UTF8 T4 RDB$546 U V_OCTETS T4 RDB$541 RES V_NONE T4 RDB$543  V_WIN1250 T4 RDB$545 - FULL_NAME EMPLOYEE RDB$9  AC FULL_NAME EMPLOYEE RDB$9   FIRST_NAME PHONE_LIST FIRSTNAME FIRST_NAME  C_UTF8 T4 RDB$546 U V_OCTETS T4 RDB$541 RES V_NONE T4 RDB$543  V_WIN1250 T4 RDB$545  CUSTOMER CUSTOMER RDB$18   CONTACT_FIRST CUSTOMER FIRSTNAME  CITY CUSTOMER RDB$19  STATE_PROVINCE CUSTOMER RDB$20  COUNTRY CUSTOMER COUNTRYNAME  EM ON_HOLD CUSTOMER RDB$22  x y   DEFAULT NULL-LCONTACT_LAST CUSTOMER LASTNAME  PHONE_NO CUSTOMER PHONENUMBER  POSTAL_CODE CUSTOMER RDB$21  ARY CUST_NO CUSTOMER CUSTNO T_NADDRESS_LINE1 CUSTOMER ADDRESSLINE ADDRESS_LINE2 CUSTOMER ADDRESSLINE DE LOCATION PHONE_LIST RDB$6 LOCATION  EMP_NO PHONE_LIST EMPNO EMP_NO  LAST_NAME PHONE_LIST LASTNAME LAST_NAME PH PHONE_EXT PHONE_LIST RDB$7 PHONE_EXT   PHONE_NO PHONE_LIST PHONENUMBER PHONE_NO FIRST_NAME EMPLOYEE FIRSTNAME  M DEPT_NO EMPLOYEE DEPTNO  T  JOB_CODE EMPLOYEE JOBCODE HJOB_COUNTRY EMPLOYEE COUNTRYNAME AR FULL_NAME EMPLOYEE RDB$9   EMP_NO EMPLOYEE EMPNO  LAST_NAME EMPLOYEE LASTNAME  PHONE_EXT EMPLOYEE RDB$7  JOB_GRADE EMPLOYEE JOBGRADE  HIRE_DATE EMPLOYEE RDB$8 ` a   DEFAULT 'NOW'   NOWL SALARY EMPLOYEE SALARY   DEPT_NO DEPARTMENT DEPTNO DEPARTMENT DEPARTMENT RDB$5  HEAD_DEPT DEPARTMENT DEPTNO  LOCATION DEPARTMENT RDB$6  MNGR_NO DEPARTMENT EMPNO  PHONE_NO DEPARTMENT PHONENUMBER W X DEFAULT '555-1234'555-1234L BUDGET DEPARTMENT BUDGET 90;$LQn,\ Wx [ d eH c Z W W W0 \l  NV&<-C1 \C1 P \T SQL$49 SYSDBA SP \T SQL$49 SYSDBA  P ^T SYSDBA P ^T SYSDBA P $30} T SQL$50 SYSDBA SQL$DEFAULT40 30} TT SQL$50 SYSDBA \C1 } \T SQL$50 SYSDBA S} \T SQL$50 SYSDBA  } ^T SYSDBA } ^T SYSDBA } P T SQL$49 SYSDBA SQL$DEFAULT39 P TT SQL$49 SYSDBA Y:SC12 ) ( C10 ) (C8 ) (C7 ) (C5 ) (C15 ) (C14 ) (C13 ) (C11 ) (  C6 ) ( C2 Y X 0a߳  C1 C9 ) ( C4 ) (C3 A @   PHONE_NO PHONE_NO PHONE_EXT PHONE_EXT LAST_NAME LAST_NAMEEMP_NOEMP_NO LOCATION LOCATION FIRST_NAME FIRST_NAME\C1 P $30\C1  YC4C2C5C1C34 gC13C11C10C9C8C3C16C15C14 C12 C7 C6 C5 C2C1C4O YSD2F CURRENCY ;=LCOUNTRY ;=L TR_MULTI-AR SQL$19 SYSDBA SQL$DEFAULT17 -T2 SQL$18 SYSDBA SQL$DEFAULT18  T SQL$48 SYSDBA SQL$DEFAULT38 30-T3 SQL$16 SYSDBA SQL$DEFAULT15 -  SALES SQL$15 SYSDBA SQL$DEFAULT13 -SALARY_HISTORY SQL$14 SYSDBA SQL$DEFAULT11  -PROJ_DEPT_BUDGET SQL$13 SYSDBA SQL$DEFAULT10 -EMPLOYEE_PROJECT SQL$12 SYSDBA SQL$DEFAULT9 - PROJECT SQL$11 SYSDBA SQL$DEFAULT8 - T4 SQL$10 SYSDBA SQL$DEFAULT16  - CUSTOMER SQL$9 SYSDBA SQL$DEFAULT12 -PHONE_LIST SQL$8 SYSDBA SQL$DEFAULT19  333CJEMPLOYEEJ DEPARTMENTG/DEPT_NODEPT_NOL SELECT emp_no, first_name, last_name, phone_ext, location, phone_no FROM employee, department WHERE employee.dept_no = department.dept_no90<8 PHONE_LIST EMPLOYEE EMPLOYEE  PHONE_LIST DEPARTMENT DEPARTMENT 90 5/7\:$79<l>,? B <h A I L L8 I I I@8 ' ' `d J8 ) + ]` J A<1>l<@)+S>X'0'QBp'H'T>t>8;')I)+`U,1p$ EMP_NO SALARY_HISTORY EMPNO  SALES_REP SALES EMPNO   ITEM_TYPE SALES PRODTYPE   LA CUST_NO SALES CUSTNO -4 NEW_SALARY SALARY_HISTORY RDB$17 -3 AGED SALES RDB$31  WOUAGED SALES RDB$31  NEW_SALARY SALARY_HISTORY RDB$17 RC4 T3 RDB$485 ORDER_STATUS SALES RDB$23  t u ALEPAID SALES RDB$27  q r  C4 T3 RDB$485 ORDER_STATUS SALES RDB$23 t u   DEFAULT 'new'   newL   DEFAULT 'n'   nL SALES_REP SALES EMPNO   ITEM_TYPE SALES PRODTYPE   LA CUST_NO SALES CUSTNO QTY_ORDERED SALES RDB$28 k l   DEFAULT 1   LTOTAL_VALUE SALES RDB$29  W DISCOUNT SALES RDB$30  g h   DEFAULT 0   L PO_NUMBER SALES PONUMBER ORDER_DATE SALES RDB$24 c d   DEFAULT 'NOW'   NOWL SHIP_DATE SALES RDB$25 DATE_NEEDED SALES RDB$26 UDAGED SALES RDB$31  JEC EMP_NO SALARY_HISTORY EMPNO UPDATER_ID SALARY_HISTORY RDB$15 CHANGE_DATE SALARY_HISTORY RDB$14 [ \ CT   DEFAULT 'NOW'   NOWLOLD_SALARY SALARY_HISTORY SALARY PERCENT_CHANGE SALARY_HISTORY RDB$16 W X   DEFAULT 0   LNEW_SALARY SALARY_HISTORY RDB$17  PROJ_ID PROJ_DEPT_BUDGET PROJNO T4 DEPT_NO PROJ_DEPT_BUDGET DEPTNO FISCAL_YEAR PROJ_DEPT_BUDGET RDB$12 QUART_HEAD_CNT PROJ_DEPT_BUDGET RDB$13 PROJECTED_BUDGET PROJ_DEPT_BUDGET BUDGET  PROJ_ID EMPLOYEE_PROJECT PROJNO  EMP_NO EMPLOYEE_PROJECT EMPNO  PROJ_ID PROJECT PROJNO  PROJ_NAME PROJECT RDB$10 TEAM_LEADER PROJECT EMPNO  PRODUCT PROJECT PRODTYPE  PROJ_DESC PROJECT RDB$11  C_OCTETS T4 RDB$540  C_NONE T4 RDB$542  C_WIN1250 T4 RDB$544  V_UTF8 T4 RDB$547 C1 T4 RDB$539 90* &33h/43244d303 3 4 4` 4, 4 3 3 3\ 3, / 3 2 4\ 3( 3 3 3 4X 4$ 4 3 3 /X 3$ 33 ,C1 T RDB$684 C1 T RDB$684 } C1 T RDB$703 } C1 T RDB$703 T} P C1 T RDB$702 P C1 T RDB$702 P DB$ C1 T RDB$701  C1 T RDB$701 ܿ DB$ C1 T RDB$700  C1 T RDB$700 C6 55 C1 T RDB$699  C1 T RDB$699 C1 664]C1 T RDB$698 ]C1 T RDB$698 C1]6C1 T RDB$697 C1 T RDB$697 C756C1 T RDB$696 C1 T RDB$696 C1659\C1 T RDB$695 \C1 T RDB$695 C4\24C1 T RDB$694 C1 T RDB$694 TC1 T RDB$693 C1 T RDB$693 TQC1 T RDB$692 QC1 T RDB$692 Q C1 T RDB$691 C1 T RDB$691  YC1 T RDB$690 YC1 T RDB$690 TYC1 T RDB$689 C1 T RDB$689 TC1 T RDB$688 C1 T RDB$688  C1 T RDB$687 C1 T RDB$687 TC1 T RDB$686 C1 T RDB$686 B$wC1 T RDB$685 wC1 T RDB$685 3wC1 T RDB$684 C3 AR RDB$652 C4 AR RDB$653  C9 AR RDB$658  C1 AR RDB$650  C2 AR RDB$651  C6 AR RDB$655  C11 AR RDB$660  C13 AR RDB$664  C14 AR RDB$665  C15 AR RDB$6 C5 AR RDB$654 C7 AR RDB$656 C8 AR RDB$657 C10 AR RDB$659  C12 AR RDB$661  C4 T2 RDB$124 C1 T2 RDB$121 C2 T2 RDB$122  C5 T2 RDB$125  C6 T2 RDB$126  C7 T2 RDB$127  C12 T2 RDB$132   C14 T2 RDB$134  C15 T2 RDB$135 C16 T2 RDB$481 C3 T2 RDB$123 C8 T2 RDB$128 C9 T2 RDB$129 C10 T2 RDB$130  C11 T2 RDB$131  C13 T2 RDB$133  C3 T3 RDB$484 C1 T3 RDB$482 C5 T3 RDB$491 C2 T3 RDB$483 90DXI @ K g d OdN-GET_EMP_PROJ SQL$20 SYSDBA DECLARE VARIABLE sumb DECIMAL(12, 2); DECLARE VARIABLE rdno CHAR(3); DECLARE VARIABLE cnt INTEGER; BEGIN tot = 0; SELECT budget FROM department WHERE dept_no = :dno INTO :tot; SELECT count(budget) FROM department WHERE head_dept = :dno INTO :cnt; IF (cnt = 0) THEN SUSPEND; FOR SELECT dept_no FROM department WHERE head_dept = :dno INTO :rdno DO BEGIN EXECUTE PROCEDURE dept_budget :rdno RETURNING_VALUES :sumb; tot = tot + sumb; END SUSPEND; END ----CJ DEPARTMENTG/DEPT_NO)BUDGETCOCJ DEPARTMENTG/ HEAD_DEPT)NM]BUDGET/)CJ DEPARTMENTG/ HEAD_DEPT)DEPT_NOx DEPT_BUDGET"))L-DELETE_EMPLOYEE   SQL$23 SYSDBA CIDECLARE VARIABLE any_sales INTEGER; BEGIN any_sales = 0; /* * If there are any sales records referencing this employee, * can't delete the employee until the sales are re-assigned * to another employee or changed to NULL. */ SELECT count(po_number) FROM sales WHERE sales_rep = :emp_num INTO :any_sales; IF (any_sales > 0) THEN BEGIN EXCEPTION reassign_sales; SUSPEND; END /* * If the employee is a manager, update the department. */ UPDATE department SET mngr_no = NULL WHERE mngr_no = :emp_num; /* * If the employee is a project leader, update project. */ UPDATE project SET team_leader = NULL WHERE team_leader = :emp_num; /* * Delete the employee from any projects. */ DELETE FROM employee_project WHERE emp_no = :emp_num; /* * Delete old salary records. */ DELETE FROM salary_history WHERE emp_no = :emp_num; /* * Delete the employee. */ DELETE FROM employee WHERE emp_no = :emp_num; SUSPEND; END -COCJSALESG/ SALES_REP)NM] PO_NUMBER1REASSIGN_SALESCJ DEPARTMENTG/MNGR_NO) -MNGR_NOCJPROJECTG/ TEAM_LEADER) - TEAM_LEADERCJEMPLOYEE_PROJECTG/EMP_NO)CJSALARY_HISTORYG/EMP_NO)CJEMPLOYEEG/EMP_NO)L-SUB_TOT_BUDGET SQL$22 SYSDBA IBEGIN SELECT SUM(budget), AVG(budget), MIN(budget), MAX(budget) FROM department WHERE head_dept = :head_dept INTO :tot_budget, :avg_budget, :min_budget, :max_budget; SUSPEND; ENDIII  ----COCJ DEPARTMENTG/ HEAD_DEPT)NMTBUDGETUBUDGETWBUDGETVBUDGET))))))))L-ADD_EMP_PROJ SQL$21 SYSDBA BEGIN BEGIN INSERT INTO employee_project (emp_no, proj_id) VALUES (:emp_no, :proj_id); WHEN SQLCODE -530 DO EXCEPTION unknown_emp_id; END SUSPEND; END JEMPLOYEE_PROJECT)EMP_NO)PROJ_IDUNKNOWN_EMP_IDLmmmBEGIN FOR SELECT proj_id FROM employee_project WHERE emp_no = :emp_no INTO :proj_id DO SUSPEND; END -CJEMPLOYEE_PROJECTG/EMP_NO)PROJ_ID))L90!69T69;>\>> > :l 28 4 8 9 8X 4 6 5 5x 5@ 5 5 5 5d 40 2 5 3 9T 3 463LANG ALL_LANGS RDB$64  COUNTRY ALL_LANGS RDB$63  GRADE ALL_LANGS RDB$62 CODE ALL_LANGS RDB$61  LANGUAGES SHOW_LANGS RDB$60 CTY SHOW_LANGS RDB$59  GRADE SHOW_LANGS RDB$58 CODE SHOW_LANGS RDB$57  PO_NUM SHIP_ORDER RDB$56  LINE6 MAIL_LABEL RDB$55  LINE5 MAIL_LABEL RDB$54  LINE4 MAIL_LABEL RDB$53  LINE3 MAIL_LABEL RDB$52  LINE2 MAIL_LABEL RDB$51  LINE1 MAIL_LABEL RDB$50  CUST_NO MAIL_LABEL RDB$49  EMP_CNT ORG_CHART RDB$48  TITLE ORG_CHART RDB$47  MNGR_NAME ORG_CHART RDB$46 DEPARTMENT ORG_CHART RDB$45  HEAD_DEPT ORG_CHART RDB$44 TOT DEPT_BUDGET RDB$43 DNO DEPT_BUDGET RDB$42  EMP_NUM DELETE_EMPLOYEE RDB$41 MAX_BUDGET SUB_TOT_BUDGET RDB$40 MIN_BUDGET SUB_TOT_BUDGET RDB$39 AVG_BUDGET SUB_TOT_BUDGET RDB$38 TOT_BUDGET SUB_TOT_BUDGET RDB$37  HEAD_DEPT SUB_TOT_BUDGET RDB$36  PROJ_ID ADD_EMP_PROJ RDB$35  EMP_NO ADD_EMP_PROJ RDB$34  PROJ_ID GET_EMP_PROJ RDB$33  EMP_NO GET_EMP_PROJ RDB$32 90LLT ] gJ=K-DEPT_BUDGET   SQL$24 SYSDBA - ORG_CHART SQL$25 SYSDBA -MAIL_LABEL SQL$26 SYSDBA MAIL_LABEL SQL$26 SYSDBA DECLARE VARIABLE customer VARCHAR(25); DECLARE VARIABLE first_name VARCHAR(15); DECLARE VARIABLE last_name VARCHAR(20); DECLARE VARIABLE addr1 VARCHAR(30); DECLARE VARIABLE addr2 VARCHAR(30); DECLARE VARIABLE city VARCHAR(25); DECLARE VARIABLE state VARCHAR(15); DECLARE VARIABLE country VARCHAR(15); DECLARE VARIABLE postcode VARCHAR(12); DECLARE VARIABLE cnt INTEGER; BEGIN line1 = ''; line2 = ''; line3 = ''; line4 = ''; line5 = ''; line6 = ''; SELECT customer, contact_first, contact_last, address_line1, address_line2, city, state_province, country, postal_code FROM CUSTOMER WHERE cust_no = :cust_no INTO :customer, :first_name, :last_name, :addr1, :addr2, :city, :state, :country, :postcode; IF (customer IS NOT NULL) THEN line1 = customer; IF (first_name IS NOT NULL) THEN line2 = first_name || ' ' || last_name; ELSE line2 = last_name; IF (addr1 IS NOT NULL) THEN line3 = addr1; IF (addr2 IS NOT NULL) THEN line4 = addr2; IF (country = 'USA') THEN BEGIN IF (city IS NOT NULL) THEN line5 = city || ', ' || state || ' ' || postcode; ELSE line5 = state || ' ' || postcode; END ELSE BEGIN IF (city IS NOT NULL) THEN line5 = city || ', ' || state; ELSE line5 = state; line6 = country || ' ' || postcode; END SUSPEND; END{{{ (((((( (-(-(-(-(-(-&-&-&- &-  &-  &-  &-  &- & --CJCUSTOMERG/CUST_NO)CUSTOMER CONTACT_FIRST CONTACT_LAST ADDRESS_LINE1  ADDRESS_LINE2 CITY STATE_PROVINCE COUNTRY  POSTAL_CODE;=;='' ;=  ;=  / USA;= '''' ,   ''  ;= '' ,   ''  ))))) )  ))))) )  L ORG_CHART SQL$25 SYSDBA GDECLARE VARIABLE mngr_no INTEGER; DECLARE VARIABLE dno CHAR(3); BEGIN FOR SELECT h.department, d.department, d.mngr_no, d.dept_no FROM department d LEFT OUTER JOIN department h ON d.head_dept = h.dept_no ORDER BY d.dept_no INTO :head_dept, :department, :mngr_no, :dno DO BEGIN IF (:mngr_no IS NULL) THEN BEGIN mngr_name = '--TBH--'; title = ''; END ELSE SELECT full_name, job_code FROM employee WHERE emp_no = :mngr_no INTO :mngr_name, :title; SELECT COUNT(emp_no) FROGM employee WHERE dept_no = :dno INTO :emp_cnt; SUSPEND; END END??? -------Cw DEPARTMENTD DEPARTMENTHPG/ HEAD_DEPTDEPT_NOFHDEPT_NO DEPARTMENT DEPARTMENTMNGR_NODEPT_NO=--TBH--CJEMPLOYEEG/EMP_NO FULL_NAMEJOB_CODECOCJEMPLOYEEG/DEPT_NONM]EMP_NO)))))  )))))  LDEPT_BUDGET   SQL$24 SYSDBA 90 T yI|ZKJ- SHOW_LANGS   S-SHIP_ORDER  SQL$27 SYSDBA - ALL_LANGS   SQL$29 SYSDBA BEGIN FOR SELECT job_code, job_grade, job_country FROM job INTO :code, :grade, :country DO BEGIN FOR SELECT languages FROM show_langs (:code, :grade, :country) INTO :lang DO SUSPEND; /* Put nice separators between rows */ code = '====='; grade = '====='; country = '==============='; lang = '=============='; SUSPEND; END END &&&&&-&-&-&-CJJOBJOB_CODE JOB_GRADE JOB_COUNTRYC| SHOW_LANGS LANGUAGES))))=======================================))))))))L-SHOW_LANGS   SQL$28 SYSDBA DECLARE VARIABLE i INTEGER; BEGIN i = 1; WHILE (i <= 5) DO BEGIN SELECT language_req[:i] FROM joB WHERE ((job_code = :code) AND (job_grade = :grade) AND (job_country = :cty) AND (language_req IS NOT NULL)) INTO :languages; IF (languages = ' ') THEN /* Prints 'NULL' instead of blanks */ languages = 'NULL'; i = i +1; SUSPEND; END END<<<&&& &-- 4CJJOBG:::/JOB_CODE)/ JOB_GRADE)/ JOB_COUNTRY);= LANGUAGE_REQk LANGUAGE_REQ/ NULL"))LWDECLARE VARIABLE ord_stat CHAR(7); DECLARE VARIABLE hold_stat CHAR(1); DECLARE VARIABLE cust_no INTEGER; DECLARE VARIABLE any_po CHAR(8); BEGIN SELECT s.order_status, c.on_hold, c.cust_no FROM sales s, customer c WHERE po_number = :po_num AND s.cust_no = c.cust_no INTO :ord_stat, :hold_stat, :cust_no; /* This purchase order has been already shipped. */ IF (ord_stat = 'shipped') THEN BEGIN EXCEPTION order_already_shipped; SUSPEND; END /* Customer is on hold. */ ELSE IF (hold_stat = '*') THEN BEGIN EXCEPTION customer_on_hold; SUSPEND; END /* * If there is an unpaid balance on orders shipped over 2 months ago, * put the customer on hold. */ FOR SELECT po_number FROM sales WHERE cust_no = :cust_no AND order_status = 'shipped' AND paid = 'n' AND ship_date < CAST('NOW' AS TIMESTAMP) - 60 INTO :any_po DO BEGIN EXCEPTION customer_check; UPDATE customer SET on_hold = '*' WHERE cust_no = :cust_no; SUSPEND; END /* * Ship the order. */ UPDATE sales SETW order_status = 'shipped', ship_date = 'NOW' WHERE po_number = :po_num; SUSPEND; END ----CSALESSCUSTOMERCG:/ PO_NUMBER)/CUST_NOCUST_NO ORDER_STATUSON_HOLDCUST_NO/shippedORDER_ALREADY_SHIPPED/*CUSTOMER_ON_HOLDCJSALESG:::/CUST_NO/ ORDER_STATUSshipped/PAIDn3 SHIP_DATE##NOW< PO_NUMBERCUSTOMER_CHECKCJCUSTOMERG/CUST_NO *ON_HOLDCJSALESG/ PO_NUMBER) shipped ORDER_STATUSNOW SHIP_DATEL90`,s[xUZCUSTOMER_CHECK " Overdue balance -- can not ship.CUSTOMER_ON_HOLD This customer is on hold.ORDER_ALREADY_SHIPPED Order status is "shipped."REASSIGN_SALES ;9Reassign the sales records before deleting this employee.UNKNOWN_EMP_ID (&Invalid employee number or project id.9090%I=%I=9090 !=*=ى=%I>%I>%I>ى=%I>*=%I=1 C=!=9090 1 C=1 C=%I= > 9c=9c=>%I=1 C=1 C=9090 1 <1 < 6W= &=ى=9c=&= 6W=< 1 <1 <9090 ===.=.=.= = ==90tX< x\@      ! ! ! ! ! ! ! !! !  !90,909090 *>*>*>*>*>>*>*>*>9090%I=.:=L>L>.:=.:=%I=9090*=9=L>L>9=>9=*=9090 /<>>><><>>></</<9090 ><.:=*>.:==> >= >.:= > *>.:=><90-9090  90 909090D9090,(6,~ rx  X 8  Z  6d  Z  f`  ( Z (4f`f@d@* &   &      &      &      &      &      &   $ ( , 0 48FH J"HHH   6  6'8JQTHHH 68J (08@HPX `hpx  (08 @ D HLP T `df<<<(8 @*D ( 0 4 8 <@NP RHHH   (><<<  <<< 6 lll 3 $ Dd xz|3  $ DHVl 6'8`ry|TTT&(9<W``` (0L^ 908( | z $̊؎ύ ěščřž ><ěščřžýáíéúůďťňóĚŠČŘŽÝÁÍÉÚŮĎŤŇÓy x 90C(( T T4  L t TT  H  Tx , L  T D T$  T \ T< TtT TTxT$TLLPH](Xn]0X 0a߳  ע&(0A(a bb ccc dddd eeeee !"#$0 @ aabbbb0ccccccddddddddDEPT_BUDGETeeeeeeeeee fffffff78901234fffffff78901234(0A(a bb ccc dddd eeeee(0,(0X [ (00(  (00( H@H@(08(  (08((08((08(cTv(08( Q @Q @(08(V]xEc]xEc(08(f T (08(fCB(08( (08( Q @Q @ (00( H@H@  (08(cTv  (0,((08((00(  (08(  0X [ 0 @ aaҳbbbbccccccddddddddeeeeeeeeeefffffff78901234fffffff7890123490!O\SSSdOS Nx H( N N N4 T S N@ N S NL P T NT T TP`OMRlOTNtS$MSNV93N5822Isoftware nshippedgcbV93B1002'software yshippedV93I4700hardware ynopenvV93F0020software =nshippedV93H0500L>jhardware =nopen0V93H3009L= software =nshippedV94S6400>software ywaitingV93S4702hardware yyshippedV9456220hardware yopenP8V93C0990=Jb(hardware HyshippedƿV93C0120 other HyshippedmbWV9345139=2software yshipped"V9345200>2)software yshipped V9346200?software nwaitingV9336100L=Ȩsoftware nwaitingտտпV93006 other nshipped}V93005software yshippedV9427029)>hardware nshipped`V9420099>/dsoftware nopenV9320630L>[hardware nopenO?? V9324320?software yshipped@88"V9324200L>~Vhardware Hyshipped6V94H0079L= software =nopenV93H0030L> software vyopenV93F2051software nwaitingV93F2030qhardware yopenVJV93F3088@B software nshippedkkV92F3004@ software yshippedCCV93J3100=hwsoftware vyshippedV93J2004Rsoftware vyshippedƾV92J1003software =yshippedV92E0340jhardware yshippedV91E0210=  hardware yshipped901,2l282 ,,,,\,0,, , , ,T ,( , , , ,x ,L , , , , ,p ,< 2 , 2 , ,X ,, , , , ,| ,P ,( ( ()(x2L, ,-.,d-$@elaine$@ =elaine$@qelainey$@(elainev$@elaineH$@q_elaine= r#@ͳwelaine  ytjk Otji ytjU tj.@eRVelaine^@[VelaineS@GVelaineH@MVelaineG@-VelaineA@[Velaine=@>Velaine4@`vVelaine-@RVelaine, @Di9Velaine%@51Velaine$ @7ZVelaine"@(eVelaine@!Velaine@LwVelaine@9Velaine@PkbVelaine@(eVelaine@@NVelaine @rVelaine @mVelaine @^Velaine@mKadmin2-@@KLKadmin2,@g5Kadmin2%@-Kadmin2$@`SKadmin2"@^Kadmin2@coKadmin2@zKadmin2@[Kadmin2@^Kadmin2@>IKadmin2 @jKadmin2  ^)P @`Kadmin2 {/L @@TKadmin2 =U @@Kadmin2$@Kadmin2900T(0T-T,,T+ T ,, T , T ,, T , T ,, T + T ,, T , T ,, T ,T,,T,T,,T,T|-(T-Tx,$T-Tp-T,. 100VBASE(08( , 100VBASE(08( * 100VBASE(08( Zb( 622VBASE(08( J]& 621VBASE(08( +S $ 621VBASE(08( '" 110MKTPR(08(   100MKTPR(08(  672MKTPR(08( ' 623MKTPR(08( 0MKTPR(08( -1 110MKTPR(08(  100MKTPR(08(  672MKTPR(08( z 623MKTPR(08(  622HWRII(08( Zb 621HWRII(08(  670HWRII(08(  671MAPDB(08( [ 622MAPDB(08(  = 621MAPDB(08(  621MAPDB(08( @ 671GUIDE(08( -1 100GUIDE(08( 90tX< x\@$    | ` D (   4MKTPRMKTPRMKTPR"MKTPRnMKTPRUMKTPR MKTPRiMKTPR.MKTPRGMAPDBMAPDBGUIDEqGUIDEGUIDEGUIDE-VBASEVBASESVBASEVBASE,VBASEVBASEGVBASEVBASEVBASEVBASEDGPIIqDGPIIDGPII90 yD=l9 u :P h B vP B ? N/AUMarketing project 3MKTPR2a/Expand marketing and sales in the Pacific Rim. 2Set up a field office in Australia and Singapore.  softwareTranslator upgradeHWRII7V7Integrate the hand-writing recognition module into the universal language translator.  softwareMapBrowser portMAPDB/H/Port the map browsing database software to run on the automobile model.  hardware AutoMapGUIDE2U2Develop a prototype for the automobile version of #the hand-held map browsing device. other  DigiPizzaDGPII.w.Develop second generation digital pizza maker $with flash-bake heating element and %digital ingredient measuring system.  software-Video DatabaseVBASE/Y/Design a video data base management system for *controlling on-demand video distribution. 90d0  p wd d| ` LA P.0.Box 702 2514(070) 44 91 18 Neppelenbroek Netherlands Den HaagK.M. GeoTech Inc.ARue Royale 350 1210 02 500 5940 Hessels Belgium BrusselsGretaDyno ConsultingAVia Eugenia, 15 20124 02 404 6284 LorenziItalyMilan AndreasLorenzi Export, Ltd.A22 Place de la Concorde 75008 1 43 60 61RocheFranceParis Michelle 3D-Pad Corp.AFlorhofgasse 10 8005 01 221 16 50 Granges SwitzerlandZurichVictorDynamic Intelligence CorpA2-64-7 Sasazuka 150 3 880 77 19 MiyamotoJapanTokyoMiwakoMPM Corporation)1 Emerald Cove 22 01 23*Fiji Turtle IslandMaxMaxA3320 Lawai Road 96766(808) 835-7605BriggsUSAHILihue LeilaniAnini Vacation RentalsQP.O. Box 22743 93953 Mrs. BeauvaisUSACA Pebble Beach Mrs. Beauvais@ Suite 15020 Carling Avenue K1V 9G1(613) 229 3323BrightCanadaONOttawaTomasDataServe InternationalI400 Connaught Road(852) 850 43 98Wu Hong KongCentral Hong KongTaiDT Systems, LTD.A66 Lloyd Street M2 3LA 61 211 99 88 Brocket England Manchester Elizabeth Central Bank@ Suite 1012300 Newbury Street 02115(617) 488-1864ButtleUSAMABostonJamesButtle, Griffith and Co.P. O. Box 470 75205(214) 960-2233Brown*USATXDallasGlenDallas TechnologiesA15500 Pacific Heights Blvd. 92121(619) 530-2710LittleUSACA San Diego Dale J.Signature Design90%Q\O ORhOP Mx P$ S V| O( R R Q, T X P0 T S S8 NTW4UOU8RUN@OQLPOVVLTPHSFGlonFranceSRep123Jacques@#C8492YanowskiUSASRep100Michael@N1 FerrariyItalySRep125Roberto@,23YamamotovJapanSRep115Takashi@g5247ParkerrUSAEng623Bill@>I845PageqUSAEng671Mary@F#~22IchidanJapanEng115Yuki@2)~202BrownmUSAAdmin600Kelly@ũ{894CookkUSADir670Kevin@D255BenderiUSACEO0 Oliver H.@FU0}(UEnglish German ҳFrench  E( 1f BA/BS and +2-4 years experience in technical support. 1Knowledge of several European languages helpful. !.c- EngineerUSAEng   BA/BS and 3-5 years experience. 9/  EngineerJapanEngU0}(U Japanese Mandarin English   %5+ years experience. "BA/BS and/or MS degrees required. %Customer support experience desired. #Knowledge of Japanese and English. @T@KL EngineerUSAEng:5+ years experience. BA/BS required. MS degree preferred. اj EngineerUSAEng%=Distinguished engineer. %Ph.D/MS/BS or equivalent experience.  g5Financial AnalystUSAFinan3_35-10 years of accounting and financial experience. Strong analytical skills. CPA/MBA required. `S* AccountantUSAAccntA`CPA with 3-5 years experience. ASpreadsheet, data entry, and word processing knowledge required. @KLMarketing AnalystUSAMktg/e BA/BS required. MBA preferred. 3-5 years experience. /Knowledgeable with spreadsheets and databases. z =Marketing AnalystUSAMktg/=MBA required. /10+ years experience in high tech environment. .c%&Public Relations Rep.USAPRel(`r%Administrative AssistantEnglandAdmin =!Administrative AssistantUSAAdmin.b2-4 years clerical experience. .Facility with word processing and data entry. AA degree preferred.  `Sg5!Administrative AssistantUSAAdmin9}/3-5 years experience in executive environment. 9Strong organizational and communication skills required. BA degree preferred.  [- ManagerUSAMngr'''5+ years office management experience. [ ManagerUSAMngr'PBA/BS required. 3-5 years in management, 'plus 2-4 years engineering experience. pr DirectorUSADir@T@5-10 years as a director in computer or electronics industries. An advanced degree. @]zVice PresidentUSAVPNo specific requirements.  Chief Financial OfficerUSACFO*Z*15+ years in finance or 5+ years as a CFO with a proven track record. MBA or J.D. degree. @x}@]Chief Executive OfficerUSACEONo specific requirements. 90P\QFTNd  Mx ( OX ` ZX dXPX\@H[-|`>0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. Knowledge of Japanese required. Travel required.  [*Sales Representative SwitzerlandSRepU0}(UGerman French nch English Italian  K0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. KKnowledge of German required; one or more other European language helpful. Travel required. jH(Sales RepresentativeCanadaSRepU0}(UEnglish French T3   >0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. Travel required. 4English plus speaking knowledge of French required. ;f`rSales Representative EnglandSRepU0}(UEnglish German French   >0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. 1Knowledge of several European languages helpful. Travel required. Sales RepresentativeUSASRepU0}(UEnglish Spanish   %߳ >0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. $Some knowledge of Spanish required. Travel required. PG(Sales Co-ordinator EnglandSalesU0}(UEnglish German French   1)Experience in sales and public relations in a high tech environment. Excellent communication skills. BA or equivalent. 1Knowledge of several European languages helpful. j =Sales Co-ordinatorUSASales)w)Experience in sales and public relations in a high tech environment. Excellent communication skills. BA or equivalent.  =!Technical WriterUSADoc7}7BA in English/journalism or excellent language skills. &Some programming experience required. 2-4 years of technical writing. [9Technical WriterUSADoc#"4+ years writing highly technical software documentation. #A bachelor's degree or equivalent. !Programming experience required. Excellent language skills. g5%& EngineerUSAEng 1BA/BS preferred. 2-4 years technical experience. #sB$ Engineer EnglandEng90d[ T \ < \`˅[Sales RepresentativeFranceSRepU0}(UEnglish French Spanish  @/ >0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. =Fluency in French; some knowledge of German/Spanish helpful. Travel required. [ESales RepresentativeItalySRepU0}(UItalian German 0CompFrench  ustry sales ex >0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. 6Fluency in Italian; some knowledge of German helpful. Travel required. ~_@ Sales RepresentativeJapanSRepU0}(U Japanese English al skil  establishing l 90$''`,<#$'(+p+@-( ) & FDollarFiji SchillingAustriaBFranc Belgium Guilder NetherlandsHKDollar Hong Kong ADollar AustraliaD-Mark GermanyFFrancFranceLiraItalyYenJapanSFranc SwitzerlandCdnDlrCanadaPound EnglandDollarUSA90 'IT_x , L F VH C F Vd D v TP E w0 AtwA4R`A<R`A@UdA@UdA`8WA84WA6hM///3 QTY_ORDEREDcheck_constraintLCHECK (qty_ordered >= 1) @CHECK_18 SALES   999;9/PAIDy/PAIDncheck_constraintLCHECK (paid in ('y', 'n')) @CHECK_17 SALES   999;9/PAIDy/PAIDncheck_constraintLCHECK (paid in ('y', 'n')) @CHECK_16 SALES   FFF:4 DATE_NEEDED ORDER_DATE;= DATE_NEEDEDcheck_constraintL777CHECK (date_needed > order_date OR date_needed IS NULL) @CHECK_15 SALES   FFF:4 DATE_NEEDED ORDER_DATE;= DATE_NEEDEDcheck_constraintL777CHECK (date_needed > order_date OR date_needed IS NULL) @CHECK_14 SALES   BBB:3 SHIP_DATE ORDER_DATE;= SHIP_DATEcheck_constraintL444CHECK (ship_date >= order_date OR ship_date IS NULL) @CHECK_13 SALES   BBB:3 SHIP_DATE ORDER_DATE;= SHIP_DATEcheck_constraintL444CHECK (ship_date >= order_date OR ship_date IS NULL) @CHECK_12 SALES   ;999/ ORDER_STATUSnew/ ORDER_STATUSopen/ ORDER_STATUSshipped/ ORDER_STATUSwaitingcheck_constraintLYYYCHECK (order_status in ('new', 'open', 'shipped', 'waiting')) @CHECK_11 SALES   ;999/ ORDER_STATUSnew/ ORDER_STATUSopen/ ORDER_STATUSshipped/ ORDER_STATUSwaitingcheck_constraintLYYYCHECK (order_status in ('new', 'open', 'shipped', 'waiting'))@SET_CUST_NO CUSTOMER   666=CUST_NOe CUST_NO_GENCUST_NOLXXXAS BEGIN if (new.cust_no is null) then new.cust_no = gen_id(cust_no_gen, 1); END @CHECK_10 CUSTOMER   888:;=ON_HOLD0ON_HOLD*check_constraintL(((CHECK (on_hold IS NULL OR on_hold = '*') @CHECK_9 CUSTOMER   888:;=ON_HOLD0ON_HOLD*check_constraintL(((CHECK (on_hold IS NULL OR on_hold = '*')@SAVE_SALARY_CHANGE EMPLOYEE   0SALARYSALARYJSALARY_HISTORYEMP_NOEMP_NONOW CHANGE_DATE, UPDATER_IDSALARY OLD_SALARY%$#SALARYSALARYdSALARYPERCENT_CHANGELAAAAS BEGIN IF (old.salary <> new.salary) THEN INSERT INTO salary_history (emp_no, change_date, updater_id, old_salary, percent_change) VALUES ( old.emp_no, 'NOW', user, old.salary, (new.salary - old.salary) * 100 / old.salary); END @CHECK_8 SALARY_HISTORY   90 %A64MA6hM$A 6 MX A E ^l A$ E ^ A$ Z b| A Z bx AALAF8@EO&A4O &8@TR_CONNECT   L111AS BEGIN /* enter trigger code here */ END @TR_MULTI COUNTRY r  L111AS BEGIN /* enter trigger code here */ END@POST_NEW_ORDER SALES    new_orderL(((AS BEGIN POST_EVENT 'new_order'; END @CHECK_28 SALES   ooo:/ ORDER_STATUSshipped= 0 AND discount <= 1) @CHECK_23 SALES   @@@93DISCOUNT1DISCOUNTcheck_constraintL'''CHECK (discount >= 0 AND discount <= 1) @CHECK_22 SALES   ///3 TOTAL_VALUEcheck_constraintLCHECK (total_value >= 0) @CHECK_21 SALES   ///3 TOTAL_VALUEcheck_constraintLCHECK (total_value >= 0) @CHECK_20 SALES   ///3 QTY_ORDEREDcheck_constraintLCHECK (qty_ordered >= 1) @CHECK_19 SALES   90.9B<BBBpB,B B B` B B @ @\ @ @ @ :d :( : : :x 7@ 7 7 7 7X ? ?ABP><==T=<99d9(995|5D5 55 PUBLIC SYSDBA R JOB  PUBLIC SYSDBA D JOB  PUBLIC SYSDBA U JOB  PUBLIC SYSDBA I JOB  PUBLIC SYSDBA S JOB  PUBLIC SYSDBA R COUNTRY  PUBLIC SYSDBA D COUNTRY  PUBLIC SYSDBA U COUNTRY  PUBLIC SYSDBA I COUNTRY  PUBLIC SYSDBA S COUNTRY (SYSDBA SYSDBA X ALL_LANGS (SYSDBA SYSDBA X SHOW_LANGS (SYSDBA SYSDBA X SHIP_ORDER (SYSDBA SYSDBA X MAIL_LABEL (SYSDBA SYSDBA X ORG_CHART (SYSDBA SYSDBA X DEPT_BUDGET (SYSDBA SYSDBA X DELETE_EMPLOYEE (SYSDBA SYSDBA X SUB_TOT_BUDGET (SYSDBA SYSDBA X ADD_EMP_PROJ (SYSDBA SYSDBA X GET_EMP_PROJ  SYSDBA SYSDBA R SALES  SYSDBA SYSDBA D SALES  SYSDBA SYSDBA U SALES  SYSDBA SYSDBA I SALES  SYSDBA SYSDBA S SALES  SYSDBA SYSDBA R CUSTOMER  SYSDBA SYSDBA D CUSTOMER  SYSDBA SYSDBA U CUSTOMER  SYSDBA SYSDBA I CUSTOMER  SYSDBA SYSDBA S CUSTOMER  SYSDBA SYSDBA R SALARY_HISTORY  SYSDBA SYSDBA D SALARY_HISTORY  SYSDBA SYSDBA U SALARY_HISTORY  SYSDBA SYSDBA I SALARY_HISTORY  SYSDBA SYSDBA S SALARY_HISTORY  SYSDBA SYSDBA R PROJ_DEPT_BUDGET  SYSDBA SYSDBA D PROJ_DEPT_BUDGET  SYSDBA SYSDBA U PROJ_DEPT_BUDGET  SYSDBA SYSDBA I PROJ_DEPT_BUDGET  SYSDBA SYSDBA S PROJ_DEPT_BUDGET  SYSDBA SYSDBA R EMPLOYEE_PROJECT  SYSDBA SYSDBA D EMPLOYEE_PROJECT  SYSDBA SYSDBA U EMPLOYEE_PROJECT  SYSDBA SYSDBA I EMPLOYEE_PROJECT  SYSDBA SYSDBA S EMPLOYEE_PROJECT  SYSDBA SYSDBA R PROJECT 90.<<L<<<:\: : : :l <0 < < <| <@ 9 9 9 9P 9 B B B@ B B Bt B0 BBBh@(@@@h@,:::x:<:777\7$7? PUBLIC SYSDBA X GET_EMP_PROJ  PUBLIC SYSDBA R SALES  PUBLIC SYSDBA D SALES  PUBLIC SYSDBA U SALES  PUBLIC SYSDBA I SALES  PUBLIC SYSDBA S SALES  PUBLIC SYSDBA R CUSTOMER  PUBLIC SYSDBA D CUSTOMER  PUBLIC SYSDBA U CUSTOMER  PUBLIC SYSDBA I CUSTOMER  PUBLIC SYSDBA S CUSTOMER  PUBLIC SYSDBA R SALARY_HISTORY  PUBLIC SYSDBA D SALARY_HISTORY  PUBLIC SYSDBA U SALARY_HISTORY  PUBLIC SYSDBA I SALARY_HISTORY  PUBLIC SYSDBA S SALARY_HISTORY  PUBLIC SYSDBA R PROJ_DEPT_BUDGET  PUBLIC SYSDBA D PROJ_DEPT_BUDGET  PUBLIC SYSDBA U PROJ_DEPT_BUDGET  PUBLIC SYSDBA I PROJ_DEPT_BUDGET  PUBLIC SYSDBA S PROJ_DEPT_BUDGET  PUBLIC SYSDBA R EMPLOYEE_PROJECT  PUBLIC SYSDBA D EMPLOYEE_PROJECT  PUBLIC SYSDBA U EMPLOYEE_PROJECT  PUBLIC SYSDBA I EMPLOYEE_PROJECT  PUBLIC SYSDBA S EMPLOYEE_PROJECT  PUBLIC SYSDBA R PROJECT  PUBLIC SYSDBA D PROJECT  PUBLIC SYSDBA U PROJECT  PUBLIC SYSDBA I PROJECT  PUBLIC SYSDBA S PROJECT  PUBLIC SYSDBA R PHONE_LIST  PUBLIC SYSDBA D PHONE_LIST  PUBLIC SYSDBA U PHONE_LIST  PUBLIC SYSDBA I PHONE_LIST  PUBLIC SYSDBA S PHONE_LIST  PUBLIC SYSDBA R EMPLOYEE  PUBLIC SYSDBA D EMPLOYEE  PUBLIC SYSDBA U EMPLOYEE  PUBLIC SYSDBA I EMPLOYEE  PUBLIC SYSDBA S EMPLOYEE  PUBLIC SYSDBA R DEPARTMENT  PUBLIC SYSDBA D DEPARTMENT  PUBLIC SYSDBA U DEPARTMENT  PUBLIC SYSDBA I DEPARTMENT  PUBLIC SYSDBA S DEPARTMENT 90#+?|A8B><|=<= = < 4T 4 4 4 4 4P 4 4 4 4 4L 4 4 4 4| 4H 4 444x3333X3}  SYSDBA SYSDBA D T }  SYSDBA SYSDBA U T }  SYSDBA SYSDBA I T }  SYSDBA SYSDBA S T } } } } } P  SYSDBA SYSDBA R T P  SYSDBA SYSDBA D T P  SYSDBA SYSDBA U T P  SYSDBA SYSDBA I T P  SYSDBA SYSDBA S T P P P P P   SYSDBA SYSDBA R T   SYSDBA SYSDBA D T   SYSDBA SYSDBA U T   SYSDBA SYSDBA I T   SYSDBA SYSDBA S T        SYSDBA SYSDBA R T   SYSDBA SYSDBA D T   SYSDBA SYSDBA U T   SYSDBA SYSDBA I T   SYSDBA SYSDBA S T        SYSDBA SYSDBA R T   SYSDBA SYSDBA D T   SYSDBA SYSDBA U T   SYSDBA SYSDBA I T   SYSDBA SYSDBA S T      }  SYSDBA SYSDBA R T } }  SYSDBA SYSDBA D T }  SYSDBA SYSDBA U T }  SYSDBA SYSDBA I T } } } } }  SYSDBA SYSDBA S T  SYSDBA SYSDBA R T2  SYSDBA SYSDBA D T2  SYSDBA SYSDBA U T2  SYSDBA SYSDBA I T2  SYSDBA SYSDBA S T2  SYSDBA SYSDBA R AR  SYSDBA SYSDBA D AR  SYSDBA SYSDBA U AR  SYSDBA SYSDBA I AR  SYSDBA SYSDBA S AR  SYSDBA SYSDBA R T4  SYSDBA SYSDBA D T4  SYSDBA SYSDBA U T4  SYSDBA SYSDBA I T4  SYSDBA SYSDBA S T4  SYSDBA SYSDBA R T3  SYSDBA SYSDBA D T3  SYSDBA SYSDBA U T3  SYSDBA SYSDBA I T3  SYSDBA SYSDBA S T3 P  SYSDBA SYSDBA R T P  SYSDBA SYSDBA D T P  SYSDBA SYSDBA U T P  SYSDBA SYSDBA I T P  SYSDBA SYSDBA S T  PUBLIC SYSDBA X ALL_LANGS  PUBLIC SYSDBA X SHOW_LANGS  PUBLIC SYSDBA X SHIP_ORDER  PUBLIC SYSDBA X MAIL_LABEL  PUBLIC SYSDBA X ORG_CHART  PUBLIC SYSDBA X DEPT_BUDGET  PUBLIC SYSDBA X DELETE_EMPLOYEE  PUBLIC SYSDBA X SUB_TOT_BUDGET  PUBLIC SYSDBA X ADD_EMP_PROJ 90-9|E@9555`5(5 5 Bh B4 3 = =t @( I I ;d ;( ; ; ;t ;8 ; ; ;x G0 GG8dJ(::>dGGCCDPPP`C @CCINTEG_45 NOT NULL PROJ_DEPT_BUDGET NO NO INTEG_44 NOT NULL PROJ_DEPT_BUDGET NO NO INTEG_43 CHECK PROJ_DEPT_BUDGET NO NO INTEG_42 NOT NULL PROJ_DEPT_BUDGET NO NO INTEG_41 FOREIGN KEYEMPLOYEE_PROJECT NO NO RDB$FOREIGN16 INTEG_40 FOREIGN KEYEMPLOYEE_PROJECT NO NO RDB$FOREIGN15 INTEG_39 PRIMARY KEYEMPLOYEE_PROJECT NO NO RDB$PRIMARY14 INTEG_38 NOT NULL EMPLOYEE_PROJECT NO NO INTEG_37 NOT NULL EMPLOYEE_PROJECT NO NO INTEG_36 FOREIGN KEYPROJECT NO NO RDB$FOREIGN13 INTEG_35 PRIMARY KEYPROJECT NO NO RDB$PRIMARY12 INTEG_34 UNIQUE PROJECT NO NO RDB$11 INTEG_33 NOT NULL PROJECT NO NO INTEG_32 NOT NULL PROJECT NO NO INTEG_31 FOREIGN KEYDEPARTMENT NO NO RDB$FOREIGN10 INTEG_30 CHECK EMPLOYEE NO NO INTEG_29 FOREIGN KEYEMPLOYEE NO NO RDB$FOREIGN9 INTEG_28 FOREIGN KEYEMPLOYEE NO NO RDB$FOREIGN8 INTEG_27 PRIMARY KEYEMPLOYEE NO NO RDB$PRIMARY7 INTEG_26 NOT NULL EMPLOYEE NO NO INTEG_25 NOT NULL EMPLOYEE NO NO INTEG_24 NOT NULL EMPLOYEE NO NO INTEG_23 NOT NULL EMPLOYEE NO NO INTEG_22 NOT NULL EMPLOYEE NO NO INTEG_21 NOT NULL EMPLOYEE NO NO INTEG_20 NOT NULL EMPLOYEE NO NO INTEG_19 NOT NULL EMPLOYEE NO NO INTEG_18 NOT NULL EMPLOYEE NO NO INTEG_17 FOREIGN KEYDEPARTMENT NO NO RDB$FOREIGN6 INTEG_16 PRIMARY KEYDEPARTMENT NO NO RDB$PRIMARY5 INTEG_15 UNIQUE DEPARTMENT NO NO RDB$4 INTEG_14 NOT NULL DEPARTMENT NO NO INTEG_13 NOT NULL DEPARTMENT NO NO INTEG_12 CHECK JOB NO NO INTEG_11 FOREIGN KEYJOB NO NO RDB$FOREIGN3 INTEG_10 PRIMARY KEYJOB NO NO RDB$PRIMARY2 INTEG_9 NOT NULL JOB NO NO INTEG_8 NOT NULL JOB NO NO INTEG_7 NOT NULL JOB NO NO INTEG_6 NOT NULL JOB NO NO INTEG_5 NOT NULL JOB NO NO INTEG_4 NOT NULL JOB NO NO INTEG_3 NOT NULL COUNTRY NO NO INTEG_2 PRIMARY KEYCOUNTRY NO NO RDB$PRIMARY1 INTEG_1 NOT NULL COUNTRY NO NO 90#P`PPAADAA A| >, N N ;d ;, 8 H Hd 8, 8 8 5 8L 5 5 5 8l 54 8585DEEE|5D5INTEG_80 CHECK SALES NO NO INTEG_79 CHECK SALES NO NO INTEG_78 FOREIGN KEYSALES NO NO RDB$FOREIGN26 INTEG_77 FOREIGN KEYSALES NO NO RDB$FOREIGN25 INTEG_76 PRIMARY KEYSALES NO NO RDB$PRIMARY24 INTEG_75 CHECK SALES NO NO INTEG_74 NOT NULL SALES NO NO INTEG_73 CHECK SALES NO NO INTEG_72 NOT NULL SALES NO NO INTEG_71 CHECK SALES NO NO INTEG_70 NOT NULL SALES NO NO INTEG_69 CHECK SALES NO NO INTEG_68 CHECK SALES NO NO INTEG_67 CHECK SALES NO NO INTEG_66 NOT NULL SALES NO NO INTEG_65 CHECK SALES NO NO INTEG_64 NOT NULL SALES NO NO INTEG_63 NOT NULL SALES NO NO INTEG_62 NOT NULL SALES NO NO INTEG_61 FOREIGN KEYCUSTOMER NO NO RDB$FOREIGN23 INTEG_60 PRIMARY KEYCUSTOMER NO NO RDB$PRIMARY22 INTEG_59 CHECK CUSTOMER NO NO INTEG_58 NOT NULL CUSTOMER NO NO INTEG_57 NOT NULL CUSTOMER NO NO INTEG_56 FOREIGN KEYSALARY_HISTORY NO NO RDB$FOREIGN21 INTEG_55 PRIMARY KEYSALARY_HISTORY NO NO RDB$PRIMARY20 INTEG_54 CHECK SALARY_HISTORY NO NO INTEG_53 NOT NULL SALARY_HISTORY NO NO INTEG_52 NOT NULL SALARY_HISTORY NO NO INTEG_51 NOT NULL SALARY_HISTORY NO NO INTEG_50 NOT NULL SALARY_HISTORY NO NO INTEG_49 NOT NULL SALARY_HISTORY NO NO INTEG_48 FOREIGN KEYPROJ_DEPT_BUDGET NO NO RDB$FOREIGN19 INTEG_47 FOREIGN KEYPROJ_DEPT_BUDGET NO NO RDB$FOREIGN18 INTEG_46 PRIMARY KEYPROJ_DEPT_BUDGET NO NO RDB$PRIMARY17 90CxD4DDDhD$D D DX D D C DH DINTEG_78 INTEG_27 FULL RESTRICT RESTRICT INTEG_77 INTEG_60 FULL RESTRICT RESTRICT INTEG_61 INTEG_2 FULL RESTRICT RESTRICT INTEG_56 INTEG_27 FULL RESTRICT RESTRICT INTEG_48 INTEG_35 FULL RESTRICT RESTRICT INTEG_47 INTEG_16 FULL RESTRICT RESTRICT INTEG_41 INTEG_35 FULL RESTRICT RESTRICT INTEG_40 INTEG_27 FULL RESTRICT RESTRICT INTEG_36 INTEG_27 FULL RESTRICT RESTRICT INTEG_31 INTEG_27 FULL RESTRICT RESTRICT INTEG_29 INTEG_10 FULL RESTRICT RESTRICT INTEG_28 INTEG_16 FULL RESTRICT RESTRICT INTEG_17 INTEG_16 FULL RESTRICT RESTRICT INTEG_11 INTEG_2 FULL RESTRICT RESTRICT 90=%&&`'4) '((&l&D&) % ) (t (L &$ ' ( * % &X &0 & ( % & *d &< & & & % *l )@ ) - & & &p 'H & '(&+|'T'()''''`'8' *''*h'@'INTEG_73 CHECK_22 INTEG_73 CHECK_21 INTEG_72 TOTAL_VALUE INTEG_71 CHECK_20 INTEG_71 CHECK_19 INTEG_70 QTY_ORDERED INTEG_69 CHECK_18 INTEG_69 CHECK_17 INTEG_68 CHECK_16 INTEG_68 CHECK_15 INTEG_67 CHECK_14 INTEG_67 CHECK_13 INTEG_66 ORDER_DATE INTEG_65 CHECK_12 INTEG_65 CHECK_11 INTEG_64 ORDER_STATUS INTEG_63 CUST_NO INTEG_62 PO_NUMBER INTEG_59 CHECK_10 INTEG_59 CHECK_9 INTEG_58 CUSTOMER INTEG_57 CUST_NO INTEG_54 CHECK_8 INTEG_54 CHECK_7 INTEG_53 PERCENT_CHANGE INTEG_52 OLD_SALARY INTEG_51 UPDATER_ID INTEG_50 CHANGE_DATE INTEG_49 EMP_NO INTEG_45 DEPT_NO INTEG_44 PROJ_ID INTEG_43 CHECK_6 INTEG_43 CHECK_5 INTEG_42 FISCAL_YEAR INTEG_38 PROJ_ID INTEG_37 EMP_NO INTEG_33 PROJ_NAME INTEG_32 PROJ_ID INTEG_30 CHECK_4 INTEG_30 CHECK_3 INTEG_26 SALARY INTEG_25 JOB_COUNTRY INTEG_24 JOB_GRADE INTEG_23 JOB_CODE INTEG_22 DEPT_NO INTEG_21 HIRE_DATE INTEG_20 LAST_NAME INTEG_19 FIRST_NAME INTEG_18 EMP_NO INTEG_14 DEPARTMENT INTEG_13 DEPT_NO INTEG_12 CHECK_2 INTEG_12 CHECK_1 INTEG_9 MAX_SALARY INTEG_8 MIN_SALARY INTEG_7 JOB_TITLE INTEG_6 JOB_COUNTRY INTEG_5 JOB_GRADE INTEG_4 JOB_CODE INTEG_3 CURRENCY INTEG_1 COUNTRY 90'''`'8'''INTEG_80 CHECK_28 INTEG_80 CHECK_27 INTEG_79 CHECK_26 INTEG_79 CHECK_25 INTEG_75 CHECK_24 INTEG_75 CHECK_23 INTEG_74 DISCOUNT 90"K t ldht$4@XRDB$FOREIGN8 EMPLOYEE  RDB$PRIMARY5 RY5 ?RDB$FOREIGN6 DEPARTMENT  RDB$PRIMARY5 ARY1 $I?RDB$FOREIGN3 JOB  RDB$PRIMARY1 $I?RDB$PRIMARY1 COUNTRY  ;? MAXSALX JOB `UU? MINSALX JOB !?RDB$PRIMARY2 JOB $I? BUDGETX DEPARTMENT  a?RDB$PRIMARY5 DEPARTMENT  a? RDB$4 DEPARTMENT   a? NAMEX EMPLOYEE  a?RDB$PRIMARY7 EMPLOYEE  ?CUSTREGION CUSTOMER   ? CUSTNAMEX CUSTOMER  ?RDB$PRIMARY22 CUSTOMER `UU? PRODTYPEX PROJECT `UU?RDB$PRIMARY12 PROJECT `UU? RDB$11 PROJECT  $I?RDB$PRIMARY14 EMPLOYEE_PROJECT  `UU?RDB$PRIMARY17 PROJ_DEPT_BUDGET  `UU? CHANGEX SALARY_HISTORY  `UU? UPDATERX SALARY_HISTORY  ?RDB$PRIMARY20 SALARY_HISTORY E?QTYX SALES  SALESTATX SALES  NEEDX SALES RDB$PRIMARY24 SALES RDB$INDEX_43 RDB$RELATION_CONSTRAINTS RDB$INDEX_42 RDB$RELATION_CONSTRAINTS RDB$INDEX_41 RDB$INDICES RDB$INDEX_40 RDB$CHECK_CONSTRAINTS RDB$INDEX_39 RDB$ROLES RDB$INDEX_38 RDB$TRIGGERS RDB$INDEX_37 RDB$TYPES RDB$INDEX_36 RDB$FIELD_DIMENSIONS RDB$INDEX_35 RDB$TRIGGER_MESSAGES RDB$INDEX_34 RDB$VIEW_RELATIONS RDB$INDEX_31 RDB$INDICES RDB$INDEX_29 RDB$USER_PRIVILEGES RDB$INDEX_28 RDB$DEPENDENCIES RDB$INDEX_26 RDB$COLLATIONS RDB$INDEX_25 RDB$CHARACTER_SETS ?RDB$INDEX_23 RDB$EXCEPTIONS RDB$INDEX_22 RDB$PROCEDURES ?RDB$INDEX_20 RDB$COLLATIONS RDB$INDEX_18 RDB$PROCEDURE_PARAMETERS RDB$INDEX_17 RDB$FILTERS RDB$INDEX_15 RDB$RELATION_FIELDS RDB$INDEX_14 RDB$CHECK_CONSTRAINTS RDB$INDEX_12 RDB$RELATION_CONSTRAINTS RDB$INDEX_11 RDB$GENERATORS 90  N% ,1%+X,D$4$1,  %H1%+%|$h%1@%@ %|1 %P, %% % 1x %@ 7t  71 7, 7%` 7@1( 7 71 7% 7H 7 1 1 1x 1D 1 1 1 :d :( :::t:8::::P11::h:-N - SQL$DEFAULT19  SYSYSDBA  SYSYSDBA  SYSYSDBA  SYSYSDBAA.SYSDBASQL$43   SYSDBA&SY\ SQL$DEFAULT32  SYSYSDBA\SQL$42   SYSDBA\ SQL$DEFAULT31  SYSDBASYSQL$41  SYSDBA SQL$DEFAULT30  YSYSDBASQL$40  SYSDBAQ SQL$DEFAULT29  SYSDBAQSQL$39  CSYSYSDBA  SYSYSDBA  SYSYSDBA  SYSYSDBAASYSDBASYSDBA  SYSDBA  ASYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBASYSDBASYSDBASYSDBASYSDBASYSDBASYSDBASYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  -SQL$29  -SQL$28  -SQL$27  -SQL$26  -SQL$25  -SQL$24  -SQL$23  -SQL$22  -SQL$21  -SQL$20   - SQL$DEFAULT19  -SQL$8  <- SQL$DEFAULT18  (-SQL$18  &- SQL$DEFAULT17  $-SQL$19  "p90tF.@MV92V91E02102E0340F3004J1003 320630 4200 3203300566100451392006200B1002C0120990F00202030513088 H00305003009I4700J20043100N5822S4702420099702956220 H0079S6400 p90_.@O&`dfgpw`&hnoja x  _jV(Sp ĵ@ !.X-.` q p90D,@M openny shippedn  y  waitingn y x90q7` ]??s ? ˕ Ϣ Ѧ ۊ   @  ? @  ?p Χ Ѡ ۡ  @ p90}8`SF&&{HɈadmin2&{HɈadmin2&{HɈadmin2 &elaine"&elaine&&{HɈadmin2 elaine  38elaine(&{HɈadmin2 elaine,&{HɈadmin2 elaine.&{HɈadmin2 elaine4&{HɈadmin2 elaine 8&{HɈadmin2 elaine<&{HɈadmin2 elaine =&{HɈadmin2 elaine A&{HɈadmin2 elaine B&{HɈadmin2 elaine &{HɈadmin2 elaineF&{HɈadmin2 elaine&{HɈadmin2 elaineG&38tjJ&elaineN&elaine  38elaineP@&elaineQ&elaineR&elaine  38elaineT&elaineU@&38tjW&elaineZ@&38tj &38tj ]&38elaine^@&38elaine_&38elaine`&38elaine p901@Vadmin2admin2elainetj x90H2@X:H:HLJO"6w p90$0.PE$MAPDB621(GUIDE100671 HWRII6212 70 MAPDB6212 71 KTPR0001001062372  VBASE1006212,MKTPR1001062372  VBASE1006210VBASE100 p90Q-@G MAPDB VBASE GUIDEMKTPRVBASE (MKTPR ,MKTPR .VBASE  4GUIDE 8DGPIIGUIDE AMKTPR FVBASE  VBASE GMKTPR JMKTPR QMAPDBVBASE  TVBASE U@MKTPR Z@MKTPR [MKTPR \@DGPIIGUIDE aVBASE  @VBASE bDGPII VBASE p90+@CAutoMap DigiPizzaMapBrowser port rketing project 3 Translator upgradeVideo Database p90b, PMDGPIIGUIDE HWRIIMAPDB KTPRVBASE p90,`M N/AMarketing project 3hardwareAutoMapotherDigiPizzasoftwareMapBrowser port Translator upgrade Video Database p90m-@THPX`hpx p90 V+P; 3D-Pad Corp.Anini Vacation RentalsButtle, Griffith and Co. Central BankDT Systems, LTD.allas TechnologiestaServe International ynamic Intelligence Corp  o Consulting GeoTech Inc. Lorenzi Export, Ltd. MPM Corporationax rs. BeauvaisSignature Design p90#l,pD BelgiumBrusselsCanadaOttawaEnglandManchesterFijiTurtle Island ranceParis$Hong KongCentral Hong Kong ItalyMilan JapanTokyoNetherlandsDen Haag SwitzerlandZurich USABostonDallasLihuePebble Beach San Diego p901,@P "&(,.48<=ABFGJNP@QRTU@WZ@[@\@]^@_`a@b p90[f1`FB BaldwinJanetenderOliver H.  netAnn ishopDanarownKellyurbankJennifer M. CookKevin De SouzaRogerFerrariRoberto  isherPete orestPhil GlonJacques reenT.J.uckenheimerMark HallStewartIchidaYukiJohnsonLeslie Scott LambertKim eeTerri ungLukeMacDonaldMary S.ontgomeryJohnNelsonRobertordstromCarolO'BrienSue AnnesbornePierre PageMary padopoulosChris rkerBillhongLeslieRamanathanAshokeevesRogerStansburyWillieeadmanWalterutherlandClaudiaWestonK. J.illiamsRandyYamamotoTakashinowskiMichaeloungBruce Katherine p90o-PJCo Consumer Electronics Div.rporate Headquarters ustomer Services upport Engineeringuropean Headquarters Field Office: Canada  East CoastFranceItalyJapan Singapore witzerlandnance MarketingPacific Rim HeadquartersQuality Assurance Research and DevelopmentSales and Marketingoftware Development Products Div. p90- S12000100105620135 30 408060020123 7012900 x90L,@Q? ?? ?     p90-`DAAccntUSA dminUSA EnglandUSA CEOUSA FOUSA DirUSA ocUSAUSA EngUSA Japan USA England USAUSAFinanUSA MktgUSAUSA  ngrUSA USA PRelUSASRepCanada England France Italy Japan Switzerland USAalesEnglandUSA VPUSA p90,`FCanadaQEnglandp =q zG p =qFrance' =pItaly@Japank SwitzerlandffffffUSA   ffffff     ffffff        ! * x902`U??                  ?333332?o q?/?s33332?333332 =p < zG \(Ž?ՙ p90+@I Australia ia BelgiumCanadaEngland FijiranceGermany Hong KongItalyJapan Netherlands SwitzerlandUSA p90V+@ICanadaEnglandFranceItalyJapan SwitzerlandUSA p90+, N1`000100102060020 70 p90\, P1000100 105 2013530408060021237012900 90 |H p   8  | ,RY7 ?RDB$FOREIGN26 SALES  RDB$PRIMARY7 +RY22  ?RDB$FOREIGN25 SALES  RDB$PRIMARY22 *Y1 E?RDB$FOREIGN23 CUSTOMER  RDB$PRIMARY1 )ARY7 ?RDB$FOREIGN21 SALARY_HISTORY  RDB$PRIMARY7 (Y12 ?RDB$FOREIGN19 PROJ_DEPT_BUDGET  RDB$PRIMARY12 'Y5  q?RDB$FOREIGN18 PROJ_DEPT_BUDGET  RDB$PRIMARY5 &Y12 ?RDB$FOREIGN16 EMPLOYEE_PROJECT  RDB$PRIMARY12 %Y7 E?RDB$FOREIGN15 EMPLOYEE_PROJECT  RDB$PRIMARY7 $MARY7 `UU?RDB$FOREIGN13 PROJECT  RDB$PRIMARY7 #ARY7  q?RDB$FOREIGN10 DEPARTMENT  RDB$PRIMARY7 "MARY2 ?RDB$FOREIGN9 EMPLOYEE  RDB$PRIMARY2 !MARY5 ?p90|;`bAdminAdminUSA EnglandUSA CEOUSA FOUSA DirUSA ocUSA EngUSA Japan USA England USAUSAFinanUSA MktgUSA ngrUSAUSA PRelUSASRepCanada France Italy Japan Switzerland USAalesEngland USA VPUSA p90,@Pdefp"&.4ABGRU@ WZ@]^@`a p90D'@i48F U@ p90&-@T8  (,.48AFGJQ TU@Z@[\@a@b p90t+ LDGPII GUIDEMAPDBKTPRVBASE p907+ Q0001001062123 7012 p90`0 WMAPDBGUIDE HWRIIMAPDBKTPRVBASE p90F,@Q "&(,.48<=ABFGJNP@QRTU@WZ@ ]^@_` p90 +@K BelgiumCanadaEnglandFiji rance Hong Kong Italy Japan Netherlands SwitzerlandUSA p90R-@T HPX`hpx p90I.@UN&NR]^@ _`a 90  (EN^ PROJECT SQL$11 SYSDBA SQL$DEFAULT8 J PROJ_DESCPRODUCTsoftwareLJ999/software/hardware/other/N/AL ;=L TEAM_LEADER PROJ_NAME ;=LPROJ_ID /gL ;=LEMPLOYEE_PROJECT SQL$12 SYSDBA SQL$DEFAULT9  4EMP_NO ;=LPROJ_ID /gL ;=LPROJ_DEPT_BUDGET SQL$13 SYSDBA SQL$DEFAULT10 3PROJECTED_BUDGET PL:1'4LQUART_HEAD_CNT ) (  FISCAL_YEAR ;=LDEPT_NO399/000:104999=L ;=LPROJ_ID /gL ;=L CHECK_5 CHECK_68 NEW_SALARY8" OLD_SALARY%$ OLD_SALARYPERCENT_CHANGEdLPERCENT_CHANGE L ;=L OLD_SALARY L1L ;=L CHANGE_DATE NOWL ;=L UPDATER_ID ;=LEMP_NO ;=L CHECK_7 CHECK_8  SALES SQL$15 SYSDBA SQL$DEFAULT13 J?kAGED# SHIP_DATE ORDER_DATEL DATE_NEEDED SHIP_DATE ORDER_DATE NOWL ;=L PO_NUMBER7VL ;=L DISCOUNT L ;=L TOTAL_VALUE ;=L QTY_ORDERED L ;=LCUST_NO1L ;=L ITEM_TYPEsoftwareLJ999/software/hardware/other/N/AL ;=L SALES_REP PAID nL ORDER_STATUS newL ;=L POST_NEW_ORDER CHECK_20 CHECK_11 CHECK_21 CHECK_12 CHECK_22 CHECK_13 CHECK_23 CHECK_14 CHECK_24 CHECK_15 CHECK_25 CHECK_16 CHECK_26 CHECK_17 CHECK_27 CHECK_18 CHECK_28 CHECK_193BUDGET PL:1'4L PHONE_NO555-1234LMNGR_NO LOCATION HEAD_DEPT399/000:104999=L DEPARTMENT ;=LDEPT_NO399/000:104999=L ;=L"J PROJ_DESCPRODUCTsoftwareLJ999/software/hardware/other/N/AL ;=L TEAM_LEADER PROJ_NAME ;=LPROJ_ID /gL ;=LA SQL$DEFAULT13  " J?kAGED# SHIP_DATE ORDER_DATEL DATE_NEEDED SHIP_DATE ORDER_DATE NOWL ;=L PO_NUMBER7VL ;=L DISCOUNT L ;=L TOTAL_VALUE ;=L QTY_ORDERED L ;=LCUST_NO1L ;=L ITEM_TYPEsoftwareLJ999/software/hardware/other/N/AL ;=L SALES_REP PAID nL ORDER_STATUS newL ;=L POST_NEW_ORDER CHECK_20 CHECK_11 CHECK_21 CHECK_12 CHECK_22 CHECK_13 CHECK_23 CHECK_14 CHECK_24 CHECK_15 CHECK_25 CHECK_16 CHECK_26 CHECK_17 CHECK_27 CHECK_18 CHECK_28 CHECK_19A SQL$DEFAULT12 "ADDRESS_LINE2ADDRESS_LINE1CUST_NO1L ;=L POSTAL_CODE PHONE_NO CONTACT_LASTON_HOLD-LCOUNTRYSTATE_PROVINCE CITY CONTACT_FIRST CUSTOMER ;=L SET_CUST_NO CHECK_9 CHECK_1090 365\:$81/;H:4 3 3 3 3d 3( 9 4 7 2P 6 1 ' 4 3X 3 947|2D61'43H72AAHBBMt?(I :7-6-5-4-3- PHONE_LIST EMPLOYEE EMP_NO - PHONE_LIST EMPLOYEE LAST_NAME - PHONE_LIST EMPLOYEE PHONE_EXT - PHONE_LIST DEPARTMENT PHONE_NO - PHONE_LIST EMPLOYEE - PHONE_LIST DEPARTMENT - PHONE_LIST EMPLOYEE DEPT_NO - PHONE_LIST DEPARTMENT DEPT_NO -RDB$9 EMPLOYEE LAST_NAME -RDB$9 EMPLOYEE FIRST_NAME --SAVE_SALARY_CHANGE SALARY_HISTORY OLD_SALARY SAVE_SALARY_CHANGE EMPLOYEE SALARY SAVE_SALARY_CHANGE SALARY_HISTORY PERCENT_CHANGE CHECK_8 SALARY_HISTORY PERCENT_CHANGE CHECK_7 SALARY_HISTORY PERCENT_CHANGE CHECK_6 PROJ_DEPT_BUDGET FISCAL_YEAR CHECK_5 PROJ_DEPT_BUDGET FISCAL_YEAR  SET_EMP_NO EMP_NO_GEN  SET_EMP_NO EMPLOYEE EMP_NO CHECK_4 JOB MIN_SALARY CHECK_4 EMPLOYEE SALARY CHECK_4 JOB CHECK_4 JOB JOB_CODE CHECK_4 EMPLOYEE JOB_CODE CHECK_4 JOB JOB_GRADE CHECK_4 EMPLOYEE JOB_GRADE CHECK_4 JOB JOB_COUNTRY CHECK_4 EMPLOYEE JOB_COUNTRY CHECK_4 JOB MAX_SALARY CHECK_3 JOB MIN_SALARY CHECK_3 EMPLOYEE SALARY CHECK_3 JOB CHECK_3 JOB JOB_CODE CHECK_3 EMPLOYEE JOB_CODE CHECK_3 JOB JOB_GRADE CHECK_3 EMPLOYEE JOB_GRADE CHECK_3 JOB JOB_COUNTRY CHECK_3 EMPLOYEE JOB_COUNTRY CHECK_3 JOB MAX_SALARY CHECK_2 JOB MIN_SALARY CHECK_2 JOB MAX_SALARY CHECK_1 JOB MIN_SALARY CHECK_1 JOB MAX_SALARY RDB$31 SALES SHIP_DATE RDB$31 SALES ORDER_DATE RDB$17 SALARY_HISTORY OLD_SALARY RDB$17 SALARY_HISTORY PERCENT_CHANGE  PHONE_LIST EMPLOYEE FIRST_NAME  PHONE_LIST DEPARTMENT LOCATION  PHONE_LIST EMPLOYEE EMP_NO  PHONE_LIST EMPLOYEE LAST_NAME  PHONE_LIST EMPLOYEE PHONE_EXT  PHONE_LIST DEPARTMENT PHONE_NO  PHONE_LIST EMPLOYEE  PHONE_LIST DEPARTMENT  PHONE_LIST EMPLOYEE DEPT_NO  PHONE_LIST DEPARTMENT DEPT_NO RDB$9 EMPLOYEE LAST_NAME RDB$9 EMPLOYEE FIRST_NAME 90 )IhJ E?=h506 9 4 8P 8 5 6 5p 68 7 6 7 6` 00 0 7 7 7P 7 4 4 5x 8@ 5 863d64-863X6(-8-6-5-4-3-2-1-0 ADD_EMP_PROJ EMPLOYEE_PROJECT  ADD_EMP_PROJ EMPLOYEE_PROJECT EMP_NO  ADD_EMP_PROJ EMPLOYEE_PROJECT PROJ_ID  ADD_EMP_PROJ UNKNOWN_EMP_ID  GET_EMP_PROJ EMPLOYEE_PROJECT  GET_EMP_PROJ EMPLOYEE_PROJECT EMP_NO  GET_EMP_PROJ EMPLOYEE_PROJECT PROJ_ID CHECK_28 SALES ORDER_STATUS CHECK_28 CUSTOMER CHECK_28 CUSTOMER CUST_NO CHECK_28 SALES CUST_NO CHECK_28 CUSTOMER ON_HOLD CHECK_27 SALES ORDER_STATUS CHECK_27 CUSTOMER CHECK_27 CUSTOMER CUST_NO CHECK_27 SALES CUST_NO CHECK_27 CUSTOMER ON_HOLD CHECK_26 SALES ORDER_STATUS CHECK_26 SALES SHIP_DATE CHECK_25 SALES ORDER_STATUS CHECK_25 SALES SHIP_DATE CHECK_24 SALES DISCOUNT CHECK_23 SALES DISCOUNT CHECK_22 SALES TOTAL_VALUE CHECK_21 SALES TOTAL_VALUE CHECK_20 SALES QTY_ORDERED CHECK_19 SALES QTY_ORDERED CHECK_18 SALES PAID CHECK_17 SALES PAID CHECK_16 SALES ORDER_DATE CHECK_16 SALES DATE_NEEDED CHECK_15 SALES ORDER_DATE CHECK_15 SALES DATE_NEEDED CHECK_14 SALES ORDER_DATE CHECK_14 SALES SHIP_DATE CHECK_13 SALES ORDER_DATE CHECK_13 SALES SHIP_DATE CHECK_12 SALES ORDER_STATUS CHECK_11 SALES ORDER_STATUS  SET_CUST_NO CUST_NO_GEN  SET_CUST_NO CUSTOMER CUST_NO CHECK_10 CUSTOMER ON_HOLD CHECK_9 CUSTOMER ON_HOLD SAVE_SALARY_CHANGE SALARY_HISTORY SAVE_SALARY_CHANGE EMPLOYEE EMP_NO SAVE_SALARY_CHANGE SALARY_HISTORY EMP_NO SAVE_SALARY_CHANGE SALARY_HISTORY CHANGE_DATE SAVE_SALARY_CHANGE SALARY_HISTORY UPDATER_ID 90  /AAAA        This is a BLOB! P_"#$%&'()*+,-./0123456     This is a BLOB!r q F90 O ;;4|38A=\<(1643\)87d504*\7 :7,8L8- SHIP_ORDER CUSTOMER CUST_NO - SHIP_ORDER CUSTOMER ON_HOLD - SHIP_ORDER SALES - SHIP_ORDER SALES PO_NUMBER - SHIP_ORDER SALES ORDER_STATUS - SHIP_ORDER SALES SHIP_DATE -H-G-F-E-D-C-B- SHOW_LANGS JOB - SHOW_LANGS JOB JOB_CODE - SHOW_LANGS JOB JOB_GRADE - SHOW_LANGS JOB JOB_COUNTRY - SHOW_LANGS JOB LANGUAGE_REQ -<-;-:-9-8- ALL_LANGS JOB - ALL_LANGS JOB JOB_CODE - ALL_LANGS JOB JOB_GRADE - ALL_LANGS JOB JOB_COUNTRY - ALL_LANGS SHOW_LANGS - ALL_LANGS SHOW_LANGS LANGUAGES -1-0-/-.---,-RDB$17 SALARY_HISTORY OLD_SALARY -RDB$17 SALARY_HISTORY PERCENT_CHANGE -RDB$31 SALES SHIP_DATE -RDB$31 SALES ORDER_DATE - PHONE_LIST EMPLOYEE FIRST_NAME - PHONE_LIST DEPARTMENT LOCATION -%-$-#-"-!- ---- PHONE_LIST EMPLOYEE FIRST_NAME  PHONE_LIST DEPARTMENT LOCATION  PHONE_LIST EMPLOYEE EMP_NO  PHONE_LIST EMPLOYEE LAST_NAME  PHONE_LIST EMPLOYEE PHONE_EXT  PHONE_LIST DEPARTMENT PHONE_NO  PHONE_LIST EMPLOYEE  PHONE_LIST DEPARTMENT  PHONE_LIST EMPLOYEE DEPT_NO  PHONE_LIST DEPARTMENT DEPT_NO  ALL_LANGS JOB  ALL_LANGS JOB JOB_CODE  ALL_LANGS JOB JOB_GRADE  ALL_LANGS JOB JOB_COUNTRY  ALL_LANGS SHOW_LANGS  ALL_LANGS SHOW_LANGS LANGUAGES  SHOW_LANGS JOB  SHOW_LANGS JOB JOB_CODE  SHOW_LANGS JOB JOB_GRADE  SHOW_LANGS JOB JOB_COUNTRY  SHOW_LANGS JOB LANGUAGE_REQ  SHIP_ORDER ORDER_ALREADY_SHIPPED  SHIP_ORDER CUSTOMER_ON_HOLD  SHIP_ORDER SALES CUST_NO  SHIP_ORDER SALES PAID  SHIP_ORDER CUSTOMER_CHECK  SHIP_ORDER CUSTOMER  SHIP_ORDER CUSTOMER CUST_NO 90 `A (  H COUNTRY SQL$4 SYSDBA SQL$DEFAULT4  JOB SQL$5 SYSDBA SQL$DEFAULT5 ) AJOB_REQUIREMENT MAX_SALARY L1L ;=L MIN_SALARY L1L ;=L JOB_GRADE8L ;=L LANGUAGE_REQ ) (U JOB_TITLE ;=L JOB_COUNTRY ;=L JOB_CODE199999L ;=L CHECK_1 CHECK_2DEPARTMENT SQL$6 SYSDBA SQL$DEFAULT6 3BUDGET PL:1'4L PHONE_NO555-1234LMNGR_NO LOCATION HEAD_DEPT399/000:104999=L DEPARTMENT ;=LDEPT_NO399/000:104999=L ;=L-FAULT7  EMPLOYEE SQL$7 SYSDBA SQL$DEFAULT7 3*SALARY L1L ;=L HIRE_DATE NOWL ;=L JOB_GRADE8L ;=L PHONE_EXT LAST_NAME ;=LEMP_NO ;=L FULL_NAME&'' LAST_NAME,  FIRST_NAMEL JOB_COUNTRY ;=L JOB_CODE199999L ;=L DEPT_NO399/000:104999=L ;=L FIRST_NAME ;=L SET_EMP_NO SAVE_SALARY_CHANGE CHECK_3 CHECK_4 CUSTOMER SQL$9 SYSDBA SQL$DEFAULT12 ADDRESS_LINE2ADDRESS_LINE1CUST_NO1L ;=L POSTAL_CODE PHONE_NO CONTACT_LASTON_HOLD-LCOUNTRYSTATE_PROVINCE CITY CONTACT_FIRST CUSTOMER ;=L SET_CUST_NO CHECK_9 CHECK_10 ` V_WIN1250V_NONE V_OCTETSC_UTF8C1V_UTF8 C_WIN1250C_NONE C_OCTETS90 0/6d2,58=x<@8? 5 >H > = > 9T 8$ / 6 7 .L 8 9 9 9\ < ; 0 4 ;@ = 2:<`4B:D`< @3?t68;<<1L= @-SUB_TOT_BUDGET DEPARTMENT HEAD_DEPT -SUB_TOT_BUDGET DEPARTMENT BUDGET -DELETE_EMPLOYEE SALES -DELETE_EMPLOYEE SALES SALES_REP -DELETE_EMPLOYEE SALES PO_NUMBER -DELETE_EMPLOYEE REASSIGN_SALES -DELETE_EMPLOYEE DEPARTMENT -DELETE_EMPLOYEE DEPARTMENT MNGR_NO -DELETE_EMPLOYEE PROJECT -DELETE_EMPLOYEE PROJECT TEAM_LEADER -DELETE_EMPLOYEE EMPLOYEE_PROJECT -DELETE_EMPLOYEE EMPLOYEE_PROJECT EMP_NO -DELETE_EMPLOYEE SALARY_HISTORY -DELETE_EMPLOYEE SALARY_HISTORY EMP_NO -DELETE_EMPLOYEE EMPLOYEE -DELETE_EMPLOYEE EMPLOYEE EMP_NO - DEPT_BUDGET DEPARTMENT BUDGET - DEPT_BUDGET DEPARTMENT - DEPT_BUDGET DEPARTMENT HEAD_DEPT - DEPT_BUDGET DEPARTMENT DEPT_NO - DEPT_BUDGET DEPT_BUDGET - ORG_CHART DEPARTMENT - ORG_CHART DEPARTMENT HEAD_DEPT - ORG_CHART DEPARTMENT DEPARTMENT - ORG_CHART DEPARTMENT MNGR_NO - ORG_CHART DEPARTMENT DEPT_NO - ORG_CHART EMPLOYEE FULL_NAME - ORG_CHART EMPLOYEE JOB_CODE - ORG_CHART EMPLOYEE - ORG_CHART EMPLOYEE DEPT_NO - ORG_CHART EMPLOYEE EMP_NO - MAIL_LABEL CUSTOMER - MAIL_LABEL CUSTOMER CUST_NO - MAIL_LABEL CUSTOMER CUSTOMER - MAIL_LABEL CUSTOMER CONTACT_FIRST - MAIL_LABEL CUSTOMER CONTACT_LAST - MAIL_LABEL CUSTOMER ADDRESS_LINE1 - MAIL_LABEL CUSTOMER ADDRESS_LINE2 - MAIL_LABEL CUSTOMER CITY - MAIL_LABEL CUSTOMER STATE_PROVINCE - MAIL_LABEL CUSTOMER COUNTRY - MAIL_LABEL CUSTOMER POSTAL_CODE - SHIP_ORDER ORDER_ALREADY_SHIPPED - SHIP_ORDER CUSTOMER_ON_HOLD - SHIP_ORDER SALES CUST_NO - SHIP_ORDER SALES PAID - SHIP_ORDER CUSTOMER_CHECK - SHIP_ORDER CUSTOMER 90 58LBA9BDA9- GET_EMP_PROJ EMPLOYEE_PROJECT - GET_EMP_PROJ EMPLOYEE_PROJECT EMP_NO - GET_EMP_PROJ EMPLOYEE_PROJECT PROJ_ID - ADD_EMP_PROJ EMPLOYEE_PROJECT - ADD_EMP_PROJ EMPLOYEE_PROJECT EMP_NO - ADD_EMP_PROJ EMPLOYEE_PROJECT PROJ_ID - ADD_EMP_PROJ UNKNOWN_EMP_ID -SUB_TOT_BUDGET DEPARTMENT 90"x '} pRDB$703 } P  pRDB$702 P   pRDB$701    pRDB$700    pRDB$699  ] pRDB$698 ] pRDB$697  pRDB$696 \ pRDB$695 \ pRDB$694  pRDB$693 Q pRDB$692 Q pRDB$691 Y pRDB$690 Y pRDB$689  pRDB$688  pRDB$687  pRDB$686 w pRDB$685 w pRDB$684 P pRDB$683 90 909089123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567908912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345679089123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567908912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345679089123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567908912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345679089123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456_789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123459067891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234590678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345906789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123459067891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234590678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345906789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789907 Introdução  Introduçãofdb-1.4.9+dfsg1/test/testfdb.py0000644000215700017510000075111312544563755015201 0ustar rstuartit#coding:utf-8 # # PROGRAM/MODULE: fdb # FILE: testfdb.py # DESCRIPTION: Python driver for Firebird # CREATED: 12.10.2011 # # 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 Pavel Cisar # # Copyright (c) 2011 Pavel Cisar # and all contributors signed below. # # All Rights Reserved. # Contributor(s): Philippe Makowski # ______________________________________. # # See LICENSE.TXT for details. import unittest import datetime, decimal, types import fdb import fdb.ibase as ibase import fdb.schema as sm import sys, os import threading import time from decimal import Decimal from contextlib import closing if ibase.PYTHON_MAJOR_VER == 3: from io import StringIO, BytesIO else: from StringIO import StringIO BytesIO = StringIO # Change next definition to test FDB on databases with various ODS # Supported databases: fbtest20.fdb, fbtest21.fdb, fbtest25.fdb, fbtest30.fdb FBTEST_DB = 'fbtest25.fdb' # Default server host #FBTEST_HOST = '' FBTEST_HOST = 'localhost' # Default user FBTEST_USER = 'SYSDBA' # Default user password FBTEST_PASSWORD = 'masterkey' class SchemaVisitor(fdb.schema.SchemaVisitor): def __init__(self,test,action,follow='dependencies'): self.test = test self.seen = [] self.action = action self.follow = follow def default_action(self,obj): if not obj.issystemobject() and self.action in obj.actions: if self.follow == 'dependencies': for dependency in obj.get_dependencies(): d = dependency.depended_on if d and d not in self.seen: d.accept_visitor(self) elif self.follow == 'dependents': for dependency in obj.get_dependents(): d = dependency.dependent if d and d not in self.seen: d.accept_visitor(self) if obj not in self.seen: self.test.printout(obj.get_sql_for(self.action)) self.seen.append(obj) def visitSchema(self,schema): pass def visitMetadataItem(self,item): pass def visitTableColumn(self,column): column.table.accept_visitor(self) def visitViewColumn(self,column): column.view.accept_visitor(self) def visitDependency(self,dependency): pass def visitConstraint(self,constraint): pass def visitProcedureParameter(self,param): param.procedure.accept_visitor(self) def visitFunctionArgument(self,arg): arg.function.accept_visitor(self) def visitDatabaseFile(self,dbfile): pass def visitShadow(self,shadow): pass class FDBTestBase(unittest.TestCase): def __init__(self, methodName='runTest'): super(FDBTestBase,self).__init__(methodName) self.output = StringIO() def clear_output(self): self.output.close() self.output = StringIO() def show_output(self): sys.stdout.write(self.output.getvalue()) sys.stdout.flush() def printout(self,text='',newline=True): self.output.write(text) if newline: self.output.write('\n') self.output.flush() def printData(self,cur): """Print data from open cursor to stdout.""" # Print a header. for fieldDesc in cur.description: self.printout(fieldDesc[fdb.DESCRIPTION_NAME].ljust(fieldDesc[fdb.DESCRIPTION_DISPLAY_SIZE]),newline=False) self.printout() for fieldDesc in cur.description: self.printout("-" * max((len(fieldDesc[fdb.DESCRIPTION_NAME]),fieldDesc[fdb.DESCRIPTION_DISPLAY_SIZE])),newline=False) self.printout() # For each row, print the value of each field left-justified within # the maximum possible width of that field. fieldIndices = range(len(cur.description)) for row in cur: for fieldIndex in fieldIndices: fieldValue = str(row[fieldIndex]) fieldMaxWidth = max((len(cur.description[fieldIndex][fdb.DESCRIPTION_NAME]),cur.description[fieldIndex][fdb.DESCRIPTION_DISPLAY_SIZE])) self.printout(fieldValue.ljust(fieldMaxWidth),newline=False) self.printout() class TestCreateDrop(FDBTestBase): def setUp(self): self.cwd = os.getcwd() self.dbpath = os.path.join(self.cwd,'test') self.dbfile = os.path.join(self.dbpath,'droptest.fdb') if os.path.exists(self.dbfile): os.remove(self.dbfile) def test_create_drop(self): with closing(fdb.create_database(host=FBTEST_HOST,database=self.dbfile, user=FBTEST_USER,password=FBTEST_PASSWORD)) as con: con.drop_database() class TestConnection(FDBTestBase): def setUp(self): self.cwd = os.getcwd() self.dbpath = os.path.join(self.cwd,'test') self.dbfile = os.path.join(self.dbpath,FBTEST_DB) def tearDown(self): pass def test_connect(self): with closing(fdb.connect(dsn=self.dbfile,user=FBTEST_USER, password=FBTEST_PASSWORD)) as con: self.assertIsNotNone(con._db_handle) dpb = [1,0x1c,len(FBTEST_USER)] dpb.extend(ord(x) for x in FBTEST_USER) dpb.extend((0x1d,len(FBTEST_PASSWORD))) dpb.extend(ord(x) for x in FBTEST_PASSWORD) dpb.extend((ord('?'),1,3)) self.assertEqual(con._dpb,fdb.bs(dpb)) def test_properties(self): with closing(fdb.connect(dsn=self.dbfile,user=FBTEST_USER, password=FBTEST_PASSWORD)) as con: self.assertIn('Firebird',con.server_version) self.assertIn('Firebird',con.firebird_version) self.assertIsInstance(con.version,str) self.assertGreaterEqual(con.engine_version,2.0) self.assertGreaterEqual(con.ods,11.0) self.assertIsNone(con.group) self.assertIsNone(con.charset) self.assertEqual(len(con.transactions),2) self.assertIn(con.main_transaction,con.transactions) self.assertIn(con.query_transaction,con.transactions) self.assertEqual(con.default_tpb,fdb.ISOLATION_LEVEL_READ_COMMITED) self.assertIsInstance(con.schema,fdb.schema.Schema) self.assertFalse(con.closed) def test_connect_role(self): rolename = 'role' with closing(fdb.connect(dsn=self.dbfile,user=FBTEST_USER, password=FBTEST_PASSWORD,role=rolename)) as con: self.assertIsNotNone(con._db_handle) dpb = [1,0x1c,len(FBTEST_USER)] dpb.extend(ord(x) for x in FBTEST_USER) dpb.extend((0x1d,len(FBTEST_PASSWORD))) dpb.extend(ord(x) for x in FBTEST_PASSWORD) dpb.extend((ord('<'),len(rolename))) dpb.extend(ord(x) for x in rolename) dpb.extend((ord('?'),1,3)) self.assertEqual(con._dpb,fdb.bs(dpb)) def test_transaction(self): with closing(fdb.connect(dsn=self.dbfile,user=FBTEST_USER, password=FBTEST_PASSWORD)) as con: self.assertIsNotNone(con.main_transaction) self.assertFalse(con.main_transaction.active) self.assertFalse(con.main_transaction.closed) self.assertEqual(con.main_transaction.default_action,'commit') self.assertEqual(len(con.main_transaction._connections),1) self.assertEqual(con.main_transaction._connections[0](),con) con.begin() self.assertFalse(con.main_transaction.closed) con.commit() self.assertFalse(con.main_transaction.active) con.begin() con.rollback() self.assertFalse(con.main_transaction.active) con.begin() con.commit(retaining=True) self.assertTrue(con.main_transaction.active) con.rollback(retaining=True) self.assertTrue(con.main_transaction.active) tr = con.trans() self.assertIsInstance(tr,fdb.Transaction) self.assertFalse(con.main_transaction.closed) self.assertEqual(len(con.transactions),3) tr.begin() self.assertFalse(tr.closed) con.begin() con.close() self.assertFalse(con.main_transaction.active) self.assertTrue(con.main_transaction.closed) self.assertFalse(tr.active) self.assertTrue(tr.closed) def test_execute_immediate(self): with closing(fdb.connect(dsn=self.dbfile,user=FBTEST_USER, password=FBTEST_PASSWORD)) as con: con.execute_immediate("recreate table t (c1 integer)") con.commit() con.execute_immediate("delete from t") con.commit() def test_database_info(self): with closing(fdb.connect(dsn=self.dbfile,user=FBTEST_USER, password=FBTEST_PASSWORD)) as con: self.assertEqual(con.database_info(fdb.isc_info_db_read_only,'i'),0) self.assertEqual(con.database_info(fdb.isc_info_page_size,'i'),4096) self.assertEqual(con.database_info(fdb.isc_info_db_sql_dialect,'i'),3) def test_db_info(self): with closing(fdb.connect(dsn=self.dbfile,user=FBTEST_USER, password=FBTEST_PASSWORD)) as con: res = con.db_info([fdb.isc_info_page_size, fdb.isc_info_db_read_only, fdb.isc_info_db_sql_dialect,fdb.isc_info_user_names]) self.assertDictEqual(res,{53: {'SYSDBA': 1}, 62: 3, 14: 4096, 63: 0}) res = con.db_info(fdb.isc_info_read_seq_count) self.assertDictEqual(res,{0: 98, 1: 1}) class TestTransaction(FDBTestBase): def setUp(self): self.cwd = os.getcwd() self.dbpath = os.path.join(self.cwd,'test') self.dbfile = os.path.join(self.dbpath,FBTEST_DB) self.con = fdb.connect(host=FBTEST_HOST,database=self.dbfile, user=FBTEST_USER,password=FBTEST_PASSWORD) #self.con.execute_immediate("recreate table t (c1 integer)") #self.con.commit() def tearDown(self): self.con.execute_immediate("delete from t") self.con.commit() self.con.close() def test_cursor(self): tr = self.con.main_transaction tr.begin() cur = tr.cursor() cur.execute("insert into t (c1) values (1)") tr.commit() cur.execute("select * from t") rows = cur.fetchall() self.assertListEqual(rows,[(1,)]) cur.execute("delete from t") tr.commit() self.assertEqual(len(tr.cursors),1) self.assertIs(tr.cursors[0],cur) def test_context_manager(self): with fdb.TransactionContext(self.con) as tr: cur = tr.cursor() cur.execute("insert into t (c1) values (1)") cur.execute("select * from t") rows = cur.fetchall() self.assertListEqual(rows,[(1,)]) try: with fdb.TransactionContext(self.con) as tr: cur.execute("delete from t") raise Exception() except Exception as e: pass cur.execute("select * from t") rows = cur.fetchall() self.assertListEqual(rows,[(1,)]) with fdb.TransactionContext(self.con) as tr: cur.execute("delete from t") cur.execute("select * from t") rows = cur.fetchall() self.assertListEqual(rows,[]) def test_savepoint(self): self.con.begin() tr = self.con.main_transaction self.con.execute_immediate("insert into t (c1) values (1)") tr.savepoint('test') self.con.execute_immediate("insert into t (c1) values (2)") tr.rollback(savepoint='test') tr.commit() cur = tr.cursor() cur.execute("select * from t") rows = cur.fetchall() self.assertListEqual(rows,[(1,)]) def test_fetch_after_commit(self): self.con.execute_immediate("insert into t (c1) values (1)") self.con.commit() cur = self.con.cursor() cur.execute("select * from t") self.con.commit() with self.assertRaises(fdb.DatabaseError) as cm: rows = cur.fetchall() self.assertTupleEqual(cm.exception.args,('Cannot fetch from this cursor because it has not executed a statement.',)) def test_fetch_after_rollback(self): self.con.execute_immediate("insert into t (c1) values (1)") self.con.rollback() cur = self.con.cursor() cur.execute("select * from t") self.con.commit() with self.assertRaises(fdb.DatabaseError) as cm: rows = cur.fetchall() self.assertTupleEqual(cm.exception.args,('Cannot fetch from this cursor because it has not executed a statement.',)) def test_tpb(self): tpb = fdb.TPB() tpb.access_mode = fdb.isc_tpb_write tpb.isolation_level = fdb.isc_tpb_read_committed tpb.isolation_level = (fdb.isc_tpb_read_committed,fdb.isc_tpb_rec_version) tpb.lock_resolution = fdb.isc_tpb_wait tpb.lock_timeout = 10 tpb.table_reservation['COUNTRY'] = (fdb.isc_tpb_protected,fdb.isc_tpb_lock_write) tr = self.con.trans(tpb) tr.begin() tr.commit() def test_transaction_info(self): self.con.begin() tr = self.con.main_transaction info = tr.transaction_info(ibase.isc_info_tra_isolation,'s') self.assertEqual(info,'\x08\x02\x00\x03\x01') tr.commit() class TestDistributedTransaction(FDBTestBase): def setUp(self): self.cwd = os.getcwd() self.dbpath = os.path.join(self.cwd,'test') self.dbfile = os.path.join(self.dbpath,FBTEST_DB) self.db1 = os.path.join(self.dbpath,'fbtest-1.fdb') self.db2 = os.path.join(self.dbpath,'fbtest-2.fdb') if not os.path.exists(self.db1): self.con1 = fdb.create_database(host=FBTEST_HOST,database=self.db1, user=FBTEST_USER, password=FBTEST_PASSWORD) else: self.con1 = fdb.connect(host=FBTEST_HOST,database=self.db1, user=FBTEST_USER,password=FBTEST_PASSWORD) self.con1.execute_immediate("recreate table T (PK integer, C1 integer)") self.con1.commit() if not os.path.exists(self.db2): self.con2 = fdb.create_database(host=FBTEST_HOST,database=self.db2, user=FBTEST_USER, password=FBTEST_PASSWORD) else: self.con2 = fdb.connect(host=FBTEST_HOST,database=self.db2, user=FBTEST_USER,password=FBTEST_PASSWORD) self.con2.execute_immediate("recreate table T (PK integer, C1 integer)") self.con2.commit() def tearDown(self): if self.con1 and self.con1.group: # We can't drop database via connection in group self.con1.group.disband() if not self.con1: self.con1 = fdb.connect(host=FBTEST_HOST,database=self.db1, user=FBTEST_USER,password=FBTEST_PASSWORD) self.con1.drop_database() self.con1.close() if not self.con2: self.con2 = fdb.connect(host=FBTEST_HOST,database=self.db2, user=FBTEST_USER,password=FBTEST_PASSWORD) self.con2.drop_database() self.con2.close() def test_context_manager(self): cg = fdb.ConnectionGroup((self.con1,self.con2)) q = 'select * from T order by pk' c1 = cg.cursor(self.con1) cc1 = self.con1.cursor() p1 = cc1.prep(q) c2 = cg.cursor(self.con2) cc2 = self.con2.cursor() p2 = cc2.prep(q) # Distributed transaction: COMMIT with fdb.TransactionContext(cg): c1.execute('insert into t (pk) values (1)') c2.execute('insert into t (pk) values (1)') self.con1.commit() cc1.execute(p1) result = cc1.fetchall() self.assertListEqual(result,[(1, None)]) self.con2.commit() cc2.execute(p2) result = cc2.fetchall() self.assertListEqual(result,[(1, None)]) # Distributed transaction: ROLLBACK try: with fdb.TransactionContext(cg): c1.execute('insert into t (pk) values (2)') c2.execute('insert into t (pk) values (2)') raise Exception() except Exception as e: pass c1.execute(q) result = c1.fetchall() self.assertListEqual(result,[(1, None)]) c2.execute(q) result = c2.fetchall() self.assertListEqual(result,[(1, None)]) cg.disband() def test_simple_dt(self): cg = fdb.ConnectionGroup((self.con1,self.con2)) self.assertEqual(self.con1.group,cg) self.assertEqual(self.con2.group,cg) q = 'select * from T order by pk' c1 = cg.cursor(self.con1) cc1 = self.con1.cursor() p1 = cc1.prep(q) c2 = cg.cursor(self.con2) cc2 = self.con2.cursor() p2 = cc2.prep(q) # Distributed transaction: COMMIT c1.execute('insert into t (pk) values (1)') c2.execute('insert into t (pk) values (1)') cg.commit() self.con1.commit() cc1.execute(p1) result = cc1.fetchall() self.assertListEqual(result,[(1, None)]) self.con2.commit() cc2.execute(p2) result = cc2.fetchall() self.assertListEqual(result,[(1, None)]) # Distributed transaction: PREPARE+COMMIT c1.execute('insert into t (pk) values (2)') c2.execute('insert into t (pk) values (2)') cg.prepare() cg.commit() self.con1.commit() cc1.execute(p1) result = cc1.fetchall() self.assertListEqual(result,[(1, None), (2, None)]) self.con2.commit() cc2.execute(p2) result = cc2.fetchall() self.assertListEqual(result,[(1, None), (2, None)]) # Distributed transaction: SAVEPOINT+ROLLBACK to it c1.execute('insert into t (pk) values (3)') cg.savepoint('CG_SAVEPOINT') c2.execute('insert into t (pk) values (3)') cg.rollback(savepoint='CG_SAVEPOINT') c1.execute(q) result = c1.fetchall() self.assertListEqual(result,[(1, None), (2, None), (3, None)]) c2.execute(q) result = c2.fetchall() self.assertListEqual(result,[(1, None), (2, None)]) # Distributed transaction: ROLLBACK cg.rollback() self.con1.commit() cc1.execute(p1) result = cc1.fetchall() self.assertListEqual(result,[(1, None), (2, None)]) self.con2.commit() cc2.execute(p2) result = cc2.fetchall() self.assertListEqual(result,[(1, None), (2, None)]) # Distributed transaction: EXECUTE_IMMEDIATE cg.execute_immediate('insert into t (pk) values (3)') cg.commit() self.con1.commit() cc1.execute(p1) result = cc1.fetchall() self.assertListEqual(result,[(1, None), (2, None), (3, None)]) self.con2.commit() cc2.execute(p2) result = cc2.fetchall() self.assertListEqual(result,[(1, None), (2, None), (3, None)]) cg.disband() self.assertIsNone(self.con1.group) self.assertIsNone(self.con2.group) def test_limbo_transactions(self): cg = fdb.ConnectionGroup((self.con1,self.con2)) svc = fdb.services.connect(host=FBTEST_HOST,password=FBTEST_PASSWORD) ids1 = svc.get_limbo_transaction_ids(self.db1) self.assertEqual(ids1,[]) ids2 = svc.get_limbo_transaction_ids(self.db2) self.assertEqual(ids2,[]) cg.execute_immediate('insert into t (pk) values (3)') cg.prepare() # Force out both connections self.con1._set_group(None) cg._cons.remove(self.con1) del self.con1 self.con1 = None self.con2._set_group(None) cg._cons.remove(self.con2) del self.con2 self.con2 = None # Disband will raise an error with self.assertRaises(fdb.DatabaseError) as cm: cg.disband() self.assertTupleEqual(cm.exception.args, ('Error while rolling back transaction:\n- SQLCODE: -901\n- invalid transaction handle (expecting explicit transaction start)', -901, 335544332)) ids1 = svc.get_limbo_transaction_ids(self.db1) id1 = ids1[0] ids2 = svc.get_limbo_transaction_ids(self.db2) id2 = ids2[0] # Data chould be blocked by limbo transaction if not self.con1: self.con1 = fdb.connect(dsn=self.db1,user=FBTEST_USER, password=FBTEST_PASSWORD) if not self.con2: self.con2 = fdb.connect(dsn=self.db2,user=FBTEST_USER, password=FBTEST_PASSWORD) c1 = self.con1.cursor() c1.execute('select * from t') with self.assertRaises(fdb.DatabaseError) as cm: row = c1.fetchall() self.assertTupleEqual(cm.exception.args, ('Cursor.fetchone:\n- SQLCODE: -911\n- record from transaction %i is stuck in limbo' % id1, -911, 335544459)) c2 = self.con2.cursor() c2.execute('select * from t') with self.assertRaises(fdb.DatabaseError) as cm: row = c2.fetchall() self.assertTupleEqual(cm.exception.args, ('Cursor.fetchone:\n- SQLCODE: -911\n- record from transaction %i is stuck in limbo' % id2, -911, 335544459)) # resolve via service svc = fdb.services.connect(host=FBTEST_HOST,password=FBTEST_PASSWORD) svc.commit_limbo_transaction(self.db1,id1) svc.rollback_limbo_transaction(self.db2,id2) # check the resolution c1 = self.con1.cursor() c1.execute('select * from t') row = c1.fetchall() self.assertListEqual(row,[(3, None)]) c2 = self.con2.cursor() c2.execute('select * from t') row = c2.fetchall() self.assertListEqual(row,[]) svc.close() class TestCursor(FDBTestBase): def setUp(self): self.cwd = os.getcwd() self.dbpath = os.path.join(self.cwd,'test') self.dbfile = os.path.join(self.dbpath,FBTEST_DB) self.con = fdb.connect(host=FBTEST_HOST,database=self.dbfile, user=FBTEST_USER,password=FBTEST_PASSWORD) #self.con.execute_immediate("recreate table t (c1 integer)") #self.con.commit() def tearDown(self): self.con.execute_immediate("delete from t") self.con.commit() self.con.close() def test_iteration(self): data = [('USA', 'Dollar'), ('England', 'Pound'), ('Canada', 'CdnDlr'), ('Switzerland', 'SFranc'), ('Japan', 'Yen'), ('Italy', 'Lira'), ('France', 'FFranc'), ('Germany', 'D-Mark'), ('Australia', 'ADollar'), ('Hong Kong', 'HKDollar'), ('Netherlands', 'Guilder'), ('Belgium', 'BFranc'), ('Austria', 'Schilling'), ('Fiji', 'FDollar')] cur = self.con.cursor() cur.execute('select * from country') rows = [row for row in cur] self.assertEqual(len(rows),14) self.assertListEqual(rows, [('USA', 'Dollar'), ('England', 'Pound'), ('Canada', 'CdnDlr'), ('Switzerland', 'SFranc'), ('Japan', 'Yen'), ('Italy', 'Lira'), ('France', 'FFranc'), ('Germany', 'D-Mark'), ('Australia', 'ADollar'), ('Hong Kong', 'HKDollar'), ('Netherlands', 'Guilder'), ('Belgium', 'BFranc'), ('Austria', 'Schilling'), ('Fiji', 'FDollar')]) cur.execute('select * from country') rows = [] for row in cur: rows.append(row) self.assertEqual(len(rows),14) self.assertListEqual(rows, [('USA', 'Dollar'), ('England', 'Pound'), ('Canada', 'CdnDlr'), ('Switzerland', 'SFranc'), ('Japan', 'Yen'), ('Italy', 'Lira'), ('France', 'FFranc'), ('Germany', 'D-Mark'), ('Australia', 'ADollar'), ('Hong Kong', 'HKDollar'), ('Netherlands', 'Guilder'), ('Belgium', 'BFranc'), ('Austria', 'Schilling'), ('Fiji', 'FDollar')]) cur.execute('select * from country') i = 0 for row in cur: i += 1 self.assertIn(row,data) self.assertEqual(i,14) def test_description(self): cur = self.con.cursor() cur.execute('select * from country') self.assertEqual(len(cur.description),2) if ibase.PYTHON_MAJOR_VER==3: self.assertEqual(repr(cur.description), "(('COUNTRY', , 15, 15, 0, 0, False), " \ "('CURRENCY', , 10, 10, 0, 0, False))") else: self.assertEqual(repr(cur.description), "(('COUNTRY', , 15, 15, 0, 0, False), " \ "('CURRENCY', , 10, 10, 0, 0, False))") cur.execute('select country as CT, currency as CUR from country') self.assertEqual(len(cur.description),2) cur.execute('select * from customer') if ibase.PYTHON_MAJOR_VER==3: self.assertEqual(repr(cur.description), "(('CUST_NO', , 11, 4, 0, 0, False), " \ "('CUSTOMER', , 25, 25, 0, 0, False), " \ "('CONTACT_FIRST', , 15, 15, 0, 0, True), " \ "('CONTACT_LAST', , 20, 20, 0, 0, True), " \ "('PHONE_NO', , 20, 20, 0, 0, True), " \ "('ADDRESS_LINE1', , 30, 30, 0, 0, True), " \ "('ADDRESS_LINE2', , 30, 30, 0, 0, True), " \ "('CITY', , 25, 25, 0, 0, True), " \ "('STATE_PROVINCE', , 15, 15, 0, 0, True), " \ "('COUNTRY', , 15, 15, 0, 0, True), " \ "('POSTAL_CODE', , 12, 12, 0, 0, True), " \ "('ON_HOLD', , 1, 1, 0, 0, True))") else: self.assertEqual(repr(cur.description), "(('CUST_NO', , 11, 4, 0, 0, False), " \ "('CUSTOMER', , 25, 25, 0, 0, False), " \ "('CONTACT_FIRST', , 15, 15, 0, 0, True), " \ "('CONTACT_LAST', , 20, 20, 0, 0, True), " \ "('PHONE_NO', , 20, 20, 0, 0, True), " \ "('ADDRESS_LINE1', , 30, 30, 0, 0, True), " \ "('ADDRESS_LINE2', , 30, 30, 0, 0, True), " \ "('CITY', , 25, 25, 0, 0, True), " \ "('STATE_PROVINCE', , 15, 15, 0, 0, True), " \ "('COUNTRY', , 15, 15, 0, 0, True), " \ "('POSTAL_CODE', , 12, 12, 0, 0, True), " \ "('ON_HOLD', , 1, 1, 0, 0, True))") cur.execute('select * from job') if ibase.PYTHON_MAJOR_VER==3: self.assertEqual(repr(cur.description), "(('JOB_CODE', , 5, 5, 0, 0, False), " \ "('JOB_GRADE', , 6, 2, 0, 0, False), " \ "('JOB_COUNTRY', , 15, 15, 0, 0, False), " \ "('JOB_TITLE', , 25, 25, 0, 0, False), " \ "('MIN_SALARY', , 20, 8, 10, -2, False), " \ "('MAX_SALARY', , 20, 8, 10, -2, False), " \ "('JOB_REQUIREMENT', , 0, 8, 0, 1, True), " \ "('LANGUAGE_REQ', , -1, 8, 0, 0, True))") else: self.assertEqual(repr(cur.description), "(('JOB_CODE', , 5, 5, 0, 0, False), " \ "('JOB_GRADE', , 6, 2, 0, 0, False), " \ "('JOB_COUNTRY', , 15, 15, 0, 0, False), " \ "('JOB_TITLE', , 25, 25, 0, 0, False), " \ "('MIN_SALARY', , 20, 8, 10, -2, False), " \ "('MAX_SALARY', , 20, 8, 10, -2, False), " \ "('JOB_REQUIREMENT', , 0, 8, 0, 1, True), " \ "('LANGUAGE_REQ', , -1, 8, 0, 0, True))") cur.execute('select * from proj_dept_budget') if ibase.PYTHON_MAJOR_VER==3: self.assertEqual(repr(cur.description), "(('FISCAL_YEAR', , 11, 4, 0, 0, False), " \ "('PROJ_ID', , 5, 5, 0, 0, False), " \ "('DEPT_NO', , 3, 3, 0, 0, False), " \ "('QUART_HEAD_CNT', , -1, 8, 0, 0, True), " \ "('PROJECTED_BUDGET', , 20, 8, 12, -2, True))") else: self.assertEqual(repr(cur.description), "(('FISCAL_YEAR', , 11, 4, 0, 0, False), " \ "('PROJ_ID', , 5, 5, 0, 0, False), " \ "('DEPT_NO', , 3, 3, 0, 0, False), " \ "('QUART_HEAD_CNT', , -1, 8, 0, 0, True), " \ "('PROJECTED_BUDGET', , 20, 8, 12, -2, True))") # Check for precision cache cur2 = self.con.cursor() cur2.execute('select * from proj_dept_budget') if ibase.PYTHON_MAJOR_VER==3: self.assertEqual(repr(cur2.description), "(('FISCAL_YEAR', , 11, 4, 0, 0, False), " \ "('PROJ_ID', , 5, 5, 0, 0, False), " \ "('DEPT_NO', , 3, 3, 0, 0, False), " \ "('QUART_HEAD_CNT', , -1, 8, 0, 0, True), " \ "('PROJECTED_BUDGET', , 20, 8, 12, -2, True))") else: self.assertEqual(repr(cur2.description), "(('FISCAL_YEAR', , 11, 4, 0, 0, False), " \ "('PROJ_ID', , 5, 5, 0, 0, False), " \ "('DEPT_NO', , 3, 3, 0, 0, False), " \ "('QUART_HEAD_CNT', , -1, 8, 0, 0, True), " \ "('PROJECTED_BUDGET', , 20, 8, 12, -2, True))") def test_exec_after_close(self): cur = self.con.cursor() cur.execute('select * from country') row = cur.fetchone() self.assertTupleEqual(row,('USA', 'Dollar')) cur.close() cur.execute('select * from country') row = cur.fetchone() self.assertTupleEqual(row,('USA', 'Dollar')) def test_fetchone(self): cur = self.con.cursor() cur.execute('select * from country') row = cur.fetchone() self.assertTupleEqual(row,('USA', 'Dollar')) def test_fetchall(self): cur = self.con.cursor() cur.execute('select * from country') rows = cur.fetchall() self.assertListEqual(rows, [('USA', 'Dollar'), ('England', 'Pound'), ('Canada', 'CdnDlr'), ('Switzerland', 'SFranc'), ('Japan', 'Yen'), ('Italy', 'Lira'), ('France', 'FFranc'), ('Germany', 'D-Mark'), ('Australia', 'ADollar'), ('Hong Kong', 'HKDollar'), ('Netherlands', 'Guilder'), ('Belgium', 'BFranc'), ('Austria', 'Schilling'), ('Fiji', 'FDollar')]) def test_fetchmany(self): cur = self.con.cursor() cur.execute('select * from country') rows = cur.fetchmany(10) self.assertListEqual(rows, [('USA', 'Dollar'), ('England', 'Pound'), ('Canada', 'CdnDlr'), ('Switzerland', 'SFranc'), ('Japan', 'Yen'), ('Italy', 'Lira'), ('France', 'FFranc'), ('Germany', 'D-Mark'), ('Australia', 'ADollar'), ('Hong Kong', 'HKDollar')]) rows = cur.fetchmany(10) self.assertListEqual(rows, [('Netherlands', 'Guilder'), ('Belgium', 'BFranc'), ('Austria', 'Schilling'), ('Fiji', 'FDollar')]) rows = cur.fetchmany(10) self.assertEqual(len(rows),0) def test_fetchonemap(self): cur = self.con.cursor() cur.execute('select * from country') row = cur.fetchonemap() self.assertListEqual(row.items(),[('COUNTRY', 'USA'), ('CURRENCY', 'Dollar')]) def test_fetchallmap(self): cur = self.con.cursor() cur.execute('select * from country') rows = cur.fetchallmap() self.assertListEqual([row.items() for row in rows], [[('COUNTRY', 'USA'), ('CURRENCY', 'Dollar')], [('COUNTRY', 'England'), ('CURRENCY', 'Pound')], [('COUNTRY', 'Canada'), ('CURRENCY', 'CdnDlr')], [('COUNTRY', 'Switzerland'), ('CURRENCY', 'SFranc')], [('COUNTRY', 'Japan'), ('CURRENCY', 'Yen')], [('COUNTRY', 'Italy'), ('CURRENCY', 'Lira')], [('COUNTRY', 'France'), ('CURRENCY', 'FFranc')], [('COUNTRY', 'Germany'), ('CURRENCY', 'D-Mark')], [('COUNTRY', 'Australia'), ('CURRENCY', 'ADollar')], [('COUNTRY', 'Hong Kong'), ('CURRENCY', 'HKDollar')], [('COUNTRY', 'Netherlands'), ('CURRENCY', 'Guilder')], [('COUNTRY', 'Belgium'), ('CURRENCY', 'BFranc')], [('COUNTRY', 'Austria'), ('CURRENCY', 'Schilling')], [('COUNTRY', 'Fiji'), ('CURRENCY', 'FDollar')]]) def test_fetchmanymap(self): cur = self.con.cursor() cur.execute('select * from country') rows = cur.fetchmanymap(10) self.assertListEqual([row.items() for row in rows], [[('COUNTRY', 'USA'), ('CURRENCY', 'Dollar')], [('COUNTRY', 'England'), ('CURRENCY', 'Pound')], [('COUNTRY', 'Canada'), ('CURRENCY', 'CdnDlr')], [('COUNTRY', 'Switzerland'), ('CURRENCY', 'SFranc')], [('COUNTRY', 'Japan'), ('CURRENCY', 'Yen')], [('COUNTRY', 'Italy'), ('CURRENCY', 'Lira')], [('COUNTRY', 'France'), ('CURRENCY', 'FFranc')], [('COUNTRY', 'Germany'), ('CURRENCY', 'D-Mark')], [('COUNTRY', 'Australia'), ('CURRENCY', 'ADollar')], [('COUNTRY', 'Hong Kong'), ('CURRENCY', 'HKDollar')]]) rows = cur.fetchmanymap(10) self.assertListEqual([row.items() for row in rows], [[('COUNTRY', 'Netherlands'), ('CURRENCY', 'Guilder')], [('COUNTRY', 'Belgium'), ('CURRENCY', 'BFranc')], [('COUNTRY', 'Austria'), ('CURRENCY', 'Schilling')], [('COUNTRY', 'Fiji'), ('CURRENCY', 'FDollar')]]) rows = cur.fetchmany(10) self.assertEqual(len(rows),0) def test_rowcount(self): cur = self.con.cursor() self.assertEqual(cur.rowcount,-1) cur.execute('select * from project') self.assertEqual(cur.rowcount,0) cur.fetchone() rcount = 1 if FBTEST_HOST == '' and self.con.engine_version >= 3.0 else 6 self.assertEqual(cur.rowcount,rcount) def test_name(self): def assign_name(): cur.name = 'testx' cur = self.con.cursor() self.assertIsNone(cur.name) self.assertRaises(fdb.ProgrammingError,assign_name) cur.execute('select * from country') cur.name = 'test' self.assertEqual(cur.name,'test') self.assertRaises(fdb.ProgrammingError,assign_name) def test_use_after_close(self): cmd = 'select * from country' cur = self.con.cursor() cur.execute(cmd) cur.close() cur.execute(cmd) row = cur.fetchone() self.assertTupleEqual(row,('USA', 'Dollar')) class TestPreparedStatement(FDBTestBase): def setUp(self): self.cwd = os.getcwd() self.dbpath = os.path.join(self.cwd,'test') self.dbfile = os.path.join(self.dbpath,FBTEST_DB) self.con = fdb.connect(host=FBTEST_HOST,database=self.dbfile, user=FBTEST_USER,password=FBTEST_PASSWORD) #self.con.execute_immediate("recreate table t (c1 integer)") #self.con.commit() def tearDown(self): self.con.execute_immediate("delete from t") self.con.commit() self.con.close() def test_basic(self): cur = self.con.cursor() ps = cur.prep('select * from country') self.assertEqual(ps._in_sqlda.sqln,10) self.assertEqual(ps._in_sqlda.sqld,0) self.assertEqual(ps._out_sqlda.sqln,10) self.assertEqual(ps._out_sqlda.sqld,2) self.assertEqual(ps.statement_type,1) self.assertEqual(ps.sql,'select * from country') def test_get_plan(self): cur = self.con.cursor() ps = cur.prep('select * from job') self.assertEqual(ps.plan,"PLAN (JOB NATURAL)") def test_execution(self): cur = self.con.cursor() ps = cur.prep('select * from country') cur.execute(ps) row = cur.fetchone() self.assertTupleEqual(row,('USA', 'Dollar')) def test_wrong_cursor(self): cur = self.con.cursor() cur2 = self.con.cursor() ps = cur.prep('select * from country') with self.assertRaises(ValueError) as cm: cur2.execute(ps) self.assertTupleEqual(cm.exception.args, ('PreparedStatement was created by different Cursor.',)) class TestArrays(FDBTestBase): def setUp(self): self.cwd = os.getcwd() self.dbpath = os.path.join(self.cwd,'test') self.dbfile = os.path.join(self.dbpath,FBTEST_DB) self.con = fdb.connect(host=FBTEST_HOST,database=self.dbfile, user=FBTEST_USER,password=FBTEST_PASSWORD) tbl = """recreate table AR (c1 integer, c2 integer[1:4,0:3,1:2], c3 varchar(15)[0:5,1:2], c4 char(5)[5], c5 timestamp[2], c6 time[2], c7 decimal(10,2)[2], c8 numeric(10,2)[2], c9 smallint[2], c10 bigint[2], c11 float[2], c12 double precision[2], c13 decimal(10,1)[2], c14 decimal(10,5)[2], c15 decimal(18,5)[2] ) """ # self.c2 = [[[1, 1], [2, 2], [3, 3], [4, 4]], [[5, 5], [6, 6], [7, 7], [8, 8]], [[9, 9], [10, 10], [11, 11], [12, 12]], [[13, 13], [14, 14], [15, 15], [16, 16]]] self.c3 = [['a', 'a'], ['bb', 'bb'], ['ccc', 'ccc'], ['dddd', 'dddd'], ['eeeee', 'eeeee'], ['fffffff78901234', 'fffffff78901234']] self.c4 = ['a ', 'bb ', 'ccc ', 'dddd ', 'eeeee'] self.c5 = [datetime.datetime(2012, 11, 22, 12, 8, 24, 474800), datetime.datetime(2012, 11, 22, 12, 8, 24, 474800)] self.c6 = [datetime.time(12, 8, 24, 474800), datetime.time(12, 8, 24, 474800)] self.c7 = [decimal.Decimal('10.22'), decimal.Decimal('100000.33')] self.c8 = [decimal.Decimal('10.22'), decimal.Decimal('100000.33')] self.c9 = [1, 0] self.c10 = [5555555, 7777777] self.c11 = [3.140000104904175, 3.140000104904175] self.c12 = [3.14, 3.14] self.c13 = [decimal.Decimal('10.2'), decimal.Decimal('100000.3')] self.c14 = [decimal.Decimal('10.22222'), decimal.Decimal('100000.333')] self.c15 = [decimal.Decimal('1000000000000.22222'), decimal.Decimal('1000000000000.333')] #self.con.execute_immediate(tbl) #self.con.commit() def tearDown(self): self.con.execute_immediate("delete from AR where c1>=100") self.con.commit() self.con.close() def test_basic(self): cur = self.con.cursor() cur.execute("select LANGUAGE_REQ from job "\ "where job_code='Eng' and job_grade=3 and job_country='Japan'") row = cur.fetchone() self.assertTupleEqual(row, (['Japanese\n', 'Mandarin\n', 'English\n', '\n', '\n'],)) cur.execute('select QUART_HEAD_CNT from proj_dept_budget') row = cur.fetchall() self.assertListEqual(row, [([1, 1, 1, 0],), ([3, 2, 1, 0],), ([0, 0, 0, 1],), ([2, 1, 0, 0],), ([1, 1, 0, 0],), ([1, 1, 0, 0],), ([1, 1, 1, 1],), ([2, 3, 2, 1],), ([1, 1, 2, 2],), ([1, 1, 1, 2],), ([1, 1, 1, 2],), ([4, 5, 6, 6],), ([2, 2, 0, 3],), ([1, 1, 2, 2],), ([7, 7, 4, 4],), ([2, 3, 3, 3],), ([4, 5, 6, 6],), ([1, 1, 1, 1],), ([4, 5, 5, 3],), ([4, 3, 2, 2],), ([2, 2, 2, 1],), ([1, 1, 2, 3],), ([3, 3, 1, 1],), ([1, 1, 0, 0],)]) def test_read_full(self): cur = self.con.cursor() cur.execute("select c1,c2 from ar where c1=2") row = cur.fetchone() self.assertListEqual(row[1],self.c2) cur.execute("select c1,c3 from ar where c1=3") row = cur.fetchone() self.assertListEqual(row[1],self.c3) cur.execute("select c1,c4 from ar where c1=4") row = cur.fetchone() self.assertListEqual(row[1],self.c4) cur.execute("select c1,c5 from ar where c1=5") row = cur.fetchone() self.assertListEqual(row[1],self.c5) cur.execute("select c1,c6 from ar where c1=6") row = cur.fetchone() self.assertListEqual(row[1],self.c6) cur.execute("select c1,c7 from ar where c1=7") row = cur.fetchone() self.assertListEqual(row[1],self.c7) cur.execute("select c1,c8 from ar where c1=8") row = cur.fetchone() self.assertListEqual(row[1],self.c8) cur.execute("select c1,c9 from ar where c1=9") row = cur.fetchone() self.assertListEqual(row[1],self.c9) cur.execute("select c1,c10 from ar where c1=10") row = cur.fetchone() self.assertListEqual(row[1],self.c10) cur.execute("select c1,c11 from ar where c1=11") row = cur.fetchone() self.assertListEqual(row[1],self.c11) cur.execute("select c1,c12 from ar where c1=12") row = cur.fetchone() self.assertListEqual(row[1],self.c12) cur.execute("select c1,c13 from ar where c1=13") row = cur.fetchone() self.assertListEqual(row[1],self.c13) cur.execute("select c1,c14 from ar where c1=14") row = cur.fetchone() self.assertListEqual(row[1],self.c14) cur.execute("select c1,c15 from ar where c1=15") row = cur.fetchone() self.assertListEqual(row[1],self.c15) def test_write_full(self): cur = self.con.cursor() # INTEGER cur.execute("insert into ar (c1,c2) values (102,?)",[self.c2]) self.con.commit() cur.execute("select c1,c2 from ar where c1=102") row = cur.fetchone() self.assertListEqual(row[1],self.c2) # VARCHAR cur.execute("insert into ar (c1,c3) values (103,?)",[self.c3]) self.con.commit() cur.execute("select c1,c3 from ar where c1=103") row = cur.fetchone() self.assertListEqual(row[1],self.c3) cur.execute("insert into ar (c1,c3) values (103,?)",[tuple(self.c3)]) self.con.commit() cur.execute("select c1,c3 from ar where c1=103") row = cur.fetchone() self.assertListEqual(row[1],self.c3) # CHAR cur.execute("insert into ar (c1,c4) values (104,?)",[self.c4]) self.con.commit() cur.execute("select c1,c4 from ar where c1=104") row = cur.fetchone() self.assertListEqual(row[1],self.c4) # TIMESTAMP cur.execute("insert into ar (c1,c5) values (105,?)",[self.c5]) self.con.commit() cur.execute("select c1,c5 from ar where c1=105") row = cur.fetchone() self.assertListEqual(row[1],self.c5) # TIME OK cur.execute("insert into ar (c1,c6) values (106,?)",[self.c6]) self.con.commit() cur.execute("select c1,c6 from ar where c1=106") row = cur.fetchone() self.assertListEqual(row[1],self.c6) # DECIMAL(10,2) cur.execute("insert into ar (c1,c7) values (107,?)",[self.c7]) self.con.commit() cur.execute("select c1,c7 from ar where c1=107") row = cur.fetchone() self.assertListEqual(row[1],self.c7) # NUMERIC(10,2) cur.execute("insert into ar (c1,c8) values (108,?)",[self.c8]) self.con.commit() cur.execute("select c1,c8 from ar where c1=108") row = cur.fetchone() self.assertListEqual(row[1],self.c8) # SMALLINT cur.execute("insert into ar (c1,c9) values (109,?)",[self.c9]) self.con.commit() cur.execute("select c1,c9 from ar where c1=109") row = cur.fetchone() self.assertListEqual(row[1],self.c9) # BIGINT cur.execute("insert into ar (c1,c10) values (110,?)",[self.c10]) self.con.commit() cur.execute("select c1,c10 from ar where c1=110") row = cur.fetchone() self.assertListEqual(row[1],self.c10) # FLOAT cur.execute("insert into ar (c1,c11) values (111,?)",[self.c11]) self.con.commit() cur.execute("select c1,c11 from ar where c1=111") row = cur.fetchone() self.assertListEqual(row[1],self.c11) # DOUBLE PRECISION cur.execute("insert into ar (c1,c12) values (112,?)",[self.c12]) self.con.commit() cur.execute("select c1,c12 from ar where c1=112") row = cur.fetchone() self.assertListEqual(row[1],self.c12) # DECIMAL(10,1) OK cur.execute("insert into ar (c1,c13) values (113,?)",[self.c13]) self.con.commit() cur.execute("select c1,c13 from ar where c1=113") row = cur.fetchone() self.assertListEqual(row[1],self.c13) # DECIMAL(10,5) cur.execute("insert into ar (c1,c14) values (114,?)",[self.c14]) self.con.commit() cur.execute("select c1,c14 from ar where c1=114") row = cur.fetchone() self.assertListEqual(row[1],self.c14) # DECIMAL(18,5) cur.execute("insert into ar (c1,c15) values (115,?)",[self.c15]) self.con.commit() cur.execute("select c1,c15 from ar where c1=115") row = cur.fetchone() self.assertListEqual(row[1],self.c15) def test_write_wrong(self): cur = self.con.cursor() with self.assertRaises(ValueError) as cm: cur.execute("insert into ar (c1,c2) values (102,?)",[self.c3]) self.assertTupleEqual(cm.exception.args,('Incorrect ARRAY field value.',)) with self.assertRaises(ValueError) as cm: cur.execute("insert into ar (c1,c2) values (102,?)",[self.c2[:-1]]) self.assertTupleEqual(cm.exception.args,('Incorrect ARRAY field value.',)) class TestInsertData(FDBTestBase): def setUp(self): self.cwd = os.getcwd() self.dbpath = os.path.join(self.cwd,'test') self.dbfile = os.path.join(self.dbpath,FBTEST_DB) self.con = fdb.connect(host=FBTEST_HOST,database=self.dbfile, user=FBTEST_USER,password=FBTEST_PASSWORD) self.con2 = fdb.connect(host=FBTEST_HOST,database=self.dbfile, user=FBTEST_USER,password=FBTEST_PASSWORD, charset='utf-8') #self.con.execute_immediate("recreate table t (c1 integer)") #self.con.commit() #self.con.execute_immediate("RECREATE TABLE T2 (C1 Smallint,C2 Integer,C3 Bigint,C4 Char(5),C5 Varchar(10),C6 Date,C7 Time,C8 Timestamp,C9 Blob sub_type 1,C10 Numeric(18,2),C11 Decimal(18,2),C12 Float,C13 Double precision,C14 Numeric(8,4),C15 Decimal(8,4))") #self.con.commit() def tearDown(self): self.con2.close() self.con.execute_immediate("delete from t") self.con.execute_immediate("delete from t2") self.con.commit() self.con.close() def test_insert_integers(self): cur = self.con.cursor() cur.execute('insert into T2 (C1,C2,C3) values (?,?,?)',[1,1,1]) self.con.commit() cur.execute('select C1,C2,C3 from T2 where C1 = 1') rows = cur.fetchall() self.assertListEqual(rows,[(1, 1, 1)]) cur.execute('insert into T2 (C1,C2,C3) values (?,?,?)', [2,1,9223372036854775807]) cur.execute('insert into T2 (C1,C2,C3) values (?,?,?)', [2,1,-9223372036854775807-1]) self.con.commit() cur.execute('select C1,C2,C3 from T2 where C1 = 2') rows = cur.fetchall() self.assertListEqual(rows, [(2, 1, 9223372036854775807), (2, 1, -9223372036854775808)]) def test_insert_char_varchar(self): cur = self.con.cursor() cur.execute('insert into T2 (C1,C4,C5) values (?,?,?)',[2,'AA','AA']) self.con.commit() cur.execute('select C1,C4,C5 from T2 where C1 = 2') rows = cur.fetchall() self.assertListEqual(rows,[(2, 'AA ', 'AA')]) # Too long values with self.assertRaises(ValueError) as cm: cur.execute('insert into T2 (C1,C4) values (?,?)',[3,'123456']) self.con.commit() self.assertTupleEqual(cm.exception.args, ('Value of parameter (1) is too long, expected 5, found 6',)) with self.assertRaises(ValueError) as cm: cur.execute('insert into T2 (C1,C5) values (?,?)',[3,'12345678901']) self.con.commit() self.assertTupleEqual(cm.exception.args, ('Value of parameter (1) is too long, expected 10, found 11',)) def test_insert_datetime(self): cur = self.con.cursor() now = datetime.datetime(2011,11,13,15,00,1,200) cur.execute('insert into T2 (C1,C6,C7,C8) values (?,?,?,?)',[3,now.date(),now.time(),now]) self.con.commit() cur.execute('select C1,C6,C7,C8 from T2 where C1 = 3') rows = cur.fetchall() self.assertListEqual(rows, [(3, datetime.date(2011, 11, 13), datetime.time(15, 0, 1, 200), datetime.datetime(2011, 11, 13, 15, 0, 1, 200))]) cur.execute('insert into T2 (C1,C6,C7,C8) values (?,?,?,?)',[4,'2011-11-13','15:0:1:200','2011-11-13 15:0:1:200']) self.con.commit() cur.execute('select C1,C6,C7,C8 from T2 where C1 = 4') rows = cur.fetchall() self.assertListEqual(rows, [(4, datetime.date(2011, 11, 13), datetime.time(15, 0, 1, 200000), datetime.datetime(2011, 11, 13, 15, 0, 1, 200000))]) def test_insert_blob(self): cur = self.con.cursor() cur2 = self.con2.cursor() cur.execute('insert into T2 (C1,C9) values (?,?)',[4,'This is a BLOB!']) cur.transaction.commit() cur.execute('select C1,C9 from T2 where C1 = 4') rows = cur.fetchall() self.assertListEqual(rows,[(4, 'This is a BLOB!')]) # Non-textual BLOB blob_data = fdb.bs([0,1,2,3,4,5,6,7,8,9,10]) cur.execute('insert into T2 (C1,C16) values (?,?)',[8,blob_data]) cur.transaction.commit() cur.execute('select C1,C16 from T2 where C1 = 8') rows = cur.fetchall() self.assertListEqual(rows,[(8, blob_data)]) # BLOB bigger than max. segment size big_blob = '123456789' * 10000 cur.execute('insert into T2 (C1,C9) values (?,?)',[5,big_blob]) cur.transaction.commit() cur.execute('select C1,C9 from T2 where C1 = 5') row = cur.fetchone() self.assertEqual(row[1],big_blob) # Unicode in BLOB blob_text = 'This is a BLOB!' if not isinstance(blob_text,ibase.myunicode): blob_text = blob_text.decode('utf-8') cur2.execute('insert into T2 (C1,C9) values (?,?)',[6,blob_text]) cur2.transaction.commit() cur2.execute('select C1,C9 from T2 where C1 = 6') rows = cur2.fetchall() self.assertListEqual(rows,[(6, blob_text)]) # Unicode non-textual BLOB with self.assertRaises(TypeError) as cm: cur2.execute('insert into T2 (C1,C16) values (?,?)',[7,blob_text]) self.assertTupleEqual(cm.exception.args, ("Unicode strings are not acceptable input for a non-textual BLOB column.",)) def test_insert_float_double(self): cur = self.con.cursor() cur.execute('insert into T2 (C1,C12,C13) values (?,?,?)',[5,1.0,1.0]) self.con.commit() cur.execute('select C1,C12,C13 from T2 where C1 = 5') rows = cur.fetchall() self.assertListEqual(rows,[(5, 1.0, 1.0)]) cur.execute('insert into T2 (C1,C12,C13) values (?,?,?)',[6,1,1]) self.con.commit() cur.execute('select C1,C12,C13 from T2 where C1 = 6') rows = cur.fetchall() self.assertListEqual(rows,[(6, 1.0, 1.0)]) def test_insert_numeric_decimal(self): cur = self.con.cursor() cur.execute('insert into T2 (C1,C10,C11) values (?,?,?)',[6,1.1,1.1]) cur.execute('insert into T2 (C1,C10,C11) values (?,?,?)',[6,decimal.Decimal('100.11'),decimal.Decimal('100.11')]) self.con.commit() cur.execute('select C1,C10,C11 from T2 where C1 = 6') rows = cur.fetchall() self.assertListEqual(rows, [(6, Decimal('1.1'), Decimal('1.1')), (6, Decimal('100.11'), Decimal('100.11'))]) def test_insert_returning(self): cur = self.con.cursor() cur.execute('insert into T2 (C1,C10,C11) values (?,?,?) returning C1',[6,1.1,1.1]) result = cur.fetchall() self.assertListEqual(result,[(6,)]) class TestStoredProc(FDBTestBase): def setUp(self): self.cwd = os.getcwd() self.dbpath = os.path.join(self.cwd,'test') self.dbfile = os.path.join(self.dbpath,FBTEST_DB) self.con = fdb.connect(host=FBTEST_HOST,database=self.dbfile, user=FBTEST_USER,password=FBTEST_PASSWORD) def tearDown(self): self.con.close() def test_callproc(self): cur = self.con.cursor() result = cur.callproc('sub_tot_budget',['100']) self.assertListEqual(result,['100']) row = cur.fetchone() self.assertTupleEqual(row,(Decimal('3800000'), Decimal('760000'), Decimal('500000'), Decimal('1500000'))) result = cur.callproc('sub_tot_budget',[100]) self.assertListEqual(result,[100]) row = cur.fetchone() self.assertTupleEqual(row,(Decimal('3800000'), Decimal('760000'), Decimal('500000'), Decimal('1500000'))) class TestServices(FDBTestBase): def setUp(self): self.cwd = os.getcwd() self.dbpath = os.path.join(self.cwd,'test') self.dbfile = os.path.join(self.dbpath,FBTEST_DB) def test_attach(self): svc = fdb.services.connect(host=FBTEST_HOST,password=FBTEST_PASSWORD) svc.close() def test_query(self): svc = fdb.services.connect(host=FBTEST_HOST,password=FBTEST_PASSWORD) self.assertEqual(svc.get_service_manager_version(),2) self.assertIn('Firebird',svc.get_server_version()) self.assertIn('Firebird',svc.get_architecture()) x = svc.get_home_directory() #self.assertEqual(x,'/opt/firebird/') if svc.engine_version < 3.0: self.assertIn('security2.fdb',svc.get_security_database_path()) else: self.assertIn('security3.fdb',svc.get_security_database_path()) x = svc.get_lock_file_directory() #self.assertEqual(x,'/tmp/firebird/') x = svc.get_server_capabilities() self.assertIsInstance(x,type(tuple())) x = svc.get_message_file_directory() #self.assertEqual(x,'/opt/firebird/') con = fdb.connect(host=FBTEST_HOST,database=self.dbfile, user=FBTEST_USER,password=FBTEST_PASSWORD) con2 = fdb.connect(host=FBTEST_HOST,database='employee', user=FBTEST_USER,password=FBTEST_PASSWORD) self.assertGreaterEqual(len(svc.get_attached_database_names()),2) self.assertIn(self.dbfile.upper(), [s.upper() for s in svc.get_attached_database_names()]) #self.assertIn('/opt/firebird/examples/empbuild/employee.fdb',x) self.assertGreaterEqual(svc.get_connection_count(),2) svc.close() def test_running(self): svc = fdb.services.connect(host=FBTEST_HOST,password=FBTEST_PASSWORD) self.assertFalse(svc.isrunning()) svc.get_log() #self.assertTrue(svc.isrunning()) self.assertTrue(svc.fetching) # fetch materialized log = svc.readlines() self.assertFalse(svc.isrunning()) svc.close() def test_wait(self): svc = fdb.services.connect(host=FBTEST_HOST,password=FBTEST_PASSWORD) self.assertFalse(svc.isrunning()) svc.get_log() #self.assertTrue(svc.isrunning()) self.assertTrue(svc.fetching) svc.wait() self.assertFalse(svc.isrunning()) self.assertFalse(svc.fetching) svc.close() class TestServices2(FDBTestBase): def setUp(self): self.cwd = os.getcwd() self.dbpath = os.path.join(self.cwd,'test') self.dbfile = os.path.join(self.dbpath,FBTEST_DB) self.fbk = os.path.join(self.dbpath,'test_employee.fbk') self.fbk2 = os.path.join(self.dbpath,'test_employee.fbk2') self.rfdb = os.path.join(self.dbpath,'test_employee.fdb') self.svc = fdb.services.connect(host=FBTEST_HOST,password=FBTEST_PASSWORD) self.con = fdb.connect(host=FBTEST_HOST,database=self.dbfile, user=FBTEST_USER,password=FBTEST_PASSWORD) if not os.path.exists(self.rfdb): c = fdb.create_database(host=FBTEST_HOST,database=self.rfdb, user=FBTEST_USER,password=FBTEST_PASSWORD) c.close() def tearDown(self): self.svc.close() self.con.execute_immediate("delete from t") self.con.commit() self.con.close() if os.path.exists(self.rfdb): os.remove(self.rfdb) if os.path.exists(self.fbk): os.remove(self.fbk) if os.path.exists(self.fbk2): os.remove(self.fbk2) def test_log(self): def fetchline(line): output.append(line) self.svc.get_log() self.assertTrue(self.svc.fetching) # fetch materialized log = self.svc.readlines() self.assertFalse(self.svc.fetching) self.assertTrue(log) self.assertIsInstance(log,type(list())) # iterate over result self.svc.get_log() for line in self.svc: self.assertIsNotNone(line) self.assertIsInstance(line,fdb.StringType) self.assertFalse(self.svc.fetching) # callback output = [] self.svc.get_log(callback=fetchline) self.assertGreater(len(output),0) def test_getLimboTransactionIDs(self): ids = self.svc.get_limbo_transaction_ids('employee') self.assertIsInstance(ids,type(list())) def test_getStatistics(self): def fetchline(line): output.append(line) self.svc.get_statistics('employee') self.assertTrue(self.svc.fetching) self.assertTrue(self.svc.isrunning()) # fetch materialized stats = self.svc.readlines() self.assertFalse(self.svc.fetching) self.assertFalse(self.svc.isrunning()) self.assertIsInstance(stats,type(list())) # iterate over result self.svc.get_statistics('employee', show_system_tables_and_indexes=True, show_record_versions=True) for line in self.svc: self.assertIsInstance(line,fdb.StringType) self.assertFalse(self.svc.fetching) # callback output = [] self.svc.get_statistics('employee', callback=fetchline) self.assertGreater(len(output),0) def test_backup(self): def fetchline(line): output.append(line) self.svc.backup('employee', self.fbk) self.assertTrue(self.svc.fetching) self.assertTrue(self.svc.isrunning()) # fetch materialized report = self.svc.readlines() self.assertFalse(self.svc.fetching) self.assertFalse(self.svc.isrunning()) self.assertTrue(os.path.exists(self.fbk)) self.assertIsInstance(report,type(list())) # iterate over result self.svc.backup('employee', self.fbk, ignore_checksums=1, ignore_limbo_transactions=1, metadata_only=1, collect_garbage=0, transportable=0, convert_external_tables_to_internal=1, compressed=0, no_db_triggers=0) for line in self.svc: self.assertIsNotNone(line) self.assertIsInstance(line,fdb.StringType) self.assertFalse(self.svc.fetching) # callback output = [] self.svc.backup('employee', self.fbk, callback=fetchline) self.assertGreater(len(output),0) def test_restore(self): def fetchline(line): output.append(line) output = [] self.svc.backup('employee', self.fbk, callback=fetchline) self.assertTrue(os.path.exists(self.fbk)) self.svc.restore(self.fbk, self.rfdb, replace=1) self.assertTrue(self.svc.fetching) self.assertTrue(self.svc.isrunning()) # fetch materialized report = self.svc.readlines() self.assertFalse(self.svc.fetching) self.assertFalse(self.svc.isrunning()) self.assertIsInstance(report,type(list())) # iterate over result self.svc.restore(self.fbk, self.rfdb, replace=1) for line in self.svc: self.assertIsNotNone(line) self.assertIsInstance(line,fdb.StringType) self.assertFalse(self.svc.fetching) # callback output = [] self.svc.restore(self.fbk, self.rfdb, replace=1, callback=fetchline) self.assertGreater(len(output),0) def test_nbackup(self): if self.con.engine_version < 2.5: return self.svc.nbackup('employee', self.fbk) self.assertTrue(os.path.exists(self.fbk)) def test_nrestore(self): if self.con.engine_version < 2.5: return self.test_nbackup() self.assertTrue(os.path.exists(self.fbk)) if os.path.exists(self.rfdb): os.remove(self.rfdb) self.svc.nrestore(self.fbk, self.rfdb) self.assertTrue(os.path.exists(self.rfdb)) def test_trace(self): if self.con.engine_version < 2.5: return trace_config = """ enabled true log_statement_finish true print_plan true include_filter %%SELECT%% exclude_filter %%RDB$%% time_threshold 0 max_sql_length 2048 """ % self.dbfile svc2 = fdb.services.connect(host=FBTEST_HOST,password=FBTEST_PASSWORD) svcx = fdb.services.connect(host=FBTEST_HOST,password=FBTEST_PASSWORD) # Start trace sessions trace1_id = self.svc.trace_start(trace_config,'test_trace_1') trace2_id = svc2.trace_start(trace_config) # check sessions sessions = svcx.trace_list() self.assertIn(trace1_id,sessions) self.assertListEqual(list(sessions[trace1_id].keys()), ['date', 'flags', 'name', 'user']) self.assertIn(trace2_id,sessions) self.assertListEqual(list(sessions[trace2_id].keys()), ['date', 'flags', 'user']) self.assertListEqual(sessions[trace1_id]['flags'], ['active', ' admin', ' trace']) self.assertListEqual(sessions[trace2_id]['flags'], ['active', ' admin', ' trace']) # Pause session svcx.trace_suspend(trace2_id) self.assertIn('suspend',svcx.trace_list()[trace2_id]['flags']) # Resume session svcx.trace_resume(trace2_id) self.assertIn('active',svcx.trace_list()[trace2_id]['flags']) # Stop session svcx.trace_stop(trace2_id) self.assertNotIn(trace2_id,svcx.trace_list()) # Finalize svcx.trace_stop(trace1_id) svc2.close() svcx.close() def test_setDefaultPageBuffers(self): self.svc.set_default_page_buffers(self.rfdb,100) def test_setSweepInterval(self): self.svc.set_sweep_interval(self.rfdb,10000) def test_shutdown_bringOnline(self): if self.con.engine_version < 2.5: # Basic shutdown/online self.svc.shutdown(self.rfdb, fdb.services.SHUT_LEGACY, fdb.services.SHUT_FORCE,0) self.svc.get_statistics(self.rfdb,show_only_db_header_pages=1) self.assertIn('multi-user maintenance',''.join(self.svc.readlines())) # Return to normal state self.svc.bring_online(self.rfdb,fdb.services.SHUT_LEGACY) self.svc.get_statistics(self.rfdb,show_only_db_header_pages=1) self.assertNotIn('multi-user maintenance',''.join(self.svc.readlines())) else: # Shutdown database to single-user maintenance mode self.svc.shutdown(self.rfdb, fdb.services.SHUT_SINGLE, fdb.services.SHUT_FORCE,0) self.svc.get_statistics(self.rfdb,show_only_db_header_pages=1) self.assertIn('single-user maintenance',''.join(self.svc.readlines())) # Enable multi-user maintenance self.svc.bring_online(self.rfdb,fdb.services.SHUT_MULTI) self.svc.get_statistics(self.rfdb,show_only_db_header_pages=1) self.assertIn('multi-user maintenance',''.join(self.svc.readlines())) # Go to full shutdown mode, disabling new attachments during 5 seconds self.svc.shutdown(self.rfdb, fdb.services.SHUT_FULL, fdb.services.SHUT_DENY_NEW_ATTACHMENTS,5) self.svc.get_statistics(self.rfdb,show_only_db_header_pages=1) self.assertIn('full shutdown',''.join(self.svc.readlines())) # Enable single-user maintenance self.svc.bring_online(self.rfdb,fdb.services.SHUT_SINGLE) self.svc.get_statistics(self.rfdb,show_only_db_header_pages=1) self.assertIn('single-user maintenance',''.join(self.svc.readlines())) # Return to normal state self.svc.bring_online(self.rfdb) def test_setShouldReservePageSpace(self): self.svc.set_reserve_page_space(self.rfdb,False) self.svc.get_statistics(self.rfdb,show_only_db_header_pages=1) self.assertIn('no reserve',''.join(self.svc.readlines())) self.svc.set_reserve_page_space(self.rfdb,True) self.svc.get_statistics(self.rfdb,show_only_db_header_pages=1) self.assertNotIn('no reserve',''.join(self.svc.readlines())) def test_setWriteMode(self): # Forced writes self.svc.set_write_mode(self.rfdb,fdb.services.WRITE_FORCED) self.svc.get_statistics(self.rfdb,show_only_db_header_pages=1) self.assertIn('force write',''.join(self.svc.readlines())) # No Forced writes self.svc.set_write_mode(self.rfdb,fdb.services.WRITE_BUFFERED) self.svc.get_statistics(self.rfdb,show_only_db_header_pages=1) self.assertNotIn('force write',''.join(self.svc.readlines())) def test_setAccessMode(self): # Read Only self.svc.set_access_mode(self.rfdb,fdb.services.ACCESS_READ_ONLY) self.svc.get_statistics(self.rfdb,show_only_db_header_pages=1) self.assertIn('read only',''.join(self.svc.readlines())) # Read/Write self.svc.set_access_mode(self.rfdb,fdb.services.ACCESS_READ_WRITE) self.svc.get_statistics(self.rfdb,show_only_db_header_pages=1) self.assertNotIn('read only',''.join(self.svc.readlines())) def test_setSQLDialect(self): self.svc.set_sql_dialect(self.rfdb,1) self.svc.get_statistics(self.rfdb,show_only_db_header_pages=1) self.assertIn('Database dialect\t1',''.join(self.svc.readlines())) self.svc.set_sql_dialect(self.rfdb,3) self.svc.get_statistics(self.rfdb,show_only_db_header_pages=1) self.assertIn('Database dialect\t3',''.join(self.svc.readlines())) def test_activateShadowFile(self): self.svc.activate_shadow(self.rfdb) def test_sweep(self): self.svc.sweep(self.rfdb) def test_repair(self): result = self.svc.repair(self.rfdb) self.assertFalse(result) def test_getUsers(self): users = self.svc.get_users() self.assertIsInstance(users,type(list())) self.assertIsInstance(users[0],fdb.services.User) self.assertEqual(users[0].name,'SYSDBA') def test_manage_user(self): user = fdb.services.User('FDB_TEST') user.password = 'FDB_TEST' user.first_name = 'FDB' user.middle_name = 'X.' user.last_name = 'TEST' self.svc.add_user(user) self.assertTrue(self.svc.user_exists(user)) self.assertTrue(self.svc.user_exists('FDB_TEST')) users = [user for user in self.svc.get_users() if user.name == 'FDB_TEST'] self.assertTrue(users) self.assertEqual(len(users),1) #self.assertEqual(users[0].password,'FDB_TEST') self.assertEqual(users[0].first_name,'FDB') self.assertEqual(users[0].middle_name,'X.') self.assertEqual(users[0].last_name,'TEST') user.password = 'XFDB_TEST' user.first_name = 'XFDB' user.middle_name = 'XX.' user.last_name = 'XTEST' self.svc.modify_user(user) users = [user for user in self.svc.get_users() if user.name == 'FDB_TEST'] self.assertTrue(users) self.assertEqual(len(users),1) #self.assertEqual(users[0].password,'XFDB_TEST') self.assertEqual(users[0].first_name,'XFDB') self.assertEqual(users[0].middle_name,'XX.') self.assertEqual(users[0].last_name,'XTEST') self.svc.remove_user(user) self.assertFalse(self.svc.user_exists('FDB_TEST')) class TestEvents(FDBTestBase): def setUp(self): self.cwd = os.getcwd() self.dbpath = os.path.join(self.cwd,'test') self.dbfile = os.path.join(self.dbpath,'fbevents.fdb') if os.path.exists(self.dbfile): os.remove(self.dbfile) self.con = fdb.create_database(host=FBTEST_HOST,database=self.dbfile, user=FBTEST_USER,password=FBTEST_PASSWORD) c = self.con.cursor() c.execute("CREATE TABLE T (PK Integer, C1 Integer)") c.execute("""CREATE TRIGGER EVENTS_AU FOR T ACTIVE BEFORE UPDATE POSITION 0 AS BEGIN if (old.C1 <> new.C1) then post_event 'c1_updated' ; END""") c.execute("""CREATE TRIGGER EVENTS_AI FOR T ACTIVE AFTER INSERT POSITION 0 AS BEGIN if (new.c1 = 1) then post_event 'insert_1' ; else if (new.c1 = 2) then post_event 'insert_2' ; else if (new.c1 = 3) then post_event 'insert_3' ; else post_event 'insert_other' ; END""") self.con.commit() def tearDown(self): self.con.drop_database() self.con.close() def test_one_event(self): def send_events(command_list): c = self.con.cursor() for cmd in command_list: c.execute(cmd) self.con.commit() timed_event = threading.Timer(3.0,send_events,args=[["insert into T (PK,C1) values (1,1)",]]) with self.con.event_conduit(['insert_1']) as events: timed_event.start() e = events.wait() timed_event.join() self.assertDictEqual(e,{'insert_1': 1}) def test_multiple_events(self): def send_events(command_list): c = self.con.cursor() for cmd in command_list: c.execute(cmd) self.con.commit() cmds = ["insert into T (PK,C1) values (1,1)", "insert into T (PK,C1) values (1,2)", "insert into T (PK,C1) values (1,3)", "insert into T (PK,C1) values (1,1)", "insert into T (PK,C1) values (1,2)",] timed_event = threading.Timer(3.0,send_events,args=[cmds]) with self.con.event_conduit(['insert_1','insert_3']) as events: timed_event.start() e = events.wait() timed_event.join() self.assertDictEqual(e,{'insert_3': 1, 'insert_1': 2}) def test_20_events(self): def send_events(command_list): c = self.con.cursor() for cmd in command_list: c.execute(cmd) self.con.commit() cmds = ["insert into T (PK,C1) values (1,1)", "insert into T (PK,C1) values (1,2)", "insert into T (PK,C1) values (1,3)", "insert into T (PK,C1) values (1,1)", "insert into T (PK,C1) values (1,2)",] self.e = {} timed_event = threading.Timer(1.0,send_events,args=[cmds]) with self.con.event_conduit(['insert_1','A','B','C','D', 'E','F','G','H','I','J','K','L','M', 'N','O','P','Q','R','insert_3']) as events: timed_event.start() time.sleep(3) e = events.wait() timed_event.join() self.assertDictEqual(e, {'A': 0, 'C': 0, 'B': 0, 'E': 0, 'D': 0, 'G': 0, 'insert_1': 2, 'I': 0, 'H': 0, 'K': 0, 'J': 0, 'M': 0, 'L': 0, 'O': 0, 'N': 0, 'Q': 0, 'P': 0, 'R': 0, 'insert_3': 1, 'F': 0}) def test_flush_events(self): def send_events(command_list): c = self.con.cursor() for cmd in command_list: c.execute(cmd) self.con.commit() timed_event = threading.Timer(3.0,send_events,args=[["insert into T (PK,C1) values (1,1)",]]) with self.con.event_conduit(['insert_1']) as events: send_events(["insert into T (PK,C1) values (1,1)", "insert into T (PK,C1) values (1,1)"]) time.sleep(2) events.flush() timed_event.start() e = events.wait() timed_event.join() self.assertDictEqual(e,{'insert_1': 1}) class TestStreamBLOBs(FDBTestBase): def setUp(self): self.cwd = os.getcwd() self.dbpath = os.path.join(self.cwd,'test') self.dbfile = os.path.join(self.dbpath,FBTEST_DB) self.con = fdb.connect(host=FBTEST_HOST,database=self.dbfile, user=FBTEST_USER,password=FBTEST_PASSWORD) #self.con.execute_immediate("recreate table t (c1 integer)") #self.con.commit() #self.con.execute_immediate("RECREATE TABLE T2 (C1 Smallint,C2 Integer,C3 Bigint,C4 Char(5),C5 Varchar(10),C6 Date,C7 Time,C8 Timestamp,C9 Blob sub_type 1,C10 Numeric(18,2),C11 Decimal(18,2),C12 Float,C13 Double precision,C14 Numeric(8,4),C15 Decimal(8,4))") #self.con.commit() def tearDown(self): self.con.execute_immediate("delete from t") self.con.execute_immediate("delete from t2") self.con.commit() self.con.close() def testBlobBasic(self): blob = """Firebird supports two types of blobs, stream and segmented. The database stores segmented blobs in chunks. Each chunk starts with a two byte length indicator followed by however many bytes of data were passed as a segment. Stream blobs are stored as a continuous array of data bytes with no length indicators included.""" cur = self.con.cursor() cur.execute('insert into T2 (C1,C9) values (?,?)',[4,StringIO(blob)]) self.con.commit() p = cur.prep('select C1,C9 from T2 where C1 = 4') p.set_stream_blob('C9') cur.execute(p) row = cur.fetchone() blob_reader = row[1] ## Necessary to avoid bad BLOB handle on BlobReader.close in tearDown ## because BLOB handle is no longer valid after table purge with closing(p): self.assertEqual(blob_reader.read(20),'Firebird supports tw') self.assertEqual(blob_reader.read(20),'o types of blobs, st') self.assertEqual(blob_reader.read(400), 'ream and segmented.\nThe database stores segmented blobs in ' \ 'chunks.\nEach chunk starts with a two byte length indicator ' \ 'followed by however many bytes of data were passed as ' \ 'a segment.\nStream blobs are stored as a continuous array ' \ 'of data bytes with no length indicators included.') self.assertEqual(blob_reader.read(20),'') self.assertEqual(blob_reader.tell(),318) blob_reader.seek(20) self.assertEqual(blob_reader.tell(),20) self.assertEqual(blob_reader.read(20),'o types of blobs, st') blob_reader.seek(0) self.assertEqual(blob_reader.tell(),0) self.assertListEqual(blob_reader.readlines(),StringIO(blob).readlines()) blob_reader.seek(0) for line in blob_reader: self.assertIn(line.rstrip('\n'),blob.split('\n')) blob_reader.seek(0) self.assertEqual(blob_reader.read(),blob) blob_reader.seek(-9,os.SEEK_END) self.assertEqual(blob_reader.read(),'included.') blob_reader.seek(-20,os.SEEK_END) blob_reader.seek(11,os.SEEK_CUR) self.assertEqual(blob_reader.read(),'included.') blob_reader.seek(60) self.assertEqual(blob_reader.readline(), 'The database stores segmented blobs in chunks.\n') def testBlobExtended(self): blob = """Firebird supports two types of blobs, stream and segmented. The database stores segmented blobs in chunks. Each chunk starts with a two byte length indicator followed by however many bytes of data were passed as a segment. Stream blobs are stored as a continuous array of data bytes with no length indicators included.""" cur = self.con.cursor() cur.execute('insert into T2 (C1,C9) values (?,?)',[1,StringIO(blob)]) cur.execute('insert into T2 (C1,C9) values (?,?)',[2,StringIO(blob)]) self.con.commit() p = cur.prep('select C1,C9 from T2') p.set_stream_blob('C9') cur.execute(p) #rows = [row for row in cur] # Necessary to avoid bad BLOB handle on BlobReader.close in tearDown # because BLOB handle is no longer valid after table purge with closing(p): for row in cur: blob_reader = row[1] self.assertEqual(blob_reader.read(20),'Firebird supports tw') self.assertEqual(blob_reader.read(20),'o types of blobs, st') self.assertEqual(blob_reader.read(400), 'ream and segmented.\nThe database stores segmented blobs ' \ 'in chunks.\nEach chunk starts with a two byte length ' \ 'indicator followed by however many bytes of data were ' \ 'passed as a segment.\nStream blobs are stored as a ' \ 'continuous array of data bytes with no length indicators ' \ 'included.') self.assertEqual(blob_reader.read(20),'') self.assertEqual(blob_reader.tell(),318) blob_reader.seek(20) self.assertEqual(blob_reader.tell(),20) self.assertEqual(blob_reader.read(20),'o types of blobs, st') blob_reader.seek(0) self.assertEqual(blob_reader.tell(),0) self.assertListEqual(blob_reader.readlines(), StringIO(blob).readlines()) blob_reader.seek(0) for line in blob_reader: self.assertIn(line.rstrip('\n'),blob.split('\n')) blob_reader.seek(0) self.assertEqual(blob_reader.read(),blob) blob_reader.seek(-9,os.SEEK_END) self.assertEqual(blob_reader.read(),'included.') blob_reader.seek(-20,os.SEEK_END) blob_reader.seek(11,os.SEEK_CUR) self.assertEqual(blob_reader.read(),'included.') blob_reader.seek(60) self.assertEqual(blob_reader.readline(), 'The database stores segmented blobs in chunks.\n') class TestCharsetConversion(FDBTestBase): def setUp(self): self.cwd = os.getcwd() self.dbpath = os.path.join(self.cwd,'test') self.dbfile = os.path.join(self.dbpath,FBTEST_DB) self.con = fdb.connect(host=FBTEST_HOST,database=self.dbfile, user=FBTEST_USER,password=FBTEST_PASSWORD, charset='utf8') #self.con.execute_immediate("recreate table t (c1 integer)") #self.con.commit() #self.con.execute_immediate("RECREATE TABLE T2 (C1 Smallint,C2 Integer,C3 Bigint,C4 Char(5),C5 Varchar(10),C6 Date,C7 Time,C8 Timestamp,C9 Blob sub_type 1,C10 Numeric(18,2),C11 Decimal(18,2),C12 Float,C13 Double precision,C14 Numeric(8,4),C15 Decimal(8,4))") #self.con.commit() def tearDown(self): self.con.execute_immediate("delete from t3") self.con.execute_immediate("delete from t4") self.con.commit() self.con.close() def test_octets(self): bytestring = fdb.fbcore.bs([1,2,3,4,5]) cur = self.con.cursor() cur.execute("insert into T4 (C1, C_OCTETS, V_OCTETS) values (?,?,?)", (1, bytestring,bytestring)) self.con.commit() cur.execute("select C1, C_OCTETS, V_OCTETS from T4 where C1 = 1") row = cur.fetchone() if ibase.PYTHON_MAJOR_VER == 3: self.assertTupleEqual(row, (1, b'\x01\x02\x03\x04\x05', b'\x01\x02\x03\x04\x05')) else: self.assertTupleEqual(row, (1, '\x01\x02\x03\x04\x05', '\x01\x02\x03\x04\x05')) def test_utf82win1250(self): s5 = 'ěščřž' s30 = 'ěščřžýáíéúůďťňóĚŠČŘŽÝÁÍÉÚŮĎŤŇÓ' if ibase.PYTHON_MAJOR_VER != 3: s5 = s5.decode('utf8') s30 = s30.decode('utf8') con1250 = fdb.connect(host=FBTEST_HOST,database=self.dbfile,user=FBTEST_USER, password=FBTEST_PASSWORD,charset='win1250') c_utf8 = self.con.cursor() c_win1250 = con1250.cursor() # Insert unicode data c_utf8.execute("insert into T4 (C1, C_WIN1250, V_WIN1250, C_UTF8, V_UTF8)" "values (?,?,?,?,?)", (1,s5,s30,s5,s30)) self.con.commit() # Should return the same unicode content when read from win1250 or utf8 connection c_win1250.execute("select C1, C_WIN1250, V_WIN1250," "C_UTF8, V_UTF8 from T4 where C1 = 1") row = c_win1250.fetchone() self.assertTupleEqual(row,(1,s5,s30,s5,s30)) c_utf8.execute("select C1, C_WIN1250, V_WIN1250," "C_UTF8, V_UTF8 from T4 where C1 = 1") row = c_utf8.fetchone() self.assertTupleEqual(row,(1,s5,s30,s5,s30)) def testCharVarchar(self): s = 'Introdução' if ibase.PYTHON_MAJOR_VER != 3: s = s.decode('utf8') self.assertEqual(len(s),10) data = tuple([1,s,s]) cur = self.con.cursor() cur.execute('insert into T3 (C1,C2,C3) values (?,?,?)',data) self.con.commit() cur.execute('select C1,C2,C3 from T3 where C1 = 1') row = cur.fetchone() self.assertEqual(row,data) def testBlob(self): s = """Introdução Este artigo descreve como você pode fazer o InterBase e o Firebird 1.5 coehabitarem pacificamente seu computador Windows. Por favor, note que esta solução não permitirá que o Interbase e o Firebird rodem ao mesmo tempo. Porém você poderá trocar entre ambos com um mínimo de luta. """ if ibase.PYTHON_MAJOR_VER != 3: s = s.decode('utf8') self.assertEqual(len(s),292) data = tuple([2,s]) b_data = tuple([3,ibase.b('bytestring')]) cur = self.con.cursor() # Text BLOB cur.execute('insert into T3 (C1,C4) values (?,?)',data) self.con.commit() cur.execute('select C1,C4 from T3 where C1 = 2') row = cur.fetchone() self.assertEqual(row,data) # Insert Unicode into non-textual BLOB with self.assertRaises(TypeError) as cm: cur.execute('insert into T3 (C1,C5) values (?,?)',data) self.con.commit() self.assertTupleEqual(cm.exception.args, ('Unicode strings are not acceptable input for a non-textual BLOB column.',)) # Read binary from non-textual BLOB cur.execute('insert into T3 (C1,C5) values (?,?)',b_data) self.con.commit() cur.execute('select C1,C5 from T3 where C1 = 3') row = cur.fetchone() self.assertEqual(row,b_data) class TestSchema(FDBTestBase): def setUp(self): self.cwd = os.getcwd() self.dbpath = os.path.join(self.cwd,'test') self.dbfile = os.path.join(self.dbpath,FBTEST_DB) self.con = fdb.connect(host=FBTEST_HOST,database=self.dbfile, user=FBTEST_USER,password=FBTEST_PASSWORD) def tearDown(self): self.con.close() def testSchemaBindClose(self): s = fdb.schema.Schema() self.assertTrue(s.closed) s.bind(self.con) # properties self.assertIsNone(s.description) self.assertEqual(s.owner_name,'SYSDBA') self.assertEqual(s.default_character_set.name,'NONE') self.assertIsNone(s.security_class) self.assertFalse(s.closed) # s.close() self.assertTrue(s.closed) s.bind(self.con) self.assertFalse(s.closed) # s.bind(self.con) self.assertFalse(s.closed) # del s def testSchemaFromConnection(self): s = self.con.schema # enum_* disctionaries self.assertDictEqual(s.enum_param_type_from, {0: 'DATATYPE', 1: 'DOMAIN', 2: 'TYPE OF DOMAIN', 3: 'TYPE OF COLUMN'}) if self.con.ods <= fdb.ODS_FB_20: self.assertDictEqual(s.enum_object_types, {0: 'RELATION', 1: 'VIEW', 2: 'TRIGGER', 3: 'COMPUTED_FIELD', 4: 'VALIDATION', 5: 'PROCEDURE', 6: 'EXPRESSION_INDEX', 7: 'EXCEPTION', 8: 'USER', 9: 'FIELD', 10: 'INDEX', 11: 'DEPENDENT_COUNT', 12: 'USER_GROUP', 13: 'ROLE', 14: 'GENERATOR', 15: 'UDF', 16: 'BLOB_FILTER'}) self.assertDictEqual(s.enum_object_type_codes, {'INDEX': 10, 'EXCEPTION': 7, 'GENERATOR': 14, 'UDF': 15, 'EXPRESSION_INDEX': 6, 'FIELD': 9, 'COMPUTED_FIELD': 3, 'TRIGGER': 2, 'RELATION': 0, 'USER': 8, 'DEPENDENT_COUNT': 11, 'USER_GROUP': 12, 'BLOB_FILTER': 16, 'ROLE': 13, 'VALIDATION': 4, 'PROCEDURE': 5, 'VIEW': 1}) elif self.con.ods > fdb.ODS_FB_20 and self.con.ods < fdb.ODS_FB_30: self.assertDictEqual(s.enum_object_types, {0: 'RELATION', 1: 'VIEW', 2: 'TRIGGER', 3: 'COMPUTED_FIELD', 4: 'VALIDATION', 5: 'PROCEDURE', 6: 'EXPRESSION_INDEX', 7: 'EXCEPTION', 8: 'USER', 9: 'FIELD', 10: 'INDEX', 12: 'USER_GROUP', 13: 'ROLE', 14: 'GENERATOR', 15: 'UDF', 16: 'BLOB_FILTER', 17: 'COLLATION'}) self.assertDictEqual(s.enum_object_type_codes, {'INDEX': 10, 'EXCEPTION': 7, 'GENERATOR': 14, 'COLLATION': 17, 'UDF': 15, 'EXPRESSION_INDEX': 6, 'FIELD': 9, 'COMPUTED_FIELD': 3, 'TRIGGER': 2, 'RELATION': 0, 'USER': 8, 'USER_GROUP': 12, 'BLOB_FILTER': 16, 'ROLE': 13, 'VALIDATION': 4, 'PROCEDURE': 5, 'VIEW': 1}) else: self.assertDictEqual(s.enum_object_types, {0: 'RELATION', 1: 'VIEW', 2: 'TRIGGER', 3: 'COMPUTED_FIELD', 4: 'VALIDATION', 5: 'PROCEDURE', 6: 'EXPRESSION_INDEX', 7: 'EXCEPTION', 8: 'USER', 9: 'FIELD', 10: 'INDEX', 11: 'CHARACTER_SET',12: 'USER_GROUP', 13: 'ROLE', 14: 'GENERATOR', 15: 'UDF', 16: 'BLOB_FILTER', 17: 'COLLATION', 18:'PACKAGE',19:'PACKAGE BODY'}) self.assertDictEqual(s.enum_object_type_codes, {'INDEX': 10, 'EXCEPTION': 7, 'GENERATOR': 14, 'COLLATION': 17, 'UDF': 15, 'EXPRESSION_INDEX': 6, 'FIELD': 9, 'COMPUTED_FIELD': 3, 'TRIGGER': 2, 'RELATION': 0, 'USER': 8, 'USER_GROUP': 12, 'BLOB_FILTER': 16, 'ROLE': 13, 'VALIDATION': 4, 'PROCEDURE': 5, 'VIEW': 1, 'CHARACTER_SET':11, 'PACKAGE':18, 'PACKAGE BODY':19}) if self.con.ods <= fdb.ODS_FB_20: self.assertDictEqual(s.enum_character_set_names, {0: 'NONE', 1: 'BINARY', 2: 'ASCII7', 3: 'SQL_TEXT', 4: 'UTF-8', 5: 'SJIS', 6: 'EUCJ', 9: 'DOS_737', 10: 'DOS_437', 11: 'DOS_850', 12: 'DOS_865', 13: 'DOS_860', 14: 'DOS_863', 15: 'DOS_775', 16: 'DOS_858', 17: 'DOS_862', 18: 'DOS_864', 19: 'NEXT', 21: 'ANSI', 22: 'ISO-8859-2', 23: 'ISO-8859-3', 34: 'ISO-8859-4', 35: 'ISO-8859-5', 36: 'ISO-8859-6', 37: 'ISO-8859-7', 38: 'ISO-8859-8', 39: 'ISO-8859-9', 40: 'ISO-8859-13', 44: 'WIN_949', 45: 'DOS_852', 46: 'DOS_857', 47: 'DOS_861', 48: 'DOS_866', 49: 'DOS_869', 50: 'CYRL', 51: 'WIN_1250', 52: 'WIN_1251', 53: 'WIN_1252', 54: 'WIN_1253', 55: 'WIN_1254', 56: 'WIN_950', 57: 'WIN_936', 58: 'WIN_1255', 59: 'WIN_1256', 60: 'WIN_1257', 63: 'KOI8R', 64: 'KOI8U', 65: 'WIN1258'}) elif self.con.ods == fdb.ODS_FB_21: self.assertDictEqual(s.enum_character_set_names, {0: 'NONE', 1: 'BINARY', 2: 'ASCII7', 3: 'SQL_TEXT', 4: 'UTF-8', 5: 'SJIS', 6: 'EUCJ', 9: 'DOS_737', 10: 'DOS_437', 11: 'DOS_850', 12: 'DOS_865', 13: 'DOS_860', 14: 'DOS_863', 15: 'DOS_775', 16: 'DOS_858', 17: 'DOS_862', 18: 'DOS_864', 19: 'NEXT', 21: 'ANSI', 22: 'ISO-8859-2', 23: 'ISO-8859-3', 34: 'ISO-8859-4', 35: 'ISO-8859-5', 36: 'ISO-8859-6', 37: 'ISO-8859-7', 38: 'ISO-8859-8', 39: 'ISO-8859-9', 40: 'ISO-8859-13', 44: 'WIN_949', 45: 'DOS_852', 46: 'DOS_857', 47: 'DOS_861', 48: 'DOS_866', 49: 'DOS_869', 50: 'CYRL', 51: 'WIN_1250', 52: 'WIN_1251', 53: 'WIN_1252', 54: 'WIN_1253', 55: 'WIN_1254', 56: 'WIN_950', 57: 'WIN_936', 58: 'WIN_1255', 59: 'WIN_1256', 60: 'WIN_1257', 63: 'KOI8R', 64: 'KOI8U', 65: 'WIN1258', 66: 'TIS620', 67: 'GBK', 68: 'CP943C'}) elif self.con.ods >= fdb.ODS_FB_25: self.assertDictEqual(s.enum_character_set_names, {0: 'NONE', 1: 'BINARY', 2: 'ASCII7', 3: 'SQL_TEXT', 4: 'UTF-8', 5: 'SJIS', 6: 'EUCJ', 9: 'DOS_737', 10: 'DOS_437', 11: 'DOS_850', 12: 'DOS_865', 13: 'DOS_860', 14: 'DOS_863', 15: 'DOS_775', 16: 'DOS_858', 17: 'DOS_862', 18: 'DOS_864', 19: 'NEXT', 21: 'ANSI', 22: 'ISO-8859-2', 23: 'ISO-8859-3', 34: 'ISO-8859-4', 35: 'ISO-8859-5', 36: 'ISO-8859-6', 37: 'ISO-8859-7', 38: 'ISO-8859-8', 39: 'ISO-8859-9', 40: 'ISO-8859-13', 44: 'WIN_949', 45: 'DOS_852', 46: 'DOS_857', 47: 'DOS_861', 48: 'DOS_866', 49: 'DOS_869', 50: 'CYRL', 51: 'WIN_1250', 52: 'WIN_1251', 53: 'WIN_1252', 54: 'WIN_1253', 55: 'WIN_1254', 56: 'WIN_950', 57: 'WIN_936', 58: 'WIN_1255', 59: 'WIN_1256', 60: 'WIN_1257', 63: 'KOI8R', 64: 'KOI8U', 65: 'WIN_1258', 66: 'TIS620', 67: 'GBK', 68: 'CP943C', 69: 'GB18030'}) if self.con.ods < fdb.ODS_FB_30: self.assertDictEqual(s.enum_field_types, {35: 'TIMESTAMP', 37: 'VARYING', 7: 'SHORT', 8: 'LONG', 9: 'QUAD', 10: 'FLOAT', 12: 'DATE', 45: 'BLOB_ID', 14: 'TEXT', 13: 'TIME', 16: 'INT64', 40: 'CSTRING', 27: 'DOUBLE', 261: 'BLOB'}) else: self.assertDictEqual(s.enum_field_types, {35: 'TIMESTAMP', 37: 'VARYING', 7: 'SHORT', 8: 'LONG', 9: 'QUAD', 10: 'FLOAT', 12: 'DATE', 45: 'BLOB_ID', 14: 'TEXT', 13: 'TIME', 16: 'INT64', 40: 'CSTRING', 27: 'DOUBLE', 261: 'BLOB', 23:'BOOLEAN'}) if self.con.ods <= fdb.ODS_FB_20: self.assertDictEqual(s.enum_field_subtypes, {0: 'BINARY', 1: 'TEXT', 2: 'BLR', 3: 'ACL', 4: 'RANGES', 5: 'SUMMARY', 6: 'FORMAT', 7: 'TRANSACTION_DESCRIPTION', 8: 'EXTERNAL_FILE_DESCRIPTION'}) elif self.con.ods > fdb.ODS_FB_20: self.assertDictEqual(s.enum_field_subtypes, {0: 'BINARY', 1: 'TEXT', 2: 'BLR', 3: 'ACL', 4: 'RANGES', 5: 'SUMMARY', 6: 'FORMAT', 7: 'TRANSACTION_DESCRIPTION', 8: 'EXTERNAL_FILE_DESCRIPTION', 9: 'DEBUG_INFORMATION'}) self.assertDictEqual(s.enum_function_types,{0: 'VALUE', 1: 'BOOLEAN'}) self.assertDictEqual(s.enum_mechanism_types, {0: 'BY_VALUE', 1: 'BY_REFERENCE', 2: 'BY_VMS_DESCRIPTOR', 3: 'BY_ISC_DESCRIPTOR', 4: 'BY_SCALAR_ARRAY_DESCRIPTOR', 5: 'BY_REFERENCE_WITH_NULL'}) if self.con.ods <= fdb.ODS_FB_20: self.assertDictEqual(s.enum_parameter_mechanism_types,{}) elif self.con.ods > fdb.ODS_FB_20: self.assertDictEqual(s.enum_parameter_mechanism_types, {0: 'NORMAL', 1: 'TYPE OF'}) self.assertDictEqual(s.enum_procedure_types, {0: 'LEGACY', 1: 'SELECTABLE', 2: 'EXECUTABLE'}) if self.con.ods <= fdb.ODS_FB_20: self.assertDictEqual(s.enum_relation_types,{}) elif self.con.ods > fdb.ODS_FB_20: self.assertDictEqual(s.enum_relation_types, {0: 'PERSISTENT', 1: 'VIEW', 2: 'EXTERNAL', 3: 'VIRTUAL', 4: 'GLOBAL_TEMPORARY_PRESERVE', 5: 'GLOBAL_TEMPORARY_DELETE'}) self.assertDictEqual(s.enum_system_flag_types, {0: 'USER', 1: 'SYSTEM', 2: 'QLI', 3: 'CHECK_CONSTRAINT', 4: 'REFERENTIAL_CONSTRAINT', 5: 'VIEW_CHECK'}) self.assertDictEqual(s.enum_transaction_state_types, {1: 'LIMBO', 2: 'COMMITTED', 3: 'ROLLED_BACK'}) if self.con.ods <= fdb.ODS_FB_20: self.assertDictEqual(s.enum_trigger_types, {1: 'PRE_STORE', 2: 'POST_STORE', 3: 'PRE_MODIFY', 4: 'POST_MODIFY', 5: 'PRE_ERASE', 6: 'POST_ERASE'}) elif self.con.ods > fdb.ODS_FB_20: self.assertDictEqual(s.enum_trigger_types, {8192: 'CONNECT', 1: 'PRE_STORE', 2: 'POST_STORE', 3: 'PRE_MODIFY', 4: 'POST_MODIFY', 5: 'PRE_ERASE', 6: 'POST_ERASE', 8193: 'DISCONNECT', 8194: 'TRANSACTION_START', 8195: 'TRANSACTION_COMMIT', 8196: 'TRANSACTION_ROLLBACK'}) # properties self.assertIsNone(s.description) self.assertEqual(s.owner_name,'SYSDBA') self.assertEqual(s.default_character_set.name,'NONE') self.assertIsNone(s.security_class) # Lists of db objects self.assertIsInstance(s.collations,list) self.assertIsInstance(s.character_sets,list) self.assertIsInstance(s.exceptions,list) self.assertIsInstance(s.generators,list) self.assertIsInstance(s.sysgenerators,list) self.assertIsInstance(s.sequences,list) self.assertIsInstance(s.syssequences,list) self.assertIsInstance(s.domains,list) self.assertIsInstance(s.sysdomains,list) self.assertIsInstance(s.indices,list) self.assertIsInstance(s.sysindices,list) self.assertIsInstance(s.tables,list) self.assertIsInstance(s.systables,list) self.assertIsInstance(s.views,list) self.assertIsInstance(s.sysviews,list) self.assertIsInstance(s.triggers,list) self.assertIsInstance(s.systriggers,list) self.assertIsInstance(s.procedures,list) self.assertIsInstance(s.sysprocedures,list) self.assertIsInstance(s.constraints,list) self.assertIsInstance(s.roles,list) self.assertIsInstance(s.dependencies,list) self.assertIsInstance(s.functions,list) self.assertIsInstance(s.files,list) s.reload() if self.con.ods <= fdb.ODS_FB_20: self.assertEqual(len(s.collations),138) elif self.con.ods == fdb.ODS_FB_21: self.assertEqual(len(s.collations),146) elif self.con.ods == fdb.ODS_FB_25: self.assertEqual(len(s.collations),149) elif self.con.ods >= fdb.ODS_FB_30: self.assertEqual(len(s.collations),150) if self.con.ods <= fdb.ODS_FB_20: self.assertEqual(len(s.character_sets),48) elif self.con.ods == fdb.ODS_FB_21: self.assertEqual(len(s.character_sets),51) elif self.con.ods >= fdb.ODS_FB_25: self.assertEqual(len(s.character_sets),52) self.assertEqual(len(s.exceptions),5) self.assertEqual(len(s.generators),2) if self.con.ods < fdb.ODS_FB_30: self.assertEqual(len(s.sysgenerators),9) self.assertEqual(len(s.syssequences),9) else: self.assertEqual(len(s.sysgenerators),11) self.assertEqual(len(s.syssequences),11) self.assertEqual(len(s.sequences),2) self.assertEqual(len(s.domains),15) if self.con.ods <= fdb.ODS_FB_20: self.assertEqual(len(s.sysdomains),203) elif self.con.ods == fdb.ODS_FB_21: self.assertEqual(len(s.sysdomains),227) elif self.con.ods == fdb.ODS_FB_25: self.assertEqual(len(s.sysdomains),230) else: self.assertEqual(len(s.sysdomains),247) self.assertEqual(len(s.indices),12) if self.con.ods <= fdb.ODS_FB_21: self.assertEqual(len(s.sysindices),72) elif self.con.ods == fdb.ODS_FB_25: self.assertEqual(len(s.sysindices),75) else: self.assertEqual(len(s.sysindices),78) self.assertEqual(len(s.tables),15) if self.con.ods <= fdb.ODS_FB_20: self.assertEqual(len(s.systables),33) elif self.con.ods == fdb.ODS_FB_21: self.assertEqual(len(s.systables),40) elif self.con.ods == fdb.ODS_FB_25: self.assertEqual(len(s.systables),42) else: self.assertEqual(len(s.systables),44) self.assertEqual(len(s.views),1) self.assertEqual(len(s.sysviews),0) self.assertEqual(len(s.triggers),6) self.assertEqual(len(s.systriggers),63) self.assertEqual(len(s.procedures),10) self.assertEqual(len(s.sysprocedures),0) if self.con.ods < fdb.ODS_FB_30: self.assertEqual(len(s.constraints),80) else: self.assertEqual(len(s.constraints),106) if self.con.ods <= fdb.ODS_FB_21: self.assertEqual(len(s.roles),1) elif self.con.ods >= fdb.ODS_FB_25: self.assertEqual(len(s.roles),2) if self.con.ods <= fdb.ODS_FB_20: self.assertEqual(len(s.dependencies),163) elif self.con.ods == fdb.ODS_FB_21: self.assertEqual(len(s.dependencies),157) elif self.con.ods >= fdb.ODS_FB_25: self.assertEqual(len(s.dependencies),163) self.assertEqual(len(s.functions),0) if self.con.ods < fdb.ODS_FB_30: self.assertEqual(len(s.sysfunctions),2) else: self.assertEqual(len(s.sysfunctions),0) self.assertEqual(len(s.files),0) # self.assertIsInstance(s.collations[0],sm.Collation) self.assertIsInstance(s.character_sets[0],sm.CharacterSet) self.assertIsInstance(s.exceptions[0],sm.DatabaseException) self.assertIsInstance(s.generators[0],sm.Sequence) self.assertIsInstance(s.sysgenerators[0],sm.Sequence) self.assertIsInstance(s.sequences[0],sm.Sequence) self.assertIsInstance(s.syssequences[0],sm.Sequence) self.assertIsInstance(s.domains[0],sm.Domain) self.assertIsInstance(s.sysdomains[0],sm.Domain) self.assertIsInstance(s.indices[0],sm.Index) self.assertIsInstance(s.sysindices[0],sm.Index) self.assertIsInstance(s.tables[0],sm.Table) self.assertIsInstance(s.systables[0],sm.Table) self.assertIsInstance(s.views[0],sm.View) #self.assertIsInstance(s.sysviews[0],sm.View) self.assertIsInstance(s.triggers[0],sm.Trigger) self.assertIsInstance(s.systriggers[0],sm.Trigger) self.assertIsInstance(s.procedures[0],sm.Procedure) #self.assertIsInstance(s.sysprocedures[0],sm.Procedure) self.assertIsInstance(s.constraints[0],sm.Constraint) #self.assertIsInstance(s.roles[0],sm.Role) self.assertIsInstance(s.dependencies[0],sm.Dependency) if self.con.ods < fdb.ODS_FB_30: self.assertIsInstance(s.sysfunctions[0],sm.Function) #self.assertIsInstance(s.files[0],sm.DatabaseFile) # self.assertEqual(s.get_collation('OCTETS').name,'OCTETS') self.assertEqual(s.get_character_set('WIN1250').name,'WIN1250') self.assertEqual(s.get_exception('UNKNOWN_EMP_ID').name,'UNKNOWN_EMP_ID') self.assertEqual(s.get_generator('EMP_NO_GEN').name,'EMP_NO_GEN') self.assertEqual(s.get_sequence('EMP_NO_GEN').name,'EMP_NO_GEN') self.assertEqual(s.get_index('MINSALX').name,'MINSALX') self.assertEqual(s.get_domain('FIRSTNAME').name,'FIRSTNAME') self.assertEqual(s.get_table('COUNTRY').name,'COUNTRY') self.assertEqual(s.get_view('PHONE_LIST').name,'PHONE_LIST') self.assertEqual(s.get_trigger('SET_EMP_NO').name,'SET_EMP_NO') self.assertEqual(s.get_procedure('GET_EMP_PROJ').name,'GET_EMP_PROJ') self.assertEqual(s.get_constraint('INTEG_1').name,'INTEG_1') #self.assertEqual(s.get_role('X').name,'X') if self.con.ods < fdb.ODS_FB_30: self.assertEqual(s.get_function('RDB$GET_CONTEXT').name,'RDB$GET_CONTEXT') self.assertEqual(s.get_collation_by_id(0,0).name,'NONE') self.assertEqual(s.get_character_set_by_id(0).name,'NONE') self.assertFalse(s.ismultifile()) # self.assertFalse(s.closed) # with self.assertRaises(fdb.ProgrammingError) as cm: s.close() self.assertTupleEqual(cm.exception.args, ("Call to 'close' not allowed for embedded Schema.",)) with self.assertRaises(fdb.ProgrammingError) as cm: s.bind(self.con) self.assertTupleEqual(cm.exception.args, ("Call to 'bind' not allowed for embedded Schema.",)) def testCollation(self): # System collation c = self.con.schema.get_collation('ES_ES') # common properties self.assertEqual(c.name,'ES_ES') self.assertIsNone(c.description) self.assertListEqual(c.actions,[]) self.assertTrue(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'ES_ES') self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # self.assertEqual(c.id,10) self.assertEqual(c.character_set.name,'ISO8859_1') self.assertIsNone(c.base_collation) self.assertEqual(c.attributes,1) if self.con.ods <= fdb.ODS_FB_20: self.assertIsNone(c.specific_attributes) elif self.con.ods > fdb.ODS_FB_20: self.assertEqual(c.specific_attributes, 'DISABLE-COMPRESSIONS=1;SPECIALS-FIRST=1') self.assertIsNone(c.function_name) # User defined collation c = self.con.schema.get_collation('TEST_COLLATE') # common properties self.assertEqual(c.name,'TEST_COLLATE') self.assertIsNone(c.description) self.assertListEqual(c.actions,['create', 'drop']) self.assertFalse(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'TEST_COLLATE') self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # self.assertEqual(c.id,126) self.assertEqual(c.character_set.name,'WIN1250') self.assertEqual(c.base_collation.name,'WIN_CZ') self.assertEqual(c.attributes,6) self.assertEqual(c.specific_attributes, 'DISABLE-COMPRESSIONS=0;DISABLE-EXPANSIONS=0') self.assertIsNone(c.function_name) self.assertEqual(c.get_sql_for('create'), """CREATE COLLATION TEST_COLLATE FOR WIN1250 FROM WIN_CZ NO PAD CASE INSENSITIVE ACCENT INSENSITIVE 'DISABLE-COMPRESSIONS=0;DISABLE-EXPANSIONS=0'""") self.assertEqual(c.get_sql_for('drop'),"DROP COLLATION TEST_COLLATE") with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('drop',badparam='') self.assertTupleEqual(cm.exception.args, ("Unsupported parameter(s) 'badparam'",)) def testCharacterSet(self): c = self.con.schema.get_character_set('UTF8') # common properties self.assertEqual(c.name,'UTF8') self.assertIsNone(c.description) self.assertListEqual(c.actions,['alter']) self.assertTrue(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'UTF8') self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # self.assertEqual(c.id,4) self.assertEqual(c.bytes_per_character,4) self.assertEqual(c.default_collate.name,'UTF8') if self.con.ods <= fdb.ODS_FB_20: self.assertListEqual([x.name for x in c.collations], ['UTF8', 'UCS_BASIC', 'UNICODE']) elif self.con.ods == fdb.ODS_FB_21: self.assertListEqual([x.name for x in c.collations], ['UTF8', 'UCS_BASIC', 'UNICODE', 'UNICODE_CI']) elif self.con.ods >= fdb.ODS_FB_25: self.assertListEqual([x.name for x in c.collations], ['UTF8', 'UCS_BASIC', 'UNICODE', 'UNICODE_CI', 'UNICODE_CI_AI']) # self.assertEqual(c.get_sql_for('alter',collation='UCS_BASIC'), "ALTER CHARACTER SET UTF8 SET DEFAULT COLLATION UCS_BASIC") with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('alter',badparam='UCS_BASIC') self.assertTupleEqual(cm.exception.args, ("Unsupported parameter(s) 'badparam'",)) with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('alter') self.assertTupleEqual(cm.exception.args, ("Missing required parameter: 'collation'.",)) # self.assertEqual(c.get_collation('UCS_BASIC').name,'UCS_BASIC') self.assertEqual(c.get_collation_by_id(c.get_collation('UCS_BASIC').id).name, 'UCS_BASIC') def testException(self): c = self.con.schema.get_exception('UNKNOWN_EMP_ID') # common properties self.assertEqual(c.name,'UNKNOWN_EMP_ID') self.assertIsNone(c.description) self.assertListEqual(c.actions, ['create', 'recreate', 'alter', 'create_or_alter', 'drop']) self.assertFalse(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'UNKNOWN_EMP_ID') d = c.get_dependents() self.assertEqual(len(d),1) d = d[0] self.assertEqual(d.dependent_name,'ADD_EMP_PROJ') self.assertEqual(d.dependent_type,5) self.assertIsInstance(d.dependent,sm.Procedure) self.assertEqual(d.depended_on_name,'UNKNOWN_EMP_ID') self.assertEqual(d.depended_on_type,7) self.assertIsInstance(d.depended_on,sm.DatabaseException) self.assertListEqual(c.get_dependencies(),[]) # self.assertEqual(c.id,1) self.assertEqual(c.message,"Invalid employee number or project id.") # self.assertEqual(c.get_sql_for('create'), "CREATE EXCEPTION UNKNOWN_EMP_ID 'Invalid employee number or project id.'") self.assertEqual(c.get_sql_for('recreate'), "RECREATE EXCEPTION UNKNOWN_EMP_ID 'Invalid employee number or project id.'") self.assertEqual(c.get_sql_for('drop'), "DROP EXCEPTION UNKNOWN_EMP_ID") self.assertEqual(c.get_sql_for('alter',message="New message."), "ALTER EXCEPTION UNKNOWN_EMP_ID 'New message.'") with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('alter',badparam="New message.") self.assertTupleEqual(cm.exception.args, ("Unsupported parameter(s) 'badparam'",)) with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('alter') self.assertTupleEqual(cm.exception.args, ("Missing required parameter: 'message'.",)) self.assertEqual(c.get_sql_for('create_or_alter'), "CREATE OR ALTER EXCEPTION UNKNOWN_EMP_ID 'Invalid employee number or project id.'") def testSequence(self): # System generator c = self.con.schema.get_sequence('RDB$FIELD_NAME') # common properties self.assertEqual(c.name,'RDB$FIELD_NAME') self.assertEqual(c.description,"Implicit domain name") self.assertListEqual(c.actions,[]) self.assertTrue(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'RDB$FIELD_NAME') self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # self.assertEqual(c.id,6) # User generator c = self.con.schema.get_generator('EMP_NO_GEN') # common properties self.assertEqual(c.name,'EMP_NO_GEN') self.assertIsNone(c.description) self.assertListEqual(c.actions,['create', 'alter', 'drop']) self.assertFalse(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'EMP_NO_GEN') d = c.get_dependents() self.assertEqual(len(d),1) d = d[0] self.assertEqual(d.dependent_name,'SET_EMP_NO') self.assertEqual(d.dependent_type,2) self.assertIsInstance(d.dependent,sm.Trigger) self.assertEqual(d.depended_on_name,'EMP_NO_GEN') self.assertEqual(d.depended_on_type,14) self.assertIsInstance(d.depended_on,sm.Sequence) self.assertListEqual(c.get_dependencies(),[]) # if self.con.ods < fdb.ODS_FB_30: self.assertEqual(c.id,10) else: self.assertEqual(c.id,12) self.assertEqual(c.value,145) # self.assertEqual(c.get_sql_for('create'),"CREATE SEQUENCE EMP_NO_GEN") self.assertEqual(c.get_sql_for('drop'),"DROP SEQUENCE EMP_NO_GEN") self.assertEqual(c.get_sql_for('alter',value=10), "ALTER SEQUENCE EMP_NO_GEN RESTART WITH 10") with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('alter',badparam=10) self.assertTupleEqual(cm.exception.args, ("Unsupported parameter(s) 'badparam'",)) with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('alter') self.assertTupleEqual(cm.exception.args, ("Missing required parameter: 'value'.",)) def testTableColumn(self): # System column c = self.con.schema.get_table('RDB$PAGES').get_column('RDB$PAGE_NUMBER') # common properties self.assertEqual(c.name,'RDB$PAGE_NUMBER') self.assertIsNone(c.description) self.assertListEqual(c.actions,[]) self.assertTrue(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'RDB$PAGE_NUMBER') self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # User column c = self.con.schema.get_table('DEPARTMENT').get_column('PHONE_NO') # common properties self.assertEqual(c.name,'PHONE_NO') self.assertIsNone(c.description) self.assertListEqual(c.actions,['alter', 'drop']) self.assertFalse(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'PHONE_NO') d = c.get_dependents() self.assertEqual(len(d),1) d = d[0] self.assertEqual(d.dependent_name,'PHONE_LIST') self.assertEqual(d.dependent_type,1) self.assertIsInstance(d.dependent,sm.View) self.assertEqual(d.depended_on_name,'DEPARTMENT') self.assertEqual(d.depended_on_type,0) self.assertIsInstance(d.depended_on,sm.TableColumn) self.assertListEqual(c.get_dependencies(),[]) # self.assertEqual(c.table.name,'DEPARTMENT') self.assertEqual(c.domain.name,'PHONENUMBER') self.assertEqual(c.position,6) self.assertIsNone(c.security_class) self.assertEqual(c.default,"'555-1234'") self.assertIsNone(c.collation) self.assertEqual(c.datatype,'VARCHAR(20)') # self.assertTrue(c.isnullable()) self.assertFalse(c.iscomputed()) self.assertTrue(c.isdomainbased()) self.assertTrue(c.has_default()) self.assertIsNone(c.get_computedby()) # self.assertEqual(c.get_sql_for('drop'), "ALTER TABLE DEPARTMENT DROP PHONE_NO") self.assertEqual(c.get_sql_for('alter',name='NewName'), 'ALTER TABLE DEPARTMENT ALTER COLUMN PHONE_NO TO "NewName"') self.assertEqual(c.get_sql_for('alter',position=2), "ALTER TABLE DEPARTMENT ALTER COLUMN PHONE_NO POSITION 2") self.assertEqual(c.get_sql_for('alter',datatype='VARCHAR(25)'), "ALTER TABLE DEPARTMENT ALTER COLUMN PHONE_NO TYPE VARCHAR(25)") with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('alter',badparam=10) self.assertTupleEqual(cm.exception.args,("Unsupported parameter(s) 'badparam'",)) with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('alter') self.assertTupleEqual(cm.exception.args,("Parameter required.",)) with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('alter',expression='(1+1)') self.assertTupleEqual(cm.exception.args, ("Change from persistent column to computed is not allowed.",)) # Computed column c = self.con.schema.get_table('EMPLOYEE').get_column('FULL_NAME') self.assertTrue(c.isnullable()) self.assertTrue(c.iscomputed()) self.assertFalse(c.isdomainbased()) self.assertFalse(c.has_default()) self.assertEqual(c.get_computedby(),"(last_name || ', ' || first_name)") self.assertEqual(c.datatype,'VARCHAR(0)') # self.assertEqual(c.get_sql_for('alter',datatype='VARCHAR(50)', expression="(first_name || ', ' || last_name)"), "ALTER TABLE EMPLOYEE ALTER COLUMN FULL_NAME TYPE VARCHAR(50) " \ "COMPUTED BY (first_name || ', ' || last_name)") with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('alter',datatype='VARCHAR(50)') self.assertTupleEqual(cm.exception.args, ("Change from computed column to persistent is not allowed.",)) # Array column c = self.con.schema.get_table('AR').get_column('C2') self.assertEqual(c.datatype,'INTEGER[4, 0:3, 2]') def testIndex(self): # System index c = self.con.schema.get_index('RDB$INDEX_0') # common properties self.assertEqual(c.name,'RDB$INDEX_0') self.assertIsNone(c.description) self.assertListEqual(c.actions,['recompute']) self.assertTrue(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'RDB$INDEX_0') self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # self.assertEqual(c.table.name,'RDB$RELATIONS') self.assertListEqual(c.segment_names,['RDB$RELATION_NAME']) # user index c = self.con.schema.get_index('MAXSALX') # common properties self.assertEqual(c.name,'MAXSALX') self.assertIsNone(c.description) self.assertListEqual(c.actions, ['create', 'activate', 'deactivate', 'recompute', 'drop']) self.assertFalse(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'MAXSALX') self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # self.assertEqual(c.id,3) self.assertEqual(c.table.name,'JOB') self.assertEqual(c.index_type,'DESCENDING') self.assertIsNone(c.partner_index) self.assertIsNone(c.expression) # startswith() is necessary, because Python 3 returns more precise value. self.assertTrue(str(c.statistics).startswith('0.0384615398943')) self.assertListEqual(c.segment_names,['JOB_COUNTRY', 'MAX_SALARY']) self.assertEqual(len(c.segments),2) for segment in c.segments: self.assertIsInstance(segment,sm.TableColumn) self.assertEqual(c.segments[0].name,'JOB_COUNTRY') self.assertEqual(c.segments[1].name,'MAX_SALARY') if self.con.ods <= fdb.ODS_FB_20: self.assertListEqual(c.segment_statistics,[None, None]) elif self.con.ods > fdb.ODS_FB_20: self.assertListEqual(c.segment_statistics, [0.1428571492433548, 0.03846153989434242]) self.assertIsNone(c.constraint) # self.assertFalse(c.isexpression()) self.assertFalse(c.isunique()) self.assertFalse(c.isinactive()) self.assertFalse(c.isenforcer()) # self.assertEqual(c.get_sql_for('create'),"""CREATE DESCENDING INDEX MAXSALX ON JOB (JOB_COUNTRY,MAX_SALARY)""") self.assertEqual(c.get_sql_for('activate'),"ALTER INDEX MAXSALX ACTIVE") self.assertEqual(c.get_sql_for('deactivate'),"ALTER INDEX MAXSALX INACTIVE") self.assertEqual(c.get_sql_for('recompute'),"SET STATISTICS INDEX MAXSALX") self.assertEqual(c.get_sql_for('drop'),"DROP INDEX MAXSALX") # Constraint index c = self.con.schema.get_index('RDB$FOREIGN6') # common properties self.assertEqual(c.name,'RDB$FOREIGN6') self.assertTrue(c.issystemobject()) self.assertTrue(c.isenforcer()) self.assertEqual(c.partner_index.name,'RDB$PRIMARY5') self.assertEqual(c.constraint.name,'INTEG_17') def testViewColumn(self): c = self.con.schema.get_view('PHONE_LIST').get_column('LAST_NAME') # common properties self.assertEqual(c.name,'LAST_NAME') self.assertIsNone(c.description) self.assertListEqual(c.actions,[]) self.assertFalse(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'LAST_NAME') self.assertListEqual(c.get_dependents(),[]) d = c.get_dependencies() self.assertEqual(len(d),1) d = d[0] self.assertEqual(d.dependent_name,'PHONE_LIST') self.assertEqual(d.dependent_type,1) self.assertIsInstance(d.dependent,sm.View) self.assertEqual(d.field_name,'LAST_NAME') self.assertEqual(d.depended_on_name,'EMPLOYEE') self.assertEqual(d.depended_on_type,0) self.assertIsInstance(d.depended_on,sm.TableColumn) self.assertEqual(d.depended_on.name,'LAST_NAME') self.assertEqual(d.depended_on.table.name,'EMPLOYEE') # self.assertEqual(c.view.name,'PHONE_LIST') self.assertEqual(c.base_field.name,'LAST_NAME') self.assertEqual(c.base_field.table.name,'EMPLOYEE') self.assertEqual(c.domain.name,'LASTNAME') self.assertEqual(c.position,2) self.assertIsNone(c.security_class) self.assertEqual(c.collation.name,'NONE') self.assertEqual(c.datatype,'VARCHAR(20)') # self.assertTrue(c.isnullable()) def testDomain(self): # System domain c = self.con.schema.get_domain('RDB$6') # common properties self.assertEqual(c.name,'RDB$6') self.assertIsNone(c.description) self.assertListEqual(c.actions,[]) self.assertTrue(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'RDB$6') self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # User domain c = self.con.schema.get_domain('PRODTYPE') # common properties self.assertEqual(c.name,'PRODTYPE') self.assertIsNone(c.description) self.assertListEqual(c.actions,['create', 'alter', 'drop']) self.assertFalse(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'PRODTYPE') self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # self.assertIsNone(c.expression) self.assertEqual(c.validation, "CHECK (VALUE IN ('software', 'hardware', 'other', 'N/A'))") self.assertEqual(c.default,"'software'") self.assertEqual(c.length,12) self.assertEqual(c.scale,0) self.assertEqual(c.field_type,37) self.assertEqual(c.sub_type,0) self.assertIsNone(c.segment_length) self.assertIsNone(c.external_length) self.assertIsNone(c.external_scale) self.assertIsNone(c.external_type) self.assertListEqual(c.dimensions,[]) self.assertEqual(c.character_length,12) self.assertEqual(c.collation.name,'NONE') self.assertEqual(c.character_set.name,'NONE') self.assertIsNone(c.precision) self.assertEqual(c.datatype,'VARCHAR(12)') # self.assertFalse(c.isnullable()) self.assertFalse(c.iscomputed()) self.assertTrue(c.isvalidated()) self.assertFalse(c.isarray()) self.assertTrue(c.has_default()) # self.assertEqual(c.get_sql_for('create'), "CREATE DOMAIN PRODTYPE AS VARCHAR(12) DEFAULT 'software' " \ "CHECK (VALUE IN ('software', 'hardware', 'other', 'N/A'))") self.assertEqual(c.get_sql_for('drop'),"DROP DOMAIN PRODTYPE") self.assertEqual(c.get_sql_for('alter',name='New_name'), 'ALTER DOMAIN PRODTYPE TO "New_name"') self.assertEqual(c.get_sql_for('alter',default="'New_default'"), "ALTER DOMAIN PRODTYPE SET DEFAULT 'New_default'") self.assertEqual(c.get_sql_for('alter',check="VALUE STARTS WITH 'X'"), "ALTER DOMAIN PRODTYPE ADD CHECK (VALUE STARTS WITH 'X')") self.assertEqual(c.get_sql_for('alter',datatype='VARCHAR(30)'), "ALTER DOMAIN PRODTYPE TYPE VARCHAR(30)") with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('alter',badparam=10) self.assertTupleEqual(cm.exception.args, ("Unsupported parameter(s) 'badparam'",)) with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('alter') self.assertTupleEqual(cm.exception.args,("Parameter required.",)) # Domain with quoted name c = self.con.schema.get_domain('FIRSTNAME') self.assertEqual(c.name,'FIRSTNAME') self.assertEqual(c.get_quoted_name(),'"FIRSTNAME"') self.assertEqual(c.get_sql_for('create'), 'CREATE DOMAIN "FIRSTNAME" AS VARCHAR(15)') def testDependency(self): l = self.con.schema.get_table('DEPARTMENT').get_dependents() self.assertEqual(len(l),18) c = l[0] # common properties self.assertIsNone(c.name) self.assertIsNone(c.description) self.assertListEqual(c.actions,[]) self.assertTrue(c.issystemobject()) self.assertIsNone(c.get_quoted_name()) self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # self.assertEqual(c.dependent_name,'PHONE_LIST') self.assertEqual(c.dependent_type,1) self.assertIsInstance(c.dependent,sm.View) self.assertEqual(c.dependent.name,'PHONE_LIST') self.assertEqual(c.field_name,'DEPT_NO') self.assertEqual(c.depended_on_name,'DEPARTMENT') self.assertEqual(c.depended_on_type,0) self.assertIsInstance(c.depended_on,sm.TableColumn) self.assertEqual(c.depended_on.name,'DEPT_NO') def testConstraint(self): # Common / PRIMARY KEY c = self.con.schema.get_table('CUSTOMER').primary_key # common properties self.assertEqual(c.name,'INTEG_60') self.assertIsNone(c.description) self.assertListEqual(c.actions,['create', 'drop']) self.assertFalse(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'INTEG_60') self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # self.assertEqual(c.constraint_type,'PRIMARY KEY') self.assertEqual(c.table.name,'CUSTOMER') self.assertEqual(c.index.name,'RDB$PRIMARY22') self.assertListEqual(c.trigger_names,[]) self.assertListEqual(c.triggers,[]) self.assertIsNone(c.column_name) self.assertIsNone(c.partner_constraint) self.assertIsNone(c.match_option) self.assertIsNone(c.update_rule) self.assertIsNone(c.delete_rule) # self.assertFalse(c.isnotnull()) self.assertTrue(c.ispkey()) self.assertFalse(c.isfkey()) self.assertFalse(c.isunique()) self.assertFalse(c.ischeck()) self.assertFalse(c.isdeferrable()) self.assertFalse(c.isdeferred()) # self.assertEqual(c.get_sql_for('create'), "ALTER TABLE CUSTOMER ADD PRIMARY KEY (CUST_NO)") self.assertEqual(c.get_sql_for('drop'), "ALTER TABLE CUSTOMER DROP CONSTRAINT INTEG_60") # FOREIGN KEY c = self.con.schema.get_table('CUSTOMER').foreign_keys[0] # self.assertListEqual(c.actions,['create', 'drop']) self.assertEqual(c.constraint_type,'FOREIGN KEY') self.assertEqual(c.table.name,'CUSTOMER') self.assertEqual(c.index.name,'RDB$FOREIGN23') self.assertListEqual(c.trigger_names,[]) self.assertListEqual(c.triggers,[]) self.assertIsNone(c.column_name) self.assertEqual(c.partner_constraint.name,'INTEG_2') self.assertEqual(c.match_option,'FULL') self.assertEqual(c.update_rule,'RESTRICT') self.assertEqual(c.delete_rule,'RESTRICT') # self.assertFalse(c.isnotnull()) self.assertFalse(c.ispkey()) self.assertTrue(c.isfkey()) self.assertFalse(c.isunique()) self.assertFalse(c.ischeck()) # self.assertEqual(c.get_sql_for('create'), """ALTER TABLE CUSTOMER ADD FOREIGN KEY (COUNTRY) REFERENCES COUNTRY (COUNTRY)""") # CHECK c = self.con.schema.get_constraint('INTEG_59') # self.assertListEqual(c.actions,['create', 'drop']) self.assertEqual(c.constraint_type,'CHECK') self.assertEqual(c.table.name,'CUSTOMER') self.assertIsNone(c.index) self.assertListEqual(c.trigger_names,['CHECK_9', 'CHECK_10']) self.assertEqual(c.triggers[0].name,'CHECK_9') self.assertEqual(c.triggers[1].name,'CHECK_10') self.assertIsNone(c.column_name) self.assertIsNone(c.partner_constraint) self.assertIsNone(c.match_option) self.assertIsNone(c.update_rule) self.assertIsNone(c.delete_rule) # self.assertFalse(c.isnotnull()) self.assertFalse(c.ispkey()) self.assertFalse(c.isfkey()) self.assertFalse(c.isunique()) self.assertTrue(c.ischeck()) # self.assertEqual(c.get_sql_for('create'), "ALTER TABLE CUSTOMER ADD CHECK (on_hold IS NULL OR on_hold = '*')") # UNIQUE c = self.con.schema.get_constraint('INTEG_15') # self.assertListEqual(c.actions,['create', 'drop']) self.assertEqual(c.constraint_type,'UNIQUE') self.assertEqual(c.table.name,'DEPARTMENT') self.assertEqual(c.index.name,'RDB$4') self.assertListEqual(c.trigger_names,[]) self.assertListEqual(c.triggers,[]) self.assertIsNone(c.column_name) self.assertIsNone(c.partner_constraint) self.assertIsNone(c.match_option) self.assertIsNone(c.update_rule) self.assertIsNone(c.delete_rule) # self.assertFalse(c.isnotnull()) self.assertFalse(c.ispkey()) self.assertFalse(c.isfkey()) self.assertTrue(c.isunique()) self.assertFalse(c.ischeck()) # self.assertEqual(c.get_sql_for('create'), "ALTER TABLE DEPARTMENT ADD UNIQUE (DEPARTMENT)") # NOT NULL c = self.con.schema.get_constraint('INTEG_13') # self.assertListEqual(c.actions,[]) self.assertEqual(c.constraint_type,'NOT NULL') self.assertEqual(c.table.name,'DEPARTMENT') self.assertIsNone(c.index) self.assertListEqual(c.trigger_names,[]) self.assertListEqual(c.triggers,[]) self.assertEqual(c.column_name,'DEPT_NO') self.assertIsNone(c.partner_constraint) self.assertIsNone(c.match_option) self.assertIsNone(c.update_rule) self.assertIsNone(c.delete_rule) # self.assertTrue(c.isnotnull()) self.assertFalse(c.ispkey()) self.assertFalse(c.isfkey()) self.assertFalse(c.isunique()) self.assertFalse(c.ischeck()) def testTable(self): # System table c = self.con.schema.get_table('RDB$PAGES') # common properties self.assertEqual(c.name,'RDB$PAGES') self.assertIsNone(c.description) self.assertListEqual(c.actions,[]) self.assertTrue(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'RDB$PAGES') self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # User table c = self.con.schema.get_table('EMPLOYEE') # common properties self.assertEqual(c.name,'EMPLOYEE') self.assertIsNone(c.description) self.assertListEqual(c.actions,['create', 'recreate', 'drop']) self.assertFalse(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'EMPLOYEE') d = c.get_dependents() if self.con.ods <= fdb.ODS_FB_20: self.assertListEqual([(x.dependent_name,x.dependent_type) for x in d], [('RDB$9', 3), ('RDB$9', 3), ('PHONE_LIST', 1), ('PHONE_LIST', 1), ('PHONE_LIST', 1), ('PHONE_LIST', 1), ('PHONE_LIST', 1), ('PHONE_LIST', 1), ('CHECK_3', 2), ('CHECK_3', 2), ('CHECK_3', 2), ('CHECK_3', 2), ('CHECK_4', 2), ('CHECK_4', 2), ('CHECK_4', 2), ('CHECK_4', 2), ('SET_EMP_NO', 2), ('SAVE_SALARY_CHANGE', 2), ('SAVE_SALARY_CHANGE', 2), ('DELETE_EMPLOYEE', 5), ('DELETE_EMPLOYEE', 5), ('ORG_CHART', 5), ('ORG_CHART', 5), ('ORG_CHART', 5), ('ORG_CHART', 5), ('ORG_CHART', 5)]) elif self.con.ods == fdb.ODS_FB_21: self.assertListEqual([(x.dependent_name,x.dependent_type) for x in d], [('PHONE_LIST', 1), ('PHONE_LIST', 1), ('PHONE_LIST', 1), ('PHONE_LIST', 1), ('PHONE_LIST', 1), ('CHECK_3', 2), ('CHECK_3', 2), ('CHECK_3', 2), ('CHECK_3', 2), ('CHECK_4', 2), ('CHECK_4', 2), ('CHECK_4', 2), ('CHECK_4', 2), ('SET_EMP_NO', 2), ('SAVE_SALARY_CHANGE', 2), ('SAVE_SALARY_CHANGE', 2), ('PHONE_LIST', 1), ('DELETE_EMPLOYEE', 5), ('DELETE_EMPLOYEE', 5), ('ORG_CHART', 5), ('ORG_CHART', 5), ('ORG_CHART', 5), ('ORG_CHART', 5), ('ORG_CHART', 5)]) elif self.con.ods >= fdb.ODS_FB_25: self.assertListEqual([(x.dependent_name,x.dependent_type) for x in d], [('RDB$9', 3), ('RDB$9', 3), ('PHONE_LIST', 1), ('PHONE_LIST', 1), ('PHONE_LIST', 1), ('CHECK_3', 2), ('CHECK_3', 2), ('CHECK_3', 2), ('CHECK_3', 2), ('CHECK_4', 2), ('CHECK_4', 2), ('CHECK_4', 2), ('CHECK_4', 2), ('SET_EMP_NO', 2), ('SAVE_SALARY_CHANGE', 2), ('PHONE_LIST', 1), ('PHONE_LIST', 1), ('SAVE_SALARY_CHANGE', 2), ('PHONE_LIST', 1), ('ORG_CHART', 5), ('ORG_CHART', 5), ('ORG_CHART', 5), ('ORG_CHART', 5), ('ORG_CHART', 5), ('DELETE_EMPLOYEE', 5), ('DELETE_EMPLOYEE', 5)]) self.assertListEqual(c.get_dependencies(),[]) # self.assertEqual(c.id,131) self.assertEqual(c.dbkey_length,8) if self.con.ods <= fdb.ODS_FB_20: self.assertEqual(c.format,1) elif self.con.ods > fdb.ODS_FB_20: self.assertEqual(c.format,2) self.assertEqual(c.table_type,'PERSISTENT') if self.con.ods <= fdb.ODS_FB_21: self.assertEqual(c.security_class,'SQL$EMPLOYEE') elif self.con.ods == fdb.ODS_FB_25: self.assertEqual(c.security_class,'SQL$7') else: self.assertEqual(c.security_class,'SQL$482') self.assertIsNone(c.external_file) self.assertEqual(c.owner_name,'SYSDBA') if self.con.ods <= fdb.ODS_FB_20: self.assertEqual(c.default_class,'SQL$DEFAULT5') elif self.con.ods > fdb.ODS_FB_20: self.assertEqual(c.default_class,'SQL$DEFAULT7') self.assertEqual(c.flags,1) self.assertEqual(c.primary_key.name,'INTEG_27') self.assertListEqual([x.name for x in c.foreign_keys], ['INTEG_28', 'INTEG_29']) self.assertListEqual([x.name for x in c.columns], ['EMP_NO', 'FIRST_NAME', 'LAST_NAME', 'PHONE_EXT', 'HIRE_DATE', 'DEPT_NO', 'JOB_CODE', 'JOB_GRADE', 'JOB_COUNTRY', 'SALARY', 'FULL_NAME']) self.assertListEqual([x.name for x in c.constraints], ['INTEG_18', 'INTEG_19', 'INTEG_20', 'INTEG_21', 'INTEG_22', 'INTEG_23', 'INTEG_24', 'INTEG_25', 'INTEG_26', 'INTEG_27', 'INTEG_28', 'INTEG_29', 'INTEG_30']) self.assertListEqual([x.name for x in c.indices], ['RDB$PRIMARY7', 'RDB$FOREIGN8', 'RDB$FOREIGN9', 'NAMEX']) self.assertListEqual([x.name for x in c.triggers], ['SET_EMP_NO', 'SAVE_SALARY_CHANGE']) # self.assertEqual(c.get_column('EMP_NO').name,'EMP_NO') self.assertFalse(c.isgtt()) self.assertTrue(c.ispersistent()) self.assertFalse(c.isexternal()) self.assertTrue(c.has_pkey()) self.assertTrue(c.has_fkey()) # self.assertEqual(c.get_sql_for('create'),"""CREATE TABLE EMPLOYEE ( EMP_NO EMPNO NOT NULL, FIRST_NAME "FIRSTNAME" NOT NULL, LAST_NAME "LASTNAME" NOT NULL, PHONE_EXT VARCHAR(4), HIRE_DATE TIMESTAMP DEFAULT 'NOW' NOT NULL, DEPT_NO DEPTNO NOT NULL, JOB_CODE JOBCODE NOT NULL, JOB_GRADE JOBGRADE NOT NULL, JOB_COUNTRY COUNTRYNAME NOT NULL, SALARY SALARY NOT NULL, FULL_NAME COMPUTED BY (last_name || ', ' || first_name), PRIMARY KEY (EMP_NO) )""") self.assertEqual(c.get_sql_for('recreate'),"""RECREATE TABLE EMPLOYEE ( EMP_NO EMPNO NOT NULL, FIRST_NAME "FIRSTNAME" NOT NULL, LAST_NAME "LASTNAME" NOT NULL, PHONE_EXT VARCHAR(4), HIRE_DATE TIMESTAMP DEFAULT 'NOW' NOT NULL, DEPT_NO DEPTNO NOT NULL, JOB_CODE JOBCODE NOT NULL, JOB_GRADE JOBGRADE NOT NULL, JOB_COUNTRY COUNTRYNAME NOT NULL, SALARY SALARY NOT NULL, FULL_NAME COMPUTED BY (last_name || ', ' || first_name), PRIMARY KEY (EMP_NO) )""") self.assertEqual(c.get_sql_for('drop'),"DROP TABLE EMPLOYEE") def testView(self): # User view c = self.con.schema.get_view('PHONE_LIST') # common properties self.assertEqual(c.name,'PHONE_LIST') self.assertIsNone(c.description) self.assertListEqual(c.actions,['create', 'recreate', 'alter', 'create_or_alter', 'drop']) self.assertFalse(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'PHONE_LIST') self.assertListEqual(c.get_dependents(),[]) d = c.get_dependencies() self.assertListEqual([(x.depended_on_name,x.field_name,x.depended_on_type) for x in d], [('DEPARTMENT', 'DEPT_NO', 0), ('EMPLOYEE', 'DEPT_NO', 0), ('DEPARTMENT', None, 0), ('EMPLOYEE', None, 0), ('DEPARTMENT', 'PHONE_NO', 0), ('EMPLOYEE', 'PHONE_EXT', 0), ('EMPLOYEE', 'LAST_NAME', 0), ('EMPLOYEE', 'EMP_NO', 0), ('DEPARTMENT', 'LOCATION', 0), ('EMPLOYEE', 'FIRST_NAME', 0)]) # self.assertEqual(c.id,143) self.assertEqual(c.sql,"""SELECT emp_no, first_name, last_name, phone_ext, location, phone_no FROM employee, department WHERE employee.dept_no = department.dept_no""") self.assertEqual(c.dbkey_length,16) self.assertEqual(c.format,1) if self.con.ods <= fdb.ODS_FB_21: self.assertEqual(c.security_class,'SQL$PHONE_LIST') elif self.con.ods == fdb.ODS_FB_25: self.assertEqual(c.security_class,'SQL$8') else: self.assertEqual(c.security_class,'SQL$483') self.assertEqual(c.owner_name,'SYSDBA') if self.con.ods <= fdb.ODS_FB_20: self.assertEqual(c.default_class,'SQL$DEFAULT17') elif self.con.ods > fdb.ODS_FB_20: self.assertEqual(c.default_class,'SQL$DEFAULT19') self.assertEqual(c.flags,1) self.assertListEqual([x.name for x in c.columns],['EMP_NO', 'FIRST_NAME', 'LAST_NAME', 'PHONE_EXT', 'LOCATION', 'PHONE_NO']) self.assertListEqual(c.triggers,[]) # self.assertEqual(c.get_column('LAST_NAME').name,'LAST_NAME') self.assertFalse(c.has_checkoption()) # self.assertEqual(c.get_sql_for('create'), """CREATE VIEW PHONE_LIST (EMP_NO,FIRST_NAME,LAST_NAME,PHONE_EXT,LOCATION,PHONE_NO) AS SELECT emp_no, first_name, last_name, phone_ext, location, phone_no FROM employee, department WHERE employee.dept_no = department.dept_no""") self.assertEqual(c.get_sql_for('recreate'), """RECREATE VIEW PHONE_LIST (EMP_NO,FIRST_NAME,LAST_NAME,PHONE_EXT,LOCATION,PHONE_NO) AS SELECT emp_no, first_name, last_name, phone_ext, location, phone_no FROM employee, department WHERE employee.dept_no = department.dept_no""") self.assertEqual(c.get_sql_for('drop'),"DROP VIEW PHONE_LIST") self.assertEqual(c.get_sql_for('alter',query='select * from country'), "ALTER VIEW PHONE_LIST \n AS\n select * from country") self.assertEqual(c.get_sql_for('alter',columns='country,currency', query='select * from country'), "ALTER VIEW PHONE_LIST (country,currency)\n AS\n select * from country") self.assertEqual(c.get_sql_for('alter',columns='country,currency', query='select * from country',check=True), "ALTER VIEW PHONE_LIST (country,currency)\n AS\n select * from country\n WITH CHECK OPTION") self.assertEqual(c.get_sql_for('alter',columns=('country','currency'), query='select * from country',check=True), "ALTER VIEW PHONE_LIST (country,currency)\n AS\n select * from country\n WITH CHECK OPTION") with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('alter',badparam='select * from country') self.assertTupleEqual(cm.exception.args, ("Unsupported parameter(s) 'badparam'",)) with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('alter') self.assertTupleEqual(cm.exception.args,("Missing required parameter: 'query'.",)) self.assertEqual(c.get_sql_for('create_or_alter'), """CREATE OR ALTER VIEW PHONE_LIST (EMP_NO,FIRST_NAME,LAST_NAME,PHONE_EXT,LOCATION,PHONE_NO) AS SELECT emp_no, first_name, last_name, phone_ext, location, phone_no FROM employee, department WHERE employee.dept_no = department.dept_no""") def testTrigger(self): # System trigger c = self.con.schema.get_trigger('RDB$TRIGGER_1') # common properties self.assertEqual(c.name,'RDB$TRIGGER_1') self.assertIsNone(c.description) self.assertListEqual(c.actions,[]) self.assertTrue(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'RDB$TRIGGER_1') self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # User trigger c = self.con.schema.get_trigger('SET_EMP_NO') # common properties self.assertEqual(c.name,'SET_EMP_NO') self.assertIsNone(c.description) self.assertListEqual(c.actions, ['create', 'recreate', 'alter', 'create_or_alter', 'drop']) self.assertFalse(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'SET_EMP_NO') self.assertListEqual(c.get_dependents(),[]) d = c.get_dependencies() self.assertListEqual([(x.depended_on_name,x.field_name,x.depended_on_type) for x in d], [('EMPLOYEE', 'EMP_NO', 0), ('EMP_NO_GEN', None, 14)]) # self.assertEqual(c.relation.name,'EMPLOYEE') self.assertEqual(c.sequence,0) self.assertEqual(c.trigger_type,1) self.assertEqual(c.source, "AS\nBEGIN\n if (new.emp_no is null) then\n new.emp_no = gen_id(emp_no_gen, 1);\nEND") self.assertEqual(c.flags,1) # self.assertTrue(c.isactive()) self.assertTrue(c.isbefore()) self.assertFalse(c.isafter()) self.assertFalse(c.isdbtrigger()) self.assertTrue(c.isinsert()) self.assertFalse(c.isupdate()) self.assertFalse(c.isdelete()) self.assertEqual(c.get_type_as_string(),'BEFORE INSERT') # self.assertEqual(c.get_sql_for('create'), """CREATE TRIGGER SET_EMP_NO FOR EMPLOYEE ACTIVE BEFORE INSERT POSITION 0 AS BEGIN if (new.emp_no is null) then new.emp_no = gen_id(emp_no_gen, 1); END""") self.assertEqual(c.get_sql_for('recreate'), """RECREATE TRIGGER SET_EMP_NO FOR EMPLOYEE ACTIVE BEFORE INSERT POSITION 0 AS BEGIN if (new.emp_no is null) then new.emp_no = gen_id(emp_no_gen, 1); END""") with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('alter') self.assertTupleEqual(cm.exception.args, ("Header or body definition required.",)) with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('alter',declare="DECLARE VARIABLE i integer;") self.assertTupleEqual(cm.exception.args, ("Header or body definition required.",)) self.assertEqual(c.get_sql_for('alter',fire_on='AFTER INSERT', active=False,sequence=0, declare=' DECLARE VARIABLE i integer;\n DECLARE VARIABLE x integer;', code=' i = 1;\n x = 2;'), """ALTER TRIGGER SET_EMP_NO INACTIVE AFTER INSERT POSITION 0 AS DECLARE VARIABLE i integer; DECLARE VARIABLE x integer; BEGIN i = 1; x = 2; END""") self.assertEqual(c.get_sql_for('alter', declare=['DECLARE VARIABLE i integer;', 'DECLARE VARIABLE x integer;'], code=['i = 1;','x = 2;']), """ALTER TRIGGER SET_EMP_NO AS DECLARE VARIABLE i integer; DECLARE VARIABLE x integer; BEGIN i = 1; x = 2; END""") self.assertEqual(c.get_sql_for('alter',active=False), "ALTER TRIGGER SET_EMP_NO INACTIVE") self.assertEqual(c.get_sql_for('alter',sequence=10, code=('i = 1;','x = 2;')), """ALTER TRIGGER SET_EMP_NO POSITION 10 AS BEGIN i = 1; x = 2; END""") with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('alter',fire_on='ON CONNECT') self.assertTupleEqual(cm.exception.args, ("Trigger type change is not allowed.",)) self.assertEqual(c.get_sql_for('create_or_alter'), """CREATE OR ALTER TRIGGER SET_EMP_NO FOR EMPLOYEE ACTIVE BEFORE INSERT POSITION 0 AS BEGIN if (new.emp_no is null) then new.emp_no = gen_id(emp_no_gen, 1); END""") self.assertEqual(c.get_sql_for('drop'),"DROP TRIGGER SET_EMP_NO") # Multi-trigger c = self.con.schema.get_trigger('TR_MULTI') # self.assertTrue(c.isinsert()) self.assertTrue(c.isupdate()) self.assertTrue(c.isdelete()) self.assertEqual(c.get_type_as_string(), 'AFTER INSERT OR UPDATE OR DELETE') # DB trigger c = self.con.schema.get_trigger('TR_CONNECT') # self.assertTrue(c.isdbtrigger()) self.assertFalse(c.isinsert()) self.assertFalse(c.isupdate()) self.assertFalse(c.isdelete()) self.assertEqual(c.get_type_as_string(),'ON CONNECT') def testProcedureParameter(self): # Input parameter c = self.con.schema.get_procedure('GET_EMP_PROJ').input_params[0] # common properties self.assertEqual(c.name,'EMP_NO') self.assertIsNone(c.description) self.assertListEqual(c.actions,[]) self.assertFalse(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'EMP_NO') self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # self.assertEqual(c.procedure.name,'GET_EMP_PROJ') self.assertEqual(c.sequence,0) self.assertEqual(c.domain.name,'RDB$32') self.assertEqual(c.datatype,'SMALLINT') self.assertEqual(c.type_from,fdb.schema.PROCPAR_DATATYPE) self.assertIsNone(c.default) self.assertIsNone(c.collation) if self.con.ods <= fdb.ODS_FB_20: self.assertIsNone(c.mechanism) elif self.con.ods > fdb.ODS_FB_20: self.assertEqual(c.mechanism,0) self.assertIsNone(c.column) # self.assertTrue(c.isinput()) self.assertTrue(c.isnullable()) self.assertFalse(c.has_default()) self.assertEqual(c.get_sql_definition(),'EMP_NO SMALLINT') # Output parameter c = self.con.schema.get_procedure('GET_EMP_PROJ').output_params[0] # common properties self.assertEqual(c.name,'PROJ_ID') self.assertIsNone(c.description) self.assertListEqual(c.actions,[]) self.assertFalse(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'PROJ_ID') self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # self.assertFalse(c.isinput()) self.assertEqual(c.get_sql_definition(),'PROJ_ID CHAR(5)') def testProcedure(self): c = self.con.schema.get_procedure('GET_EMP_PROJ') # common properties self.assertEqual(c.name,'GET_EMP_PROJ') self.assertIsNone(c.description) self.assertListEqual(c.actions, ['create', 'recreate', 'alter', 'create_or_alter', 'drop']) self.assertFalse(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'GET_EMP_PROJ') self.assertListEqual(c.get_dependents(),[]) d = c.get_dependencies() self.assertListEqual([(x.depended_on_name,x.field_name,x.depended_on_type) for x in d], [('EMPLOYEE_PROJECT', 'PROJ_ID', 0), ('EMPLOYEE_PROJECT', 'EMP_NO', 0), ('EMPLOYEE_PROJECT', None, 0)]) # self.assertEqual(c.id,1) self.assertEqual(c.source,"""BEGIN FOR SELECT proj_id FROM employee_project WHERE emp_no = :emp_no INTO :proj_id DO SUSPEND; END""") if self.con.ods < fdb.ODS_FB_25: self.assertEqual(c.security_class,'SQL$GET_EMP_PROJ') elif self.con.ods == fdb.ODS_FB_25: self.assertEqual(c.security_class,'SQL$20') elif self.con.ods >= fdb.ODS_FB_30: self.assertEqual(c.security_class,'SQL$510') self.assertEqual(c.owner_name,'SYSDBA') self.assertListEqual([x.name for x in c.input_params],['EMP_NO']) self.assertListEqual([x.name for x in c.output_params],['PROJ_ID']) self.assertEqual(c.proc_type,0) if self.con.engine_version >= 3.0: self.assertTrue(c.valid_blr) else: self.assertIsNone(c.valid_blr) # self.assertEqual(c.get_param('EMP_NO').name,'EMP_NO') self.assertEqual(c.get_param('PROJ_ID').name,'PROJ_ID') # self.assertEqual(c.get_sql_for('create'), """CREATE PROCEDURE GET_EMP_PROJ (EMP_NO SMALLINT) RETURNS (PROJ_ID CHAR(5)) AS BEGIN FOR SELECT proj_id FROM employee_project WHERE emp_no = :emp_no INTO :proj_id DO SUSPEND; END""") self.assertEqual(c.get_sql_for('create',no_code=True), """CREATE PROCEDURE GET_EMP_PROJ (EMP_NO SMALLINT) RETURNS (PROJ_ID CHAR(5)) AS BEGIN END""") self.assertEqual(c.get_sql_for('recreate'), """RECREATE PROCEDURE GET_EMP_PROJ (EMP_NO SMALLINT) RETURNS (PROJ_ID CHAR(5)) AS BEGIN FOR SELECT proj_id FROM employee_project WHERE emp_no = :emp_no INTO :proj_id DO SUSPEND; END""") self.assertEqual(c.get_sql_for('recreate',no_code=True), """RECREATE PROCEDURE GET_EMP_PROJ (EMP_NO SMALLINT) RETURNS (PROJ_ID CHAR(5)) AS BEGIN END""") self.assertEqual(c.get_sql_for('create_or_alter'), """CREATE OR ALTER PROCEDURE GET_EMP_PROJ (EMP_NO SMALLINT) RETURNS (PROJ_ID CHAR(5)) AS BEGIN FOR SELECT proj_id FROM employee_project WHERE emp_no = :emp_no INTO :proj_id DO SUSPEND; END""") self.assertEqual(c.get_sql_for('create_or_alter',no_code=True), """CREATE OR ALTER PROCEDURE GET_EMP_PROJ (EMP_NO SMALLINT) RETURNS (PROJ_ID CHAR(5)) AS BEGIN END""") self.assertEqual(c.get_sql_for('drop'),"DROP PROCEDURE GET_EMP_PROJ") self.assertEqual(c.get_sql_for('alter',code=" /* PASS */"), """ALTER PROCEDURE GET_EMP_PROJ AS BEGIN /* PASS */ END""") with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('alter',declare="DECLARE VARIABLE i integer;") self.assertTupleEqual(cm.exception.args, ("Missing required parameter: 'code'.",)) self.assertEqual(c.get_sql_for('alter',code=''), """ALTER PROCEDURE GET_EMP_PROJ AS BEGIN END""") self.assertEqual(c.get_sql_for('alter',input="IN1 integer",code=''), """ALTER PROCEDURE GET_EMP_PROJ (IN1 integer) AS BEGIN END""") self.assertEqual(c.get_sql_for('alter',output="OUT1 integer",code=''), """ALTER PROCEDURE GET_EMP_PROJ RETURNS (OUT1 integer) AS BEGIN END""") self.assertEqual(c.get_sql_for('alter',input="IN1 integer", output="OUT1 integer",code=''), """ALTER PROCEDURE GET_EMP_PROJ (IN1 integer) RETURNS (OUT1 integer) AS BEGIN END""") self.assertEqual(c.get_sql_for('alter', input=["IN1 integer","IN2 VARCHAR(10)"], code=''), """ALTER PROCEDURE GET_EMP_PROJ ( IN1 integer, IN2 VARCHAR(10) ) AS BEGIN END""") self.assertEqual(c.get_sql_for('alter', output=["OUT1 integer","OUT2 VARCHAR(10)"], code=''), """ALTER PROCEDURE GET_EMP_PROJ RETURNS ( OUT1 integer, OUT2 VARCHAR(10) ) AS BEGIN END""") self.assertEqual(c.get_sql_for('alter', input=["IN1 integer","IN2 VARCHAR(10)"], output=["OUT1 integer","OUT2 VARCHAR(10)"], code=''), """ALTER PROCEDURE GET_EMP_PROJ ( IN1 integer, IN2 VARCHAR(10) ) RETURNS ( OUT1 integer, OUT2 VARCHAR(10) ) AS BEGIN END""") self.assertEqual(c.get_sql_for('alter',code=" -- line 1;\n -- line 2;"), """ALTER PROCEDURE GET_EMP_PROJ AS BEGIN -- line 1; -- line 2; END""") self.assertEqual(c.get_sql_for('alter',code=["-- line 1;","-- line 2;"]), """ALTER PROCEDURE GET_EMP_PROJ AS BEGIN -- line 1; -- line 2; END""") self.assertEqual(c.get_sql_for('alter',code=" /* PASS */", declare=" -- line 1;\n -- line 2;"), """ALTER PROCEDURE GET_EMP_PROJ AS -- line 1; -- line 2; BEGIN /* PASS */ END""") self.assertEqual(c.get_sql_for('alter',code=" /* PASS */", declare=["-- line 1;","-- line 2;"]), """ALTER PROCEDURE GET_EMP_PROJ AS -- line 1; -- line 2; BEGIN /* PASS */ END""") def testRole(self): c = self.con.schema.get_role('TEST_ROLE') # common properties self.assertEqual(c.name,'TEST_ROLE') self.assertIsNone(c.description) self.assertListEqual(c.actions,['create', 'drop']) self.assertFalse(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'TEST_ROLE') self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # self.assertEqual(c.owner_name,'SYSDBA') # self.assertEqual(c.get_sql_for('create'),"CREATE ROLE TEST_ROLE") self.assertEqual(c.get_sql_for('drop'),"DROP ROLE TEST_ROLE") def _mockFunction(self,name): f = None if name == 'STRLEN': f = sm.Function(self.con.schema, {'RDB$ENTRYPOINT': 'IB_UDF_strlen ', 'RDB$SYSTEM_FLAG': 0, 'RDB$RETURN_ARGUMENT': 0, 'RDB$MODULE_NAME': 'ib_udf', 'RDB$FUNCTION_TYPE': None, 'RDB$DESCRIPTION': None, 'RDB$FUNCTION_NAME': 'STRLEN '}) f._load_arguments( [{'RDB$FIELD_PRECISION': 0, 'RDB$FIELD_LENGTH': 4, 'RDB$FIELD_SCALE': 0, 'RDB$FIELD_SUB_TYPE': 0, 'RDB$FIELD_TYPE': 8, 'RDB$MECHANISM': 0, 'RDB$CHARACTER_SET_ID': None, 'RDB$CHARACTER_LENGTH': None, 'RDB$FUNCTION_NAME': 'STRLEN ', 'RDB$ARGUMENT_POSITION': 0}, {'RDB$FIELD_PRECISION': None, 'RDB$FIELD_LENGTH': 32767, 'RDB$FIELD_SCALE': 0, 'RDB$FIELD_SUB_TYPE': 0, 'RDB$FIELD_TYPE': 40, 'RDB$MECHANISM': 1, 'RDB$CHARACTER_SET_ID': 0, 'RDB$CHARACTER_LENGTH': 32767, 'RDB$FUNCTION_NAME': 'STRLEN ', 'RDB$ARGUMENT_POSITION': 1}]) elif name == 'STRING2BLOB': f = sm.Function(self.con.schema, {'RDB$ENTRYPOINT': 'string2blob ', 'RDB$SYSTEM_FLAG': 0, 'RDB$RETURN_ARGUMENT': 2, 'RDB$MODULE_NAME': 'fbudf', 'RDB$FUNCTION_TYPE': None, 'RDB$DESCRIPTION': None, 'RDB$FUNCTION_NAME': 'STRING2BLOB '}) f._load_arguments( [{'RDB$FIELD_PRECISION': None, 'RDB$FIELD_LENGTH': 300, 'RDB$FIELD_SCALE': 0, 'RDB$FIELD_SUB_TYPE': 0, 'RDB$FIELD_TYPE': 37, 'RDB$MECHANISM': 2, 'RDB$CHARACTER_SET_ID': 0, 'RDB$CHARACTER_LENGTH': 300, 'RDB$FUNCTION_NAME': 'STRING2BLOB ', 'RDB$ARGUMENT_POSITION': 1}, {'RDB$FIELD_PRECISION': None, 'RDB$FIELD_LENGTH': 8, 'RDB$FIELD_SCALE': 0, 'RDB$FIELD_SUB_TYPE': 0, 'RDB$FIELD_TYPE': 261, 'RDB$MECHANISM': 3, 'RDB$CHARACTER_SET_ID': None, 'RDB$CHARACTER_LENGTH': None, 'RDB$FUNCTION_NAME': 'STRING2BLOB ', 'RDB$ARGUMENT_POSITION': 2}]) elif name == 'LTRIM': f = sm.Function(self.con.schema, {'RDB$ENTRYPOINT': 'IB_UDF_ltrim ', 'RDB$SYSTEM_FLAG': 0, 'RDB$RETURN_ARGUMENT': 0, 'RDB$MODULE_NAME': 'ib_udf', 'RDB$FUNCTION_TYPE': None, 'RDB$DESCRIPTION': None, 'RDB$FUNCTION_NAME': 'LTRIM '}) f._load_arguments( [{'RDB$FIELD_PRECISION': None, 'RDB$FIELD_LENGTH': 255, 'RDB$FIELD_SCALE': 0, 'RDB$FIELD_SUB_TYPE': 0, 'RDB$FIELD_TYPE': 40, 'RDB$MECHANISM': -1, 'RDB$CHARACTER_SET_ID': 0, 'RDB$CHARACTER_LENGTH': 255, 'RDB$FUNCTION_NAME': 'LTRIM ', 'RDB$ARGUMENT_POSITION': 0}, {'RDB$FIELD_PRECISION': None, 'RDB$FIELD_LENGTH': 255, 'RDB$FIELD_SCALE': 0, 'RDB$FIELD_SUB_TYPE': 0, 'RDB$FIELD_TYPE': 40, 'RDB$MECHANISM': 1, 'RDB$CHARACTER_SET_ID': 0, 'RDB$CHARACTER_LENGTH': 255, 'RDB$FUNCTION_NAME': 'LTRIM ', 'RDB$ARGUMENT_POSITION': 1}]) elif name == 'I64NVL': f = sm.Function(self.con.schema, {'RDB$ENTRYPOINT': 'idNvl ', 'RDB$SYSTEM_FLAG': 0, 'RDB$RETURN_ARGUMENT': 0, 'RDB$MODULE_NAME': 'fbudf', 'RDB$FUNCTION_TYPE': None, 'RDB$DESCRIPTION': None, 'RDB$FUNCTION_NAME': 'I64NVL '}) f._load_arguments( [{'RDB$FIELD_PRECISION': 18, 'RDB$FIELD_LENGTH': 8, 'RDB$FIELD_SCALE': 0, 'RDB$FIELD_SUB_TYPE': 1, 'RDB$FIELD_TYPE': 16, 'RDB$MECHANISM': 2, 'RDB$CHARACTER_SET_ID': None, 'RDB$CHARACTER_LENGTH': None, 'RDB$FUNCTION_NAME': 'I64NVL ', 'RDB$ARGUMENT_POSITION': 0}, {'RDB$FIELD_PRECISION': 18, 'RDB$FIELD_LENGTH': 8, 'RDB$FIELD_SCALE': 0, 'RDB$FIELD_SUB_TYPE': 1, 'RDB$FIELD_TYPE': 16, 'RDB$MECHANISM': 2, 'RDB$CHARACTER_SET_ID': None, 'RDB$CHARACTER_LENGTH': None, 'RDB$FUNCTION_NAME': 'I64NVL ', 'RDB$ARGUMENT_POSITION': 1}, {'RDB$FIELD_PRECISION': 18, 'RDB$FIELD_LENGTH': 8, 'RDB$FIELD_SCALE': 0, 'RDB$FIELD_SUB_TYPE': 1, 'RDB$FIELD_TYPE': 16, 'RDB$MECHANISM': 2, 'RDB$CHARACTER_SET_ID': None, 'RDB$CHARACTER_LENGTH': None, 'RDB$FUNCTION_NAME': 'I64NVL ', 'RDB$ARGUMENT_POSITION': 2}]) if f: return f else: raise Exception("Udefined function for mock.") def testFunctionArgument(self): f = self._mockFunction('STRLEN') c = f.arguments[0] self.assertEqual(len(f.arguments),1) # common properties self.assertEqual(c.name,'STRLEN_1') self.assertIsNone(c.description) self.assertListEqual(c.actions,[]) self.assertFalse(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'STRLEN_1') self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # self.assertEqual(c.function.name,'STRLEN') self.assertEqual(c.position,1) self.assertEqual(c.mechanism,1) self.assertEqual(c.field_type,40) self.assertEqual(c.length,32767) self.assertEqual(c.scale,0) self.assertIsNone(c.precision) self.assertEqual(c.sub_type,0) self.assertEqual(c.character_length,32767) self.assertEqual(c.character_set.name,'NONE') self.assertEqual(c.datatype,'CSTRING(32767)') # self.assertFalse(c.isbyvalue()) self.assertTrue(c.isbyreference()) self.assertFalse(c.isbydescriptor()) self.assertFalse(c.iswithnull()) self.assertFalse(c.isfreeit()) self.assertFalse(c.isreturning()) self.assertEqual(c.get_sql_definition(),'CSTRING(32767)') # c = f.returns # self.assertEqual(c.position,0) self.assertEqual(c.mechanism,0) self.assertEqual(c.field_type,8) self.assertEqual(c.length,4) self.assertEqual(c.scale,0) self.assertEqual(c.precision,0) self.assertEqual(c.sub_type,0) self.assertIsNone(c.character_length) self.assertIsNone(c.character_set) self.assertEqual(c.datatype,'INTEGER') # self.assertTrue(c.isbyvalue()) self.assertFalse(c.isbyreference()) self.assertFalse(c.isbydescriptor()) self.assertFalse(c.iswithnull()) self.assertFalse(c.isfreeit()) self.assertTrue(c.isreturning()) self.assertEqual(c.get_sql_definition(),'INTEGER BY VALUE') # f = self._mockFunction('STRING2BLOB') self.assertEqual(len(f.arguments),2) c = f.arguments[0] self.assertEqual(c.function.name,'STRING2BLOB') self.assertEqual(c.position,1) self.assertEqual(c.mechanism,2) self.assertEqual(c.field_type,37) self.assertEqual(c.length,300) self.assertEqual(c.scale,0) self.assertIsNone(c.precision) self.assertEqual(c.sub_type,0) self.assertEqual(c.character_length,300) self.assertEqual(c.character_set.name,'NONE') self.assertEqual(c.datatype,'VARCHAR(300)') # self.assertFalse(c.isbyvalue()) self.assertFalse(c.isbyreference()) self.assertTrue(c.isbydescriptor()) self.assertFalse(c.iswithnull()) self.assertFalse(c.isfreeit()) self.assertFalse(c.isreturning()) self.assertEqual(c.get_sql_definition(),'VARCHAR(300) BY DESCRIPTOR') # c = f.arguments[1] self.assertIs(f.arguments[1],f.returns) self.assertEqual(c.function.name,'STRING2BLOB') self.assertEqual(c.position,2) self.assertEqual(c.mechanism,3) self.assertEqual(c.field_type,261) self.assertEqual(c.length,8) self.assertEqual(c.scale,0) self.assertIsNone(c.precision) self.assertEqual(c.sub_type,0) self.assertIsNone(c.character_length) self.assertIsNone(c.character_set) self.assertEqual(c.datatype,'BLOB') # self.assertFalse(c.isbyvalue()) self.assertFalse(c.isbyreference()) self.assertFalse(c.isbydescriptor()) self.assertTrue(c.isbydescriptor(any=True)) self.assertFalse(c.iswithnull()) self.assertFalse(c.isfreeit()) self.assertTrue(c.isreturning()) self.assertEqual(c.get_sql_definition(),'BLOB') # f = self._mockFunction('LTRIM') self.assertEqual(len(f.arguments),1) c = f.arguments[0] self.assertEqual(c.function.name,'LTRIM') self.assertEqual(c.position,1) self.assertEqual(c.mechanism,1) self.assertEqual(c.field_type,40) self.assertEqual(c.length,255) self.assertEqual(c.scale,0) self.assertIsNone(c.precision) self.assertEqual(c.sub_type,0) self.assertEqual(c.character_length,255) self.assertEqual(c.character_set.name,'NONE') self.assertEqual(c.datatype,'CSTRING(255)') # self.assertFalse(c.isbyvalue()) self.assertTrue(c.isbyreference()) self.assertFalse(c.isbydescriptor()) self.assertFalse(c.iswithnull()) self.assertFalse(c.isfreeit()) self.assertFalse(c.isreturning()) self.assertEqual(c.get_sql_definition(),'CSTRING(255)') # c = f.returns self.assertEqual(c.function.name,'LTRIM') self.assertEqual(c.position,0) self.assertEqual(c.mechanism,1) self.assertEqual(c.field_type,40) self.assertEqual(c.length,255) self.assertEqual(c.scale,0) self.assertIsNone(c.precision) self.assertEqual(c.sub_type,0) self.assertEqual(c.character_length,255) self.assertEqual(c.character_set.name,'NONE') self.assertEqual(c.datatype,'CSTRING(255)') # self.assertFalse(c.isbyvalue()) self.assertTrue(c.isbyreference()) self.assertFalse(c.isbydescriptor()) self.assertFalse(c.isbydescriptor(any=True)) self.assertFalse(c.iswithnull()) self.assertTrue(c.isfreeit()) self.assertTrue(c.isreturning()) self.assertEqual(c.get_sql_definition(),'CSTRING(255)') # f = self._mockFunction('I64NVL') self.assertEqual(len(f.arguments),2) for a in f.arguments: self.assertEqual(a.datatype,'NUMERIC(18, 0)') self.assertTrue(a.isbydescriptor()) self.assertEqual(a.get_sql_definition(), 'NUMERIC(18, 0) BY DESCRIPTOR') self.assertEqual(f.returns.datatype,'NUMERIC(18, 0)') self.assertTrue(f.returns.isbydescriptor()) self.assertEqual(f.returns.get_sql_definition(), 'NUMERIC(18, 0) BY DESCRIPTOR') def testFunction(self): c = self._mockFunction('STRLEN') self.assertEqual(len(c.arguments),1) # common properties self.assertEqual(c.name,'STRLEN') self.assertIsNone(c.description) self.assertListEqual(c.actions,['declare', 'drop']) self.assertFalse(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'STRLEN') self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # self.assertEqual(c.module_name,'ib_udf') self.assertEqual(c.entrypoint,'IB_UDF_strlen') self.assertEqual(c.returns.name,'STRLEN_0') self.assertListEqual([a.name for a in c.arguments],['STRLEN_1']) # self.assertTrue(c.has_arguments()) self.assertTrue(c.has_return()) self.assertFalse(c.has_return_argument()) # self.assertEqual(c.get_sql_for('drop'),"DROP EXTERNAL FUNCTION STRLEN") with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('drop',badparam='') self.assertTupleEqual(cm.exception.args, ("Unsupported parameter(s) 'badparam'",)) self.assertEqual(c.get_sql_for('declare'), """DECLARE EXTERNAL FUNCTION STRLEN CSTRING(32767) RETURNS INTEGER BY VALUE ENTRY_POINT 'IB_UDF_strlen' MODULE_NAME 'ib_udf'""") with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('declare',badparam='') self.assertTupleEqual(cm.exception.args, ("Unsupported parameter(s) 'badparam'",)) # c = self._mockFunction('STRING2BLOB') self.assertEqual(len(c.arguments),2) # self.assertTrue(c.has_arguments()) self.assertTrue(c.has_return()) self.assertTrue(c.has_return_argument()) # self.assertEqual(c.get_sql_for('declare'), """DECLARE EXTERNAL FUNCTION STRING2BLOB VARCHAR(300) BY DESCRIPTOR, BLOB RETURNS PARAMETER 2 ENTRY_POINT 'string2blob' MODULE_NAME 'fbudf'""") # c = self._mockFunction('LTRIM') self.assertEqual(len(c.arguments),1) # self.assertTrue(c.has_arguments()) self.assertTrue(c.has_return()) self.assertFalse(c.has_return_argument()) # self.assertEqual(c.get_sql_for('declare'), """DECLARE EXTERNAL FUNCTION LTRIM CSTRING(255) RETURNS CSTRING(255) FREE_IT ENTRY_POINT 'IB_UDF_ltrim' MODULE_NAME 'ib_udf'""") # c = self._mockFunction('I64NVL') self.assertEqual(len(c.arguments),2) # self.assertTrue(c.has_arguments()) self.assertTrue(c.has_return()) self.assertFalse(c.has_return_argument()) # self.assertEqual(c.get_sql_for('declare'), """DECLARE EXTERNAL FUNCTION I64NVL NUMERIC(18, 0) BY DESCRIPTOR, NUMERIC(18, 0) BY DESCRIPTOR RETURNS NUMERIC(18, 0) BY DESCRIPTOR ENTRY_POINT 'idNvl' MODULE_NAME 'fbudf'""") def testDatabaseFile(self): # We have to use mock c = sm.DatabaseFile(self.con.schema,{'RDB$FILE_LENGTH': 1000, 'RDB$FILE_NAME': '/path/dbfile.f02', 'RDB$FILE_START': 500, 'RDB$FILE_SEQUENCE': 1}) # common properties self.assertEqual(c.name,'FILE_1') self.assertIsNone(c.description) self.assertListEqual(c.actions,[]) self.assertTrue(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'FILE_1') self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # self.assertEqual(c.filename,'/path/dbfile.f02') self.assertEqual(c.sequence,1) self.assertEqual(c.start,500) self.assertEqual(c.length,1000) # def testShadow(self): # We have to use mocks c = sm.Shadow(self.con.schema,{'RDB$FILE_FLAGS': 1, 'RDB$SHADOW_NUMBER': 3}) files = [] files.append(sm.DatabaseFile(self.con.schema,{'RDB$FILE_LENGTH': 500, 'RDB$FILE_NAME': '/path/shadow.sf1', 'RDB$FILE_START': 0, 'RDB$FILE_SEQUENCE': 0})) files.append(sm.DatabaseFile(self.con.schema,{'RDB$FILE_LENGTH': 500, 'RDB$FILE_NAME': '/path/shadow.sf2', 'RDB$FILE_START': 1000, 'RDB$FILE_SEQUENCE': 1})) files.append(sm.DatabaseFile(self.con.schema,{'RDB$FILE_LENGTH': 0, 'RDB$FILE_NAME': '/path/shadow.sf3', 'RDB$FILE_START': 1500, 'RDB$FILE_SEQUENCE': 2})) c.__dict__['_Shadow__files'] = files # common properties self.assertEqual(c.name,'SHADOW_3') self.assertIsNone(c.description) self.assertListEqual(c.actions,['create', 'drop']) self.assertFalse(c.issystemobject()) self.assertEqual(c.get_quoted_name(),'SHADOW_3') self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # self.assertEqual(c.id,3) self.assertEqual(c.flags,1) self.assertListEqual([(f.name,f.filename,f.start,f.length) for f in c.files], [('FILE_0', '/path/shadow.sf1', 0, 500), ('FILE_1', '/path/shadow.sf2', 1000, 500), ('FILE_2', '/path/shadow.sf3', 1500, 0)]) # self.assertFalse(c.isconditional()) self.assertFalse(c.isinactive()) self.assertFalse(c.ismanual()) # self.assertEqual(c.get_sql_for('create'), """CREATE SHADOW 3 AUTO '/path/shadow.sf1' LENGTH 500 FILE '/path/shadow.sf2' STARTING AT 1000 LENGTH 500 FILE '/path/shadow.sf3' STARTING AT 1500""") self.assertEqual(c.get_sql_for('drop'),"DROP SHADOW 3") def testPrivilegeBasic(self): p = self.con.schema.get_procedure('ALL_LANGS') # self.assertIsInstance(p.privileges,list) self.assertEqual(len(p.privileges),2) c = p.privileges[0] # common properties self.assertIsNone(c.name) self.assertIsNone(c.description) self.assertListEqual(c.actions,['grant', 'revoke']) self.assertTrue(c.issystemobject()) self.assertIsNone(c.get_quoted_name()) self.assertListEqual(c.get_dependents(),[]) self.assertListEqual(c.get_dependencies(),[]) # self.assertIsInstance(c.user,fdb.services.User) self.assertIn(c.user.name,['SYSDBA','PUBLIC']) self.assertIsInstance(c.grantor,fdb.services.User) self.assertEqual(c.grantor.name,'SYSDBA') self.assertEqual(c.privilege,'X') self.assertIsInstance(c.subject,sm.Procedure) self.assertEqual(c.subject.name,'ALL_LANGS') self.assertIn(c.user_name,['SYSDBA','PUBLIC']) self.assertEqual(c.user_type,self.con.schema.enum_object_type_codes['USER']) self.assertEqual(c.grantor_name,'SYSDBA') self.assertEqual(c.subject_name,'ALL_LANGS') self.assertEqual(c.subject_type,self.con.schema.enum_object_type_codes['PROCEDURE']) self.assertIsNone(c.field_name) # self.assertFalse(c.has_grant()) self.assertFalse(c.isselect()) self.assertFalse(c.isinsert()) self.assertFalse(c.isupdate()) self.assertFalse(c.isdelete()) self.assertTrue(c.isexecute()) self.assertFalse(c.isreference()) self.assertFalse(c.ismembership()) # self.assertEqual(c.get_sql_for('grant'), "GRANT EXECUTE ON PROCEDURE ALL_LANGS TO SYSDBA") self.assertEqual(c.get_sql_for('grant',grantors=[]), "GRANT EXECUTE ON PROCEDURE ALL_LANGS TO SYSDBA GRANTED BY SYSDBA") self.assertEqual(c.get_sql_for('grant',grantors=['SYSDBA','TEST_USER']), "GRANT EXECUTE ON PROCEDURE ALL_LANGS TO SYSDBA") with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('grant',badparam=True) self.assertTupleEqual(cm.exception.args, ("Unsupported parameter(s) 'badparam'",)) self.assertEqual(c.get_sql_for('revoke'), "REVOKE EXECUTE ON PROCEDURE ALL_LANGS FROM SYSDBA") self.assertEqual(c.get_sql_for('revoke',grantors=[]), "REVOKE EXECUTE ON PROCEDURE ALL_LANGS FROM SYSDBA GRANTED BY SYSDBA") self.assertEqual(c.get_sql_for('revoke',grantors=['SYSDBA','TEST_USER']), "REVOKE EXECUTE ON PROCEDURE ALL_LANGS FROM SYSDBA") with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('revoke',grant_option=True) self.assertTupleEqual(cm.exception.args, ("Can't revoke grant option that wasn't granted.",)) with self.assertRaises(fdb.ProgrammingError) as cm: c.get_sql_for('revoke',badparam=True) self.assertTupleEqual(cm.exception.args, ("Unsupported parameter(s) 'badparam'",)) c = p.privileges[1] self.assertEqual(c.get_sql_for('grant'), "GRANT EXECUTE ON PROCEDURE ALL_LANGS TO PUBLIC WITH GRANT OPTION") self.assertEqual(c.get_sql_for('revoke'), "REVOKE EXECUTE ON PROCEDURE ALL_LANGS FROM PUBLIC") self.assertEqual(c.get_sql_for('revoke',grant_option=True), "REVOKE GRANT OPTION FOR EXECUTE ON PROCEDURE ALL_LANGS FROM PUBLIC") # get_privileges_of() u = fdb.services.User('PUBLIC') p = self.con.schema.get_privileges_of(u) if self.con.ods <= fdb.ODS_FB_20: self.assertEqual(len(p),66) elif self.con.ods >= fdb.ODS_FB_30: self.assertEqual(len(p),201) else: self.assertEqual(len(p),68) with self.assertRaises(fdb.ProgrammingError) as cm: p = self.con.schema.get_privileges_of('PUBLIC') self.assertTupleEqual(cm.exception.args, ("Unknown user_type code.",)) with self.assertRaises(fdb.ProgrammingError) as cm: p = self.con.schema.get_privileges_of('PUBLIC',50) self.assertTupleEqual(cm.exception.args, ("Unknown user_type code.",)) # def testPrivilegeExtended(self): def get_privilege(obj,privilege): x = [x for x in obj.privileges if x.privilege == privilege] return x[0] p = [] p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'X', 'RDB$RELATION_NAME': 'ALL_LANGS', 'RDB$OBJECT_TYPE': 5, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': None})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'X', 'RDB$RELATION_NAME': 'ALL_LANGS', 'RDB$OBJECT_TYPE': 5, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'T_USER', 'RDB$PRIVILEGE': 'X', 'RDB$RELATION_NAME': 'ALL_LANGS', 'RDB$OBJECT_TYPE': 5, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'TEST_ROLE', 'RDB$PRIVILEGE': 'X', 'RDB$RELATION_NAME': 'ALL_LANGS', 'RDB$OBJECT_TYPE': 5, 'RDB$USER_TYPE': 13, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'X', 'RDB$RELATION_NAME': 'ALL_LANGS', 'RDB$OBJECT_TYPE': 5, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'T_USER', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'S', 'RDB$RELATION_NAME': 'COUNTRY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'I', 'RDB$RELATION_NAME': 'COUNTRY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'U', 'RDB$RELATION_NAME': 'COUNTRY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'D', 'RDB$RELATION_NAME': 'COUNTRY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'R', 'RDB$RELATION_NAME': 'COUNTRY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'S', 'RDB$RELATION_NAME': 'COUNTRY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'R', 'RDB$RELATION_NAME': 'COUNTRY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'I', 'RDB$RELATION_NAME': 'COUNTRY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'T_USER', 'RDB$PRIVILEGE': 'U', 'RDB$RELATION_NAME': 'COUNTRY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': 'CURRENCY', 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'T_USER', 'RDB$PRIVILEGE': 'R', 'RDB$RELATION_NAME': 'COUNTRY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': 'COUNTRY', 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'T_USER', 'RDB$PRIVILEGE': 'S', 'RDB$RELATION_NAME': 'COUNTRY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'T_USER', 'RDB$PRIVILEGE': 'I', 'RDB$RELATION_NAME': 'COUNTRY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'T_USER', 'RDB$PRIVILEGE': 'D', 'RDB$RELATION_NAME': 'COUNTRY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'T_USER', 'RDB$PRIVILEGE': 'U', 'RDB$RELATION_NAME': 'COUNTRY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'T_USER', 'RDB$PRIVILEGE': 'R', 'RDB$RELATION_NAME': 'COUNTRY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'T_USER', 'RDB$PRIVILEGE': 'U', 'RDB$RELATION_NAME': 'COUNTRY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': 'COUNTRY', 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'T_USER', 'RDB$PRIVILEGE': 'R', 'RDB$RELATION_NAME': 'COUNTRY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': 'CURRENCY', 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'D', 'RDB$RELATION_NAME': 'COUNTRY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'U', 'RDB$RELATION_NAME': 'COUNTRY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'S', 'RDB$RELATION_NAME': 'DEPARTMENT', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'I', 'RDB$RELATION_NAME': 'DEPARTMENT', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'U', 'RDB$RELATION_NAME': 'DEPARTMENT', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'D', 'RDB$RELATION_NAME': 'DEPARTMENT', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'R', 'RDB$RELATION_NAME': 'DEPARTMENT', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'S', 'RDB$RELATION_NAME': 'DEPARTMENT', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'I', 'RDB$RELATION_NAME': 'DEPARTMENT', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'U', 'RDB$RELATION_NAME': 'DEPARTMENT', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'D', 'RDB$RELATION_NAME': 'DEPARTMENT', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'R', 'RDB$RELATION_NAME': 'DEPARTMENT', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'ORG_CHART', 'RDB$PRIVILEGE': 'S', 'RDB$RELATION_NAME': 'DEPARTMENT', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 5, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'S', 'RDB$RELATION_NAME': 'EMPLOYEE', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'I', 'RDB$RELATION_NAME': 'EMPLOYEE', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'U', 'RDB$RELATION_NAME': 'EMPLOYEE', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'D', 'RDB$RELATION_NAME': 'EMPLOYEE', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'R', 'RDB$RELATION_NAME': 'EMPLOYEE', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'S', 'RDB$RELATION_NAME': 'EMPLOYEE', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'I', 'RDB$RELATION_NAME': 'EMPLOYEE', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'U', 'RDB$RELATION_NAME': 'EMPLOYEE', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'D', 'RDB$RELATION_NAME': 'EMPLOYEE', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'R', 'RDB$RELATION_NAME': 'EMPLOYEE', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'ORG_CHART', 'RDB$PRIVILEGE': 'S', 'RDB$RELATION_NAME': 'EMPLOYEE', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 5, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'X', 'RDB$RELATION_NAME': 'ORG_CHART', 'RDB$OBJECT_TYPE': 5, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': None})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'X', 'RDB$RELATION_NAME': 'ORG_CHART', 'RDB$OBJECT_TYPE': 5, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'S', 'RDB$RELATION_NAME': 'PHONE_LIST', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'I', 'RDB$RELATION_NAME': 'PHONE_LIST', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'U', 'RDB$RELATION_NAME': 'PHONE_LIST', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'D', 'RDB$RELATION_NAME': 'PHONE_LIST', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'R', 'RDB$RELATION_NAME': 'PHONE_LIST', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'S', 'RDB$RELATION_NAME': 'PHONE_LIST', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'I', 'RDB$RELATION_NAME': 'PHONE_LIST', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'U', 'RDB$RELATION_NAME': 'PHONE_LIST', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'D', 'RDB$RELATION_NAME': 'PHONE_LIST', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'R', 'RDB$RELATION_NAME': 'PHONE_LIST', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'R', 'RDB$RELATION_NAME': 'PHONE_LIST', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': 'EMP_NO', 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'S', 'RDB$RELATION_NAME': 'RDB$PAGES', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'I', 'RDB$RELATION_NAME': 'RDB$PAGES', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'U', 'RDB$RELATION_NAME': 'RDB$PAGES', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'D', 'RDB$RELATION_NAME': 'RDB$PAGES', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'R', 'RDB$RELATION_NAME': 'RDB$PAGES', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'S', 'RDB$RELATION_NAME': 'RDB$PAGES', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SYSDBA', 'RDB$PRIVILEGE': 'X', 'RDB$RELATION_NAME': 'SHIP_ORDER', 'RDB$OBJECT_TYPE': 5, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': None})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PUBLIC', 'RDB$PRIVILEGE': 'X', 'RDB$RELATION_NAME': 'SHIP_ORDER', 'RDB$OBJECT_TYPE': 5, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 1})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'T_USER', 'RDB$PRIVILEGE': 'M', 'RDB$RELATION_NAME': 'TEST_ROLE', 'RDB$OBJECT_TYPE': 13, 'RDB$USER_TYPE': 8, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'SAVE_SALARY_CHANGE', 'RDB$PRIVILEGE': 'I', 'RDB$RELATION_NAME': 'SALARY_HISTORY', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 2, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PHONE_LIST', 'RDB$PRIVILEGE': 'S', 'RDB$RELATION_NAME': 'DEPARTMENT', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 1, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) p.append(sm.Privilege(self.con.schema,{'RDB$USER': 'PHONE_LIST', 'RDB$PRIVILEGE': 'S', 'RDB$RELATION_NAME': 'EMPLOYEE', 'RDB$OBJECT_TYPE': 0, 'RDB$USER_TYPE': 1, 'RDB$FIELD_NAME': None, 'RDB$GRANTOR': 'SYSDBA', 'RDB$GRANT_OPTION': 0})) # self.con.schema.__dict__['_Schema__privileges'] = p # Table p = self.con.schema.get_table('COUNTRY') self.assertEqual(len(p.privileges),19) self.assertEqual(len([x for x in p.privileges if x.user_name == 'SYSDBA']),5) self.assertEqual(len([x for x in p.privileges if x.user_name == 'PUBLIC']),5) self.assertEqual(len([x for x in p.privileges if x.user_name == 'T_USER']),9) # self.assertTrue(get_privilege(p,'S').isselect()) self.assertTrue(get_privilege(p,'I').isinsert()) self.assertTrue(get_privilege(p,'U').isupdate()) self.assertTrue(get_privilege(p,'D').isdelete()) self.assertTrue(get_privilege(p,'R').isreference()) # x = p.privileges[0] self.assertIsInstance(x.subject,sm.Table) self.assertEqual(x.subject.name,p.name) # TableColumn p = p.get_column('CURRENCY') self.assertEqual(len(p.privileges),2) x = p.privileges[0] self.assertIsInstance(x.subject,sm.Table) self.assertEqual(x.field_name,p.name) # View p = self.con.schema.get_view('PHONE_LIST') self.assertEqual(len(p.privileges),11) self.assertEqual(len([x for x in p.privileges if x.user_name == 'SYSDBA']),5) self.assertEqual(len([x for x in p.privileges if x.user_name == 'PUBLIC']),6) # x = p.privileges[0] self.assertIsInstance(x.subject,sm.View) self.assertEqual(x.subject.name,p.name) # ViewColumn p = p.get_column('EMP_NO') self.assertEqual(len(p.privileges),1) x = p.privileges[0] self.assertIsInstance(x.subject,sm.View) self.assertEqual(x.field_name,p.name) # Procedure p = self.con.schema.get_procedure('ORG_CHART') self.assertEqual(len(p.privileges),2) self.assertEqual(len([x for x in p.privileges if x.user_name == 'SYSDBA']),1) self.assertEqual(len([x for x in p.privileges if x.user_name == 'PUBLIC']),1) # x = p.privileges[0] self.assertFalse(x.has_grant()) self.assertIsInstance(x.subject,sm.Procedure) self.assertEqual(x.subject.name,p.name) # x = p.privileges[1] self.assertTrue(x.has_grant()) # Role p = self.con.schema.get_role('TEST_ROLE') self.assertEqual(len(p.privileges),1) x = p.privileges[0] self.assertIsInstance(x.subject,sm.Role) self.assertEqual(x.subject.name,p.name) self.assertTrue(x.ismembership()) # Trigger as grantee p = self.con.schema.get_table('SALARY_HISTORY') x = p.privileges[0] self.assertIsInstance(x.user,sm.Trigger) self.assertEqual(x.user.name,'SAVE_SALARY_CHANGE') # View as grantee p = self.con.schema.get_view('PHONE_LIST') x = self.con.schema.get_privileges_of(p) self.assertEqual(len(x),2) x = x[0] self.assertIsInstance(x.user,sm.View) self.assertEqual(x.user.name,'PHONE_LIST') # get_grants() self.assertListEqual(sm.get_grants(p.privileges), ['GRANT REFERENCES(EMP_NO) ON PHONE_LIST TO PUBLIC', 'GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE ON PHONE_LIST TO PUBLIC WITH GRANT OPTION', 'GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE ON PHONE_LIST TO SYSDBA WITH GRANT OPTION']) p = self.con.schema.get_table('COUNTRY') self.assertListEqual(sm.get_grants(p.privileges), ['GRANT DELETE, INSERT, UPDATE ON COUNTRY TO PUBLIC', 'GRANT REFERENCES, SELECT ON COUNTRY TO PUBLIC WITH GRANT OPTION', 'GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE ON COUNTRY TO SYSDBA WITH GRANT OPTION', 'GRANT DELETE, INSERT, REFERENCES(COUNTRY,CURRENCY), SELECT, UPDATE(COUNTRY,CURRENCY) ON COUNTRY TO T_USER']) p = self.con.schema.get_role('TEST_ROLE') self.assertListEqual(sm.get_grants(p.privileges),['GRANT TEST_ROLE TO T_USER']) p = self.con.schema.get_table('SALARY_HISTORY') self.assertListEqual(sm.get_grants(p.privileges), ['GRANT INSERT ON SALARY_HISTORY TO TRIGGER SAVE_SALARY_CHANGE']) p = self.con.schema.get_procedure('ORG_CHART') self.assertListEqual(sm.get_grants(p.privileges), ['GRANT EXECUTE ON PROCEDURE ORG_CHART TO PUBLIC WITH GRANT OPTION', 'GRANT EXECUTE ON PROCEDURE ORG_CHART TO SYSDBA']) # def testVisitor(self): v = SchemaVisitor(self,'create',follow='dependencies') c = self.con.schema.get_procedure('ALL_LANGS') c.accept_visitor(v) self.maxDiff = None output = "CREATE TABLE JOB\n(\n JOB_CODE JOBCODE NOT NULL,\n" \ " JOB_GRADE JOBGRADE NOT NULL,\n" \ " JOB_COUNTRY COUNTRYNAME NOT NULL,\n" \ " JOB_TITLE VARCHAR(25) NOT NULL,\n" \ " MIN_SALARY SALARY NOT NULL,\n" \ " MAX_SALARY SALARY NOT NULL,\n" \ " JOB_REQUIREMENT BLOB SUB_TYPE TEXT SEGMENT SIZE 400,\n" \ " LANGUAGE_REQ VARCHAR(15)[5],\n" \ " PRIMARY KEY (JOB_CODE,JOB_GRADE,JOB_COUNTRY)\n" \ ")\n" \ "CREATE PROCEDURE SHOW_LANGS (\n" \ " CODE VARCHAR(5),\n" \ " GRADE SMALLINT,\n" \ " CTY VARCHAR(15)\n" \ ")\n" \ "RETURNS (LANGUAGES VARCHAR(15))\n" \ "AS\n" \ "DECLARE VARIABLE i INTEGER;\n" \ "BEGIN\n" \ " i = 1;\n" \ " WHILE (i <= 5) DO\n" \ " BEGIN\n" \ " SELECT language_req[:i] FROM joB\n" \ " WHERE ((job_code = :code) AND (job_grade = :grade) AND (job_country = :cty)\n" \ " AND (language_req IS NOT NULL))\n" \ " INTO :languages;\n" \ " IF (languages = ' ') THEN /* Prints 'NULL' instead of blanks */\n" \ " languages = 'NULL'; \n" \ " i = i +1;\n" \ " SUSPEND;\n" \ " END\nEND\nCREATE PROCEDURE ALL_LANGS\n" \ "RETURNS (\n" \ " CODE VARCHAR(5),\n" \ " GRADE VARCHAR(5),\n" \ " COUNTRY VARCHAR(15),\n" \ " LANG VARCHAR(15)\n" \ ")\n" \ "AS\n" \ "BEGIN\n" \ "\tFOR SELECT job_code, job_grade, job_country FROM job \n" \ "\t\tINTO :code, :grade, :country\n" \ "\n" \ "\tDO\n" \ "\tBEGIN\n" \ "\t FOR SELECT languages FROM show_langs \n" \ " \t\t (:code, :grade, :country) INTO :lang DO\n" \ "\t SUSPEND;\n" \ "\t /* Put nice separators between rows */\n" \ "\t code = '=====';\n" \ "\t grade = '=====';\n" \ "\t country = '===============';\n" \ "\t lang = '==============';\n" \ "\t SUSPEND;\n" \ "\tEND\n" \ " END\n" self.assertMultiLineEqual(self.output.getvalue(),output) v = SchemaVisitor(self,'drop',follow='dependents') c = self.con.schema.get_table('JOB') self.clear_output() c.accept_visitor(v) self.assertEqual(self.output.getvalue(),"""DROP PROCEDURE ALL_LANGS DROP PROCEDURE SHOW_LANGS DROP TABLE JOB """) class TestMonitor(FDBTestBase): def setUp(self): self.cwd = os.getcwd() self.dbpath = os.path.join(self.cwd,'test') self.dbfile = os.path.join(self.dbpath,FBTEST_DB) self.con = fdb.connect(host=FBTEST_HOST,database=self.dbfile, user=FBTEST_USER,password=FBTEST_PASSWORD) def tearDown(self): self.con.close() def testMonitorBindClose(self): if self.con.ods < fdb.ODS_FB_21: return s = fdb.monitor.Monitor() self.assertTrue(s.closed) s.bind(self.con) # properties self.assertEqual(s.db.name.upper(),self.dbfile.upper()) self.assertFalse(s.db.read_only) self.assertFalse(s.closed) # s.close() self.assertTrue(s.closed) s.bind(self.con) self.assertFalse(s.closed) # s.bind(self.con) self.assertFalse(s.closed) # del s def testMonitor(self): if self.con.ods < fdb.ODS_FB_21: return c = self.con.cursor() sql = "select RDB$SET_CONTEXT('USER_SESSION','TESTVAR','TEST_VALUE') from rdb$database" c.execute(sql) c.fetchone() m = self.con.monitor m.refresh() self.assertIsNotNone(m.db) self.assertIsInstance(m.db,fdb.monitor.DatabaseInfo) self.assertGreater(len(m.attachments),0) self.assertIsInstance(m.attachments[0],fdb.monitor.AttachmentInfo) self.assertGreater(len(m.transactions),0) self.assertIsInstance(m.transactions[0],fdb.monitor.TransactionInfo) self.assertGreater(len(m.statements),0) self.assertIsInstance(m.statements[0],fdb.monitor.StatementInfo) self.assertEqual(len(m.callstack),0) self.assertGreater(len(m.iostats),0) self.assertIsInstance(m.iostats[0],fdb.monitor.IOStatsInfo) if self.con.ods == fdb.ODS_FB_21: self.assertEqual(len(m.variables),0) elif self.con.ods >= fdb.ODS_FB_25: self.assertGreater(len(m.variables),0) self.assertIsInstance(m.variables[0],fdb.monitor.ContextVariableInfo) # att_id = m._con.db_info(fdb.isc_info_attachment_id) self.assertEqual(m.get_attachment(att_id).id,att_id) tra_id = m._con.trans_info(fdb.isc_info_tra_id) self.assertEqual(m.get_transaction(tra_id).id,tra_id) stmt_id = None for stmt in m.statements: if stmt.sql_text == sql: stmt_id = stmt.id self.assertEqual(m.get_statement(stmt_id).id,stmt_id) # m.get_call() self.assertIsInstance(m.this_attachment,fdb.monitor.AttachmentInfo) self.assertEqual(m.this_attachment.id, self.con.db_info(fdb.isc_info_attachment_id)) self.assertFalse(m.closed) # with self.assertRaises(fdb.ProgrammingError) as cm: m.close() self.assertTupleEqual(cm.exception.args, ("Call to 'close' not allowed for embedded Monitor.",)) with self.assertRaises(fdb.ProgrammingError) as cm: m.bind(self.con) self.assertTupleEqual(cm.exception.args, ("Call to 'bind' not allowed for embedded Monitor.",)) def testDatabaseInfo(self): if self.con.ods < fdb.ODS_FB_21: return m = self.con.monitor m.refresh() self.assertEqual(m.db.name.upper(),self.dbfile.upper()) self.assertEqual(m.db.page_size,4096) if self.con.ods == fdb.ODS_FB_20: self.assertEqual(m.db.ods,11.0) elif self.con.ods == fdb.ODS_FB_21: self.assertEqual(m.db.ods,11.1) elif self.con.ods == fdb.ODS_FB_25: self.assertEqual(m.db.ods,11.2) elif self.con.ods >= fdb.ODS_FB_30: self.assertEqual(m.db.ods,12.0) self.assertIsInstance(m.db.oit,int) self.assertIsInstance(m.db.oat,int) self.assertIsInstance(m.db.ost,int) self.assertIsInstance(m.db.next_transaction,int) self.assertIsInstance(m.db.cache_size,int) self.assertEqual(m.db.sql_dialect,3) self.assertEqual(m.db.shutdown_mode,fdb.monitor.SHUTDOWN_MODE_ONLINE) self.assertEqual(m.db.sweep_interval,20000) self.assertFalse(m.db.read_only) self.assertTrue(m.db.forced_writes) self.assertTrue(m.db.reserve_space) self.assertIsInstance(m.db.created,datetime.datetime) self.assertIsInstance(m.db.pages,int) self.assertEqual(m.db.backup_state,fdb.monitor.BACKUP_STATE_NORMAL) self.assertEqual(m.db.iostats.group,fdb.monitor.STAT_DATABASE) self.assertEqual(m.db.iostats.stat_id,m.db.stat_id) def testAttachmentInfo(self): if self.con.ods < fdb.ODS_FB_21: return c = self.con.cursor() sql = "select RDB$SET_CONTEXT('USER_SESSION','TESTVAR','TEST_VALUE') from rdb$database" c.execute(sql) c.fetchone() m = self.con.monitor m.refresh() s = m.this_attachment # self.assertEqual(s.id,self.con.db_info(fdb.isc_info_attachment_id)) self.assertIsInstance(s.server_pid,int) self.assertIn(s.state,[fdb.monitor.STATE_ACTIVE,fdb.monitor.STATE_IDLE]) self.assertEqual(s.name.upper(),self.dbfile.upper()) self.assertEqual(s.user,'SYSDBA') self.assertEqual(s.role,'NONE') if not FBTEST_HOST and self.con.engine_version >= 3.0: self.assertIsNone(s.remote_protocol) self.assertIsNone(s.remote_address) self.assertIsNone(s.remote_pid) self.assertIsNone(s.remote_process) else: self.assertIn(s.remote_protocol,['XNET','TCPv4','TCPv6']) self.assertIsInstance(s.remote_address,str) self.assertIsInstance(s.remote_pid,int) self.assertIsInstance(s.remote_process,str) self.assertIsInstance(s.character_set,fdb.schema.CharacterSet) self.assertIsInstance(s.timestamp,datetime.datetime) self.assertIsInstance(s.transactions,list) for x in s.transactions: self.assertIsInstance(x,fdb.monitor.TransactionInfo) self.assertIsInstance(s.statements,list) for x in s.statements: self.assertIsInstance(x,fdb.monitor.StatementInfo) self.assertIsInstance(s.variables,list) if self.con.ods >= fdb.ODS_FB_25: self.assertGreater(len(s.variables),0) else: self.assertEqual(len(s.variables),0) for x in s.variables: self.assertIsInstance(x,fdb.monitor.ContextVariableInfo) self.assertEqual(s.iostats.group,fdb.monitor.STAT_ATTACHMENT) self.assertEqual(s.iostats.stat_id,s.stat_id) # self.assertTrue(s.isactive()) self.assertFalse(s.isidle()) self.assertTrue(s.isgcallowed()) def testTransactionInfo(self): if self.con.ods < fdb.ODS_FB_21: return c = self.con.cursor() sql = "select RDB$SET_CONTEXT('USER_TRANSACTION','TESTVAR','TEST_VALUE') from rdb$database" c.execute(sql) c.fetchone() m = self.con.monitor m.refresh() s = m.this_attachment.transactions[0] # self.assertEqual(s.id,m._ic.transaction.trans_info(fdb.isc_info_tra_id)) self.assertIs(s.attachment,m.this_attachment) self.assertIn(s.state,[fdb.monitor.STATE_ACTIVE,fdb.monitor.STATE_IDLE]) self.assertIsInstance(s.timestamp,datetime.datetime) self.assertIsInstance(s.top,int) self.assertIsInstance(s.oldest,int) self.assertIsInstance(s.oldest_active,int) self.assertEqual(s.isolation_mode,fdb.monitor.ISOLATION_READ_COMMITTED_RV) self.assertEqual(s.lock_timeout,fdb.monitor.INFINITE_WAIT) self.assertIsInstance(s.statements,list) for x in s.statements: self.assertIsInstance(x,fdb.monitor.StatementInfo) self.assertIsInstance(s.variables,list) self.assertEqual(s.iostats.group,fdb.monitor.STAT_TRANSACTION) self.assertEqual(s.iostats.stat_id,s.stat_id) # self.assertTrue(s.isactive()) self.assertFalse(s.isidle()) self.assertTrue(s.isreadonly()) self.assertFalse(s.isautocommit()) self.assertTrue(s.isautoundo()) # s = m.get_transaction(c.transaction.trans_info(fdb.isc_info_tra_id)) self.assertIsInstance(s.variables,list) if self.con.ods >= fdb.ODS_FB_25: self.assertGreater(len(s.variables),0) else: self.assertEqual(len(s.variables),0) for x in s.variables: self.assertIsInstance(x,fdb.monitor.ContextVariableInfo) def testStatementInfo(self): if self.con.ods < fdb.ODS_FB_21: return m = self.con.monitor m.refresh() s = m.this_attachment.statements[0] # self.assertIsInstance(s.id,int) self.assertIs(s.attachment,m.this_attachment) self.assertIs(s.transaction,m.transactions[0]) self.assertIn(s.state,[fdb.monitor.STATE_ACTIVE,fdb.monitor.STATE_IDLE]) self.assertIsInstance(s.timestamp,datetime.datetime) self.assertEqual(s.sql_text,"select * from mon$database") # We have to use mocks for callstack stack = [] stack.append(fdb.monitor.CallStackInfo(m, {'MON$CALL_ID':1, 'MON$STATEMENT_ID':s.id-1, 'MON$CALLER_ID':None, 'MON$OBJECT_NAME':'TRIGGER_1', 'MON$OBJECT_TYPE':2, 'MON$TIMESTAMP':datetime.datetime.now(), 'MON$SOURCE_LINE':1, 'MON$SOURCE_COLUMN':1, 'MON$STAT_ID':s.stat_id+100})) stack.append(fdb.monitor.CallStackInfo(m, {'MON$CALL_ID':2, 'MON$STATEMENT_ID':s.id, 'MON$CALLER_ID':None, 'MON$OBJECT_NAME':'TRIGGER_2', 'MON$OBJECT_TYPE':2, 'MON$TIMESTAMP':datetime.datetime.now(), 'MON$SOURCE_LINE':1, 'MON$SOURCE_COLUMN':1, 'MON$STAT_ID':s.stat_id+101})) stack.append(fdb.monitor.CallStackInfo(m, {'MON$CALL_ID':3, 'MON$STATEMENT_ID':s.id, 'MON$CALLER_ID':2, 'MON$OBJECT_NAME':'PROC_1', 'MON$OBJECT_TYPE':5, 'MON$TIMESTAMP':datetime.datetime.now(), 'MON$SOURCE_LINE':2, 'MON$SOURCE_COLUMN':2, 'MON$STAT_ID':s.stat_id+102})) stack.append(fdb.monitor.CallStackInfo(m, {'MON$CALL_ID':4, 'MON$STATEMENT_ID':s.id, 'MON$CALLER_ID':3, 'MON$OBJECT_NAME':'PROC_2', 'MON$OBJECT_TYPE':5, 'MON$TIMESTAMP':datetime.datetime.now(), 'MON$SOURCE_LINE':3, 'MON$SOURCE_COLUMN':3, 'MON$STAT_ID':s.stat_id+103})) stack.append(fdb.monitor.CallStackInfo(m, {'MON$CALL_ID':5, 'MON$STATEMENT_ID':s.id+1, 'MON$CALLER_ID':None, 'MON$OBJECT_NAME':'PROC_3', 'MON$OBJECT_TYPE':5, 'MON$TIMESTAMP':datetime.datetime.now(), 'MON$SOURCE_LINE':1, 'MON$SOURCE_COLUMN':1, 'MON$STAT_ID':s.stat_id+104})) m.__dict__['_Monitor__callstack'] = stack # self.assertListEqual(s.callstack,[stack[1],stack[2],stack[3]]) self.assertEqual(s.iostats.group,fdb.monitor.STAT_STATEMENT) self.assertEqual(s.iostats.stat_id,s.stat_id) # self.assertTrue(s.isactive()) self.assertFalse(s.isidle()) def testCallStackInfo(self): if self.con.ods < fdb.ODS_FB_21: return m = self.con.monitor m.refresh() stmt = m.this_attachment.statements[0] # We have to use mocks for callstack stack = [] stack.append(fdb.monitor.CallStackInfo(m, {'MON$CALL_ID':1, 'MON$STATEMENT_ID':stmt.id-1, 'MON$CALLER_ID':None, 'MON$OBJECT_NAME':'POST_NEW_ORDER', 'MON$OBJECT_TYPE':2, 'MON$TIMESTAMP':datetime.datetime.now(), 'MON$SOURCE_LINE':1, 'MON$SOURCE_COLUMN':1, 'MON$STAT_ID':stmt.stat_id+100})) stack.append(fdb.monitor.CallStackInfo(m, {'MON$CALL_ID':2, 'MON$STATEMENT_ID':stmt.id, 'MON$CALLER_ID':None, 'MON$OBJECT_NAME':'POST_NEW_ORDER', 'MON$OBJECT_TYPE':2, 'MON$TIMESTAMP':datetime.datetime.now(), 'MON$SOURCE_LINE':1, 'MON$SOURCE_COLUMN':1, 'MON$STAT_ID':stmt.stat_id+101})) stack.append(fdb.monitor.CallStackInfo(m, {'MON$CALL_ID':3, 'MON$STATEMENT_ID':stmt.id, 'MON$CALLER_ID':2, 'MON$OBJECT_NAME':'SHIP_ORDER', 'MON$OBJECT_TYPE':5, 'MON$TIMESTAMP':datetime.datetime.now(), 'MON$SOURCE_LINE':2, 'MON$SOURCE_COLUMN':2, 'MON$STAT_ID':stmt.stat_id+102})) stack.append(fdb.monitor.CallStackInfo(m, {'MON$CALL_ID':4, 'MON$STATEMENT_ID':stmt.id, 'MON$CALLER_ID':3, 'MON$OBJECT_NAME':'SUB_TOT_BUDGET', 'MON$OBJECT_TYPE':5, 'MON$TIMESTAMP':datetime.datetime.now(), 'MON$SOURCE_LINE':3, 'MON$SOURCE_COLUMN':3, 'MON$STAT_ID':stmt.stat_id+103})) stack.append(fdb.monitor.CallStackInfo(m, {'MON$CALL_ID':5, 'MON$STATEMENT_ID':stmt.id+1, 'MON$CALLER_ID':None, 'MON$OBJECT_NAME':'SUB_TOT_BUDGET', 'MON$OBJECT_TYPE':5, 'MON$TIMESTAMP':datetime.datetime.now(), 'MON$SOURCE_LINE':1, 'MON$SOURCE_COLUMN':1, 'MON$STAT_ID':stmt.stat_id+104})) m.__dict__['_Monitor__callstack'] = stack data = m.iostats[0]._attributes data['MON$STAT_ID'] = stmt.stat_id+101 data['MON$STAT_GROUP'] = fdb.monitor.STAT_CALL m.__dict__['_Monitor__iostats'].append(fdb.monitor.IOStatsInfo(m,data)) # s = m.get_call(2) # self.assertEqual(s.id,2) self.assertIs(s.statement,m.get_statement(stmt.id)) self.assertIsNone(s.caller) self.assertIsInstance(s.dbobject,fdb.schema.Trigger) self.assertEqual(s.dbobject.name,'POST_NEW_ORDER') self.assertIsInstance(s.timestamp,datetime.datetime) self.assertEqual(s.line,1) self.assertEqual(s.column,1) self.assertEqual(s.iostats.group,fdb.monitor.STAT_CALL) self.assertEqual(s.iostats.stat_id,s.stat_id) # x = m.get_call(3) self.assertIs(x.caller,s) self.assertIsInstance(x.dbobject,fdb.schema.Procedure) self.assertEqual(x.dbobject.name,'SHIP_ORDER') def testIOStatsInfo(self): if self.con.ods < fdb.ODS_FB_21: return m = self.con.monitor m.refresh() # for io in m.iostats: self.assertIs(io,io.owner.iostats) # s = m.iostats[0] self.assertIsInstance(s.owner,fdb.monitor.DatabaseInfo) self.assertEqual(s.group,fdb.monitor.STAT_DATABASE) self.assertIsInstance(s.reads,int) self.assertIsInstance(s.writes,int) self.assertIsInstance(s.fetches,int) self.assertIsInstance(s.marks,int) self.assertIsInstance(s.seq_reads,int) self.assertIsInstance(s.idx_reads,int) self.assertIsInstance(s.inserts,int) self.assertIsInstance(s.updates,int) self.assertIsInstance(s.deletes,int) self.assertIsInstance(s.backouts,int) self.assertIsInstance(s.purges,int) self.assertIsInstance(s.expunges,int) if self.con.ods >= fdb.ODS_FB_25: self.assertIsInstance(s.memory_used,int) self.assertIsInstance(s.memory_allocated,int) self.assertIsInstance(s.max_memory_used,int) self.assertIsInstance(s.max_memory_allocated,int) else: self.assertIsNone(s.memory_used) self.assertIsNone(s.memory_allocated) self.assertIsNone(s.max_memory_used) self.assertIsNone(s.max_memory_allocated) def testContextVariableInfo(self): if self.con.ods <= fdb.ODS_FB_21: return c = self.con.cursor() sql = "select RDB$SET_CONTEXT('USER_SESSION','SVAR','TEST_VALUE') from rdb$database" c.execute(sql) c.fetchone() c = self.con.cursor() sql = "select RDB$SET_CONTEXT('USER_TRANSACTION','TVAR','TEST_VALUE') from rdb$database" c.execute(sql) c.fetchone() m = self.con.monitor m.refresh() # self.assertEqual(len(m.variables),2) # s = m.variables[0] self.assertIs(s.attachment,m.this_attachment) self.assertIsNone(s.transaction) self.assertEqual(s.name,'SVAR') self.assertEqual(s.value,'TEST_VALUE') self.assertTrue(s.isattachmentvar()) self.assertFalse(s.istransactionvar()) # s = m.variables[1] self.assertIsNone(s.attachment) self.assertIs(s.transaction, m.get_transaction(c.transaction.trans_info(fdb.isc_info_tra_id))) self.assertEqual(s.name,'TVAR') self.assertEqual(s.value,'TEST_VALUE') self.assertFalse(s.isattachmentvar()) self.assertTrue(s.istransactionvar()) class TestConnectionWithSchema(FDBTestBase): def setUp(self): self.cwd = os.getcwd() self.dbpath = os.path.join(self.cwd,'test') self.dbfile = os.path.join(self.dbpath,FBTEST_DB) #self.con = fdb.connect(dsn=self.dbfile,user=FBTEST_USER,password=FBTEST_PASSWORD) def tearDown(self): #self.con.close() pass def testConnectSchema(self): s = fdb.connect(host=FBTEST_HOST,database=self.dbfile,user=FBTEST_USER, password=FBTEST_PASSWORD, connection_class=fdb.ConnectionWithSchema) self.assertEqual(len(s.tables),15) self.assertEqual(s.get_table('JOB').name,'JOB') class TestBugs(FDBTestBase): def setUp(self): self.cwd = os.getcwd() self.dbpath = os.path.join(self.cwd,'test') self.dbfile = os.path.join(self.dbpath,'fbbugs.fdb') if os.path.exists(self.dbfile): os.remove(self.dbfile) self.con = fdb.create_database(host=FBTEST_HOST,database=self.dbfile, user=FBTEST_USER,password=FBTEST_PASSWORD) def tearDown(self): self.con.drop_database() self.con.close() def test_pyfb_17(self): create_table = """ Create Table table1 ( ID Integer, C1 Integer NOT Null ); """ create_trigger = """CREATE TRIGGER BIU_Trigger FOR table1 ACTIVE BEFORE INSERT OR UPDATE POSITION 0 as begin if (new.C1 IS NULL) then begin new.C1 = 1; end end """ cur = self.con.cursor() cur.execute(create_table) cur.execute(create_trigger) self.con.commit() # PYFB-17: fails with fdb, passes with kinterbasdb cur.execute('insert into table1 (ID, C1) values(1, ?)', (None, )) def test_pyfb_22(self): create_table = """ CREATE TABLE FDBTEST ( ID INTEGER, TEST80 VARCHAR(80), TEST128 VARCHAR(128), TEST255 VARCHAR(255), TEST1024 VARCHAR(1024), TESTCLOB BLOB SUB_TYPE 1 SEGMENT SIZE 255 ); """ cur = self.con.cursor() cur.execute(create_table) self.con.commit() # test data data = ("1234567890" * 25) + "12345" for i in ibase.xrange(255): cur.execute("insert into fdbtest (id, test255) values (?, ?)", (i, data[:i])) self.con.commit() # PYFB-22: fails with fdb, passes with kinterbasdb cur.execute("select test255 from fdbtest order by id") i = 0 for row in cur: value = row[0] self.assertEqual(len(value),i) self.assertEqual(value,data[:i]) i += 1 def test_pyfb_25(self): create_table = """ CREATE TABLE FDBTEST2 ( ID INTEGER, TEST5000 VARCHAR(5000) ); """ cur = self.con.cursor() cur.execute(create_table) self.con.commit() # test data data = "1234567890" * 500 cur.execute("insert into fdbtest2 (id, test5000) values (?, ?)", (1, data)) self.con.commit() # PYFB-25: fails with fdb, passes with kinterbasdb cur.execute("select test5000 from fdbtest2") row = cur.fetchone() self.assertEqual(row[0],data) def test_pyfb_30(self): create_table = """ CREATE TABLE FDBTEST3 ( ID INTEGER, T_BLOB BLOB sub_type BINARY ); """ cur = self.con.cursor() cur.execute(create_table) self.con.commit() # test data data_bytes = (1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9) blob_data = fdb.bs(data_bytes) cur.execute("insert into fdbtest3 (id, t_blob) values (?, ?)", (1, blob_data)) cur.execute("insert into fdbtest3 (id, t_blob) values (?, ?)", (2, BytesIO(blob_data))) self.con.commit() # PYFB-XX: binary blob trucated at zero-byte cur.execute("select t_blob from fdbtest3 where id = 1") row = cur.fetchone() self.assertEqual(row[0],blob_data) cur.execute("select t_blob from fdbtest3 where id = 2") row = cur.fetchone() self.assertEqual(row[0],blob_data) p = cur.prep("select t_blob from fdbtest3 where id = 2") p.set_stream_blob('T_BLOB') cur.execute(p) blob_reader = cur.fetchone()[0] value = blob_reader.read() self.assertEqual(value,blob_data) def test_pyfb_34(self): cur = self.con.cursor() cur.execute( "select * from RDB$Relations") cur.fetchall() del cur def test_pyfb_35(self): create_table = """ Create Table table1 ( ID Integer, C1 Integer NOT Null ); """ c = self.con.cursor() c.execute(create_table) self.con.commit() del c cur = self.con.cursor() with self.assertRaises(fdb.DatabaseError) as cm: cur.fetchall() self.assertTupleEqual(cm.exception.args, ("Cannot fetch from this cursor because it has not executed a statement.",)) cur.execute("select * from RDB$DATABASE") cur.fetchall() cur.execute("CREATE SEQUENCE TEST_SEQ_1") with self.assertRaises(fdb.DatabaseError) as cm: cur.fetchall() self.assertTupleEqual(cm.exception.args, ("Attempt to fetch row of results after statement that does not produce result set.",)) cur.execute("insert into table1 (ID,C1) values (1,1) returning ID") row = cur.fetchall() self.assertListEqual(row,[(1,)]) def test_pyfb_44(self): self.con2 = fdb.connect(host=FBTEST_HOST,database=os.path.join(self.dbpath,FBTEST_DB), user=FBTEST_USER,password=FBTEST_PASSWORD) try: cur = self.con2.cursor() now = datetime.datetime(2011,11,13,15,00,1,200) cur.execute('insert into T2 (C1,C8) values (?,?)',[3,now.date()]) self.con2.commit() cur.execute('select C1,C8 from T2 where C1 = 3') rows = cur.fetchall() self.assertListEqual(rows, [(3, datetime.datetime(2011, 11, 13, 0, 0, 0, 0))]) finally: self.con2.execute_immediate("delete from t2") self.con2.commit() self.con2.close() if __name__ == '__main__': unittest.main() fdb-1.4.9+dfsg1/test/fbtest.fdb0000644000215700017510000457000012431143157015117 0ustar rstuartit90 w./f N90 90909090L|`D( dH,     h L 0       l P 4       p T 8       t X <       x \ @ $  hL0 E D CBA@?>=<;:9876543210/.-,+*)('&%$#"!                90Q9090OP90VO;O;90R90Z1 C<1 C<90+T 90Y1 C<u! <%I>%I>! <1 C<90  FHIJKLMNUU90W;X/<e3;8Z;3;/<;90G90S/<U/</</<9090w?x???9090f===90 90 [??90 90 90 90 {dR;dR;90 U90 \sm<|1 C=1 C=sm<90 90 q>r>>>9090]??9090^??9090g9090y*=*=9090s&=t??&=9090v9090_.=.=9090z==9090`L<g<&=&==g<L<9090a%I=%I=9090b&<~=<=<&<90909090k=l===9090h><=><9090i<o<<<9090js;ps;9c=s;s;9090mL>nL>L>L>9090}??90 90 90$I`QUMhPT \T d L RX Z U O\ S P R` V T R\ Z PRdTRV\ZTYTWURXPZVD^\RDB$FIELD_PRECISION RDB$FIELDS RDB$FIELD_PRECISION RDB$CHARACTER_SET_ID RDB$FIELDS RDB$CHARACTER_SET_ID RDB$COLLATION_ID RDB$FIELDS RDB$COLLATION_ID RDB$CHARACTER_LENGTH RDB$FIELDS RDB$FIELD_LENGTH RDB$NULL_FLAG RDB$FIELDS RDB$NULL_FLAG RDB$DIMENSIONS RDB$FIELDS RDB$DIMENSIONS RDB$EXTERNAL_TYPE RDB$FIELDS RDB$FIELD_TYPE RDB$EXTERNAL_SCALE RDB$FIELDS RDB$FIELD_SCALE RDB$EXTERNAL_LENGTH RDB$FIELDS RDB$FIELD_LENGTH RDB$EDIT_STRING RDB$FIELDS RDB$EDIT_STRING RDB$SEGMENT_LENGTH RDB$FIELDS RDB$SEGMENT_LENGTH RDB$QUERY_HEADER RDB$FIELDS RDB$QUERY_HEADER RDB$SYSTEM_FLAG RDB$FIELDS RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$FIELDS RDB$DESCRIPTION RDB$MISSING_SOURCE RDB$FIELDS RDB$SOURCE   RDB$MISSING_VALUE RDB$FIELDS RDB$VALUE   RDB$FIELD_SUB_TYPE RDB$FIELDS RDB$FIELD_SUB_TYPE   RDB$FIELD_TYPE RDB$FIELDS RDB$FIELD_TYPE   RDB$FIELD_SCALE RDB$FIELDS RDB$FIELD_SCALE   RDB$FIELD_LENGTH RDB$FIELDS RDB$FIELD_LENGTH RDB$DEFAULT_SOURCE RDB$FIELDS RDB$SOURCE RDB$DEFAULT_VALUE RDB$FIELDS RDB$VALUE RDB$COMPUTED_SOURCE RDB$FIELDS RDB$SOURCE RDB$COMPUTED_BLR RDB$FIELDS RDB$VALUE RDB$VALIDATION_SOURCE RDB$FIELDS RDB$SOURCE RDB$VALIDATION_BLR RDB$FIELDS RDB$VALIDATION_BLR RDB$QUERY_NAME RDB$FIELDS RDB$FIELD_NAME RDB$FIELD_NAME RDB$FIELDS RDB$FIELD_NAME RDB$CHARACTER_SET_NAME RDB$DATABASE RDB$CHARACTER_SET_NAME RDB$SECURITY_CLASS RDB$DATABASE RDB$SECURITY_CLASS RDB$RELATION_ID RDB$DATABASE RDB$RELATION_ID RDB$DESCRIPTION RDB$DATABASE RDB$DESCRIPTION RDB$PAGE_TYPE RDB$PAGES RDB$PAGE_TYPE RDB$PAGE_SEQUENCE RDB$PAGES RDB$PAGE_SEQUENCE RDB$RELATION_ID RDB$PAGES RDB$RELATION_ID RDB$PAGE_NUMBER RDB$PAGES RDB$PAGE_NUMBER 90'7<P< D<DDEB ; DD 9 9 D @D = F ;| D0 K @ Fd D P D HH = @H|B<>@<B*<O$ RDB$ROLES SQL$RDB$RORDB$CONSTRAINT_NAMERDB$CONST_NAME_UQRDB$MATCH_OPTION FULLLRDB$UPDATE_RULERESTRICTLRDB$DELETE_RULERESTRICTL RDB$TRIGGER_12 RDB$TRIGGER_13SYRDB$CONSTRAINT_NAMERDB$CONSTRAINT_TYPERDB$RELATION_NAMERDB$DEFERRABLE NOLRDB$INITIALLY_DEFERRED NOLRDB$INDEX_NAME RDB$TRIGGER_10 RDB$TRIGGER_11 RDB$TRIGGER_34 RDB$TRIGGER_25 RDB$TRIGGER_26 ^RDB$GENERATOR_NAMERDB$GENERATOR_IDRDB$SYSTEM_FLAGRDB$DESCRIPTION RDB$TRIGGER_6"I RDB$VIEW_BLRRDB$VIEW_SOURCERDB$DESCRIPTIONRDB$RELATION_IDRDB$SYSTEM_FLAGRDB$DBKEY_LENGTH RDB$FORMAT RDB$FIELD_IDRDB$RELATION_NAME RDB$SECURITY_CLASS RDB$EXTERNAL_FILE RDB$RUNTIME RDB$EXTERNAL_DESCRIPTION RDB$OWNER_NAMERDB$DEFAULT_CLASS RDB$FLAGS RDB$TRIGGER_4 RDB$TRIGGER_5RDB$TRIGGER_NAMERDB$RELATION_NAMERDB$TRIGGER_SEQUENCERDB$TRIGGER_TYPERDB$TRIGGER_SOURCERDB$TRIGGER_BLRRDB$DESCRIPTIONRDB$TRIGGER_INACTIVERDB$SYSTEM_FLAG RDB$FLAGS RDB$TRIGGER_2 RDB$TRIGGER_3 RDB$TRIGGER_21 RDB$TRIGGER_22 RDB$USER RDB$GRANTORRDB$PRIVILEGERDB$GRANT_OPTIONRDB$RELATION_NAMERDB$FIELD_NAMERDB$USER_TYPERDB$OBJECT_TYPE RDB$TRIGGER_1 RDB$TRIGGER_8 RDB$TRIGGER_9 RDB$TRIGGER_31 RDB$TRIGGER_32 RDB$TRIGGER_33 RDB$BACKUP_HISTORY SYSDBA  RDB$EXCEPTIONS  RDB$COLLATIONS SYSDBA  RDB$CHARACTER_SETS SYSDBA RDB$PROCEDURE_PARAMETERS SYSDBA   RDB$PROCEDURES RDB$LOG_FILES SYSDBA RDB$CHECK_CONSTRAINTS RDB$REF_CONSTRAINTS RDB$RELATION_CONSTRAINTS %SYSDBA RDB$FIELD_DIMENSIONS SYSDBA RDB$GENERATORS $SYSDBA RDB$TRANSACTIONS SYSDBA RDB$USER_PRIVILEGES !SYSDBA RDB$TRIGGER_MESSAGES SYSDBA  RDB$FILTERS SYSDBA  RDB$FUNCTION_ARGUMENTS SYSDBA RDB$FUNCTIONS SYSDBA  RDB$DEPENDENCIES SYSDBA   RDB$TRIGGERS "SYSDBA   RDB$TYPES SYSDBA   RDB$FILES SYSDBA  RDB$SECURITY_CLASSES SYSDBA  RDB$FORMATS SYSDBA RDB$VIEW_RELATIONS SYSDBA RDB$RELATIONS #SYSDBA RDB$RELATION_FIELDS  RDB$INDICES RDB$INDEX_SEGMENTS  RDB$FIELDS RDB$DATABASE SYSDBA  RDB$PAGES SYSDBA 90"TPZbZ@M Y M< U U Y0 X T W0 S R V0 S Ut a ][\[]c8_]U _]dY[cD]YRDB$NULL_FLAG RDB$RELATION_FIELDS RDB$NULL_FLAG RDB$COMPLEX_NAME RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$SECURITY_CLASS RDB$RELATION_FIELDS RDB$SECURITY_CLASS RDB$SYSTEM_FLAG RDB$RELATION_FIELDS RDB$SYSTEM_FLAG   RDB$DEFAULT_VALUE RDB$RELATION_FIELDS RDB$VALUE   RDB$DESCRIPTION RDB$RELATION_FIELDS RDB$DESCRIPTION   RDB$VIEW_CONTEXT RDB$RELATION_FIELDS RDB$VIEW_CONTEXT   RDB$FIELD_ID RDB$RELATION_FIELDS RDB$FIELD_ID   RDB$UPDATE_FLAG RDB$RELATION_FIELDS RDB$SYSTEM_FLAG RDB$QUERY_HEADER RDB$RELATION_FIELDS RDB$QUERY_HEADER RDB$FIELD_POSITION RDB$RELATION_FIELDS RDB$FIELD_POSITION RDB$EDIT_STRING RDB$RELATION_FIELDS RDB$EDIT_STRING RDB$BASE_FIELD RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$QUERY_NAME RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$FIELD_SOURCE RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$RELATION_NAME RDB$RELATION_FIELDS RDB$RELATION_NAME RDB$FIELD_NAME RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$STATISTICS RDB$INDICES RDB$STATISTICS   RDB$EXPRESSION_SOURCE RDB$INDICES RDB$SOURCE   RDB$EXPRESSION_BLR RDB$INDICES RDB$VALUE   RDB$SYSTEM_FLAG RDB$INDICES RDB$SYSTEM_FLAG   RDB$FOREIGN_KEY RDB$INDICES RDB$RELATION_NAME RDB$INDEX_TYPE RDB$INDICES RDB$SYSTEM_FLAG RDB$INDEX_INACTIVE RDB$INDICES RDB$SYSTEM_FLAG RDB$SEGMENT_COUNT RDB$INDICES RDB$SEGMENT_COUNT RDB$DESCRIPTION RDB$INDICES RDB$DESCRIPTION RDB$UNIQUE_FLAG RDB$INDICES RDB$SYSTEM_FLAG RDB$INDEX_ID RDB$INDICES RDB$INDEX_ID RDB$RELATION_NAME RDB$INDICES RDB$RELATION_NAME RDB$INDEX_NAME RDB$INDICES RDB$INDEX_NAME RDB$STATISTICS RDB$INDEX_SEGMENTS RDB$STATISTICS RDB$FIELD_POSITION RDB$INDEX_SEGMENTS RDB$FIELD_POSITION RDB$FIELD_NAME RDB$INDEX_SEGMENTS RDB$FIELD_NAME RDB$INDEX_NAME RDB$INDEX_SEGMENTS RDB$INDEX_NAME 90$[D_KRLW U UD W K OL [ ] WD O i O, \ O V$ `^d^KIxQ^Nh^IWpQSQpW$KM RDB$TYPE RDB$TYPES RDB$GENERIC_TYPE RDB$FIELD_NAME RDB$TYPES RDB$FIELD_NAME RDB$SHADOW_NUMBER RDB$FILES RDB$SHADOW_NUMBER RDB$FILE_FLAGS RDB$FILES RDB$FILE_FLAGS RDB$FILE_LENGTH RDB$FILES RDB$FILE_LENGTH RDB$FILE_START RDB$FILES RDB$FILE_START RDB$FILE_SEQUENCE RDB$FILES RDB$FILE_SEQUENCE RDB$FILE_NAME RDB$FILES RDB$FILE_NAME RDB$DESCRIPTION RDB$SECURITY_CLASSES RDB$DESCRIPTION  RDB$ACL RDB$SECURITY_CLASSES RDB$ACL RDB$SECURITY_CLASS RDB$SECURITY_CLASSES RDB$SECURITY_CLASS RDB$DESCRIPTOR RDB$FORMATS RDB$DESCRIPTOR RDB$FORMAT RDB$FORMATS RDB$FORMAT RDB$RELATION_ID RDB$FORMATS RDB$RELATION_ID RDB$CONTEXT_NAME RDB$VIEW_RELATIONS RDB$CONTEXT_NAME RDB$VIEW_CONTEXT RDB$VIEW_RELATIONS RDB$VIEW_CONTEXT RDB$RELATION_NAME RDB$VIEW_RELATIONS RDB$RELATION_NAME RDB$VIEW_NAME RDB$VIEW_RELATIONS RDB$RELATION_NAME  RDB$FLAGS RDB$RELATIONS RDB$SYSTEM_FLAG RDB$DEFAULT_CLASS RDB$RELATIONS RDB$SECURITY_CLASS RDB$OWNER_NAME RDB$RELATIONS RDB$USER   RDB$EXTERNAL_DESCRIPTION RDB$RELATIONS RDB$EXTERNAL_DESCRIPTION   RDB$RUNTIME RDB$RELATIONS RDB$RUNTIME   RDB$EXTERNAL_FILE RDB$RELATIONS RDB$FILE_NAME   RDB$SECURITY_CLASS RDB$RELATIONS RDB$SECURITY_CLASS   RDB$RELATION_NAME RDB$RELATIONS RDB$RELATION_NAME RDB$FIELD_ID RDB$RELATIONS RDB$FIELD_ID RDB$FORMAT RDB$RELATIONS RDB$FORMAT RDB$DBKEY_LENGTH RDB$RELATIONS RDB$DBKEY_LENGTH RDB$SYSTEM_FLAG RDB$RELATIONS RDB$SYSTEM_FLAG RDB$RELATION_ID RDB$RELATIONS RDB$RELATION_ID RDB$DESCRIPTION RDB$RELATIONS RDB$DESCRIPTION RDB$VIEW_SOURCE RDB$RELATIONS RDB$SOURCE RDB$VIEW_BLR RDB$RELATIONS RDB$VIEW_BLR RDB$COLLATION_ID RDB$RELATION_FIELDS RDB$COLLATION_ID RDB$DEFAULT_SOURCE RDB$RELATION_FIELDS RDB$SOURCE 90"O\SSRXZ ` XL T V V@ [ V P@ X ` X( ] _p U [UdW UXT^U^0i\x\^`TdjRDB$CHARACTER_SET_ID RDB$FUNCTION_ARGUMENTS RDB$CHARACTER_SET_ID RDB$FIELD_SUB_TYPE RDB$FUNCTION_ARGUMENTS RDB$FIELD_SUB_TYPE RDB$FIELD_LENGTH RDB$FUNCTION_ARGUMENTS RDB$FIELD_LENGTH RDB$FIELD_SCALE RDB$FUNCTION_ARGUMENTS RDB$FIELD_SCALE RDB$FIELD_TYPE RDB$FUNCTION_ARGUMENTS RDB$FIELD_TYPE RDB$MECHANISM RDB$FUNCTION_ARGUMENTS RDB$MECHANISM RDB$ARGUMENT_POSITION RDB$FUNCTION_ARGUMENTS RDB$FIELD_POSITION RDB$FUNCTION_NAME RDB$FUNCTION_ARGUMENTS RDB$FUNCTION_NAME RDB$SYSTEM_FLAG RDB$FUNCTIONS RDB$SYSTEM_FLAG RDB$RETURN_ARGUMENT RDB$FUNCTIONS RDB$FIELD_POSITION RDB$ENTRYPOINT RDB$FUNCTIONS RDB$EXTERNAL_NAME RDB$MODULE_NAME RDB$FUNCTIONS RDB$FILE_NAME RDB$DESCRIPTION RDB$FUNCTIONS RDB$DESCRIPTION RDB$QUERY_NAME RDB$FUNCTIONS RDB$FIELD_NAME RDB$FUNCTION_TYPE RDB$FUNCTIONS RDB$FUNCTION_TYPE RDB$FUNCTION_NAME RDB$FUNCTIONS RDB$FUNCTION_NAME RDB$DEPENDED_ON_TYPE RDB$DEPENDENCIES RDB$OBJECT_TYPE RDB$DEPENDENT_TYPE RDB$DEPENDENCIES RDB$OBJECT_TYPE RDB$FIELD_NAME RDB$DEPENDENCIES RDB$FIELD_NAME RDB$DEPENDED_ON_NAME RDB$DEPENDENCIES RDB$GENERIC_NAME RDB$DEPENDENT_NAME RDB$DEPENDENCIES RDB$GENERIC_NAME  RDB$FLAGS RDB$TRIGGERS RDB$SYSTEM_FLAG   RDB$SYSTEM_FLAG RDB$TRIGGERS RDB$SYSTEM_FLAG RDB$TRIGGER_INACTIVE RDB$TRIGGERS RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$TRIGGERS RDB$DESCRIPTION RDB$TRIGGER_BLR RDB$TRIGGERS RDB$TRIGGER_BLR RDB$TRIGGER_SOURCE RDB$TRIGGERS RDB$SOURCE RDB$TRIGGER_TYPE RDB$TRIGGERS RDB$TRIGGER_TYPE RDB$TRIGGER_SEQUENCE RDB$TRIGGERS RDB$TRIGGER_SEQUENCE RDB$RELATION_NAME RDB$TRIGGERS RDB$RELATION_NAME RDB$TRIGGER_NAME RDB$TRIGGERS RDB$TRIGGER_NAME RDB$SYSTEM_FLAG RDB$TYPES RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$TYPES RDB$DESCRIPTION RDB$TYPE_NAME RDB$TYPES RDB$TYPE_NAME 90"h0fSU0S V| [ \ Sp Z d Vh I R YX ^ ` [@ []ZfVPrXZDXXV8ZXX$djRDB$CONSTRAINT_TYPE RDB$RELATION_CONSTRAINTS RDB$CONSTRAINT_TYPE RDB$CONSTRAINT_NAME RDB$RELATION_CONSTRAINTS RDB$CONSTRAINT_NAME RDB$UPPER_BOUND RDB$FIELD_DIMENSIONS RDB$BOUND RDB$LOWER_BOUND RDB$FIELD_DIMENSIONS RDB$BOUND RDB$DIMENSION RDB$FIELD_DIMENSIONS RDB$DIMENSION RDB$FIELD_NAME RDB$FIELD_DIMENSIONS RDB$FIELD_NAME RDB$DESCRIPTION RDB$GENERATORS RDB$DESCRIPTION RDB$SYSTEM_FLAG RDB$GENERATORS RDB$SYSTEM_FLAG RDB$GENERATOR_ID RDB$GENERATORS RDB$GENERATOR_ID RDB$GENERATOR_NAME RDB$GENERATORS RDB$GENERATOR_NAME RDB$TRANSACTION_DESCRIPTION RDB$TRANSACTIONS RDB$TRANSACTION_DESCRIPTION RDB$TIMESTAMP RDB$TRANSACTIONS RDB$TIMESTAMP RDB$TRANSACTION_STATE RDB$TRANSACTIONS RDB$TRANSACTION_STATE RDB$TRANSACTION_ID RDB$TRANSACTIONS RDB$TRANSACTION_ID RDB$OBJECT_TYPE RDB$USER_PRIVILEGES RDB$OBJECT_TYPE RDB$USER_TYPE RDB$USER_PRIVILEGES RDB$OBJECT_TYPE RDB$FIELD_NAME RDB$USER_PRIVILEGES RDB$FIELD_NAME RDB$RELATION_NAME RDB$USER_PRIVILEGES RDB$GENERIC_NAME RDB$GRANT_OPTION RDB$USER_PRIVILEGES RDB$SYSTEM_FLAG RDB$PRIVILEGE RDB$USER_PRIVILEGES RDB$PRIVILEGE RDB$GRANTOR RDB$USER_PRIVILEGES RDB$USER  RDB$USER RDB$USER_PRIVILEGES RDB$USER RDB$MESSAGE RDB$TRIGGER_MESSAGES RDB$MESSAGE RDB$MESSAGE_NUMBER RDB$TRIGGER_MESSAGES RDB$MESSAGE_NUMBER RDB$TRIGGER_NAME RDB$TRIGGER_MESSAGES RDB$TRIGGER_NAME RDB$SYSTEM_FLAG RDB$FILTERS RDB$SYSTEM_FLAG RDB$OUTPUT_SUB_TYPE RDB$FILTERS RDB$FIELD_SUB_TYPE RDB$INPUT_SUB_TYPE RDB$FILTERS RDB$FIELD_SUB_TYPE RDB$ENTRYPOINT RDB$FILTERS RDB$EXTERNAL_NAME RDB$MODULE_NAME RDB$FILTERS RDB$FILE_NAME RDB$DESCRIPTION RDB$FILTERS RDB$DESCRIPTION RDB$FUNCTION_NAME RDB$FILTERS RDB$FUNCTION_NAME RDB$CHARACTER_LENGTH RDB$FUNCTION_ARGUMENTS RDB$FIELD_LENGTH   RDB$FIELD_PRECISION RDB$FUNCTION_ARGUMENTS RDB$FIELD_PRECISION 90!f8`hp`_ cL _ V V8 a a M( [ Wp _ [ Ud X Xd@eXX4\^P4PVxbhl<hbRDB$FIELD_SOURCE RDB$PROCEDURE_PARAMETERS RDB$FIELD_NAME RDB$PARAMETER_TYPE RDB$PROCEDURE_PARAMETERS RDB$PARAMETER_TYPE RDB$PARAMETER_NUMBER RDB$PROCEDURE_PARAMETERS RDB$PARAMETER_NUMBER RDB$PROCEDURE_NAME RDB$PROCEDURE_PARAMETERS RDB$PROCEDURE_NAME RDB$PARAMETER_NAME RDB$PROCEDURE_PARAMETERS RDB$PARAMETER_NAME RDB$SYSTEM_FLAG RDB$PROCEDURES RDB$SYSTEM_FLAG   RDB$RUNTIME RDB$PROCEDURES RDB$RUNTIME   RDB$OWNER_NAME RDB$PROCEDURES RDB$USER RDB$SECURITY_CLASS RDB$PROCEDURES RDB$SECURITY_CLASS RDB$PROCEDURE_BLR RDB$PROCEDURES RDB$PROCEDURE_BLR RDB$PROCEDURE_SOURCE RDB$PROCEDURES RDB$SOURCE RDB$DESCRIPTION RDB$PROCEDURES RDB$DESCRIPTION RDB$PROCEDURE_OUTPUTS RDB$PROCEDURES RDB$PROCEDURE_PARAMETERS RDB$PROCEDURE_INPUTS RDB$PROCEDURES RDB$PROCEDURE_PARAMETERS RDB$PROCEDURE_ID RDB$PROCEDURES RDB$PROCEDURE_ID RDB$PROCEDURE_NAME RDB$PROCEDURES RDB$PROCEDURE_NAME RDB$FILE_FLAGS RDB$LOG_FILES RDB$FILE_FLAGS RDB$FILE_P_OFFSET RDB$LOG_FILES RDB$FILE_P_OFFSET RDB$FILE_PARTITIONS RDB$LOG_FILES RDB$FILE_PARTITIONS RDB$FILE_LENGTH RDB$LOG_FILES RDB$FILE_LENGTH RDB$FILE_SEQUENCE RDB$LOG_FILES RDB$FILE_SEQUENCE RDB$FILE_NAME RDB$LOG_FILES RDB$FILE_NAME RDB$TRIGGER_NAME RDB$CHECK_CONSTRAINTS RDB$TRIGGER_NAME RDB$CONSTRAINT_NAME RDB$CHECK_CONSTRAINTS RDB$CONSTRAINT_NAME RDB$DELETE_RULE RDB$REF_CONSTRAINTS RDB$RULE RDB$UPDATE_RULE RDB$REF_CONSTRAINTS RDB$RULE RDB$MATCH_OPTION RDB$REF_CONSTRAINTS RDB$MATCH_OPTION RDB$CONST_NAME_UQ RDB$REF_CONSTRAINTS RDB$CONSTRAINT_NAME RDB$CONSTRAINT_NAME RDB$REF_CONSTRAINTS RDB$CONSTRAINT_NAME RDB$INDEX_NAME RDB$RELATION_CONSTRAINTS RDB$INDEX_NAME RDB$INITIALLY_DEFERRED RDB$RELATION_CONSTRAINTS RDB$DEFERRABLE RDB$DEFERRABLE RDB$RELATION_CONSTRAINTS RDB$DEFERRABLE RDB$RELATION_NAME RDB$RELATION_CONSTRAINTS RDB$RELATION_NAME 90"b<`dx]n h8 f Z \ ` e` X Z b< b V X0 \cdh XbXPXXdDKSpSRXd^NL RDB$SCN RDB$BACKUP_HISTORY RDB$SCN  RDB$GUID RDB$BACKUP_HISTORY RDB$GUID RDB$BACKUP_LEVEL RDB$BACKUP_HISTORY RDB$BACKUP_LEVEL RDB$TIMESTAMP RDB$BACKUP_HISTORY RDB$TIMESTAMP RDB$BACKUP_ID RDB$BACKUP_HISTORY RDB$BACKUP_ID RDB$SYSTEM_FLAG RDB$ROLES RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$ROLES RDB$DESCRIPTION RDB$OWNER_NAME RDB$ROLES RDB$USER RDB$ROLE_NAME RDB$ROLES RDB$USER RDB$SYSTEM_FLAG RDB$EXCEPTIONS RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$EXCEPTIONS RDB$DESCRIPTION RDB$MESSAGE RDB$EXCEPTIONS RDB$MESSAGE RDB$EXCEPTION_NUMBER RDB$EXCEPTIONS RDB$EXCEPTION_NUMBER RDB$EXCEPTION_NAME RDB$EXCEPTIONS RDB$EXCEPTION_NAME RDB$SPECIFIC_ATTRIBUTES RDB$COLLATIONS RDB$SPECIFIC_ATTRIBUTES RDB$BASE_COLLATION_NAME RDB$COLLATIONS RDB$COLLATION_NAME RDB$FUNCTION_NAME RDB$COLLATIONS RDB$FUNCTION_NAME RDB$DESCRIPTION RDB$COLLATIONS RDB$DESCRIPTION RDB$SYSTEM_FLAG RDB$COLLATIONS RDB$SYSTEM_FLAG RDB$COLLATION_ATTRIBUTES RDB$COLLATIONS RDB$GENERIC_TYPE RDB$CHARACTER_SET_ID RDB$COLLATIONS RDB$CHARACTER_SET_ID RDB$COLLATION_ID RDB$COLLATIONS RDB$COLLATION_ID RDB$COLLATION_NAME RDB$COLLATIONS RDB$COLLATION_NAME RDB$BYTES_PER_CHARACTER RDB$CHARACTER_SETS RDB$FIELD_LENGTH RDB$FUNCTION_NAME RDB$CHARACTER_SETS RDB$FUNCTION_NAME RDB$DESCRIPTION RDB$CHARACTER_SETS RDB$DESCRIPTION RDB$SYSTEM_FLAG RDB$CHARACTER_SETS RDB$SYSTEM_FLAG RDB$CHARACTER_SET_ID RDB$CHARACTER_SETS RDB$CHARACTER_SET_ID RDB$DEFAULT_COLLATE_NAME RDB$CHARACTER_SETS RDB$COLLATION_NAME RDB$NUMBER_OF_CHARACTERS RDB$CHARACTER_SETS RDB$NUMBER_OF_CHARACTERS RDB$FORM_OF_USE RDB$CHARACTER_SETS RDB$GENERIC_NAME RDB$CHARACTER_SET_NAME RDB$CHARACTER_SETS RDB$CHARACTER_SET_NAME RDB$SYSTEM_FLAG RDB$PROCEDURE_PARAMETERS RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$PROCEDURE_PARAMETERS RDB$DESCRIPTION 90/Xh>$A=?d?$@ < =` E$ : < . 00 W > ?l A$ E ? >x )L + T Ep >( E;<dJ CAGDOMPDDKSFH@=ACtDP!$* PHONE_EXT PHONE_LIST RDB$7 PHONE_EXT   PHONE_NO PHONE_LIST PHONENUMBER PHONE_NO CONTACT_LAST CUSTOMER LASTNAME  PHONE_NO CUSTOMER PHONENUMBER  POSTAL_CODE CUSTOMER RDB$21  JOB CUST_NO CUSTOMER CUSTNO LOYADDRESS_LINE1 CUSTOMER ADDRESSLINE ADDRESS_LINE2 CUFIRST_NAME PHONE_LIST FIRSTNAME FIRST_NAME N LOCATION PHONE_LIST RDB$6 LOCATION  EMP_NO PHONE_LIST EMPNO EMP_NO  LAST_NAME PHONE_LIST LASTNAME LAST_NAME   DEFAULT NULL-LCONTACT_LAST CUSTOMER LASTNAME  PHONE_NO CUSTOMER PHONENUMBER  POSTAL_CODE CUSTOMER RDB$21  JOB CUST_NO CUSTOMER CUSTNO LOYADDRESS_LINE1 CUSTOMER ADDRESSLINE ADDRESS_LINE2 CUSTOMER ADDRESSLINE PAFIRST_NAME PHONE_LIST FIRSTNAME FIRST_NAME  LOCATION PHONE_LIST RDB$6 LOCATION  EMP_NO PHONE_LIST EMPNO EMP_NO  PHONE_EXT PHONE_LIST RDB$7 PHONE_EXT   PHONE_NO PHONE_LIST PHONENUMBER PHONE_NO FIRST_NAME EMPLOYEE FIRSTNAME  N DEPT_NO EMPLOYEE DEPTNO  ART JOB_CODE EMPLOYEE JOBCODE MJOB_COUNTRY EMPLOYEE COUNTRYNAME   FULL_NAME EMPLOYEE RDB$9   EMP_NO EMPLOYEE EMPNO  LAST_NAME EMPLOYEE LASTNAME  PHONE_EXT EMPLOYEE RDB$7  JOB_GRADE EMPLOYEE JOBGRADE  HIRE_DATE EMPLOYEE RDB$8   DEFAULT 'NOW'  NOWL SALARY EMPLOYEE SALARY    DEPT_NO DEPARTMENT DEPTNO  DEPARTMENT DEPARTMENT RDB$5 RD HEAD_DEPT DEPARTMENT DEPTNO NAM LOCATION DEPARTMENT RDB$6 1 MNGR_NO DEPARTMENT EMPNO  PHONE_NO DEPARTMENT PHONENUMBER DEFAULT '555-1234'555-1234L BUDGET DEPARTMENT BUDGET  JOB_CODE JOB JOBCODE JOB_COUNTRY JOB COUNTRYNAME  JOB_TITLE JOB RDB$2 LANGUAGE_REQ JOB RDB$4  JOB_GRADE JOB JOBGRADE MIN_SALARY JOB SALARY MAX_SALARY JOB SALARY JOB_REQUIREMENT JOB RDB$3  COUNTRY COUNTRY COUNTRYNAME  CURRENCY COUNTRY RDB$1 RDB$FILE_NAME RDB$BACKUP_HISTORY RDB$FILE_NAME 9024:P=3083P08 4 6x 3D 2 . 4 3t 5@ 1 > 3 ;X 5 6 8 6x 6< < 3 < 1d 1, 5232T9::;h507258X4$4318L5xRDB$FUNCTION_TYPE pRDB$DESCRIPTOR PxRDB$MECHANISM xRDB$OBJECT_TYPE xRDB$TRIGGER_TYPE xRDB$GENERIC_TYPE xRDB$TRIGGER_SEQUENCE pRDB$RUNTIME PxRDB$DIMENSIONS pRDB$TYPE_NAME xRDB$EXTERNAL_NAME pRDB$FUNCTION_NAME pRDB$GENERIC_NAME pRDB$TRIGGER_NAME pRDB$TRIGGER_BLR PxRDB$FILE_FLAGS xRDB$FILE_LENGTH xRDB$FILE_START xRDB$FILE_SEQUENCE xRDB$FILE_NAME % pRDB$ACL PpRDB$SECURITY_CLASS  pRDB$VALUE PpRDB$VALIDATION_BLR PpRDB$VIEW_BLR PxRDB$FIELD_SUB_TYPE pRDB$SOURCE PxRDB$SEGMENT_LENGTH xRDB$SEGMENT_COUNT pRDB$RELATION_NAME xRDB$RELATION_ID pRDB$QUERY_HEADER PxRDB$PAGE_TYPE xRDB$PAGE_SEQUENCE xRDB$PAGE_NUMBER xRDB$DBKEY_LENGTH xRDB$FORMAT xRDB$FIELD_TYPE xRDB$FIELD_SCALE xRDB$FIELD_POSITION xRDB$FIELD_LENGTH pRDB$INDEX_NAME xRDB$INDEX_ID xRDB$SYSTEM_FLAG pRDB$FIELD_NAME xRDB$FIELD_ID xRDB$EDIT_STRING }%pRDB$DESCRIPTION PpRDB$CONTEXT_NAME xRDB$VIEW_CONTEXT 90369X1E/6t2@1 B 5 <T 4$ - 1 2 1H = 7 ( ; *@ = . 5 7d ;0 4 < <| <D 8 6@8X<$4<<t8<5714p,D+E-,p/@//pADDRESSLINE %pCOUNTRYNAME %pPHONENUMBER % pLASTNAME % pFIRSTNAME %pRDB$SPECIFIC_ATTRIBUTES P xRDB$SCN  xRDB$GUID &xRDB$BACKUP_LEVEL xRDB$BACKUP_ID xRDB$FIELD_PRECISION xRDB$FILE_P_OFFSET xRDB$EXCEPTION_NUMBER pRDB$EXCEPTION_NAME xRDB$NUMBER_OF_CHARACTERS xRDB$COLLATION_ID pRDB$COLLATION_NAME xRDB$CHARACTER_SET_ID pRDB$CHARACTER_SET_NAME xRDB$PARAMETER_TYPE xRDB$PARAMETER_NUMBER pRDB$PARAMETER_NAME pRDB$PROCEDURE_NAME xRDB$PROCEDURE_PARAMETERS xRDB$PROCEDURE_ID pRDB$PROCEDURE_BLR PxRDB$FILE_PARTITIONS  xRDB$RULE  RESTRICTLxRDB$MATCH_OPTION   FULLLxRDB$DEFERRABLE   NOLxRDB$CONSTRAINT_TYPE  pRDB$CONSTRAINT_NAME xRDB$NULL_FLAG xRDB$STATISTICS xRDB$DIMENSION  xRDB$BOUND xRDB$GENERATOR_ID pRDB$GENERATOR_NAME xRDB$SHADOW_NUMBER pRDB$EXTERNAL_DESCRIPTION PxRDB$PRIVILEGE  pRDB$USER xRDB$MESSAGE_NUMBER xRDB$MESSAGE %pRDB$TRANSACTION_DESCRIPTION PxRDB$TIMESTAMP #xRDB$TRANSACTION_STATE xRDB$TRANSACTION_ID 90 NONE NONE NONE TTNONE NONE NONE NONE QNONE QNONE QNONE QNONE QNONE QNONE QNONE QNONE QNONE QNONE QNONE QNONE QNONE QNONE NONE Q NONE NONE 90.2;9P8:;8h8,9 : 8| 9< = > >| >D 8 > : 7X 7 : = >X A = = ;\ = ??;\A=?t<D0<75\9 ;68t<<5;:<H@ 9 RDB$INDEX_43 RDB$INDEX_NAME ?NAM RDB$INDEX_42 RDB$CONSTRAINT_TYPE  ? RDB$INDEX_42 RDB$RELATION_NAME ? RDB$INDEX_41 RDB$FOREIGN_KEY $I?OL RDB$INDEX_40 RDB$TRIGGER_NAME `?A RDB$INDEX_39 RDB$ROLE_NAME ?4  RDB$INDEX_38 RDB$RELATION_NAME  a? RDB$INDEX_37 RDB$TYPE_NAME Lw? RDB$INDEX_36 RDB$FIELD_NAME ? RDB$INDEX_35 RDB$TRIGGER_NAME `UU? RDB$INDEX_34 RDB$RELATION_NAME ? RDB$INDEX_33 RDB$VIEW_NAME ?UU RDB$INDEX_32 RDB$TRANSACTION_ID  RDB$INDEX_31 RDB$RELATION_NAME  A? RDB$INDEX_30 RDB$USER ? RDB$INDEX_29 RDB$RELATION_NAME ? RDB$INDEX_43 RDB$INDEX_NAME  RDB$INDEX_42 RDB$CONSTRAINT_TYPE  RDB$INDEX_42 RDB$RELATION_NAME  RDB$INDEX_41 RDB$FOREIGN_KEY  RDB$INDEX_40 RDB$TRIGGER_NAME  RDB$INDEX_39 RDB$ROLE_NAME  RDB$INDEX_38 RDB$RELATION_NAME  RDB$INDEX_37 RDB$TYPE_NAME  RDB$INDEX_36 RDB$FIELD_NAME  RDB$INDEX_35 RDB$TRIGGER_NAME  RDB$INDEX_34 RDB$RELATION_NAME  RDB$INDEX_33 RDB$VIEW_NAME  RDB$INDEX_32 RDB$TRANSACTION_ID  RDB$INDEX_31 RDB$RELATION_NAME  RDB$INDEX_30 RDB$USER  RDB$INDEX_28 RDB$DEPENDED_ON_NAME `UU?_ RDB$INDEX_27 RDB$DEPENDENT_NAME `UU?EX_ RDB$INDEX_26 RDB$CHARACTER_SET_ID `}?CON RDB$INDEX_26 RDB$COLLATION_ID  q?B RDB$INDEX_25 RDB$CHARACTER_SET_ID `UU?B RDB$INDEX_24 RDB$EXCEPTION_NUMBER ?B RDB$INDEX_23 RDB$EXCEPTION_NAME ?RDB RDB$INDEX_22 RDB$PROCEDURE_ID ?$ RDB$INDEX_21 RDB$PROCEDURE_NAME ?ER_ RDB$INDEX_20 RDB$COLLATION_NAME `}?CLA RDB$INDEX_19 RDB$CHARACTER_SET_NAME `UU?a? RDB$INDEX_18 RDB$PARAMETER_NAME ? RDB$INDEX_18 RDB$PROCEDURE_NAME ? RDB$INDEX_17 RDB$OUTPUT_SUB_TYPE  RDB$INDEX_17 RDB$INPUT_SUB_TYPE  RDB$INDEX_16 RDB$FORMAT  ? RDB$INDEX_16 RDB$RELATION_ID  ? RDB$INDEX_15 RDB$RELATION_NAME @qf? RDB$INDEX_15 RDB$FIELD_NAME G r? RDB$INDEX_14 RDB$CONSTRAINT_NAME ? RDB$INDEX_13 RDB$CONSTRAINT_NAME $I? RDB$INDEX_12 RDB$CONSTRAINT_NAME ? RDB$INDEX_11 RDB$GENERATOR_NAME E? RDB$INDEX_10 RDB$FUNCTION_NAME ? RDB$INDEX_9 RDB$FUNCTION_NAME ? RDB$INDEX_8 RDB$TRIGGER_NAME `? RDB$INDEX_7 RDB$SECURITY_CLASS ? RDB$INDEX_6 RDB$INDEX_NAME  a? RDB$INDEX_5 RDB$INDEX_NAME  a? RDB$INDEX_4 RDB$RELATION_NAME ? RDB$INDEX_3 RDB$FIELD_SOURCE #v? RDB$INDEX_2 RDB$FIELD_NAME @r? RDB$INDEX_1 RDB$RELATION_ID ? RDB$INDEX_0 RDB$RELATION_NAME ?p90 'PARCOUNTRYUSTOMER DEPARTMENTEMPLOYEE _PROJECTJOB PHONE_LISTROJECT  _DEPT_BUDGETRDB$BACKUP_HISTORYCHARACTER_SETSECK_CONSTRAINTS OLLATIONSDATABASE  EPENDENCIES EXCEPTIONSFIELDS _DIMENSIONS LESTERSORMATSUNCTIONS _ARGUMENTS GENERATORSINDEX_SEGMENTSICES LOG_FILESPAGES ROCEDURES _PARAMETERSREF_CONSTRAINTSLATIONS _CONSTRAINTS FIELDSOLES SECURITY_CLASSES TRANSACTIONS IGGERS _MESSAGES YPESUSER_PRIVILEGESVIEW_RELATIONSSALARY_HISTORYEST234 4 905,@|A<@DGlA(C G B\ @ H E| O0 J J JX @ < L I< E B Cl E, @IETB EH|E<@ADpD$IF>;d: D:GTGRDB$INDEX_37 RDB$TYPES Lw? RDB$INDEX_34 RDB$VIEW_RELATIONS $INRDB$INDEX_33 RDB$VIEW_RELATIONS $INRDB$INDEX_30 RDB$USER_PRIVILEGES INRDB$INDEX_27 RDB$DEPENDENCIES NRDB$INDEX_24 RDB$EXCEPTIONS $INRDB$INDEX_21 RDB$PROCEDURES NRDB$INDEX_18 RDB$PROCEDURE_PARAMETERS $INRDB$INDEX_16 RDB$FORMATS RDRDB$INDEX_13 RDB$REF_CONSTRAINTS RDB$INDEX_9 RDB$FUNCTIONS $INRDB$INDEX_6 RDB$INDEX_SEGMENTS RDB$INDEX_3 RDB$RELATION_FIELDS $INRDB$INDEX_43 RDB$RELATION_CONSTRAINTS /RDB$INDEX_42 RDB$RELATION_CONSTRAINTS RDB$INDEX_41 RDB$INDICES -RDB$INDEX_40 RDB$CHECK_CONSTRAINTS RDB$INDEX_39 RDB$ROLES RDB$INDEX_38 RDB$TRIGGERS RDB$INDEX_36 RDB$FIELD_DIMENSIONS ?RDB$INDEX_35 RDB$TRIGGER_MESSAGES `UU??RDB$INDEX_34 RDB$VIEW_RELATIONS ?RDB$INDEX_33 RDB$VIEW_RELATIONS ?RDB$INDEX_32 RDB$TRANSACTIONS RDB$INDEX_31 RDB$INDICES  A?RDB$INDEX_30 RDB$USER_PRIVILEGES ?RDB$INDEX_29 RDB$USER_PRIVILEGES ?RDB$INDEX_28 RDB$DEPENDENCIES `UU? RDB$INDEX_27 RDB$DEPENDENCIES RDB$INDEX_26 RDB$COLLATIONS `}?RDB$INDEX_25 RDB$CHARACTER_SETS `UU? RDB$INDEX_24 RDB$EXCEPTIONS RDB$INDEX_23 RDB$EXCEPTIONS ? RDB$INDEX_22 RDB$PROCEDURES ?RDB$INDEX_21 RDB$PROCEDURES RDRDB$INDEX_20 RDB$COLLATIONS `}?RDB$INDEX_19 RDB$CHARACTER_SETS `UU?RDB$INDEX_18 RDB$PROCEDURE_PARAMETERS RDB$INDEX_17 RDB$FILTERS RDB$INDEX_16 RDB$FORMATS  ?RDB$INDEX_15 RDB$RELATION_FIELDS @qf?RDB$INDEX_14 RDB$CHECK_CONSTRAINTS ?RDB$INDEX_13 RDB$REF_CONSTRAINTS $I?X_RDB$INDEX_12 RDB$RELATION_CONSTRAINTS ?RDB$INDEX_11 RDB$GENERATORS E?RDB$INDEX_10 RDB$FUNCTION_ARGUMENTS ?RDB$INDEX_9 RDB$FUNCTIONS ?RDB$INDEX_8 RDB$TRIGGERS `?RDB$INDEX_7 RDB$SECURITY_CLASSES ?ERDB$INDEX_6 RDB$INDEX_SEGMENTS RDB$INDEX_5 RDB$INDICES  a?RDB$INDEX_4 RDB$RELATION_FIELDS ?BRDB$INDEX_3 RDB$RELATION_FIELDS RDB$INDEX_2 RDB$FIELDS @r?RDB$INDEX_1 RDB$RELATIONS ??RDB$INDEX_0 RDB$RELATIONS p90 ;'@ "$&(*,.0123456789:;<=>?@` @`a @`b  p90 <4PRDB$B ADDRESSLINE BUDGET COUNTRYNAMEUSTNODEPTNOEMPNO FIRSTNAMEJOBCODEGRADELASTNAME PHONENUMBER ONUMBER RODTYPEJNORDB$101212345678930123454567892012345678930123456789401234567812345915012394012345675678960123450123456789 6014569789ACL BACKUP_ID LEVELOUNDCHARACTER_SET_IDNAME OLLATION_IDNAME NSTRAINT_NAMETYPE TEXT_NAME DBKEY_LENGTH EFERRABLE SCRIPTION ORIMENSION S EDIT_STRING XCEPTION_NAMEUMBERTERNAL_DESCRIPTION NAMEFIELD_ID LENGTH NAME POSITION RECISION SCALE UB_TYPE TYPELE_FLAGS LENGTH NAME PARTITIONS _OFFSET SEQUENCE TART ORMAT UNCTION_NAME TYPE GENERATOR_IDNAME IC_NAME  TYPEUIDINDEX_ID NAME MATCH_OPTIONECHANISMSSAGE _NUMBER NULL_FLAGMBER_OF_CHARACTERS OBJECT_TYPE PAGE_NUMBER SEQUENCE TYPE  RAMETER_NAME UMBERTYPERIVILEGE OCEDURE_BLR ID NAME  PARAMETERS QUERY_HEADER RELATION_ID NAMEULE NTIMESCN ECURITY_CLASS GMENT_COUNT LENGTH HADOW_NUMBEROURCEPECIFIC_ATTRIBUTES TATISTICS YSTEM_FLAG TIMESTAMPRANSACTION_DESCRIPTIONIDSTATE IGGER_BLR NAME  SEQUENCE  TYPEYPE_NAMEUSERVALIDATION_BLRUEIEW_BLR CONTEXTSALARY ARY Y p90 ?PRDB$BFILE_S/S5 ADDRESSLINE5 4BUDGET< 4 COUNTRYNAME4 5 ; 5USTNOC4DEPTNO45<4EMPNO55<<<C 5 FIRSTNAME5 ; 4JOBCODE54GRADE55LASTNAME554 PHONENUMBER5 5 =ONUMBER<RODTYPEC <JNO<< 4RDB$1<0<1<2D1D2C3D4D5D6D7C8C9<3C0C1D2C3C4C5<4<5<6<7;8;942;051;2C3=4<5<6C7C8=943=0<144C81C2C3C4C5C9145<39<40<1<2;3<4;5<6<7465D50D1D2D3D4D5D6D7D8D9D60D1D4D5D6D95755859ACL- BACKUP_ID- LEVELOUND CHARACTER_SET_ID--NAME, OLLATION_ID-,NAME-- NSTRAINT_NAME%%%TYPE TEXT_NAME DBKEY_LENGTH % EFERRABLE% SCRIPTION&,---- ORIMENSION S EDIT_STRING- XCEPTION_NAME-UMBER TERNAL_DESCRIPTION NAME FIELD_ID  LENGTH- NAME& POSITION RECISION SCALE UB_TYPE TYPELE_FLAGS% LENGTH%  NAME   % 4 % PARTITIONS% _OFFSET SEQUENCE% TARTORMAT  UNCTION_NAME-- TYPE GENERATOR_IDNAME IC_NAME, TYPE--UIDINDEX_ID NAME%% MATCH_OPTION ECHANISMSSAGE-  _NUMBER NULL_FLAG ,MBER_OF_CHARACTERS OBJECT_TYPE PAGE_NUMBER SEQUENCE TYPE& RAMETER_NAME &UMBER &TYPE RIVILEGE& OCEDURE_BLR%ID%NAME&% PARAMETERS% QUERY_HEADER RELATION_ID NAME%%ULE% NTIME& -SCN ECURITY_CLASS& GMENT_COUNT LENGTH HADOW_NUMBER OURCE     & -PECIFIC_ATTRIBUTES TATISTICS YSTEM_FLAG&,---- TIMESTAMP- RANSACTION_DESCRIPTIONIDSTATE IGGER_BLR NAME% SEQUENCE TYPE YPE_NAME USER&-- VALIDATION_BLR UE   IEW_BLR  CONTEXT 4SALARY44< < RY44< p90 cOBP RDB$FILTERS TRIGGERSDARDDDDDDDDDDDDDD 4COUNTRY45USTOMER55555;;;;;;4 DEPARTMENT4 4 4 4 4 4 4EMPLOYEE5555555555 <_PROJECT< 4JOB4444444 5 PHONE_LIST5 5 5 5 5 <ROJECT<<<<< _DEPT_BUDGET<<<<-RDB$BACKUP_HISTORY----4,CHARACTER_SETS,,,-----%ECK_CONSTRAINTS%- OLLATIONS--------DATABASE  EPENDENCIES- EXCEPTIONS----FIELDS      _DIMENSIONSLES     TERS      ORMATS  UNCTIONS        _ARGUMENTS GENERATORSINDEX_SEGMENTSICES            % LOG_FILES% % % % % PAGES % ROCEDURES%%%&&&&&&&& _PARAMETERS&&&&,,%REF_CONSTRAINTS%%%%LATIONS                _CONSTRAINTS%%%% FIELDS-OLES- - - SECURITY_CLASSES TRANSACTIONSIGGERS          _MESSAGESYPES    USER_PRIVILEGESVIEW_RELATIONS<SALARY_HISTORY<<<<<<ES<<====CCCCCCDTC2CCCCCCCCDDDDDDDC3CCCC;4;<<<<<<< < p90+'PBUDGETXCHANGEXUSTNAMEXREGIONMAXSALXINSALX NAMEXEEDX PRODTYPEXQTYXRDB$114 FOREIGN10 3 5 6 8 9 21 3 5 6 3 6 8 9INDEX_0 1 0 1 2 3 4 5 6 7 8 9 2 0 1 2 3 4 5 6 7 8 9 3 0 1 2 3 4 5 6 7 8 9 4 0 1 2 3 4 5 5 6 7 8 9PRIMARY1 2 4 7 2 0 2 4 5 7 SALESTATXUPDATERX p90)-'PBUDGETXCHANGEXUSTNAMEXREGION  MAXSALX  INSALX NAMEXEEDX  PRODTYPEX QTYX RDB$114 FOREIGN10 3 5 6 8 9 21 3 5 6 3 6 8 9  INDEX_0 1 0 1 2 3 4 5 6 7 8 9 2 0 1 2 3 4 5 6  7 8 9 3 0 1 2 3 4 5 6 7 8 9 4 0 1 2  3 4  5 5 6 7 8 9PRIMARY1 2 4  7   2  0   2 4 5 7 SALESTATX UPDATERX p90  'PSQL$ADD_EMP_PROJLL_LANGSRCOUNTRYUSTOMERDEFAULT1 0 1 2 3 4 5 6 7 8 9 2 0 1 2 3 4 5 6 7 8 9 LETE_EMPLOYEE PARTMENTT_BUDGETEMPLOYEE _PROJECT GET_EMP_PROJ JOB MAIL_LABEL ORG_CHART PHONE_LISTROJECT _DEPT_BUDGET RDB$ROLESSALARY_HISTORY ES HIP_ORDEROW_LANGS UB_TOT_BUDGETT234 p90p 'PCHECK_1%0%1%2%3%4&5&6&7&8&92&0&1&2,3,4-5-6-7-8345678%9 -POST_NEW_ORDER RDB$TRIGGER_1 0 1 2 3 4 5 6 7 8 9 2 0 1 2 3 4 5 6 7 8 9 3 0 1 2 3 4 5 6 4 5 6 8 9SAVE_SALARY_CHANGE% ET_CUST_NOEMP_NO- TR_CONNECT-MULTI p90J'PRDB$GET_CONTEXT SET_CONTEXT p90OY'PRDB$GET_CONTEXT SET_CONTEXT p90'P CUST_NO_GEN EMP_NO_GENRDB$BACKUP_HISTORYCONSTRAINT_NAME EXCEPTIONS  FIELD_NAME  INDEX_NAME PROCEDURESSECURITY_CLASS  TRIGGER_NAME SQL$DEFAULT p90!o'PINTEG_10123456789201234567893012345678940123456789501234567896012345678970123456789809 p90Ut'PINTEG_11728931640178 56 61 778 p903'PINTEG_1234892012345630237842345950123478962345678970123459809 p90 {`x^DO [RDB$BACKUP_ CONSTRAINT_NAMERDB$X DESCRIPTIONRDB$5ADDRESS_LINE1CUSTOMER52CUSTOMER< GEDSALES4BUDGETDEPARTMENTDC1ARDTD2C3<4D0ARCT2D1ARCT2D2ARDT2D3ARCT2 D4ARCT2 D5ARCT2C6T2D2ARDT2C3D3ARCT2C3D4ARDT2C3 D5ARDT2C3D6ARDT2 D7ARDT2 D8ARCT2D9ARCT2<HANGE_DATESALARY_HISTORY; ITYCUSTOMER;ONTACT_FIRSTCUSTOMER5 LASTCUSTOMER 4UNTRYCOUNTRY; USTOMER 4URRENCYCOUNTRY;STOMERCUSTOMER5_NOCUSTOMERC SALES< _NONET4< OCTETST4< UTF8T4<WIN1250T4<DATE_NEEDEDSALES4EPARTMENTDEPARTMENT4T_NODEPARTMENT5 EMPLOYEE< PROJ_DEPT_BUDGET=ISCOUNTSALES5EMP_NOEMPLOYEE < _PROJECT 5 PHONE_LIST< SALARY_HISTORY 5FIRST_NAMEEMPLOYEE5 PHONE_LIST< SCAL_YEARPROJ_DEPT_BUDGET5ULL_NAMEEMPLOYEE4HEAD_DEPTDEPARTMENT5IRE_DATEEMPLOYEE CITEM_TYPESALES5JOB_CODEEMPLOYEE4 JOB5UNTRYEMPLOYEE4JOB5GRADEEMPLOYEE4JOB 4REQUIREMENTJOB4 TITLEJOB4LANGUAGE_REQJOB5ST_NAMEEMPLOYEE 5 PHONE_LIST4OCATIONDEPARTMENT5 PHONE_LIST 4MAX_SALARYJOB4IN_SALARYJOB4NGR_NODEPARTMENT< NEW_SALARYSALARY_HISTORY< OLD_SALARYSALARY_HISTORY;N_HOLDCUSTOMER=RDER_DATESALESCSTATUSSALES C PAIDSALES<$ERCENT_CHANGESALARY_HISTORY5HONE_EXTEMPLOYEE 5 PHONE_LIST5 NOCUSTOMER4 DEPARTMENT 5 PHONE_LIST5OSTAL_CODECUSTOMER=_NUMBERSALES<RODUCTPROJECT<$JECTED_BUDGETPROJ_DEPT_BUDGET<_DESCPROJECT <IDEMPLOYEE_PROJECT < PROJECT<_DEPT_BUDGET <NAMEPROJECTCQTY_ORDEREDSALES<&UART_HEAD_CNTPROJ_DEPT_BUDGET"RDB$ACLRDB$SECURITY_CLASSES3RGUMENT_POSITIONRDB$FUNCTION_ARGUMENTS-%BACKUP_IDRDB$BACKUP_HISTORY-LEVELRDB$BACKUP_HISTORY -(SE_COLLATION_NAMERDB$COLLATIONS FIELDRDB$RELATION_FIELDS-.YTES_PER_CHARACTERRDB$CHARACTER_SETS CHARACTER_LENGTHRDB$FIELDS UNCTION_ARGUMENTS-SET_IDRDB$CHARACTER_SETS- OLLATIONSFIELDS UNCTION_ARGUMENTS,NAMERDB$CHARACTER_SETS$ DATABASE-)OLLATION_ATTRIBUTESRDB$COLLATIONS-IDRDB$COLLATIONSFIELDSRELATION_FIELDS-NAMERDB$COLLATIONS$MPLEX_NAMERDB$RELATION_FIELDS UTED_BLRRDB$FIELDS SOURCERDB$FIELDS%,NSTRAINT_NAMERDB$CHECK_CONSTRAINTS%REF_CONSTRAINTS!LATION_CONSTRAINTS$TYPERDB$RELATION_CONSTRAINTS% %_NAME_UQRDB$REF_CONSTRAINTS "TEXT_NAMERDB$VIEW_RELATIONSDBKEY_LENGTHRDB$RELATIONS#EFAULT_CLASSRDB$RELATIONS,$OLLATE_NAMERDB$CHARACTER_SETSSOURCERDB$FIELDSRELATION_FIELDSVALUERDB$FIELDS RELATION_FIELDS % )ERRABLERDB$RELATION_CONSTRAINTS%$LETE_RULERDB$REF_CONSTRAINTS%PENDED_ON_NAMERDB$DEPENDENCIESTYPERDB$DEPENDENCIESNT_NAMERDB$DEPENDENCIESTYPERDB$DEPENDENCIES-#SCRIPTIONRDB$CHARACTER_SETS - OLLATIONS DATABASE- EXCEPTIONSFIELDSLTERS UNCTIONS GENERATORSINDICES& PROCEDURES,% _PARAMETERS RELATIONS $_FIELDS-OLESSECURITY_CLASSES TRIGGERSYPESORRDB$FORMATS&IMENSIONRDB$FIELD_DIMENSIONSSRDB$FIELDSEDIT_STRINGRDB$FIELDSRELATION_FIELDSNTRYPOINTRDB$FILTERS UNCTIONS-$XCEPTION_NAMERDB$EXCEPTIONS-UMBERRDB$EXCEPTIONSPRESSION_BLRRDB$INDICES^SOURCERDB$INDICESCESSOURCERDB$FIELDSVALUERDB$FIELDSODULE_NAMERDB$FILTERS UNCTIONSNULL_FLAGRDB$FIELDSPRELATION_FIELDSp90% ^RDB$PROCEDURE_xSTRIGGER_NAMERDB$ ,RDB$NULL_FLAGRDB$RELATION_FIELDS,-MBER_OF_CHARACTERSRDB$CHARACTER_SETS&OBJECT_TYPERDB$USER_PRIVILEGES UTPUT_SUB_TYPERDB$FILTERS&WNER_NAMERDB$PROCEDURES  RELATIONS-OLESPAGE_NUMBERRDB$PAGES SEQUENCERDB$PAGES TYPERDB$PAGES&/RAMETER_NAMERDB$PROCEDURE_PARAMETERS &$UMBERRDB$PROCEDURE_PARAMETERS &%TYPERDB$PROCEDURE_PARAMETERS %RIVILEGERDB$USER_PRIVILEGES&#OCEDURE_BLRRDB$PROCEDURES%IDRDB$PROCEDURES%NPUTSRDB$PROCEDURES%NAMERDB$PROCEDURES&* _PARAMETERS%OUTPUTSRDB$PROCEDURES&SOURCERDB$PROCEDURESQUERY_HEADERRDB$FIELDSRELATION_FIELDS NAMERDB$FIELDS UNCTIONSRELATION_FIELDSRELATION_IDRDB$DATABASEFORMATSPAGES RELATIONSNAMERDB$INDICES RELATIONS %)_CONSTRAINTS*FIELDS TRIGGERS USER_PRIVILEGESVIEW_RELATIONS"TURN_ARGUMENTRDB$FUNCTIONS-OLE_NAMERDB$ROLES&UNTIMERDB$PROCEDURES  RELATIONS-SCNRDB$BACKUP_HISTORY!ECURITY_CLASSRDB$DATABASE& PROCEDURES  RELATIONS)_FIELDSSECURITY_CLASSESGMENT_COUNTRDB$INDICESLENGTHRDB$FIELDSHADOW_NUMBERRDB$FILES -)PECIFIC_ATTRIBUTESRDB$COLLATIONS$TATISTICSRDB$INDEX_SEGMENTSICES-$YSTEM_FLAGRDB$CHARACTER_SETS - OLLATIONS- EXCEPTIONSFIELDSLTERS UNCTIONS GENERATORSINDICES& PROCEDURES,% _PARAMETERS RELATIONS $_FIELDS-OLES TRIGGERSYPES-%TIMESTAMPRDB$BACKUP_HISTORYTRANSACTIONS0RANSACTION_DESCRIPTIONRDB$TRANSACTIONSIDRDB$TRANSACTIONSSTATERDB$TRANSACTIONSIGGER_BLRRDB$TRIGGERSINACTIVERDB$TRIGGERS%NAMERDB$CHECK_CONSTRAINTS TRIGGERS" _MESSAGESSEQUENCERDB$TRIGGERSOURCERDB$TRIGGERSTYPERDB$TRIGGERSYPERDB$TYPES  _NAMERDB$TYPESUNIQUE_FLAGRDB$INDICES%PDATE_FLAGRDB$RELATION_FIELDS%RULERDB$REF_CONSTRAINTS%PER_BOUNDRDB$FIELD_DIMENSIONSSERRDB$USER_PRIVILEGES "_TYPERDB$USER_PRIVILEGES  VALIDATION_BLRRDB$FIELDS SOURCERDB$FIELDSIEW_BLRRDB$RELATIONS  CONTEXTRDB$RELATION_FIELDSVIEW_RELATIONS NAMERDB$VIEW_RELATIONS SOURCERDB$RELATIONS4SALARYEMPLOYEE CES_REPSALES<HIP_DATESALES;TATE_PROVINCECUSTOMER <TEAM_LEADERPROJECT=OTAL_VALUESALES< UPDATER_IDSALARY_HISTORY; V_NONET4< OCTETST4< UTF8T4;WIN1250T4 p90'`c,RDB$EXPRESSION_SOURCERDB$INDICESd&NULL_FLAGRDB$RELATION_FIELDS p90 +'@` @`   a @`b  p90('@ p90'ADD_EMP_PROJEMP_NOPROJ_IDLL_LANGSCODEUNTRYGRADELANG DELETE_EMPLOYEEEMP_NUM PT_BUDGETDNO TOTGET_EMP_PROJEMP_NOPROJ_IDMAIL_LABELCUST_NOLINE123456 ORG_CHARTDEPARTMENTEMP_CNT  HEAD_DEPT MNGR_NAMETITLESHIP_ORDERPO_NUMOW_LANGSCODETYGRADE LANGUAGESUB_TOT_BUDGETAVG_BUDGET HEAD_DEPT MAX_BUDGET IN_BUDGET TOT_BUDGET p90V'PASCII BIG_5CYRLDOS43773775850278601234569 EUCJ_0208 GB_2312 ISO8859_1 323456789 KOI8RU SC_5601NEXTONEOCTETS SJIS_0208 UNICODE_FSSTF8WIN125012345678 p90.,PNASCIIBIG_5S_BACS_CZYRLDA_DAB_CSYDAN865 EU437850ESP437850FIN437RA437850C85063ITA437850NLD437850OR865PLKTB850G860RUSSLOVE437850TRKUK437850S437850 E_DE OS43773775850278601234569U_NLEN_UKSS_ES_CI_AIUCJ_0208FI_FI R_CA FRGB_2312 ISO8859_1 323456789_HUNPLK _IS T_ITKOI8R_RUU_UASC_5601 DICTIONARYLT_LT NEXTONE_NO XT_DEU ESP FRA ITA USOCTETS PDOX_ASCIICSYYRLHUN INTLSLNORDAN4PLKSLO WEDFINT_BRPTXW_CSYYRL GREEKHUNDCINTL850NORDAN4PLKSLOVPANWEDFIN TURK SJIS_0208V_SV  TEST_COLLATE UCS_BASICNICODE_FSSTF8 WIN12501_UA2 3 4 5 6 7_EELT V8_CZ_CI_AIPTBR p90'P ADD_EMP_PROJLL_LANGS DELETE_EMPLOYEE PT_BUDGET GET_EMP_PROJ MAIL_LABEL ORG_CHART SHIP_ORDEROW_LANGS UB_TOT_BUDGET p90R'@ "$ p90 'PCUSTOMER_CHECK ON_HOLDORDER_ALREADY_SHIPPEDREASSIGN_SALESUNKNOWN_EMP_ID p90>'@ p909'@"$&(*,.0123567ABCDFGHIJKLMN OP@ p90y2@w "$&(*,.012 3567ABCDFGHIJ K L M  NOP@$&(*, 356DFGIJ K NOP$&( 356FIJN $&( 356IJN $& 35FIJ$& 35FIJ$&5FIJ$&5FI $&5FI"$&5$$&5&$5($5,5.50515 _I p90 5P SET_EMP_NO ADD_EMP_PROJ   LL_LANGS     CHECK_1012345678920123456783456789DELETE_EMPLOYEE PT_BUDGET     GET_EMP_PROJ   MAIL_LABEL           ORG_CHART          PHONE_LIST RDB$17319SAVE_SALARY_CHANGE ET_CUST_NO EMP_NO  HIP_ORDER           OW_LANGS     UB_TOT_BUDGET p90t 0PSALESCUSTOMER_CHECK ON_HOLD_NO_GEN DEPARTMENT               T_BUDGETEMPLOYEE_PROJECT _NO_GENJOBORDER_ALREADY_SHIPPEDPROJECT  _DEPT_BUDGET REASSIGN_SALESSALARY_HISTORYES HOW_LANGS UNKNOWN_EMP_ID p90,PS ADD_EMP_PROJ LL_LANGS RCOUNTRYUSTOMERDELETE_EMPLOYEEPARTMENT      T_BUDGET EMPLOYEE_PROJECT GET_EMP_PROJ JOB MAIL_LABEL  ORG_CHART  PHONE_LIST      ROJECT  _DEPT_BUDGET RDB$ROLES SALARY_HISTORYES HIP_ORDER OW_LANGS  UB_TOT_BUDGETT234 p90('PPUBLICSYSDBA p90'PCOUNTRYUSTOMER  DEPARTMENT    EMPLOYEE_PROJECTJOBPROJECT _DEPT_BUDGETRDB$BACKUP_HISTORYCHARACTER_SETSECK_CONSTRAINTS OLLATIONS DEPENDENCIES EXCEPTIONSFIELDS _DIMENSIONSLTERS ORMATS UNCTIONS _ARGUMENTS  GENERATORSINDEX_SEGMENTSICES   PROCEDURES _PARAMETERS REF_CONSTRAINTSLATIONS _CONSTRAINTS FIELDSOLESSECURITY_CLASSES TRANSACTIONSIGGERS  _MESSAGESYPESUSER_PRIVILEGESVIEW_RELATIONSSALARY_HISTORYES p90('@ p90 9'P PHONE_LIST p90B'P DEPARTMENTEMPLOYEE p90'P RDB$TRIGGER_1 0 2 3 4 5 7 8 9 2 0 1 2 3 4 5 6 3 1 2 3 6 5 9 p90j|'PRDB$13465123456789601456 p90  {2PINUACLNSISCII7BIG5_5NARYLOB_FILTER IDROOLEANY_ISC_DESCRIPTOR REFERENCE _WITH_NULLSCALAR_ARRAY_DESCRIPTORVALUE MS_DESCRIPTORCHECK_CONSTRAINTOMMITTED PUTED_FIELD STRING YRL DATEEPENDENT_COUNT OS437 73775850278601234569 _437 73775850278601234569936 4950UBLE EUCJ _0208 XCEPTION PRESSION_INDEXTERNAL_FILE_DESCRIPTIONFIELDLOATORMATGB2312_2312ENERATORINDEX T64 SO-8859-13 2 3 4 5 6 7 8 988591323456789_1  3 2 3 4 5 6 7 8 9 KOI8RU SC5601 _5601LATIN123457IMBOONGNEXTONEOCTETS POST_ERASEMODIFYSTORERE_ERASEMODIFYSTORE OCEDUREQLIUADRANGESEFERENTIAL_CONSTRAINTLATIONOLELED_BACKSHORT JIS_0208QL_TEXTUMMARYYSTEMTEXT IMESTAMPRANSACTION_DESCRIPTIONIGGERUDF NICODE_FSSSASCII ER_GROUPTF-88_FSS  VALIDATIONUERYINGIEW_CHECKWIN125012345678_125012345679364950 4950 p90 'P--COUNTRY %USTOMER%%EMPLOYEEJOBPROJ_DEPT_BUDGETRDB$CHECK_CONSTRAINTS EXCEPTIONSFIELDS GENERATORSINDEX_SEGMENTSICES  PROCEDURESREF_CONSTRAINTSLATIONS  _CONSTRAINTS  FIELDSTRIGGERS   USER_PRIVILEGES SALARY_HISTORY%ES%%%&&&&&&&&,,----- p905'P TEST_ROLE p90-'P CHANGE_DATEECK_1012345678920123456783456789OUNTRYURRENCYSTOMER_NO DEPARTMENT T_NOISCOUNT EMP_NO FIRST_NAME SCAL_YEAR HIRE_DATEJOB_CODEUNTRY GRADE TITLE LAST_NAME MAX_SALARY IN_SALARY OLD_SALARY RDER_DATE STATUSPERCENT_CHANGE O_NUMBERROJ_IDNAME QTY_ORDEREDSALARY TOTAL_VALUE UPDATER_ID p90'P`abcdefghijklmnopqrstuvwxyz{|}~`abcdefghijkopqtuvwyz{~abdeghilmnprtuv RDB$PRIMARY1  2  2 2 5   7    p907J@pSALARY_HISTORYCOUNTRYNOT NULL PRIMARY KEYUSTOMERCHECK FOREIGN KEY NOT NULL PRIMARY KEYDEPARTMENTFOREIGN KEY  NOT NULL PRIMARY KEYUNIQUEEMPLOYEECHECK FOREIGN KEY NOT NULL PRIMARY KEY _PROJECTFOREIGN KEY" NOT NULL PRIMARY KEY  JOBCHECK  FOREIGN KEY NOT NULL  PRIMARY KEYPROJECTFOREIGN KEY NOT NULL PRIMARY KEY UNIQUE _DEPT_BUDGETCHECK FOREIGN KEY"  NOT NULL PRIMARY KEYSALARY_HISTORYCHECK FOREIGN KEY NOT NULL PRIMARY KEY ESCHECK FOREIGN KEY NOT NULL  PRIMARY KEY p90 'P`bcdefghklmqrstuvwxy}`deijklrstuvwz{|`abcdefghijklpqRDB$114 FOREIGN10 3 5 6 8 9 21 3 5 6 3 6 8 9PRIMARY1 2 4 7 2 0 2 4 5 7 90(854\6(432/d44., 0 1h 90 8h1 1 1h 40 5 533d 2, 5823 .l 3l7 , 3 343D 0 0/1|2H368-0.L21,33P6761x2D12 RDB$FOREIGN9 JOB_GRADE  q? RDB$FOREIGN9 JOB_CODE  ;? RDB$FOREIGN8 DEPT_NO ? RDB$FOREIGN6 HEAD_DEPT ? RD RDB$FOREIGN3 JOB_COUNTRY $I?RDMAXSALX MAX_SALARY  ;?RDMAXSALX JOB_COUNTRY $I?MINSALX MIN_SALARY  RDB$FOREIGN26 SALES_REP ? RDB$FOREIGN25 CUST_NO  ?Y RDB$FOREIGN23 COUNTRY E?A RDB$FOREIGN21 EMP_NO ?JOB RDB$FOREIGN19 PROJ_ID ?  RDB$FOREIGN18 DEPT_NO  q? RDB$FOREIGN16 PROJ_ID ?a RDB$FOREIGN15 EMP_NO E?? RDB$FOREIGN13 TEAM_LEADER `UU? RDB$FOREIGN10 MNGR_NO  q? RDB$FOREIGN9 JOB_COUNTRY ?MAXSALX MAX_SALARY  ;?RDMAXSALX JOB_COUNTRY $I?MINSALX MIN_SALARY `UU?MINSALX JOB_COUNTRY $I? RDB$FOREIGN3 JOB_COUNTRY $I?RD RDB$PRIMARY2 JOB_COUNTRY !? RDB$PRIMARY2 JOB_GRADE  a?RD RDB$PRIMARY2 JOB_CODE $I? RDB$FOREIGN10 MNGR_NO BUDGETX BUDGET $I? RDB$FOREIGN6 HEAD_DEPT ? RD RDB$PRIMARY5 DEPT_NO  a?RDB$4 DEPARTMENT  a??NAMEX FIRST_NAME  a?NAMEX LAST_NAME ? RDB$FOREIGN9 JOB_GRADE  q? RDB$FOREIGN9 JOB_CODE  ;? RDB$FOREIGN8 DEPT_NO ? RDB$PRIMARY7 EMP_NO  a? CUSTREGION CITY  ? CUSTREGION COUNTRY E? CUSTNAMEX CUSTOMER  ? RDB$FOREIGN23 COUNTRY  RDB$PRIMARY22 CUST_NO  ?_ PRODTYPEX PROJ_NAME `UU? PRODTYPEX PRODUCT ? RDB$FOREIGN13 TEAM_LEADER  RDB$PRIMARY12 PROJ_ID `UU?RDB$11 PROJ_NAME `UU? RDB$FOREIGN16 PROJ_ID  RDB$FOREIGN15 EMP_NO  RDB$PRIMARY14 PROJ_ID $I? RDB$PRIMARY14 EMP_NO E? RDB$FOREIGN19 PROJ_ID  RDB$FOREIGN18 DEPT_NO  RDB$PRIMARY17 DEPT_NO `UU? RDB$PRIMARY17 PROJ_ID  q? RDB$PRIMARY17 FISCAL_YEAR ?CHANGEX CHANGE_DATE `UU?UPDATERX UPDATER_ID `UU? RDB$FOREIGN21 EMP_NO  RDB$PRIMARY20 UPDATER_ID ? RDB$PRIMARY20 CHANGE_DATE ? RDB$PRIMARY20 EMP_NO ?QTYX QTY_ORDERED E?QTYX ITEM_TYPE `UU? SALESTATX PAID `UU? SALESTATX ORDER_STATUS `UU?NEEDX DATE_NEEDED E? RDB$FOREIGN26 SALES_REP  RDB$FOREIGN25 CUST_NO  RDB$PRIMARY24 PO_NUMBER ? RDB$INDEX_45 RDB$FUNCTION_NAME  RDB$INDEX_44 RDB$BACKUP_ID  RDB$INDEX_44 RDB$BACKUP_LEVEL x90 ('P 90WFG|<D8ADE/3p*4< I ;t 64 > K TT > K T .L 5 B 1 6X C( . / ;x B4 B *0=LI2E0`=0/+4p|,RDB$FOREIGN26 SALES  RDB$PRIMARY7 ? RDB$INDEX_12 RDB$RELATION_CONSTRAINTS RDB$INDEX_11 RDB$GENERATORS RDB$INDEX_10 RDB$FUNCTION_ARGUMENTS RDB$INDEX_8 RDB$TRIGGERS RDB$INDEX_7 RDB$SECURITY_CLASSES  a?RDB$INDEX_5 RDB$INDICES RDB$INDEX_4 RDB$RELATION_FIELDS #v?RDB$INDEX_2 RDB$FIELDS RDB$INDEX_1 RDB$RELATIONS ?RDB$INDEX_0 RDB$RELATIONS RDB$INDEX_45 RDB$FILTERS RDB$INDEX_44 RDB$BACKUP_HISTORY  ?RDBRDB$INDEX_42 RDB$RELATION_CONSTRAINTS `?RDBRDB$INDEX_40 RDB$CHECK_CONSTRAINTS RDB$INDEX_38 RDB$TRIGGERS RDB$INDEX_37 RDB$TYPES RDB$INDEX_36 RDB$FIELD_DIMENSIONS ERDB$INDEX_35 RDB$TRIGGER_MESSAGES O@RDB$PRIMARY1 COUNTRY  > MAXSALX JOB D MINSALX JOB `UU?DBRDB$FOREIGN3 JOB RDB$PREL;RDB$PRIMARY2 JOB #IRDB$FOREIGN10 DEPARTMENT RDB$P_CO 9 BUDGETX DEPARTMENT X_ RDB$FOREIGN6 DEPARTMENT  RDB$PRIMARY5 ? RDB$PRIMARY5 DEPARTMENT  a?B 6 RDB$4 DEPARTMENT  4 NAMEX EMPLOYERD"GRDB$FOREIGN9 EMPLOYEE RDB$PIO!ERDB$FOREIGN8 EMPLOYEE RDB$PIORDB$PRIMARY7 EMPLOYEE  a? 1CUSTREGION CUSTOME_ / CUSTNAMEX CUSTOMEIN* RDB$FOREIGN23 CUSTOMER RDB$PO-RDB$PRIMARY22 CUSTOMER  + PRODTYPEX PROJECT EX_$KRDB$FOREIGN13 PROJECT RDB$PIO)RDB$PRIMARY12 PROJECT 2  ' RDB$11 PROJECT IN&RDB$FOREIGN16 EMPLOYEE_PROJECT  RDB$PRIMARY12 ?% RDB$FOREIGN15 EMPLOYEE_PROJECT RDB$PT %RDB$PRIMARY14 EMPLOYEE_PROJECT EL(RDB$FOREIGN19 PROJ_DEPT_BUDGET  RDB$PRIMARY12 ?' RDB$FOREIGN18 PROJ_DEPT_BUDGET RDB$PT #RDB$PRIMARY17 PROJ_DEPT_BUDGET EL  ! CHANGEX SALARY_HISTORY UPDATERX SALARY_HISTORY `UU? ) RDB$FOREIGN21 SALARY_HISTORY RDB$PSTR RDB$PRIMARY20 SALARY_HISTORY QTYX SALES RD SALESTATX SALES `UU?N NEEDX SALES E?D+  RDB$FOREIGN25 SALES RDB$PRTIORDB$PRIMARY24 SALES ?RDB$INDEX_45 RDB$FILTERS RDB$INDEX_44 RDB$BACKUP_HISTORY p90('P 90 112d101236\4(1 4 4 1X 1$ 2 6 5 4L 4 7 8 7\ H J 4 7p 38 8 = =p F, B89|9@:895`2(5<8|7<>723h3(=RDB$OBJECT_TYPE  DEPENDENT_COUNT RDB$OBJECT_TYPE  INDEX RDB$OBJECT_TYPE  FIELD RDB$OBJECT_TYPE USER RDB$OBJECT_TYPE EXCEPTION RDB$OBJECT_TYPE EXPRESSION_INDEX RDB$OBJECT_TYPE PROCEDURE RDB$OBJECT_TYPE VALIDATION RDB$OBJECT_TYPE COMPUTED_FIELD RDB$OBJECT_TYPE TRIGGER RDB$OBJECT_TYPE VIEW RDB$OBJECT_TYPE RELATION RDB$TRIGGER_TYPE POST_ERASE RDB$TRIGGER_TYPE PRE_ERASE RDB$TRIGGER_TYPE POST_MODIFY RDB$TRIGGER_TYPE PRE_MODIFY RDB$TRIGGER_TYPE POST_STORE RDB$TRIGGER_TYPE PRE_STORE  RDB$MECHANISM BY_REFERENCE_WITH_NULL  RDB$MECHANISM BY_SCALAR_ARRAY_DESCRIPTOR  RDB$MECHANISM BY_ISC_DESCRIPTOR  RDB$MECHANISM BY_VMS_DESCRIPTOR  RDB$MECHANISM BY_REFERENCE  RDB$MECHANISM BY_VALUE RDB$FUNCTION_TYPE BOOLEAN RDB$FUNCTION_TYPE VALUE RDB$FIELD_SUB_TYPE EXTERNAL_FILE_DESCRIPTION RDB$FIELD_SUB_TYPE TRANSACTION_DESCRIPTION RDB$FIELD_SUB_TYPE FORMAT RDB$FIELD_SUB_TYPE SUMMARY RDB$FIELD_SUB_TYPE RANGES RDB$FIELD_SUB_TYPE ACL RDB$FIELD_SUB_TYPE BLR RDB$FIELD_SUB_TYPE TEXT RDB$FIELD_SUB_TYPE BINARY RDB$FIELD_TYPE INT64 RDB$FIELD_TYPE  TIME RDB$FIELD_TYPE  DATE RDB$FIELD_TYPE -BLOB_ID RDB$FIELD_TYPE (CSTRING RDB$FIELD_TYPE BLOB RDB$FIELD_TYPE %VARYING RDB$FIELD_TYPE #TIMESTAMP RDB$FIELD_TYPE DOUBLE RDB$FIELD_TYPE  FLOAT RDB$FIELD_TYPE  QUAD RDB$FIELD_TYPE LONG RDB$FIELD_TYPE SHORT RDB$FIELD_TYPE TEXT 90 /82\7(199p=0? 1 4 1T > D 8 8d ;( ; : <t ;4 @ < =| 9@ : > 9 >H 9 ;<;X<;<>`> =;9h>(>=;l?,>>RDB$CHARACTER_SET_NAME ISO8859_3 RDB$CHARACTER_SET_NAME ISO8859_3 RDB$CHARACTER_SET_NAME ISO-8859-2 RDB$CHARACTER_SET_NAME LATIN2 RDB$CHARACTER_SET_NAME ISO88592 RDB$CHARACTER_SET_NAME ISO8859_2 RDB$CHARACTER_SET_NAME ISO8859_2 RDB$CHARACTER_SET_NAME ANSI RDB$CHARACTER_SET_NAME LATIN1 RDB$CHARACTER_SET_NAME ISO88591 RDB$CHARACTER_SET_NAME ISO8859_1 RDB$CHARACTER_SET_NAME ISO8859_1 RDB$CHARACTER_SET_NAME DOS_865 RDB$CHARACTER_SET_NAME DOS865 RDB$CHARACTER_SET_NAME DOS_850 RDB$CHARACTER_SET_NAME DOS850 RDB$CHARACTER_SET_NAME DOS_437 RDB$CHARACTER_SET_NAME DOS437 RDB$CHARACTER_SET_NAME EUCJ RDB$CHARACTER_SET_NAME EUCJ_0208 RDB$CHARACTER_SET_NAME SJIS RDB$CHARACTER_SET_NAME SJIS_0208 RDB$CHARACTER_SET_NAME UTF-8 RDB$CHARACTER_SET_NAME UTF8 RDB$CHARACTER_SET_NAME SQL_TEXT RDB$CHARACTER_SET_NAME UTF_FSS RDB$CHARACTER_SET_NAME UNICODE_FSS RDB$CHARACTER_SET_NAME ASCII7 RDB$CHARACTER_SET_NAME USASCII RDB$CHARACTER_SET_NAME ASCII RDB$CHARACTER_SET_NAME BINARY RDB$CHARACTER_SET_NAME OCTETS RDB$CHARACTER_SET_NAME NONE RDB$SYSTEM_FLAG VIEW_CHECK RDB$SYSTEM_FLAG REFERENTIAL_CONSTRAINT RDB$SYSTEM_FLAG CHECK_CONSTRAINT RDB$SYSTEM_FLAG QLI RDB$SYSTEM_FLAG SYSTEM RDB$SYSTEM_FLAG USER RDB$TRANSACTION_STATE ROLLED_BACK RDB$TRANSACTION_STATE COMMITTED RDB$TRANSACTION_STATE LIMBO RDB$OBJECT_TYPE BLOB_FILTER RDB$OBJECT_TYPE UDF RDB$OBJECT_TYPE GENERATOR RDB$OBJECT_TYPE  ROLE RDB$OBJECT_TYPE USER_GROUP 90 .=;D?>>=H;? > >H = ? > >H = ? > >H = ? > >H = ? > >H = ;??L? >;@T;<;<d;(<;<t;8<9;RDB$CHARACTER_SET_NAME DOS737 RDB$CHARACTER_SET_NAME 2CYRL RDB$CHARACTER_SET_NAME DOS_863 RDB$CHARACTER_SET_NAME DOS863 RDB$CHARACTER_SET_NAME /DOS_861 RDB$CHARACTER_SET_NAME /DOS861 RDB$CHARACTER_SET_NAME DOS_860 RDB$CHARACTER_SET_NAME DOS860 RDB$CHARACTER_SET_NAME .DOS_857 RDB$CHARACTER_SET_NAME .DOS857 RDB$CHARACTER_SET_NAME -DOS_852 RDB$CHARACTER_SET_NAME -DOS852 RDB$CHARACTER_SET_NAME (ISO-8859-13 RDB$CHARACTER_SET_NAME (LATIN7 RDB$CHARACTER_SET_NAME (ISO885913 RDB$CHARACTER_SET_NAME (ISO8859_13 RDB$CHARACTER_SET_NAME (ISO8859_13 RDB$CHARACTER_SET_NAME 'ISO-8859-9 RDB$CHARACTER_SET_NAME 'LATIN5 RDB$CHARACTER_SET_NAME 'ISO88599 RDB$CHARACTER_SET_NAME 'ISO8859_9 RDB$CHARACTER_SET_NAME 'ISO8859_9 RDB$CHARACTER_SET_NAME &ISO-8859-8 RDB$CHARACTER_SET_NAME &ISO88598 RDB$CHARACTER_SET_NAME &ISO8859_8 RDB$CHARACTER_SET_NAME &ISO8859_8 RDB$CHARACTER_SET_NAME %ISO-8859-7 RDB$CHARACTER_SET_NAME %ISO88597 RDB$CHARACTER_SET_NAME %ISO8859_7 RDB$CHARACTER_SET_NAME %ISO8859_7 RDB$CHARACTER_SET_NAME $ISO-8859-6 RDB$CHARACTER_SET_NAME $ISO88596 RDB$CHARACTER_SET_NAME $ISO8859_6 RDB$CHARACTER_SET_NAME $ISO8859_6 RDB$CHARACTER_SET_NAME #ISO-8859-5 RDB$CHARACTER_SET_NAME #ISO88595 RDB$CHARACTER_SET_NAME #ISO8859_5 RDB$CHARACTER_SET_NAME #ISO8859_5 RDB$CHARACTER_SET_NAME "ISO-8859-4 RDB$CHARACTER_SET_NAME "LATIN4 RDB$CHARACTER_SET_NAME "ISO88594 RDB$CHARACTER_SET_NAME "ISO8859_4 RDB$CHARACTER_SET_NAME "ISO8859_4 RDB$CHARACTER_SET_NAME ISO-8859-3 RDB$CHARACTER_SET_NAME LATIN3 RDB$CHARACTER_SET_NAME ISO88593 90 -<;L<;<;\< ; < ;l <0 ; < <x =< < = < =D < = < =L 9 < = <T = <==\< <<:l90<<<|;@<<::P<RDB$CHARACTER_SET_NAME AWIN1258 RDB$CHARACTER_SET_NAME @KOI8U RDB$CHARACTER_SET_NAME ?KOI8R RDB$CHARACTER_SET_NAME 9WIN_936 RDB$CHARACTER_SET_NAME 9DOS_936 RDB$CHARACTER_SET_NAME 9GB2312 RDB$CHARACTER_SET_NAME 9GB_2312 RDB$CHARACTER_SET_NAME 8WIN_950 RDB$CHARACTER_SET_NAME 8DOS_950 RDB$CHARACTER_SET_NAME 8BIG5 RDB$CHARACTER_SET_NAME 8BIG_5 RDB$CHARACTER_SET_NAME ,WIN_949 RDB$CHARACTER_SET_NAME ,DOS_949 RDB$CHARACTER_SET_NAME ,KSC5601 RDB$CHARACTER_SET_NAME ,KSC_5601 RDB$CHARACTER_SET_NAME <WIN_1257 RDB$CHARACTER_SET_NAME <WIN1257 RDB$CHARACTER_SET_NAME ;WIN_1256 RDB$CHARACTER_SET_NAME ;WIN1256 RDB$CHARACTER_SET_NAME :WIN_1255 RDB$CHARACTER_SET_NAME :WIN1255 RDB$CHARACTER_SET_NAME NEXT RDB$CHARACTER_SET_NAME 7WIN_1254 RDB$CHARACTER_SET_NAME 7WIN1254 RDB$CHARACTER_SET_NAME 6WIN_1253 RDB$CHARACTER_SET_NAME 6WIN1253 RDB$CHARACTER_SET_NAME 5WIN_1252 RDB$CHARACTER_SET_NAME 5WIN1252 RDB$CHARACTER_SET_NAME 4WIN_1251 RDB$CHARACTER_SET_NAME 4WIN1251 RDB$CHARACTER_SET_NAME 3WIN_1250 RDB$CHARACTER_SET_NAME 3WIN1250 RDB$CHARACTER_SET_NAME 1DOS_869 RDB$CHARACTER_SET_NAME 1DOS869 RDB$CHARACTER_SET_NAME 0DOS_866 RDB$CHARACTER_SET_NAME 0DOS866 RDB$CHARACTER_SET_NAME DOS_864 RDB$CHARACTER_SET_NAME DOS864 RDB$CHARACTER_SET_NAME DOS_862 RDB$CHARACTER_SET_NAME DOS862 RDB$CHARACTER_SET_NAME DOS_858 RDB$CHARACTER_SET_NAME DOS858 RDB$CHARACTER_SET_NAME DOS_775 RDB$CHARACTER_SET_NAME DOS775 RDB$CHARACTER_SET_NAME DOS_737 900*/t-89 +55l/</ / 5 5d 5, 5 5 5 5L 5 5 7 /| /L / / / + /` /0 / / / /p /< 1 111l1@+ 111p3@- 1--x1 WIN1258 WIN1258 A KOI8U KOI8U @ KOI8R KOI8R ? GB_2312 GB_2312 9 BIG_5 BIG_5 8 KSC_5601 KSC_5601 , WIN1257 WIN1257 < WIN1256 WIN1256 ; WIN1255 WIN1255 :NEXT NEXT  WIN1254 WIN1254 7 WIN1253 WIN1253 6 WIN1252 WIN1252 5 WIN1251 WIN1251 4 WIN1250 WIN1250 3 DOS869 DOS869 1 DOS866 DOS866 0 DOS864 DOS864  DOS862 DOS862  DOS858 DOS858  DOS775 DOS775  DOS737 DOS737  CYRL CYRL 2 DOS863 DOS863  DOS861 DOS861 / DOS860 DOS860   DOS857 DOS857 . DOS852 DOS852 -ISO8859_13 ISO8859_13 ( ISO8859_9 ISO8859_9 ' ISO8859_8 ISO8859_8 & ISO8859_7 ISO8859_7 % ISO8859_6 ISO8859_6 $ ISO8859_5 ISO8859_5 # ISO8859_4 ISO8859_4 " ISO8859_3 ISO8859_3  ISO8859_2 ISO8859_2  ISO8859_1 ISO8859_1  DOS865 DOS865   DOS850 DOS850   DOS437 DOS437   EUCJ_0208 EUCJ_0208  SJIS_0208 SJIS_0208 UTF8 UTF8 UNICODE_FSS UNICODE_FSS  ASCII ASCII  OCTETS OCTETS NONE NONE 90? $#l)H" (&''$X)0(+ ( ( (d (< ( ( ( ' 'x $P (( ( ( ( ( (` (8 ( ' ' $ +p (H ( ' $ $ $ $l $H $$ $ $$$$p$L$($$*'$d&<&''''t' ISO8859_7 % ISO8859_6 $ ISO8859_5 # ISO8859_4 " ISO8859_3  ISO_PLK  ISO_HUN  CS_CZ  ISO8859_2 ES_ES_CI_AI  PT_BR  PT_PT  EN_US  EN_UK   SV_SV   ES_ES   NO_NO   IT_IT  IS_IS  DE_DE  FR_CA  FR_FR  FI_FI  DU_NL  DA_DA  ISO8859_1  DB_NOR865   DB_DAN865  PDOX_NORDAN4   DOS865   DB_US850   DB_UK850   DB_SVE850   DB_PTB850   DB_NLD850   DB_ITA850   DB_FRA850   DB_ESP850   DB_DEU850   DB_FRC850   DOS850   DB_US437   DB_UK437   DB_SVE437   DB_NLD437   DB_ITA437   DB_FRA437   DB_FIN437   DB_ESP437   DB_DEU437  PDOX_SWEDFIN   PDOX_INTL  PDOX_ASCII   DOS437   EUCJ_0208  SJIS_0208  UNICODE  UCS_BASIC UTF8 UNICODE_FSS  ASCII  OCTETS NONE 90>''(d$@$%%%'x'P'('$ % $ (l $D ' $ ( " % (` $< $ $ $ $ $ $` %8 & ( & ' &t $L % + % ' )| %T '( **'*'X%0(%'"%l&D&&&%%|% WIN1257 < WIN1256 ; WIN1255 : NXT_ESP  NXT_ITA  NXT_FRA  NXT_DEU  NXT_US NEXT  PXW_TURK 7 WIN1254 7 PXW_GREEK 6 WIN1253 6 WIN_PTBR 5PXW_SWEDFIN 5 PXW_SPAN 5PXW_NORDAN4 5PXW_INTL850 5 PXW_INTL 5 WIN1252 5WIN1251_UA 4 PXW_CYRL 4 WIN1251 4WIN_CZ_CI_AI 3 WIN_CZ 3 BS_BA 3 PXW_HUN 3 PXW_SLOV 3 PXW_PLK 3 PXW_HUNDC 3 PXW_CSY 3 WIN1250 3 DOS869 1 DOS866 0 DOS864  DOS862  DOS858  DOS775  DOS737   PDOX_CYRL 2 DB_RUS 2CYRL 2 DB_FRC863  DOS863  PDOX_ISL / DOS861 / DB_PTG860   DOS860   DB_TRK . DOS857 . PDOX_SLO - PDOX_HUN - PDOX_PLK - PDOX_CSY - DB_SLO - DB_PLK - DB_CSY - DOS852 - LT_LT (ISO8859_13 ( ISO8859_9 ' ISO8859_8 &90))|)T&$-#%#'h#@'% I =`TEST_COLLATE ~3WIN_CZ +++DISABLE-COMPRESSIONS=0;DISABLE-EXPANSIONS=0 WIN1258 A KOI8U_UA @ KOI8U @ KOI8R_RU ? KOI8R ? GB_2312 9 BIG_5 8KSC_DICTIONARY , KSC_5601 ,WIN1257_LV <WIN1257_LT <WIN1257_EE <90-&|*L/ */64P2 / 1 / 3T 1$ 0 3 # $ CUST_NO_GEN   EMP_NO_GEN  RDB$BACKUP_HISTORY  Nbackup technologyRDB$TRIGGER_NAME  Implicit trigger nameRDB$INDEX_NAME  Implicit index nameRDB$FIELD_NAME Implicit domain nameRDB$CONSTRAINT_NAME Implicit constraint nameRDB$EXCEPTIONS   Exception IDRDB$PROCEDURES   Procedure ID SQL$DEFAULT RDB$SECURITY_CLASS  90  E90 "Ed-In \I <B</RDB$SYSTEM_FLAGLRDB$TRIGGER_2 RDB$TRIGGERS  /RDB$SYSTEM_FLAGLRDB$TRIGGER_9 RDB$USER_PRIVILEGES  P P P /RDB$OBJECT_TYPE;>>:0RDB$OWNER_NAMERDB$OWNER_NAME0RDB$OWNER_NAMEg,LRDB$TRIGGER_4 RDB$RELATIONS  ***=RDB$OWNER_NAMEg,RDB$OWNER_NAMELRDB$TRIGGER_3 RDB$TRIGGERS  90  MX i J, Jt i0 CbCpDXDTKRDB$TRIGGER_23 RDB$RELATION_FIELDS  CJ RDB$INDICESJRDB$RELATION_CONSTRAINTSJRDB$INDEX_SEGMENTSG:/RDB$RELATION_NAMERDB$RELATION_NAME:/RDB$INDEX_NAMERDB$INDEX_NAME:/RDB$INDEX_NAMERDB$INDEX_NAME/RDB$FIELD_NAMERDB$FIELD_NAME>>:0RDB$OWNER_NAMERDB$OWNER_NAME0RDB$OWNER_NAMEg,LRDB$TRIGGER_28 RDB$PROCEDURES  WWW=RDB$OWNER_NAMEg,RDB$OWNER_NAMEeRDB$PROCEDURESRDB$PROCEDURE_IDLRDB$TRIGGER_27 RDB$RELATION_FIELDS  CJRDB$CHECK_CONSTRAINTSJRDB$RELATION_CONSTRAINTSG:/RDB$FIELD_NAMERDB$TRIGGER_NAME:/RDB$CONSTRAINT_NAMERDB$CONSTRAINT_NAME:/RDB$RELATION_NAMERDB$RELATION_NAME/RDB$CONSTRAINT_TYPENOT NULLLRDB$TRIGGER_24 RDB$RELATION_FIELDS  [[[6'h6<*t1* +1@&t 1+H + -# +1 +1` ++4 *1 ++ 3T1 ++t 3P#H +(+ 1 + + ,h (< , , % , %X ,0 % , %SQL$T  SYSDBA- SQL$DEFAULT2  &SQ$64_PDEPR" *(20.,<:8SYSDBA-SQL$T2  SYSDBA- SQL$DEFAULT15  SYSDBA-SQL$AR  SYSDBA- SQL$DEFAULT14  0SYSDBA-SQL$T4  /SYSDBA- SQL$DEFAULT13  $SYSDBA- SQL$DEFAULT22  BASYSDBASQL$T  SYSDBASQ SQL$DEFAULT21  SYSDBAAULSQL$T  SYSYSDBAES SQL$DEFAULT20  SYSDBA$DESQL$T  SYSDBA$CUT SQL$DEFAULT19  DBASYSDBATSQL$T  SYSYSDBAT SQL$DEFAULT18   SYSYSDBASYSDBA-SQL$T2  - SQL$DEFAULT15  -SQL$AR  - SQL$DEFAULT14  0-SQL$T4  /- SQL$DEFAULT13  $-SQL$T3  #- SQL$DEFAULT12  "- SQL$DEFAULT11  &- SQL$SALES  %- SQL$DEFAULT10  2- SQL$CUSTOMER  1- SQL$DEFAULT9  (-SQL$SALARY_HISTORY  '- SQL$DEFAULT8  *-SQL$PROJ_DEPT_BUDGET  )- SQL$DEFAULT7  ,-SQL$EMPLOYEE_PROJECT  +- SQL$DEFAULT6  .- SQL$PROJECT  -- SQL$DEFAULT5  8- SQL$EMPLOYEE  7- SQL$DEFAULT4  -SQL$DEPARTMENT  :- SQL$DEFAULT3  -SQL$JOB  SQL$T  - SQL$DEFAULT2  SYSDBA- SQL$COUNTRY  -SQL$T  ! SQL$DEFAULT1  SYSDBA SQL$RDB$ROLES  SYSDBA90ᄏ90;%; ;h7<9''xLL+$'L 0 .PO= ) ) ,h -< ) ) ) %| ?8 C 6 * -| &P *( & * & N, U6**p*D***&&t&H* &+&6X: 7&*&x*L* + pDEPTNO  pPROJNO  pCUSTNO  pJOBCODE % pJOBGRADE  0pSALARY   < 0pBUDGET   < 0p{PRODTYPE  % < pPONUMBER  pRDB$37   pRDB$36  pRDB$35  pRDB$34  pRDB$33  pRDB$32  pRDB$31 # SHIP_DATE ORDER_DATEL(ship_date - order_date) pRDB$30   pRDB$29   pRDB$28  pRDB$27  pRDB$26 # pRDB$25 # pRDB$24 # pRDB$23 % pRDB$22  pRDB$21  %  pRDB$20 % pRDB$19 % pRDB$18 % pRDB$17 777" OLD_SALARY%$ OLD_SALARYPERCENT_CHANGEdL000(old_salary + old_salary * percent_change / 100) pRDB$16  pRDB$15 % pRDB$14 # pRDB$13  pRDB$12  pRDB$11   pRDB$10 % pRDB$9 %%%%%'' LAST_NAME,  FIRST_NAMEL!!!(last_name || ', ' || first_name) pRDB$8 # pRDB$7 % pRDB$6 % pRDB$5 % pRDB$4 % pRDB$3  pRDB$2 % pRDB$1  %  pPONUMBER  '0' AND VALUE <= '999') OR VALUE IS NULL)  /gLCHECK (VALUE = UPPER (VALUE))1LCHECK (VALUE > 1000)199999LCHECK (VALUE > '99999')8LCHECK (VALUE BETWEEN 0 AND 6)1LCHECK (VALUE > 0):1'4L***CHECK (VALUE > 10000 AND VALUE <= 2000000)III999/software/hardware/other/N/AL999CHECK (VALUE IN ('software', 'hardware', 'other', 'N/A'))7VLCHECK (VALUE STARTING WITH 'V') pRDB$661  pRDB$660   pRDB$659  pRDB$658  pRDB$657   pRDB$656   pRDB$655   pRDB$654 # pRDB$653  pRDB$652 % pRDB$651  pRDB$650  pRDB$135  pRDB$134  pRDB$133 90#$%h%D$%$(!(\%4% % % % %l %D % %RDB$661 RDB$660 RDB$659 RDB$658 RDB$657 RDB$656 RDB$655 RDB$654 RDB$653 RDB$652 RDB$652 RDB$651 RDB$651 RDB$651 RDB$6 RDB$665 RDB$664 RDB$13 RDB$4 90 :p:::t:SYSDBA  SYSDBA   SYSDBA  SYSDBA  SYSDBA  p90dcK] RDB$FIELD_SUB_TYPERDB$Fs MISSING_,RDB$EXPRESSION_SOURCERDB$INDICES 'TERNAL_DESCRIPTIONRDB$RELATIONS FILERDB$RELATIONSLENGTHRDB$FIELDSSCALERDB$FIELDSTYPERDB$FIELDSFIELD_IDRDB$RELATIONS _FIELDS LENGTHRDB$FIELDS UNCTION_ARGUMENTS NAMERDB$DEPENDENCIESFIELDS _DIMENSIONSINDEX_SEGMENTSRELATION_FIELDSTYPES USER_PRIVILEGES #POSITIONRDB$INDEX_SEGMENTSRELATION_FIELDSRECISIONRDB$FIELDS UNCTION_ARGUMENTS SCALERDB$FIELDS UNCTION_ARGUMENTS &$OURCERDB$PROCEDURE_PARAMETERSRELATION_FIELDSUB_TYPERDB$FIELDS  UNCTION_ARGUMENTS TYPERDB$FIELDS UNCTION_ARGUMENTSLE_FLAGSRDB$FILES% LOG_FILES LENGTHRDB$FILES% LOG_FILES 4 NAMERDB$BACKUP_HISTORYFILES% LOG_FILES% PARTITIONSRDB$LOG_FILES% _OFFSETRDB$LOG_FILES SEQUENCERDB$FILES% LOG_FILES TARTRDB$FILESLAGSRDB$RELATIONS TRIGGERSOREIGN_KEYRDB$INDICES MATRDB$FORMATS RELATIONS, _OF_USERDB$CHARACTER_SETS-)UNCTION_NAMERDB$CHARACTER_SETS - OLLATIONSFILTERS UNCTIONS) _ARGUMENTSTYPERDB$FUNCTIONS GENERATOR_IDRDB$GENERATORSNAMERDB$GENERATORS  RANTORRDB$USER_PRIVILEGES  _OPTIONRDB$USER_PRIVILEGES-UIDRDB$BACKUP_HISTORYINDEX_IDRDB$INDICESNACTIVERDB$INDICES NAMERDB$INDEX_SEGMENTSICES%RELATION_CONSTRAINTS TYPERDB$INDICES %4ITIALLY_DEFERREDRDB$RELATION_CONSTRAINTSPUT_SUB_TYPERDB$FILTERS'LOWER_BOUNDRDB$FIELD_DIMENSIONS%&MATCH_OPTIONRDB$REF_CONSTRAINTS )ECHANISMRDB$FUNCTION_ARGUMENTS-SSAGERDB$EXCEPTIONSTRIGGER_MESSAGES$_NUMBERRDB$TRIGGER_MESSAGESISSING_SOURCERDB$FIELDSVALUERDB$FIELDSODULE_NAMERDB$FILTERS UNCTIONSNULL_FLAGRDB$FIELDSPRELATION_FIELDS90:6 PHONE_LIST EMPLOYEE EMPLOYEE  PHONE_LIST DEPARTMENT DEPARTMENT 902OlB(D:F`B(8 7 9| 7L / 7 : 7d 9( < > ?d B( < A IL L L Ih I I@'',`J)+(]JAd1$><)+S>,''<QBL'$' C_WIN1250 T4 SHIP_DATE SALES RDB$25 DATE_NEEDED SALES RDB$26 PTAGED SALES RDB$31  PR EMP_NO SALARY_HISTORY EMPNO UPDATER_ID SALARY_HISTORY RDB$15 CHANGE_DATE SALARY_HISTORY RDB$14 PROLD_SALARY SALARY_HISTORY SALARY TOTAL_VALUE SALES RDB$29   DISCOUNT SALES RDB$30  DB$ PO_NUMBER SALES PONUMBER JNORDER_DATE SALES RDB$24   DEFAULT 1  LTOTAL_VALUE SALES RDB$29   DISCOUNT SALES RDB$30    DEFAULT 0  L PO_NUMBER SALES PONUMBER   DEFAULT 'NOW'  NOWL SHIP_DATE SALES RDB$25 DATE_NEEDED SALES RDB$26 PTAGED SALES RDB$31  PR EMP_NO SALARY_HISTORY EMPNO UPDATER_ID SALARY_HISTORY RDB$15 CHANGE_DATE SALARY_HISTORY RDB$14 PR  DEFAULT 'NOW'  NOWLOLD_SALARY SALARY_HISTORY SALARY PERCENT_CHANGE SALARY_HISTORY RDB$16   DEFAULT 0  LNEW_SALARY SALARY_HISTORY RDB$17  PROJ_ID PROJ_DEPT_BUDGET PROJNO RD DEPT_NO PROJ_DEPT_BUDGET DEPTNO FISCAL_YEAR PROJ_DEPT_BUDGET RDB$12 QUART_HEAD_CNT PROJ_DEPT_BUDGET RDB$13 PROJECTED_BUDGET PROJ_DEPT_BUDGET BUDGET  PROJ_ID EMPLOYEE_PROJECT PROJNO  EMP_NO EMPLOYEE_PROJECT EMPNO   PROJ_ID PROJECT PROJNO  PROJ_NAME PROJECT RDB$10 TEAM_LEADER PROJECT EMPNO  PRODUCT PROJECT PRODTYPE  PROJ_DESC PROJECT RDB$11  C_OCTETS T4 RDB$540  C_NONE T4 RDB$542 E C_WIN1250 T4 RDB$544  V_UTF8 T4 RDB$547 C1 T4 RDB$539  C_UTF8 T4 RDB$546  V_OCTETS T4 RDB$541  V_NONE T4 RDB$543  V_WIN1250 T4 RDB$545  CUSTOMER CUSTOMER RDB$18  CONTACT_FIRST CUSTOMER FIRSTNAME  CITY CUSTOMER RDB$19  STATE_PROVINCE CUSTOMER RDB$20  COUNTRY CUSTOMER COUNTRYNAME   ON_HOLD CUSTOMER RDB$22  90j8YSS,SQ&T \ N ^\T SQL$T SYSDBA ^T SYSDBA  2 CURRENCY ;=LCOUNTRY ;=L TR_MULTIAR SQL$AR SYSDBA SQL$DEFAULT15 DPHONE_LIST SQL$PHONE_LIST SYSDBA SQL$DEFAULT17  4EMP_NO ;=LPROJ_ID /gL ;=LSQDEF C4C2C5C1C3 gC13C11C10C9C8C3C16C15C14 C12 C7 C6 C5 C2C1C4C1 C4C2C5C1C3LLADDRESS_LINE2ADDRESS_LINE1CUST_NO1L ;=L POSTAL_CODE PHONE_NO CONTACT_LASTON_HOLD-LCOUNTRYSTATE_PROVINCE CITY CONTACT_FIRST CUSTOMER ;=L SET_CUST_NO CHECK_10 CHECK_98 NEW_SALARY8" OLD_SALARY%$ OLD_SALARYPERCENT_CHANGEdLPERCENT_CHANGE L ;=T SQL$T SYSDBA SQL$DEFAULT22 TT SQL$T SYSDBA =_7LAC1\T SQL$T SYSDBA \T SQL$T SYSDBA L^T SYSDBA MLOT SQL$T SYSDBA SQL$DEFAULT21  TT SQL$T SYSDBA 99==C1\T SQL$T SYSDBA V\T SQL$T SYSDBA  ^T SYSDBA T SQL$T SYSDBA SQL$DEFAULT20 TT SQL$T SYSDBA LT_C1 \T SQL$T SYSDBA _Y\T SQL$T SYSDBA 1^T SYSDBA TT SQL$T SYSDBA SQL$DEFAULT19 MP_TTT SQL$T SYSDBA  SLAC1T\T SQL$T SYSDBA OWT\T SQL$T SYSDBA T^T SYSDBA NATT SQL$T SYSDBA SQL$DEFAULT18 TT SQL$T SYSDBA =DEP/C100\T SQL$T SYSDBA NA 4EMP_NO ;=LPROJ_ID /gL ;=LSQDEF C4C2C5C1C3 2 CURRENCY ;=LCOUNTRY ;=L TR_MULTIC1-T SQL$T SYSDBA SQL$DEFAULT12 SQL-AR SQL$AR SYSDBA SQL$DEFAULT15 D-T2 SQL$T2 SYSDBA SQL$DEFAULT16 -T3 SQL$T3 SYSDBA SQL$DEFAULT13 -  SALES SQL$SALES SYSDBA SQL$DEFAULT11 -SALARY_HISTORY SQL$SALARY_HISTORY SYSDBA SQL$DEFAULT9 90 1Tl>,>;')PI$) + Ul 18 3 3 / 3@ 2 4 4 3p 3< 3 4 4 4l 48 3 3 3 3l /8 3 243h343344d4033/3d303+C1 T RDB$68 C1 T RDB$68 27C1 T RDB$67  C1 T RDB$67 134TC1 T RDB$66 TC1 T RDB$66 481TC1 T RDB$65 C1 T RDB$65 28/C3 AR RDB$652 C4 AR RDB$653  C9 AR RDB$658  C1 AR RDB$650  C2 AR RDB$651  C6 AR RDB$655  C11 AR RDB$660  C13 AR RDB$664  C14 AR RDB$665  C15 AR RDB$6 C5 AR RDB$654 C7 AR RDB$656  C8 AR RDB$657 C10 AR RDB$659  C12 AR RDB$661  TYC4 T2 RDB$124 C1 T RDB$69 C1 T RDB$69 22C3 AR RDB$652 C4 AR RDB$653  C9 AR RDB$658  C1 AR RDB$650  C2 AR RDB$651  C6 AR RDB$655  C11 AR RDB$660  C13 AR RDB$664  C14 AR RDB$665  C15 AR RDB$6 C5 AR RDB$654 C7 AR RDB$656  C8 AR RDB$657 C10 AR RDB$659  C12 AR RDB$661  TYC4 T2 RDB$124 EC1 T2 RDB$121 C2 T2 RDB$122  C5 T2 RDB$125  C6 T2 RDB$126  C7 T2 RDB$127  C12 T2 RDB$132   C14 T2 RDB$134  C15 T2 RDB$135 C16 T2 RDB$481 C3 T2 RDB$123 C8 T2 RDB$128 C9 T2 RDB$129 C10 T2 RDB$130  C11 T2 RDB$131  C13 T2 RDB$133  C1 T RDB$68 C3 T3 RDB$484 C1 T3 RDB$482 C5 T3 RDB$491 C2 T3 RDB$483 C4 T3 RDB$485 ORDER_STATUS SALES RDB$23  no  DEFAULT 'new'  newLPAID SALES RDB$27  kl  DEFAULT 'n'  nL SALES_REP SALES EMPNO   ITEM_TYPE SALES PRODTYPE    CUST_NO SALES CUSTNO QTY_ORDERED SALES RDB$28 90 D|S U, gT X[0H[@-GET_EMP_PROJ SQL$GET_EMP_PROJ SYSDBA -ADD_EMP_PROJ SQL$ADD_EMP_PROJ SYSDBA -SUB_TOT_BUDGET SQL$SUB_TOT_BUDGET SYSDBA -DELETE_EMPLOYEE   SQL$DELETE_EMPLOYEE SYSDBA  ----CJ DEPARTMENTG/DEPT_NO)BUDGETCOCJ DEPARTMENTG/ HEAD_DEPT)NM]BUDGET/)CJ DEPARTMENTG/ HEAD_DEPT)DEPT_NOx DEPT_BUDGET"))LDELETE_EMPLOYEE   SQL$DELETE_EMPLOYEE SYSDBA DECLARE VARIABLE any_sales INTEGER; BEGIN any_sales = 0; /* * If there are any sales records referencing this employee, * can't delete the employee until the sales are re-assigned * to another employee or changed to NULL. */ SELECT count(po_number) FROM sales WHERE sales_rep = :emp_num INTO :any_sales; IF (any_sales > 0) THEN BEGIN EXCEPTION reassign_sales; SUSPEND; END /* * If the employee is a manager, update the department. */ UPDATE department SET mngr_no = NULL WHERE mngr_no = :emp_num; /* * If the employee is a project leader, update project. */ UPDATE project SET team_leader = NULL WHERE team_leader = :emp_num; /* * Delete the employee from any projects. */ DELETE FROM employee_project WHERE emp_no = :emp_num; /* * Delete old salary records. */ DELETE FROM salary_history WHERE emp_no = :emp_num; /* * Delete the employee. */ DELETE FROM employee WHERE emp_no = :emp_num; SUSPEND; END -COCJSALESG/ SALES_REP)NM] PO_NUMBER1REASSIGN_SALESCJ DEPARTMENTG/MNGR_NO) -MNGR_NOCJPROJECTG/ TEAM_LEADER) - TEAM_LEADERCJEMPLOYEE_PROJECTG/EMP_NO)CJSALARY_HISTORYG/EMP_NO)CJEMPLOYEEG/EMP_NO)LSUB_TOT_BUDGET SQL$SUB_TOT_BUDGET SYSDBA BEGIN SELECT SUM(budget), AVG(budget), MIN(budget), MAX(budget) FROM department WHERE head_dept = :head_dept INTO :tot_budget, :avg_budget, :min_budget, :max_budget; SUSPEND; ENDIII  ----COCJ DEPARTMENTG/ HEAD_DEPT)NMTBUDGETUBUDGETWBUDGETVBUDGET))))))))LADD_EMP_PROJ SQL$ADD_EMP_PROJ SYSDBA BEGIN BEGIN INSERT INTO employee_project (emp_no, proj_id) VALUES (:emp_no, :proj_id); WHEN SQLCODE -530 DO EXCEPTION unknown_emp_id; END SUSPEND; END JEMPLOYEE_PROJECT)EMP_NO)PROJ_IDUNKNOWN_EMP_IDLGET_EMP_PROJ SQL$GET_EMP_PROJ SYSDBA mmmBEGIN FOR SELECT proj_id FROM employee_project WHERE emp_no = :emp_no INTO :proj_id DO SUSPEND; END -CJEMPLOYEE_PROJECTG/EMP_NO)PROJ_ID))L90!69T69;>\>> > :l 28 4 8 9 8X 4 6 5 5x 5@ 5 5 5 5d 40 2 5 3 9T 3 463LANG ALL_LANGS RDB$64 COUNTRY ALL_LANGS RDB$63 GRADE ALL_LANGS RDB$62 CODE ALL_LANGS RDB$61  LANGUAGES SHOW_LANGS RDB$60 CTY SHOW_LANGS RDB$59 GRADE SHOW_LANGS RDB$58 CODE SHOW_LANGS RDB$57 PO_NUM SHIP_ORDER RDB$56 LINE6 MAIL_LABEL RDB$55 LINE5 MAIL_LABEL RDB$54 LINE4 MAIL_LABEL RDB$53 LINE3 MAIL_LABEL RDB$52 LINE2 MAIL_LABEL RDB$51 LINE1 MAIL_LABEL RDB$50 CUST_NO MAIL_LABEL RDB$49 EMP_CNT ORG_CHART RDB$48 TITLE ORG_CHART RDB$47  MNGR_NAME ORG_CHART RDB$46  DEPARTMENT ORG_CHART RDB$45  HEAD_DEPT ORG_CHART RDB$44 TOT DEPT_BUDGET RDB$43 DNO DEPT_BUDGET RDB$42 EMP_NUM DELETE_EMPLOYEE RDB$41  MAX_BUDGET SUB_TOT_BUDGET RDB$40  MIN_BUDGET SUB_TOT_BUDGET RDB$39  AVG_BUDGET SUB_TOT_BUDGET RDB$38  TOT_BUDGET SUB_TOT_BUDGET RDB$37  HEAD_DEPT SUB_TOT_BUDGET RDB$36 PROJ_ID ADD_EMP_PROJ RDB$35 EMP_NO ADD_EMP_PROJ RDB$34 PROJ_ID GET_EMP_PROJ RDB$33 EMP_NO GET_EMP_PROJ RDB$32 90UL ]gQ-DEPT_BUDGET  SQL$DEPT_BUDGET SYSDBA - ORG_CHART  SQL$ORG_CHART SYSDBA {{{ (((((( (-(-(-(-(-(-&-&-&- &-  &-  &-  &-  &- & --CJCUSTOMERG/CUST_NO)CUSTOMER CONTACT_FIRST CONTACT_LAST ADDRESS_LINE1  ADDRESS_LINE2 CITY STATE_PROVINCE COUNTRY  POSTAL_CODE;=;='' ;=  ;=  / USA;= '''' ,   ''  ;= '' ,   ''  ))))) )  ))))) )  L ORG_CHART  SQL$ORG_CHART SYSDBA GDECLARE VARIABLE mngr_no INTEGER; DECLARE VARIABLE dno CHAR(3); BEGIN FOR SELECT h.department, d.department, d.mngr_no, d.dept_no FROM department d LEFT OUTER JOIN department h ON d.head_dept = h.dept_no ORDER BY d.dept_no INTO :head_dept, :department, :mngr_no, :dno DO BEGIN IF (:mngr_no IS NULL) THEN BEGIN mngr_name = '--TBH--'; title = ''; END ELSE SELECT full_name, job_code FROM employee WHERE emp_no = :mngr_no INTO :mngr_name, :title; SELECT COUNT(emp_no) FROGM employee WHERE dept_no = :dno INTO :emp_cnt; SUSPEND; END END??? -------Cw DEPARTMENTD DEPARTMENTHPG/ HEAD_DEPTDEPT_NOFHDEPT_NO DEPARTMENT DEPARTMENTMNGR_NODEPT_NO=--TBH--CJEMPLOYEEG/EMP_NO FULL_NAMEJOB_CODECOCJEMPLOYEEG/DEPT_NONM]EMP_NO)))))  )))))  LDEPT_BUDGET  SQL$DEPT_BUDGET SYSDBA DECLARE VARIABLE sumb DECIMAL(12, 2); DECLARE VARIABLE rdno CHAR(3); DECLARE VARIABLE cnt INTEGER; BEGIN tot = 0; SELECT budget FROM department WHERE dept_no = :dno INTO :tot; SELECT count(budget) FROM department WHERE head_dept = :dno INTO :cnt; IF (cnt = 0) THEN SUSPEND; FOR SELECT dept_no FROM department WHERE head_dept = :dno INTO :rdno DO BEGIN EXECUTE PROCEDURE dept_budget :rdno RETURNING_VALUES :sumb; tot = tot + sumb; END SUSPEND; END90 =SDy(QZ-MAIL_LABEL SQL$MAIL_LABEL SYSDBA -SHIP_ORDER SQL$SHIP_ORDER SYSDBA <<<&&& &-- 4CJJOBG:::/JOB_CODE)/ JOB_GRADE)/ JOB_COUNTRY);= LANGUAGE_REQk LANGUAGE_REQ/ NULL"))LSHIP_ORDER SQL$SHIP_ORDER SYSDBA WDECLARE VARIABLE ord_stat CHAR(7); DECLARE VARIABLE hold_stat CHAR(1); DECLARE VARIABLE cust_no INTEGER; DECLARE VARIABLE any_po CHAR(8); BEGIN SELECT s.order_status, c.on_hold, c.cust_no FROM sales s, customer c WHERE po_number = :po_num AND s.cust_no = c.cust_no INTO :ord_stat, :hold_stat, :cust_no; /* This purchase order has been already shipped. */ IF (ord_stat = 'shipped') THEN BEGIN EXCEPTION order_already_shipped; SUSPEND; END /* Customer is on hold. */ ELSE IF (hold_stat = '*') THEN BEGIN EXCEPTION customer_on_hold; SUSPEND; END /* * If there is an unpaid balance on orders shipped over 2 months ago, * put the customer on hold. */ FOR SELECT po_number FROM sales WHERE cust_no = :cust_no AND order_status = 'shipped' AND paid = 'n' AND ship_date < CAST('NOW' AS TIMESTAMP) - 60 INTO :any_po DO BEGIN EXCEPTION customer_check; UPDATE customer SET on_hold = '*' WHERE cust_no = :cust_no; SUSPEND; END /* * Ship the order. */ UPDATE sales SETW order_status = 'shipped', ship_date = 'NOW' WHERE po_number = :po_num; SUSPEND; END ----CSALESSCUSTOMERCG:/ PO_NUMBER)/CUST_NOCUST_NO ORDER_STATUSON_HOLDCUST_NO/shippedORDER_ALREADY_SHIPPED/*CUSTOMER_ON_HOLDCJSALESG:::/CUST_NO/ ORDER_STATUSshipped/PAIDn3 SHIP_DATE##NOW< PO_NUMBERCUSTOMER_CHECKCJCUSTOMERG/CUST_NO *ON_HOLDCJSALESG/ PO_NUMBER) shipped ORDER_STATUSNOW SHIP_DATELMAIL_LABEL SQL$MAIL_LABEL SYSDBA DECLARE VARIABLE customer VARCHAR(25); DECLARE VARIABLE first_name VARCHAR(15); DECLARE VARIABLE last_name VARCHAR(20); DECLARE VARIABLE addr1 VARCHAR(30); DECLARE VARIABLE addr2 VARCHAR(30); DECLARE VARIABLE city VARCHAR(25); DECLARE VARIABLE state VARCHAR(15); DECLARE VARIABLE country VARCHAR(15); DECLARE VARIABLE postcode VARCHAR(12); DECLARE VARIABLE cnt INTEGER; BEGIN line1 = ''; line2 = ''; line3 = ''; line4 = ''; line5 = ''; line6 = ''; SELECT customer, contact_first, contact_last, address_line1, address_line2, city, state_province, country, postal_code FROM CUSTOMER WHERE cust_no = :cust_no INTO :customer, :first_name, :last_name, :addr1, :addr2, :city, :state, :country, :postcode; IF (customer IS NOT NULL) THEN line1 = customer; IF (first_name IS NOT NULL) THEN line2 = first_name || ' ' || last_name; ELSE line2 = last_name; IF (addr1 IS NOT NULL) THEN line3 = addr1; IF (addr2 IS NOT NULL) THEN line4 = addr2; IF (country = 'USA') THEN BEGIN IF (city IS NOT NULL) THEN line5 = city || ', ' || state || ' ' || postcode; ELSE line5 = state || ' ' || postcode; END ELSE BEGIN IF (city IS NOT NULL) THEN line5 = city || ', ' || state; ELSE line5 = state; line6 = country || ' ' || postcode; END SUSPEND; END90XH S t  Q-SHOW_LANGS  SQL$SHOW_LANGS SYSDBA - ALL_LANGS  SQL$ALL_LANGS SYSDBA  ALL_LANGS  SQL$ALL_LANGS SYSDBA BEGIN FOR SELECT job_code, job_grade, job_country FROM job INTO :code, :grade, :country DO BEGIN FOR SELECT languages FROM show_langs (:code, :grade, :country) INTO :lang DO SUSPEND; /* Put nice separators between rows */ code = '====='; grade = '====='; country = '==============='; lang = '=============='; SUSPEND; END END &&&&&-&-&-&-CJJOBJOB_CODE JOB_GRADE JOB_COUNTRYC| SHOW_LANGS LANGUAGES))))=======================================))))))))LSHOW_LANGS  SQL$SHOW_LANGS SYSDBA DECLARE VARIABLE i INTEGER; BEGIN i = 1; WHILE (i <= 5) DO BEGIN SELECT language_req[:i] FROM joB WHERE ((job_code = :code) AND (job_grade = :grade) AND (job_country = :cty) AND (language_req IS NOT NULL)) INTO :languages; IF (languages = ' ') THEN /* Prints 'NULL' instead of blanks */ languages = 'NULL'; i = i +1; SUSPEND; END END90`,s[xUZCUSTOMER_CHECK " Overdue balance -- can not ship.CUSTOMER_ON_HOLD This customer is on hold.ORDER_ALREADY_SHIPPED Order status is "shipped."REASSIGN_SALES ;9Reassign the sales records before deleting this employee.UNKNOWN_EMP_ID (&Invalid employee number or project id.9090%I=%I=9090 !=*=ى=%I>%I>%I>ى=%I>*=%I=1 C=!=9090 1 C=1 C=%I=>9c=9c=>%I=1 C=1 C=9090 1 <1 <6W=&=ى=9c=&= 6W=< 1 <1 <9090 ===.=.=.= = ==90tX< x\@      90 909090 *>*>*>*>*>>*>*>*>9090%I=.:= L>L>.:=.:=%I=9090*= 9= L>L>9=>9=*=9090 /<>> ><><>>></</<9090 ><.:=*>.:==> >= >.:= > *>.:=><90 9090908( $̊؎ύ ěščřž ><ěščřžýáíéúůďťňóĚŠČŘŽÝÁÍÉÚŮĎŤŇÓ90M9090 9090 "6,~ rx  X 8  Z  6d  Z  f`  ( Z `f@*               HHH 68J (08@HPX `hpx  (08 @ D HLP T `df  <<<(8 @*D ( , 0 48FH JHHH   6<<<  <<< 6 lll 3 $ Dd xz|3  $ DHVl 6'8JQTTTT&(9<W``` (0L^ 90+ HT3 SQL$T3 SYSDBA SQL$DEFAULT13 T SQL$T SYSDBA SQL$DEFAULT12 T2 SQL$T2 SYSDBA SQL$DEFAULT16  gC13C11C10C9C8C3C16C15C14 C12 C7 C6 C5 C2C1C4Y:C12 ) ( C10 ) (C8 ) (C7 ) (C5 ) (C15 ) (C14 ) (C13 ) (C11 ) (  C6 ) ( C2 Y X H:G;3G\ C1 C9 ) ( C4 ) (C3 A @ H:G;-SYSDBA SQL$DEFAULT17   PHONE_NO PHONE_NO PHONE_EXT PHONE_EXT LAST_NAME LAST_NAMEEMP_NOEMP_NO LOCATION LOCATION FIRST_NAME FIRST_NAMEJ?kAGED# SHIP_DATE ORDER_DATEL DATE_NEEDED SHIP_DATE ORDER_DATE NOWL ;=L PO_NUMBER7VL ;=L DISCOUNT L ;=L TOTAL_VALUE ;=L QTY_ORDERED L ;=LCUST_NO1L ;=L ITEM_TYPEsoftwareLJ999/software/hardware/other/N/AL ;=L SALES_REP PAID nL ORDER_STATUS newL ;=L POST_NEW_ORDER CHECK_11 CHECK_12 CHECK_13 CHECK_14 CHECK_15 CHECK_16 CHECK_17 CHECK_18 CHECK_19 CHECK_20 CHECK_21 CHECK_22 CHECK_23 CHECK_24 CHECK_25 CHECK_26 CHECK_27 CHECK_28) AJOB_REQUIREMENT MAX_SALARY L1L ;=L MIN_SALARY L1L ;=L JOB_GRADE8L ;=L LANGUAGE_REQ ) (U JOB_TITLE ;=L JOB_COUNTRY ;=L JOB_CODE199999L ;=L CHECK_1 CHECK_2SYSDBA   PHONE_NO PHONE_NO PHONE_EXT PHONE_EXT LAST_NAME LAST_NAMEEMP_NOEMP_NO LOCATION LOCATION FIRST_NAME FIRST_NAMEY:C12 ) ( C10 ) (C8 ) (C7 ) (C5 ) (C15 ) (C14 ) (C13 ) (C11 ) (  C6 ) ( C2 Y X /:G@@:P3G/: C1 C9 ) ( C4 ) (C3 A @ /:G@@:90 165LA =43:81P/;::d7(;;4 3 3 3 3d 3( 9 4 7 2P 6 1 ' 4 3X 3 947|2D61'43H72AAHBBMt?(I PHONE_LIST EMPLOYEE FIRST_NAME  PHONE_LIST DEPARTMENT LOCATION  PHONE_LIST EMPLOYEE EMP_NO  PHONE_LIST EMPLOYEE LAST_NAME  PHONE_LIST EMPLOYEE PHONE_EXT  PHONE_LIST DEPARTMENT PHONE_NO  PHONE_LIST EMPLOYEE  PHONE_LIST DEPARTMENT  PHONE_LIST EMPLOYEE DEPT_NO  PHONE_LIST DEPARTMENT DEPT_NO SAVE_SALARY_CHANGE SALARY_HISTORY OLD_SALARY SAVE_SALARY_CHANGE EMPLOYEE SALARY SAVE_SALARY_CHANGE SALARY_HISTORY PERCENT_CHANGE CHECK_8 SALARY_HISTORY PERCENT_CHANGE CHECK_7 SALARY_HISTORY PERCENT_CHANGE CHECK_6 PROJ_DEPT_BUDGET FISCAL_YEAR CHECK_5 PROJ_DEPT_BUDGET FISCAL_YEAR  SET_EMP_NO EMP_NO_GEN  SET_EMP_NO EMPLOYEE EMP_NO CHECK_4 JOB MIN_SALARY CHECK_4 EMPLOYEE SALARY CHECK_4 JOB CHECK_4 JOB JOB_CODE CHECK_4 EMPLOYEE JOB_CODE CHECK_4 JOB JOB_GRADE CHECK_4 EMPLOYEE JOB_GRADE CHECK_4 JOB JOB_COUNTRY CHECK_4 EMPLOYEE JOB_COUNTRY CHECK_4 JOB MAX_SALARY CHECK_3 JOB MIN_SALARY CHECK_3 EMPLOYEE SALARY CHECK_3 JOB CHECK_3 JOB JOB_CODE CHECK_3 EMPLOYEE JOB_CODE CHECK_3 JOB JOB_GRADE CHECK_3 EMPLOYEE JOB_GRADE CHECK_3 JOB JOB_COUNTRY CHECK_3 EMPLOYEE JOB_COUNTRY CHECK_3 JOB MAX_SALARY CHECK_2 JOB MIN_SALARY CHECK_2 JOB MAX_SALARY CHECK_1 JOB MIN_SALARY CHECK_1 JOB MAX_SALARY  PHONE_LIST EMPLOYEE FIRST_NAME  PHONE_LIST DEPARTMENT LOCATION  PHONE_LIST EMPLOYEE EMP_NO  PHONE_LIST EMPLOYEE LAST_NAME  PHONE_LIST EMPLOYEE PHONE_EXT  PHONE_LIST DEPARTMENT PHONE_NO  PHONE_LIST EMPLOYEE  PHONE_LIST DEPARTMENT  PHONE_LIST EMPLOYEE DEPT_NO  PHONE_LIST DEPARTMENT DEPT_NO RDB$31 SALES SHIP_DATE RDB$31 SALES ORDER_DATE RDB$17 SALARY_HISTORY OLD_SALARY RDB$17 SALARY_HISTORY PERCENT_CHANGE RDB$9 EMPLOYEE LAST_NAME RDB$9 EMPLOYEE FIRST_NAME 90 (( T T4  L t TT  H  Tx , L  T D T$  T \ T< TtT TTxT$TLLPH](Xn]0X H:G;3G\ ע&(0A(a bb ccc dddd eeeee !"#$0 @ /:G@@:a(abbC5 bb (ccccccdddd ) ddddeeeeeeeeeeC14 fffffff78901234fffffff78901234(0A(a bb ccc dddd eeeee(0,(0X /:G@@:P3G/: (00(  (00( H@H@(08(  (08((08((08(cTv(08( Q @Q @(08(V]xEc]xEc(08(f T (08(fCB(08( (08( Q @Q @ (00( H@H@  (08(cTv  (0,((08((00(  (08(  0X /:G@@:P3G/: 0 @ /:G@@:aabbbbccccccddddddddeeeeeeeeeefffffff78901234fffffff7890123490!O\SSSdOS Nx H( N N N4 T S N@ N S NL P T NT T TP`OMRlOTNtS$MSNV93N5822Isoftware nshippedgcbV93B1002'software yshippedV93I4700hardware ynopenvV93F0020software =nshippedV93H0500L>jhardware =nopen0V93H3009L= software =nshippedV94S6400>software ywaitingV93S4702hardware yyshippedV9456220hardware yopenP8V93C0990=Jb(hardware HyshippedƿV93C0120 other HyshippedmbWV9345139=2software yshipped"V9345200>2)software yshipped V9346200?software nwaitingV9336100L=Ȩsoftware nwaitingտտпV93006 other nshipped}V93005software yshippedV9427029)>hardware nshipped`V9420099>/dsoftware nopenV9320630L>[hardware nopenO?? V9324320?software yshipped@88"V9324200L>~Vhardware Hyshipped6V94H0079L= software =nopenV93H0030L> software vyopenV93F2051software nwaitingV93F2030qhardware yopenVJV93F3088@B software nshippedkkV92F3004@ software yshippedCCV93J3100=hwsoftware vyshippedV93J2004Rsoftware vyshippedƾV92J1003software =yshippedV92E0340jhardware yshippedV91E0210=  hardware yshipped901,2l282 ,,,,\,0,, , , ,T ,( , , , ,x ,L , , , , ,p ,< 2 , 2 , ,X ,, , , , ,| ,P ,( ( ()(x2L, ,-.,d-$@elaine$@ =elaine$@qelainey$@(elainev$@elaineH$@q_elaine= r#@ͳwelaine  ytjk Otji ytjU tj.@eRVelaine^@[VelaineS@GVelaineH@MVelaineG@-VelaineA@[Velaine=@>Velaine4@`vVelaine-@RVelaine, @Di9Velaine%@51Velaine$ @7ZVelaine"@(eVelaine@!Velaine@LwVelaine@9Velaine@PkbVelaine@(eVelaine@@NVelaine @rVelaine @mVelaine @^Velaine@mKadmin2-@@KLKadmin2,@g5Kadmin2%@-Kadmin2$@`SKadmin2"@^Kadmin2@coKadmin2@zKadmin2@[Kadmin2@^Kadmin2@>IKadmin2 @jKadmin2  ^)P @`Kadmin2 {/L @@TKadmin2 =U @@Kadmin2$@Kadmin2900T(0T-T,,T+ T ,, T , T ,, T , T ,, T + T ,, T , T ,, T ,T,,T,T,,T,T|-(T-Tx,$T-Tp-T,. 100VBASE(08( , 100VBASE(08( * 100VBASE(08( Zb( 622VBASE(08( J]& 621VBASE(08( +S $ 621VBASE(08( '" 110MKTPR(08(   100MKTPR(08(  672MKTPR(08( ' 623MKTPR(08( 0MKTPR(08( -1 110MKTPR(08(  100MKTPR(08(  672MKTPR(08( z 623MKTPR(08(  622HWRII(08( Zb 621HWRII(08(  670HWRII(08(  671MAPDB(08( [ 622MAPDB(08(  = 621MAPDB(08(  621MAPDB(08( @ 671GUIDE(08( -1 100GUIDE(08( 90tX< x\@$    | ` D (   4MKTPRMKTPRMKTPR"MKTPRnMKTPRUMKTPR MKTPRiMKTPR.MKTPRGMAPDBMAPDBGUIDEqGUIDEGUIDEGUIDE-VBASEVBASESVBASEVBASE,VBASEVBASEGVBASEVBASEVBASEVBASEDGPIIqDGPIIDGPII90 yD=l9 u :P h B vP B ? N/AUMarketing project 3MKTPR2a/Expand marketing and sales in the Pacific Rim. 2Set up a field office in Australia and Singapore.  softwareTranslator upgradeHWRII7V7Integrate the hand-writing recognition module into the universal language translator.  softwareMapBrowser portMAPDB/H/Port the map browsing database software to run on the automobile model.  hardware AutoMapGUIDE2U2Develop a prototype for the automobile version of #the hand-held map browsing device. other  DigiPizzaDGPII.w.Develop second generation digital pizza maker $with flash-bake heating element and %digital ingredient measuring system.  software-Video DatabaseVBASE/Y/Design a video data base management system for *controlling on-demand video distribution. 90d0  p wd d| ` LA P.0.Box 702 2514(070) 44 91 18 Neppelenbroek Netherlands Den HaagK.M. GeoTech Inc.ARue Royale 350 1210 02 500 5940 Hessels Belgium BrusselsGretaDyno ConsultingAVia Eugenia, 15 20124 02 404 6284 LorenziItalyMilan AndreasLorenzi Export, Ltd.A22 Place de la Concorde 75008 1 43 60 61RocheFranceParis Michelle 3D-Pad Corp.AFlorhofgasse 10 8005 01 221 16 50 Granges SwitzerlandZurichVictorDynamic Intelligence CorpA2-64-7 Sasazuka 150 3 880 77 19 MiyamotoJapanTokyoMiwakoMPM Corporation)1 Emerald Cove 22 01 23*Fiji Turtle IslandMaxMaxA3320 Lawai Road 96766(808) 835-7605BriggsUSAHILihue LeilaniAnini Vacation RentalsQP.O. Box 22743 93953 Mrs. BeauvaisUSACA Pebble Beach Mrs. Beauvais@ Suite 15020 Carling Avenue K1V 9G1(613) 229 3323BrightCanadaONOttawaTomasDataServe InternationalI400 Connaught Road(852) 850 43 98Wu Hong KongCentral Hong KongTaiDT Systems, LTD.A66 Lloyd Street M2 3LA 61 211 99 88 Brocket England Manchester Elizabeth Central Bank@ Suite 1012300 Newbury Street 02115(617) 488-1864ButtleUSAMABostonJamesButtle, Griffith and Co.P. O. Box 470 75205(214) 960-2233Brown*USATXDallasGlenDallas TechnologiesA15500 Pacific Heights Blvd. 92121(619) 530-2710LittleUSACA San Diego Dale J.Signature Design90&O`MMPpM N K N0 Q T M< P P OH R V NL R Q QX L RUXSMSdPSLtM$OJM4TTR<NO@[[265JohnsonUSADoc623ScottHSFGlon FranceSRep123Jacques@#C8492YanowskiUSASRep100Michael@N1 Ferrari yItalySRep125Roberto@,23Yamamoto vJapanSRep115Takashi@g5247ParkerrUSAEng623Bill@>I845PageqUSAEng671Mary@F#~22Ichida nJapanEng115Yuki@2)~202BrownmUSAAdmin600Kelly@ũ{894CookkUSADir670Kevin@D255BenderiUSACEO0 Oliver H.@FU0}(UEnglish German n G(French   :G1f BA/BS and +2-4 years experience in technical support. 1Knowledge of several European languages helpful. !.c- EngineerUSAEng  BA/BS and 3-5 years experience. 9/  EngineerJapanEngU0}(U Japanese Mandarin G(English   :G%5+ years experience. "BA/BS and/or MS degrees required. %Customer support experience desired. #Knowledge of Japanese and English. @T@KL EngineerUSAEng:5+ years experience. BA/BS required. MS degree preferred. اj EngineerUSAEng%=Distinguished engineer. %Ph.D/MS/BS or equivalent experience.  g5Financial AnalystUSAFinan3_35-10 years of accounting and financial experience. Strong analytical skills. CPA/MBA required. `S* AccountantUSAAccntA`CPA with 3-5 years experience. ASpreadsheet, data entry, and word processing knowledge required. @KLMarketing AnalystUSAMktg/e BA/BS required. MBA preferred. 3-5 years experience. /Knowledgeable with spreadsheets and databases. z =Marketing AnalystUSAMktg/=MBA required. /10+ years experience in high tech environment. .c%&Public Relations Rep.USAPRel(`r%Administrative AssistantEnglandAdmin =!Administrative AssistantUSAAdmin.b2-4 years clerical experience. .Facility with word processing and data entry. AA degree preferred.  `Sg5!Administrative AssistantUSAAdmin9}/3-5 years experience in executive environment. 9Strong organizational and communication skills required. BA degree preferred.  [- ManagerUSAMngr'''5+ years office management experience. [ ManagerUSAMngr'PBA/BS required. 3-5 years in management, 'plus 2-4 years engineering experience. pr DirectorUSADir@T@5-10 years as a director in computer or electronics industries. An advanced degree. @]zVice PresidentUSAVPNo specific requirements.  Chief Financial OfficerUSACFO*Z*15+ years in finance or 5+ years as a CFO with a proven track record. MBA or J.D. degree. @x}@]Chief Executive OfficerUSACEONo specific requirements. 90P\QFTNd  Mx ( OX ` ZX dXPX\@H[-|`>0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. Knowledge of Japanese required. Travel required.  [*Sales Representative SwitzerlandSRepU0}(UGerman French G(English Italian  :GK0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. KKnowledge of German required; one or more other European language helpful. Travel required. jH(Sales RepresentativeCanadaSRepU0}(UEnglish French G( rench   :G>0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. Travel required. 4English plus speaking knowledge of French required. ;f`rSales Representative EnglandSRepU0}(UEnglish German G(French   :G>0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. 1Knowledge of several European languages helpful. Travel required. Sales RepresentativeUSASRepU0}(UEnglish Spanish G( rench   :G>0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. $Some knowledge of Spanish required. Travel required. PG(Sales Co-ordinator EnglandSalesU0}(UEnglish German n G(French   :G1)Experience in sales and public relations in a high tech environment. Excellent communication skills. BA or equivalent. 1Knowledge of several European languages helpful. j =Sales Co-ordinatorUSASales)w)Experience in sales and public relations in a high tech environment. Excellent communication skills. BA or equivalent.  =!Technical WriterUSADoc7}7BA in English/journalism or excellent language skills. &Some programming experience required. 2-4 years of technical writing. [9Technical WriterUSADoc#"4+ years writing highly technical software documentation. #A bachelor's degree or equivalent. !Programming experience required. Excellent language skills. g5%& EngineerUSAEng 1BA/BS preferred. 2-4 years technical experience. #sB$ Engineer EnglandEng90d[ T \ < \`˅[Sales RepresentativeFranceSRepU0}(UEnglish French G(Spanish  talian  :G>0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. =Fluency in French; some knowledge of German/Spanish helpful. Travel required. [ESales RepresentativeItalySRepU0}(UItalian German G(French  talian  :G>0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. 6Fluency in Italian; some knowledge of German helpful. Travel required. ~_@ Sales RepresentativeJapanSRepU0}(U Japanese English G( nglish  talian  :G902 RDB$PRIMARY1 COUNTRY $I? RDB$PRIMARY1 COUNTRY 90$''`,<#$'(+p+@-( ) & FDollarFiji SchillingAustriaBFranc Belgium Guilder NetherlandsHKDollar Hong Kong ADollar AustraliaD-Mark GermanyFFrancFranceLiraItalyYenJapanSFranc SwitzerlandCdnDlrCanadaPound EnglandDollarUSA90    B l ( Bs`QC9MDJ9MlJ$GjpH(GjtH_8KFLV888:;=ON_HOLD0ON_HOLD*check_constraintL(((CHECK (on_hold IS NULL OR on_hold = '*')@SAVE_SALARY_CHANGE EMPLOYEE   0SALARYSALARYJSALARY_HISTORYEMP_NOEMP_NONOW CHANGE_DATE, UPDATER_IDSALARY OLD_SALARY%$#SALARYSALARYdSALARYPERCENT_CHANGELAAAAS BEGIN IF (old.salary <> new.salary) THEN INSERT INTO salary_history (emp_no, change_date, updater_id, old_salary, percent_change) VALUES ( old.emp_no, 'NOW', user, old.salary, (new.salary - old.salary) * 100 / old.salary); END @CHECK_8 SALARY_HISTORY   LLL93PERCENT_CHANGE1PERCENT_CHANGE2check_constraintL)))CHECK (percent_change between -50 and 50) @CHECK_7 SALARY_HISTORY   LLL93PERCENT_CHANGE1PERCENT_CHANGE2check_constraintL)))CHECK (percent_change between -50 and 50) @CHECK_6 PROJ_DEPT_BUDGET   ///3 FISCAL_YEARcheck_constraintLCHECK (FISCAL_YEAR >= 1993) @CHECK_5 PROJ_DEPT_BUDGET   ///3 FISCAL_YEARcheck_constraintLCHECK (FISCAL_YEAR >= 1993)@SET_EMP_NO EMPLOYEE   333=EMP_NOe EMP_NO_GENEMP_NOLUUUAS BEGIN if (new.emp_no is null) then new.emp_no = gen_id(emp_no_gen, 1); END @CHECK_4 EMPLOYEE   93SALARY+CJJOBG::/JOB_CODEJOB_CODE/ JOB_GRADE JOB_GRADE/ JOB_COUNTRY JOB_COUNTRY MIN_SALARY-1SALARY+CJJOBG::/JOB_CODEJOB_CODE/ JOB_GRADE JOB_GRADE/ JOB_COUNTRY JOB_COUNTRY MAX_SALARY-check_constraintLCHECK ( salary >= (SELECT min_salary FROM job WHERE job.job_code = employee.job_code AND job.job_grade = employee.job_grade AND job.job_country = employee.job_country) AND salary <= (SELECT max_salary FROM job WHERE job.job_code = employee.job_code AND job.job_grade = employee.job_grade AND job.job_country = employee.job_country)) @CHECK_3 EMPLOYEE   93SALARY+CJJOBG::/JOB_CODEJOB_CODE/ JOB_GRADE JOB_GRADE/ JOB_COUNTRY JOB_COUNTRY MIN_SALARY-1SALARY+CJJOBG::/JOB_CODEJOB_CODE/ JOB_GRADE JOB_GRADE/ JOB_COUNTRY JOB_COUNTRY MAX_SALARY-check_constraintLCHECK ( salary >= (SELECT min_salary FROM job WHERE job.job_code = employee.job_code AND job.job_grade = employee.job_grade AND job.job_country = employee.job_country) AND salary <= (SELECT max_salary FROM job WHERE job.job_code = employee.job_code AND job.job_grade = employee.job_grade AND job.job_country = employee.job_country))90 -BtFVC`v T DP w h @ wH  @ RT ` @ R` ` @Udd$@Uhd(@8WX@ 8W@P6M@68M@6pM0@6Mh@ E^@@@93DISCOUNT1DISCOUNTcheck_constraintL'''CHECK (discount >= 0 AND discount <= 1) @CHECK_22 SALES   ///3 TOTAL_VALUEcheck_constraintLCHECK (total_value >= 0) @CHECK_21 SALES   ///3 TOTAL_VALUEcheck_constraintLCHECK (total_value >= 0) @CHECK_20 SALES   ///3 QTY_ORDEREDcheck_constraintLCHECK (qty_ordered >= 1) @CHECK_19 SALES   ///3 QTY_ORDEREDcheck_constraintLCHECK (qty_ordered >= 1) @CHECK_18 SALES   999;9/PAIDy/PAIDncheck_constraintLCHECK (paid in ('y', 'n')) @CHECK_17 SALES   999;9/PAIDy/PAIDncheck_constraintLCHECK (paid in ('y', 'n')) @CHECK_16 SALES   FFF:4 DATE_NEEDED ORDER_DATE;= DATE_NEEDEDcheck_constraintL777CHECK (date_needed > order_date OR date_needed IS NULL) @CHECK_15 SALES   FFF:4 DATE_NEEDED ORDER_DATE;= DATE_NEEDEDcheck_constraintL777CHECK (date_needed > order_date OR date_needed IS NULL) @CHECK_14 SALES   BBB:3 SHIP_DATE ORDER_DATE;= SHIP_DATEcheck_constraintL444CHECK (ship_date >= order_date OR ship_date IS NULL) @CHECK_13 SALES   BBB:3 SHIP_DATE ORDER_DATE;= SHIP_DATEcheck_constraintL444CHECK (ship_date >= order_date OR ship_date IS NULL) @CHECK_12 SALES   ;999/ ORDER_STATUSnew/ ORDER_STATUSopen/ ORDER_STATUSshipped/ ORDER_STATUSwaitingcheck_constraintLYYYCHECK (order_status in ('new', 'open', 'shipped', 'waiting')) @CHECK_11 SALES   ;999/ ORDER_STATUSnew/ ORDER_STATUSopen/ ORDER_STATUSshipped/ ORDER_STATUSwaitingcheck_constraintLYYYCHECK (order_status in ('new', 'open', 'shipped', 'waiting'))@SET_CUST_NO CUSTOMER   666=CUST_NOe CUST_NO_GENCUST_NOLXXXAS BEGIN if (new.cust_no is null) then new.cust_no = gen_id(cust_no_gen, 1); END @CHECK_10 CUSTOMER   888:;=ON_HOLD0ON_HOLD*check_constraintL(((CHECK (on_hold IS NULL OR on_hold = '*') @CHECK_9 CUSTOMER   90 @xE^@|Zb @| Z b @ d $ @@ p @( F8D\O4&@O|&D7@TR_CONNECT   L111AS BEGIN /* enter trigger code here */ END @TR_MULTI COUNTRY r  L111AS BEGIN /* enter trigger code here */ END@POST_NEW_ORDER SALES    new_orderL(((AS BEGIN POST_EVENT 'new_order'; END @CHECK_28 SALES   ooo:/ ORDER_STATUSshipped= 0 AND discount <= 1) @CHECK_23 SALES   90/@@@@@@:H: : : :\ 7$ 7 7 7| 7< ? ? At B4 > < =x =8 = < 9 9H 9 995`5(555|<@<<<<P::::`:$<< PUBLIC SYSDBA I PHONE_LIST  PUBLIC SYSDBA S PHONE_LIST  PUBLIC SYSDBA R EMPLOYEE  PUBLIC SYSDBA D EMPLOYEE  PUBLIC SYSDBA U EMPLOYEE  PUBLIC SYSDBA I EMPLOYEE  PUBLIC SYSDBA S EMPLOYEE  PUBLIC SYSDBA R DEPARTMENT  PUBLIC SYSDBA D DEPARTMENT  PUBLIC SYSDBA U DEPARTMENT  PUBLIC SYSDBA I DEPARTMENT  PUBLIC SYSDBA S DEPARTMENT  PUBLIC SYSDBA R JOB  PUBLIC SYSDBA D JOB  PUBLIC SYSDBA U JOB  PUBLIC SYSDBA I JOB  PUBLIC SYSDBA S JOB  PUBLIC SYSDBA R COUNTRY  PUBLIC SYSDBA D COUNTRY  PUBLIC SYSDBA U COUNTRY  PUBLIC SYSDBA I COUNTRY  PUBLIC SYSDBA S COUNTRY (SYSDBA SYSDBA X ALL_LANGS (SYSDBA SYSDBA X SHOW_LANGS (SYSDBA SYSDBA X SHIP_ORDER (SYSDBA SYSDBA X MAIL_LABEL (SYSDBA SYSDBA X ORG_CHART (SYSDBA SYSDBA X DEPT_BUDGET (SYSDBA SYSDBA X DELETE_EMPLOYEE (SYSDBA SYSDBA X SUB_TOT_BUDGET (SYSDBA SYSDBA X ADD_EMP_PROJ (SYSDBA SYSDBA X GET_EMP_PROJ  SYSDBA SYSDBA R SALES  SYSDBA SYSDBA D SALES  SYSDBA SYSDBA U SALES  SYSDBA SYSDBA I SALES  SYSDBA SYSDBA S SALES  SYSDBA SYSDBA R CUSTOMER  SYSDBA SYSDBA D CUSTOMER  SYSDBA SYSDBA U CUSTOMER  SYSDBA SYSDBA I CUSTOMER  SYSDBA SYSDBA S CUSTOMER  SYSDBA SYSDBA R SALARY_HISTORY  SYSDBA SYSDBA D SALARY_HISTORY  SYSDBA SYSDBA U SALARY_HISTORY  SYSDBA SYSDBA I SALARY_HISTORY  SYSDBA SYSDBA S SALARY_HISTORY 901<<L<999\9 9 B BT B B B BD B B Bx B8 @ @ @x @8 @ : : :H : :77d7,77?t?0AB>p<0===t<   @3 330/. SYSDBA SYSDBA U T  SYSDBA SYSDBA I T  SYSDBA SYSDBA S T  PUBLIC SYSDBA X ALL_LANGS  PUBLIC SYSDBA X SHOW_LANGS  PUBLIC SYSDBA X SHIP_ORDER  PUBLIC SYSDBA X MAIL_LABEL  PUBLIC SYSDBA X ORG_CHART  PUBLIC SYSDBA X DEPT_BUDGET  PUBLIC SYSDBA X DELETE_EMPLOYEE  PUBLIC SYSDBA X SUB_TOT_BUDGET  PUBLIC SYSDBA X ADD_EMP_PROJ  PUBLIC SYSDBA X GET_EMP_PROJ  PUBLIC SYSDBA R SALES  PUBLIC SYSDBA D SALES  PUBLIC SYSDBA U SALES  PUBLIC SYSDBA I SALES  PUBLIC SYSDBA S SALES  PUBLIC SYSDBA R CUSTOMER  PUBLIC SYSDBA D CUSTOMER  PUBLIC SYSDBA U CUSTOMER  PUBLIC SYSDBA I CUSTOMER  PUBLIC SYSDBA S CUSTOMER  PUBLIC SYSDBA R SALARY_HISTORY  PUBLIC SYSDBA D SALARY_HISTORY  PUBLIC SYSDBA U SALARY_HISTORY  PUBLIC SYSDBA I SALARY_HISTORY  PUBLIC SYSDBA S SALARY_HISTORY  PUBLIC SYSDBA R PROJ_DEPT_BUDGET  PUBLIC SYSDBA D PROJ_DEPT_BUDGET  PUBLIC SYSDBA U PROJ_DEPT_BUDGET  PUBLIC SYSDBA I PROJ_DEPT_BUDGET  PUBLIC SYSDBA S PROJ_DEPT_BUDGET  PUBLIC SYSDBA R EMPLOYEE_PROJECT  PUBLIC SYSDBA D EMPLOYEE_PROJECT  PUBLIC SYSDBA U EMPLOYEE_PROJECT  PUBLIC SYSDBA I EMPLOYEE_PROJECT  PUBLIC SYSDBA S EMPLOYEE_PROJECT  PUBLIC SYSDBA R PROJECT  PUBLIC SYSDBA D PROJECT  PUBLIC SYSDBA U PROJECT  PUBLIC SYSDBA I PROJECT  PUBLIC SYSDBA S PROJECT  PUBLIC SYSDBA R PHONE_LIST  PUBLIC SYSDBA D PHONE_LIST  PUBLIC SYSDBA U PHONE_LIST 90 33d404444`4,4 4 4 4\ 4( 4 4 4 4X 4$ 4 4 4 4|3H3333   SYSDBA SYSDBA R T  SYSDBA SYSDBA D T  SYSDBA SYSDBA U T  SYSDBA SYSDBA I T  SYSDBA SYSDBA S T  SYSDBA SYSDBA R T  SYSDBA SYSDBA D T  SYSDBA SYSDBA R T  SYSDBA SYSDBA D T  SYSDBA SYSDBA U T  SYSDBA SYSDBA I T  SYSDBA SYSDBA S T T SYSDBA SYSDBA R T T SYSDBA SYSDBA D T TTTTT SYSDBA SYSDBA R T  SYSDBA SYSDBA D T  SYSDBA SYSDBA U T  SYSDBA SYSDBA I T  SYSDBA SYSDBA S T  SYSDBA SYSDBA R T2  SYSDBA SYSDBA D T2  SYSDBA SYSDBA U T2  SYSDBA SYSDBA I T2  SYSDBA SYSDBA S T2  SYSDBA SYSDBA R AR  SYSDBA SYSDBA D AR  SYSDBA SYSDBA U AR  SYSDBA SYSDBA I AR  SYSDBA SYSDBA S AR  SYSDBA SYSDBA R T4  SYSDBA SYSDBA D T4  SYSDBA SYSDBA U T4  SYSDBA SYSDBA I T4  SYSDBA SYSDBA S T4  SYSDBA SYSDBA R T3  SYSDBA SYSDBA D T3  SYSDBA SYSDBA U T3  SYSDBA SYSDBA I T3  SYSDBA SYSDBA S T3  SYSDBA SYSDBA R T  SYSDBA SYSDBA D T 90-9|E@9555`5(5 5 Bh B4 3 = =t @( I I ;d ;( ; ; ;t ;8 ; ; ;x G0 GG8dJ(::>dGGCCDPPP`C @CCINTEG_45 NOT NULL PROJ_DEPT_BUDGET NO NO INTEG_44 NOT NULL PROJ_DEPT_BUDGET NO NO INTEG_43 CHECK PROJ_DEPT_BUDGET NO NO INTEG_42 NOT NULL PROJ_DEPT_BUDGET NO NO INTEG_41 FOREIGN KEYEMPLOYEE_PROJECT NO NO RDB$FOREIGN16 INTEG_40 FOREIGN KEYEMPLOYEE_PROJECT NO NO RDB$FOREIGN15 INTEG_39 PRIMARY KEYEMPLOYEE_PROJECT NO NO RDB$PRIMARY14 INTEG_38 NOT NULL EMPLOYEE_PROJECT NO NO INTEG_37 NOT NULL EMPLOYEE_PROJECT NO NO INTEG_36 FOREIGN KEYPROJECT NO NO RDB$FOREIGN13 INTEG_35 PRIMARY KEYPROJECT NO NO RDB$PRIMARY12 INTEG_34 UNIQUE PROJECT NO NO RDB$11 INTEG_33 NOT NULL PROJECT NO NO INTEG_32 NOT NULL PROJECT NO NO INTEG_31 FOREIGN KEYDEPARTMENT NO NO RDB$FOREIGN10 INTEG_30 CHECK EMPLOYEE NO NO INTEG_29 FOREIGN KEYEMPLOYEE NO NO RDB$FOREIGN9 INTEG_28 FOREIGN KEYEMPLOYEE NO NO RDB$FOREIGN8 INTEG_27 PRIMARY KEYEMPLOYEE NO NO RDB$PRIMARY7 INTEG_26 NOT NULL EMPLOYEE NO NO INTEG_25 NOT NULL EMPLOYEE NO NO INTEG_24 NOT NULL EMPLOYEE NO NO INTEG_23 NOT NULL EMPLOYEE NO NO INTEG_22 NOT NULL EMPLOYEE NO NO INTEG_21 NOT NULL EMPLOYEE NO NO INTEG_20 NOT NULL EMPLOYEE NO NO INTEG_19 NOT NULL EMPLOYEE NO NO INTEG_18 NOT NULL EMPLOYEE NO NO INTEG_17 FOREIGN KEYDEPARTMENT NO NO RDB$FOREIGN6 INTEG_16 PRIMARY KEYDEPARTMENT NO NO RDB$PRIMARY5 INTEG_15 UNIQUE DEPARTMENT NO NO RDB$4 INTEG_14 NOT NULL DEPARTMENT NO NO INTEG_13 NOT NULL DEPARTMENT NO NO INTEG_12 CHECK JOB NO NO INTEG_11 FOREIGN KEYJOB NO NO RDB$FOREIGN3 INTEG_10 PRIMARY KEYJOB NO NO RDB$PRIMARY2 INTEG_9 NOT NULL JOB NO NO INTEG_8 NOT NULL JOB NO NO INTEG_7 NOT NULL JOB NO NO INTEG_6 NOT NULL JOB NO NO INTEG_5 NOT NULL JOB NO NO INTEG_4 NOT NULL JOB NO NO INTEG_3 NOT NULL COUNTRY NO NO INTEG_2 PRIMARY KEYCOUNTRY NO NO RDB$PRIMARY1 INTEG_1 NOT NULL COUNTRY NO NO 90#P`PPAADAA A| >, N N ;d ;, 8 H Hd 8, 8 8 5 8L 5 5 5 8l 54 8585DEEE|5D5INTEG_80 CHECK SALES NO NO INTEG_79 CHECK SALES NO NO INTEG_78 FOREIGN KEYSALES NO NO RDB$FOREIGN26 INTEG_77 FOREIGN KEYSALES NO NO RDB$FOREIGN25 INTEG_76 PRIMARY KEYSALES NO NO RDB$PRIMARY24 INTEG_75 CHECK SALES NO NO INTEG_74 NOT NULL SALES NO NO INTEG_73 CHECK SALES NO NO INTEG_72 NOT NULL SALES NO NO INTEG_71 CHECK SALES NO NO INTEG_70 NOT NULL SALES NO NO INTEG_69 CHECK SALES NO NO INTEG_68 CHECK SALES NO NO INTEG_67 CHECK SALES NO NO INTEG_66 NOT NULL SALES NO NO INTEG_65 CHECK SALES NO NO INTEG_64 NOT NULL SALES NO NO INTEG_63 NOT NULL SALES NO NO INTEG_62 NOT NULL SALES NO NO INTEG_61 FOREIGN KEYCUSTOMER NO NO RDB$FOREIGN23 INTEG_60 PRIMARY KEYCUSTOMER NO NO RDB$PRIMARY22 INTEG_59 CHECK CUSTOMER NO NO INTEG_58 NOT NULL CUSTOMER NO NO INTEG_57 NOT NULL CUSTOMER NO NO INTEG_56 FOREIGN KEYSALARY_HISTORY NO NO RDB$FOREIGN21 INTEG_55 PRIMARY KEYSALARY_HISTORY NO NO RDB$PRIMARY20 INTEG_54 CHECK SALARY_HISTORY NO NO INTEG_53 NOT NULL SALARY_HISTORY NO NO INTEG_52 NOT NULL SALARY_HISTORY NO NO INTEG_51 NOT NULL SALARY_HISTORY NO NO INTEG_50 NOT NULL SALARY_HISTORY NO NO INTEG_49 NOT NULL SALARY_HISTORY NO NO INTEG_48 FOREIGN KEYPROJ_DEPT_BUDGET NO NO RDB$FOREIGN19 INTEG_47 FOREIGN KEYPROJ_DEPT_BUDGET NO NO RDB$FOREIGN18 INTEG_46 PRIMARY KEYPROJ_DEPT_BUDGET NO NO RDB$PRIMARY17 90CxD4DDDhD$D D DX D D C DH DINTEG_78 INTEG_27 FULL RESTRICT RESTRICT INTEG_77 INTEG_60 FULL RESTRICT RESTRICT INTEG_61 INTEG_2 FULL RESTRICT RESTRICT INTEG_56 INTEG_27 FULL RESTRICT RESTRICT INTEG_48 INTEG_35 FULL RESTRICT RESTRICT INTEG_47 INTEG_16 FULL RESTRICT RESTRICT INTEG_41 INTEG_35 FULL RESTRICT RESTRICT INTEG_40 INTEG_27 FULL RESTRICT RESTRICT INTEG_36 INTEG_27 FULL RESTRICT RESTRICT INTEG_31 INTEG_27 FULL RESTRICT RESTRICT INTEG_29 INTEG_10 FULL RESTRICT RESTRICT INTEG_28 INTEG_16 FULL RESTRICT RESTRICT INTEG_17 INTEG_16 FULL RESTRICT RESTRICT INTEG_11 INTEG_2 FULL RESTRICT RESTRICT 90=%&&`'4) '((&l&D&) % ) (t (L &$ ' ( * % &X &0 & ( % & *d &< & & & % *l )@ ) - & & &p 'H & '(&+|'T'()''''`'8' *''*h'@'INTEG_73 CHECK_22 INTEG_73 CHECK_21 INTEG_72 TOTAL_VALUE INTEG_71 CHECK_20 INTEG_71 CHECK_19 INTEG_70 QTY_ORDERED INTEG_69 CHECK_18 INTEG_69 CHECK_17 INTEG_68 CHECK_16 INTEG_68 CHECK_15 INTEG_67 CHECK_14 INTEG_67 CHECK_13 INTEG_66 ORDER_DATE INTEG_65 CHECK_12 INTEG_65 CHECK_11 INTEG_64 ORDER_STATUS INTEG_63 CUST_NO INTEG_62 PO_NUMBER INTEG_59 CHECK_10 INTEG_59 CHECK_9 INTEG_58 CUSTOMER INTEG_57 CUST_NO INTEG_54 CHECK_8 INTEG_54 CHECK_7 INTEG_53 PERCENT_CHANGE INTEG_52 OLD_SALARY INTEG_51 UPDATER_ID INTEG_50 CHANGE_DATE INTEG_49 EMP_NO INTEG_45 DEPT_NO INTEG_44 PROJ_ID INTEG_43 CHECK_6 INTEG_43 CHECK_5 INTEG_42 FISCAL_YEAR INTEG_38 PROJ_ID INTEG_37 EMP_NO INTEG_33 PROJ_NAME INTEG_32 PROJ_ID INTEG_30 CHECK_4 INTEG_30 CHECK_3 INTEG_26 SALARY INTEG_25 JOB_COUNTRY INTEG_24 JOB_GRADE INTEG_23 JOB_CODE INTEG_22 DEPT_NO INTEG_21 HIRE_DATE INTEG_20 LAST_NAME INTEG_19 FIRST_NAME INTEG_18 EMP_NO INTEG_14 DEPARTMENT INTEG_13 DEPT_NO INTEG_12 CHECK_2 INTEG_12 CHECK_1 INTEG_9 MAX_SALARY INTEG_8 MIN_SALARY INTEG_7 JOB_TITLE INTEG_6 JOB_COUNTRY INTEG_5 JOB_GRADE INTEG_4 JOB_CODE INTEG_3 CURRENCY INTEG_1 COUNTRY 90'''`'8'''INTEG_80 CHECK_28 INTEG_80 CHECK_27 INTEG_79 CHECK_26 INTEG_79 CHECK_25 INTEG_75 CHECK_24 INTEG_75 CHECK_23 INTEG_74 DISCOUNT 90( TEST_ROLE SYSDBA 90$L$ H $  p  (  8 x(|$P RDB$FOREIGN15 EMPLOYEE_PROJECT  RDB$PRIMARY7 $RIMARY7 `UU?RDB$FOREIGN13 PROJECT  RDB$PRIMARY7 #RIMARY7  q?RDB$FOREIGN10 DEPARTMENT  RDB$PRIMARY7 "RIMARY2 ?RDB$FOREIGN9 EMPLOYEE  RDB$PRIMARY2 !RIMARY5 ?RDB$FOREIGN8 EMPLOYEE  RDB$PRIMARY5 RDB$FOREIGN6 DEPARTMENT  RDB$PRIMARY5 RIMARY1 $I?RDB$FOREIGN3 JOB  RDB$PRIMARY1 $I?RDB$PRIMARY1 COUNTRY  ;? MAXSALX JOB  MINSALX JOB !?RDB$PRIMARY2 JOB $I? BUDGETX DEPARTMENT RDB$PRIMARY5 DEPARTMENT  a? RDB$4 DEPARTMENT E  a? NAMEX EMPLOYEE RDB$PRIMARY7 EMPLOYEE R  ?CUSTREGION CUSTOMER R  ? CUSTNAMEX CUSTOMER  ?RDB$PRIMARY22 CUSTOMER `UU? PRODTYPEX PROJECT `UU?RDB$PRIMARY12 PROJECT `UU? RDB$11 PROJECT  $I?RDB$PRIMARY14 EMPLOYEE_PROJECT  `UU?RDB$PRIMARY17 PROJ_DEPT_BUDGET  `UU? CHANGEX SALARY_HISTORY  UPDATERX SALARY_HISTORY  ?RDB$PRIMARY20 SALARY_HISTORY E?QTYX SALES  SALESTATX SALES  NEEDX SALES RDB$PRIMARY24 SALES ?RDB$INDEX_43 RDB$RELATION_CONSTRAINTS $I?RDB$INDEX_41 RDB$INDICES ?RDB$INDEX_39 RDB$ROLES  a?RDB$INDEX_32 RDB$TRANSACTIONS RDB$INDEX_31 RDB$INDICES RDB$INDEX_29 RDB$USER_PRIVILEGES RDB$INDEX_28 RDB$DEPENDENCIES `UU?RDB$INDEX_26 RDB$COLLATIONS RDB$INDEX_25 RDB$CHARACTER_SETS ?RDB$INDEX_23 RDB$EXCEPTIONS RDB$INDEX_22 RDB$PROCEDURES ?RDB$INDEX_20 RDB$COLLATIONS RDB$INDEX_19 RDB$CHARACTER_SETS ?RDB$INDEX_17 RDB$FILTERS RDB$INDEX_15 RDB$RELATION_FIELDS RDB$INDEX_14 RDB$CHECK_CONSTRAINTS 90 L,h-,/0/ 1X 2 . ,$ - -T - , 7h 7 7 7x 7( 7778771h14111L11::d:(:::t:8:::1X1:::P:::l: SYSDBA  SYSDBA  DBASYSDBA  BA SYSDBA  BASYSDBA  SYSDBA  SYSDBA  SYSDBASYSDBASYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBASYSDBASYSDBASYSDBA>SYSDBASYSDBASYSDBASYSDBASYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  - SQL$ALL_LANGS  SYSDBA  -SQL$SHOW_LANGS   SYSDBA  -SQL$SHIP_ORDER   SYSDBA  -SQL$MAIL_LABEL  SYSDBA  - SQL$ORG_CHART  SYSDBA  -SQL$DEPT_BUDGET  SYSDBA  -SQL$DELETE_EMPLOYEE  SYSDBA  -SQL$SUB_TOT_BUDGET  SYSDBA  -SQL$ADD_EMP_PROJ  SYSDBA  -SQL$GET_EMP_PROJ  SYSDBA  - SQL$DEFAULT17  5SYSDBA  -SQL$PHONE_LIST  3SYSDBA  - SQL$DEFAULT16  p90tF.@MV92V91E02102E0340F3004J1003 320630 4200 3203300566100451392006200B1002C0120990F00202030513088 H00305003009I4700J20043100N5822S4702420099702956220 H0079S6400 p90_.@O&`dfgpw`&hnoja x  _jV(Sp ĵ@ !.X-.` q p90D,@M openny shippedn  y  waitingn y x90q7` ]??s ? ˕ Ϣ Ѧ ۊ   @  ? @  ?p Χ Ѡ ۡ  @ p90}8`SF&&{HɈadmin2&{HɈadmin2&{HɈadmin2 &elaine"&elaine&&{HɈadmin2 elaine  38elaine(&{HɈadmin2 elaine,&{HɈadmin2 elaine.&{HɈadmin2 elaine4&{HɈadmin2 elaine 8&{HɈadmin2 elaine<&{HɈadmin2 elaine =&{HɈadmin2 elaine A&{HɈadmin2 elaine B&{HɈadmin2 elaine &{HɈadmin2 elaineF&{HɈadmin2 elaine&{HɈadmin2 elaineG&38tjJ&elaineN&elaine  38elaineP@&elaineQ&elaineR&elaine  38elaineT&elaineU@&38tjW&elaineZ@&38tj &38tj ]&38elaine^@&38elaine_&38elaine`&38elaine p901@Vadmin2admin2elainetj x90H2@X:H:HLJO"6w p90$0.PE$MAPDB621(GUIDE100671 HWRII6212 70 MAPDB6212 71 KTPR0001001062372  VBASE1006212,MKTPR1001062372  VBASE1006210VBASE100 p90Q-@G MAPDB VBASE GUIDEMKTPRVBASE (MKTPR ,MKTPR .VBASE  4GUIDE 8DGPIIGUIDE AMKTPR FVBASE  VBASE GMKTPR JMKTPR QMAPDBVBASE  TVBASE U@MKTPR Z@MKTPR [MKTPR \@DGPIIGUIDE aVBASE  @VBASE bDGPII VBASE p90+@CAutoMap DigiPizzaMapBrowser port rketing project 3 Translator upgradeVideo Database p90b, PMDGPIIGUIDE HWRIIMAPDB KTPRVBASE p90,`M N/AMarketing project 3hardwareAutoMapotherDigiPizzasoftwareMapBrowser port Translator upgrade Video Database p90m-@THPX`hpx p90 V+P; 3D-Pad Corp.Anini Vacation RentalsButtle, Griffith and Co. Central BankDT Systems, LTD.allas TechnologiestaServe International ynamic Intelligence Corp  o Consulting GeoTech Inc. Lorenzi Export, Ltd. MPM Corporationax rs. BeauvaisSignature Design p90#l,pD BelgiumBrusselsCanadaOttawaEnglandManchesterFijiTurtle Island ranceParis$Hong KongCentral Hong Kong ItalyMilan JapanTokyoNetherlandsDen Haag SwitzerlandZurich USABostonDallasLihuePebble Beach San Diego p901,@P "&(,.48<=ABFGJNP@QRTU@WZ@[@\@]^@_`a@b p90[f1`FB BaldwinJanetenderOliver H.  netAnn ishopDanarownKellyurbankJennifer M. CookKevin De SouzaRogerFerrariRoberto  isherPete orestPhil GlonJacques reenT.J.uckenheimerMark HallStewartIchidaYukiJohnsonLeslie Scott LambertKim eeTerri ungLukeMacDonaldMary S.ontgomeryJohnNelsonRobertordstromCarolO'BrienSue AnnesbornePierre PageMary padopoulosChris rkerBillhongLeslieRamanathanAshokeevesRogerStansburyWillieeadmanWalterutherlandClaudiaWestonK. J.illiamsRandyYamamotoTakashinowskiMichaeloungBruce Katherine p90o-PJCo Consumer Electronics Div.rporate Headquarters ustomer Services upport Engineeringuropean Headquarters Field Office: Canada  East CoastFranceItalyJapan Singapore witzerlandnance MarketingPacific Rim HeadquartersQuality Assurance Research and DevelopmentSales and Marketingoftware Development Products Div. p90- S12000100105620135 30 408060020123 7012900 x90L,@Q? ?? ?     p90-`DAAccntUSA dminUSA EnglandUSA CEOUSA FOUSA DirUSA ocUSAUSA EngUSA Japan USA England USAUSAFinanUSA MktgUSAUSA  ngrUSA USA PRelUSASRepCanada England France Italy Japan Switzerland USAalesEnglandUSA VPUSA p90,`FCanadaQEnglandp =q zG p =qFrance' =pItaly@Japank SwitzerlandffffffUSA   ffffff     ffffff        ! * x902`U??                  ?333332?o q?/?s33332?333332 =p < zG \(Ž?ՙ p90+@I Australia ia BelgiumCanadaEngland FijiranceGermany Hong KongItalyJapan Netherlands SwitzerlandUSA p90V+@ICanadaEnglandFranceItalyJapan SwitzerlandUSA p90+, N1`000100102060020 70 p90\, P1000100 105 2013530408060021237012900 p90|;`bAdminAdminUSA EnglandUSA CEOUSA FOUSA DirUSA ocUSA EngUSA Japan USA England USAUSAFinanUSA MktgUSA ngrUSAUSA PRelUSASRepCanada France Italy Japan Switzerland USAalesEngland USA VPUSA p90,@Pdefp"&.4ABGRU@ WZ@]^@`a p90D'@i48F U@ p90&-@T8  (,.48AFGJQ TU@Z@[\@a@b 90   d  RDB$FOREIGN26 SALES  RDB$PRIMARY7 +IMARY22  ?RDB$FOREIGN25 SALES  RDB$PRIMARY22 *RIMARY1 E?RDB$FOREIGN23 CUSTOMER  RDB$PRIMARY1 )RIMARY7 ?RDB$FOREIGN21 SALARY_HISTORY  RDB$PRIMARY7 RDB$FOREIGN19 PROJ_DEPT_BUDGET  RDB$PRIMARY12 'RIMARY5  q?RDB$FOREIGN18 PROJ_DEPT_BUDGET  RDB$PRIMARY5 RDB$FOREIGN16 EMPLOYEE_PROJECT  RDB$PRIMARY12 %RIMARY7 E?p90t+ LDGPII GUIDEMAPDBKTPRVBASE p907+ Q0001001062123 7012 p90`0 WMAPDBGUIDE HWRIIMAPDBKTPRVBASE p90F,@Q "&(,.48<=ABFGJNP@QRTU@WZ@ ]^@_` p90 +@K BelgiumCanadaEnglandFiji rance Hong Kong Italy Japan Netherlands SwitzerlandUSA p90R-@T HPX`hpx p90I.@UN&NR]^@ _`a 90 0IhJ E?=h506 9 4 8P 8 5 6 5p 68 7 6 7 6` 00 0 7 7 7P 7 4 4 5x 8@ 5 863d64-863X6(-8BAl98BlA09 GET_EMP_PROJ EMPLOYEE_PROJECT  GET_EMP_PROJ EMPLOYEE_PROJECT EMP_NO  GET_EMP_PROJ EMPLOYEE_PROJECT PROJ_ID  ADD_EMP_PROJ EMPLOYEE_PROJECT  ADD_EMP_PROJ EMPLOYEE_PROJECT EMP_NO  ADD_EMP_PROJ EMPLOYEE_PROJECT PROJ_ID  ADD_EMP_PROJ UNKNOWN_EMP_ID  GET_EMP_PROJ EMPLOYEE_PROJECT  GET_EMP_PROJ EMPLOYEE_PROJECT EMP_NO  GET_EMP_PROJ EMPLOYEE_PROJECT PROJ_ID CHECK_28 SALES ORDER_STATUS CHECK_28 CUSTOMER CHECK_28 CUSTOMER CUST_NO CHECK_28 SALES CUST_NO CHECK_28 CUSTOMER ON_HOLD CHECK_27 SALES ORDER_STATUS CHECK_27 CUSTOMER CHECK_27 CUSTOMER CUST_NO CHECK_27 SALES CUST_NO CHECK_27 CUSTOMER ON_HOLD CHECK_26 SALES ORDER_STATUS CHECK_26 SALES SHIP_DATE CHECK_25 SALES ORDER_STATUS CHECK_25 SALES SHIP_DATE CHECK_24 SALES DISCOUNT CHECK_23 SALES DISCOUNT CHECK_22 SALES TOTAL_VALUE CHECK_21 SALES TOTAL_VALUE CHECK_20 SALES QTY_ORDERED CHECK_19 SALES QTY_ORDERED CHECK_18 SALES PAID CHECK_17 SALES PAID CHECK_16 SALES ORDER_DATE CHECK_16 SALES DATE_NEEDED CHECK_15 SALES ORDER_DATE CHECK_15 SALES DATE_NEEDED CHECK_14 SALES ORDER_DATE CHECK_14 SALES SHIP_DATE CHECK_13 SALES ORDER_DATE CHECK_13 SALES SHIP_DATE CHECK_12 SALES ORDER_STATUS CHECK_11 SALES ORDER_STATUS  SET_CUST_NO CUST_NO_GEN  SET_CUST_NO CUSTOMER CUST_NO CHECK_10 CUSTOMER ON_HOLD CHECK_9 CUSTOMER ON_HOLD SAVE_SALARY_CHANGE SALARY_HISTORY SAVE_SALARY_CHANGE EMPLOYEE EMP_NO SAVE_SALARY_CHANGE SALARY_HISTORY EMP_NO SAVE_SALARY_CHANGE SALARY_HISTORY CHANGE_DATE SAVE_SALARY_CHANGE SALARY_HISTORY UPDATER_ID 90 1=@ <4BX:D < @d 3$ ? 6 ;t <8 <1 4 ; =T 2 : 6 7x .@ 8 9 9 9P < ;0<p80?5>x>8=>98T/7:7|,D8X5DELETE_EMPLOYEE SALES SALES_REP DELETE_EMPLOYEE SALES PO_NUMBER DELETE_EMPLOYEE REASSIGN_SALES  DELETE_EMPLOYEE DEPARTMENT OYDELETE_EMPLOYEE DEPARTMENT MNGR_NO DELETE_EMPLOYEE PROJECT ODELETE_EMPLOYEE PROJECT TEAM_LEADER DELETE_EMPLOYEE EMPLOYEE_PROJECT DELETE_EMPLOYEE EMPLOYEE_PROJECT EMP_NO DELETE_EMPLOYEE SALARY_HISTORY _LDELETE_EMPLOYEE SALARY_HISTORY EMP_NO ELDELETE_EMPLOYEE EMPLOYEE DELETE_EMPLOYEE EMPLOYEE EMP_NO  DEPT_BUDGET DEPARTMENT BUDGET  DEPT_BUDGET DEPARTMENT SUB_TOT_BUDGET DEPARTMENT HEASUB_TOT_BUDGET DEPARTMENT HEAD_DEPT SUB_TOT_BUDGET DEPARTMENT BUDGET DELETE_EMPLOYEE SALES  SHIP_ORDER CUSTOMER ON_HOLD  SHIP_ORDER SALES  SHIP_ORDER SALES PO_NUMBER  SHIP_ORDER SALES ORDER_STATUS  SHIP_ORDER SALES SHIP_DATE  MAIL_LABEL CUSTOMER  MAIL_LABEL CUSTOMER CUST_NO  MAIL_LABEL CUSTOMER CUSTOMER  MAIL_LABEL CUSTOMER CONTACT_FIRST  MAIL_LABEL CUSTOMER CONTACT_LAST  MAIL_LABEL CUSTOMER ADDRESS_LINE1  MAIL_LABEL CUSTOMER ADDRESS_LINE2  MAIL_LABEL CUSTOMER CITY  MAIL_LABEL CUSTOMER STATE_PROVINCE  MAIL_LABEL CUSTOMER COUNTRY  MAIL_LABEL CUSTOMER POSTAL_CODE  ORG_CHART DEPARTMENT  ORG_CHART DEPARTMENT HEAD_DEPT  ORG_CHART DEPARTMENT DEPARTMENT  ORG_CHART DEPARTMENT MNGR_NO  ORG_CHART DEPARTMENT DEPT_NO  ORG_CHART EMPLOYEE FULL_NAME  ORG_CHART EMPLOYEE JOB_CODE  ORG_CHART EMPLOYEE  ORG_CHART EMPLOYEE DEPT_NO  ORG_CHART EMPLOYEE EMP_NO  DEPT_BUDGET DEPARTMENT BUDGET  DEPT_BUDGET DEPARTMENT  DEPT_BUDGET DEPARTMENT HEAD_DEPT  DEPT_BUDGET DEPARTMENT DEPT_NO  DEPT_BUDGET DEPT_BUDGET DELETE_EMPLOYEE SALES SALES_REP DELETE_EMPLOYEE SALES PO_NUMBER DELETE_EMPLOYEE REASSIGN_SALES  DELETE_EMPLOYEE DEPARTMENT OYDELETE_EMPLOYEE DEPARTMENT MNGR_NO DELETE_EMPLOYEE PROJECT ODELETE_EMPLOYEE PROJECT TEAM_LEADER DELETE_EMPLOYEE EMPLOYEE_PROJECT DELETE_EMPLOYEE EMPLOYEE_PROJECT EMP_NO DELETE_EMPLOYEE SALARY_HISTORY _LDELETE_EMPLOYEE SALARY_HISTORY EMP_NO ELDELETE_EMPLOYEE EMPLOYEE DELETE_EMPLOYEE EMPLOYEE EMP_NO SUB_TOT_BUDGET DEPARTMENT SUB_TOT_BUDGET DEPARTMENT HEAD_DEPT SUB_TOT_BUDGET DEPARTMENT BUDGET 90  8 / 6\ 2$ 5 8 8 7 5\ 40 *8 < 1 6 4d 38 ) = SHIP_ORDER ORDER_ALREADY_SHIPPED  SHIP_ORDER CUSTOMER_ON_HOLD  SHIP_ORDER SALES CUST_NO  SHIP_ORDER SALES PAID  SHIP_ORDER CUSTOMER_CHECK  SHIP_ORDER CUSTOMER  SHIP_ORDER CUSTOMER CUST_NO  SHOW_LANGS JOB  SHOW_LANGS JOB JOB_CODE  SHOW_LANGS JOB JOB_GRADE  SHOW_LANGS JOB JOB_COUNTRY  SHOW_LANGS JOB LANGUAGE_REQ  ALL_LANGS JOB  ALL_LANGS JOB JOB_CODE  ALL_LANGS JOB JOB_GRADE  ALL_LANGS JOB JOB_COUNTRY  ALL_LANGS SHOW_LANGS  ALL_LANGS SHOW_LANGS LANGUAGES  SHOW_LANGS JOB  SHOW_LANGS JOB JOB_CODE  SHOW_LANGS JOB JOB_GRADE  SHOW_LANGS JOB JOB_COUNTRY  SHOW_LANGS JOB LANGUAGE_REQ  SHIP_ORDER ORDER_ALREADY_SHIPPED  SHIP_ORDER CUSTOMER_ON_HOLD  SHIP_ORDER SALES CUST_NO  SHIP_ORDER SALES PAID  SHIP_ORDER CUSTOMER_CHECK  SHIP_ORDER CUSTOMER  SHIP_ORDER CUSTOMER CUST_NO 90 T E N$AHDEPARTMENT SQL$DEPARTMENT SYSDBA SQL$DEFAULT4 3BUDGET PL:1'4L PHONE_NO555-1234LMNGR_NO LOCATION HEAD_DEPT399/000:104999=L DEPARTMENT ;=LDEPT_NO399/000:104999=L ;=L EMPLOYEE SQL$EMPLOYEE SYSDBA SQL$DEFAULT5 3*SALARY L1L ;=L HIRE_DATE NOWL ;=L JOB_GRADE8L ;=L PHONE_EXT LAST_NAME ;=LEMP_NO ;=L FULL_NAME&'' LAST_NAME,  FIRST_NAMEL JOB_COUNTRY ;=L JOB_CODE199999L ;=L DEPT_NO399/000:104999=L ;=L FIRST_NAME ;=L SET_EMP_NO SAVE_SALARY_CHANGE CHECK_3 CHECK_4 CUSTOMER SQL$CUSTOMER SYSDBA SQL$DEFAULT10 ADDRESS_LINE2ADDRESS_LINE1CUST_NO1L ;=L POSTAL_CODE PHONE_NO CONTACT_LASTON_HOLD-LCOUNTRYSTATE_PROVINCE CITY CONTACT_FIRST CUSTOMER ;=L SET_CUST_NO CHECK_10 CHECK_9 T4 SQL$T4 SYSDBA SQL$DEFAULT14  ` V_WIN1250V_NONE V_OCTETSC_UTF8C1V_UTF8 C_WIN1250C_NONE C_OCTETS PROJECT SQL$PROJECT SYSDBA SQL$DEFAULT6 J PROJ_DESCPRODUCTsoftwareLJ999/software/hardware/other/N/AL ;=L TEAM_LEADER PROJ_NAME ;=LPROJ_ID /gL ;=LEMPLOYEE_PROJECT SQL$EMPLOYEE_PROJECT SYSDBA SQL$DEFAULT7 PROJ_DEPT_BUDGET SQL$PROJ_DEPT_BUDGET SYSDBA SQL$DEFAULT8 3PROJECTED_BUDGET PL:1'4LQUART_HEAD_CNT ) (  FISCAL_YEAR ;=LDEPT_NO399/000:104999=L ;=LPROJ_ID /gL ;=L CHECK_5 CHECK_6SALARY_HISTORY SQL$SALARY_HISTORY SYSDBA SQL$DEFAULT9 8 NEW_SALARY8" OLD_SALARY%$ OLD_SALARYPERCENT_CHANGEdLPERCENT_CHANGE L ;=L OLD_SALARY L1L ;=L CHANGE_DATE NOWL ;=L UPDATER_ID ;=LEMP_NO ;=L CHECK_7 CHECK_8  SALES SQL$SALES SYSDBA SQL$DEFAULT11 J?kAGED# SHIP_DATE ORDER_DATEL DATE_NEEDED SHIP_DATE ORDER_DATE NOWL ;=L PO_NUMBER7VL ;=L DISCOUNT L ;=L TOTAL_VALUE ;=L QTY_ORDERED L ;=LCUST_NO1L ;=L ITEM_TYPEsoftwareLJ999/software/hardware/other/N/AL ;=L SALES_REP PAID nL ORDER_STATUS newL ;=L POST_NEW_ORDER CHECK_11 CHECK_12 CHECK_13 CHECK_14 CHECK_15 CHECK_16 CHECK_17 CHECK_18 CHECK_19 CHECK_20 CHECK_21 CHECK_22 CHECK_23 CHECK_24 CHECK_25 CHECK_26 CHECK_27 CHECK_2890` COUNTRY SQL$COUNTRY SYSDBA SQL$DEFAULT2  JOB SQL$JOB SYSDBA SQL$DEFAULT3 ) AJOB_REQUIREMENT MAX_SALARY L1L ;=L MIN_SALARY L1L ;=L JOB_GRADE8L ;=L LANGUAGE_REQ ) (U JOB_TITLE ;=L JOB_COUNTRY ;=L JOB_CODE199999L ;=L CHECK_1 CHECK_290 90123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790908912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345679089123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567908912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345679089123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567908912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345679089123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567908912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345679089123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456_789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123459067891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234590678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345906789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123459067891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234590678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345906789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789fdb-1.4.9+dfsg1/test/fbtest21.fdb0000644000215700017510000464000012431143157015260 0ustar rstuartit90 yz{w3fz N904 90909090L|`D( dH,     h L 0       l P 4       p T 8       t X <       x \ @ $  hL0 E D CBA@?>=<;:9876543210/.-,+*)('&%$#"!                90T9090 QRS90Yg;g;90U90]1 C<1 C<90+W90\1 C<y! <%I>%I>! <1 C<90  FHIJKLMNOPUUU90Zى;[%I<h8Z;5a;8Z;%I<ى;90G90V%I<X%I<%I<%I<9090{?|???9090j===90 90 ^*>*>90 90 90 U90  ; ;90 U90 _sm<1 C=1 C=sm<90 90 uv9090`??9090a??9090k9090}*=*=9090w= =x??= =9090z9090b.=.=9090~==9090cL<g<&=&==g<L<9090d%I=%I=9090e&<=<=<&<90909090o=p===9090l><=><9090m<s<<<9090n8p;t8p;6W=8p;8p;9090qL>rL>L>L>9090??90 90 90$I`QUMhPT \T d L RX Z U O\ S P R` V T R\ Z PRdTRV\ZTYTWURXPZVD^\RDB$FIELD_PRECISION RDB$FIELDS RDB$FIELD_PRECISION RDB$CHARACTER_SET_ID RDB$FIELDS RDB$CHARACTER_SET_ID RDB$COLLATION_ID RDB$FIELDS RDB$COLLATION_ID RDB$CHARACTER_LENGTH RDB$FIELDS RDB$FIELD_LENGTH RDB$NULL_FLAG RDB$FIELDS RDB$NULL_FLAG RDB$DIMENSIONS RDB$FIELDS RDB$DIMENSIONS RDB$EXTERNAL_TYPE RDB$FIELDS RDB$FIELD_TYPE RDB$EXTERNAL_SCALE RDB$FIELDS RDB$FIELD_SCALE RDB$EXTERNAL_LENGTH RDB$FIELDS RDB$FIELD_LENGTH RDB$EDIT_STRING RDB$FIELDS RDB$EDIT_STRING RDB$SEGMENT_LENGTH RDB$FIELDS RDB$SEGMENT_LENGTH RDB$QUERY_HEADER RDB$FIELDS RDB$QUERY_HEADER RDB$SYSTEM_FLAG RDB$FIELDS RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$FIELDS RDB$DESCRIPTION RDB$MISSING_SOURCE RDB$FIELDS RDB$SOURCE   RDB$MISSING_VALUE RDB$FIELDS RDB$VALUE   RDB$FIELD_SUB_TYPE RDB$FIELDS RDB$FIELD_SUB_TYPE   RDB$FIELD_TYPE RDB$FIELDS RDB$FIELD_TYPE   RDB$FIELD_SCALE RDB$FIELDS RDB$FIELD_SCALE   RDB$FIELD_LENGTH RDB$FIELDS RDB$FIELD_LENGTH RDB$DEFAULT_SOURCE RDB$FIELDS RDB$SOURCE RDB$DEFAULT_VALUE RDB$FIELDS RDB$VALUE RDB$COMPUTED_SOURCE RDB$FIELDS RDB$SOURCE RDB$COMPUTED_BLR RDB$FIELDS RDB$VALUE RDB$VALIDATION_SOURCE RDB$FIELDS RDB$SOURCE RDB$VALIDATION_BLR RDB$FIELDS RDB$VALIDATION_BLR RDB$QUERY_NAME RDB$FIELDS RDB$FIELD_NAME RDB$FIELD_NAME RDB$FIELDS RDB$FIELD_NAME RDB$CHARACTER_SET_NAME RDB$DATABASE RDB$CHARACTER_SET_NAME RDB$SECURITY_CLASS RDB$DATABASE RDB$SECURITY_CLASS RDB$RELATION_ID RDB$DATABASE RDB$RELATION_ID RDB$DESCRIPTION RDB$DATABASE RDB$DESCRIPTION RDB$PAGE_TYPE RDB$PAGES RDB$PAGE_TYPE RDB$PAGE_SEQUENCE RDB$PAGES RDB$PAGE_SEQUENCE RDB$RELATION_ID RDB$PAGES RDB$RELATION_ID RDB$PAGE_NUMBER RDB$PAGES RDB$PAGE_NUMBER 90+8=DCKDhL F C< EX : : E AP > G < E8 L A Gd E Q Lt N4 >GI\C?GP@C@CxD4BB@lD@*z  RDB$FORMATS SQL$RDB$^ RDB$VIEW_BLRRDB$VIEW_SOURCERDB$DESCRIPTIONRDB$RELATION_IDRDB$SYSTEM_FLAGRDB$DBKEY_LENGTH RDB$FORMAT RDB$FIELD_IDRDB$RELATION_NAME RDB$SECURITY_CLASS RDB$EXTERNAL_FILE RDB$RUNTIME RDB$EXTERNAL_DESCRIPTION RDB$OWNER_NAMERDB$DEFAULT_CLASS RDB$FLAGSRDB$RELATION_TYPE RDB$TRIGGER_4 RDB$TRIGGER_5&RDB$TRIGGER_NAMERDB$RELATION_NAMERDB$TRIGGER_SEQUENCERDB$TRIGGER_TYPERDB$TRIGGER_SOURCERDB$TRIGGER_BLRRDB$DESCRIPTIONRDB$TRIGGER_INACTIVERDB$SYSTEM_FLAG RDB$FLAGS RDB$VALID_BLR RDB$DEBUG_INFO RDB$TRIGGER_2 RDB$TRIGGER_21 RDB$TRIGGER_22 RDB$TRIGGER_3 RDB$USER RDB$GRANTORRDB$PRIVILEGERDB$GRANT_OPTIONRDB$RELATION_NAMERDB$FIELD_NAMERDB$USER_TYPERDB$OBJECT_TYPE RDB$TRIGGER_1 RDB$TRIGGER_31 RDB$TRIGGER_32 RDB$TRIGGER_33 RDB$TRIGGER_8 RDB$TRIGGER_9' MON$RECORD_STATS SYSDBA &MON$IO_STATS SYSDBA % MON$CALL_STACK SYSDBA $MON$STATEMENTS SYSDBA # MON$TRANSACTIONS SYSDBA "MON$ATTACHMENTS SYSDBA !MON$DATABASE SYSDBA  RDB$BACKUP_HISTORY SYSDBA   RDB$ROLES SQL$RDB$ROLES SYSDBARDB$EXCEPTIONS SYSDBA S RDB$COLLATIONS SYSDBA  RDB$CHARACTER_SETS SYSDBA  RDB$PROCEDURE_PARAMETERS SYSDBA RDB$PROCEDURES SYSDBA RDB$LOG_FILES SYSDBA RDB$CHECK_CONSTRAINTS SYSDBA BARDB$REF_CONSTRAINTS SYSDBA RDB$RELATION_CONSTRAINTS SYSDBA RDB$FIELD_DIMENSIONS SYSDBA RDB$GENERATORS SYSDBA RDB$TRANSACTIONS SYSDBA RDB$USER_PRIVILEGES (SYSDBA RDB$TRIGGER_MESSAGES SYSDBA  RDB$FILTERS SYSDBA  RDB$FUNCTION_ARGUMENTS SYSDBA RDB$FUNCTIONS SYSDBA  RDB$DEPENDENCIES SYSDBA   RDB$TRIGGERS )SYSDBA   RDB$TYPES SYSDBA   RDB$FILES SYSDBA  RDB$SECURITY_CLASSES SYSDBA RDB$VIEW_RELATIONS SYSDBA RDB$RELATIONS *SYSDBA RDB$RELATION_FIELDS SYSDBA  RDB$INDICES SYSDBA RDB$INDEX_SEGMENTS SYSDBA  RDB$FIELDS SYSDBA RDB$DATABASE SYSDBA   RDB$PAGES SQL$RDB90"TPZbZ@M Y M< U U Y0 X T W0 S R V0 S Ut a ][\[]c8_]U _]dY[cD]YRDB$NULL_FLAG RDB$RELATION_FIELDS RDB$NULL_FLAG RDB$COMPLEX_NAME RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$SECURITY_CLASS RDB$RELATION_FIELDS RDB$SECURITY_CLASS RDB$SYSTEM_FLAG RDB$RELATION_FIELDS RDB$SYSTEM_FLAG   RDB$DEFAULT_VALUE RDB$RELATION_FIELDS RDB$VALUE   RDB$DESCRIPTION RDB$RELATION_FIELDS RDB$DESCRIPTION   RDB$VIEW_CONTEXT RDB$RELATION_FIELDS RDB$VIEW_CONTEXT   RDB$FIELD_ID RDB$RELATION_FIELDS RDB$FIELD_ID   RDB$UPDATE_FLAG RDB$RELATION_FIELDS RDB$SYSTEM_FLAG RDB$QUERY_HEADER RDB$RELATION_FIELDS RDB$QUERY_HEADER RDB$FIELD_POSITION RDB$RELATION_FIELDS RDB$FIELD_POSITION RDB$EDIT_STRING RDB$RELATION_FIELDS RDB$EDIT_STRING RDB$BASE_FIELD RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$QUERY_NAME RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$FIELD_SOURCE RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$RELATION_NAME RDB$RELATION_FIELDS RDB$RELATION_NAME RDB$FIELD_NAME RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$STATISTICS RDB$INDICES RDB$STATISTICS   RDB$EXPRESSION_SOURCE RDB$INDICES RDB$SOURCE   RDB$EXPRESSION_BLR RDB$INDICES RDB$VALUE   RDB$SYSTEM_FLAG RDB$INDICES RDB$SYSTEM_FLAG   RDB$FOREIGN_KEY RDB$INDICES RDB$RELATION_NAME RDB$INDEX_TYPE RDB$INDICES RDB$SYSTEM_FLAG RDB$INDEX_INACTIVE RDB$INDICES RDB$SYSTEM_FLAG RDB$SEGMENT_COUNT RDB$INDICES RDB$SEGMENT_COUNT RDB$DESCRIPTION RDB$INDICES RDB$DESCRIPTION RDB$UNIQUE_FLAG RDB$INDICES RDB$SYSTEM_FLAG RDB$INDEX_ID RDB$INDICES RDB$INDEX_ID RDB$RELATION_NAME RDB$INDICES RDB$RELATION_NAME RDB$INDEX_NAME RDB$INDICES RDB$INDEX_NAME RDB$STATISTICS RDB$INDEX_SEGMENTS RDB$STATISTICS RDB$FIELD_POSITION RDB$INDEX_SEGMENTS RDB$FIELD_POSITION RDB$FIELD_NAME RDB$INDEX_SEGMENTS RDB$FIELD_NAME RDB$INDEX_NAME RDB$INDEX_SEGMENTS RDB$INDEX_NAME 90$[D_KRLW U UD W K OL [ ] WD O i O, \ O Y( V`h^^KpIQ^lN ^IhWQSlQWKRDB$FIELD_NAME RDB$TYPES RDB$FIELD_NAME RDB$SHADOW_NUMBER RDB$FILES RDB$SHADOW_NUMBER RDB$FILE_FLAGS RDB$FILES RDB$FILE_FLAGS RDB$FILE_LENGTH RDB$FILES RDB$FILE_LENGTH RDB$FILE_START RDB$FILES RDB$FILE_START RDB$FILE_SEQUENCE RDB$FILES RDB$FILE_SEQUENCE RDB$FILE_NAME RDB$FILES RDB$FILE_NAME RDB$DESCRIPTION RDB$SECURITY_CLASSES RDB$DESCRIPTION  RDB$ACL RDB$SECURITY_CLASSES RDB$ACL RDB$SECURITY_CLASS RDB$SECURITY_CLASSES RDB$SECURITY_CLASS RDB$DESCRIPTOR RDB$FORMATS RDB$DESCRIPTOR RDB$FORMAT RDB$FORMATS RDB$FORMAT RDB$RELATION_ID RDB$FORMATS RDB$RELATION_ID RDB$CONTEXT_NAME RDB$VIEW_RELATIONS RDB$CONTEXT_NAME RDB$VIEW_CONTEXT RDB$VIEW_RELATIONS RDB$VIEW_CONTEXT RDB$RELATION_NAME RDB$VIEW_RELATIONS RDB$RELATION_NAME RDB$VIEW_NAME RDB$VIEW_RELATIONS RDB$RELATION_NAME RDB$RELATION_TYPE RDB$RELATIONS RDB$RELATION_TYPE  RDB$FLAGS RDB$RELATIONS RDB$SYSTEM_FLAG RDB$DEFAULT_CLASS RDB$RELATIONS RDB$SECURITY_CLASS RDB$OWNER_NAME RDB$RELATIONS RDB$USER   RDB$EXTERNAL_DESCRIPTION RDB$RELATIONS RDB$EXTERNAL_DESCRIPTION   RDB$RUNTIME RDB$RELATIONS RDB$RUNTIME   RDB$EXTERNAL_FILE RDB$RELATIONS RDB$FILE_NAME   RDB$SECURITY_CLASS RDB$RELATIONS RDB$SECURITY_CLASS   RDB$RELATION_NAME RDB$RELATIONS RDB$RELATION_NAME RDB$FIELD_ID RDB$RELATIONS RDB$FIELD_ID RDB$FORMAT RDB$RELATIONS RDB$FORMAT RDB$DBKEY_LENGTH RDB$RELATIONS RDB$DBKEY_LENGTH RDB$SYSTEM_FLAG RDB$RELATIONS RDB$SYSTEM_FLAG RDB$RELATION_ID RDB$RELATIONS RDB$RELATION_ID RDB$DESCRIPTION RDB$RELATIONS RDB$DESCRIPTION RDB$VIEW_SOURCE RDB$RELATIONS RDB$SOURCE RDB$VIEW_BLR RDB$RELATIONS RDB$VIEW_BLR RDB$COLLATION_ID RDB$RELATION_FIELDS RDB$COLLATION_ID RDB$DEFAULT_SOURCE RDB$RELATION_FIELDS RDB$SOURCE 90#M`O SSdRZ `P X T VL V [ VH P R RH X ` X0 ]_xU[UlWUX\^U^8i\\ ^`RDB$FIELD_LENGTH RDB$FUNCTION_ARGUMENTS RDB$FIELD_LENGTH RDB$FIELD_SCALE RDB$FUNCTION_ARGUMENTS RDB$FIELD_SCALE RDB$FIELD_TYPE RDB$FUNCTION_ARGUMENTS RDB$FIELD_TYPE RDB$MECHANISM RDB$FUNCTION_ARGUMENTS RDB$MECHANISM RDB$ARGUMENT_POSITION RDB$FUNCTION_ARGUMENTS RDB$FIELD_POSITION RDB$FUNCTION_NAME RDB$FUNCTION_ARGUMENTS RDB$FUNCTION_NAME RDB$SYSTEM_FLAG RDB$FUNCTIONS RDB$SYSTEM_FLAG RDB$RETURN_ARGUMENT RDB$FUNCTIONS RDB$FIELD_POSITION RDB$ENTRYPOINT RDB$FUNCTIONS RDB$EXTERNAL_NAME RDB$MODULE_NAME RDB$FUNCTIONS RDB$FILE_NAME RDB$DESCRIPTION RDB$FUNCTIONS RDB$DESCRIPTION RDB$QUERY_NAME RDB$FUNCTIONS RDB$FIELD_NAME RDB$FUNCTION_TYPE RDB$FUNCTIONS RDB$FUNCTION_TYPE RDB$FUNCTION_NAME RDB$FUNCTIONS RDB$FUNCTION_NAME RDB$DEPENDED_ON_TYPE RDB$DEPENDENCIES RDB$OBJECT_TYPE RDB$DEPENDENT_TYPE RDB$DEPENDENCIES RDB$OBJECT_TYPE RDB$FIELD_NAME RDB$DEPENDENCIES RDB$FIELD_NAME RDB$DEPENDED_ON_NAME RDB$DEPENDENCIES RDB$GENERIC_NAME RDB$DEPENDENT_NAME RDB$DEPENDENCIES RDB$GENERIC_NAME RDB$DEBUG_INFO RDB$TRIGGERS RDB$DEBUG_INFO   RDB$VALID_BLR RDB$TRIGGERS RDB$SYSTEM_FLAG    RDB$FLAGS RDB$TRIGGERS RDB$SYSTEM_FLAG   RDB$SYSTEM_FLAG RDB$TRIGGERS RDB$SYSTEM_FLAG RDB$TRIGGER_INACTIVE RDB$TRIGGERS RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$TRIGGERS RDB$DESCRIPTION RDB$TRIGGER_BLR RDB$TRIGGERS RDB$TRIGGER_BLR RDB$TRIGGER_SOURCE RDB$TRIGGERS RDB$SOURCE RDB$TRIGGER_TYPE RDB$TRIGGERS RDB$TRIGGER_TYPE RDB$TRIGGER_SEQUENCE RDB$TRIGGERS RDB$TRIGGER_SEQUENCE RDB$RELATION_NAME RDB$TRIGGERS RDB$RELATION_NAME RDB$TRIGGER_NAME RDB$TRIGGERS RDB$TRIGGER_NAME RDB$SYSTEM_FLAG RDB$TYPES RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$TYPES RDB$DESCRIPTION RDB$TYPE_NAME RDB$TYPES RDB$TYPE_NAME  RDB$TYPE RDB$TYPES RDB$GENERIC_TYPE 90"d0jh`f S U` S V [P \ S Z< d V ID R Y ^( `[p[]ZLfVr(XZtXXVhZXXRDB$UPPER_BOUND RDB$FIELD_DIMENSIONS RDB$BOUND RDB$LOWER_BOUND RDB$FIELD_DIMENSIONS RDB$BOUND RDB$DIMENSION RDB$FIELD_DIMENSIONS RDB$DIMENSION RDB$FIELD_NAME RDB$FIELD_DIMENSIONS RDB$FIELD_NAME RDB$DESCRIPTION RDB$GENERATORS RDB$DESCRIPTION RDB$SYSTEM_FLAG RDB$GENERATORS RDB$SYSTEM_FLAG RDB$GENERATOR_ID RDB$GENERATORS RDB$GENERATOR_ID RDB$GENERATOR_NAME RDB$GENERATORS RDB$GENERATOR_NAME RDB$TRANSACTION_DESCRIPTION RDB$TRANSACTIONS RDB$TRANSACTION_DESCRIPTION RDB$TIMESTAMP RDB$TRANSACTIONS RDB$TIMESTAMP RDB$TRANSACTION_STATE RDB$TRANSACTIONS RDB$TRANSACTION_STATE RDB$TRANSACTION_ID RDB$TRANSACTIONS RDB$TRANSACTION_ID RDB$OBJECT_TYPE RDB$USER_PRIVILEGES RDB$OBJECT_TYPE RDB$USER_TYPE RDB$USER_PRIVILEGES RDB$OBJECT_TYPE RDB$FIELD_NAME RDB$USER_PRIVILEGES RDB$FIELD_NAME RDB$RELATION_NAME RDB$USER_PRIVILEGES RDB$GENERIC_NAME RDB$GRANT_OPTION RDB$USER_PRIVILEGES RDB$SYSTEM_FLAG RDB$PRIVILEGE RDB$USER_PRIVILEGES RDB$PRIVILEGE RDB$GRANTOR RDB$USER_PRIVILEGES RDB$USER  RDB$USER RDB$USER_PRIVILEGES RDB$USER RDB$MESSAGE RDB$TRIGGER_MESSAGES RDB$MESSAGE RDB$MESSAGE_NUMBER RDB$TRIGGER_MESSAGES RDB$MESSAGE_NUMBER RDB$TRIGGER_NAME RDB$TRIGGER_MESSAGES RDB$TRIGGER_NAME RDB$SYSTEM_FLAG RDB$FILTERS RDB$SYSTEM_FLAG RDB$OUTPUT_SUB_TYPE RDB$FILTERS RDB$FIELD_SUB_TYPE RDB$INPUT_SUB_TYPE RDB$FILTERS RDB$FIELD_SUB_TYPE RDB$ENTRYPOINT RDB$FILTERS RDB$EXTERNAL_NAME RDB$MODULE_NAME RDB$FILTERS RDB$FILE_NAME RDB$DESCRIPTION RDB$FILTERS RDB$DESCRIPTION RDB$FUNCTION_NAME RDB$FILTERS RDB$FUNCTION_NAME RDB$CHARACTER_LENGTH RDB$FUNCTION_ARGUMENTS RDB$FIELD_LENGTH   RDB$FIELD_PRECISION RDB$FUNCTION_ARGUMENTS RDB$FIELD_PRECISION RDB$CHARACTER_SET_ID RDB$FUNCTION_ARGUMENTS RDB$CHARACTER_SET_ID RDB$FIELD_SUB_TYPE RDB$FUNCTION_ARGUMENTS RDB$FIELD_SUB_TYPE 90"d0jfh`h `@ _ c| _$ V Vh a a MX [ W _D [UX<XdpeXXd\^PdP V\\TTbRDB$PARAMETER_NAME RDB$PROCEDURE_PARAMETERS RDB$PARAMETER_NAME RDB$DEBUG_INFO RDB$PROCEDURES RDB$DEBUG_INFO   RDB$VALID_BLR RDB$PROCEDURES RDB$SYSTEM_FLAG   RDB$PROCEDURE_TYPE RDB$PROCEDURES RDB$PROCEDURE_TYPE   RDB$SYSTEM_FLAG RDB$PROCEDURES RDB$SYSTEM_FLAG   RDB$RUNTIME RDB$PROCEDURES RDB$RUNTIME   RDB$OWNER_NAME RDB$PROCEDURES RDB$USER RDB$SECURITY_CLASS RDB$PROCEDURES RDB$SECURITY_CLASS RDB$PROCEDURE_BLR RDB$PROCEDURES RDB$PROCEDURE_BLR RDB$PROCEDURE_SOURCE RDB$PROCEDURES RDB$SOURCE RDB$DESCRIPTION RDB$PROCEDURES RDB$DESCRIPTION RDB$PROCEDURE_OUTPUTS RDB$PROCEDURES RDB$PROCEDURE_PARAMETERS RDB$PROCEDURE_INPUTS RDB$PROCEDURES RDB$PROCEDURE_PARAMETERS RDB$PROCEDURE_ID RDB$PROCEDURES RDB$PROCEDURE_ID RDB$PROCEDURE_NAME RDB$PROCEDURES RDB$PROCEDURE_NAME RDB$FILE_FLAGS RDB$LOG_FILES RDB$FILE_FLAGS RDB$FILE_P_OFFSET RDB$LOG_FILES RDB$FILE_P_OFFSET RDB$FILE_PARTITIONS RDB$LOG_FILES RDB$FILE_PARTITIONS RDB$FILE_LENGTH RDB$LOG_FILES RDB$FILE_LENGTH RDB$FILE_SEQUENCE RDB$LOG_FILES RDB$FILE_SEQUENCE RDB$FILE_NAME RDB$LOG_FILES RDB$FILE_NAME RDB$TRIGGER_NAME RDB$CHECK_CONSTRAINTS RDB$TRIGGER_NAME RDB$CONSTRAINT_NAME RDB$CHECK_CONSTRAINTS RDB$CONSTRAINT_NAME RDB$DELETE_RULE RDB$REF_CONSTRAINTS RDB$RULE RDB$UPDATE_RULE RDB$REF_CONSTRAINTS RDB$RULE RDB$MATCH_OPTION RDB$REF_CONSTRAINTS RDB$MATCH_OPTION RDB$CONST_NAME_UQ RDB$REF_CONSTRAINTS RDB$CONSTRAINT_NAME RDB$CONSTRAINT_NAME RDB$REF_CONSTRAINTS RDB$CONSTRAINT_NAME RDB$INDEX_NAME RDB$RELATION_CONSTRAINTS RDB$INDEX_NAME RDB$INITIALLY_DEFERRED RDB$RELATION_CONSTRAINTS RDB$DEFERRABLE RDB$DEFERRABLE RDB$RELATION_CONSTRAINTS RDB$DEFERRABLE RDB$RELATION_NAME RDB$RELATION_CONSTRAINTS RDB$RELATION_NAME RDB$CONSTRAINT_TYPE RDB$RELATION_CONSTRAINTS RDB$CONSTRAINT_TYPE RDB$CONSTRAINT_NAME RDB$RELATION_CONSTRAINTS RDB$CONSTRAINT_NAME 90!h,lh`b b `@ \ ^| b \ hT d ] n h fX Z\`4eXZbb`VX\HchX$bP|XRDB$DESCRIPTION RDB$EXCEPTIONS RDB$DESCRIPTION RDB$MESSAGE RDB$EXCEPTIONS RDB$MESSAGE RDB$EXCEPTION_NUMBER RDB$EXCEPTIONS RDB$EXCEPTION_NUMBER RDB$EXCEPTION_NAME RDB$EXCEPTIONS RDB$EXCEPTION_NAME RDB$SPECIFIC_ATTRIBUTES RDB$COLLATIONS RDB$SPECIFIC_ATTRIBUTES RDB$BASE_COLLATION_NAME RDB$COLLATIONS RDB$COLLATION_NAME RDB$FUNCTION_NAME RDB$COLLATIONS RDB$FUNCTION_NAME RDB$DESCRIPTION RDB$COLLATIONS RDB$DESCRIPTION RDB$SYSTEM_FLAG RDB$COLLATIONS RDB$SYSTEM_FLAG RDB$COLLATION_ATTRIBUTES RDB$COLLATIONS RDB$GENERIC_TYPE RDB$CHARACTER_SET_ID RDB$COLLATIONS RDB$CHARACTER_SET_ID RDB$COLLATION_ID RDB$COLLATIONS RDB$COLLATION_ID RDB$COLLATION_NAME RDB$COLLATIONS RDB$COLLATION_NAME RDB$BYTES_PER_CHARACTER RDB$CHARACTER_SETS RDB$FIELD_LENGTH RDB$FUNCTION_NAME RDB$CHARACTER_SETS RDB$FUNCTION_NAME RDB$DESCRIPTION RDB$CHARACTER_SETS RDB$DESCRIPTION RDB$SYSTEM_FLAG RDB$CHARACTER_SETS RDB$SYSTEM_FLAG RDB$CHARACTER_SET_ID RDB$CHARACTER_SETS RDB$CHARACTER_SET_ID RDB$DEFAULT_COLLATE_NAME RDB$CHARACTER_SETS RDB$COLLATION_NAME RDB$NUMBER_OF_CHARACTERS RDB$CHARACTER_SETS RDB$NUMBER_OF_CHARACTERS RDB$FORM_OF_USE RDB$CHARACTER_SETS RDB$GENERIC_NAME RDB$CHARACTER_SET_NAME RDB$CHARACTER_SETS RDB$CHARACTER_SET_NAME RDB$PARAMETER_MECHANISM RDB$PROCEDURE_PARAMETERS RDB$MECHANISM   RDB$NULL_FLAG RDB$PROCEDURE_PARAMETERS RDB$NULL_FLAG   RDB$COLLATION_ID RDB$PROCEDURE_PARAMETERS RDB$COLLATION_ID   RDB$DEFAULT_SOURCE RDB$PROCEDURE_PARAMETERS RDB$SOURCE RDB$DEFAULT_VALUE RDB$PROCEDURE_PARAMETERS RDB$VALUE RDB$SYSTEM_FLAG RDB$PROCEDURE_PARAMETERS RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$PROCEDURE_PARAMETERS RDB$DESCRIPTION RDB$FIELD_SOURCE RDB$PROCEDURE_PARAMETERS RDB$FIELD_NAME RDB$PARAMETER_TYPE RDB$PROCEDURE_PARAMETERS RDB$PARAMETER_TYPE RDB$PARAMETER_NUMBER RDB$PROCEDURE_PARAMETERS RDB$PARAMETER_NUMBER RDB$PROCEDURE_NAME RDB$PROCEDURE_PARAMETERS RDB$PROCEDURE_NAME 90%XdDKSpSR Xd ^ N Lp X$ L P Q, Q ^p Y [ \` V TXXZRVTVTJhLVSlN KYxI,I_MON$REMOTE_PROTOCOL MON$ATTACHMENTS RDB$REMOTE_PROTOCOL  MON$ROLE MON$ATTACHMENTS RDB$USER  MON$USER MON$ATTACHMENTS RDB$USER MON$ATTACHMENT_NAME MON$ATTACHMENTS RDB$FILE_NAME  MON$STATE MON$ATTACHMENTS RDB$STATE MON$SERVER_PID MON$ATTACHMENTS RDB$PID MON$ATTACHMENT_ID MON$ATTACHMENTS RDB$ATTACHMENT_ID MON$BACKUP_STATE MON$DATABASE RDB$BACKUP_STATE MON$STAT_ID MON$DATABASE RDB$STAT_ID  MON$PAGES MON$DATABASE RDB$COUNTER MON$CREATION_DATE MON$DATABASE RDB$TIMESTAMP MON$RESERVE_SPACE MON$DATABASE RDB$SYSTEM_FLAG MON$FORCED_WRITES MON$DATABASE RDB$SYSTEM_FLAG   MON$READ_ONLY MON$DATABASE RDB$SYSTEM_FLAG   MON$SWEEP_INTERVAL MON$DATABASE RDB$SWEEP_INTERVAL   MON$SHUTDOWN_MODE MON$DATABASE RDB$SHUTDOWN_MODE   MON$SQL_DIALECT MON$DATABASE RDB$SQL_DIALECT   MON$PAGE_BUFFERS MON$DATABASE RDB$PAGE_BUFFERS MON$NEXT_TRANSACTION MON$DATABASE RDB$TRANSACTION_ID MON$OLDEST_SNAPSHOT MON$DATABASE RDB$TRANSACTION_ID MON$OLDEST_ACTIVE MON$DATABASE RDB$TRANSACTION_ID MON$OLDEST_TRANSACTION MON$DATABASE RDB$TRANSACTION_ID MON$ODS_MINOR MON$DATABASE RDB$ODS_NUMBER MON$ODS_MAJOR MON$DATABASE RDB$ODS_NUMBER MON$PAGE_SIZE MON$DATABASE RDB$PAGE_SIZE MON$DATABASE_NAME MON$DATABASE RDB$FILE_NAME RDB$FILE_NAME RDB$BACKUP_HISTORY RDB$FILE_NAME  RDB$SCN RDB$BACKUP_HISTORY RDB$SCN  RDB$GUID RDB$BACKUP_HISTORY RDB$GUID RDB$BACKUP_LEVEL RDB$BACKUP_HISTORY RDB$BACKUP_LEVEL RDB$TIMESTAMP RDB$BACKUP_HISTORY RDB$TIMESTAMP RDB$BACKUP_ID RDB$BACKUP_HISTORY RDB$BACKUP_ID RDB$SYSTEM_FLAG RDB$ROLES RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$ROLES RDB$DESCRIPTION RDB$OWNER_NAME RDB$ROLES RDB$USER RDB$ROLE_NAME RDB$ROLES RDB$USER RDB$SYSTEM_FLAG RDB$EXCEPTIONS RDB$SYSTEM_FLAG 90$]PNaS8^ X O8 V \ L< T _x b ] ^\ Z V XT V PPXZ\J\R NNtFXPtWVRpVXNMON$STAT_ID MON$CALL_STACK RDB$STAT_ID MON$SOURCE_COLUMN MON$CALL_STACK RDB$SOURCE_INFO MON$SOURCE_LINE MON$CALL_STACK RDB$SOURCE_INFO MON$TIMESTAMP MON$CALL_STACK RDB$TIMESTAMP MON$OBJECT_TYPE MON$CALL_STACK RDB$OBJECT_TYPE MON$OBJECT_NAME MON$CALL_STACK RDB$GENERIC_NAME MON$CALLER_ID MON$CALL_STACK RDB$CALL_ID MON$STATEMENT_ID MON$CALL_STACK RDB$STATEMENT_ID MON$CALL_ID MON$CALL_STACK RDB$CALL_ID MON$STAT_ID MON$STATEMENTS RDB$STAT_ID MON$SQL_TEXT MON$STATEMENTS RDB$SOURCE MON$TIMESTAMP MON$STATEMENTS RDB$TIMESTAMP  MON$STATE MON$STATEMENTS RDB$STATE MON$TRANSACTION_ID MON$STATEMENTS RDB$TRANSACTION_ID MON$ATTACHMENT_ID MON$STATEMENTS RDB$ATTACHMENT_ID MON$STATEMENT_ID MON$STATEMENTS RDB$STATEMENT_ID MON$STAT_ID MON$TRANSACTIONS RDB$STAT_ID   MON$AUTO_UNDO MON$TRANSACTIONS RDB$SYSTEM_FLAG   MON$AUTO_COMMIT MON$TRANSACTIONS RDB$SYSTEM_FLAG   MON$READ_ONLY MON$TRANSACTIONS RDB$SYSTEM_FLAG   MON$LOCK_TIMEOUT MON$TRANSACTIONS RDB$LOCK_TIMEOUT MON$ISOLATION_MODE MON$TRANSACTIONS RDB$ISOLATION_MODE MON$OLDEST_ACTIVE MON$TRANSACTIONS RDB$TRANSACTION_ID MON$OLDEST_TRANSACTION MON$TRANSACTIONS RDB$TRANSACTION_ID MON$TOP_TRANSACTION MON$TRANSACTIONS RDB$TRANSACTION_ID MON$TIMESTAMP MON$TRANSACTIONS RDB$TIMESTAMP  MON$STATE MON$TRANSACTIONS RDB$STATE MON$ATTACHMENT_ID MON$TRANSACTIONS RDB$ATTACHMENT_ID MON$TRANSACTION_ID MON$TRANSACTIONS RDB$TRANSACTION_ID MON$STAT_ID MON$ATTACHMENTS RDB$STAT_ID   MON$REMOTE_PROCESS MON$ATTACHMENTS RDB$FILE_NAME   MON$GARBAGE_COLLECTION MON$ATTACHMENTS RDB$SYSTEM_FLAG   MON$TIMESTAMP MON$ATTACHMENTS RDB$TIMESTAMP   MON$CHARACTER_SET_ID MON$ATTACHMENTS RDB$CHARACTER_SET_ID   MON$REMOTE_PID MON$ATTACHMENTS RDB$PID MON$REMOTE_ADDRESS MON$ATTACHMENTS RDB$REMOTE_ADDRESS 90 +DhROPtQ$O H V( Y Yt W W Wl X V X| >8 A = ?x ?8 @<=tE8:<.0DW>?AEH?>)+TlE,>E; MNGR_NO DEPARTMENT EMPNO  PHONE_NO DEPARTMENT PHONENUMBER  BUDGET DEPARTMENT BUDGET  EMP_NO EMPLOYEE EMPNO  LAST_NAME EMPLOYEE LASTNAME  PHONE_EXT EMPLOYEE RDB$7  JOB_GRADE EMPLOYEE JOBGRADE   HIRE_DATE EMPLOYEE RDB$8  SALARY EMPLOYEE SALARY    DEPT_NO DEPARTMENT DEPTNO DEPARTMENT DEPARTMENT RDB$5 NTR HEAD_DEPT DEPARTMENT DEPTNO B$1 LOCATION DEPARTMENT RDB$6  EMP_NO EMPLOYEE EMPNO  LAST_NAME EMPLOYEE LASTNAME  PHONE_EXT EMPLOYEE RDB$7  JOB_GRADE EMPLOYEE JOBGRADE  HIRE_DATE EMPLOYEE RDB$8    DEFAULT 'NOW'   NOWL SALARY EMPLOYEE SALARY   DEPT_NO DEPARTMENT DEPTNO DEPARTMENT DEPARTMENT RDB$5  HEAD_DEPT DEPARTMENT DEPTNO  MNGR_NO DEPARTMENT EMPNO  PHONE_NO DEPARTMENT PHONENUMBER DEFAULT '555-1234'555-1234L BUDGET DEPARTMENT BUDGET  JOB_CODE JOB JOBCODE JOB_COUNTRY JOB COUNTRYNAME  JOB_TITLE JOB RDB$2 LANGUAGE_REQ JOB RDB$4  JOB_GRADE JOB JOBGRADE MIN_SALARY JOB SALARY MAX_SALARY JOB SALARY JOB_REQUIREMENT JOB RDB$3  COUNTRY COUNTRY COUNTRYNAME  CURRENCY COUNTRY RDB$1 MON$RECORD_EXPUNGES MON$RECORD_STATS RDB$COUNTER   MON$RECORD_PURGES MON$RECORD_STATS RDB$COUNTER MON$RECORD_BACKOUTS MON$RECORD_STATS RDB$COUNTER MON$RECORD_DELETES MON$RECORD_STATS RDB$COUNTER MON$RECORD_UPDATES MON$RECORD_STATS RDB$COUNTER MON$RECORD_INSERTS MON$RECORD_STATS RDB$COUNTER MON$RECORD_IDX_READS MON$RECORD_STATS RDB$COUNTER MON$RECORD_SEQ_READS MON$RECORD_STATS RDB$COUNTER MON$STAT_GROUP MON$RECORD_STATS RDB$STAT_GROUP MON$STAT_ID MON$RECORD_STATS RDB$STAT_ID MON$PAGE_MARKS MON$IO_STATS RDB$COUNTER MON$PAGE_FETCHES MON$IO_STATS RDB$COUNTER MON$PAGE_WRITES MON$IO_STATS RDB$COUNTER MON$PAGE_READS MON$IO_STATS RDB$COUNTER MON$STAT_GROUP MON$IO_STATS RDB$STAT_GROUP MON$STAT_ID MON$IO_STATS RDB$STAT_ID 9024:P=3083P08 4 6x 3D 2 . 4 3t 5@ 1 > 3 ;X 5 6 8 6x 6< < 3 < 1d 1, 5232T9::;h507258X4$4318L5xRDB$FUNCTION_TYPE pRDB$DESCRIPTOR PxRDB$MECHANISM xRDB$OBJECT_TYPE xRDB$TRIGGER_TYPE xRDB$GENERIC_TYPE xRDB$TRIGGER_SEQUENCE pRDB$RUNTIME PxRDB$DIMENSIONS pRDB$TYPE_NAME xRDB$EXTERNAL_NAME pRDB$FUNCTION_NAME pRDB$GENERIC_NAME pRDB$TRIGGER_NAME pRDB$TRIGGER_BLR PxRDB$FILE_FLAGS xRDB$FILE_LENGTH xRDB$FILE_START xRDB$FILE_SEQUENCE xRDB$FILE_NAME % pRDB$ACL PpRDB$SECURITY_CLASS  pRDB$VALUE PpRDB$VALIDATION_BLR PpRDB$VIEW_BLR PxRDB$FIELD_SUB_TYPE pRDB$SOURCE PxRDB$SEGMENT_LENGTH xRDB$SEGMENT_COUNT pRDB$RELATION_NAME xRDB$RELATION_ID pRDB$QUERY_HEADER PxRDB$PAGE_TYPE xRDB$PAGE_SEQUENCE xRDB$PAGE_NUMBER xRDB$DBKEY_LENGTH xRDB$FORMAT xRDB$FIELD_TYPE xRDB$FIELD_SCALE xRDB$FIELD_POSITION xRDB$FIELD_LENGTH pRDB$INDEX_NAME xRDB$INDEX_ID xRDB$SYSTEM_FLAG pRDB$FIELD_NAME xRDB$FIELD_ID xRDB$EDIT_STRING }%pRDB$DESCRIPTION PpRDB$CONTEXT_NAME xRDB$VIEW_CONTEXT 90369X1E/6t2@1 B 5 <T 4$ - 1 2 1H = 7 ( ; *@ = . 5 7d ;0 4 < <| <D 8 6@8X<$4<<t8<5714p,D+E56T5 4/xRDB$CALL_ID xRDB$STATEMENT_ID xRDB$ATTACHMENT_ID xRDB$PROCEDURE_TYPE xRDB$RELATION_TYPE pRDB$SPECIFIC_ATTRIBUTES P xRDB$SCN  xRDB$GUID &xRDB$BACKUP_LEVEL xRDB$BACKUP_ID xRDB$FIELD_PRECISION xRDB$FILE_P_OFFSET xRDB$EXCEPTION_NUMBER pRDB$EXCEPTION_NAME xRDB$NUMBER_OF_CHARACTERS xRDB$COLLATION_ID pRDB$COLLATION_NAME xRDB$CHARACTER_SET_ID pRDB$CHARACTER_SET_NAME xRDB$PARAMETER_TYPE xRDB$PARAMETER_NUMBER pRDB$PARAMETER_NAME pRDB$PROCEDURE_NAME xRDB$PROCEDURE_PARAMETERS xRDB$PROCEDURE_ID pRDB$PROCEDURE_BLR PxRDB$FILE_PARTITIONS  xRDB$RULE  RESTRICTLxRDB$MATCH_OPTION    FULLLxRDB$DEFERRABLE    NOLxRDB$CONSTRAINT_TYPE  pRDB$CONSTRAINT_NAME xRDB$NULL_FLAG xRDB$STATISTICS xRDB$DIMENSION  xRDB$BOUND xRDB$GENERATOR_ID pRDB$GENERATOR_NAME xRDB$SHADOW_NUMBER pRDB$EXTERNAL_DESCRIPTION PxRDB$PRIVILEGE  pRDB$USER xRDB$MESSAGE_NUMBER xRDB$MESSAGE %pRDB$TRANSACTION_DESCRIPTION PxRDB$TIMESTAMP #xRDB$TRANSACTION_STATE xRDB$TRANSACTION_ID 909/+t-@2 145l346/ = <P 6 4 4 2| 8@ ; 3 - , /P / / %@;;7P<9 ' 'Ll +D 'tK0.OP=)),-\)0))%6*X-0&*&*&7 pDEPTNO  pPROJNO  pCUSTNO  pJOBCODE % pJOBGRADE  0pSALARY   < 0pBUDGET   < 0p{PRODTYPE  % < pPONUMBER  pRDB$9 %% pRDB$17  pRDB$17  pRDB$16  pRDB$15 % pRDB$14 # pRDB$13  pRDB$12  pRDB$11   pRDB$10 % pRDB$9 %% pRDB$8 # pRDB$7 % pRDB$6 % pRDB$5 % pRDB$4 % pRDB$3  pRDB$2 % pRDB$1  %  pPONUMBER  >| >@ 9 = : 7T 7 : = >T A < = ;\ = ??;`@(79<0H<759`;(68<|5@;:<@L9 RDB$INDEX_29 RDB$RELATION_NAME `? RDB$INDEX_28 RDB$DEP RDB$INDEX_43 RDB$INDEX_NAME ?DEP RDB$INDEX_42 RDB$CONSTRAINT_TYPE  ? RDB$INDEX_42 RDB$RELATION_NAME ? RDB$INDEX_41 RDB$FOREIGN_KEY $I?CT RDB$INDEX_40 RDB$TRIGGER_NAME `?C RDB$INDEX_39 RDB$ROLE_NAME ?3  RDB$INDEX_38 RDB$RELATION_NAME  a? RDB$INDEX_37 RDB$TYPE_NAME  8s? RDB$INDEX_36 RDB$FIELD_NAME ? RDB$INDEX_35 RDB$TRIGGER_NAME `UU? RDB$INDEX_34 RDB$RELATION_NAME ? RDB$INDEX_33 RDB$VIEW_NAME ?? RDB$INDEX_32 RDB$TRANSACTION_ID  RDB$INDEX_31 RDB$RELATION_NAME  A? RDB$INDEX_30 RDB$USER ? RDB$INDEX_43 RDB$INDEX_NAME  RDB$INDEX_42 RDB$CONSTRAINT_TYPE  RDB$INDEX_42 RDB$RELATION_NAME  RDB$INDEX_41 RDB$FOREIGN_KEY  RDB$INDEX_40 RDB$TRIGGER_NAME  RDB$INDEX_39 RDB$ROLE_NAME  RDB$INDEX_38 RDB$RELATION_NAME  RDB$INDEX_37 RDB$TYPE_NAME  RDB$INDEX_36 RDB$FIELD_NAME  RDB$INDEX_35 RDB$TRIGGER_NAME  RDB$INDEX_34 RDB$RELATION_NAME  RDB$INDEX_33 RDB$VIEW_NAME  RDB$INDEX_32 RDB$TRANSACTION_ID  RDB$INDEX_31 RDB$RELATION_NAME  RDB$INDEX_29 RDB$RELATION_NAME `? RDB$INDEX_28 RDB$DEPENDED_ON_NAME TIO RDB$INDEX_27 RDB$DEPENDENT_NAME B RDB$INDEX_26 RDB$CHARACTER_SET_ID |? RDB$INDEX_26 RDB$COLLATION_ID ?B RDB$INDEX_25 RDB$CHARACTER_SET_ID  ?B RDB$INDEX_24 RDB$EXCEPTION_NUMBER ?B RDB$INDEX_23 RDB$EXCEPTION_NAME ?RDB RDB$INDEX_22 RDB$PROCEDURE_ID ?$ RDB$INDEX_21 RDB$PROCEDURE_NAME ?ER_ RDB$INDEX_20 RDB$COLLATION_NAME |? RDB$INDEX_19 RDB$CHARACTER_SET_NAME  ?  RDB$INDEX_18 RDB$PARAMETER_NAME ? RDB$INDEX_18 RDB$PROCEDURE_NAME ? RDB$INDEX_17 RDB$OUTPUT_SUB_TYPE  RDB$INDEX_17 RDB$INPUT_SUB_TYPE  RDB$INDEX_16 RDB$FORMAT  ? RDB$INDEX_16 RDB$RELATION_ID  ? RDB$INDEX_15 RDB$RELATION_NAME G b? RDB$INDEX_15 RDB$FIELD_NAME @&l? RDB$INDEX_14 RDB$CONSTRAINT_NAME ? RDB$INDEX_13 RDB$CONSTRAINT_NAME $I? RDB$INDEX_12 RDB$CONSTRAINT_NAME ? RDB$INDEX_11 RDB$GENERATOR_NAME E? RDB$INDEX_10 RDB$FUNCTION_NAME ? RDB$INDEX_9 RDB$FUNCTION_NAME ? RDB$INDEX_8 RDB$TRIGGER_NAME `? RDB$INDEX_7 RDB$SECURITY_CLASS `UU? RDB$INDEX_6 RDB$INDEX_NAME  a? RDB$INDEX_5 RDB$INDEX_NAME  a? RDB$INDEX_4 RDB$RELATION_NAME $I? RDB$INDEX_3 RDB$FIELD_SOURCE  ;s? RDB$INDEX_2 RDB$FIELD_NAME `p? RDB$INDEX_1 RDB$RELATION_ID $I? RDB$INDEX_0 RDB$RELATION_NAME $I?p90 /PRDB$ ARCOUNTRYUSTOMER DEPARTMENTEMPLOYEE_PROJECTJOBMON$ATTACHMENTS CALL_STACKDATABASEIO_STATS RECORD_STATS STATEMENTS TRANSACTIONS PHONE_LISTROJECT _DEPT_BUDGETRDB$BACKUP_HISTORYCHARACTER_SETSECK_CONSTRAINTS OLLATIONSDATABASE  EPENDENCIES EXCEPTIONSFIELDS _DIMENSIONS LESTERSORMATSUNCTIONS _ARGUMENTS GENERATORSINDEX_SEGMENTSICES LOG_FILESPAGES ROCEDURES _PARAMETERSREF_CONSTRAINTSLATIONS _CONSTRAINTS FIELDSOLES SECURITY_CLASSES TRANSACTIONS IGGERS _MESSAGES YPESUSER_PRIVILEGESVIEW_RELATIONSSALARY_HISTORYEST234 4 905,@|A<@DGlA(C J BX @ H Ex O, J J IT @ < N| I8 D E Cd E$ @IDT??HED@ADxD,IF>`A =D@GLGRDB$INDEX_41 RDB$INDICES $I?RDB$INDEX_34 RDB$VIEW_RELATIONS $INRDB$INDEX_33 RDB$VIEW_RELATIONS $INRDB$INDEX_30 RDB$USER_PRIVILEGES INRDB$INDEX_27 RDB$DEPENDENCIES NRDB$INDEX_24 RDB$EXCEPTIONS $INRDB$INDEX_21 RDB$PROCEDURES NRDB$INDEX_19 RDB$CHARACTER_SETS DRDB$INDEX_16 RDB$FORMATS INRDB$INDEX_13 RDB$REF_CONSTRAINTS RDB$INDEX_9 RDB$FUNCTIONS $INRDB$INDEX_6 RDB$INDEX_SEGMENTS RDB$INDEX_3 RDB$RELATION_FIELDS $INRDB$INDEX_43 RDB$RELATION_CONSTRAINTS /RDB$INDEX_42 RDB$RELATION_CONSTRAINTS -RDB$INDEX_40 RDB$CHECK_CONSTRAINTS RDB$INDEX_39 RDB$ROLES ?RDB$INDEX_38 RDB$TRIGGERS  a? 8RDB$INDEX_37 RDB$TYPES  8s? RDB$INDEX_36 RDB$FIELD_DIMENSIONS ?RDB$INDEX_35 RDB$TRIGGER_MESSAGES `UU??RDB$INDEX_34 RDB$VIEW_RELATIONS ?RDB$INDEX_33 RDB$VIEW_RELATIONS ?RDB$INDEX_32 RDB$TRANSACTIONS RDB$INDEX_31 RDB$INDICES  A?RDB$INDEX_30 RDB$USER_PRIVILEGES ?RDB$INDEX_29 RDB$USER_PRIVILEGES `?RDB$INDEX_28 RDB$DEPENDENCIES RDB$INDEX_27 RDB$DEPENDENCIES RDB$INDEX_26 RDB$COLLATIONS |?RDB$INDEX_25 RDB$CHARACTER_SETS  ?RDB$INDEX_24 RDB$EXCEPTIONS RDB$INDEX_23 RDB$EXCEPTIONS ? RDB$INDEX_22 RDB$PROCEDURES ?RDB$INDEX_21 RDB$PROCEDURES ?RDB$INDEX_20 RDB$COLLATIONS |?RDB$INDEX_19 RDB$CHARACTER_SETS  ?EX_RDB$INDEX_18 RDB$PROCEDURE_PARAMETERS ?RDB$INDEX_17 RDB$FILTERS RDB$INDEX_16 RDB$FORMATS  ?RDB$INDEX_15 RDB$RELATION_FIELDS G b?RDB$INDEX_14 RDB$CHECK_CONSTRAINTS ?RDB$INDEX_13 RDB$REF_CONSTRAINTS $I?RDB$INDEX_12 RDB$RELATION_CONSTRAINTS ?RDB$INDEX_11 RDB$GENERATORS E?RDB$INDEX_10 RDB$FUNCTION_ARGUMENTS ?RDB$INDEX_9 RDB$FUNCTIONS ?RDB$INDEX_8 RDB$TRIGGERS `?RDB$INDEX_7 RDB$SECURITY_CLASSES `UU?ERDB$INDEX_6 RDB$INDEX_SEGMENTS RDB$INDEX_5 RDB$INDICES  a?RDB$INDEX_4 RDB$RELATION_FIELDS $I?BRDB$INDEX_3 RDB$RELATION_FIELDS RDB$INDEX_2 RDB$FIELDS `p?RDB$INDEX_1 RDB$RELATIONS $I??RDB$INDEX_0 RDB$RELATIONS p90 F '@ "$&(*,.0123456789:;<=>?@ABC` @`a @` b` ` p90 DPRDB$M qTRANSACTION_ ADDRESSLINEBUDGET COUNTRYNAMEUSTNODEPTNOEMPNO FIRSTNAMEJOBCODEGRADELASTNAME PHONENUMBERONUMBERRODTYPEJNORDB$10121234567893012345456789201234567893012345678940123456781234591501239401234567567896012345012345678960145686789ACL TTACHMENT_ID BACKUP_ID LEVEL  STATEOUND CALL_IDHARACTER_SET_IDNAME OLLATION_IDNAME NSTRAINT_NAMETYPE TEXT_NAMEUNTER DBKEY_LENGTH EBUG_INFOFERRABLE SCRIPTION ORIMENSION S EDIT_STRING XCEPTION_NAMEUMBERTERNAL_DESCRIPTION NAMEFIELD_ID LENGTH NAME POSITION RECISION SCALE UB_TYPE TYPELE_FLAGS LENGTH NAME PARTITIONS _OFFSET SEQUENCE TART ORMAT UNCTION_NAME TYPE GENERATOR_IDNAME IC_NAME  TYPEUIDINDEX_ID NAME  SOLATION_MODE  LOCK_TIMEOUT MATCH_OPTIONECHANISMSSAGE _NUMBER NULL_FLAGMBER_OF_CHARACTERS OBJECT_TYPE DS_NUMBER PAGE_BUFFERS NUMBER SEQUENCE IZE TYPERAMETER_MECHANISM NAME UMBERTYPEIDRIVILEGE OCEDURE_BLR ID NAME  PARAMETERSTYPE QUERY_HEADER RELATION_ID NAME TYPE  MOTE_ADDRESS PROTOCOLULE NTIMESCN ECURITY_CLASS GMENT_COUNT LENGTH HADOW_NUMBER UTDOWN_MODEOURCE _INFOPECIFIC_ATTRIBUTES QL_DIALECTTATE MENT_IDISTICS _GROUP ID WEEP_INTERVAL YSTEM_FLAG TIMESTAMPRANSACTION_DESCRIPTIONIDSTATE IGGER_BLR NAME  SEQUENCE  TYPEYPE_NAMEUSERVALIDATION_BLRUEIEW_BLR CONTEXTSALARY ARY p90 ,q fP RDB$BACKUP_ FIELD_TYPE pQUERY_HEADER TRANSACTION_IDK ADDRESSLINEK DBUDGETKC COUNTRYNAMEC J K KUSTNORDDEPTNODJLDEMPNODJKKRSJ FIRSTNAMEK K DJOBCODEJCGRADEDDLASTNAMEJKD PHONENUMBERJ K RONUMBERKRODTYPERKJNOKRCRDB$1K0K1L2Y1Y2S3Y4S5S6S7S8S9L3S0S1S2S3S4S5R4R5R6R7K8K9C2K0K1K2S3R4R5R6S7R8R9C3R0R1C4S81S2S3S4S5 S91D5K39K40K1K2K3K4K5K6K7D6JZ50Z1Z2Z3Y4Z5Y6Y7Z8Y9Y60Y1Y4Y5Y6Z86D7JD8J9ACL5 TTACHMENT_ID<<4 BACKUP_ID4 LEVEL5 STATEOUND <CALL_ID< HARACTER_SET_ID--;NAME- OLLATION_ID---NAME-- % NSTRAINT_NAME%%% %TYPE TEXT_NAME5UNTERC C C C C C C C C C C C  DBKEY_LENGTH EBUG_INFO&%FERRABLE% SCRIPTION&,---4 ORIMENSION S EDIT_STRING- XCEPTION_NAME-UMBER TERNAL_DESCRIPTION NAME FIELD_ID  LENGTH- NAME, POSITION RECISION SCALE UB_TYPE TYPELE_FLAGS% LENGTH%  NAME   % 4 4 5 ; % PARTITIONS% _OFFSET SEQUENCE% TARTORMAT  UNCTION_NAME-- TYPE GENERATOR_IDNAME IC_NAME-<  TYPE-4UIDINDEX_ID NAME%< SOLATION_MODE< LOCK_TIMEOUT% MATCH_OPTION ECHANISM- SSAGE-  _NUMBER NULL_FLAG - -MBER_OF_CHARACTERS OBJECT_TYPE<4 DS_NUMBER44 PAGE_BUFFERS NUMBER SEQUENCE4 IZE TYPE & RAMETER_NAME,UMBER,TYPE5ID; RIVILEGE& OCEDURE_BLR%ID%NAME,& PARAMETERS& &TYPE QUERY_HEADER RELATION_ID NAME% TYPE; MOTE_ADDRESS 5 PROTOCOL%ULE% NTIME& 4SCN ECURITY_CLASS& GMENT_COUNT LENGTH HADOW_NUMBER4 UTDOWN_MODE OURCE     & - < < _INFO<-PECIFIC_ATTRIBUTES4 QL_DIALECT 5TATE< < < MENT_ID<ISTICSC_GROUPC5 ID; < < < C C 4 WEEP_INTERVAL YSTEM_FLAG&&,--44555;<<< TIMESTAMP4 5 ; < < < RANSACTION_DESCRIPTIONID4444;<<<<STATE IGGER_BLR NAME% SEQUENCE TYPEYPE_NAME USER&4455 VALIDATION_BLR UE   - IEW_BLR  CONTEXTCSALARYCDR R p90 -QPRDB$BACKUP_HISTORY %PROCEDURESsT2YARYYYYYYYYZZZZZZCCOUNTRYCKUSTOMERKKKKKKKKKKKD DEPARTMENTD D D D D D DEMPLOYEEDDDDDJJJJJK_PROJECTKCJOBCCCCCCD5MON$ATTACHMENTS555555;;;;;;;< CALL_STACK<<<<<<<<4DATABASE4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 CIO_STATSC C C C C C RECORD_STATSCCCCCCCCC < STATEMENTS<<<<<<; TRANSACTIONS<<<<<<<<<<<<J PHONE_LISTJ J J J K KROJECTKKKKK _DEPT_BUDGETLLLR4RDB$BACKUP_HISTORY44444-CHARACTER_SETS--------%ECK_CONSTRAINTS%- OLLATIONS--------DATABASE  EPENDENCIES- EXCEPTIONS---4FIELDS      _DIMENSIONSLES     TERS      ORMATS  UNCTIONS        _ARGUMENTS GENERATORSINDEX_SEGMENTSICES            % LOG_FILES% % % % % PAGES % ROCEDURES%&&&&&&&&&&&& & _PARAMETERS,,,,,,-----%REF_CONSTRAINTS%%%%LATIONS                % _CONSTRAINTS%%%%% FIELDS 4OLES4 4 4 SECURITY_CLASSES TRANSACTIONSIGGERS            _MESSAGESYPES    USER_PRIVILEGESVIEW_RELATIONSRSALARY_HISTORYRRRRRRESRRRRRRRRRSSSZTS2SSSSSSSSSSSSYYYS3SSSSK4KKKKKKKK K p90+'PBUDGETXCHANGEXUSTNAMEXREGIONMAXSALXINSALX NAMEXEEDX PRODTYPEXQTYXRDB$114 FOREIGN10 3 5 6 8 9 21 3 5 6 3 6 8 9INDEX_0 1 0 1 2 3 4 5 6 7 8 9 2 0 1 2 3 4 5 6 7 8 9 3 0 1 2 3 4 5 6 7 8 9 4 0 1 2 3 4 5 5 6 7 8 9PRIMARY1 2 4 7 2 0 2 4 5 7 SALESTATXUPDATERX p90)-'PBUDGETXCHANGEXUSTNAMEXREGION  MAXSALX  INSALX NAMEXEEDX  PRODTYPEX QTYX RDB$114 FOREIGN10 3 5 6 8 9 21 3 5 6 3 6 8 9  INDEX_0 1 0 1 2 3 4 5 6 7 8 9 2 0 1 2 3 4 5 6  7 8 9 3 0 1 2 3 4 5 6 7 8 9 4 0 1 2  3 4  5 5 6 7 8 9PRIMARY1 2 4  7   2  0   2 4 5 7 SALESTATX UPDATERX p90  'PSQL$ADD_EMP_PROJLL_LANGSR COUNTRY USTOMERDEFAULT1 0 1 2 3 4 5 6 7 8 9 2 0 1 2 3 3 4 5 6 7 8 9 LETE_EMPLOYEEPARTMENTT_BUDGETEMPLOYEE _PROJECT GET_EMP_PROJJOB  MAIL_LABEL ORG_CHART PHONE_LISTROJECT _DEPT_BUDGET  RDB$FORMATSPAGESROLES SALARY_HISTORYES  HIP_ORDER OW_LANGS UB_TOT_BUDGETT234 4 p90p 'PCHECK_1%0%1%2&3&4&5&6&7&8,92,0-1-2-3-4-5-6-7-834567%8%9-POST_NEW_ORDER RDB$TRIGGER_1 0 1 2 3 4 5 6 7 8 9 2 0 1 2 3 4 5 6 7 8 9 3 0 1 2 3 4 5 6 4 5 6 8 9%SAVE_SALARY_CHANGE% ET_CUST_NO EMP_NO- TR_CONNECT-MULTI p90J'PRDB$GET_CONTEXT SET_CONTEXT p90OY'PRDB$GET_CONTEXT SET_CONTEXT p90'P CUST_NO_GEN EMP_NO_GENRDB$BACKUP_HISTORYCONSTRAINT_NAME EXCEPTIONS  FIELD_NAME  INDEX_NAME PROCEDURESSECURITY_CLASS  TRIGGER_NAME SQL$DEFAULT p90!o'PINTEG_10123456789201234567893012345678940123456789501234567896012345678970123456789809 p90Ut'PINTEG_11728931640178 56 61 778 p903'PINTEG_1234892012345630237842345950123478962345678970123459809 p90  i +DEPT_NOMON$ATTACHMENT_IDMON$'O RECORD_KADDRESS_LINE1CUSTOMERK2CUSTOMERR GEDSALESDBUDGETDEPARTMENTZC1ARZTY2S3K4Y0ARST2Y1ARST2Y2ARST2Y3AR ST2Y4ARST2Y5ARST2S6T2Z2ARYT2S3Z3ARST2S3Z4ARYT2S3Y5ARST2S3Z6ARST2Y7ARST2Y8ARST2Z9ARST2 RHANGE_DATESALARY_HISTORY K ITYCUSTOMER KONTACT_FIRSTCUSTOMERK LASTCUSTOMERCUNTRYCOUNTRY K USTOMERCURRENCYCOUNTRYKSTOMERCUSTOMERK_NOCUSTOMERR SALESK _NONET4K OCTETST4K UTF8T4KWIN1250T4RDATE_NEEDEDSALESDEPARTMENTDEPARTMENT DT_NODEPARTMENTJ EMPLOYEEL PROJ_DEPT_BUDGETRISCOUNTSALESDEMP_NOEMPLOYEEK _PROJECTJ PHONE_LISTR SALARY_HISTORYJFIRST_NAMEEMPLOYEEK PHONE_LISTL SCAL_YEARPROJ_DEPT_BUDGETJULL_NAMEEMPLOYEEDHEAD_DEPTDEPARTMENT DIRE_DATEEMPLOYEERITEM_TYPESALESJJOB_CODEEMPLOYEED JOBJUNTRYEMPLOYEECJOBDGRADEEMPLOYEECJOBCREQUIREMENTJOBC TITLEJOBCLANGUAGE_REQJOBDST_NAMEEMPLOYEEJ PHONE_LISTDOCATIONDEPARTMENTJ PHONE_LISTCMAX_SALARYJOBCIN_SALARYJOBDNGR_NODEPARTMENT5*ON$ATTACHMENT_IDMON$ATTACHMENTS < STATEMENTS<TRANSACTIONS 5NAMEMON$ATTACHMENTS <!UTO_COMMITMON$TRANSACTIONS < UNDOMON$TRANSACTIONS5BACKUP_STATEMON$DATABASE< CALLER_IDMON$CALL_STACK< _IDMON$CALL_STACK;%HARACTER_SET_IDMON$ATTACHMENTS5!REATION_DATEMON$DATABASE4"DATABASE_NAMEMON$DATABASE5"FORCED_WRITESMON$DATABASE;+GARBAGE_COLLECTIONMON$ATTACHMENTS<'ISOLATION_MODEMON$TRANSACTIONS<"LOCK_TIMEOUTMON$TRANSACTIONS4"NEXT_TRANSACTIONMON$DATABASE< OBJECT_NAMEMON$CALL_STACK<TYPEMON$CALL_STACK4DS_MAJORMON$DATABASE4 INORMON$DATABASE4!LDEST_ACTIVEMON$DATABASE<TRANSACTIONS4SNAPSHOTMON$DATABASE4TRANSACTIONMON$DATABASE<$TRANSACTIONS5PAGESMON$DATABASE4 _BUFFERSMON$DATABASE C FETCHESMON$IO_STATS C MARKSMON$IO_STATS C READSMON$IO_STATS4 SIZEMON$DATABASE C WRITESMON$IO_STATS5READ_ONLYMON$DATABASE<TRANSACTIONSC%CORD_BACKOUTSMON$RECORD_STATSCDELETESMON$RECORD_STATSCEXPUNGESMON$RECORD_STATSCIDX_READSMON$RECORD_STATSCNSERTSMON$RECORD_STATSCPURGESMON$RECORD_STATSCSEQ_READSMON$RECORD_STATSCUPDATESMON$RECORD_STATS;$MOTE_ADDRESSMON$ATTACHMENTS;PIDMON$ATTACHMENTS;ROCESSMON$ATTACHMENTS 5TOCOLMON$ATTACHMENTS5 SERVE_SPACEMON$DATABASE 5OLEMON$ATTACHMENTS5!SERVER_PIDMON$ATTACHMENTS4!HUTDOWN_MODEMON$DATABASE<$OURCE_COLUMNMON$CALL_STACK<LINEMON$CALL_STACK4QL_DIALECTMON$DATABASE< TEXTMON$STATEMENTS 5TATEMON$ATTACHMENTS< STATEMENTS<TRANSACTIONS< MENT_IDMON$CALL_STACK < STATEMENTSC _GROUPMON$IO_STATSNCRECORD_STATSATSDB$VIEW_RELATIONSDBKEY_LENGTHRDB$RELATIONS &EBUG_INFORDB$PROCEDURES TRIGGERS"FAULT_CLASSRDB$RELATIONS-$OLLATE_NAMERDB$CHARACTER_SETSSOURCERDB$FIELDS-PROCEDURE_PARAMETERSRELATION_FIELDSVALUERDB$FIELDS-PROCEDURE_PARAMETERS RELATION_FIELDS% )ERRABLERDB$RELATION_CONSTRAINTS%$LETE_RULERDB$REF_CONSTRAINTS%PENDED_ON_NAMERDB$DEPENDENCIESTYPERDB$DEPENDENCIESNT_NAMERDB$DEPENDENCIESTYPERDB$DEPENDENCIES -#SCRIPTIONRDB$CHARACTER_SETS- OLLATIONS DATABASE- EXCEPTIONSFIELDSLTERS UNCTIONS GENERATORSINDICESB& PROCEDURESp90i RDB$FIELD_IDRDB$RELATIONLE_NAMERDB$INDEX_Ig NU PROCEDURE_|SE&&RDB$DESCRIPTIONRDB$PROCEDURES,% _PARAMETERS RELATIONS $_FIELDS 4OLESSECURITY_CLASSES TRIGGERSYPESORRDB$FORMATS&IMENSIONRDB$FIELD_DIMENSIONSSRDB$FIELDSEDIT_STRINGRDB$FIELDSRELATION_FIELDSNTRYPOINTRDB$FILTERS UNCTIONS-$XCEPTION_NAMERDB$EXCEPTIONS-UMBERRDB$EXCEPTIONSPRESSION_BLRRDB$INDICESSOURCERDB$INDICES 'TERNAL_DESCRIPTIONRDB$RELATIONS FILERDB$RELATIONSLENGTHRDB$FIELDSSCALERDB$FIELDSTYPERDB$FIELDSFIELD_IDRDB$RELATIONS _FIELDS LENGTHRDB$FIELDSUNCTION_ARGUMENTS NAMERDB$DEPENDENCIESFIELDS _DIMENSIONSINDEX_SEGMENTSRELATION_FIELDSTYPESUSER_PRIVILEGES #POSITIONRDB$INDEX_SEGMENTSRELATION_FIELDSRECISIONRDB$FIELDS UNCTION_ARGUMENTS SCALERDB$FIELDSUNCTION_ARGUMENTS,$OURCERDB$PROCEDURE_PARAMETERSRELATION_FIELDSUB_TYPERDB$FIELDS UNCTION_ARGUMENTS TYPERDB$FIELDS UNCTION_ARGUMENTSLE_FLAGSRDB$FILES% LOG_FILES LENGTHRDB$FILES% LOG_FILES4 NAMERDB$BACKUP_HISTORYFILES% LOG_FILES% PARTITIONSRDB$LOG_FILES% _OFFSETRDB$LOG_FILES SEQUENCERDB$FILES% LOG_FILES TARTRDB$FILESLAGSRDB$RELATIONS TRIGGERSOREIGN_KEYRDB$INDICES MATRDB$FORMATS RELATIONS- _OF_USERDB$CHARACTER_SETS -)UNCTION_NAMERDB$CHARACTER_SETS- OLLATIONSFILTERS UNCTIONS ) _ARGUMENTSTYPERDB$FUNCTIONS GENERATOR_IDRDB$GENERATORSNAMERDB$GENERATORS  RANTORRDB$USER_PRIVILEGES  _OPTIONRDB$USER_PRIVILEGES4UIDRDB$BACKUP_HISTORYINDEX_IDRDB$INDICESNACTIVERDB$INDICES NAMERDB$INDEX_SEGMENTSICES%RELATION_CONSTRAINTS TYPERDB$INDICES%4ITIALLY_DEFERREDRDB$RELATION_CONSTRAINTSPUT_SUB_TYPERDB$FILTERS'LOWER_BOUNDRDB$FIELD_DIMENSIONS%&MATCH_OPTIONRDB$REF_CONSTRAINTS )ECHANISMRDB$FUNCTION_ARGUMENTS-SSAGERDB$EXCEPTIONS TRIGGER_MESSAGES$_NUMBERRDB$TRIGGER_MESSAGESISSING_SOURCERDB$FIELDSVALUERDB$FIELDSODULE_NAMERDB$FILTERS UNCTIONSNULL_FLAGRDB$FIELDS-PROCEDURE_PARAMETERSRELATION_FIELDS--MBER_OF_CHARACTERSRDB$CHARACTER_SETS&OBJECT_TYPERDB$USER_PRIVILEGES UTPUT_SUB_TYPERDB$FILTERS&WNER_NAMERDB$PROCEDURES  RELATIONS 4OLESPAGE_NUMBERRDB$PAGES SEQUENCERDB$PAGES TYPERDB$PAGES-4RAMETER_MECHANISMRDB$PROCEDURE_PARAMETERS &%NAMERDB$PROCEDURE_PARAMETERS,$UMBERRDB$PROCEDURE_PARAMETERS,%TYPERDB$PROCEDURE_PARAMETERS %RIVILEGERDB$USER_PRIVILEGES&#OCEDURE_BLRRDB$PROCEDURES%IDRDB$PROCEDURES&NPUTSRDB$PROCEDURES%NAMERDB$PROCEDURES,* _PARAMETERS&OUTPUTSRDB$PROCEDURES&SOURCERDB$PROCEDURES &TYPERDB$PROCEDURESQUERY_HEADERRDB$FIELDSRELATION_FIELDS NAMERDB$FIELDS UNCTIONSRELATION_FIELDSRELATION_IDRDB$DATABASEFORMATSPAGES RELATIONSNAMERDB$INDICES RELATIONS %)_CONSTRAINTS*FIELDS TRIGGERSUSER_PRIVILEGESVIEW_RELATIONSTYPERDB$RELATIONS"TURN_ARGUMENTRDB$FUNCTIONS 4OLE_NAMERDB$ROLES&UNTIMERDB$PROCEDURES  RELATIONS4SCNRDB$BACKUP_HISTORY!ECURITY_CLASSRDB$DATABASE& PROCEDURES  RELATIONS)_FIELDSSECURITY_CLASSESGMENT_COUNTRDB$INDICESLENGTHRDB$FIELDS@HADOW_NUMBERRDB$FILESp90'`fC(MON$STAT_GROUPMON$RECORD_STATS&g%RDB$DESCRIPTIONRDB$PROCEDURESiSHADOW_NUMBERRDB$FILES p90g?RDB$TRIGGER_%RDB$SHADOW_NUMBERRDB$FILES-)PECIFIC_ATTRIBUTESRDB$COLLATIONS$TATISTICSRDB$INDEX_SEGMENTSICES -$YSTEM_FLAGRDB$CHARACTER_SETS- OLLATIONS 4 EXCEPTIONSFIELDSLTERS  UNCTIONS GENERATORSINDICES& PROCEDURES,% _PARAMETERS RELATIONS $_FIELDS 4OLES TRIGGERSYPES4%TIMESTAMPRDB$BACKUP_HISTORYTRANSACTIONS0RANSACTION_DESCRIPTIONRDB$TRANSACTIONSIDRDB$TRANSACTIONSSTATERDB$TRANSACTIONSIGGER_BLRRDB$TRIGGERSINACTIVERDB$TRIGGERS%NAMERDB$CHECK_CONSTRAINTS TRIGGERS" _MESSAGESSEQUENCERDB$TRIGGERSOURCERDB$TRIGGERSTYPERDB$TRIGGERS YPERDB$TYPES _NAMERDB$TYPESUNIQUE_FLAGRDB$INDICES%PDATE_FLAGRDB$RELATION_FIELDS%RULERDB$REF_CONSTRAINTS%PER_BOUNDRDB$FIELD_DIMENSIONS SERRDB$USER_PRIVILEGES "_TYPERDB$USER_PRIVILEGES  VALIDATION_BLRRDB$FIELDS SOURCERDB$FIELDS & _BLRRDB$PROCEDURES TRIGGERSIEW_BLRRDB$RELATIONS  CONTEXTRDB$RELATION_FIELDSVIEW_RELATIONS NAMERDB$VIEW_RELATIONS SOURCERDB$RELATIONS DSALARYEMPLOYEESES_REPSALESRHIP_DATESALES KTATE_PROVINCECUSTOMERKTEAM_LEADERPROJECTROTAL_VALUESALESR UPDATER_IDSALARY_HISTORYK V_NONET4K OCTETST4K UTF8T4KWIN1250T4 p90 ='@` @`   a @`b` ` p90('@ p90'ADD_EMP_PROJEMP_NOPROJ_IDLL_LANGSCODEUNTRYGRADELANG DELETE_EMPLOYEEEMP_NUM PT_BUDGETDNO TOTGET_EMP_PROJEMP_NOPROJ_IDMAIL_LABELCUST_NOLINE123456 ORG_CHARTDEPARTMENTEMP_CNT  HEAD_DEPT MNGR_NAMETITLESHIP_ORDERPO_NUMOW_LANGSCODETYGRADE LANGUAGESUB_TOT_BUDGETAVG_BUDGET HEAD_DEPT MAX_BUDGET IN_BUDGET TOT_BUDGET p90n'PASCII BIG_5CP943CYRLDOS43773775850278601234569 EUCJ_0208GBK _2312 ISO8859_1 323456789 KOI8RU SC_5601NEXTONEOCTETS SJIS_0208TIS620 UNICODE_FSSTF8WIN125012345678 p909y,PNASCII BIG_5S_BACP943C_UNICODES_CZ YRLDA_DAB_CSYDAN865EU437850ESP437850FIN437RA437850C85063ITA437850NLD437850OR865PLKTB850G860 RUSSLOVE437850TRKUK437850S437850 E_DE OS437 737 75850278601234569U_NLEN_UKSS_ES_CI_AI UCJ_0208 FI_FI R_CA FR_CI_AIGBK_UNICODE _2312 ISO8859_1 323456789_HUNPLK _IST_IT KOI8R _RUU_UASC_5601 DICTIONARYLT_LT NEXTONE_NO XT_DEUESPFRAITA USOCTETS PDOX_ASCIICSY YRLHUN INTLSLNORDAN4PLKSLO WEDFINT_BRPTXW_CSYYRL GREEKHUNDC INTL 850 NORDAN4PLKSLOV PAN WEDFIN TURK SJIS_0208V_SV TEST_COLLATEIS620_UNICODE UCS_BASICNICODE_CIFSSTF8WIN12501_UA2 3 4567_EELT V8_CZ_CI_AI PTBR p90'P ADD_EMP_PROJLL_LANGS DELETE_EMPLOYEE PT_BUDGET GET_EMP_PROJ MAIL_LABEL ORG_CHART SHIP_ORDEROW_LANGS UB_TOT_BUDGET p90R'@ "$ p90 'PCUSTOMER_CHECK ON_HOLDORDER_ALREADY_SHIPPEDREASSIGN_SALESUNKNOWN_EMP_ID p90>'@ p90>'@"$&(*,.0123567ABCDFGHIJKLMN OP@Q p902@u"$&(*,.012 3567ABCDFGHIJ K LMN OP@Q$&(*, 356DFGIJ  K N OPQ$&( 356FIJ N$&(356I JN$&35FI J$&35FI J$&5FI J$&5FI $&5FI"$&5$$&5&$5($5,5.5051525_I p90i 5P SHIP_ORDER ADD_EMP_PROJ   LL_LANGS     CHECK_1012345678920123456783456789DELETE_EMPLOYEE  PT_BUDGET     GET_EMP_PROJ   MAIL_LABEL           ORG_CHART          PHONE_LIST  SAVE_SALARY_CHANGE ET_CUST_NO EMP_NO  HIP_ORDER           OW_LANGS     UB_TOT_BUDGET p90> 0PSALESCUSTOMER _CHECK  ON_HOLD_NO_GEN DEPARTMENT               T_BUDGETEMPLOYEE_PROJECT_NO_GEN JOBORDER_ALREADY_SHIPPEDPROJECT _DEPT_BUDGETREASSIGN_SALESSALARY_HISTORYES HOW_LANGS UNKNOWN_EMP_ID p90 '0PSALES  ADD_EMP_PROJ LL_LANGS RCOUNTRYUSTOMER DELETE_EMPLOYEEPARTMENT       T_BUDGET EMPLOYEE_PROJECT  GET_EMP_PROJ JOB MAIL_LABEL  ORG_CHART  PHONE_LIST         ROJECT _DEPT_BUDGET RDB$FORMATS PAGES ROLES SALARY_HISTORYES HIP_ORDER OW_LANGS  UB_TOT_BUDGETT234      p90 ='PPUBLICSYSDBA      p90'PCOUNTRYUSTOMER  DEPARTMENT    EMPLOYEE_PROJECTJOBPROJECT _DEPT_BUDGETRDB$BACKUP_HISTORYCHARACTER_SETSECK_CONSTRAINTS OLLATIONS DEPENDENCIES EXCEPTIONSFIELDS _DIMENSIONSLTERS ORMATS UNCTIONS _ARGUMENTS  GENERATORSINDEX_SEGMENTSICES   PROCEDURES _PARAMETERS REF_CONSTRAINTSLATIONS _CONSTRAINTS FIELDSOLESSECURITY_CLASSES TRANSACTIONSIGGERS  _MESSAGESYPESUSER_PRIVILEGESVIEW_RELATIONSSALARY_HISTORYES p90('@ p90 9'P PHONE_LIST p90B'P DEPARTMENTEMPLOYEE p90'P RDB$TRIGGER_1 0 2 3 4 5 7 8 9 2 0 1 2 3 4 5 6 3 1 2 3 6 5 9 p90j|'PRDB$13465123456789601456 p90 *@PEX$READ_COMMITTED_ACLTIVENSISCII7 TTACHMENTBIG5_5NARYLOB_FILTER IDROOLEANY_ISC_DESCRIPTOR REFERENCE _WITH_NULLSCALAR_ARRAY_DESCRIPTORVALUE MS_DESCRIPTORCALLHECK_CONSTRAINTOLLATIONMMITTED PUTED_FIELD NCURRENCYNECTSISTENCYP943C STRING YRLDATABASEEEBUG_INFORMATION ISCONNECTOS43773775850278601234569_437737758502786012345699364950UBLE EUCJ _0208XCEPTION ECUTABLEPRESSION_INDEXTERNAL_FILE_DESCRIPTIONFIELDLOATORMAT ULL_SHUTDOWNGB2312K_2312ENERATORLOBAL_TEMPORARY_DELETEPRESERVEIDLENDEX T64 SO-8859-13 2 3 4 5 6 7 8 988591323456789_1  3 2 3 4 5 6 7 8 9 KOI8RUSC5601_5601LATIN123457 EGACYIMBOONGMERGEULTI_USER_SHUTDOWNNEXTONE RMALOCTETSNLINE PERSISTENT OST_ERASEMODIFYSTORERE_ERASEMODIFYSTOREOCEDUREQLIUADRANGESEAD_COMMITTED_NO_VERSIONVERSIONFERENTIAL_CONSTRAINT LATIONOLELED_BACK  SELECTABLEHORTINGLE_USER_SHUTDOWN JIS _0208QL_TEXTTALLEDTEMENTUMMARYYSTEMTEXT IMESTAMPS620 RANSACTION  _COMMIT DESCRIPTION  ROLLBACK START IGGER YPE OFUDF NICODE_FSSSASCIIER_GROUP TF-88_FSS VALIDATIONUERYING IEW_CHECKRTUALWIN125012345678_125012345679364950 p90 'P--COUNTRY%USTOMER%%EMPLOYEE%JOBPROJ_DEPT_BUDGETRDB$CHECK_CONSTRAINTS EXCEPTIONSFIELDS GENERATORSINDEX_SEGMENTSICES  PROCEDURESREF_CONSTRAINTSLATIONS  _CONSTRAINTS FIELDSTRIGGERS   USER_PRIVILEGESSALARY_HISTORY%%ES%&&&&&&,,--------- p905'P TEST_ROLE p90-'P CHANGE_DATEECK_1012345678920123456783456789OUNTRYURRENCYSTOMER_NO DEPARTMENT T_NOISCOUNT EMP_NO FIRST_NAME SCAL_YEAR HIRE_DATEJOB_CODEUNTRY GRADE TITLE LAST_NAME MAX_SALARY IN_SALARY OLD_SALARY RDER_DATE STATUSPERCENT_CHANGE O_NUMBERROJ_IDNAME QTY_ORDEREDSALARY TOTAL_VALUE UPDATER_ID p90'P`abcdefghijklmnopqrstuvwxyz{|}~`abcdefghijkopqtuvwyz{~abdeghilmnprtuv RDB$PRIMARY1  2  2 2 5   7    p907J@pSALARY_HISTORYCOUNTRYNOT NULL PRIMARY KEYUSTOMERCHECK FOREIGN KEY NOT NULL PRIMARY KEYDEPARTMENTFOREIGN KEY  NOT NULL PRIMARY KEYUNIQUEEMPLOYEECHECK FOREIGN KEY NOT NULL PRIMARY KEY _PROJECTFOREIGN KEY" NOT NULL PRIMARY KEY  JOBCHECK  FOREIGN KEY NOT NULL  PRIMARY KEYPROJECTFOREIGN KEY NOT NULL PRIMARY KEY UNIQUE _DEPT_BUDGETCHECK FOREIGN KEY"  NOT NULL PRIMARY KEYSALARY_HISTORYCHECK FOREIGN KEY NOT NULL PRIMARY KEY ESCHECK FOREIGN KEY NOT NULL  PRIMARY KEY p90 'P`bcdefghklmqrstuvwxy}`deijklrstuvwz{|`abcdefghijklpqRDB$114 FOREIGN10 3 5 6 8 9 21 3 5 6 3 6 8 9PRIMARY1 2 4 7 2 0 2 4 5 7 90(854\6(432/d44., 0 1h 90 8h1 1 1h 40 5 533d 2, 5823 .l 3l7 , 3 343D 0 0/1|2H368-0.L21,33P6761x2D12 RDB$FOREIGN9 JOB_GRADE  q? RDB$FOREIGN9 JOB_CODE  ;? RDB$FOREIGN8 DEPT_NO ? RDB$FOREIGN6 HEAD_DEPT ? RD RDB$FOREIGN3 JOB_COUNTRY $I?RDMAXSALX MAX_SALARY  ;?RDMAXSALX JOB_COUNTRY $I?MINSALX MIN_SALARY  RDB$FOREIGN26 SALES_REP ? RDB$FOREIGN25 CUST_NO  ?Y RDB$FOREIGN23 COUNTRY E?A RDB$FOREIGN21 EMP_NO ?JOB RDB$FOREIGN19 PROJ_ID ?  RDB$FOREIGN18 DEPT_NO  q? RDB$FOREIGN16 PROJ_ID ?a RDB$FOREIGN15 EMP_NO E?? RDB$FOREIGN13 TEAM_LEADER `UU? RDB$FOREIGN10 MNGR_NO  q? RDB$FOREIGN9 JOB_COUNTRY ?MAXSALX MAX_SALARY  ;?RDMAXSALX JOB_COUNTRY $I?MINSALX MIN_SALARY `UU?MINSALX JOB_COUNTRY $I? RDB$FOREIGN3 JOB_COUNTRY $I?RD RDB$PRIMARY2 JOB_COUNTRY !? RDB$PRIMARY2 JOB_GRADE  a?RD RDB$PRIMARY2 JOB_CODE $I? RDB$FOREIGN10 MNGR_NO BUDGETX BUDGET $I? RDB$FOREIGN6 HEAD_DEPT ? RD RDB$PRIMARY5 DEPT_NO  a?RDB$4 DEPARTMENT  a??NAMEX FIRST_NAME  a?NAMEX LAST_NAME ? RDB$FOREIGN9 JOB_GRADE  q? RDB$FOREIGN9 JOB_CODE  ;? RDB$FOREIGN8 DEPT_NO ? RDB$PRIMARY7 EMP_NO  a? CUSTREGION CITY  ? CUSTREGION COUNTRY E? CUSTNAMEX CUSTOMER  ? RDB$FOREIGN23 COUNTRY  RDB$PRIMARY22 CUST_NO  ?_ PRODTYPEX PROJ_NAME `UU? PRODTYPEX PRODUCT ? RDB$FOREIGN13 TEAM_LEADER  RDB$PRIMARY12 PROJ_ID `UU?RDB$11 PROJ_NAME `UU? RDB$FOREIGN16 PROJ_ID  RDB$FOREIGN15 EMP_NO  RDB$PRIMARY14 PROJ_ID $I? RDB$PRIMARY14 EMP_NO E? RDB$FOREIGN19 PROJ_ID  RDB$FOREIGN18 DEPT_NO  RDB$PRIMARY17 DEPT_NO `UU? RDB$PRIMARY17 PROJ_ID  q? RDB$PRIMARY17 FISCAL_YEAR ?CHANGEX CHANGE_DATE `UU?UPDATERX UPDATER_ID `UU? RDB$FOREIGN21 EMP_NO  RDB$PRIMARY20 UPDATER_ID ? RDB$PRIMARY20 CHANGE_DATE ? RDB$PRIMARY20 EMP_NO ?QTYX QTY_ORDERED E?QTYX ITEM_TYPE `UU? SALESTATX PAID `UU? SALESTATX ORDER_STATUS `UU?NEEDX DATE_NEEDED E? RDB$FOREIGN26 SALES_REP  RDB$FOREIGN25 CUST_NO  RDB$PRIMARY24 PO_NUMBER ? RDB$INDEX_45 RDB$FUNCTION_NAME  RDB$INDEX_44 RDB$BACKUP_ID  RDB$INDEX_44 RDB$BACKUP_LEVEL x90 ('P 90WFG|<D8ADE/3p*4< I ;t 64 > K TT > K T .L 5 B 1 6X C( . / ;x B4 B *0=LI2E0`=0/+4p|,RDB$FOREIGN26 SALES  RDB$PRIMARY7 ? RDB$INDEX_12 RDB$RELATION_CONSTRAINTS RDB$INDEX_11 RDB$GENERATORS RDB$INDEX_10 RDB$FUNCTION_ARGUMENTS RDB$INDEX_8 RDB$TRIGGERS RDB$INDEX_7 RDB$SECURITY_CLASSES  a?RDB$INDEX_5 RDB$INDICES RDB$INDEX_4 RDB$RELATION_FIELDS  ;s?RDB$INDEX_2 RDB$FIELDS RDB$INDEX_1 RDB$RELATIONS $I?RDB$INDEX_0 RDB$RELATIONS RDB$INDEX_45 RDB$FILTERS RDB$INDEX_44 RDB$BACKUP_HISTORY  ?RDBRDB$INDEX_42 RDB$RELATION_CONSTRAINTS `?RDBRDB$INDEX_40 RDB$CHECK_CONSTRAINTS RDB$INDEX_38 RDB$TRIGGERS RDB$INDEX_37 RDB$TYPES RDB$INDEX_36 RDB$FIELD_DIMENSIONS ERDB$INDEX_35 RDB$TRIGGER_MESSAGES O:RDB$PRIMARY1 COUNTRY  8 MAXSALX JOB D MINSALX JOB `UU?D<RDB$FOREIGN3 JOB RDB$PREL5RDB$PRIMARY2 JOB #CRDB$FOREIGN10 DEPARTMENT RDB$P_CO 3 BUDGETX DEPARTMENT X_ RDB$FOREIGN6 DEPARTMENT  RDB$PRIMARY5 ? RDB$PRIMARY5 DEPARTMENT  a?B 0 RDB$4 DEPARTMENT  . NAMEX EMPLOYERD"ARDB$FOREIGN9 EMPLOYEE RDB$PIO!?RDB$FOREIGN8 EMPLOYEE RDB$PIORDB$PRIMARY7 EMPLOYEE  a? +CUSTREGION CUSTOME_ ) CUSTNAMEX CUSTOMEIN*RDB$FOREIGN23 CUSTOMER RDB$PO'RDB$PRIMARY22 CUSTOMER  % PRODTYPEX PROJECT EX_$ERDB$FOREIGN13 PROJECT RDB$PIO#RDB$PRIMARY12 PROJECT 2  ! RDB$11 PROJECT IN&RDB$FOREIGN16 EMPLOYEE_PROJECT  RDB$PRIMARY12 ?%GRDB$FOREIGN15 EMPLOYEE_PROJECT RDB$PT RDB$PRIMARY14 EMPLOYEE_PROJECT EL(RDB$FOREIGN19 PROJ_DEPT_BUDGET  RDB$PRIMARY12 ?'RDB$FOREIGN18 PROJ_DEPT_BUDGET RDB$PT RDB$PRIMARY17 PROJ_DEPT_BUDGET EL   CHANGEX SALARY_HISTORY UPDATERX SALARY_HISTORY `UU? )RDB$FOREIGN21 SALARY_HISTORY RDB$PSTR RDB$PRIMARY20 SALARY_HISTORY QTYX SALES RD SALESTATX SALES `UU?N NEEDX SALES E?D+RDB$FOREIGN25 SALES RDB$PRTIORDB$PRIMARY24 SALES ?RDB$INDEX_45 RDB$FILTERS RDB$INDEX_44 RDB$BACKUP_HISTORY p90('P 90 112d101236\4(1 4 4 1X 1$ 2 6 5 4L 4 7 8 7\ H J B 4` 7, 3 8 =t =, FB8t989:89P69@ALC525l<487RDB$OBJECT_TYPE PROCEDURE RDB$OBJECT_TYPE VALIDATION RDB$OBJECT_TYPE COMPUTED_FIELD RDB$OBJECT_TYPE TRIGGER RDB$OBJECT_TYPE VIEW RDB$OBJECT_TYPE RELATION RDB$TRIGGER_TYPE  TRANSACTION_ROLLBACK RDB$TRIGGER_TYPE  TRANSACTION_COMMIT RDB$TRIGGER_TYPE  TRANSACTION_START RDB$TRIGGER_TYPE  DISCONNECT RDB$TRIGGER_TYPE CONNECT RDB$TRIGGER_TYPE POST_ERASE RDB$TRIGGER_TYPE PRE_ERASE RDB$TRIGGER_TYPE POST_MODIFY RDB$TRIGGER_TYPE PRE_MODIFY RDB$TRIGGER_TYPE POST_STORE RDB$TRIGGER_TYPE PRE_STORE  RDB$MECHANISM BY_REFERENCE_WITH_NULL  RDB$MECHANISM BY_SCALAR_ARRAY_DESCRIPTOR  RDB$MECHANISM BY_ISC_DESCRIPTOR  RDB$MECHANISM BY_VMS_DESCRIPTOR  RDB$MECHANISM BY_REFERENCE  RDB$MECHANISM BY_VALUE RDB$FUNCTION_TYPE BOOLEAN RDB$FUNCTION_TYPE VALUE RDB$FIELD_SUB_TYPE  DEBUG_INFORMATION RDB$FIELD_SUB_TYPE EXTERNAL_FILE_DESCRIPTION RDB$FIELD_SUB_TYPE TRANSACTION_DESCRIPTION RDB$FIELD_SUB_TYPE FORMAT RDB$FIELD_SUB_TYPE SUMMARY RDB$FIELD_SUB_TYPE RANGES RDB$FIELD_SUB_TYPE ACL RDB$FIELD_SUB_TYPE BLR RDB$FIELD_SUB_TYPE TEXT RDB$FIELD_SUB_TYPE BINARY RDB$FIELD_TYPE INT64 RDB$FIELD_TYPE  TIME RDB$FIELD_TYPE  DATE RDB$FIELD_TYPE -BLOB_ID RDB$FIELD_TYPE (CSTRING RDB$FIELD_TYPE BLOB RDB$FIELD_TYPE %VARYING RDB$FIELD_TYPE #TIMESTAMP RDB$FIELD_TYPE DOUBLE RDB$FIELD_TYPE  FLOAT RDB$FIELD_TYPE  QUAD RDB$FIELD_TYPE LONG RDB$FIELD_TYPE SHORT RDB$FIELD_TYPE TEXT 90 0>7T2 3382H71 9 7d 9$ = ? 1| 4H 1 > D 8P 9 4 8 7` I G 6 ;h ;, ;=+.X5CD=T;<GJP4644x7@86MON$STAT_GROUP STATEMENT MON$STAT_GROUP TRANSACTION MON$STAT_GROUP ATTACHMENT MON$STAT_GROUP DATABASE MON$BACKUP_STATE MERGE MON$BACKUP_STATE STALLED MON$BACKUP_STATE NORMAL MON$ISOLATION_MODE READ_COMMITTED_NO_VERSION MON$ISOLATION_MODE READ_COMMITTED_VERSION MON$ISOLATION_MODE CONCURRENCY MON$ISOLATION_MODE CONSISTENCY MON$SHUTDOWN_MODE FULL_SHUTDOWN MON$SHUTDOWN_MODE SINGLE_USER_SHUTDOWN MON$SHUTDOWN_MODE MULTI_USER_SHUTDOWN MON$SHUTDOWN_MODE ONLINE  MON$STATE ACTIVE  MON$STATE IDLE RDB$PARAMETER_MECHANISM TYPE OF RDB$PARAMETER_MECHANISM NORMAL RDB$PROCEDURE_TYPE EXECUTABLE RDB$PROCEDURE_TYPE SELECTABLE RDB$PROCEDURE_TYPE LEGACY RDB$RELATION_TYPE GLOBAL_TEMPORARY_DELETE RDB$RELATION_TYPE GLOBAL_TEMPORARY_PRESERVE RDB$RELATION_TYPE VIRTUAL RDB$RELATION_TYPE EXTERNAL RDB$RELATION_TYPE VIEW RDB$RELATION_TYPE PERSISTENT RDB$SYSTEM_FLAG VIEW_CHECK RDB$SYSTEM_FLAG REFERENTIAL_CONSTRAINT RDB$SYSTEM_FLAG CHECK_CONSTRAINT RDB$SYSTEM_FLAG QLI RDB$SYSTEM_FLAG SYSTEM RDB$SYSTEM_FLAG USER RDB$TRANSACTION_STATE ROLLED_BACK RDB$TRANSACTION_STATE COMMITTED RDB$TRANSACTION_STATE LIMBO RDB$OBJECT_TYPE COLLATION RDB$OBJECT_TYPE BLOB_FILTER RDB$OBJECT_TYPE UDF RDB$OBJECT_TYPE GENERATOR RDB$OBJECT_TYPE  ROLE RDB$OBJECT_TYPE USER_GROUP RDB$OBJECT_TYPE  INDEX RDB$OBJECT_TYPE  FIELD RDB$OBJECT_TYPE USER RDB$OBJECT_TYPE EXCEPTION RDB$OBJECT_TYPE EXPRESSION_INDEX 90 .18X;;:<h;(@ < =p 94 : > 9x >< 9 ; < ;L < ; < >T > = ; 9\ > >=;`? >>=d;$?>>d=(;?>h>(=?RDB$CHARACTER_SET_NAME #ISO-8859-5 RDB$CHARACTER_SET_NAME #ISO88595 RDB$CHARACTER_SET_NAME #ISO8859_5 RDB$CHARACTER_SET_NAME #ISO8859_5 RDB$CHARACTER_SET_NAME "ISO-8859-4 RDB$CHARACTER_SET_NAME "LATIN4 RDB$CHARACTER_SET_NAME "ISO88594 RDB$CHARACTER_SET_NAME "ISO8859_4 RDB$CHARACTER_SET_NAME "ISO8859_4 RDB$CHARACTER_SET_NAME ISO-8859-3 RDB$CHARACTER_SET_NAME LATIN3 RDB$CHARACTER_SET_NAME ISO88593 RDB$CHARACTER_SET_NAME ISO8859_3 RDB$CHARACTER_SET_NAME ISO8859_3 RDB$CHARACTER_SET_NAME ISO-8859-2 RDB$CHARACTER_SET_NAME LATIN2 RDB$CHARACTER_SET_NAME ISO88592 RDB$CHARACTER_SET_NAME ISO8859_2 RDB$CHARACTER_SET_NAME ISO8859_2 RDB$CHARACTER_SET_NAME ANSI RDB$CHARACTER_SET_NAME LATIN1 RDB$CHARACTER_SET_NAME ISO88591 RDB$CHARACTER_SET_NAME ISO8859_1 RDB$CHARACTER_SET_NAME ISO8859_1 RDB$CHARACTER_SET_NAME DOS_865 RDB$CHARACTER_SET_NAME DOS865 RDB$CHARACTER_SET_NAME DOS_850 RDB$CHARACTER_SET_NAME DOS850 RDB$CHARACTER_SET_NAME DOS_437 RDB$CHARACTER_SET_NAME DOS437 RDB$CHARACTER_SET_NAME EUCJ RDB$CHARACTER_SET_NAME EUCJ_0208 RDB$CHARACTER_SET_NAME SJIS RDB$CHARACTER_SET_NAME SJIS_0208 RDB$CHARACTER_SET_NAME UTF-8 RDB$CHARACTER_SET_NAME UTF8 RDB$CHARACTER_SET_NAME SQL_TEXT RDB$CHARACTER_SET_NAME UTF_FSS RDB$CHARACTER_SET_NAME UNICODE_FSS RDB$CHARACTER_SET_NAME ASCII7 RDB$CHARACTER_SET_NAME USASCII RDB$CHARACTER_SET_NAME ASCII RDB$CHARACTER_SET_NAME BINARY RDB$CHARACTER_SET_NAME OCTETS RDB$CHARACTER_SET_NAME NONE MON$STAT_GROUP CALL 90 .>>@=?>>@=? > >@ = ? > >@ = ; ? ?D ? > ; @L ; < ; <\ ; <;<l;0<9;|<@;<;<P;<;<`;$<;RDB$CHARACTER_SET_NAME 1DOS869 RDB$CHARACTER_SET_NAME 0DOS_866 RDB$CHARACTER_SET_NAME 0DOS866 RDB$CHARACTER_SET_NAME DOS_864 RDB$CHARACTER_SET_NAME DOS864 RDB$CHARACTER_SET_NAME DOS_862 RDB$CHARACTER_SET_NAME DOS862 RDB$CHARACTER_SET_NAME DOS_858 RDB$CHARACTER_SET_NAME DOS858 RDB$CHARACTER_SET_NAME DOS_775 RDB$CHARACTER_SET_NAME DOS775 RDB$CHARACTER_SET_NAME DOS_737 RDB$CHARACTER_SET_NAME DOS737 RDB$CHARACTER_SET_NAME 2CYRL RDB$CHARACTER_SET_NAME DOS_863 RDB$CHARACTER_SET_NAME DOS863 RDB$CHARACTER_SET_NAME /DOS_861 RDB$CHARACTER_SET_NAME /DOS861 RDB$CHARACTER_SET_NAME DOS_860 RDB$CHARACTER_SET_NAME DOS860 RDB$CHARACTER_SET_NAME .DOS_857 RDB$CHARACTER_SET_NAME .DOS857 RDB$CHARACTER_SET_NAME -DOS_852 RDB$CHARACTER_SET_NAME -DOS852 RDB$CHARACTER_SET_NAME (ISO-8859-13 RDB$CHARACTER_SET_NAME (LATIN7 RDB$CHARACTER_SET_NAME (ISO885913 RDB$CHARACTER_SET_NAME (ISO8859_13 RDB$CHARACTER_SET_NAME (ISO8859_13 RDB$CHARACTER_SET_NAME 'ISO-8859-9 RDB$CHARACTER_SET_NAME 'LATIN5 RDB$CHARACTER_SET_NAME 'ISO88599 RDB$CHARACTER_SET_NAME 'ISO8859_9 RDB$CHARACTER_SET_NAME 'ISO8859_9 RDB$CHARACTER_SET_NAME &ISO-8859-8 RDB$CHARACTER_SET_NAME &ISO88598 RDB$CHARACTER_SET_NAME &ISO8859_8 RDB$CHARACTER_SET_NAME &ISO8859_8 RDB$CHARACTER_SET_NAME %ISO-8859-7 RDB$CHARACTER_SET_NAME %ISO88597 RDB$CHARACTER_SET_NAME %ISO8859_7 RDB$CHARACTER_SET_NAME %ISO8859_7 RDB$CHARACTER_SET_NAME $ISO-8859-6 RDB$CHARACTER_SET_NAME $ISO88596 RDB$CHARACTER_SET_NAME $ISO8859_6 RDB$CHARACTER_SET_NAME $ISO8859_6 90 $<<H= <=<P=< = <X = 9 < =d <$ = < =h =, < < <x :< 9 < < <L ; <<:\: <;8p;RDB$CHARACTER_SET_NAME DCP943C RDB$CHARACTER_SET_NAME CGBK RDB$CHARACTER_SET_NAME BTIS620 RDB$CHARACTER_SET_NAME AWIN1258 RDB$CHARACTER_SET_NAME @KOI8U RDB$CHARACTER_SET_NAME ?KOI8R RDB$CHARACTER_SET_NAME 9WIN_936 RDB$CHARACTER_SET_NAME 9DOS_936 RDB$CHARACTER_SET_NAME 9GB2312 RDB$CHARACTER_SET_NAME 9GB_2312 RDB$CHARACTER_SET_NAME 8WIN_950 RDB$CHARACTER_SET_NAME 8DOS_950 RDB$CHARACTER_SET_NAME 8BIG5 RDB$CHARACTER_SET_NAME 8BIG_5 RDB$CHARACTER_SET_NAME ,WIN_949 RDB$CHARACTER_SET_NAME ,DOS_949 RDB$CHARACTER_SET_NAME ,KSC5601 RDB$CHARACTER_SET_NAME ,KSC_5601 RDB$CHARACTER_SET_NAME <WIN_1257 RDB$CHARACTER_SET_NAME <WIN1257 RDB$CHARACTER_SET_NAME ;WIN_1256 RDB$CHARACTER_SET_NAME ;WIN1256 RDB$CHARACTER_SET_NAME :WIN_1255 RDB$CHARACTER_SET_NAME :WIN1255 RDB$CHARACTER_SET_NAME NEXT RDB$CHARACTER_SET_NAME 7WIN_1254 RDB$CHARACTER_SET_NAME 7WIN1254 RDB$CHARACTER_SET_NAME 6WIN_1253 RDB$CHARACTER_SET_NAME 6WIN1253 RDB$CHARACTER_SET_NAME 5WIN_1252 RDB$CHARACTER_SET_NAME 5WIN1252 RDB$CHARACTER_SET_NAME 4WIN_1251 RDB$CHARACTER_SET_NAME 4WIN1251 RDB$CHARACTER_SET_NAME 3WIN_1250 RDB$CHARACTER_SET_NAME 3WIN1250 RDB$CHARACTER_SET_NAME 1DOS_869 903*/t-89 +55l/</ / 5 5d 5, 5 5 5 5L 5 5 7 /| /L / / / + /` /0 / / / /p /< 1 111l1@+ 111p3@- 1--x1H/)/ CP943C CP943C DGBK GBK C TIS620 TIS620 B WIN1258 WIN1258 A KOI8U KOI8U @ KOI8R KOI8R ? GB_2312 GB_2312 9 BIG_5 BIG_5 8 KSC_5601 KSC_5601 , WIN1257 WIN1257 < WIN1256 WIN1256 ; WIN1255 WIN1255 :NEXT NEXT  WIN1254 WIN1254 7 WIN1253 WIN1253 6 WIN1252 WIN1252 5 WIN1251 WIN1251 4 WIN1250 WIN1250 3 DOS869 DOS869 1 DOS866 DOS866 0 DOS864 DOS864  DOS862 DOS862  DOS858 DOS858  DOS775 DOS775  DOS737 DOS737  CYRL CYRL 2 DOS863 DOS863  DOS861 DOS861 / DOS860 DOS860   DOS857 DOS857 . DOS852 DOS852 -ISO8859_13 ISO8859_13 ( ISO8859_9 ISO8859_9 ' ISO8859_8 ISO8859_8 & ISO8859_7 ISO8859_7 % ISO8859_6 ISO8859_6 $ ISO8859_5 ISO8859_5 # ISO8859_4 ISO8859_4 " ISO8859_3 ISO8859_3  ISO8859_2 ISO8859_2  ISO8859_1 ISO8859_1  DOS865 DOS865   DOS850 DOS850   DOS437 DOS437   EUCJ_0208 EUCJ_0208  SJIS_0208 SJIS_0208 UTF8 UTF8 UNICODE_FSS UNICODE_FSS  ASCII ASCII  OCTETS OCTETS NONE NONE 90> $#l)H" (&5'p'L$ ) ( + (| (T (, ( ( ( ( 'd '@ $ ( ( ( (x (P (( ( ( ' ' $` +8 ( ( ' $ $| $X $4 $ $$$$\E0, $$$$|$4E2.<l'H$ & ISO_HUN  CS_CZ  ISO8859_2 `FR_FR_CI_AI FR_FR 9SPECIALS-FIRST=1ES_ES_CI_AI 7'''DISABLE-COMPRESSIONS=1;SPECIALS-FIRST=1 PT_BR  PT_PT  EN_US  EN_UK   SV_SV   ES_ES  0'''DISABLE-COMPRESSIONS=1;SPECIALS-FIRST=1 NO_NO   IT_IT  IS_IS  DE_DE  FR_CA  FR_FR  FI_FI  DU_NL  DA_DA  ISO8859_1  DB_NOR865   DB_DAN865  PDOX_NORDAN4   DOS865   DB_US850   DB_UK850   DB_SVE850   DB_PTB850   DB_NLD850   DB_ITA850   DB_FRA850   DB_ESP850   DB_DEU850   DB_FRC850   DOS850   DB_US437   DB_UK437   DB_SVE437   DB_NLD437   DB_ITA437   DB_FRA437   DB_FIN437   DB_ESP437   DB_DEU437  PDOX_SWEDFIN   PDOX_INTL  PDOX_ASCII   DOS437   EUCJ_0208  SJIS_0208 `UNICODE_CI UNICODE UNICODE  UCS_BASIC UTF8 UNICODE_FSS  ASCII  OCTETS NONE 90>&''`'8''''(t$P$(%% % ' '` '8 ' $ % $ (| $T '0 $ ( " % (p $L $( $ $ $ $ $p %H & ( & ' & $\ %0 + %')%d'8* *'*'h%@(%'"%|& NXT_DEU  NXT_US NEXT  PXW_TURK 7 WIN1254 7 PXW_GREEK 6 WIN1253 6 WIN_PTBR 5PXW_SWEDFIN 5 PXW_SPAN 5PXW_NORDAN4 5PXW_INTL850 5 PXW_INTL 5 WIN1252 5WIN1251_UA 4 PXW_CYRL 4 WIN1251 4WIN_CZ_CI_AI 3 WIN_CZ 3 BS_BA 3 PXW_HUN 3 PXW_SLOV 3 PXW_PLK 3 PXW_HUNDC 3 PXW_CSY 3 WIN1250 3 DOS869 1 DOS866 0 DOS864  DOS862  DOS858  DOS775  DOS737   PDOX_CYRL 2 DB_RUS 2CYRL 2 DB_FRC863  DOS863  PDOX_ISL / DOS861 / DB_PTG860   DOS860   DB_TRK . DOS857 . PDOX_SLO - PDOX_HUN - PDOX_PLK - PDOX_CSY - DB_SLO - DB_PLK - DB_CSY - DOS852 - LT_LT (ISO8859_13 ( ISO8859_9 ' ISO8859_8 & ISO8859_7 % ISO8859_6 $ ISO8859_5 # ISO8859_4 " ISO8859_3  ISO_PLK 90&&&`%8%%)))d&4-# % # 'x #P '( % $ - ! *` $0 - I =`TEST_COLLATE ~3WIN_CZ +++DISABLE-COMPRESSIONS=0;DISABLE-EXPANSIONS=0CP943C_UNICODE D CP943C DGBK_UNICODE CGBK CTIS620_UNICODE B TIS620 B WIN1258 A KOI8U_UA @ KOI8U @ KOI8R_RU ? KOI8R ? GB_2312 9 BIG_5 8KSC_DICTIONARY , KSC_5601 ,WIN1257_LV <WIN1257_LT <WIN1257_EE < WIN1257 < WIN1256 ; WIN1255 : NXT_ESP  NXT_ITA  NXT_FRA 90-&|*L/ */64P2 / 1 / 3T 1$ 0 3 # $ CUST_NO_GEN   EMP_NO_GEN  RDB$BACKUP_HISTORY  Nbackup technologyRDB$TRIGGER_NAME  Implicit trigger nameRDB$INDEX_NAME  Implicit index nameRDB$FIELD_NAME Implicit domain nameRDB$CONSTRAINT_NAME Implicit constraint nameRDB$EXCEPTIONS    Exception IDRDB$PROCEDURES    Procedure ID SQL$DEFAULT RDB$SECURITY_CLASS  90  P90 "Ed-I <I<B</RDB$SYSTEM_FLAGLRDB$TRIGGER_2 RDB$TRIGGERS  /RDB$SYSTEM_FLAGLRDB$TRIGGER_9 RDB$USER_PRIVILEGES  p p p /RDB$OBJECT_TYPE;>>:0RDB$OWNER_NAMERDB$OWNER_NAME0RDB$OWNER_NAMEg,LRDB$TRIGGER_4 RDB$RELATIONS  ***=RDB$OWNER_NAMEg,RDB$OWNER_NAMELRDB$TRIGGER_3 RDB$TRIGGERS  90  MX i J, Jt i0 CbCpD^DRDB$TRIGGER_22 RDB$TRIGGERS  @@@CJRDB$CHECK_CONSTRAINTSJRDB$RELATION_CONSTRAINTSG:/RDB$TRIGGER_NAMERDB$TRIGGER_NAME:/RDB$CONSTRAINT_NAMERDB$CONSTRAINT_NAME/RDB$CONSTRAINT_TYPECHECK;:::::::::.RDB$TRIGGER_NAMERDB$TRIGGER_NAME.RDB$RELATION_NAMERDB$RELATION_NAME.RDB$TRIGGER_SEQUENCERDB$TRIGGER_SEQUENCE.RDB$TRIGGER_TYPERDB$TRIGGER_TYPE.RDB$TRIGGER_BLRRDB$TRIGGER_BLR.RDB$TRIGGER_INACTIVERDB$TRIGGER_INACTIVE.RDB$SYSTEM_FLAGRDB$SYSTEM_FLAG. RDB$FLAGS RDB$FLAGS. RDB$VALID_BLR RDB$VALID_BLR.RDB$DEBUG_INFORDB$DEBUG_INFOLRDB$TRIGGER_21 RDB$TRIGGERS  CJRDB$CHECK_CONSTRAINTSJRDB$RELATION_CONSTRAINTSG:/RDB$TRIGGER_NAMERDB$TRIGGER_NAME:/RDB$CONSTRAINT_NAMERDB$CONSTRAINT_NAME/RDB$CONSTRAINT_TYPECHECKLRDB$TRIGGER_20 RDB$INDICES  DDD>>:0RDB$OWNER_NAMERDB$OWNER_NAME0RDB$OWNER_NAMEg,LRDB$TRIGGER_28 RDB$PROCEDURES  WWW=RDB$OWNER_NAMEg,RDB$OWNER_NAMEeRDB$PROCEDURESRDB$PROCEDURE_IDLRDB$TRIGGER_27 RDB$RELATION_FIELDS  CJRDB$CHECK_CONSTRAINTSJRDB$RELATION_CONSTRAINTSG:/RDB$FIELD_NAMERDB$TRIGGER_NAME:/RDB$CONSTRAINT_NAMERDB$CONSTRAINT_NAME:/RDB$RELATION_NAMERDB$RELATION_NAME/RDB$CONSTRAINT_TYPENOT NULLLRDB$TRIGGER_24 RDB$RELATION_FIELDS  [[[ =t R4 >,  C\CsQPD9MxK<9MKXGjIXGjLLL93PERCENT_CHANGE1PERCENT_CHANGE2check_constraintL)))CHECK (percent_change between -50 and 50) @CHECK_7 SALARY_HISTORY   LLL93PERCENT_CHANGE1PERCENT_CHANGE2check_constraintL)))CHECK (percent_change between -50 and 50) @CHECK_6 PROJ_DEPT_BUDGET   ///3 FISCAL_YEARcheck_constraintLCHECK (FISCAL_YEAR >= 1993) @CHECK_5 PROJ_DEPT_BUDGET   ///3 FISCAL_YEARcheck_constraintLCHECK (FISCAL_YEAR >= 1993)@SET_EMP_NO EMPLOYEE   333=EMP_NOe EMP_NO_GENEMP_NOLUUUAS BEGIN if (new.emp_no is null) then new.emp_no = gen_id(emp_no_gen, 1); END @CHECK_4 EMPLOYEE   93SALARY+CJJOBG::/JOB_CODEJOB_CODE/ JOB_GRADE JOB_GRADE/ JOB_COUNTRY JOB_COUNTRY MIN_SALARY-1SALARY+CJJOBG::/JOB_CODEJOB_CODE/ JOB_GRADE JOB_GRADE/ JOB_COUNTRY JOB_COUNTRY MAX_SALARY-check_constraintLCHECK ( salary >= (SELECT min_salary FROM job WHERE job.job_code = employee.job_code AND job.job_grade = employee.job_grade AND job.job_country = employee.job_country) AND salary <= (SELECT max_salary FROM job WHERE job.job_code = employee.job_code AND job.job_grade = employee.job_grade AND job.job_country = employee.job_country)) @CHECK_3 EMPLOYEE   93SALARY+CJJOBG::/JOB_CODEJOB_CODE/ JOB_GRADE JOB_GRADE/ JOB_COUNTRY JOB_COUNTRY MIN_SALARY-1SALARY+CJJOBG::/JOB_CODEJOB_CODE/ JOB_GRADE JOB_GRADE/ JOB_COUNTRY JOB_COUNTRY MAX_SALARY-check_constraintLCHECK ( salary >= (SELECT min_salary FROM job WHERE job.job_code = employee.job_code AND job.job_grade = employee.job_grade AND job.job_country = employee.job_country) AND salary <= (SELECT max_salary FROM job WHERE job.job_code = employee.job_code AND job.job_grade = employee.job_grade AND job.job_country = employee.job_country)) @CHECK_2 JOB   4442 MIN_SALARY MAX_SALARYcheck_constraintLCHECK (min_salary < max_salary) @CHECK_1 JOB   4442 MIN_SALARY MAX_SALARYcheck_constraintLCHECK (min_salary < max_salary)RDB$TRIGGER_36 RDB$FIELDS  ;:/RDB$FIELD_LENGTHRDB$FIELD_LENGTH:/RDB$FIELD_TYPERDB$FIELD_TYPE:/RDB$COLLATION_IDRDB$COLLATION_ID/RDB$CHARACTER_SET_IDRDB$CHARACTER_SET_ID6'h6<*6+6t*<6 - 6 *X * + &1 ++P -1$ +# +1 ++ *,1t ++@ 3d1 +8+ 3 , 1T ,( + , ( ,l ,D % ,%SQL$T  SYSDBAn SQ- SQL$DEFAULT4  SQ.EC,UL<EM1IS"DE &$*(2:864SYSDBA-SQL$T4  :DESYSDBA- SQL$DEFAULT15  /SYSDBA-SQL$T3  .SYSDBA- SQL$DEFAULT14  -SYSDBA-SQL$T  ,SYSDBA- SQL$DEFAULT13  1SYSDBA  - SQL$SALES  0 SQL$DEFAULT23  "QSYSDBASQL$T  YSYSDBATOM  SQL$DEFAULT22  SYSDBASQL$T   SYSDBASQ6 ORY SQL$DEFAULT21   SYSDBA SQSQL$T  ASYSDBAy SQ SQL$DEFAULT20  ASYSDBA-SQL$T4  :DE- SQL$DEFAULT15  /-SQL$T3  .- SQL$DEFAULT14  -n SQ- SQL$DEFAULT13  1- SQL$SALES  0- SQL$DEFAULT12  - SQL$CUSTOMER  - SQL$DEFAULT11  3-SQL$SALARY_HISTORY  2- SQL$DEFAULT10  5-SQL$PROJ_DEPT_BUDGET  4Q- SQL$DEFAULT9  7-SQL$EMPLOYEE_PROJECT  6- SQL$DEFAULT8  9- SQL$PROJECT  8- SQL$DEFAULT7  - SQL$EMPLOYEE   - SQL$DEFAULT6  -SQL$DEPARTMENT  - SQL$DEFAULT5  -SQL$JOB  SQL$T  - SQL$DEFAULT4  SYSDBA- SQL$COUNTRY  -SQL$T  , SQL$DEFAULT3   SYSDBASQL$RDB$FORMATS  SYSDBA SQL$DEFAULT2  SYSDBA SQL$RDB$PAGES  SYSDBA SQL$DEFAULT1  SYSDBA SQL$RDB$ROLES  SYSDBA90|90 :**|*P*$**&&&T*,&+ &7 &\ *4 & * * + +X +, + & * + *T *( * * & & *T *( * * * *x *L *$ &***t*H**,'/h/41,00x/'('6: pRDB$686  pRDB$31  pRDB$539  pRDB$682 pRDB$6  pRDB$665   pRDB$664   pRDB$491 P pRDB$485 P pRDB$484 (%  pRDB$483 (  pRDB$482  pRDB$481 P pRDB$64 % pRDB$63 % pRDB$62 % pRDB$61 % pRDB$60 % pRDB$59 % pRDB$58  pRDB$57 % pRDB$56  pRDB$55 (( pRDB$54 (( pRDB$53 (( pRDB$52 (( pRDB$51 (( pRDB$50 (( pRDB$49  pRDB$48  pRDB$47  pRDB$46  pRDB$45  pRDB$44  pRDB$43   pRDB$42  pRDB$41  pRDB$40   pRDB$39   pRDB$38   pRDB$37   pRDB$36  pRDB$35  pRDB$34  pRDB$33  pRDB$32  pRDB$31  pRDB$30   pRDB$29   pRDB$28  pRDB$27  pRDB$26 # pRDB$25 # pRDB$24 # pRDB$23 % pRDB$22  pRDB$21  %  pRDB$20 % pRDB$19 % pRDB$18 %90;//t+H+////`'8'' + + 'h '@ ' - , , 'h '< , , ' + /\ /0 + + 0 0x +L + + + 6 :0 NU?TC=,W(gH9t/H, ;35p0<2,;*@hP22299/000:104999=LJJJCHECK (VALUE = '000' OR (VALUE > '0' AND VALUE <= '999') OR VALUE IS NULL)   /gLCHECK (VALUE = UPPER (VALUE))1LCHECK (VALUE > 1000)199999LCHECK (VALUE > '99999')8LCHECK (VALUE BETWEEN 0 AND 6)1LCHECK (VALUE > 0):1'4L***CHECK (VALUE > 10000 AND VALUE <= 2000000)III999/software/hardware/other/N/AL999CHECK (VALUE IN ('software', 'hardware', 'other', 'N/A'))7VLCHECK (VALUE STARTING WITH 'V')%%%'' LAST_NAME,  FIRST_NAMEL!!!(last_name || ', ' || first_name)777" OLD_SALARY%$ OLD_SALARYPERCENT_CHANGEdL000(old_salary + old_salary * percent_change / 100)# SHIP_DATE ORDER_DATEL(ship_date - order_date) pRDB$661  pRDB$660   pRDB$659  pRDB$658  pRDB$657   pRDB$656   pRDB$655   pRDB$654 # pRDB$653  pRDB$652 % pRDB$651  pRDB$650  pRDB$135  pRDB$134  pRDB$133  pRDB$132   pRDB$131  pRDB$130  pRDB$129 P pRDB$128 # pRDB$127   pRDB$126   pRDB$125  %  pRDB$124  pRDB$123  pRDB$122  pRDB$121  pRDB$547 x% pRDB$546  pRDB$545 %3 pRDB$544 3 pRDB$543 % pRDB$542  pRDB$541 % pRDB$540 90#$%h%D$%$(!(\%4% % % % %l %D % %RDB$661 RDB$660 RDB$659 RDB$658 RDB$657 RDB$656 RDB$655 RDB$654 RDB$653 RDB$652 RDB$652 RDB$651 RDB$651 RDB$651 RDB$6 RDB$665 RDB$664 RDB$13 RDB$4 90 ::L::::D:: :x :$ : :SYSDBA   SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  p90gf sPHONE_RDB$CHARACTER_LENGTHRDB$Fz DESCRIPTIONRDB$FC(MON$STAT_GROUPMON$RECORD_STATS; IDMON$ATTACHMENTS< CALL_STACK5 DATABASEC IO_STATS CRECORD_STATS< STATEMENTS <TRANSACTIONS4!WEEP_INTERVALMON$DATABASE;!TIMESTAMPMON$ATTACHMENTS< CALL_STACK< STATEMENTS<TRANSACTIONS<&OP_TRANSACTIONMON$TRANSACTIONS<$RANSACTION_IDMON$STATEMENTS;TRANSACTIONS 5USERMON$ATTACHMENTSR NEW_SALARYSALARY_HISTORY R OLD_SALARYSALARY_HISTORY KN_HOLDCUSTOMERRRDER_DATESALESSSTATUSSALESS PAIDSALES R$ERCENT_CHANGESALARY_HISTORYDHONE_EXTEMPLOYEEJ PHONE_LISTK NOCUSTOMERD DEPARTMENTJ PHONE_LISTKOSTAL_CODECUSTOMERR_NUMBERSALESKRODUCTPROJECTK$JECTED_BUDGETPROJ_DEPT_BUDGETK_DESCPROJECTKIDEMPLOYEE_PROJECTK PROJECTR_DEPT_BUDGETKNAMEPROJECTRQTY_ORDEREDSALESL&UART_HEAD_CNTPROJ_DEPT_BUDGET"RDB$ACLRDB$SECURITY_CLASSES 3RGUMENT_POSITIONRDB$FUNCTION_ARGUMENTS4%BACKUP_IDRDB$BACKUP_HISTORY4LEVELRDB$BACKUP_HISTORY-(SE_COLLATION_NAMERDB$COLLATIONS FIELDRDB$RELATION_FIELDS -.YTES_PER_CHARACTERRDB$CHARACTER_SETS CHARACTER_LENGTHRDB$FIELDS UNCTION_ARGUMENTS -SET_IDRDB$CHARACTER_SETS- OLLATIONSFIELDS UNCTION_ARGUMENTS-NAMERDB$CHARACTER_SETS$ DATABASE-)OLLATION_ATTRIBUTESRDB$COLLATIONS-IDRDB$COLLATIONSFIELDS-PROCEDURE_PARAMETERSRELATION_FIELDS-NAMERDB$COLLATIONS$MPLEX_NAMERDB$RELATION_FIELDS UTED_BLRRDB$FIELDS SOURCERDB$FIELDS%,NSTRAINT_NAMERDB$CHECK_CONSTRAINTS%REF_CONSTRAINTS %!LATION_CONSTRAINTS %$TYPERDB$RELATION_CONSTRAINTS% %_NAME_UQRDB$REF_CONSTRAINTS "TEXT_NAMERDB$VIEW_RELATIONSDBKEY_LENGTHRDB$RELATIONS &EBUG_INFORDB$PROCEDURES TRIGGERS"FAULT_CLASSRDB$RELATIONS-$OLLATE_NAMERDB$CHARACTER_SETSSOURCERDB$FIELDS-PROCEDURE_PARAMETERSRELATION_FIELDSVALUERDB$FIELDS-PROCEDURE_PARAMETERS RELATION_FIELDS% )ERRABLERDB$RELATION_CONSTRAINTS%$LETE_RULERDB$REF_CONSTRAINTS%PENDED_ON_NAMERDB$DEPENDENCIESTYPERDB$DEPENDENCIESNT_NAMERDB$DEPENDENCIESTYPERDB$DEPENDENCIES -#SCRIPTIONRDB$CHARACTER_SETS- OLLATIONS DATABASE- EXCEPTIONSFIELDSLTERS UNCTIONS GENERATORSINDICESB& PROCEDURES90 -<xJ4CAGPOMPlD KS FH H = A C< D ! * OX B D : FL B 879h78/7:7P9<>?PB`<AIL8LIIFIRST_NAME PHONE_LIST FIRSTNAME FIRST_NAME $ LOCATION PHONE_LIST RDB$6 LOCATION  EMP_NO PHONE_LIST EMPNO EMP_NO  LAST_NAME PHONE_LIST LASTNAME LAST_NAME  PHONE_EXT PHONE_LIST RDB$7 PHONE_EXT   PHONE_NO PHONE_LIST PHONENUMBER PHONE_NO  DEPT_NO PROJ_DEPT_BUDGET DEPTNO FISCAL_YEAR PROJ_DEPT_BUDGET RDB$12 QUART_HEAD_CNT PROJ_DEPT_BUDGET RDB$13 PROJECTED_BUDGET PROJ_DEPT_BUDGET BUDGET  PROJ_ID EMPLOYEE_PROJECT PROJNO DB$ EMP_NO EMPLOYEE_PROJECT EMPNO R  PROJ_ID PROJECT PROJNO  DEPT_NO PROJ_DEPT_BUDGET DEPTNO FISCAL_YEAR PROJ_DEPT_BUDGET RDB$12 QUART_HEAD_CNT PROJ_DEPT_BUDGET RDB$13 PROJECTED_BUDGET PROJ_DEPT_BUDGET BUDGET  PROJ_ID EMPLOYEE_PROJECT PROJNO  EMP_NO EMPLOYEE_PROJECT EMPNO  PROJ_NAME PROJECT RDB$10  CTEAM_LEADER PROJECT EMPNO R PRODUCT PROJECT PRODTYPE CO PROJ_DESC PROJECT RDB$11  C_OCTETS T4 RDB$540  C_NONE T4 RDB$542  C_WIN1250 T4 RDB$544  V_UTF8 T4 RDB$547  C1 T4 RDB$539 D C_UTF8 T4 RDB$546  V_OCTETS T4 RDB$541  V_NONE T4 RDB$543  V_WIN1250 T4 RDB$545  CUSTOMER CUSTOMER RDB$18  PLCONTACT_FIRST CUSTOMER FIRSTNAME  EMCITY CUSTOMER RDB$19  OJSTATE_PROVINCE CUSTOMER RDB$20  COUNTRY CUSTOMER COUNTRYNAME   ON_HOLD CUSTOMER RDB$22  g h   DEFAULT NULL-LCONTACT_LAST CUSTOMER LASTNAME  PHONE_NO CUSTOMER PHONENUMBER POSTAL_CODE CUSTOMER RDB$21   CUST_NO CUSTOMER CUSTNO ADDRESS_LINE1 CUSTOMER ADDRESSLINE ADDRESS_LINE2 CUSTOMER ADDRESSLINE FIRST_NAME PHONE_LIST FIRSTNAME FIRST_NAME  LOCATION PHONE_LIST RDB$6 LOCATION  EMP_NO PHONE_LIST EMPNO EMP_NO  LAST_NAME PHONE_LIST LASTNAME LAST_NAME  PHONE_EXT PHONE_LIST RDB$7 PHONE_EXT  PHONE_NO PHONE_LIST PHONENUMBER PHONE_NO FIRST_NAME EMPLOYEE FIRSTNAME   DEPT_NO EMPLOYEE DEPTNO   JOB_CODE EMPLOYEE JOBCODE JOB_COUNTRY EMPLOYEE COUNTRYNAME  FULL_NAME EMPLOYEE RDB$9  90u$aUl^ p q m [d U U US4& \n^T SYSDBA n  2U CURRENCY ;=LCOUNTRY ;=L TR_MULTIE_PHONE_LIST SQL$PHONE_LIST SYSDBA SQL$DEFAULT19  CUSTOMER SQL$CUSTOMER SYSDBA SQL$DEFAULT12  gC13C11C10C9C8C3C16C15C14 C12 C7 C6 C5 C2C1C4TC1 C4C2C5C1C3;PROJ_DEPT_BUDGET SQL$PROJ_DEPT_BUDGET SYSDBA SQL$DEFAULT10 C1ARYSADDRESS_LINE2ADDRESS_LINE1CUST_NO1L ;=L POSTAL_CODE PHONE_NO CONTACT_LASTON_HOLDT SQL$T SYSDBA SQL$DEFAULT23 CTT SQL$T SYSDBA  C1\T SQL$T SYSDBA \T SQL$T SYSDBA ^T SYSDBA ^T SYSDBA  9/6T SQL$T SYSDBA SQL$DEFAULT22 6TT SQL$T SYSDBA C12C1C_6\T SQL$T SYSDBA 6\T SQL$T SYSDBA 6^T SYSDBA 6^T SYSDBA 6 LyT SQL$T SYSDBA SQL$DEFAULT21 yTT SQL$T SYSDBA U;=C1;=y\T SQL$T SYSDBA y\T SQL$T SYSDBA y^T SYSDBA y^T SYSDBA y nT SQL$T SYSDBA SQL$DEFAULT20 CnTT SQL$T SYSDBA L C1IDn\T SQL$T SYSDBA n\T SQL$T SYSDBA n^T SYSDBA C1 2U CURRENCY ;=LCOUNTRY ;=L TR_MULTI-T SQL$T SYSDBA SQL$DEFAULT14 Q-AR SQL$AR SYSDBA SQL$DEFAULT17 -T2 SQL$T2 SYSDBA SQL$DEFAULT18 E_n -T3 SQL$T3 SYSDBA SQL$DEFAULT15 -  SALES SQL$SALES SYSDBA SQL$DEFAULT13 -SALARY_HISTORY SQL$SALARY_HISTORY SYSDBA SQL$DEFAULT11 -PROJ_DEPT_BUDGET SQL$PROJ_DEPT_BUDGET SYSDBA SQL$DEFAULT10 -EMPLOYEE_PROJECT SQL$EMPLOYEE_PROJECT SYSDBA SQL$DEFAULT9 - PROJECT SQL$PROJECT SYSDBA SQL$DEFAULT8 - T4 SQL$T4 SYSDBA SQL$DEFAULT16 - CUSTOMER SQL$CUSTOMER SYSDBA SQL$DEFAULT12 -PHONE_LIST SQL$PHONE_LIST SYSDBA SQL$DEFAULT19 PH90:6 PHONE_LIST EMPLOYEE EMPLOYEE  PHONE_LIST DEPARTMENT DEPARTMENT 90 5It@L'$'`xJL) + ]t J0 A 1 > <T )( + S >l 'D ' Q B '\ ' T > >L ;$ ')I)T+U13`30/3,2443\3(3444X4$333 PO_NUMBER SALES POC1 T RDB$682 C3 T3 RDB$484 C1 T3 RDB$482 n5C5 T2 RDB$125  C6 T2 RDB$126  C7 T2 RDB$127  C12 T2 RDB$132   C14 T2 RDB$134  C15 T2 RDB$135 C16 T2 RDB$481 C3 T2 RDB$123 C8 T2 RDB$128 TC9 T2 RDB$129 EC10 T2 RDB$130  C11 T2 RDB$131  C13 T2 RDB$133  ALC5 T2 RDB$125 C6 T2 RDB$126 C7 T2 RDB$127 C12 T2 RDB$132  C14 T2 RDB$134  C15 T2 RDB$135 C16 T2 RDB$481 C3 T2 RDB$123 C8 T2 RDB$128 C9 T2 RDB$129 C10 T2 RDB$130  C11 T2 RDB$131  C1 T RDB$682 C3 T3 RDB$484 C1 T3 RDB$482 C5 T3 RDB$491 EC2 T3 RDB$483 C4 T3 RDB$485  ORDER_STATUS SALES RDB$23  d e LAR   DEFAULT 'new'   newLPAID SALES RDB$27  a b ALA   DEFAULT 'n'   nL SALES_REP SALES EMPNO   ITEM_TYPE SALES PRODTYPE    CUST_NO SALES CUSTNO  QTY_ORDERED SALES RDB$28 [ \   DEFAULT 1   LTOTAL_VALUE SALES RDB$29  ET DISCOUNT SALES RDB$30  W X   DEFAULT 0   L PO_NUMBER SALES PONUMBER ORDER_DATE SALES RDB$24 S T   DEFAULT 'NOW'   NOWL SHIP_DATE SALES RDB$25 DATE_NEEDED SALES RDB$26 AGED SALES RDB$31   EMP_NO SALARY_HISTORY EMPNO UPDATER_ID SALARY_HISTORY RDB$15 CHANGE_DATE SALARY_HISTORY RDB$14 K L   DEFAULT 'NOW'   NOWLOLD_SALARY SALARY_HISTORY SALARY PERCENT_CHANGE SALARY_HISTORY RDB$16 G H   DEFAULT 0   LNEW_SALARY SALARY_HISTORY RDB$17  PROJ_ID PROJ_DEPT_BUDGET PROJNO 90 , 3 / 3 2` 4, 3 3 3 3\ 4( 4 4 3 3\ /( 3330,C1 T RDB$686 C1 T RDB$686 6C1 T RDB$685 6C1 T RDB$685 6yC1 T RDB$684 yC1 T RDB$684 ynC1 T RDB$683 nC1 T RDB$683 C3 AR RDB$652 C4 AR RDB$653  C9 AR RDB$658  C1 AR RDB$650  C2 AR RDB$651  C6 AR RDB$655  C11 AR RDB$660  C13 AR RDB$664  C14 AR RDB$665  C15 AR RDB$6 C5 AR RDB$654 C7 AR RDB$656 C8 AR RDB$657 C10 AR RDB$659  C12 AR RDB$661  C4 T2 RDB$124 C1 T2 RDB$121 C2 T2 RDB$122  C3 AR RDB$652 C4 AR RDB$653 C9 AR RDB$658 C1 AR RDB$650 C2 AR RDB$651 C6 AR RDB$655 C11 AR RDB$660  C13 AR RDB$664  C14 AR RDB$665  C15 AR RDB$6 C5 AR RDB$654 C7 AR RDB$656 C8 AR RDB$657 C10 AR RDB$659  C12 AR RDB$661  C4 T2 RDB$124 C1 T2 RDB$121 C2 T2 RDB$122 90 D|S U, gT X[0H[@-GET_EMP_PROJ SQL$GET_EMP_PROJ SYSDBA -ADD_EMP_PROJ SQL$ADD_EMP_PROJ SYSDBA -SUB_TOT_BUDGET SQL$SUB_TOT_BUDGET SYSDBA -DELETE_EMPLOYEE   SQL$DELETE_EMPLOYEE SYSDBA  ----CJ DEPARTMENTG/DEPT_NO)BUDGETCOCJ DEPARTMENTG/ HEAD_DEPT)NM]BUDGET/)CJ DEPARTMENTG/ HEAD_DEPT)DEPT_NOx DEPT_BUDGET"))LDELETE_EMPLOYEE   SQL$DELETE_EMPLOYEE SYSDBA DECLARE VARIABLE any_sales INTEGER; BEGIN any_sales = 0; /* * If there are any sales records referencing this employee, * can't delete the employee until the sales are re-assigned * to another employee or changed to NULL. */ SELECT count(po_number) FROM sales WHERE sales_rep = :emp_num INTO :any_sales; IF (any_sales > 0) THEN BEGIN EXCEPTION reassign_sales; SUSPEND; END /* * If the employee is a manager, update the department. */ UPDATE department SET mngr_no = NULL WHERE mngr_no = :emp_num; /* * If the employee is a project leader, update project. */ UPDATE project SET team_leader = NULL WHERE team_leader = :emp_num; /* * Delete the employee from any projects. */ DELETE FROM employee_project WHERE emp_no = :emp_num; /* * Delete old salary records. */ DELETE FROM salary_history WHERE emp_no = :emp_num; /* * Delete the employee. */ DELETE FROM employee WHERE emp_no = :emp_num; SUSPEND; END -COCJSALESG/ SALES_REP)NM] PO_NUMBER1REASSIGN_SALESCJ DEPARTMENTG/MNGR_NO) -MNGR_NOCJPROJECTG/ TEAM_LEADER) - TEAM_LEADERCJEMPLOYEE_PROJECTG/EMP_NO)CJSALARY_HISTORYG/EMP_NO)CJEMPLOYEEG/EMP_NO)LSUB_TOT_BUDGET SQL$SUB_TOT_BUDGET SYSDBA BEGIN SELECT SUM(budget), AVG(budget), MIN(budget), MAX(budget) FROM department WHERE head_dept = :head_dept INTO :tot_budget, :avg_budget, :min_budget, :max_budget; SUSPEND; ENDIII  ----COCJ DEPARTMENTG/ HEAD_DEPT)NMTBUDGETUBUDGETWBUDGETVBUDGET))))))))LADD_EMP_PROJ SQL$ADD_EMP_PROJ SYSDBA BEGIN BEGIN INSERT INTO employee_project (emp_no, proj_id) VALUES (:emp_no, :proj_id); WHEN SQLCODE -530 DO EXCEPTION unknown_emp_id; END SUSPEND; END JEMPLOYEE_PROJECT)EMP_NO)PROJ_IDUNKNOWN_EMP_IDLGET_EMP_PROJ SQL$GET_EMP_PROJ SYSDBA mmmBEGIN FOR SELECT proj_id FROM employee_project WHERE emp_no = :emp_no INTO :proj_id DO SUSPEND; END -CJEMPLOYEE_PROJECTG/EMP_NO)PROJ_ID))L90!69T69;>\>> > :l 28 4 8 9 8X 4 6 5 5x 5@ 5 5 5 5d 40 2 5 3 9T 3 463LANG ALL_LANGS RDB$64  COUNTRY ALL_LANGS RDB$63  GRADE ALL_LANGS RDB$62 CODE ALL_LANGS RDB$61  LANGUAGES SHOW_LANGS RDB$60 CTY SHOW_LANGS RDB$59  GRADE SHOW_LANGS RDB$58 CODE SHOW_LANGS RDB$57  PO_NUM SHIP_ORDER RDB$56  LINE6 MAIL_LABEL RDB$55  LINE5 MAIL_LABEL RDB$54  LINE4 MAIL_LABEL RDB$53  LINE3 MAIL_LABEL RDB$52  LINE2 MAIL_LABEL RDB$51  LINE1 MAIL_LABEL RDB$50  CUST_NO MAIL_LABEL RDB$49  EMP_CNT ORG_CHART RDB$48  TITLE ORG_CHART RDB$47  MNGR_NAME ORG_CHART RDB$46 DEPARTMENT ORG_CHART RDB$45  HEAD_DEPT ORG_CHART RDB$44 TOT DEPT_BUDGET RDB$43 DNO DEPT_BUDGET RDB$42  EMP_NUM DELETE_EMPLOYEE RDB$41 MAX_BUDGET SUB_TOT_BUDGET RDB$40 MIN_BUDGET SUB_TOT_BUDGET RDB$39 AVG_BUDGET SUB_TOT_BUDGET RDB$38 TOT_BUDGET SUB_TOT_BUDGET RDB$37  HEAD_DEPT SUB_TOT_BUDGET RDB$36  PROJ_ID ADD_EMP_PROJ RDB$35  EMP_NO ADD_EMP_PROJ RDB$34  PROJ_ID GET_EMP_PROJ RDB$33  EMP_NO GET_EMP_PROJ RDB$32 90UL ]gQ-DEPT_BUDGET  SQL$DEPT_BUDGET SYSDBA - ORG_CHART  SQL$ORG_CHART SYSDBA {{{ (((((( (-(-(-(-(-(-&-&-&- &-  &-  &-  &-  &- & --CJCUSTOMERG/CUST_NO)CUSTOMER CONTACT_FIRST CONTACT_LAST ADDRESS_LINE1  ADDRESS_LINE2 CITY STATE_PROVINCE COUNTRY  POSTAL_CODE;=;='' ;=  ;=  / USA;= '''' ,   ''  ;= '' ,   ''  ))))) )  ))))) )  L ORG_CHART  SQL$ORG_CHART SYSDBA GDECLARE VARIABLE mngr_no INTEGER; DECLARE VARIABLE dno CHAR(3); BEGIN FOR SELECT h.department, d.department, d.mngr_no, d.dept_no FROM department d LEFT OUTER JOIN department h ON d.head_dept = h.dept_no ORDER BY d.dept_no INTO :head_dept, :department, :mngr_no, :dno DO BEGIN IF (:mngr_no IS NULL) THEN BEGIN mngr_name = '--TBH--'; title = ''; END ELSE SELECT full_name, job_code FROM employee WHERE emp_no = :mngr_no INTO :mngr_name, :title; SELECT COUNT(emp_no) FROGM employee WHERE dept_no = :dno INTO :emp_cnt; SUSPEND; END END??? -------Cw DEPARTMENTD DEPARTMENTHPG/ HEAD_DEPTDEPT_NOFHDEPT_NO DEPARTMENT DEPARTMENTMNGR_NODEPT_NO=--TBH--CJEMPLOYEEG/EMP_NO FULL_NAMEJOB_CODECOCJEMPLOYEEG/DEPT_NONM]EMP_NO)))))  )))))  LDEPT_BUDGET  SQL$DEPT_BUDGET SYSDBA DECLARE VARIABLE sumb DECIMAL(12, 2); DECLARE VARIABLE rdno CHAR(3); DECLARE VARIABLE cnt INTEGER; BEGIN tot = 0; SELECT budget FROM department WHERE dept_no = :dno INTO :tot; SELECT count(budget) FROM department WHERE head_dept = :dno INTO :cnt; IF (cnt = 0) THEN SUSPEND; FOR SELECT dept_no FROM department WHERE head_dept = :dno INTO :rdno DO BEGIN EXECUTE PROCEDURE dept_budget :rdno RETURNING_VALUES :sumb; tot = tot + sumb; END SUSPEND; END90 =SDy(QZ-MAIL_LABEL SQL$MAIL_LABEL SYSDBA -SHIP_ORDER SQL$SHIP_ORDER SYSDBA <<<&&& &-- 4CJJOBG:::/JOB_CODE)/ JOB_GRADE)/ JOB_COUNTRY);= LANGUAGE_REQk LANGUAGE_REQ/ NULL"))LSHIP_ORDER SQL$SHIP_ORDER SYSDBA WDECLARE VARIABLE ord_stat CHAR(7); DECLARE VARIABLE hold_stat CHAR(1); DECLARE VARIABLE cust_no INTEGER; DECLARE VARIABLE any_po CHAR(8); BEGIN SELECT s.order_status, c.on_hold, c.cust_no FROM sales s, customer c WHERE po_number = :po_num AND s.cust_no = c.cust_no INTO :ord_stat, :hold_stat, :cust_no; /* This purchase order has been already shipped. */ IF (ord_stat = 'shipped') THEN BEGIN EXCEPTION order_already_shipped; SUSPEND; END /* Customer is on hold. */ ELSE IF (hold_stat = '*') THEN BEGIN EXCEPTION customer_on_hold; SUSPEND; END /* * If there is an unpaid balance on orders shipped over 2 months ago, * put the customer on hold. */ FOR SELECT po_number FROM sales WHERE cust_no = :cust_no AND order_status = 'shipped' AND paid = 'n' AND ship_date < CAST('NOW' AS TIMESTAMP) - 60 INTO :any_po DO BEGIN EXCEPTION customer_check; UPDATE customer SET on_hold = '*' WHERE cust_no = :cust_no; SUSPEND; END /* * Ship the order. */ UPDATE sales SETW order_status = 'shipped', ship_date = 'NOW' WHERE po_number = :po_num; SUSPEND; END ----CSALESSCUSTOMERCG:/ PO_NUMBER)/CUST_NOCUST_NO ORDER_STATUSON_HOLDCUST_NO/shippedORDER_ALREADY_SHIPPED/*CUSTOMER_ON_HOLDCJSALESG:::/CUST_NO/ ORDER_STATUSshipped/PAIDn3 SHIP_DATE##NOW< PO_NUMBERCUSTOMER_CHECKCJCUSTOMERG/CUST_NO *ON_HOLDCJSALESG/ PO_NUMBER) shipped ORDER_STATUSNOW SHIP_DATELMAIL_LABEL SQL$MAIL_LABEL SYSDBA DECLARE VARIABLE customer VARCHAR(25); DECLARE VARIABLE first_name VARCHAR(15); DECLARE VARIABLE last_name VARCHAR(20); DECLARE VARIABLE addr1 VARCHAR(30); DECLARE VARIABLE addr2 VARCHAR(30); DECLARE VARIABLE city VARCHAR(25); DECLARE VARIABLE state VARCHAR(15); DECLARE VARIABLE country VARCHAR(15); DECLARE VARIABLE postcode VARCHAR(12); DECLARE VARIABLE cnt INTEGER; BEGIN line1 = ''; line2 = ''; line3 = ''; line4 = ''; line5 = ''; line6 = ''; SELECT customer, contact_first, contact_last, address_line1, address_line2, city, state_province, country, postal_code FROM CUSTOMER WHERE cust_no = :cust_no INTO :customer, :first_name, :last_name, :addr1, :addr2, :city, :state, :country, :postcode; IF (customer IS NOT NULL) THEN line1 = customer; IF (first_name IS NOT NULL) THEN line2 = first_name || ' ' || last_name; ELSE line2 = last_name; IF (addr1 IS NOT NULL) THEN line3 = addr1; IF (addr2 IS NOT NULL) THEN line4 = addr2; IF (country = 'USA') THEN BEGIN IF (city IS NOT NULL) THEN line5 = city || ', ' || state || ' ' || postcode; ELSE line5 = state || ' ' || postcode; END ELSE BEGIN IF (city IS NOT NULL) THEN line5 = city || ', ' || state; ELSE line5 = state; line6 = country || ' ' || postcode; END SUSPEND; END90XH S t  Q-SHOW_LANGS  SQL$SHOW_LANGS SYSDBA - ALL_LANGS  SQL$ALL_LANGS SYSDBA  ALL_LANGS  SQL$ALL_LANGS SYSDBA BEGIN FOR SELECT job_code, job_grade, job_country FROM job INTO :code, :grade, :country DO BEGIN FOR SELECT languages FROM show_langs (:code, :grade, :country) INTO :lang DO SUSPEND; /* Put nice separators between rows */ code = '====='; grade = '====='; country = '==============='; lang = '=============='; SUSPEND; END END &&&&&-&-&-&-CJJOBJOB_CODE JOB_GRADE JOB_COUNTRYC| SHOW_LANGS LANGUAGES))))=======================================))))))))LSHOW_LANGS  SQL$SHOW_LANGS SYSDBA DECLARE VARIABLE i INTEGER; BEGIN i = 1; WHILE (i <= 5) DO BEGIN SELECT language_req[:i] FROM joB WHERE ((job_code = :code) AND (job_grade = :grade) AND (job_country = :cty) AND (language_req IS NOT NULL)) INTO :languages; IF (languages = ' ') THEN /* Prints 'NULL' instead of blanks */ languages = 'NULL'; i = i +1; SUSPEND; END END90`,s[xUZCUSTOMER_CHECK " Overdue balance -- can not ship.CUSTOMER_ON_HOLD This customer is on hold.ORDER_ALREADY_SHIPPED Order status is "shipped."REASSIGN_SALES ;9Reassign the sales records before deleting this employee.UNKNOWN_EMP_ID (&Invalid employee number or project id.9090%I=%I=9090 !=*=ى=%I>%I>%I>ى=%I>*=%I=1 C=!=9090 1 C=1 C=%I=> 9c=9c=>%I=1 C=1 C=9090 1 <1 <6W= &=ى=9c=&= 6W=< 1 <1 <9090 ===.=.=.= = ==90tX< x\@      90 909090 *>*>*> *>*>>*>*>*>9090%I= .:= L>L>.:=.:=%I=9090*=9=L>L>9=>9=*=9090 /<>>><><>>></</<9090 ><.:=*>.:==> >= >.:= > *>.:=><90 9090 9090M9090 9090 &6,~ rx  X 8  Z  6d  Z  f`  ( Z *`f@|f8   &      &   $ ( , 0 48FH J"HHH   6  6'8JQTHHH 68J (08@HPX `hpx  (08 @ D HLP T `df   <<<(8 @*D ( 0 4 8 <@NP RHHH   (><<<  <<< 6 lll 3 $ Dd xz|3  $ DHVl 6'8`ry|TTT&(9<W``` (0L^ 908Y:C12 ) ( C10 ) (C8 ) (C7 ) (C5 ) (C15 ) (C14 ) (C13 ) (C11 ) (  C6 ) ( C2 Y X `mn C1 C9 ) ( C4 ) (C3 A @   PHONE_NO PHONE_NO PHONE_EXT PHONE_EXT LAST_NAME LAST_NAMEEMP_NOEMP_NO LOCATION LOCATION FIRST_NAME FIRST_NAMEJ?kAGED# SHIP_DATE ORDER_DATEL DATE_NEEDED SHIP_DATE ORDER_DATE NOWL ;=L PO_NUMBER7VL ;=L DISCOUNT L ;=L TOTAL_VALUE ;=L QTY_ORDERED L ;=LCUST_NO1L ;=L ITEM_TYPEsoftwareLJ999/software/hardware/other/N/AL ;=L SALES_REP PAID nL ORDER_STATUS newL ;=L POST_NEW_ORDER CHECK_20 CHECK_11 CHECK_21 CHECK_12 CHECK_22 CHECK_13 CHECK_23 CHECK_14 CHECK_24 CHECK_15 CHECK_25 CHECK_16 CHECK_26 CHECK_17 CHECK_27 CHECK_18 CHECK_28 CHECK_193*SALARY L1L ;=L HIRE_DATE NOWL ;=L JOB_GRADE8L ;=L PHONE_EXT LAST_NAME ;=LEMP_NO ;=L FULL_NAME&'' LAST_NAME,  FIRST_NAMEL JOB_COUNTRY ;=L JOB_CODE199999L ;=L DEPT_NO399/000:104999=L ;=L FIRST_NAME ;=L SET_EMP_NO SAVE_SALARY_CHANGE CHECK_3 CHECK_4) AJOB_REQUIREMENT MAX_SALARY L1L ;=L MIN_SALARY L1L ;=L JOB_GRADE8L ;=L LANGUAGE_REQ ) (U JOB_TITLE ;=L JOB_COUNTRY ;=L JOB_CODE199999L ;=L CHECK_1 CHECK_2  PHONE_NO PHONE_NO PHONE_EXT PHONE_EXT LAST_NAME LAST_NAMEEMP_NOEMP_NO LOCATION LOCATION FIRST_NAME FIRST_NAMEY:C12 ) ( C10 ) (C8 ) (C7 ) (C5 ) (C15 ) (C14 ) (C13 ) (C11 ) (  C6 ) ( C2 Y X PٹP C1 C9 ) ( C4 ) (C3 A @ P90 (( T T4  L t TT  H  Tx , L  T D T$  T \ T< TtT TTxT$TLLPH](Xn]0X `mn ע&(0A(a bb ccc dddd eeeee !"#$0 @ PaabbIRDBbbcccXwccc vdddd0ddddeeeeehu eeeee8P0Pfffffff78901234fffffff78901234(0A(a bb ccc dddd eeeee(0,(0X PٹP (00(  (00( H@H@(08(  (08((08((08(cTv(08( Q @Q @(08(V]xEc]xEc(08(f T (08(fCB(08( (08( Q @Q @ (00( H@H@  (08(cTv  (0,((08((00(  (08(  0X PٹP 0 @ Paabbfbbccccccddddddddeeeeeeeeeefffffff78901234fffffff7890123490!O\SSSdOS Nx H( N N N4 T S N@ N S NL P T NT T TP`OMRlOTNtS$MSNV93N5822Isoftware nshippedgcbV93B1002'software yshippedV93I4700hardware ynopenvV93F0020software =nshippedV93H0500L>jhardware =nopen0V93H3009L= software =nshippedV94S6400>software ywaitingV93S4702hardware yyshippedV9456220hardware yopenP8V93C0990=Jb(hardware HyshippedƿV93C0120 other HyshippedmbWV9345139=2software yshipped"V9345200>2)software yshipped V9346200?software nwaitingV9336100L=Ȩsoftware nwaitingտտпV93006 other nshipped}V93005software yshippedV9427029)>hardware nshipped`V9420099>/dsoftware nopenV9320630L>[hardware nopenO?? V9324320?software yshipped@88"V9324200L>~Vhardware Hyshipped6V94H0079L= software =nopenV93H0030L> software vyopenV93F2051software nwaitingV93F2030qhardware yopenVJV93F3088@B software nshippedkkV92F3004@ software yshippedCCV93J3100=hwsoftware vyshippedV93J2004Rsoftware vyshippedƾV92J1003software =yshippedV92E0340jhardware yshippedV91E0210=  hardware yshipped901,2l282 ,,,,\,0,, , , ,T ,( , , , ,x ,L , , , , ,p ,< 2 , 2 , ,X ,, , , , ,| ,P ,( ( ()(x2L, ,-.,d-$@elaine$@ =elaine$@qelainey$@(elainev$@elaineH$@q_elaine= r#@ͳwelaine  ytjk Otji ytjU tj.@eRVelaine^@[VelaineS@GVelaineH@MVelaineG@-VelaineA@[Velaine=@>Velaine4@`vVelaine-@RVelaine, @Di9Velaine%@51Velaine$ @7ZVelaine"@(eVelaine@!Velaine@LwVelaine@9Velaine@PkbVelaine@(eVelaine@@NVelaine @rVelaine @mVelaine @^Velaine@mKadmin2-@@KLKadmin2,@g5Kadmin2%@-Kadmin2$@`SKadmin2"@^Kadmin2@coKadmin2@zKadmin2@[Kadmin2@^Kadmin2@>IKadmin2 @jKadmin2  ^)P @`Kadmin2 {/L @@TKadmin2 =U @@Kadmin2$@Kadmin2900T(0T-T,,T+ T ,, T , T ,, T , T ,, T + T ,, T , T ,, T ,T,,T,T,,T,T|-(T-Tx,$T-Tp-T,. 100VBASE(08( , 100VBASE(08( * 100VBASE(08( Zb( 622VBASE(08( J]& 621VBASE(08( +S $ 621VBASE(08( '" 110MKTPR(08(   100MKTPR(08(  672MKTPR(08( ' 623MKTPR(08( 0MKTPR(08( -1 110MKTPR(08(  100MKTPR(08(  672MKTPR(08( z 623MKTPR(08(  622HWRII(08( Zb 621HWRII(08(  670HWRII(08(  671MAPDB(08( [ 622MAPDB(08(  = 621MAPDB(08(  621MAPDB(08( @ 671GUIDE(08( -1 100GUIDE(08( 90tX< x\@$    | ` D (   4MKTPRMKTPRMKTPR"MKTPRnMKTPRUMKTPR MKTPRiMKTPR.MKTPRGMAPDBMAPDBGUIDEqGUIDEGUIDEGUIDE-VBASEVBASESVBASEVBASE,VBASEVBASEGVBASEVBASEVBASEVBASEDGPIIqDGPIIDGPII90 yD=l9 u :P h B vP B ? N/AUMarketing project 3MKTPR2a/Expand marketing and sales in the Pacific Rim. 2Set up a field office in Australia and Singapore.  softwareTranslator upgradeHWRII7V7Integrate the hand-writing recognition module into the universal language translator.  softwareMapBrowser portMAPDB/H/Port the map browsing database software to run on the automobile model.  hardware AutoMapGUIDE2U2Develop a prototype for the automobile version of #the hand-held map browsing device. other  DigiPizzaDGPII.w.Develop second generation digital pizza maker $with flash-bake heating element and %digital ingredient measuring system.  software-Video DatabaseVBASE/Y/Design a video data base management system for *controlling on-demand video distribution. 90d0  p wd d| ` LA P.0.Box 702 2514(070) 44 91 18 Neppelenbroek Netherlands Den HaagK.M. GeoTech Inc.ARue Royale 350 1210 02 500 5940 Hessels Belgium BrusselsGretaDyno ConsultingAVia Eugenia, 15 20124 02 404 6284 LorenziItalyMilan AndreasLorenzi Export, Ltd.A22 Place de la Concorde 75008 1 43 60 61RocheFranceParis Michelle 3D-Pad Corp.AFlorhofgasse 10 8005 01 221 16 50 Granges SwitzerlandZurichVictorDynamic Intelligence CorpA2-64-7 Sasazuka 150 3 880 77 19 MiyamotoJapanTokyoMiwakoMPM Corporation)1 Emerald Cove 22 01 23*Fiji Turtle IslandMaxMaxA3320 Lawai Road 96766(808) 835-7605BriggsUSAHILihue LeilaniAnini Vacation RentalsQP.O. Box 22743 93953 Mrs. BeauvaisUSACA Pebble Beach Mrs. Beauvais@ Suite 15020 Carling Avenue K1V 9G1(613) 229 3323BrightCanadaONOttawaTomasDataServe InternationalI400 Connaught Road(852) 850 43 98Wu Hong KongCentral Hong KongTaiDT Systems, LTD.A66 Lloyd Street M2 3LA 61 211 99 88 Brocket England Manchester Elizabeth Central Bank@ Suite 1012300 Newbury Street 02115(617) 488-1864ButtleUSAMABostonJamesButtle, Griffith and Co.P. O. Box 470 75205(214) 960-2233Brown*USATXDallasGlenDallas TechnologiesA15500 Pacific Heights Blvd. 92121(619) 530-2710LittleUSACA San Diego Dale J.Signature Design90%Q\O ORhOP Mx P$ S V| O( R R Q, T X P0 T S S8 NTW4UOU8RUN@OQLPOVVLTPHSFGlonFranceSRep123Jacques@#C8492YanowskiUSASRep100Michael@N1 FerrariyItalySRep125Roberto@,23YamamotovJapanSRep115Takashi@g5247ParkerrUSAEng623Bill@>I845PageqUSAEng671Mary@F#~22IchidanJapanEng115Yuki@2)~202BrownmUSAAdmin600Kelly@ũ{894CookkUSADir670Kevin@D255BenderiUSACEO0 Oliver H.@FU0}(UEnglish German TFrench   @1f BA/BS and +2-4 years experience in technical support. 1Knowledge of several European languages helpful. !.c- EngineerUSAEng   BA/BS and 3-5 years experience. 9/  EngineerJapanEngU0}(U Japanese Mandarin IEnglish  8 G%5+ years experience. "BA/BS and/or MS degrees required. %Customer support experience desired. #Knowledge of Japanese and English. @T@KL EngineerUSAEng:5+ years experience. BA/BS required. MS degree preferred. اj EngineerUSAEng%=Distinguished engineer. %Ph.D/MS/BS or equivalent experience.  g5Financial AnalystUSAFinan3_35-10 years of accounting and financial experience. Strong analytical skills. CPA/MBA required. `S* AccountantUSAAccntA`CPA with 3-5 years experience. ASpreadsheet, data entry, and word processing knowledge required. @KLMarketing AnalystUSAMktg/e BA/BS required. MBA preferred. 3-5 years experience. /Knowledgeable with spreadsheets and databases. z =Marketing AnalystUSAMktg/=MBA required. /10+ years experience in high tech environment. .c%&Public Relations Rep.USAPRel(`r%Administrative AssistantEnglandAdmin =!Administrative AssistantUSAAdmin.b2-4 years clerical experience. .Facility with word processing and data entry. AA degree preferred.  `Sg5!Administrative AssistantUSAAdmin9}/3-5 years experience in executive environment. 9Strong organizational and communication skills required. BA degree preferred.  [- ManagerUSAMngr'''5+ years office management experience. [ ManagerUSAMngr'PBA/BS required. 3-5 years in management, 'plus 2-4 years engineering experience. pr DirectorUSADir@T@5-10 years as a director in computer or electronics industries. An advanced degree. @]zVice PresidentUSAVPNo specific requirements.  Chief Financial OfficerUSACFO*Z*15+ years in finance or 5+ years as a CFO with a proven track record. MBA or J.D. degree. @x}@]Chief Executive OfficerUSACEONo specific requirements. 90P\QFTNd  Mx ( OX ` ZX dXPX\@H[-|`>0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. Knowledge of Japanese required. Travel required.  [*Sales Representative SwitzerlandSRepU0}(UGerman French UEnglish n estabItalian ng term stomer relatioK0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. KKnowledge of German required; one or more other European language helpful. Travel required. jH(Sales RepresentativeCanadaSRepU0}(UEnglish ationsFrench   ( U>0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. Travel required. 4English plus speaking knowledge of French required. ;f`rSales Representative EnglandSRepU0}(UEnglish communGerman French  ( U>0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. 1Knowledge of several European languages helpful. Travel required. Sales RepresentativeUSASRepU0}(UEnglish EESpanish L   >0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. $Some knowledge of Spanish required. Travel required. PG(Sales Co-ordinator EnglandSalesU0}(UEnglish German French  )Experi e in sales and1)Experience in sales and public relations in a high tech environment. Excellent communication skills. BA or equivalent. 1Knowledge of several European languages helpful. j =Sales Co-ordinatorUSASales)w)Experience in sales and public relations in a high tech environment. Excellent communication skills. BA or equivalent.  =!Technical WriterUSADoc7}7BA in English/journalism or excellent language skills. &Some programming experience required. 2-4 years of technical writing. [9Technical WriterUSADoc#"4+ years writing highly technical software documentation. #A bachelor's degree or equivalent. !Programming experience required. Excellent language skills. g5%& EngineerUSAEng 1BA/BS preferred. 2-4 years technical experience. #sB$ Engineer EnglandEng90d[ T \ < \`˅[Sales RepresentativeFranceSRepU0}(UEnglish negotiFrench Spanish  ( U>0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. =Fluency in French; some knowledge of German/Spanish helpful. Travel required. [ESales RepresentativeItalySRepU0}(UItalian cellenGerman French  ( U>0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. 6Fluency in Italian; some knowledge of German helpful. Travel required. ~_@ Sales RepresentativeJapanSRepU0}(U Japanese English  U  nglish ations902 RDB$PRIMARY1 COUNTRY $I? RDB$PRIMARY1 COUNTRY 90$''`,<#$'(+p+@-( ) & FDollarFiji SchillingAustriaBFranc Belgium Guilder NetherlandsHKDollar Hong Kong ADollar AustraliaD-Mark GermanyFFrancFranceLiraItalyYenJapanSFranc SwitzerlandCdnDlrCanadaPound EnglandDollarUSA90 'IT_x , L F VH C F Vd D v TP E w0 AtwA4R`A<R`A@UdA@UdA`8WA84WA6hM///3 QTY_ORDEREDcheck_constraintLCHECK (qty_ordered >= 1) @CHECK_18 SALES   999;9/PAIDy/PAIDncheck_constraintLCHECK (paid in ('y', 'n')) @CHECK_17 SALES   999;9/PAIDy/PAIDncheck_constraintLCHECK (paid in ('y', 'n')) @CHECK_16 SALES   FFF:4 DATE_NEEDED ORDER_DATE;= DATE_NEEDEDcheck_constraintL777CHECK (date_needed > order_date OR date_needed IS NULL) @CHECK_15 SALES   FFF:4 DATE_NEEDED ORDER_DATE;= DATE_NEEDEDcheck_constraintL777CHECK (date_needed > order_date OR date_needed IS NULL) @CHECK_14 SALES   BBB:3 SHIP_DATE ORDER_DATE;= SHIP_DATEcheck_constraintL444CHECK (ship_date >= order_date OR ship_date IS NULL) @CHECK_13 SALES   BBB:3 SHIP_DATE ORDER_DATE;= SHIP_DATEcheck_constraintL444CHECK (ship_date >= order_date OR ship_date IS NULL) @CHECK_12 SALES   ;999/ ORDER_STATUSnew/ ORDER_STATUSopen/ ORDER_STATUSshipped/ ORDER_STATUSwaitingcheck_constraintLYYYCHECK (order_status in ('new', 'open', 'shipped', 'waiting')) @CHECK_11 SALES   ;999/ ORDER_STATUSnew/ ORDER_STATUSopen/ ORDER_STATUSshipped/ ORDER_STATUSwaitingcheck_constraintLYYYCHECK (order_status in ('new', 'open', 'shipped', 'waiting'))@SET_CUST_NO CUSTOMER   666=CUST_NOe CUST_NO_GENCUST_NOLXXXAS BEGIN if (new.cust_no is null) then new.cust_no = gen_id(cust_no_gen, 1); END @CHECK_10 CUSTOMER   888:;=ON_HOLD0ON_HOLD*check_constraintL(((CHECK (on_hold IS NULL OR on_hold = '*') @CHECK_9 CUSTOMER   888:;=ON_HOLD0ON_HOLD*check_constraintL(((CHECK (on_hold IS NULL OR on_hold = '*')@SAVE_SALARY_CHANGE EMPLOYEE   0SALARYSALARYJSALARY_HISTORYEMP_NOEMP_NONOW CHANGE_DATE, UPDATER_IDSALARY OLD_SALARY%$#SALARYSALARYdSALARYPERCENT_CHANGELAAAAS BEGIN IF (old.salary <> new.salary) THEN INSERT INTO salary_history (emp_no, change_date, updater_id, old_salary, percent_change) VALUES ( old.emp_no, 'NOW', user, old.salary, (new.salary - old.salary) * 100 / old.salary); END @CHECK_8 SALARY_HISTORY   90 %A64MA6hM$A 6 MX A E ^l A$ E ^ A$ Z b| A Z bx AALAF8@EO&A4O &8@TR_CONNECT   L111AS BEGIN /* enter trigger code here */ END @TR_MULTI COUNTRY r  L111AS BEGIN /* enter trigger code here */ END@POST_NEW_ORDER SALES    new_orderL(((AS BEGIN POST_EVENT 'new_order'; END @CHECK_28 SALES   ooo:/ ORDER_STATUSshipped= 0 AND discount <= 1) @CHECK_23 SALES   @@@93DISCOUNT1DISCOUNTcheck_constraintL'''CHECK (discount >= 0 AND discount <= 1) @CHECK_22 SALES   ///3 TOTAL_VALUEcheck_constraintLCHECK (total_value >= 0) @CHECK_21 SALES   ///3 TOTAL_VALUEcheck_constraintLCHECK (total_value >= 0) @CHECK_20 SALES   ///3 QTY_ORDEREDcheck_constraintLCHECK (qty_ordered >= 1) @CHECK_19 SALES   90.9B<BBBpB,B B B` B B @ @\ @ @ @ :d :( : : :x 7@ 7 7 7 7X ? ?ABP><==T=<99d9(995|5D5 55 PUBLIC SYSDBA R JOB  PUBLIC SYSDBA D JOB  PUBLIC SYSDBA U JOB  PUBLIC SYSDBA I JOB  PUBLIC SYSDBA S JOB  PUBLIC SYSDBA R COUNTRY  PUBLIC SYSDBA D COUNTRY  PUBLIC SYSDBA U COUNTRY  PUBLIC SYSDBA I COUNTRY  PUBLIC SYSDBA S COUNTRY (SYSDBA SYSDBA X ALL_LANGS (SYSDBA SYSDBA X SHOW_LANGS (SYSDBA SYSDBA X SHIP_ORDER (SYSDBA SYSDBA X MAIL_LABEL (SYSDBA SYSDBA X ORG_CHART (SYSDBA SYSDBA X DEPT_BUDGET (SYSDBA SYSDBA X DELETE_EMPLOYEE (SYSDBA SYSDBA X SUB_TOT_BUDGET (SYSDBA SYSDBA X ADD_EMP_PROJ (SYSDBA SYSDBA X GET_EMP_PROJ  SYSDBA SYSDBA R SALES  SYSDBA SYSDBA D SALES  SYSDBA SYSDBA U SALES  SYSDBA SYSDBA I SALES  SYSDBA SYSDBA S SALES  SYSDBA SYSDBA R CUSTOMER  SYSDBA SYSDBA D CUSTOMER  SYSDBA SYSDBA U CUSTOMER  SYSDBA SYSDBA I CUSTOMER  SYSDBA SYSDBA S CUSTOMER  SYSDBA SYSDBA R SALARY_HISTORY  SYSDBA SYSDBA D SALARY_HISTORY  SYSDBA SYSDBA U SALARY_HISTORY  SYSDBA SYSDBA I SALARY_HISTORY  SYSDBA SYSDBA S SALARY_HISTORY  SYSDBA SYSDBA R PROJ_DEPT_BUDGET  SYSDBA SYSDBA D PROJ_DEPT_BUDGET  SYSDBA SYSDBA U PROJ_DEPT_BUDGET  SYSDBA SYSDBA I PROJ_DEPT_BUDGET  SYSDBA SYSDBA S PROJ_DEPT_BUDGET  SYSDBA SYSDBA R EMPLOYEE_PROJECT  SYSDBA SYSDBA D EMPLOYEE_PROJECT  SYSDBA SYSDBA U EMPLOYEE_PROJECT  SYSDBA SYSDBA I EMPLOYEE_PROJECT  SYSDBA SYSDBA S EMPLOYEE_PROJECT  SYSDBA SYSDBA R PROJECT 90.<<L<<<:\: : : :l <0 < < <| <@ 9 9 9 9P 9 B B B@ B B Bt B0 BBBh@(@@@h@,:::x:<:777\7$7? PUBLIC SYSDBA X GET_EMP_PROJ  PUBLIC SYSDBA R SALES  PUBLIC SYSDBA D SALES  PUBLIC SYSDBA U SALES  PUBLIC SYSDBA I SALES  PUBLIC SYSDBA S SALES  PUBLIC SYSDBA R CUSTOMER  PUBLIC SYSDBA D CUSTOMER  PUBLIC SYSDBA U CUSTOMER  PUBLIC SYSDBA I CUSTOMER  PUBLIC SYSDBA S CUSTOMER  PUBLIC SYSDBA R SALARY_HISTORY  PUBLIC SYSDBA D SALARY_HISTORY  PUBLIC SYSDBA U SALARY_HISTORY  PUBLIC SYSDBA I SALARY_HISTORY  PUBLIC SYSDBA S SALARY_HISTORY  PUBLIC SYSDBA R PROJ_DEPT_BUDGET  PUBLIC SYSDBA D PROJ_DEPT_BUDGET  PUBLIC SYSDBA U PROJ_DEPT_BUDGET  PUBLIC SYSDBA I PROJ_DEPT_BUDGET  PUBLIC SYSDBA S PROJ_DEPT_BUDGET  PUBLIC SYSDBA R EMPLOYEE_PROJECT  PUBLIC SYSDBA D EMPLOYEE_PROJECT  PUBLIC SYSDBA U EMPLOYEE_PROJECT  PUBLIC SYSDBA I EMPLOYEE_PROJECT  PUBLIC SYSDBA S EMPLOYEE_PROJECT  PUBLIC SYSDBA R PROJECT  PUBLIC SYSDBA D PROJECT  PUBLIC SYSDBA U PROJECT  PUBLIC SYSDBA I PROJECT  PUBLIC SYSDBA S PROJECT  PUBLIC SYSDBA R PHONE_LIST  PUBLIC SYSDBA D PHONE_LIST  PUBLIC SYSDBA U PHONE_LIST  PUBLIC SYSDBA I PHONE_LIST  PUBLIC SYSDBA S PHONE_LIST  PUBLIC SYSDBA R EMPLOYEE  PUBLIC SYSDBA D EMPLOYEE  PUBLIC SYSDBA U EMPLOYEE  PUBLIC SYSDBA I EMPLOYEE  PUBLIC SYSDBA S EMPLOYEE  PUBLIC SYSDBA R DEPARTMENT  PUBLIC SYSDBA D DEPARTMENT  PUBLIC SYSDBA U DEPARTMENT  PUBLIC SYSDBA I DEPARTMENT  PUBLIC SYSDBA S DEPARTMENT 90 '?|A8B><|=<= = < 4T 4 4 4 4 4P 4 4 4 4 4L 4 4 4 4| 4H 4 444,3333\3 SYSDBA SYSDBA R T  SYSDBA SYSDBA D T  SYSDBA SYSDBA U T  SYSDBA SYSDBA I T  SYSDBA SYSDBA S T      6 SYSDBA SYSDBA R T 6 SYSDBA SYSDBA D T 6 SYSDBA SYSDBA U T 6 SYSDBA SYSDBA I T 6 SYSDBA SYSDBA S T 6 6 6 6 6 y SYSDBA SYSDBA R T y SYSDBA SYSDBA D T y SYSDBA SYSDBA U T y SYSDBA SYSDBA I T y SYSDBA SYSDBA S T y y y y y n SYSDBA SYSDBA R T n SYSDBA SYSDBA D T n SYSDBA SYSDBA U T n SYSDBA SYSDBA I T n SYSDBA SYSDBA S T n&n%n$n#n" SYSDBA SYSDBA R T2  SYSDBA SYSDBA D T2  SYSDBA SYSDBA U T2  SYSDBA SYSDBA I T2  SYSDBA SYSDBA S T2  SYSDBA SYSDBA R AR  SYSDBA SYSDBA D AR  SYSDBA SYSDBA U AR  SYSDBA SYSDBA I AR  SYSDBA SYSDBA S AR  SYSDBA SYSDBA R T4  SYSDBA SYSDBA D T4  SYSDBA SYSDBA U T4  SYSDBA SYSDBA I T4  SYSDBA SYSDBA S T4  SYSDBA SYSDBA R T3  SYSDBA SYSDBA D T3  SYSDBA SYSDBA U T3  SYSDBA SYSDBA I T3  SYSDBA SYSDBA S T3  SYSDBA SYSDBA R T  SYSDBA SYSDBA D T  SYSDBA SYSDBA U T  SYSDBA SYSDBA I T  SYSDBA SYSDBA S T  PUBLIC SYSDBA X ALL_LANGS  PUBLIC SYSDBA X SHOW_LANGS  PUBLIC SYSDBA X SHIP_ORDER  PUBLIC SYSDBA X MAIL_LABEL  PUBLIC SYSDBA X ORG_CHART  PUBLIC SYSDBA X DEPT_BUDGET  PUBLIC SYSDBA X DELETE_EMPLOYEE  PUBLIC SYSDBA X SUB_TOT_BUDGET  PUBLIC SYSDBA X ADD_EMP_PROJ 90-9|E@9555`5(5 5 Bh B4 3 = =t @( I I ;d ;( ; ; ;t ;8 ; ; ;x G0 GG8dJ(::>dGGCCDPPP`C @CCINTEG_45 NOT NULL PROJ_DEPT_BUDGET NO NO INTEG_44 NOT NULL PROJ_DEPT_BUDGET NO NO INTEG_43 CHECK PROJ_DEPT_BUDGET NO NO INTEG_42 NOT NULL PROJ_DEPT_BUDGET NO NO INTEG_41 FOREIGN KEYEMPLOYEE_PROJECT NO NO RDB$FOREIGN16 INTEG_40 FOREIGN KEYEMPLOYEE_PROJECT NO NO RDB$FOREIGN15 INTEG_39 PRIMARY KEYEMPLOYEE_PROJECT NO NO RDB$PRIMARY14 INTEG_38 NOT NULL EMPLOYEE_PROJECT NO NO INTEG_37 NOT NULL EMPLOYEE_PROJECT NO NO INTEG_36 FOREIGN KEYPROJECT NO NO RDB$FOREIGN13 INTEG_35 PRIMARY KEYPROJECT NO NO RDB$PRIMARY12 INTEG_34 UNIQUE PROJECT NO NO RDB$11 INTEG_33 NOT NULL PROJECT NO NO INTEG_32 NOT NULL PROJECT NO NO INTEG_31 FOREIGN KEYDEPARTMENT NO NO RDB$FOREIGN10 INTEG_30 CHECK EMPLOYEE NO NO INTEG_29 FOREIGN KEYEMPLOYEE NO NO RDB$FOREIGN9 INTEG_28 FOREIGN KEYEMPLOYEE NO NO RDB$FOREIGN8 INTEG_27 PRIMARY KEYEMPLOYEE NO NO RDB$PRIMARY7 INTEG_26 NOT NULL EMPLOYEE NO NO INTEG_25 NOT NULL EMPLOYEE NO NO INTEG_24 NOT NULL EMPLOYEE NO NO INTEG_23 NOT NULL EMPLOYEE NO NO INTEG_22 NOT NULL EMPLOYEE NO NO INTEG_21 NOT NULL EMPLOYEE NO NO INTEG_20 NOT NULL EMPLOYEE NO NO INTEG_19 NOT NULL EMPLOYEE NO NO INTEG_18 NOT NULL EMPLOYEE NO NO INTEG_17 FOREIGN KEYDEPARTMENT NO NO RDB$FOREIGN6 INTEG_16 PRIMARY KEYDEPARTMENT NO NO RDB$PRIMARY5 INTEG_15 UNIQUE DEPARTMENT NO NO RDB$4 INTEG_14 NOT NULL DEPARTMENT NO NO INTEG_13 NOT NULL DEPARTMENT NO NO INTEG_12 CHECK JOB NO NO INTEG_11 FOREIGN KEYJOB NO NO RDB$FOREIGN3 INTEG_10 PRIMARY KEYJOB NO NO RDB$PRIMARY2 INTEG_9 NOT NULL JOB NO NO INTEG_8 NOT NULL JOB NO NO INTEG_7 NOT NULL JOB NO NO INTEG_6 NOT NULL JOB NO NO INTEG_5 NOT NULL JOB NO NO INTEG_4 NOT NULL JOB NO NO INTEG_3 NOT NULL COUNTRY NO NO INTEG_2 PRIMARY KEYCOUNTRY NO NO RDB$PRIMARY1 INTEG_1 NOT NULL COUNTRY NO NO 90#P`PPAADAA A| >, N N ;d ;, 8 H Hd 8, 8 8 5 8L 5 5 5 8l 54 8585DEEE|5D5INTEG_80 CHECK SALES NO NO INTEG_79 CHECK SALES NO NO INTEG_78 FOREIGN KEYSALES NO NO RDB$FOREIGN26 INTEG_77 FOREIGN KEYSALES NO NO RDB$FOREIGN25 INTEG_76 PRIMARY KEYSALES NO NO RDB$PRIMARY24 INTEG_75 CHECK SALES NO NO INTEG_74 NOT NULL SALES NO NO INTEG_73 CHECK SALES NO NO INTEG_72 NOT NULL SALES NO NO INTEG_71 CHECK SALES NO NO INTEG_70 NOT NULL SALES NO NO INTEG_69 CHECK SALES NO NO INTEG_68 CHECK SALES NO NO INTEG_67 CHECK SALES NO NO INTEG_66 NOT NULL SALES NO NO INTEG_65 CHECK SALES NO NO INTEG_64 NOT NULL SALES NO NO INTEG_63 NOT NULL SALES NO NO INTEG_62 NOT NULL SALES NO NO INTEG_61 FOREIGN KEYCUSTOMER NO NO RDB$FOREIGN23 INTEG_60 PRIMARY KEYCUSTOMER NO NO RDB$PRIMARY22 INTEG_59 CHECK CUSTOMER NO NO INTEG_58 NOT NULL CUSTOMER NO NO INTEG_57 NOT NULL CUSTOMER NO NO INTEG_56 FOREIGN KEYSALARY_HISTORY NO NO RDB$FOREIGN21 INTEG_55 PRIMARY KEYSALARY_HISTORY NO NO RDB$PRIMARY20 INTEG_54 CHECK SALARY_HISTORY NO NO INTEG_53 NOT NULL SALARY_HISTORY NO NO INTEG_52 NOT NULL SALARY_HISTORY NO NO INTEG_51 NOT NULL SALARY_HISTORY NO NO INTEG_50 NOT NULL SALARY_HISTORY NO NO INTEG_49 NOT NULL SALARY_HISTORY NO NO INTEG_48 FOREIGN KEYPROJ_DEPT_BUDGET NO NO RDB$FOREIGN19 INTEG_47 FOREIGN KEYPROJ_DEPT_BUDGET NO NO RDB$FOREIGN18 INTEG_46 PRIMARY KEYPROJ_DEPT_BUDGET NO NO RDB$PRIMARY17 90CxD4DDDhD$D D DX D D C DH DINTEG_78 INTEG_27 FULL RESTRICT RESTRICT INTEG_77 INTEG_60 FULL RESTRICT RESTRICT INTEG_61 INTEG_2 FULL RESTRICT RESTRICT INTEG_56 INTEG_27 FULL RESTRICT RESTRICT INTEG_48 INTEG_35 FULL RESTRICT RESTRICT INTEG_47 INTEG_16 FULL RESTRICT RESTRICT INTEG_41 INTEG_35 FULL RESTRICT RESTRICT INTEG_40 INTEG_27 FULL RESTRICT RESTRICT INTEG_36 INTEG_27 FULL RESTRICT RESTRICT INTEG_31 INTEG_27 FULL RESTRICT RESTRICT INTEG_29 INTEG_10 FULL RESTRICT RESTRICT INTEG_28 INTEG_16 FULL RESTRICT RESTRICT INTEG_17 INTEG_16 FULL RESTRICT RESTRICT INTEG_11 INTEG_2 FULL RESTRICT RESTRICT 90=%&&`'4) '((&l&D&) % ) (t (L &$ ' ( * % &X &0 & ( % & *d &< & & & % *l )@ ) - & & &p 'H & '(&+|'T'()''''`'8' *''*h'@'INTEG_73 CHECK_22 INTEG_73 CHECK_21 INTEG_72 TOTAL_VALUE INTEG_71 CHECK_20 INTEG_71 CHECK_19 INTEG_70 QTY_ORDERED INTEG_69 CHECK_18 INTEG_69 CHECK_17 INTEG_68 CHECK_16 INTEG_68 CHECK_15 INTEG_67 CHECK_14 INTEG_67 CHECK_13 INTEG_66 ORDER_DATE INTEG_65 CHECK_12 INTEG_65 CHECK_11 INTEG_64 ORDER_STATUS INTEG_63 CUST_NO INTEG_62 PO_NUMBER INTEG_59 CHECK_10 INTEG_59 CHECK_9 INTEG_58 CUSTOMER INTEG_57 CUST_NO INTEG_54 CHECK_8 INTEG_54 CHECK_7 INTEG_53 PERCENT_CHANGE INTEG_52 OLD_SALARY INTEG_51 UPDATER_ID INTEG_50 CHANGE_DATE INTEG_49 EMP_NO INTEG_45 DEPT_NO INTEG_44 PROJ_ID INTEG_43 CHECK_6 INTEG_43 CHECK_5 INTEG_42 FISCAL_YEAR INTEG_38 PROJ_ID INTEG_37 EMP_NO INTEG_33 PROJ_NAME INTEG_32 PROJ_ID INTEG_30 CHECK_4 INTEG_30 CHECK_3 INTEG_26 SALARY INTEG_25 JOB_COUNTRY INTEG_24 JOB_GRADE INTEG_23 JOB_CODE INTEG_22 DEPT_NO INTEG_21 HIRE_DATE INTEG_20 LAST_NAME INTEG_19 FIRST_NAME INTEG_18 EMP_NO INTEG_14 DEPARTMENT INTEG_13 DEPT_NO INTEG_12 CHECK_2 INTEG_12 CHECK_1 INTEG_9 MAX_SALARY INTEG_8 MIN_SALARY INTEG_7 JOB_TITLE INTEG_6 JOB_COUNTRY INTEG_5 JOB_GRADE INTEG_4 JOB_CODE INTEG_3 CURRENCY INTEG_1 COUNTRY 90'''`'8'''INTEG_80 CHECK_28 INTEG_80 CHECK_27 INTEG_79 CHECK_26 INTEG_79 CHECK_25 INTEG_75 CHECK_24 INTEG_75 CHECK_23 INTEG_74 DISCOUNT 90( TEST_ROLE SYSDBA 90&H  l  |  t x$Ll<,`RDB$FOREIGN18 PROJ_DEPT_BUDGET  RDB$PRIMARY5 RDB$FOREIGN16 EMPLOYEE_PROJECT  RDB$PRIMARY12 %RIMARY7 E?RDB$FOREIGN15 EMPLOYEE_PROJECT  RDB$PRIMARY7 $RIMARY7 `UU?RDB$FOREIGN13 PROJECT  RDB$PRIMARY7 #RIMARY7  q?RDB$FOREIGN10 DEPARTMENT  RDB$PRIMARY7 "RIMARY2 ?RDB$FOREIGN9 EMPLOYEE  RDB$PRIMARY2 !RIMARY5 ?RDB$FOREIGN8 EMPLOYEE  RDB$PRIMARY5 RDB$FOREIGN6 DEPARTMENT  RDB$PRIMARY5 RIMARY1 $I?RDB$FOREIGN3 JOB  RDB$PRIMARY1 $I?RDB$PRIMARY1 COUNTRY  ;? MAXSALX JOB  MINSALX JOB !?RDB$PRIMARY2 JOB $I? BUDGETX DEPARTMENT RDB$PRIMARY5 DEPARTMENT  a? RDB$4 DEPARTMENT E  a? NAMEX EMPLOYEE RDB$PRIMARY7 EMPLOYEE R  ?CUSTREGION CUSTOMER R  ? CUSTNAMEX CUSTOMER  ?RDB$PRIMARY22 CUSTOMER `UU? PRODTYPEX PROJECT `UU?RDB$PRIMARY12 PROJECT `UU? RDB$11 PROJECT  $I?RDB$PRIMARY14 EMPLOYEE_PROJECT  `UU?RDB$PRIMARY17 PROJ_DEPT_BUDGET  `UU? CHANGEX SALARY_HISTORY  UPDATERX SALARY_HISTORY  ?RDB$PRIMARY20 SALARY_HISTORY E?QTYX SALES  SALESTATX SALES  NEEDX SALES RDB$PRIMARY24 SALES ?RDB$INDEX_43 RDB$RELATION_CONSTRAINTS RDB$INDEX_41 RDB$INDICES RDB$INDEX_39 RDB$ROLES RDB$INDEX_32 RDB$TRANSACTIONS RDB$INDEX_31 RDB$INDICES RDB$INDEX_29 RDB$USER_PRIVILEGES RDB$INDEX_28 RDB$DEPENDENCIES RDB$INDEX_26 RDB$COLLATIONS RDB$INDEX_25 RDB$CHARACTER_SETS ?RDB$INDEX_23 RDB$EXCEPTIONS RDB$INDEX_22 RDB$PROCEDURES RDB$INDEX_20 RDB$COLLATIONS RDB$INDEX_18 RDB$PROCEDURE_PARAMETERS RDB$INDEX_17 RDB$FILTERS RDB$INDEX_15 RDB$RELATION_FIELDS RDB$INDEX_14 RDB$CHECK_CONSTRAINTS 90 M,x%,%\, -h,L / /x 1 2 .@ , -p - - ,l 7 77|7,777<777P111l1111H: :::X::::h:,:11-M - SQL$DEFAULT19  >SYSDBASYSDBASYSYSDBA  SYSDBA  SYSDBA  $DESYSDBA  SYSDBA  $T2SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBASYSDBASYSDBASYSDBASYSDBASYSDBASYSDBASYSDBASYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA   SYSDBA   SYSDBA  SYSDBA  - SQL$ALL_LANGS  SYSDBA  -SQL$SHOW_LANGS  SYSDBA  -SQL$SHIP_ORDER  SYSDBA  -SQL$MAIL_LABEL  SYSDBA  - SQL$ORG_CHART  SYSDBA  -SQL$DEPT_BUDGET  SYSDBA  -SQL$DELETE_EMPLOYEE  SYSDBA  -SQL$SUB_TOT_BUDGET  SYSDBA  -SQL$ADD_EMP_PROJ   SYSDBA  -SQL$GET_EMP_PROJ  "SYSDBA  SYSDBA  -SQL$PHONE_LIST  SYSDBA  - SQL$DEFAULT18  *SYSDBA-SQL$T2  (SYSDBA- SQL$DEFAULT17  &SYSDBA-SQL$AR  $SYSDBA- SQL$DEFAULT16  ;p90tF.@MV92V91E02102E0340F3004J1003 320630 4200 3203300566100451392006200B1002C0120990F00202030513088 H00305003009I4700J20043100N5822S4702420099702956220 H0079S6400 p90_.@O&`dfgpw`&hnoja x  _jV(Sp ĵ@ !.X-.` q p90D,@M openny shippedn  y  waitingn y x90q7` ]??s ? ˕ Ϣ Ѧ ۊ   @  ? @  ?p Χ Ѡ ۡ  @ p90}8`SF&&{HɈadmin2&{HɈadmin2&{HɈadmin2 &elaine"&elaine&&{HɈadmin2 elaine  38elaine(&{HɈadmin2 elaine,&{HɈadmin2 elaine.&{HɈadmin2 elaine4&{HɈadmin2 elaine 8&{HɈadmin2 elaine<&{HɈadmin2 elaine =&{HɈadmin2 elaine A&{HɈadmin2 elaine B&{HɈadmin2 elaine &{HɈadmin2 elaineF&{HɈadmin2 elaine&{HɈadmin2 elaineG&38tjJ&elaineN&elaine  38elaineP@&elaineQ&elaineR&elaine  38elaineT&elaineU@&38tjW&elaineZ@&38tj &38tj ]&38elaine^@&38elaine_&38elaine`&38elaine p901@Vadmin2admin2elainetj x90H2@X:H:HLJO"6w p90$0.PE$MAPDB621(GUIDE100671 HWRII6212 70 MAPDB6212 71 KTPR0001001062372  VBASE1006212,MKTPR1001062372  VBASE1006210VBASE100 p90Q-@G MAPDB VBASE GUIDEMKTPRVBASE (MKTPR ,MKTPR .VBASE  4GUIDE 8DGPIIGUIDE AMKTPR FVBASE  VBASE GMKTPR JMKTPR QMAPDBVBASE  TVBASE U@MKTPR Z@MKTPR [MKTPR \@DGPIIGUIDE aVBASE  @VBASE bDGPII VBASE p90+@CAutoMap DigiPizzaMapBrowser port rketing project 3 Translator upgradeVideo Database p90b, PMDGPIIGUIDE HWRIIMAPDB KTPRVBASE p90,`M N/AMarketing project 3hardwareAutoMapotherDigiPizzasoftwareMapBrowser port Translator upgrade Video Database p90m-@THPX`hpx p90 V+P; 3D-Pad Corp.Anini Vacation RentalsButtle, Griffith and Co. Central BankDT Systems, LTD.allas TechnologiestaServe International ynamic Intelligence Corp  o Consulting GeoTech Inc. Lorenzi Export, Ltd. MPM Corporationax rs. BeauvaisSignature Design p90#l,pD BelgiumBrusselsCanadaOttawaEnglandManchesterFijiTurtle Island ranceParis$Hong KongCentral Hong Kong ItalyMilan JapanTokyoNetherlandsDen Haag SwitzerlandZurich USABostonDallasLihuePebble Beach San Diego p901,@P "&(,.48<=ABFGJNP@QRTU@WZ@[@\@]^@_`a@b p90[f1`FB BaldwinJanetenderOliver H.  netAnn ishopDanarownKellyurbankJennifer M. CookKevin De SouzaRogerFerrariRoberto  isherPete orestPhil GlonJacques reenT.J.uckenheimerMark HallStewartIchidaYukiJohnsonLeslie Scott LambertKim eeTerri ungLukeMacDonaldMary S.ontgomeryJohnNelsonRobertordstromCarolO'BrienSue AnnesbornePierre PageMary padopoulosChris rkerBillhongLeslieRamanathanAshokeevesRogerStansburyWillieeadmanWalterutherlandClaudiaWestonK. J.illiamsRandyYamamotoTakashinowskiMichaeloungBruce Katherine p90o-PJCo Consumer Electronics Div.rporate Headquarters ustomer Services upport Engineeringuropean Headquarters Field Office: Canada  East CoastFranceItalyJapan Singapore witzerlandnance MarketingPacific Rim HeadquartersQuality Assurance Research and DevelopmentSales and Marketingoftware Development Products Div. p90- S12000100105620135 30 408060020123 7012900 x90L,@Q? ?? ?     p90-`DAAccntUSA dminUSA EnglandUSA CEOUSA FOUSA DirUSA ocUSAUSA EngUSA Japan USA England USAUSAFinanUSA MktgUSAUSA  ngrUSA USA PRelUSASRepCanada England France Italy Japan Switzerland USAalesEnglandUSA VPUSA p90,`FCanadaQEnglandp =q zG p =qFrance' =pItaly@Japank SwitzerlandffffffUSA   ffffff     ffffff        ! * x902`U??                  ?333332?o q?/?s33332?333332 =p < zG \(Ž?ՙ p90+@I Australia ia BelgiumCanadaEngland FijiranceGermany Hong KongItalyJapan Netherlands SwitzerlandUSA p90V+@ICanadaEnglandFranceItalyJapan SwitzerlandUSA p90+, N1`000100102060020 70 p90\, P1000100 105 2013530408060021237012900 p90|;`bAdminAdminUSA EnglandUSA CEOUSA FOUSA DirUSA ocUSA EngUSA Japan USA England USAUSAFinanUSA MktgUSA ngrUSAUSA PRelUSASRepCanada France Italy Japan Switzerland USAalesEngland USA VPUSA p90,@Pdefp"&.4ABGRU@ WZ@]^@`a p90D'@i48F U@ p90&-@T8  (,.48AFGJQ TU@Z@[\@a@b p90t+ LDGPII GUIDEMAPDBKTPRVBASE p907+ Q0001001062123 7012 90$XRDB$FOREIGN26 SALES  RDB$PRIMARY7 +IMARY22  ?RDB$FOREIGN25 SALES  RDB$PRIMARY22 *RIMARY1 E?RDB$FOREIGN23 CUSTOMER  RDB$PRIMARY1 )RIMARY7 ?RDB$FOREIGN21 SALARY_HISTORY  RDB$PRIMARY7 RDB$FOREIGN19 PROJ_DEPT_BUDGET  RDB$PRIMARY12 'RIMARY5  q?p90`0 WMAPDBGUIDE HWRIIMAPDBKTPRVBASE p90F,@Q "&(,.48<=ABFGJNP@QRTU@WZ@ ]^@_` p90 +@K BelgiumCanadaEnglandFiji rance Hong Kong Italy Japan Netherlands SwitzerlandUSA p90R-@T HPX`hpx p90I.@UN&NR]^@ _`a 90 1:8|1L/;::`7$; 3\ 3( 3 3 3 9P 4 7 2 6x 1P ' 4 3 3x 9D 4 7 2 6l 1D ' 437p2,AAB`BM?I8IJEd?$=; PHONE_LIST EMPLOYEE FIRST_NAME  PHONE_LIST DEPARTMENT LOCATION  PHONE_LIST EMPLOYEE EMP_NO  PHONE_LIST EMPLOYEE LAST_NAME  PHONE_LIST EMPLOYEE PHONE_EXT  PHONE_LIST DEPARTMENT PHONE_NO  PHONE_LIST EMPLOYEE  PHONE_LIST DEPARTMENT  PHONE_LIST EMPLOYEE DEPT_NO  PHONE_LIST DEPARTMENT DEPT_NO SAVE_SALARY_CHANGE SALARY_HISTORY SAVE_SALARY_CHANGE EMPLOYEE EMP_NO SAVE_SALARY_CHANGE SALARY_HISTORY EMP_NO SAVE_SALARY_CHANGE SALARY_HISTORY CHANGE_DATE SAVE_SALARY_CHANGE SALARY_HISTORY UPDATER_ID SAVE_SALARY_CHANGE SALARY_HISTORY OLD_SALARY SAVE_SALARY_CHANGE EMPLOYEE SALARY SAVE_SALARY_CHANGE SALARY_HISTORY PERCENT_CHANGE CHECK_8 SALARY_HISTORY PERCENT_CHANGE CHECK_7 SALARY_HISTORY PERCENT_CHANGE CHECK_6 PROJ_DEPT_BUDGET FISCAL_YEAR CHECK_5 PROJ_DEPT_BUDGET FISCAL_YEAR  SET_EMP_NO EMP_NO_GEN  SET_EMP_NO EMPLOYEE EMP_NO CHECK_4 JOB MIN_SALARY CHECK_4 EMPLOYEE SALARY CHECK_4 JOB CHECK_4 JOB JOB_CODE CHECK_4 EMPLOYEE JOB_CODE CHECK_4 JOB JOB_GRADE CHECK_4 EMPLOYEE JOB_GRADE CHECK_4 JOB JOB_COUNTRY CHECK_4 EMPLOYEE JOB_COUNTRY CHECK_4 JOB MAX_SALARY CHECK_3 JOB MIN_SALARY CHECK_3 EMPLOYEE SALARY CHECK_3 JOB CHECK_3 JOB JOB_CODE CHECK_3 EMPLOYEE JOB_CODE CHECK_3 JOB JOB_GRADE CHECK_3 EMPLOYEE JOB_GRADE CHECK_3 JOB JOB_COUNTRY CHECK_3 EMPLOYEE JOB_COUNTRY CHECK_3 JOB MAX_SALARY CHECK_2 JOB MIN_SALARY CHECK_2 JOB MAX_SALARY CHECK_1 JOB MIN_SALARY CHECK_1 JOB MAX_SALARY  PHONE_LIST EMPLOYEE FIRST_NAME  PHONE_LIST DEPARTMENT LOCATION  PHONE_LIST EMPLOYEE EMP_NO  PHONE_LIST EMPLOYEE LAST_NAME  PHONE_LIST EMPLOYEE PHONE_EXT  PHONE_LIST DEPARTMENT PHONE_NO  PHONE_LIST EMPLOYEE  PHONE_LIST DEPARTMENT  PHONE_LIST EMPLOYEE DEPT_NO  PHONE_LIST DEPARTMENT DEPT_NO 90 156T9 488x5@65 6 7` 6( 7 6 0 0X 7 7 7 7| 4H 4 5 8 5h 80 6 3 6 -\ 8$ 636-P8,BA948BAp9=@l5<h4$B GET_EMP_PROJ EMPLOYEE_PROJECT  GET_EMP_PROJ EMPLOYEE_PROJECT EMP_NO  GET_EMP_PROJ EMPLOYEE_PROJECT PROJ_ID  ADD_EMP_PROJ EMPLOYEE_PROJECT  ADD_EMP_PROJ EMPLOYEE_PROJECT EMP_NO  ADD_EMP_PROJ EMPLOYEE_PROJECT PROJ_ID  ADD_EMP_PROJ UNKNOWN_EMP_ID SUB_TOT_BUDGET DEPARTMENT SUB_TOT_BUDGET DEPARTMENT HEAD_DEPT SUB_TOT_BUDGET DEPARTMENT BUDGET DELETE_EMPLOYEE SALARY_HISTORY EMP_NO DELETE_EMPLOYEE EMPLOYEE DELETE_EMPLOYEE EMPLOYEE EMP_NO SUB_TOT_BUDGET DEPARTMENT SUB_TOT_BUDGET DEPARTMENT HEAD_DEPT SUB_TOT_BUDGET DEPARTMENT BUDGET  ADD_EMP_PROJ EMPLOYEE_PROJECT  ADD_EMP_PROJ EMPLOYEE_PROJECT EMP_NO  ADD_EMP_PROJ EMPLOYEE_PROJECT PROJ_ID  ADD_EMP_PROJ UNKNOWN_EMP_ID  GET_EMP_PROJ EMPLOYEE_PROJECT  GET_EMP_PROJ EMPLOYEE_PROJECT EMP_NO  GET_EMP_PROJ EMPLOYEE_PROJECT PROJ_ID CHECK_28 SALES ORDER_STATUS CHECK_28 CUSTOMER CHECK_28 CUSTOMER CUST_NO CHECK_28 SALES CUST_NO CHECK_28 CUSTOMER ON_HOLD CHECK_27 SALES ORDER_STATUS CHECK_27 CUSTOMER CHECK_27 CUSTOMER CUST_NO CHECK_27 SALES CUST_NO CHECK_27 CUSTOMER ON_HOLD CHECK_26 SALES ORDER_STATUS CHECK_26 SALES SHIP_DATE CHECK_25 SALES ORDER_STATUS CHECK_25 SALES SHIP_DATE CHECK_24 SALES DISCOUNT CHECK_23 SALES DISCOUNT CHECK_22 SALES TOTAL_VALUE CHECK_21 SALES TOTAL_VALUE CHECK_20 SALES QTY_ORDERED CHECK_19 SALES QTY_ORDERED CHECK_18 SALES PAID CHECK_17 SALES PAID CHECK_16 SALES ORDER_DATE CHECK_16 SALES DATE_NEEDED CHECK_15 SALES ORDER_DATE CHECK_15 SALES DATE_NEEDED CHECK_14 SALES ORDER_DATE CHECK_14 SALES SHIP_DATE CHECK_13 SALES ORDER_DATE CHECK_13 SALES SHIP_DATE CHECK_12 SALES ORDER_STATUS CHECK_11 SALES ORDER_STATUS  SET_CUST_NO CUST_NO_GEN  SET_CUST_NO CUSTOMER CUST_NO CHECK_10 CUSTOMER ON_HOLD CHECK_9 CUSTOMER ON_HOLD 90 1:D\<@3?p64;<<4;=T2: 6 7 .x 8< 9 9 9 <h;80L < 8 ? 5\ > >=>`9(8/7:L7 ,88/H62581 ORG_CHART DEPARTMENT DEPARTMENT  ORG_CHART DEPARTMENT MNGR_NO  ORG_CHART DEPARTMENT DEPT_DELETE_EMPLOYEE SALES E DELETE_EMPLOYEE SALES SALES_REP DELETE_EMPLOYEE SALES PO_NUMBER DELETE_EMPLOYEE REASSIGN_SALES DELETE_EMPLOYEE DEPARTMENT DELETE_EMPLOYEE DEPARTMENT MNGR_NO DELETE_EMPLOYEE PROJECT DELETE_EMPLOYEE PROJECT TEAM_LEADER DELETE_EMPLOYEE EMPLOYEE_PROJECT DELETE_EMPLOYEE EMPLOYEE_PROJECT EMP_NO DELETE_EMPLOYEE SALARY_HISTORY  DEPT_BUDGET DEPARTMENT BUDGET  DEPT_BUDGET DEPARTMENT  DEPT_BUDGET DEPARTMENT HEAD_DEPT  DEPT_BUDGET DEPARTMENT DEPT_NO  DEPT_BUDGET DEPT_BUDGET  ORG_CHART DEPARTMENT  ORG_CHART DEPARTMENT HEAD_DEPT  SHIP_ORDER CUSTOMER_ON_HOLD  SHIP_ORDER SALES CUST_NO  SHIP_ORDER SALES PAID  SHIP_ORDER CUSTOMER_CHECK  SHIP_ORDER CUSTOMER  SHIP_ORDER CUSTOMER CUST_NO  SHIP_ORDER CUSTOMER ON_HOLD  SHIP_ORDER SALES  SHIP_ORDER SALES PO_NUMBER  SHIP_ORDER SALES ORDER_STATUS  SHIP_ORDER SALES SHIP_DATE  MAIL_LABEL CUSTOMER  MAIL_LABEL CUSTOMER CUST_NO  MAIL_LABEL CUSTOMER CUSTOMER  MAIL_LABEL CUSTOMER CONTACT_FIRST  MAIL_LABEL CUSTOMER CONTACT_LAST  MAIL_LABEL CUSTOMER ADDRESS_LINE1  MAIL_LABEL CUSTOMER ADDRESS_LINE2  MAIL_LABEL CUSTOMER CITY  MAIL_LABEL CUSTOMER STATE_PROVINCE  MAIL_LABEL CUSTOMER COUNTRY  MAIL_LABEL CUSTOMER POSTAL_CODE  ORG_CHART DEPARTMENT DEPARTMENT  ORG_CHART DEPARTMENT MNGR_NO  ORG_CHART DEPARTMENT DEPT_NO  ORG_CHART EMPLOYEE FULL_NAME  ORG_CHART EMPLOYEE JOB_CODE  ORG_CHART EMPLOYEE  ORG_CHART EMPLOYEE DEPT_NO  ORG_CHART EMPLOYEE EMP_NO  DEPT_BUDGET DEPARTMENT BUDGET  DEPT_BUDGET DEPARTMENT  DEPT_BUDGET DEPARTMENT HEAD_DEPT  DEPT_BUDGET DEPARTMENT DEPT_NO  DEPT_BUDGET DEPT_BUDGET DELETE_EMPLOYEE SALES DELETE_EMPLOYEE SALES SALES_REP DELETE_EMPLOYEE SALES PO_NUMBER DELETE_EMPLOYEE REASSIGN_SALES DELETE_EMPLOYEE DEPARTMENT DELETE_EMPLOYEE DEPARTMENT MNGR_NO DELETE_EMPLOYEE PROJECT DELETE_EMPLOYEE PROJECT TEAM_LEADER DELETE_EMPLOYEE EMPLOYEE_PROJECT DELETE_EMPLOYEE EMPLOYEE_PROJECT EMP_NO DELETE_EMPLOYEE SALARY_HISTORY 90 D 8 7 5 4t *|<H16 4 3| )4 = SHIP_ORDER ORDER_ALREADY_SHIPPED  SHOW_LANGS JOB  SHOW_LANGS JOB JOB_CODE  SHOW_LANGS JOB JOB_GRADE  SHOW_LANGS JOB JOB_COUNTRY  SHOW_LANGS JOB LANGUAGE_REQ  ALL_LANGS JOB  ALL_LANGS JOB JOB_CODE  ALL_LANGS JOB JOB_GRADE  ALL_LANGS JOB JOB_COUNTRY  ALL_LANGS SHOW_LANGS  ALL_LANGS SHOW_LANGS LANGUAGES  SHOW_LANGS JOB  SHOW_LANGS JOB JOB_CODE  SHOW_LANGS JOB JOB_GRADE  SHOW_LANGS JOB JOB_COUNTRY  SHOW_LANGS JOB LANGUAGE_REQ  SHIP_ORDER ORDER_ALREADY_SHIPPED 90 N E$N^TTA3*SALARY L1L ;=L HIRE_DATE NOWL ;=L JOB_GRADE8L ;=L PHONE_EXT LAST_NAME ;=LEMP_NO ;=L FULL_NAME&'' LAST_NAME,  FIRST_NAMEL JOB_COUNTRY ;=L JOB_CODE199999L ;=L DEPT_NO399/000:104999=L ;=L FIRST_NAME ;=L SET_EMP_NO SAVE_SALARY_CHANGE CHECK_3 CHECK_4ADDRESS_LINE2ADDRESS_LINE1CUST_NO1L ;=L POSTAL_CODE PHONE_NO CONTACT_LASTON_HOLD-LCOUNTRYSTATE_PROVINCE CITY CONTACT_FIRST CUSTOMER ;=L SET_CUST_NO CHECK_9 CHECK_10 T4 SQL$T4 SYSDBA SQL$DEFAULT16  ` V_WIN1250V_NONE V_OCTETSC_UTF8C1V_UTF8 C_WIN1250C_NONE C_OCTETS PROJECT SQL$PROJECT SYSDBA SQL$DEFAULT8 J PROJ_DESCPRODUCTsoftwareLJ999/software/hardware/other/N/AL ;=L TEAM_LEADER PROJ_NAME ;=LPROJ_ID /gL ;=LEMPLOYEE_PROJECT SQL$EMPLOYEE_PROJECT SYSDBA SQL$DEFAULT9  4EMP_NO ;=LPROJ_ID /gL ;=L3PROJECTED_BUDGET PL:1'4LQUART_HEAD_CNT ) (  FISCAL_YEAR ;=LDEPT_NO399/000:104999=L ;=LPROJ_ID /gL ;=L CHECK_5 CHECK_6SALARY_HISTORY SQL$SALARY_HISTORY SYSDBA SQL$DEFAULT11 8 NEW_SALARY8" OLD_SALARY%$ OLD_SALARYPERCENT_CHANGEdLPERCENT_CHANGE L ;=L OLD_SALARY L1L ;=L CHANGE_DATE NOWL ;=L UPDATER_ID ;=LEMP_NO ;=L CHECK_7 CHECK_8  SALES SQL$SALES SYSDBA SQL$DEFAULT13 J?kAGED# SHIP_DATE ORDER_DATEL DATE_NEEDED SHIP_DATE ORDER_DATE NOWL ;=L PO_NUMBER7VL ;=L DISCOUNT L ;=L TOTAL_VALUE ;=L QTY_ORDERED L ;=LCUST_NO1L ;=L ITEM_TYPEsoftwareLJ999/software/hardware/other/N/AL ;=L SALES_REP PAID nL ORDER_STATUS newL ;=L POST_NEW_ORDER CHECK_20 CHECK_11 CHECK_21 CHECK_12 CHECK_22 CHECK_13 CHECK_23 CHECK_14 CHECK_24 CHECK_15 CHECK_25 CHECK_16 CHECK_26 CHECK_17 CHECK_27 CHECK_18 CHECK_28 CHECK_19T3 SQL$T3 SYSDBA SQL$DEFAULT15  C4C2C5C1C3T SQL$T SYSDBA SQL$DEFAULT14 T2 SQL$T2 SYSDBA SQL$DEFAULT18  gC13C11C10C9C8C3C16C15C14 C12 C7 C6 C5 C2C1C4AR SQL$AR SYSDBA SQL$DEFAULT17 90XHT  COUNTRY SQL$COUNTRY SYSDBA SQL$DEFAULT4  JOB SQL$JOB SYSDBA SQL$DEFAULT5 ) AJOB_REQUIREMENT MAX_SALARY L1L ;=L MIN_SALARY L1L ;=L JOB_GRADE8L ;=L LANGUAGE_REQ ) (U JOB_TITLE ;=L JOB_COUNTRY ;=L JOB_CODE199999L ;=L CHECK_1 CHECK_2DEPARTMENT SQL$DEPARTMENT SYSDBA SQL$DEFAULT6 3BUDGET PL:1'4L PHONE_NO555-1234LMNGR_NO LOCATION HEAD_DEPT399/000:104999=L DEPARTMENT ;=LDEPT_NO399/000:104999=L ;=L EMPLOYEE SQL$EMPLOYEE SYSDBA SQL$DEFAULT7 90non901234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567908912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345679089123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567908912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345679089123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567908912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345679089123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567908912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345679089123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456_789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123459067891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234590678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345906789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123459067891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234590678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345906789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789906789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789fdb-1.4.9+dfsg1/test/fbtest20.fdb0000644000215700017510000466000012464405763015273 0ustar rstuartit90m w./ f N90 90909090L|`D( dH,     h L 0       l P 4       p T 8       t X <       x \ @ $  hL0 E D CBA@?>=<;:9876543210/.-,+*)('&%$#"!                90Q9090OP90VO;O;90R90Z1 C<1 C<90+T 90Y1 C<u! <%I>%I>! <1 C<90  FHIJKLMNUU90W;X/<e3;8Z;3;/<;90G90S/<U/</</<9090w?x???9090f===90 90 [??90 90 90 90 {dR;dR;90 U90 \sm<|1 C=1 C=sm<90 90 q>r>>>9090]??9090^??9090g9090y*=*=9090s&=t??&=9090v9090_.=.=9090z==9090`L<g<&=&==g<L<9090a%I=%I=9090b&<~=<=<&<90909090k=l===9090h><=><9090i<o<<<9090js;ps;9c=s;s;9090mL>nL>L>L>9090}??90 90 90$I`QUMhPT \T d L RX Z U O\ S P R` V T R\ Z PRdTRV\ZTYTWURXPZVD^\RDB$FIELD_PRECISION RDB$FIELDS RDB$FIELD_PRECISION RDB$CHARACTER_SET_ID RDB$FIELDS RDB$CHARACTER_SET_ID RDB$COLLATION_ID RDB$FIELDS RDB$COLLATION_ID RDB$CHARACTER_LENGTH RDB$FIELDS RDB$FIELD_LENGTH RDB$NULL_FLAG RDB$FIELDS RDB$NULL_FLAG RDB$DIMENSIONS RDB$FIELDS RDB$DIMENSIONS RDB$EXTERNAL_TYPE RDB$FIELDS RDB$FIELD_TYPE RDB$EXTERNAL_SCALE RDB$FIELDS RDB$FIELD_SCALE RDB$EXTERNAL_LENGTH RDB$FIELDS RDB$FIELD_LENGTH RDB$EDIT_STRING RDB$FIELDS RDB$EDIT_STRING RDB$SEGMENT_LENGTH RDB$FIELDS RDB$SEGMENT_LENGTH RDB$QUERY_HEADER RDB$FIELDS RDB$QUERY_HEADER RDB$SYSTEM_FLAG RDB$FIELDS RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$FIELDS RDB$DESCRIPTION RDB$MISSING_SOURCE RDB$FIELDS RDB$SOURCE   RDB$MISSING_VALUE RDB$FIELDS RDB$VALUE   RDB$FIELD_SUB_TYPE RDB$FIELDS RDB$FIELD_SUB_TYPE   RDB$FIELD_TYPE RDB$FIELDS RDB$FIELD_TYPE   RDB$FIELD_SCALE RDB$FIELDS RDB$FIELD_SCALE   RDB$FIELD_LENGTH RDB$FIELDS RDB$FIELD_LENGTH RDB$DEFAULT_SOURCE RDB$FIELDS RDB$SOURCE RDB$DEFAULT_VALUE RDB$FIELDS RDB$VALUE RDB$COMPUTED_SOURCE RDB$FIELDS RDB$SOURCE RDB$COMPUTED_BLR RDB$FIELDS RDB$VALUE RDB$VALIDATION_SOURCE RDB$FIELDS RDB$SOURCE RDB$VALIDATION_BLR RDB$FIELDS RDB$VALIDATION_BLR RDB$QUERY_NAME RDB$FIELDS RDB$FIELD_NAME RDB$FIELD_NAME RDB$FIELDS RDB$FIELD_NAME RDB$CHARACTER_SET_NAME RDB$DATABASE RDB$CHARACTER_SET_NAME RDB$SECURITY_CLASS RDB$DATABASE RDB$SECURITY_CLASS RDB$RELATION_ID RDB$DATABASE RDB$RELATION_ID RDB$DESCRIPTION RDB$DATABASE RDB$DESCRIPTION RDB$PAGE_TYPE RDB$PAGES RDB$PAGE_TYPE RDB$PAGE_SEQUENCE RDB$PAGES RDB$PAGE_SEQUENCE RDB$RELATION_ID RDB$PAGES RDB$RELATION_ID RDB$PAGE_NUMBER RDB$PAGES RDB$PAGE_NUMBER 90'7<P< D<DDEB ; DD 9 9 D @D = F ;| D0 K @ Fd D P D HH = @H|B<>@<B*<O$ RDB$ROLES SQL$RDB$RORDB$CONSTRAINT_NAMERDB$CONST_NAME_UQRDB$MATCH_OPTION FULLLRDB$UPDATE_RULERESTRICTLRDB$DELETE_RULERESTRICTL RDB$TRIGGER_12 RDB$TRIGGER_13SYRDB$CONSTRAINT_NAMERDB$CONSTRAINT_TYPERDB$RELATION_NAMERDB$DEFERRABLE NOLRDB$INITIALLY_DEFERRED NOLRDB$INDEX_NAME RDB$TRIGGER_10 RDB$TRIGGER_11 RDB$TRIGGER_34 RDB$TRIGGER_25 RDB$TRIGGER_26 ^RDB$GENERATOR_NAMERDB$GENERATOR_IDRDB$SYSTEM_FLAGRDB$DESCRIPTION RDB$TRIGGER_6"I RDB$VIEW_BLRRDB$VIEW_SOURCERDB$DESCRIPTIONRDB$RELATION_IDRDB$SYSTEM_FLAGRDB$DBKEY_LENGTH RDB$FORMAT RDB$FIELD_IDRDB$RELATION_NAME RDB$SECURITY_CLASS RDB$EXTERNAL_FILE RDB$RUNTIME RDB$EXTERNAL_DESCRIPTION RDB$OWNER_NAMERDB$DEFAULT_CLASS RDB$FLAGS RDB$TRIGGER_4 RDB$TRIGGER_5RDB$TRIGGER_NAMERDB$RELATION_NAMERDB$TRIGGER_SEQUENCERDB$TRIGGER_TYPERDB$TRIGGER_SOURCERDB$TRIGGER_BLRRDB$DESCRIPTIONRDB$TRIGGER_INACTIVERDB$SYSTEM_FLAG RDB$FLAGS RDB$TRIGGER_2 RDB$TRIGGER_3 RDB$TRIGGER_21 RDB$TRIGGER_22 RDB$USER RDB$GRANTORRDB$PRIVILEGERDB$GRANT_OPTIONRDB$RELATION_NAMERDB$FIELD_NAMERDB$USER_TYPERDB$OBJECT_TYPE RDB$TRIGGER_1 RDB$TRIGGER_8 RDB$TRIGGER_9 RDB$TRIGGER_31 RDB$TRIGGER_32 RDB$TRIGGER_33 RDB$BACKUP_HISTORY SYSDBA  RDB$EXCEPTIONS  RDB$COLLATIONS SYSDBA  RDB$CHARACTER_SETS SYSDBA RDB$PROCEDURE_PARAMETERS SYSDBA   RDB$PROCEDURES RDB$LOG_FILES SYSDBA RDB$CHECK_CONSTRAINTS RDB$REF_CONSTRAINTS RDB$RELATION_CONSTRAINTS %SYSDBA RDB$FIELD_DIMENSIONS SYSDBA RDB$GENERATORS $SYSDBA RDB$TRANSACTIONS SYSDBA RDB$USER_PRIVILEGES !SYSDBA RDB$TRIGGER_MESSAGES SYSDBA  RDB$FILTERS SYSDBA  RDB$FUNCTION_ARGUMENTS SYSDBA RDB$FUNCTIONS SYSDBA  RDB$DEPENDENCIES SYSDBA   RDB$TRIGGERS "SYSDBA   RDB$TYPES SYSDBA   RDB$FILES SYSDBA  RDB$SECURITY_CLASSES SYSDBA  RDB$FORMATS SYSDBA RDB$VIEW_RELATIONS SYSDBA RDB$RELATIONS #SYSDBA RDB$RELATION_FIELDS  RDB$INDICES RDB$INDEX_SEGMENTS  RDB$FIELDS RDB$DATABASE SYSDBA  RDB$PAGES SYSDBA 90"TPZbZ@M Y M< U U Y0 X T W0 S R V0 S Ut a ][\[]c8_]U _]dY[cD]YRDB$NULL_FLAG RDB$RELATION_FIELDS RDB$NULL_FLAG RDB$COMPLEX_NAME RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$SECURITY_CLASS RDB$RELATION_FIELDS RDB$SECURITY_CLASS RDB$SYSTEM_FLAG RDB$RELATION_FIELDS RDB$SYSTEM_FLAG   RDB$DEFAULT_VALUE RDB$RELATION_FIELDS RDB$VALUE   RDB$DESCRIPTION RDB$RELATION_FIELDS RDB$DESCRIPTION   RDB$VIEW_CONTEXT RDB$RELATION_FIELDS RDB$VIEW_CONTEXT   RDB$FIELD_ID RDB$RELATION_FIELDS RDB$FIELD_ID   RDB$UPDATE_FLAG RDB$RELATION_FIELDS RDB$SYSTEM_FLAG RDB$QUERY_HEADER RDB$RELATION_FIELDS RDB$QUERY_HEADER RDB$FIELD_POSITION RDB$RELATION_FIELDS RDB$FIELD_POSITION RDB$EDIT_STRING RDB$RELATION_FIELDS RDB$EDIT_STRING RDB$BASE_FIELD RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$QUERY_NAME RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$FIELD_SOURCE RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$RELATION_NAME RDB$RELATION_FIELDS RDB$RELATION_NAME RDB$FIELD_NAME RDB$RELATION_FIELDS RDB$FIELD_NAME RDB$STATISTICS RDB$INDICES RDB$STATISTICS   RDB$EXPRESSION_SOURCE RDB$INDICES RDB$SOURCE   RDB$EXPRESSION_BLR RDB$INDICES RDB$VALUE   RDB$SYSTEM_FLAG RDB$INDICES RDB$SYSTEM_FLAG   RDB$FOREIGN_KEY RDB$INDICES RDB$RELATION_NAME RDB$INDEX_TYPE RDB$INDICES RDB$SYSTEM_FLAG RDB$INDEX_INACTIVE RDB$INDICES RDB$SYSTEM_FLAG RDB$SEGMENT_COUNT RDB$INDICES RDB$SEGMENT_COUNT RDB$DESCRIPTION RDB$INDICES RDB$DESCRIPTION RDB$UNIQUE_FLAG RDB$INDICES RDB$SYSTEM_FLAG RDB$INDEX_ID RDB$INDICES RDB$INDEX_ID RDB$RELATION_NAME RDB$INDICES RDB$RELATION_NAME RDB$INDEX_NAME RDB$INDICES RDB$INDEX_NAME RDB$STATISTICS RDB$INDEX_SEGMENTS RDB$STATISTICS RDB$FIELD_POSITION RDB$INDEX_SEGMENTS RDB$FIELD_POSITION RDB$FIELD_NAME RDB$INDEX_SEGMENTS RDB$FIELD_NAME RDB$INDEX_NAME RDB$INDEX_SEGMENTS RDB$INDEX_NAME 90$[D_KRLW U UD W K OL [ ] WD O i O, \ O V$ `^d^KIxQ^Nh^IWpQSQpW$KM RDB$TYPE RDB$TYPES RDB$GENERIC_TYPE RDB$FIELD_NAME RDB$TYPES RDB$FIELD_NAME RDB$SHADOW_NUMBER RDB$FILES RDB$SHADOW_NUMBER RDB$FILE_FLAGS RDB$FILES RDB$FILE_FLAGS RDB$FILE_LENGTH RDB$FILES RDB$FILE_LENGTH RDB$FILE_START RDB$FILES RDB$FILE_START RDB$FILE_SEQUENCE RDB$FILES RDB$FILE_SEQUENCE RDB$FILE_NAME RDB$FILES RDB$FILE_NAME RDB$DESCRIPTION RDB$SECURITY_CLASSES RDB$DESCRIPTION  RDB$ACL RDB$SECURITY_CLASSES RDB$ACL RDB$SECURITY_CLASS RDB$SECURITY_CLASSES RDB$SECURITY_CLASS RDB$DESCRIPTOR RDB$FORMATS RDB$DESCRIPTOR RDB$FORMAT RDB$FORMATS RDB$FORMAT RDB$RELATION_ID RDB$FORMATS RDB$RELATION_ID RDB$CONTEXT_NAME RDB$VIEW_RELATIONS RDB$CONTEXT_NAME RDB$VIEW_CONTEXT RDB$VIEW_RELATIONS RDB$VIEW_CONTEXT RDB$RELATION_NAME RDB$VIEW_RELATIONS RDB$RELATION_NAME RDB$VIEW_NAME RDB$VIEW_RELATIONS RDB$RELATION_NAME  RDB$FLAGS RDB$RELATIONS RDB$SYSTEM_FLAG RDB$DEFAULT_CLASS RDB$RELATIONS RDB$SECURITY_CLASS RDB$OWNER_NAME RDB$RELATIONS RDB$USER   RDB$EXTERNAL_DESCRIPTION RDB$RELATIONS RDB$EXTERNAL_DESCRIPTION   RDB$RUNTIME RDB$RELATIONS RDB$RUNTIME   RDB$EXTERNAL_FILE RDB$RELATIONS RDB$FILE_NAME   RDB$SECURITY_CLASS RDB$RELATIONS RDB$SECURITY_CLASS   RDB$RELATION_NAME RDB$RELATIONS RDB$RELATION_NAME RDB$FIELD_ID RDB$RELATIONS RDB$FIELD_ID RDB$FORMAT RDB$RELATIONS RDB$FORMAT RDB$DBKEY_LENGTH RDB$RELATIONS RDB$DBKEY_LENGTH RDB$SYSTEM_FLAG RDB$RELATIONS RDB$SYSTEM_FLAG RDB$RELATION_ID RDB$RELATIONS RDB$RELATION_ID RDB$DESCRIPTION RDB$RELATIONS RDB$DESCRIPTION RDB$VIEW_SOURCE RDB$RELATIONS RDB$SOURCE RDB$VIEW_BLR RDB$RELATIONS RDB$VIEW_BLR RDB$COLLATION_ID RDB$RELATION_FIELDS RDB$COLLATION_ID RDB$DEFAULT_SOURCE RDB$RELATION_FIELDS RDB$SOURCE 90"O\SSRXZ ` XL T V V@ [ V P@ X ` X( ] _p U [UdW UXT^U^0i\x\^`TdjRDB$CHARACTER_SET_ID RDB$FUNCTION_ARGUMENTS RDB$CHARACTER_SET_ID RDB$FIELD_SUB_TYPE RDB$FUNCTION_ARGUMENTS RDB$FIELD_SUB_TYPE RDB$FIELD_LENGTH RDB$FUNCTION_ARGUMENTS RDB$FIELD_LENGTH RDB$FIELD_SCALE RDB$FUNCTION_ARGUMENTS RDB$FIELD_SCALE RDB$FIELD_TYPE RDB$FUNCTION_ARGUMENTS RDB$FIELD_TYPE RDB$MECHANISM RDB$FUNCTION_ARGUMENTS RDB$MECHANISM RDB$ARGUMENT_POSITION RDB$FUNCTION_ARGUMENTS RDB$FIELD_POSITION RDB$FUNCTION_NAME RDB$FUNCTION_ARGUMENTS RDB$FUNCTION_NAME RDB$SYSTEM_FLAG RDB$FUNCTIONS RDB$SYSTEM_FLAG RDB$RETURN_ARGUMENT RDB$FUNCTIONS RDB$FIELD_POSITION RDB$ENTRYPOINT RDB$FUNCTIONS RDB$EXTERNAL_NAME RDB$MODULE_NAME RDB$FUNCTIONS RDB$FILE_NAME RDB$DESCRIPTION RDB$FUNCTIONS RDB$DESCRIPTION RDB$QUERY_NAME RDB$FUNCTIONS RDB$FIELD_NAME RDB$FUNCTION_TYPE RDB$FUNCTIONS RDB$FUNCTION_TYPE RDB$FUNCTION_NAME RDB$FUNCTIONS RDB$FUNCTION_NAME RDB$DEPENDED_ON_TYPE RDB$DEPENDENCIES RDB$OBJECT_TYPE RDB$DEPENDENT_TYPE RDB$DEPENDENCIES RDB$OBJECT_TYPE RDB$FIELD_NAME RDB$DEPENDENCIES RDB$FIELD_NAME RDB$DEPENDED_ON_NAME RDB$DEPENDENCIES RDB$GENERIC_NAME RDB$DEPENDENT_NAME RDB$DEPENDENCIES RDB$GENERIC_NAME  RDB$FLAGS RDB$TRIGGERS RDB$SYSTEM_FLAG   RDB$SYSTEM_FLAG RDB$TRIGGERS RDB$SYSTEM_FLAG RDB$TRIGGER_INACTIVE RDB$TRIGGERS RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$TRIGGERS RDB$DESCRIPTION RDB$TRIGGER_BLR RDB$TRIGGERS RDB$TRIGGER_BLR RDB$TRIGGER_SOURCE RDB$TRIGGERS RDB$SOURCE RDB$TRIGGER_TYPE RDB$TRIGGERS RDB$TRIGGER_TYPE RDB$TRIGGER_SEQUENCE RDB$TRIGGERS RDB$TRIGGER_SEQUENCE RDB$RELATION_NAME RDB$TRIGGERS RDB$RELATION_NAME RDB$TRIGGER_NAME RDB$TRIGGERS RDB$TRIGGER_NAME RDB$SYSTEM_FLAG RDB$TYPES RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$TYPES RDB$DESCRIPTION RDB$TYPE_NAME RDB$TYPES RDB$TYPE_NAME 90"h0fSU0S V| [ \ Sp Z d Vh I R YX ^ ` [@ []ZfVPrXZDXXV8ZXX$djRDB$CONSTRAINT_TYPE RDB$RELATION_CONSTRAINTS RDB$CONSTRAINT_TYPE RDB$CONSTRAINT_NAME RDB$RELATION_CONSTRAINTS RDB$CONSTRAINT_NAME RDB$UPPER_BOUND RDB$FIELD_DIMENSIONS RDB$BOUND RDB$LOWER_BOUND RDB$FIELD_DIMENSIONS RDB$BOUND RDB$DIMENSION RDB$FIELD_DIMENSIONS RDB$DIMENSION RDB$FIELD_NAME RDB$FIELD_DIMENSIONS RDB$FIELD_NAME RDB$DESCRIPTION RDB$GENERATORS RDB$DESCRIPTION RDB$SYSTEM_FLAG RDB$GENERATORS RDB$SYSTEM_FLAG RDB$GENERATOR_ID RDB$GENERATORS RDB$GENERATOR_ID RDB$GENERATOR_NAME RDB$GENERATORS RDB$GENERATOR_NAME RDB$TRANSACTION_DESCRIPTION RDB$TRANSACTIONS RDB$TRANSACTION_DESCRIPTION RDB$TIMESTAMP RDB$TRANSACTIONS RDB$TIMESTAMP RDB$TRANSACTION_STATE RDB$TRANSACTIONS RDB$TRANSACTION_STATE RDB$TRANSACTION_ID RDB$TRANSACTIONS RDB$TRANSACTION_ID RDB$OBJECT_TYPE RDB$USER_PRIVILEGES RDB$OBJECT_TYPE RDB$USER_TYPE RDB$USER_PRIVILEGES RDB$OBJECT_TYPE RDB$FIELD_NAME RDB$USER_PRIVILEGES RDB$FIELD_NAME RDB$RELATION_NAME RDB$USER_PRIVILEGES RDB$GENERIC_NAME RDB$GRANT_OPTION RDB$USER_PRIVILEGES RDB$SYSTEM_FLAG RDB$PRIVILEGE RDB$USER_PRIVILEGES RDB$PRIVILEGE RDB$GRANTOR RDB$USER_PRIVILEGES RDB$USER  RDB$USER RDB$USER_PRIVILEGES RDB$USER RDB$MESSAGE RDB$TRIGGER_MESSAGES RDB$MESSAGE RDB$MESSAGE_NUMBER RDB$TRIGGER_MESSAGES RDB$MESSAGE_NUMBER RDB$TRIGGER_NAME RDB$TRIGGER_MESSAGES RDB$TRIGGER_NAME RDB$SYSTEM_FLAG RDB$FILTERS RDB$SYSTEM_FLAG RDB$OUTPUT_SUB_TYPE RDB$FILTERS RDB$FIELD_SUB_TYPE RDB$INPUT_SUB_TYPE RDB$FILTERS RDB$FIELD_SUB_TYPE RDB$ENTRYPOINT RDB$FILTERS RDB$EXTERNAL_NAME RDB$MODULE_NAME RDB$FILTERS RDB$FILE_NAME RDB$DESCRIPTION RDB$FILTERS RDB$DESCRIPTION RDB$FUNCTION_NAME RDB$FILTERS RDB$FUNCTION_NAME RDB$CHARACTER_LENGTH RDB$FUNCTION_ARGUMENTS RDB$FIELD_LENGTH   RDB$FIELD_PRECISION RDB$FUNCTION_ARGUMENTS RDB$FIELD_PRECISION 90!f8`hp`_ cL _ V V8 a a M( [ Wp _ [ Ud X Xd@eXX4\^P4PVxbhl<hbRDB$FIELD_SOURCE RDB$PROCEDURE_PARAMETERS RDB$FIELD_NAME RDB$PARAMETER_TYPE RDB$PROCEDURE_PARAMETERS RDB$PARAMETER_TYPE RDB$PARAMETER_NUMBER RDB$PROCEDURE_PARAMETERS RDB$PARAMETER_NUMBER RDB$PROCEDURE_NAME RDB$PROCEDURE_PARAMETERS RDB$PROCEDURE_NAME RDB$PARAMETER_NAME RDB$PROCEDURE_PARAMETERS RDB$PARAMETER_NAME RDB$SYSTEM_FLAG RDB$PROCEDURES RDB$SYSTEM_FLAG   RDB$RUNTIME RDB$PROCEDURES RDB$RUNTIME   RDB$OWNER_NAME RDB$PROCEDURES RDB$USER RDB$SECURITY_CLASS RDB$PROCEDURES RDB$SECURITY_CLASS RDB$PROCEDURE_BLR RDB$PROCEDURES RDB$PROCEDURE_BLR RDB$PROCEDURE_SOURCE RDB$PROCEDURES RDB$SOURCE RDB$DESCRIPTION RDB$PROCEDURES RDB$DESCRIPTION RDB$PROCEDURE_OUTPUTS RDB$PROCEDURES RDB$PROCEDURE_PARAMETERS RDB$PROCEDURE_INPUTS RDB$PROCEDURES RDB$PROCEDURE_PARAMETERS RDB$PROCEDURE_ID RDB$PROCEDURES RDB$PROCEDURE_ID RDB$PROCEDURE_NAME RDB$PROCEDURES RDB$PROCEDURE_NAME RDB$FILE_FLAGS RDB$LOG_FILES RDB$FILE_FLAGS RDB$FILE_P_OFFSET RDB$LOG_FILES RDB$FILE_P_OFFSET RDB$FILE_PARTITIONS RDB$LOG_FILES RDB$FILE_PARTITIONS RDB$FILE_LENGTH RDB$LOG_FILES RDB$FILE_LENGTH RDB$FILE_SEQUENCE RDB$LOG_FILES RDB$FILE_SEQUENCE RDB$FILE_NAME RDB$LOG_FILES RDB$FILE_NAME RDB$TRIGGER_NAME RDB$CHECK_CONSTRAINTS RDB$TRIGGER_NAME RDB$CONSTRAINT_NAME RDB$CHECK_CONSTRAINTS RDB$CONSTRAINT_NAME RDB$DELETE_RULE RDB$REF_CONSTRAINTS RDB$RULE RDB$UPDATE_RULE RDB$REF_CONSTRAINTS RDB$RULE RDB$MATCH_OPTION RDB$REF_CONSTRAINTS RDB$MATCH_OPTION RDB$CONST_NAME_UQ RDB$REF_CONSTRAINTS RDB$CONSTRAINT_NAME RDB$CONSTRAINT_NAME RDB$REF_CONSTRAINTS RDB$CONSTRAINT_NAME RDB$INDEX_NAME RDB$RELATION_CONSTRAINTS RDB$INDEX_NAME RDB$INITIALLY_DEFERRED RDB$RELATION_CONSTRAINTS RDB$DEFERRABLE RDB$DEFERRABLE RDB$RELATION_CONSTRAINTS RDB$DEFERRABLE RDB$RELATION_NAME RDB$RELATION_CONSTRAINTS RDB$RELATION_NAME 90"b<`dx]n h8 f Z \ ` e` X Z b< b V X0 \cdh XbXPXXdDKSpSRXd^NL RDB$SCN RDB$BACKUP_HISTORY RDB$SCN  RDB$GUID RDB$BACKUP_HISTORY RDB$GUID RDB$BACKUP_LEVEL RDB$BACKUP_HISTORY RDB$BACKUP_LEVEL RDB$TIMESTAMP RDB$BACKUP_HISTORY RDB$TIMESTAMP RDB$BACKUP_ID RDB$BACKUP_HISTORY RDB$BACKUP_ID RDB$SYSTEM_FLAG RDB$ROLES RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$ROLES RDB$DESCRIPTION RDB$OWNER_NAME RDB$ROLES RDB$USER RDB$ROLE_NAME RDB$ROLES RDB$USER RDB$SYSTEM_FLAG RDB$EXCEPTIONS RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$EXCEPTIONS RDB$DESCRIPTION RDB$MESSAGE RDB$EXCEPTIONS RDB$MESSAGE RDB$EXCEPTION_NUMBER RDB$EXCEPTIONS RDB$EXCEPTION_NUMBER RDB$EXCEPTION_NAME RDB$EXCEPTIONS RDB$EXCEPTION_NAME RDB$SPECIFIC_ATTRIBUTES RDB$COLLATIONS RDB$SPECIFIC_ATTRIBUTES RDB$BASE_COLLATION_NAME RDB$COLLATIONS RDB$COLLATION_NAME RDB$FUNCTION_NAME RDB$COLLATIONS RDB$FUNCTION_NAME RDB$DESCRIPTION RDB$COLLATIONS RDB$DESCRIPTION RDB$SYSTEM_FLAG RDB$COLLATIONS RDB$SYSTEM_FLAG RDB$COLLATION_ATTRIBUTES RDB$COLLATIONS RDB$GENERIC_TYPE RDB$CHARACTER_SET_ID RDB$COLLATIONS RDB$CHARACTER_SET_ID RDB$COLLATION_ID RDB$COLLATIONS RDB$COLLATION_ID RDB$COLLATION_NAME RDB$COLLATIONS RDB$COLLATION_NAME RDB$BYTES_PER_CHARACTER RDB$CHARACTER_SETS RDB$FIELD_LENGTH RDB$FUNCTION_NAME RDB$CHARACTER_SETS RDB$FUNCTION_NAME RDB$DESCRIPTION RDB$CHARACTER_SETS RDB$DESCRIPTION RDB$SYSTEM_FLAG RDB$CHARACTER_SETS RDB$SYSTEM_FLAG RDB$CHARACTER_SET_ID RDB$CHARACTER_SETS RDB$CHARACTER_SET_ID RDB$DEFAULT_COLLATE_NAME RDB$CHARACTER_SETS RDB$COLLATION_NAME RDB$NUMBER_OF_CHARACTERS RDB$CHARACTER_SETS RDB$NUMBER_OF_CHARACTERS RDB$FORM_OF_USE RDB$CHARACTER_SETS RDB$GENERIC_NAME RDB$CHARACTER_SET_NAME RDB$CHARACTER_SETS RDB$CHARACTER_SET_NAME RDB$SYSTEM_FLAG RDB$PROCEDURE_PARAMETERS RDB$SYSTEM_FLAG RDB$DESCRIPTION RDB$PROCEDURE_PARAMETERS RDB$DESCRIPTION 90/Xh>$A=?d?$@ < =` E$ : < . 00 W > ?l A$ E ? >x )L + T Ep >( E;<dJ CAGDOMPDDKSFH@=ACtDP!$* PHONE_EXT PHONE_LIST RDB$7 PHONE_EXT   PHONE_NO PHONE_LIST PHONENUMBER PHONE_NO CONTACT_LAST CUSTOMER LASTNAME  PHONE_NO CUSTOMER PHONENUMBER  POSTAL_CODE CUSTOMER RDB$21  JOB CUST_NO CUSTOMER CUSTNO LOYADDRESS_LINE1 CUSTOMER ADDRESSLINE ADDRESS_LINE2 CUFIRST_NAME PHONE_LIST FIRSTNAME FIRST_NAME N LOCATION PHONE_LIST RDB$6 LOCATION  EMP_NO PHONE_LIST EMPNO EMP_NO  LAST_NAME PHONE_LIST LASTNAME LAST_NAME   DEFAULT NULL-LCONTACT_LAST CUSTOMER LASTNAME  PHONE_NO CUSTOMER PHONENUMBER  POSTAL_CODE CUSTOMER RDB$21  JOB CUST_NO CUSTOMER CUSTNO LOYADDRESS_LINE1 CUSTOMER ADDRESSLINE ADDRESS_LINE2 CUSTOMER ADDRESSLINE PAFIRST_NAME PHONE_LIST FIRSTNAME FIRST_NAME  LOCATION PHONE_LIST RDB$6 LOCATION  EMP_NO PHONE_LIST EMPNO EMP_NO  PHONE_EXT PHONE_LIST RDB$7 PHONE_EXT   PHONE_NO PHONE_LIST PHONENUMBER PHONE_NO FIRST_NAME EMPLOYEE FIRSTNAME  N DEPT_NO EMPLOYEE DEPTNO  ART JOB_CODE EMPLOYEE JOBCODE MJOB_COUNTRY EMPLOYEE COUNTRYNAME   FULL_NAME EMPLOYEE RDB$9   EMP_NO EMPLOYEE EMPNO  LAST_NAME EMPLOYEE LASTNAME  PHONE_EXT EMPLOYEE RDB$7  JOB_GRADE EMPLOYEE JOBGRADE  HIRE_DATE EMPLOYEE RDB$8   DEFAULT 'NOW'  NOWL SALARY EMPLOYEE SALARY    DEPT_NO DEPARTMENT DEPTNO  DEPARTMENT DEPARTMENT RDB$5 RD HEAD_DEPT DEPARTMENT DEPTNO NAM LOCATION DEPARTMENT RDB$6 1 MNGR_NO DEPARTMENT EMPNO  PHONE_NO DEPARTMENT PHONENUMBER DEFAULT '555-1234'555-1234L BUDGET DEPARTMENT BUDGET  JOB_CODE JOB JOBCODE JOB_COUNTRY JOB COUNTRYNAME  JOB_TITLE JOB RDB$2 LANGUAGE_REQ JOB RDB$4  JOB_GRADE JOB JOBGRADE MIN_SALARY JOB SALARY MAX_SALARY JOB SALARY JOB_REQUIREMENT JOB RDB$3  COUNTRY COUNTRY COUNTRYNAME  CURRENCY COUNTRY RDB$1 RDB$FILE_NAME RDB$BACKUP_HISTORY RDB$FILE_NAME 9024:P=3083P08 4 6x 3D 2 . 4 3t 5@ 1 > 3 ;X 5 6 8 6x 6< < 3 < 1d 1, 5232T9::;h507258X4$4318L5xRDB$FUNCTION_TYPE pRDB$DESCRIPTOR PxRDB$MECHANISM xRDB$OBJECT_TYPE xRDB$TRIGGER_TYPE xRDB$GENERIC_TYPE xRDB$TRIGGER_SEQUENCE pRDB$RUNTIME PxRDB$DIMENSIONS pRDB$TYPE_NAME xRDB$EXTERNAL_NAME pRDB$FUNCTION_NAME pRDB$GENERIC_NAME pRDB$TRIGGER_NAME pRDB$TRIGGER_BLR PxRDB$FILE_FLAGS xRDB$FILE_LENGTH xRDB$FILE_START xRDB$FILE_SEQUENCE xRDB$FILE_NAME % pRDB$ACL PpRDB$SECURITY_CLASS  pRDB$VALUE PpRDB$VALIDATION_BLR PpRDB$VIEW_BLR PxRDB$FIELD_SUB_TYPE pRDB$SOURCE PxRDB$SEGMENT_LENGTH xRDB$SEGMENT_COUNT pRDB$RELATION_NAME xRDB$RELATION_ID pRDB$QUERY_HEADER PxRDB$PAGE_TYPE xRDB$PAGE_SEQUENCE xRDB$PAGE_NUMBER xRDB$DBKEY_LENGTH xRDB$FORMAT xRDB$FIELD_TYPE xRDB$FIELD_SCALE xRDB$FIELD_POSITION xRDB$FIELD_LENGTH pRDB$INDEX_NAME xRDB$INDEX_ID xRDB$SYSTEM_FLAG pRDB$FIELD_NAME xRDB$FIELD_ID xRDB$EDIT_STRING }%pRDB$DESCRIPTION PpRDB$CONTEXT_NAME xRDB$VIEW_CONTEXT 90369X1E/6t2@1 B 5 <T 4$ - 1 2 1H = 7 ( ; *@ = . 5 7d ;0 4 < <| <D 8 6@8X<$4<<t8<5714p,D+E-,p/@//pADDRESSLINE %pCOUNTRYNAME %pPHONENUMBER % pLASTNAME % pFIRSTNAME %pRDB$SPECIFIC_ATTRIBUTES P xRDB$SCN  xRDB$GUID &xRDB$BACKUP_LEVEL xRDB$BACKUP_ID xRDB$FIELD_PRECISION xRDB$FILE_P_OFFSET xRDB$EXCEPTION_NUMBER pRDB$EXCEPTION_NAME xRDB$NUMBER_OF_CHARACTERS xRDB$COLLATION_ID pRDB$COLLATION_NAME xRDB$CHARACTER_SET_ID pRDB$CHARACTER_SET_NAME xRDB$PARAMETER_TYPE xRDB$PARAMETER_NUMBER pRDB$PARAMETER_NAME pRDB$PROCEDURE_NAME xRDB$PROCEDURE_PARAMETERS xRDB$PROCEDURE_ID pRDB$PROCEDURE_BLR PxRDB$FILE_PARTITIONS  xRDB$RULE  RESTRICTLxRDB$MATCH_OPTION   FULLLxRDB$DEFERRABLE   NOLxRDB$CONSTRAINT_TYPE  pRDB$CONSTRAINT_NAME xRDB$NULL_FLAG xRDB$STATISTICS xRDB$DIMENSION  xRDB$BOUND xRDB$GENERATOR_ID pRDB$GENERATOR_NAME xRDB$SHADOW_NUMBER pRDB$EXTERNAL_DESCRIPTION PxRDB$PRIVILEGE  pRDB$USER xRDB$MESSAGE_NUMBER xRDB$MESSAGE %pRDB$TRANSACTION_DESCRIPTION PxRDB$TIMESTAMP #xRDB$TRANSACTION_STATE xRDB$TRANSACTION_ID 90=NONE GGNONE NONE NONE ssNONE NONE ;;NONE  NONE d d NONE  NONE  NONE ~ Q"~ Q NONE  Q" Q NONE : : NONE o o NONE F F NONE  NONE NONE NONE NONE NONE llNONE ]]NONE HHNONE &&NONE jjNONE jNONE jNONE jNONE NONE GGNONE NONE NONE QNONE QNONE QNONE QNONE QNONE QNONE QNONE QNONE QNONE QNONE QNONE QNONE QNONE QNONE NONE Q NONE NONE 90.2;9P8:;8h8,9 : 8| 9< = > >| >D 8 > : 7X 7 : = >X A = = ;\ = ??;\A=?t<D0<75\9 ;68t<<5;:<H@ 9 RDB$INDEX_43 RDB$INDEX_NAME ?NAM RDB$INDEX_42 RDB$CONSTRAINT_TYPE  ? RDB$INDEX_42 RDB$RELATION_NAME ? RDB$INDEX_41 RDB$FOREIGN_KEY $I?OL RDB$INDEX_40 RDB$TRIGGER_NAME `?A RDB$INDEX_39 RDB$ROLE_NAME ?4  RDB$INDEX_38 RDB$RELATION_NAME  a? RDB$INDEX_37 RDB$TYPE_NAME Lw? RDB$INDEX_36 RDB$FIELD_NAME ? RDB$INDEX_35 RDB$TRIGGER_NAME `UU? RDB$INDEX_34 RDB$RELATION_NAME ? RDB$INDEX_33 RDB$VIEW_NAME ?UU RDB$INDEX_32 RDB$TRANSACTION_ID  RDB$INDEX_31 RDB$RELATION_NAME  A? RDB$INDEX_30 RDB$USER ? RDB$INDEX_29 RDB$RELATION_NAME ? RDB$INDEX_43 RDB$INDEX_NAME  RDB$INDEX_42 RDB$CONSTRAINT_TYPE  RDB$INDEX_42 RDB$RELATION_NAME  RDB$INDEX_41 RDB$FOREIGN_KEY  RDB$INDEX_40 RDB$TRIGGER_NAME  RDB$INDEX_39 RDB$ROLE_NAME  RDB$INDEX_38 RDB$RELATION_NAME  RDB$INDEX_37 RDB$TYPE_NAME  RDB$INDEX_36 RDB$FIELD_NAME  RDB$INDEX_35 RDB$TRIGGER_NAME  RDB$INDEX_34 RDB$RELATION_NAME  RDB$INDEX_33 RDB$VIEW_NAME  RDB$INDEX_32 RDB$TRANSACTION_ID  RDB$INDEX_31 RDB$RELATION_NAME  RDB$INDEX_30 RDB$USER  RDB$INDEX_28 RDB$DEPENDED_ON_NAME `UU?_ RDB$INDEX_27 RDB$DEPENDENT_NAME `UU?EX_ RDB$INDEX_26 RDB$CHARACTER_SET_ID `}?CON RDB$INDEX_26 RDB$COLLATION_ID  q?B RDB$INDEX_25 RDB$CHARACTER_SET_ID `UU?B RDB$INDEX_24 RDB$EXCEPTION_NUMBER ?B RDB$INDEX_23 RDB$EXCEPTION_NAME ?RDB RDB$INDEX_22 RDB$PROCEDURE_ID ?$ RDB$INDEX_21 RDB$PROCEDURE_NAME ?ER_ RDB$INDEX_20 RDB$COLLATION_NAME `}?CLA RDB$INDEX_19 RDB$CHARACTER_SET_NAME `UU?a? RDB$INDEX_18 RDB$PARAMETER_NAME ? RDB$INDEX_18 RDB$PROCEDURE_NAME ? RDB$INDEX_17 RDB$OUTPUT_SUB_TYPE  RDB$INDEX_17 RDB$INPUT_SUB_TYPE  RDB$INDEX_16 RDB$FORMAT  ? RDB$INDEX_16 RDB$RELATION_ID  ? RDB$INDEX_15 RDB$RELATION_NAME @qf? RDB$INDEX_15 RDB$FIELD_NAME G r? RDB$INDEX_14 RDB$CONSTRAINT_NAME ? RDB$INDEX_13 RDB$CONSTRAINT_NAME $I? RDB$INDEX_12 RDB$CONSTRAINT_NAME ? RDB$INDEX_11 RDB$GENERATOR_NAME E? RDB$INDEX_10 RDB$FUNCTION_NAME ? RDB$INDEX_9 RDB$FUNCTION_NAME ? RDB$INDEX_8 RDB$TRIGGER_NAME `? RDB$INDEX_7 RDB$SECURITY_CLASS ? RDB$INDEX_6 RDB$INDEX_NAME  a? RDB$INDEX_5 RDB$INDEX_NAME  a? RDB$INDEX_4 RDB$RELATION_NAME ? RDB$INDEX_3 RDB$FIELD_SOURCE #v? RDB$INDEX_2 RDB$FIELD_NAME @r? RDB$INDEX_1 RDB$RELATION_ID ? RDB$INDEX_0 RDB$RELATION_NAME ?p90=,P{TARCOUNTRYUSTOMER DEPARTMENTEMPLOYEE _PROJECTJOB PHONE_LISTROJECT  _DEPT_BUDGETRDB$BACKUP_HISTORYCHARACTER_SETSECK_CONSTRAINTS OLLATIONSDATABASE  EPENDENCIES EXCEPTIONSFIELDS _DIMENSIONS LESTERSORMATSUNCTIONS _ARGUMENTS GENERATORSINDEX_SEGMENTSICES LOG_FILESPAGES ROCEDURES _PARAMETERSREF_CONSTRAINTSLATIONS _CONSTRAINTS FIELDSOLES SECURITY_CLASSES TRANSACTIONS IGGERS _MESSAGES YPESUSER_PRIVILEGESVIEW_RELATIONSSALARY_HISTORYEST234 4 4 4 905,@|A<@DGlA(C G B\ @ H E| O0 J J JX @ < L I< E B Cl E, @IETB EH|E<@ADpD$IF>;d: D:GTGRDB$INDEX_37 RDB$TYPES Lw? RDB$INDEX_34 RDB$VIEW_RELATIONS $INRDB$INDEX_33 RDB$VIEW_RELATIONS $INRDB$INDEX_30 RDB$USER_PRIVILEGES INRDB$INDEX_27 RDB$DEPENDENCIES NRDB$INDEX_24 RDB$EXCEPTIONS $INRDB$INDEX_21 RDB$PROCEDURES NRDB$INDEX_18 RDB$PROCEDURE_PARAMETERS $INRDB$INDEX_16 RDB$FORMATS RDRDB$INDEX_13 RDB$REF_CONSTRAINTS RDB$INDEX_9 RDB$FUNCTIONS $INRDB$INDEX_6 RDB$INDEX_SEGMENTS RDB$INDEX_3 RDB$RELATION_FIELDS $INRDB$INDEX_43 RDB$RELATION_CONSTRAINTS /RDB$INDEX_42 RDB$RELATION_CONSTRAINTS RDB$INDEX_41 RDB$INDICES -RDB$INDEX_40 RDB$CHECK_CONSTRAINTS RDB$INDEX_39 RDB$ROLES RDB$INDEX_38 RDB$TRIGGERS RDB$INDEX_36 RDB$FIELD_DIMENSIONS ?RDB$INDEX_35 RDB$TRIGGER_MESSAGES `UU??RDB$INDEX_34 RDB$VIEW_RELATIONS ?RDB$INDEX_33 RDB$VIEW_RELATIONS ?RDB$INDEX_32 RDB$TRANSACTIONS RDB$INDEX_31 RDB$INDICES  A?RDB$INDEX_30 RDB$USER_PRIVILEGES ?RDB$INDEX_29 RDB$USER_PRIVILEGES ?RDB$INDEX_28 RDB$DEPENDENCIES `UU? RDB$INDEX_27 RDB$DEPENDENCIES RDB$INDEX_26 RDB$COLLATIONS `}?RDB$INDEX_25 RDB$CHARACTER_SETS `UU? RDB$INDEX_24 RDB$EXCEPTIONS RDB$INDEX_23 RDB$EXCEPTIONS ? RDB$INDEX_22 RDB$PROCEDURES ?RDB$INDEX_21 RDB$PROCEDURES RDRDB$INDEX_20 RDB$COLLATIONS `}?RDB$INDEX_19 RDB$CHARACTER_SETS `UU?RDB$INDEX_18 RDB$PROCEDURE_PARAMETERS RDB$INDEX_17 RDB$FILTERS RDB$INDEX_16 RDB$FORMATS  ?RDB$INDEX_15 RDB$RELATION_FIELDS @qf?RDB$INDEX_14 RDB$CHECK_CONSTRAINTS ?RDB$INDEX_13 RDB$REF_CONSTRAINTS $I?X_RDB$INDEX_12 RDB$RELATION_CONSTRAINTS ?RDB$INDEX_11 RDB$GENERATORS E?RDB$INDEX_10 RDB$FUNCTION_ARGUMENTS ?RDB$INDEX_9 RDB$FUNCTIONS ?RDB$INDEX_8 RDB$TRIGGERS `?RDB$INDEX_7 RDB$SECURITY_CLASSES ?ERDB$INDEX_6 RDB$INDEX_SEGMENTS RDB$INDEX_5 RDB$INDICES  a?RDB$INDEX_4 RDB$RELATION_FIELDS ?BRDB$INDEX_3 RDB$RELATION_FIELDS RDB$INDEX_2 RDB$FIELDS @r?RDB$INDEX_1 RDB$RELATIONS ??RDB$INDEX_0 RDB$RELATIONS p90>;'@ "$&(*,.0123456789:;<=>?@` @`a @`e   p908<4PRDB$B ADDRESSLINE BUDGET COUNTRYNAMEUSTNODEPTNOEMPNO FIRSTNAMEJOBCODEGRADELASTNAME PHONENUMBER ONUMBER RODTYPEJNORDB$101212345678930123454567892012345678930123456789401234567812345915012394012345675678960123450123456789 6014567895ACL BACKUP_ID LEVELOUNDCHARACTER_SET_IDNAME OLLATION_IDNAME NSTRAINT_NAMETYPE TEXT_NAME DBKEY_LENGTH EFERRABLE SCRIPTION ORIMENSION S EDIT_STRING XCEPTION_NAMEUMBERTERNAL_DESCRIPTION NAMEFIELD_ID LENGTH NAME POSITION RECISION SCALE UB_TYPE TYPELE_FLAGS LENGTH NAME PARTITIONS _OFFSET SEQUENCE TART ORMAT UNCTION_NAME TYPE GENERATOR_IDNAME IC_NAME  TYPEUIDINDEX_ID NAME MATCH_OPTIONECHANISMSSAGE _NUMBER NULL_FLAGMBER_OF_CHARACTERS OBJECT_TYPE PAGE_NUMBER SEQUENCE TYPE  RAMETER_NAME UMBERTYPERIVILEGE OCEDURE_BLR ID NAME  PARAMETERS QUERY_HEADER RELATION_ID NAMEULE NTIMESCN ECURITY_CLASS GMENT_COUNT LENGTH HADOW_NUMBEROURCEPECIFIC_ATTRIBUTES TATISTICS YSTEM_FLAG TIMESTAMPRANSACTION_DESCRIPTIONIDSTATE IGGER_BLR NAME  SEQUENCE  TYPEYPE_NAMEUSERVALIDATION_BLRUEIEW_BLR CONTEXTSALARY ARY ARY ARY ARY p90= ?PRDB$BFILE_S/S5 ADDRESSLINE5 4BUDGET< 4 COUNTRYNAME4 5 ; 5USTNOC4DEPTNO45<4EMPNO55<<<C 5 FIRSTNAME5 ; 4JOBCODE54GRADE55LASTNAME554 PHONENUMBER5 5 =ONUMBER<RODTYPEC <JNO<< 4RDB$1<0<1<2D1D2C3D4D5D6D7C8C9<3C0C1D2C3C4C5<4<5<6<7;8;942;051;2C3=4<5<6C7C8=943=0<144C81C2C3C4C5C9145<39<40<1<2;3<4;5<6<7465D50D1D2D3D4D5D6D7D8D9D60D1D4D5D65755859D5ACL- BACKUP_ID- LEVELOUND CHARACTER_SET_ID--NAME, OLLATION_ID-,NAME-- NSTRAINT_NAME%%%TYPE TEXT_NAME DBKEY_LENGTH % EFERRABLE% SCRIPTION&,---- ORIMENSION S EDIT_STRING- XCEPTION_NAME-UMBER TERNAL_DESCRIPTION NAME FIELD_ID  LENGTH- NAME& POSITION RECISION SCALE UB_TYPE TYPELE_FLAGS% LENGTH%  NAME   % 4 % PARTITIONS% _OFFSET SEQUENCE% TARTORMAT  UNCTION_NAME-- TYPE GENERATOR_IDNAME IC_NAME, TYPE--UIDINDEX_ID NAME%% MATCH_OPTION ECHANISMSSAGE-  _NUMBER NULL_FLAG ,MBER_OF_CHARACTERS OBJECT_TYPE PAGE_NUMBER SEQUENCE TYPE& RAMETER_NAME &UMBER &TYPE RIVILEGE& OCEDURE_BLR%ID%NAME&% PARAMETERS% QUERY_HEADER RELATION_ID NAME%%ULE% NTIME& -SCN ECURITY_CLASS& GMENT_COUNT LENGTH HADOW_NUMBER OURCE     & -PECIFIC_ATTRIBUTES TATISTICS YSTEM_FLAG&,---- TIMESTAMP- RANSACTION_DESCRIPTIONIDSTATE IGGER_BLR NAME% SEQUENCE TYPE YPE_NAME USER&-- VALIDATION_BLR UE   IEW_BLR  CONTEXT 4SALARY44< < < < < p90=cOBP RDB$FILTERS TRIGGERSDARDDDDDDDDDDDDDD 4COUNTRY45USTOMER55555;;;;;;4 DEPARTMENT4 4 4 4 4 4 4EMPLOYEE5555555555 <_PROJECT< 4JOB4444444 5 PHONE_LIST5 5 5 5 5 <ROJECT<<<<< _DEPT_BUDGET<<<<-RDB$BACKUP_HISTORY----4,CHARACTER_SETS,,,-----%ECK_CONSTRAINTS%- OLLATIONS--------DATABASE  EPENDENCIES- EXCEPTIONS----FIELDS      _DIMENSIONSLES     TERS      ORMATS  UNCTIONS        _ARGUMENTS GENERATORSINDEX_SEGMENTSICES            % LOG_FILES% % % % % PAGES % ROCEDURES%%%&&&&&&&& _PARAMETERS&&&&,,%REF_CONSTRAINTS%%%%LATIONS                _CONSTRAINTS%%%% FIELDS-OLES- - - SECURITY_CLASSES TRANSACTIONSIGGERS          _MESSAGESYPES    USER_PRIVILEGESVIEW_RELATIONS<SALARY_HISTORY<<<<<<ES<<====CCCCCCDTC2CCCCCCCCDDDDDDDC3CCCC;4;<<<<<<< < < < p90+'PBUDGETXCHANGEXUSTNAMEXREGIONMAXSALXINSALX NAMEXEEDX PRODTYPEXQTYXRDB$114 FOREIGN10 3 5 6 8 9 21 3 5 6 3 6 8 9INDEX_0 1 0 1 2 3 4 5 6 7 8 9 2 0 1 2 3 4 5 6 7 8 9 3 0 1 2 3 4 5 6 7 8 9 4 0 1 2 3 4 5 5 6 7 8 9PRIMARY1 2 4 7 2 0 2 4 5 7 SALESTATXUPDATERX p90)-'PBUDGETXCHANGEXUSTNAMEXREGION  MAXSALX  INSALX NAMEXEEDX  PRODTYPEX QTYX RDB$114 FOREIGN10 3 5 6 8 9 21 3 5 6 3 6 8 9  INDEX_0 1 0 1 2 3 4 5 6 7 8 9 2 0 1 2 3 4 5 6  7 8 9 3 0 1 2 3 4 5 6 7 8 9 4 0 1 2  3 4  5 5 6 7 8 9PRIMARY1 2 4  7   2  0   2 4 5 7 SALESTATX UPDATERX p90+ ''PSQL$ADD_EMP_PROJLL_LANGSRCOUNTRYUSTOMERDEFAULT1 0 1 2 3 4 5 6 7 8 9 2 0 1 2 3 4 5 6 7 8 9 3 0 1 2 3 4 5 6 7 8 9 4 0 1 2 3 4 5 6 7 8 5 6 7 8 9 LETE_EMPLOYEE PARTMENTT_BUDGETEMPLOYEE _PROJECT GET_EMP_PROJ JOB MAIL_LABEL ORG_CHART PHONE_LISTROJECT _DEPT_BUDGET RDB$ROLESSALARY_HISTORY ES HIP_ORDEROW_LANGS UB_TOT_BUDGETT234 p90p 'PCHECK_1%0%1%2%3%4&5&6&7&8&92&0&1&2,3,4-5-6-7-8345678%9 -POST_NEW_ORDER RDB$TRIGGER_1 0 1 2 3 4 5 6 7 8 9 2 0 1 2 3 4 5 6 7 8 9 3 0 1 2 3 4 5 6 4 5 6 8 9SAVE_SALARY_CHANGE% ET_CUST_NOEMP_NO- TR_CONNECT-MULTI p90J'PRDB$GET_CONTEXT SET_CONTEXT p90OY'PRDB$GET_CONTEXT SET_CONTEXT p90'P CUST_NO_GEN EMP_NO_GENRDB$BACKUP_HISTORYCONSTRAINT_NAME EXCEPTIONS  FIELD_NAME  INDEX_NAME PROCEDURESSECURITY_CLASS  TRIGGER_NAME SQL$DEFAULT p90!o'PINTEG_10123456789201234567893012345678940123456789501234567896012345678970123456789809 p90Ut'PINTEG_11728931640178 56 61 778 p903'PINTEG_1234892012345630237842345950123478962345678970123459809 p90>{`x^DO [RDB$BACKUP_ CONSTRAINT_NAMERDB$X DESCRIPTIONRDB$5ADDRESS_LINE1CUSTOMER52CUSTOMER< GEDSALES4BUDGETDEPARTMENTDC1ARDTD2C3<4D0ARCT2D1ARCT2D2ARDT2D3ARCT2 D4ARCT2 D5ARCT2C6T2D2ARDT2C3D3ARCT2C3D4ARDT2C3 D5ARDT2C3D6ARDT2 D7ARDT2 D8ARCT2D9ARCT2<HANGE_DATESALARY_HISTORY; ITYCUSTOMER;ONTACT_FIRSTCUSTOMER5 LASTCUSTOMER 4UNTRYCOUNTRY; USTOMER 4URRENCYCOUNTRY;STOMERCUSTOMER5_NOCUSTOMERC SALES< _NONET4< OCTETST4< UTF8T4<WIN1250T4<DATE_NEEDEDSALES4EPARTMENTDEPARTMENT4T_NODEPARTMENT5 EMPLOYEE< PROJ_DEPT_BUDGET=ISCOUNTSALES5EMP_NOEMPLOYEE < _PROJECT 5 PHONE_LIST< SALARY_HISTORY 5FIRST_NAMEEMPLOYEE5 PHONE_LIST< SCAL_YEARPROJ_DEPT_BUDGET5ULL_NAMEEMPLOYEE4HEAD_DEPTDEPARTMENT5IRE_DATEEMPLOYEE CITEM_TYPESALES5JOB_CODEEMPLOYEE4 JOB5UNTRYEMPLOYEE4JOB5GRADEEMPLOYEE4JOB 4REQUIREMENTJOB4 TITLEJOB4LANGUAGE_REQJOB5ST_NAMEEMPLOYEE 5 PHONE_LIST4OCATIONDEPARTMENT5 PHONE_LIST 4MAX_SALARYJOB4IN_SALARYJOB4NGR_NODEPARTMENT< NEW_SALARYSALARY_HISTORY< OLD_SALARYSALARY_HISTORY;N_HOLDCUSTOMER=RDER_DATESALESCSTATUSSALES C PAIDSALES<$ERCENT_CHANGESALARY_HISTORY5HONE_EXTEMPLOYEE 5 PHONE_LIST5 NOCUSTOMER4 DEPARTMENT 5 PHONE_LIST5OSTAL_CODECUSTOMER=_NUMBERSALES<RODUCTPROJECT<$JECTED_BUDGETPROJ_DEPT_BUDGET<_DESCPROJECT <IDEMPLOYEE_PROJECT < PROJECT<_DEPT_BUDGET <NAMEPROJECTCQTY_ORDEREDSALES<&UART_HEAD_CNTPROJ_DEPT_BUDGET"RDB$ACLRDB$SECURITY_CLASSES3RGUMENT_POSITIONRDB$FUNCTION_ARGUMENTS-%BACKUP_IDRDB$BACKUP_HISTORY-LEVELRDB$BACKUP_HISTORY -(SE_COLLATION_NAMERDB$COLLATIONS FIELDRDB$RELATION_FIELDS-.YTES_PER_CHARACTERRDB$CHARACTER_SETS CHARACTER_LENGTHRDB$FIELDS UNCTION_ARGUMENTS-SET_IDRDB$CHARACTER_SETS- OLLATIONSFIELDS UNCTION_ARGUMENTS,NAMERDB$CHARACTER_SETS$ DATABASE-)OLLATION_ATTRIBUTESRDB$COLLATIONS-IDRDB$COLLATIONSFIELDSRELATION_FIELDS-NAMERDB$COLLATIONS$MPLEX_NAMERDB$RELATION_FIELDS UTED_BLRRDB$FIELDS SOURCERDB$FIELDS%,NSTRAINT_NAMERDB$CHECK_CONSTRAINTS%REF_CONSTRAINTS!LATION_CONSTRAINTS$TYPERDB$RELATION_CONSTRAINTS% %_NAME_UQRDB$REF_CONSTRAINTS "TEXT_NAMERDB$VIEW_RELATIONSDBKEY_LENGTHRDB$RELATIONS#EFAULT_CLASSRDB$RELATIONS,$OLLATE_NAMERDB$CHARACTER_SETSSOURCERDB$FIELDSRELATION_FIELDSVALUERDB$FIELDS RELATION_FIELDS % )ERRABLERDB$RELATION_CONSTRAINTS%$LETE_RULERDB$REF_CONSTRAINTS%PENDED_ON_NAMERDB$DEPENDENCIESTYPERDB$DEPENDENCIESNT_NAMERDB$DEPENDENCIESTYPERDB$DEPENDENCIES-#SCRIPTIONRDB$CHARACTER_SETS - OLLATIONS DATABASE- EXCEPTIONSFIELDSLTERS UNCTIONS GENERATORSINDICES& PROCEDURES,% _PARAMETERS RELATIONS $_FIELDS-OLESSECURITY_CLASSES TRIGGERSYPESORRDB$FORMATS&IMENSIONRDB$FIELD_DIMENSIONSSRDB$FIELDSEDIT_STRINGRDB$FIELDSRELATION_FIELDSNTRYPOINTRDB$FILTERS UNCTIONS-$XCEPTION_NAMERDB$EXCEPTIONS-UMBERRDB$EXCEPTIONSPRESSION_BLRRDB$INDICES^SOURCERDB$INDICESCESCESCESCERDB$FIELDSVALUERDB$FIELDSODULE_NAMERDB$FILTERS UNCTIONSNULL_FLAGRDB$FIELDSPRELATION_FIELDSp90% ^RDB$PROCEDURE_xSTRIGGER_NAMERDB$ ,RDB$NULL_FLAGRDB$RELATION_FIELDS,-MBER_OF_CHARACTERSRDB$CHARACTER_SETS&OBJECT_TYPERDB$USER_PRIVILEGES UTPUT_SUB_TYPERDB$FILTERS&WNER_NAMERDB$PROCEDURES  RELATIONS-OLESPAGE_NUMBERRDB$PAGES SEQUENCERDB$PAGES TYPERDB$PAGES&/RAMETER_NAMERDB$PROCEDURE_PARAMETERS &$UMBERRDB$PROCEDURE_PARAMETERS &%TYPERDB$PROCEDURE_PARAMETERS %RIVILEGERDB$USER_PRIVILEGES&#OCEDURE_BLRRDB$PROCEDURES%IDRDB$PROCEDURES%NPUTSRDB$PROCEDURES%NAMERDB$PROCEDURES&* _PARAMETERS%OUTPUTSRDB$PROCEDURES&SOURCERDB$PROCEDURESQUERY_HEADERRDB$FIELDSRELATION_FIELDS NAMERDB$FIELDS UNCTIONSRELATION_FIELDSRELATION_IDRDB$DATABASEFORMATSPAGES RELATIONSNAMERDB$INDICES RELATIONS %)_CONSTRAINTS*FIELDS TRIGGERS USER_PRIVILEGESVIEW_RELATIONS"TURN_ARGUMENTRDB$FUNCTIONS-OLE_NAMERDB$ROLES&UNTIMERDB$PROCEDURES  RELATIONS-SCNRDB$BACKUP_HISTORY!ECURITY_CLASSRDB$DATABASE& PROCEDURES  RELATIONS)_FIELDSSECURITY_CLASSESGMENT_COUNTRDB$INDICESLENGTHRDB$FIELDSHADOW_NUMBERRDB$FILES -)PECIFIC_ATTRIBUTESRDB$COLLATIONS$TATISTICSRDB$INDEX_SEGMENTSICES-$YSTEM_FLAGRDB$CHARACTER_SETS - OLLATIONS- EXCEPTIONSFIELDSLTERS UNCTIONS GENERATORSINDICES& PROCEDURES,% _PARAMETERS RELATIONS $_FIELDS-OLES TRIGGERSYPES-%TIMESTAMPRDB$BACKUP_HISTORYTRANSACTIONS0RANSACTION_DESCRIPTIONRDB$TRANSACTIONSIDRDB$TRANSACTIONSSTATERDB$TRANSACTIONSIGGER_BLRRDB$TRIGGERSINACTIVERDB$TRIGGERS%NAMERDB$CHECK_CONSTRAINTS TRIGGERS" _MESSAGESSEQUENCERDB$TRIGGERSOURCERDB$TRIGGERSTYPERDB$TRIGGERSYPERDB$TYPES  _NAMERDB$TYPESUNIQUE_FLAGRDB$INDICES%PDATE_FLAGRDB$RELATION_FIELDS%RULERDB$REF_CONSTRAINTS%PER_BOUNDRDB$FIELD_DIMENSIONSSERRDB$USER_PRIVILEGES "_TYPERDB$USER_PRIVILEGES  VALIDATION_BLRRDB$FIELDS SOURCERDB$FIELDSIEW_BLRRDB$RELATIONS  CONTEXTRDB$RELATION_FIELDSVIEW_RELATIONS NAMERDB$VIEW_RELATIONS SOURCERDB$RELATIONS4SALARYEMPLOYEE CES_REPSALES<HIP_DATESALES;TATE_PROVINCECUSTOMER <TEAM_LEADERPROJECT=OTAL_VALUESALES< UPDATER_IDSALARY_HISTORY; V_NONET4< OCTETST4< UTF8T4;WIN1250T4 p90'`c,RDB$EXPRESSION_SOURCERDB$INDICESd&NULL_FLAGRDB$RELATION_FIELDS p90A+'@` @`   a @`e  p90('@ p90'ADD_EMP_PROJEMP_NOPROJ_IDLL_LANGSCODEUNTRYGRADELANG DELETE_EMPLOYEEEMP_NUM PT_BUDGETDNO TOTGET_EMP_PROJEMP_NOPROJ_IDMAIL_LABELCUST_NOLINE123456 ORG_CHARTDEPARTMENTEMP_CNT  HEAD_DEPT MNGR_NAMETITLESHIP_ORDERPO_NUMOW_LANGSCODETYGRADE LANGUAGESUB_TOT_BUDGETAVG_BUDGET HEAD_DEPT MAX_BUDGET IN_BUDGET TOT_BUDGET p90V'PASCII BIG_5CYRLDOS43773775850278601234569 EUCJ_0208 GB_2312 ISO8859_1 323456789 KOI8RU SC_5601NEXTONEOCTETS SJIS_0208 UNICODE_FSSTF8WIN125012345678 p90.,PNASCIIBIG_5S_BACS_CZYRLDA_DAB_CSYDAN865 EU437850ESP437850FIN437RA437850C85063ITA437850NLD437850OR865PLKTB850G860RUSSLOVE437850TRKUK437850S437850 E_DE OS43773775850278601234569U_NLEN_UKSS_ES_CI_AIUCJ_0208FI_FI R_CA FRGB_2312 ISO8859_1 323456789_HUNPLK _IS T_ITKOI8R_RUU_UASC_5601 DICTIONARYLT_LT NEXTONE_NO XT_DEU ESP FRA ITA USOCTETS PDOX_ASCIICSYYRLHUN INTLSLNORDAN4PLKSLO WEDFINT_BRPTXW_CSYYRL GREEKHUNDCINTL850NORDAN4PLKSLOVPANWEDFIN TURK SJIS_0208V_SV  TEST_COLLATE UCS_BASICNICODE_FSSTF8 WIN12501_UA2 3 4 5 6 7_EELT V8_CZ_CI_AIPTBR p90'P ADD_EMP_PROJLL_LANGS DELETE_EMPLOYEE PT_BUDGET GET_EMP_PROJ MAIL_LABEL ORG_CHART SHIP_ORDEROW_LANGS UB_TOT_BUDGET p90R'@ "$ p90 'PCUSTOMER_CHECK ON_HOLDORDER_ALREADY_SHIPPEDREASSIGN_SALESUNKNOWN_EMP_ID p90>'@ p909'@"$&(*,.0123567ABCDFGHIJKLMN OP@ p90y2@w "$&(*,.012 3567ABCDFGHIJ K L M  NOP@$&(*, 356DFGIJ K NOP$&( 356FIJN $&( 356IJN $& 35FIJ$& 35FIJ$&5FIJ$&5FI $&5FI"$&5$$&5&$5($5,5.50515 _I p90 5P SET_EMP_NO ADD_EMP_PROJ   LL_LANGS     CHECK_1012345678920123456783456789DELETE_EMPLOYEE PT_BUDGET     GET_EMP_PROJ   MAIL_LABEL           ORG_CHART          PHONE_LIST RDB$17319SAVE_SALARY_CHANGE ET_CUST_NO EMP_NO  HIP_ORDER           OW_LANGS     UB_TOT_BUDGET p90t 0PSALESCUSTOMER_CHECK ON_HOLD_NO_GEN DEPARTMENT               T_BUDGETEMPLOYEE_PROJECT _NO_GENJOBORDER_ALREADY_SHIPPEDPROJECT  _DEPT_BUDGET REASSIGN_SALESSALARY_HISTORYES HOW_LANGS UNKNOWN_EMP_ID p906,PS ADD_EMP_PROJ LL_LANGS RCOUNTRYUSTOMERDELETE_EMPLOYEEPARTMENT      T_BUDGET EMPLOYEE_PROJECT GET_EMP_PROJ JOB MAIL_LABEL  ORG_CHART  PHONE_LIST      ROJECT  _DEPT_BUDGET RDB$ROLES SALARY_HISTORYES HIP_ORDER OW_LANGS  UB_TOT_BUDGETT234                p906'PPUBLICSYSDBA                p90'PCOUNTRYUSTOMER  DEPARTMENT    EMPLOYEE_PROJECTJOBPROJECT _DEPT_BUDGETRDB$BACKUP_HISTORYCHARACTER_SETSECK_CONSTRAINTS OLLATIONS DEPENDENCIES EXCEPTIONSFIELDS _DIMENSIONSLTERS ORMATS UNCTIONS _ARGUMENTS  GENERATORSINDEX_SEGMENTSICES   PROCEDURES _PARAMETERS REF_CONSTRAINTSLATIONS _CONSTRAINTS FIELDSOLESSECURITY_CLASSES TRANSACTIONSIGGERS  _MESSAGESYPESUSER_PRIVILEGESVIEW_RELATIONSSALARY_HISTORYES p90('@ p90 9'P PHONE_LIST p90B'P DEPARTMENTEMPLOYEE p90'P RDB$TRIGGER_1 0 2 3 4 5 7 8 9 2 0 1 2 3 4 5 6 3 1 2 3 6 5 9 p90j|'PRDB$13465123456789601456 p90  {2PINUACLNSISCII7BIG5_5NARYLOB_FILTER IDROOLEANY_ISC_DESCRIPTOR REFERENCE _WITH_NULLSCALAR_ARRAY_DESCRIPTORVALUE MS_DESCRIPTORCHECK_CONSTRAINTOMMITTED PUTED_FIELD STRING YRL DATEEPENDENT_COUNT OS437 73775850278601234569 _437 73775850278601234569936 4950UBLE EUCJ _0208 XCEPTION PRESSION_INDEXTERNAL_FILE_DESCRIPTIONFIELDLOATORMATGB2312_2312ENERATORINDEX T64 SO-8859-13 2 3 4 5 6 7 8 988591323456789_1  3 2 3 4 5 6 7 8 9 KOI8RU SC5601 _5601LATIN123457IMBOONGNEXTONEOCTETS POST_ERASEMODIFYSTORERE_ERASEMODIFYSTORE OCEDUREQLIUADRANGESEFERENTIAL_CONSTRAINTLATIONOLELED_BACKSHORT JIS_0208QL_TEXTUMMARYYSTEMTEXT IMESTAMPRANSACTION_DESCRIPTIONIGGERUDF NICODE_FSSSASCII ER_GROUPTF-88_FSS  VALIDATIONUERYINGIEW_CHECKWIN125012345678_125012345679364950 4950 p90 'P--COUNTRY %USTOMER%%EMPLOYEEJOBPROJ_DEPT_BUDGETRDB$CHECK_CONSTRAINTS EXCEPTIONSFIELDS GENERATORSINDEX_SEGMENTSICES  PROCEDURESREF_CONSTRAINTSLATIONS  _CONSTRAINTS  FIELDSTRIGGERS   USER_PRIVILEGES SALARY_HISTORY%ES%%%&&&&&&&&,,----- p905'P TEST_ROLE p90-'P CHANGE_DATEECK_1012345678920123456783456789OUNTRYURRENCYSTOMER_NO DEPARTMENT T_NOISCOUNT EMP_NO FIRST_NAME SCAL_YEAR HIRE_DATEJOB_CODEUNTRY GRADE TITLE LAST_NAME MAX_SALARY IN_SALARY OLD_SALARY RDER_DATE STATUSPERCENT_CHANGE O_NUMBERROJ_IDNAME QTY_ORDEREDSALARY TOTAL_VALUE UPDATER_ID p90'P`abcdefghijklmnopqrstuvwxyz{|}~`abcdefghijkopqtuvwyz{~abdeghilmnprtuv RDB$PRIMARY1  2  2 2 5   7    p907J@pSALARY_HISTORYCOUNTRYNOT NULL PRIMARY KEYUSTOMERCHECK FOREIGN KEY NOT NULL PRIMARY KEYDEPARTMENTFOREIGN KEY  NOT NULL PRIMARY KEYUNIQUEEMPLOYEECHECK FOREIGN KEY NOT NULL PRIMARY KEY _PROJECTFOREIGN KEY" NOT NULL PRIMARY KEY  JOBCHECK  FOREIGN KEY NOT NULL  PRIMARY KEYPROJECTFOREIGN KEY NOT NULL PRIMARY KEY UNIQUE _DEPT_BUDGETCHECK FOREIGN KEY"  NOT NULL PRIMARY KEYSALARY_HISTORYCHECK FOREIGN KEY NOT NULL PRIMARY KEY ESCHECK FOREIGN KEY NOT NULL  PRIMARY KEY p90 'P`bcdefghklmqrstuvwxy}`deijklrstuvwz{|`abcdefghijklpqRDB$114 FOREIGN10 3 5 6 8 9 21 3 5 6 3 6 8 9PRIMARY1 2 4 7 2 0 2 4 5 7 90(854\6(432/d44., 0 1h 90 8h1 1 1h 40 5 533d 2, 5823 .l 3l7 , 3 343D 0 0/1|2H368-0.L21,33P6761x2D12 RDB$FOREIGN9 JOB_GRADE  q? RDB$FOREIGN9 JOB_CODE  ;? RDB$FOREIGN8 DEPT_NO ? RDB$FOREIGN6 HEAD_DEPT ? RD RDB$FOREIGN3 JOB_COUNTRY $I?RDMAXSALX MAX_SALARY  ;?RDMAXSALX JOB_COUNTRY $I?MINSALX MIN_SALARY  RDB$FOREIGN26 SALES_REP ? RDB$FOREIGN25 CUST_NO  ?Y RDB$FOREIGN23 COUNTRY E?A RDB$FOREIGN21 EMP_NO ?JOB RDB$FOREIGN19 PROJ_ID ?  RDB$FOREIGN18 DEPT_NO  q? RDB$FOREIGN16 PROJ_ID ?a RDB$FOREIGN15 EMP_NO E?? RDB$FOREIGN13 TEAM_LEADER `UU? RDB$FOREIGN10 MNGR_NO  q? RDB$FOREIGN9 JOB_COUNTRY ?MAXSALX MAX_SALARY  ;?RDMAXSALX JOB_COUNTRY $I?MINSALX MIN_SALARY `UU?MINSALX JOB_COUNTRY $I? RDB$FOREIGN3 JOB_COUNTRY $I?RD RDB$PRIMARY2 JOB_COUNTRY !? RDB$PRIMARY2 JOB_GRADE  a?RD RDB$PRIMARY2 JOB_CODE $I? RDB$FOREIGN10 MNGR_NO BUDGETX BUDGET $I? RDB$FOREIGN6 HEAD_DEPT ? RD RDB$PRIMARY5 DEPT_NO  a?RDB$4 DEPARTMENT  a??NAMEX FIRST_NAME  a?NAMEX LAST_NAME ? RDB$FOREIGN9 JOB_GRADE  q? RDB$FOREIGN9 JOB_CODE  ;? RDB$FOREIGN8 DEPT_NO ? RDB$PRIMARY7 EMP_NO  a? CUSTREGION CITY  ? CUSTREGION COUNTRY E? CUSTNAMEX CUSTOMER  ? RDB$FOREIGN23 COUNTRY  RDB$PRIMARY22 CUST_NO  ?_ PRODTYPEX PROJ_NAME `UU? PRODTYPEX PRODUCT ? RDB$FOREIGN13 TEAM_LEADER  RDB$PRIMARY12 PROJ_ID `UU?RDB$11 PROJ_NAME `UU? RDB$FOREIGN16 PROJ_ID  RDB$FOREIGN15 EMP_NO  RDB$PRIMARY14 PROJ_ID $I? RDB$PRIMARY14 EMP_NO E? RDB$FOREIGN19 PROJ_ID  RDB$FOREIGN18 DEPT_NO  RDB$PRIMARY17 DEPT_NO `UU? RDB$PRIMARY17 PROJ_ID  q? RDB$PRIMARY17 FISCAL_YEAR ?CHANGEX CHANGE_DATE `UU?UPDATERX UPDATER_ID `UU? RDB$FOREIGN21 EMP_NO  RDB$PRIMARY20 UPDATER_ID ? RDB$PRIMARY20 CHANGE_DATE ? RDB$PRIMARY20 EMP_NO ?QTYX QTY_ORDERED E?QTYX ITEM_TYPE `UU? SALESTATX PAID `UU? SALESTATX ORDER_STATUS `UU?NEEDX DATE_NEEDED E? RDB$FOREIGN26 SALES_REP  RDB$FOREIGN25 CUST_NO  RDB$PRIMARY24 PO_NUMBER ? RDB$INDEX_45 RDB$FUNCTION_NAME  RDB$INDEX_44 RDB$BACKUP_ID  RDB$INDEX_44 RDB$BACKUP_LEVEL x90 ('P 90WFG|<D8ADE/3p*4< I ;t 64 > K TT > K T .L 5 B 1 6X C( . / ;x B4 B *0=LI2E0`=0/+4p|,RDB$FOREIGN26 SALES  RDB$PRIMARY7 ? RDB$INDEX_12 RDB$RELATION_CONSTRAINTS RDB$INDEX_11 RDB$GENERATORS RDB$INDEX_10 RDB$FUNCTION_ARGUMENTS RDB$INDEX_8 RDB$TRIGGERS RDB$INDEX_7 RDB$SECURITY_CLASSES  a?RDB$INDEX_5 RDB$INDICES RDB$INDEX_4 RDB$RELATION_FIELDS #v?RDB$INDEX_2 RDB$FIELDS RDB$INDEX_1 RDB$RELATIONS ?RDB$INDEX_0 RDB$RELATIONS RDB$INDEX_45 RDB$FILTERS RDB$INDEX_44 RDB$BACKUP_HISTORY  ?RDBRDB$INDEX_42 RDB$RELATION_CONSTRAINTS `?RDBRDB$INDEX_40 RDB$CHECK_CONSTRAINTS RDB$INDEX_38 RDB$TRIGGERS RDB$INDEX_37 RDB$TYPES RDB$INDEX_36 RDB$FIELD_DIMENSIONS ERDB$INDEX_35 RDB$TRIGGER_MESSAGES O@RDB$PRIMARY1 COUNTRY  > MAXSALX JOB D MINSALX JOB `UU?DBRDB$FOREIGN3 JOB RDB$PREL;RDB$PRIMARY2 JOB #IRDB$FOREIGN10 DEPARTMENT RDB$P_CO 9 BUDGETX DEPARTMENT X_ RDB$FOREIGN6 DEPARTMENT  RDB$PRIMARY5 ? RDB$PRIMARY5 DEPARTMENT  a?B 6 RDB$4 DEPARTMENT  4 NAMEX EMPLOYERD"GRDB$FOREIGN9 EMPLOYEE RDB$PIO!ERDB$FOREIGN8 EMPLOYEE RDB$PIORDB$PRIMARY7 EMPLOYEE  a? 1CUSTREGION CUSTOME_ / CUSTNAMEX CUSTOMEIN* RDB$FOREIGN23 CUSTOMER RDB$PO-RDB$PRIMARY22 CUSTOMER  + PRODTYPEX PROJECT EX_$KRDB$FOREIGN13 PROJECT RDB$PIO)RDB$PRIMARY12 PROJECT 2  ' RDB$11 PROJECT IN&RDB$FOREIGN16 EMPLOYEE_PROJECT  RDB$PRIMARY12 ?% RDB$FOREIGN15 EMPLOYEE_PROJECT RDB$PT %RDB$PRIMARY14 EMPLOYEE_PROJECT EL(RDB$FOREIGN19 PROJ_DEPT_BUDGET  RDB$PRIMARY12 ?' RDB$FOREIGN18 PROJ_DEPT_BUDGET RDB$PT #RDB$PRIMARY17 PROJ_DEPT_BUDGET EL  ! CHANGEX SALARY_HISTORY UPDATERX SALARY_HISTORY `UU? ) RDB$FOREIGN21 SALARY_HISTORY RDB$PSTR RDB$PRIMARY20 SALARY_HISTORY QTYX SALES RD SALESTATX SALES `UU?N NEEDX SALES E?D+  RDB$FOREIGN25 SALES RDB$PRTIORDB$PRIMARY24 SALES ?RDB$INDEX_45 RDB$FILTERS RDB$INDEX_44 RDB$BACKUP_HISTORY p90('P 90 112d101236\4(1 4 4 1X 1$ 2 6 5 4L 4 7 8 7\ H J 4 7p 38 8 = =p F, B89|9@:895`2(5<8|7<>723h3(=RDB$OBJECT_TYPE  DEPENDENT_COUNT RDB$OBJECT_TYPE  INDEX RDB$OBJECT_TYPE  FIELD RDB$OBJECT_TYPE USER RDB$OBJECT_TYPE EXCEPTION RDB$OBJECT_TYPE EXPRESSION_INDEX RDB$OBJECT_TYPE PROCEDURE RDB$OBJECT_TYPE VALIDATION RDB$OBJECT_TYPE COMPUTED_FIELD RDB$OBJECT_TYPE TRIGGER RDB$OBJECT_TYPE VIEW RDB$OBJECT_TYPE RELATION RDB$TRIGGER_TYPE POST_ERASE RDB$TRIGGER_TYPE PRE_ERASE RDB$TRIGGER_TYPE POST_MODIFY RDB$TRIGGER_TYPE PRE_MODIFY RDB$TRIGGER_TYPE POST_STORE RDB$TRIGGER_TYPE PRE_STORE  RDB$MECHANISM BY_REFERENCE_WITH_NULL  RDB$MECHANISM BY_SCALAR_ARRAY_DESCRIPTOR  RDB$MECHANISM BY_ISC_DESCRIPTOR  RDB$MECHANISM BY_VMS_DESCRIPTOR  RDB$MECHANISM BY_REFERENCE  RDB$MECHANISM BY_VALUE RDB$FUNCTION_TYPE BOOLEAN RDB$FUNCTION_TYPE VALUE RDB$FIELD_SUB_TYPE EXTERNAL_FILE_DESCRIPTION RDB$FIELD_SUB_TYPE TRANSACTION_DESCRIPTION RDB$FIELD_SUB_TYPE FORMAT RDB$FIELD_SUB_TYPE SUMMARY RDB$FIELD_SUB_TYPE RANGES RDB$FIELD_SUB_TYPE ACL RDB$FIELD_SUB_TYPE BLR RDB$FIELD_SUB_TYPE TEXT RDB$FIELD_SUB_TYPE BINARY RDB$FIELD_TYPE INT64 RDB$FIELD_TYPE  TIME RDB$FIELD_TYPE  DATE RDB$FIELD_TYPE -BLOB_ID RDB$FIELD_TYPE (CSTRING RDB$FIELD_TYPE BLOB RDB$FIELD_TYPE %VARYING RDB$FIELD_TYPE #TIMESTAMP RDB$FIELD_TYPE DOUBLE RDB$FIELD_TYPE  FLOAT RDB$FIELD_TYPE  QUAD RDB$FIELD_TYPE LONG RDB$FIELD_TYPE SHORT RDB$FIELD_TYPE TEXT 90 /82\7(199p=0? 1 4 1T > D 8 8d ;( ; : <t ;4 @ < =| 9@ : > 9 >H 9 ;<;X<;<>`> =;9h>(>=;l?,>>RDB$CHARACTER_SET_NAME ISO8859_3 RDB$CHARACTER_SET_NAME ISO8859_3 RDB$CHARACTER_SET_NAME ISO-8859-2 RDB$CHARACTER_SET_NAME LATIN2 RDB$CHARACTER_SET_NAME ISO88592 RDB$CHARACTER_SET_NAME ISO8859_2 RDB$CHARACTER_SET_NAME ISO8859_2 RDB$CHARACTER_SET_NAME ANSI RDB$CHARACTER_SET_NAME LATIN1 RDB$CHARACTER_SET_NAME ISO88591 RDB$CHARACTER_SET_NAME ISO8859_1 RDB$CHARACTER_SET_NAME ISO8859_1 RDB$CHARACTER_SET_NAME DOS_865 RDB$CHARACTER_SET_NAME DOS865 RDB$CHARACTER_SET_NAME DOS_850 RDB$CHARACTER_SET_NAME DOS850 RDB$CHARACTER_SET_NAME DOS_437 RDB$CHARACTER_SET_NAME DOS437 RDB$CHARACTER_SET_NAME EUCJ RDB$CHARACTER_SET_NAME EUCJ_0208 RDB$CHARACTER_SET_NAME SJIS RDB$CHARACTER_SET_NAME SJIS_0208 RDB$CHARACTER_SET_NAME UTF-8 RDB$CHARACTER_SET_NAME UTF8 RDB$CHARACTER_SET_NAME SQL_TEXT RDB$CHARACTER_SET_NAME UTF_FSS RDB$CHARACTER_SET_NAME UNICODE_FSS RDB$CHARACTER_SET_NAME ASCII7 RDB$CHARACTER_SET_NAME USASCII RDB$CHARACTER_SET_NAME ASCII RDB$CHARACTER_SET_NAME BINARY RDB$CHARACTER_SET_NAME OCTETS RDB$CHARACTER_SET_NAME NONE RDB$SYSTEM_FLAG VIEW_CHECK RDB$SYSTEM_FLAG REFERENTIAL_CONSTRAINT RDB$SYSTEM_FLAG CHECK_CONSTRAINT RDB$SYSTEM_FLAG QLI RDB$SYSTEM_FLAG SYSTEM RDB$SYSTEM_FLAG USER RDB$TRANSACTION_STATE ROLLED_BACK RDB$TRANSACTION_STATE COMMITTED RDB$TRANSACTION_STATE LIMBO RDB$OBJECT_TYPE BLOB_FILTER RDB$OBJECT_TYPE UDF RDB$OBJECT_TYPE GENERATOR RDB$OBJECT_TYPE  ROLE RDB$OBJECT_TYPE USER_GROUP 90 .=;D?>>=H;? > >H = ? > >H = ? > >H = ? > >H = ? > >H = ;??L? >;@T;<;<d;(<;<t;8<9;RDB$CHARACTER_SET_NAME DOS737 RDB$CHARACTER_SET_NAME 2CYRL RDB$CHARACTER_SET_NAME DOS_863 RDB$CHARACTER_SET_NAME DOS863 RDB$CHARACTER_SET_NAME /DOS_861 RDB$CHARACTER_SET_NAME /DOS861 RDB$CHARACTER_SET_NAME DOS_860 RDB$CHARACTER_SET_NAME DOS860 RDB$CHARACTER_SET_NAME .DOS_857 RDB$CHARACTER_SET_NAME .DOS857 RDB$CHARACTER_SET_NAME -DOS_852 RDB$CHARACTER_SET_NAME -DOS852 RDB$CHARACTER_SET_NAME (ISO-8859-13 RDB$CHARACTER_SET_NAME (LATIN7 RDB$CHARACTER_SET_NAME (ISO885913 RDB$CHARACTER_SET_NAME (ISO8859_13 RDB$CHARACTER_SET_NAME (ISO8859_13 RDB$CHARACTER_SET_NAME 'ISO-8859-9 RDB$CHARACTER_SET_NAME 'LATIN5 RDB$CHARACTER_SET_NAME 'ISO88599 RDB$CHARACTER_SET_NAME 'ISO8859_9 RDB$CHARACTER_SET_NAME 'ISO8859_9 RDB$CHARACTER_SET_NAME &ISO-8859-8 RDB$CHARACTER_SET_NAME &ISO88598 RDB$CHARACTER_SET_NAME &ISO8859_8 RDB$CHARACTER_SET_NAME &ISO8859_8 RDB$CHARACTER_SET_NAME %ISO-8859-7 RDB$CHARACTER_SET_NAME %ISO88597 RDB$CHARACTER_SET_NAME %ISO8859_7 RDB$CHARACTER_SET_NAME %ISO8859_7 RDB$CHARACTER_SET_NAME $ISO-8859-6 RDB$CHARACTER_SET_NAME $ISO88596 RDB$CHARACTER_SET_NAME $ISO8859_6 RDB$CHARACTER_SET_NAME $ISO8859_6 RDB$CHARACTER_SET_NAME #ISO-8859-5 RDB$CHARACTER_SET_NAME #ISO88595 RDB$CHARACTER_SET_NAME #ISO8859_5 RDB$CHARACTER_SET_NAME #ISO8859_5 RDB$CHARACTER_SET_NAME "ISO-8859-4 RDB$CHARACTER_SET_NAME "LATIN4 RDB$CHARACTER_SET_NAME "ISO88594 RDB$CHARACTER_SET_NAME "ISO8859_4 RDB$CHARACTER_SET_NAME "ISO8859_4 RDB$CHARACTER_SET_NAME ISO-8859-3 RDB$CHARACTER_SET_NAME LATIN3 RDB$CHARACTER_SET_NAME ISO88593 90 -<;L<;<;\< ; < ;l <0 ; < <x =< < = < =D < = < =L 9 < = <T = <==\< <<:l90<<<|;@<<::P<RDB$CHARACTER_SET_NAME AWIN1258 RDB$CHARACTER_SET_NAME @KOI8U RDB$CHARACTER_SET_NAME ?KOI8R RDB$CHARACTER_SET_NAME 9WIN_936 RDB$CHARACTER_SET_NAME 9DOS_936 RDB$CHARACTER_SET_NAME 9GB2312 RDB$CHARACTER_SET_NAME 9GB_2312 RDB$CHARACTER_SET_NAME 8WIN_950 RDB$CHARACTER_SET_NAME 8DOS_950 RDB$CHARACTER_SET_NAME 8BIG5 RDB$CHARACTER_SET_NAME 8BIG_5 RDB$CHARACTER_SET_NAME ,WIN_949 RDB$CHARACTER_SET_NAME ,DOS_949 RDB$CHARACTER_SET_NAME ,KSC5601 RDB$CHARACTER_SET_NAME ,KSC_5601 RDB$CHARACTER_SET_NAME <WIN_1257 RDB$CHARACTER_SET_NAME <WIN1257 RDB$CHARACTER_SET_NAME ;WIN_1256 RDB$CHARACTER_SET_NAME ;WIN1256 RDB$CHARACTER_SET_NAME :WIN_1255 RDB$CHARACTER_SET_NAME :WIN1255 RDB$CHARACTER_SET_NAME NEXT RDB$CHARACTER_SET_NAME 7WIN_1254 RDB$CHARACTER_SET_NAME 7WIN1254 RDB$CHARACTER_SET_NAME 6WIN_1253 RDB$CHARACTER_SET_NAME 6WIN1253 RDB$CHARACTER_SET_NAME 5WIN_1252 RDB$CHARACTER_SET_NAME 5WIN1252 RDB$CHARACTER_SET_NAME 4WIN_1251 RDB$CHARACTER_SET_NAME 4WIN1251 RDB$CHARACTER_SET_NAME 3WIN_1250 RDB$CHARACTER_SET_NAME 3WIN1250 RDB$CHARACTER_SET_NAME 1DOS_869 RDB$CHARACTER_SET_NAME 1DOS869 RDB$CHARACTER_SET_NAME 0DOS_866 RDB$CHARACTER_SET_NAME 0DOS866 RDB$CHARACTER_SET_NAME DOS_864 RDB$CHARACTER_SET_NAME DOS864 RDB$CHARACTER_SET_NAME DOS_862 RDB$CHARACTER_SET_NAME DOS862 RDB$CHARACTER_SET_NAME DOS_858 RDB$CHARACTER_SET_NAME DOS858 RDB$CHARACTER_SET_NAME DOS_775 RDB$CHARACTER_SET_NAME DOS775 RDB$CHARACTER_SET_NAME DOS_737 900*/t-89 +55l/</ / 5 5d 5, 5 5 5 5L 5 5 7 /| /L / / / + /` /0 / / / /p /< 1 111l1@+ 111p3@- 1--x1 WIN1258 WIN1258 A KOI8U KOI8U @ KOI8R KOI8R ? GB_2312 GB_2312 9 BIG_5 BIG_5 8 KSC_5601 KSC_5601 , WIN1257 WIN1257 < WIN1256 WIN1256 ; WIN1255 WIN1255 :NEXT NEXT  WIN1254 WIN1254 7 WIN1253 WIN1253 6 WIN1252 WIN1252 5 WIN1251 WIN1251 4 WIN1250 WIN1250 3 DOS869 DOS869 1 DOS866 DOS866 0 DOS864 DOS864  DOS862 DOS862  DOS858 DOS858  DOS775 DOS775  DOS737 DOS737  CYRL CYRL 2 DOS863 DOS863  DOS861 DOS861 / DOS860 DOS860   DOS857 DOS857 . DOS852 DOS852 -ISO8859_13 ISO8859_13 ( ISO8859_9 ISO8859_9 ' ISO8859_8 ISO8859_8 & ISO8859_7 ISO8859_7 % ISO8859_6 ISO8859_6 $ ISO8859_5 ISO8859_5 # ISO8859_4 ISO8859_4 " ISO8859_3 ISO8859_3  ISO8859_2 ISO8859_2  ISO8859_1 ISO8859_1  DOS865 DOS865   DOS850 DOS850   DOS437 DOS437   EUCJ_0208 EUCJ_0208  SJIS_0208 SJIS_0208 UTF8 UTF8 UNICODE_FSS UNICODE_FSS  ASCII ASCII  OCTETS OCTETS NONE NONE 90? $#l)H" (&''$X)0(+ ( ( (d (< ( ( ( ' 'x $P (( ( ( ( ( (` (8 ( ' ' $ +p (H ( ' $ $ $ $l $H $$ $ $$$$p$L$($$*'$d&<&''''t' ISO8859_7 % ISO8859_6 $ ISO8859_5 # ISO8859_4 " ISO8859_3  ISO_PLK  ISO_HUN  CS_CZ  ISO8859_2 ES_ES_CI_AI  PT_BR  PT_PT  EN_US  EN_UK   SV_SV   ES_ES   NO_NO   IT_IT  IS_IS  DE_DE  FR_CA  FR_FR  FI_FI  DU_NL  DA_DA  ISO8859_1  DB_NOR865   DB_DAN865  PDOX_NORDAN4   DOS865   DB_US850   DB_UK850   DB_SVE850   DB_PTB850   DB_NLD850   DB_ITA850   DB_FRA850   DB_ESP850   DB_DEU850   DB_FRC850   DOS850   DB_US437   DB_UK437   DB_SVE437   DB_NLD437   DB_ITA437   DB_FRA437   DB_FIN437   DB_ESP437   DB_DEU437  PDOX_SWEDFIN   PDOX_INTL  PDOX_ASCII   DOS437   EUCJ_0208  SJIS_0208  UNICODE  UCS_BASIC UTF8 UNICODE_FSS  ASCII  OCTETS NONE 90>''(d$@$%%%'x'P'('$ % $ (l $D ' $ ( " % (` $< $ $ $ $ $ $` %8 & ( & ' &t $L % + % ' )| %T '( **'*'X%0(%'"%l&D&&&%%|% WIN1257 < WIN1256 ; WIN1255 : NXT_ESP  NXT_ITA  NXT_FRA  NXT_DEU  NXT_US NEXT  PXW_TURK 7 WIN1254 7 PXW_GREEK 6 WIN1253 6 WIN_PTBR 5PXW_SWEDFIN 5 PXW_SPAN 5PXW_NORDAN4 5PXW_INTL850 5 PXW_INTL 5 WIN1252 5WIN1251_UA 4 PXW_CYRL 4 WIN1251 4WIN_CZ_CI_AI 3 WIN_CZ 3 BS_BA 3 PXW_HUN 3 PXW_SLOV 3 PXW_PLK 3 PXW_HUNDC 3 PXW_CSY 3 WIN1250 3 DOS869 1 DOS866 0 DOS864  DOS862  DOS858  DOS775  DOS737   PDOX_CYRL 2 DB_RUS 2CYRL 2 DB_FRC863  DOS863  PDOX_ISL / DOS861 / DB_PTG860   DOS860   DB_TRK . DOS857 . PDOX_SLO - PDOX_HUN - PDOX_PLK - PDOX_CSY - DB_SLO - DB_PLK - DB_CSY - DOS852 - LT_LT (ISO8859_13 ( ISO8859_9 ' ISO8859_8 &90))|)T&$-#%#'h#@'% I =`TEST_COLLATE ~3WIN_CZ +++DISABLE-COMPRESSIONS=0;DISABLE-EXPANSIONS=0 WIN1258 A KOI8U_UA @ KOI8U @ KOI8R_RU ? KOI8R ? GB_2312 9 BIG_5 8KSC_DICTIONARY , KSC_5601 ,WIN1257_LV <WIN1257_LT <WIN1257_EE <90-&|*L/ */64P2 / 1 / 3T 1$ 0 3 # $ CUST_NO_GEN   EMP_NO_GEN  RDB$BACKUP_HISTORY  Nbackup technologyRDB$TRIGGER_NAME  Implicit trigger nameRDB$INDEX_NAME  Implicit index nameRDB$FIELD_NAME Implicit domain nameRDB$CONSTRAINT_NAME Implicit constraint nameRDB$EXCEPTIONS   Exception IDRDB$PROCEDURES   Procedure ID SQL$DEFAULT RDB$SECURITY_CLASS  90$ 0 _90 "Ed-In \I <B</RDB$SYSTEM_FLAGLRDB$TRIGGER_2 RDB$TRIGGERS  /RDB$SYSTEM_FLAGLRDB$TRIGGER_9 RDB$USER_PRIVILEGES  P P P /RDB$OBJECT_TYPE;>>:0RDB$OWNER_NAMERDB$OWNER_NAME0RDB$OWNER_NAMEg,LRDB$TRIGGER_4 RDB$RELATIONS  ***=RDB$OWNER_NAMEg,RDB$OWNER_NAMELRDB$TRIGGER_3 RDB$TRIGGERS  90  MX i J, Jt i0 CbCpDXDTKRDB$TRIGGER_23 RDB$RELATION_FIELDS  CJ RDB$INDICESJRDB$RELATION_CONSTRAINTSJRDB$INDEX_SEGMENTSG:/RDB$RELATION_NAMERDB$RELATION_NAME:/RDB$INDEX_NAMERDB$INDEX_NAME:/RDB$INDEX_NAMERDB$INDEX_NAME/RDB$FIELD_NAMERDB$FIELD_NAME>>:0RDB$OWNER_NAMERDB$OWNER_NAME0RDB$OWNER_NAMEg,LRDB$TRIGGER_28 RDB$PROCEDURES  WWW=RDB$OWNER_NAMEg,RDB$OWNER_NAMEeRDB$PROCEDURESRDB$PROCEDURE_IDLRDB$TRIGGER_27 RDB$RELATION_FIELDS  CJRDB$CHECK_CONSTRAINTSJRDB$RELATION_CONSTRAINTSG:/RDB$FIELD_NAMERDB$TRIGGER_NAME:/RDB$CONSTRAINT_NAMERDB$CONSTRAINT_NAME:/RDB$RELATION_NAMERDB$RELATION_NAME/RDB$CONSTRAINT_TYPENOT NULLLRDB$TRIGGER_24 RDB$RELATION_FIELDS  [[[ '0' AND VALUE <= '999') OR VALUE IS NULL)  /gLCHECK (VALUE = UPPER (VALUE))1LCHECK (VALUE > 1000)199999LCHECK (VALUE > '99999')8LCHECK (VALUE BETWEEN 0 AND 6)1LCHECK (VALUE > 0):1'4L***CHECK (VALUE > 10000 AND VALUE <= 2000000)III999/software/hardware/other/N/AL999CHECK (VALUE IN ('software', 'hardware', 'other', 'N/A'))7VLCHECK (VALUE STARTING WITH 'V') pRDB$661  pRDB$660   pRDB$659  pRDB$658  pRDB$657   pRDB$656   pRDB$655   pRDB$654 # pRDB$653  pRDB$652 % pRDB$651  pRDB$650  pRDB$135  pRDB$134  pRDB$133 90#$%h%D$%$(!(\%4% % % % %l %D % %RDB$661 RDB$660 RDB$659 RDB$658 RDB$657 RDB$656 RDB$655 RDB$654 RDB$653 RDB$652 RDB$652 RDB$651 RDB$651 RDB$651 RDB$6 RDB$665 RDB$664 RDB$13 RDB$4 90 : ,p:1: ,:#t: 1x ,T 1( , 1 1 ,| 1P ,T 1 ,1( , 1 ,, 1 ,` #l, SQL$DEFAULT48  SYSDBASQL$T  G SQL$DEFAULT47  SYSDBAGSQL$T  G SQL$DEFAULT46  SYSDBASQL$T   SQL$DEFAULT45  SYSDBASQL$T  s SQL$DEFAULT44  SYSDBAsSQL$T  s SQL$DEFAULT43  SYSDBASQL$T  ; SQL$DEFAULT42  SYSDBA;SQL$T  ;   SQL$DEFAULT41  SYSDBA SQL$T  d  SQL$DEFAULT40     SQL$DEFAULT38  SYSDBA SQL$T  SYSDBA ~  SQL$DEFAULT37  SYSDBA~ SQL$T  SYSDBA  SYSDBA   SYSDBA  SYSDBA  SYSDBA  p90dcK] RDB$FIELD_SUB_TYPERDB$Fs MISSING_,RDB$EXPRESSION_SOURCERDB$INDICES 'TERNAL_DESCRIPTIONRDB$RELATIONS FILERDB$RELATIONSLENGTHRDB$FIELDSSCALERDB$FIELDSTYPERDB$FIELDSFIELD_IDRDB$RELATIONS _FIELDS LENGTHRDB$FIELDS UNCTION_ARGUMENTS NAMERDB$DEPENDENCIESFIELDS _DIMENSIONSINDEX_SEGMENTSRELATION_FIELDSTYPES USER_PRIVILEGES #POSITIONRDB$INDEX_SEGMENTSRELATION_FIELDSRECISIONRDB$FIELDS UNCTION_ARGUMENTS SCALERDB$FIELDS UNCTION_ARGUMENTS &$OURCERDB$PROCEDURE_PARAMETERSRELATION_FIELDSUB_TYPERDB$FIELDS  UNCTION_ARGUMENTS TYPERDB$FIELDS UNCTION_ARGUMENTSLE_FLAGSRDB$FILES% LOG_FILES LENGTHRDB$FILES% LOG_FILES 4 NAMERDB$BACKUP_HISTORYFILES% LOG_FILES% PARTITIONSRDB$LOG_FILES% _OFFSETRDB$LOG_FILES SEQUENCERDB$FILES% LOG_FILES TARTRDB$FILESLAGSRDB$RELATIONS TRIGGERSOREIGN_KEYRDB$INDICES MATRDB$FORMATS RELATIONS, _OF_USERDB$CHARACTER_SETS-)UNCTION_NAMERDB$CHARACTER_SETS - OLLATIONSFILTERS UNCTIONS) _ARGUMENTSTYPERDB$FUNCTIONS GENERATOR_IDRDB$GENERATORSNAMERDB$GENERATORS  RANTORRDB$USER_PRIVILEGES  _OPTIONRDB$USER_PRIVILEGES-UIDRDB$BACKUP_HISTORYINDEX_IDRDB$INDICESNACTIVERDB$INDICES NAMERDB$INDEX_SEGMENTSICES%RELATION_CONSTRAINTS TYPERDB$INDICES %4ITIALLY_DEFERREDRDB$RELATION_CONSTRAINTSPUT_SUB_TYPERDB$FILTERS'LOWER_BOUNDRDB$FIELD_DIMENSIONS%&MATCH_OPTIONRDB$REF_CONSTRAINTS )ECHANISMRDB$FUNCTION_ARGUMENTS-SSAGERDB$EXCEPTIONSTRIGGER_MESSAGES$_NUMBERRDB$TRIGGER_MESSAGESISSING_SOURCERDB$FIELDSVALUERDB$FIELDSODULE_NAMERDB$FILTERS UNCTIONSNULL_FLAGRDB$FIELDSPRELATION_FIELDS90:6 PHONE_LIST EMPLOYEE EMPLOYEE  PHONE_LIST DEPARTMENT DEPARTMENT 902OlB(D:F`B(8 7 9| 7L / 7 : 7d 9( < > ?d B( < A IL L L Ih I I@'',`J)+(]JAd1$><)+S>,''<QBL'$' C_WIN1250 T4 SHIP_DATE SALES RDB$25 DATE_NEEDED SALES RDB$26 PTAGED SALES RDB$31  PR EMP_NO SALARY_HISTORY EMPNO UPDATER_ID SALARY_HISTORY RDB$15 CHANGE_DATE SALARY_HISTORY RDB$14 PROLD_SALARY SALARY_HISTORY SALARY TOTAL_VALUE SALES RDB$29   DISCOUNT SALES RDB$30  DB$ PO_NUMBER SALES PONUMBER JNORDER_DATE SALES RDB$24   DEFAULT 1  LTOTAL_VALUE SALES RDB$29   DISCOUNT SALES RDB$30    DEFAULT 0  L PO_NUMBER SALES PONUMBER   DEFAULT 'NOW'  NOWL SHIP_DATE SALES RDB$25 DATE_NEEDED SALES RDB$26 PTAGED SALES RDB$31  PR EMP_NO SALARY_HISTORY EMPNO UPDATER_ID SALARY_HISTORY RDB$15 CHANGE_DATE SALARY_HISTORY RDB$14 PR  DEFAULT 'NOW'  NOWLOLD_SALARY SALARY_HISTORY SALARY PERCENT_CHANGE SALARY_HISTORY RDB$16   DEFAULT 0  LNEW_SALARY SALARY_HISTORY RDB$17  PROJ_ID PROJ_DEPT_BUDGET PROJNO RD DEPT_NO PROJ_DEPT_BUDGET DEPTNO FISCAL_YEAR PROJ_DEPT_BUDGET RDB$12 QUART_HEAD_CNT PROJ_DEPT_BUDGET RDB$13 PROJECTED_BUDGET PROJ_DEPT_BUDGET BUDGET  PROJ_ID EMPLOYEE_PROJECT PROJNO  EMP_NO EMPLOYEE_PROJECT EMPNO   PROJ_ID PROJECT PROJNO  PROJ_NAME PROJECT RDB$10 TEAM_LEADER PROJECT EMPNO  PRODUCT PROJECT PRODTYPE  PROJ_DESC PROJECT RDB$11  C_OCTETS T4 RDB$540  C_NONE T4 RDB$542 E C_WIN1250 T4 RDB$544  V_UTF8 T4 RDB$547 C1 T4 RDB$539  C_UTF8 T4 RDB$546  V_OCTETS T4 RDB$541  V_NONE T4 RDB$543  V_WIN1250 T4 RDB$545  CUSTOMER CUSTOMER RDB$18  CONTACT_FIRST CUSTOMER FIRSTNAME  CITY CUSTOMER RDB$19  STATE_PROVINCE CUSTOMER RDB$20  COUNTRY CUSTOMER COUNTRYNAME   ON_HOLD CUSTOMER RDB$22  90Nj8YS<S SQ`&, \ N| ^G: ^T SYS C1\T SQL$T SYSDBA AU\T SQL$T SYSDBA  ^T SYSDBA A;T SQL$T SYSDBA SQL$DEFAULT42 \;TT SQL$T SYSDBA S C1;\T SQL$T SYSDBA AU;\T SQL$T SYSDBA  ;^T SYSDBA A; T SQL$T SYSDBA SQL$DEFAULT41 \ TT SQL$T SYSDBA S C1 \T SQL$T SYSDBA AU \T SQL$T SYSDBA  ^T SYSDBA A d T SQL$T SYSDBA SQL$DEFAULT40 \d TT SQL$T SYSDBA SQL$DEFAULT48  TT SQL$T SYSDBA L$TYSC1 \T SQL$T SYSDBA \T SQL$T SYSDBA ^T SYSDBA GT SQL$T SYSDBA SQL$DEFAULT47  GTT SQL$T SYSDBA L$TYSC1 G\T SQL$T SYSDBA G\T SQL$T SYSDBA G^T SYSDBA GT SQL$T SYSDBA SQL$DEFAULT46  TT SQL$T SYSDBA L$TYSC1 \T SQL$T SYSDBA \T SQL$T SYSDBA ^T SYSDBA T SQL$T SYSDBA SQL$DEFAULT45  TT SQL$T SYSDBA L$TYSC1 \T SQL$T SYSDBA \T SQL$T SYSDBA ^T SYSDBA sT SQL$T SYSDBA SQL$DEFAULT44  sTT SQL$T SYSDBA L$TYSC1 s\T SQL$T SYSDBA s\T SQL$T SYSDBA s^T SYSDBA sT SQL$T SYSDBA SQL$DEFAULT43  TT SQL$T SYSDBA  4EMP_NO ;=LPROJ_ID /gL ;=LSQDEF C4C2C5C1C3 2 CURRENCY ;=LCOUNTRY ;=L TR_MULTI C1 C1-AR SQL$AR SYSDBA SQL$DEFAULT15 D-T2 SQL$T2 SYSDBA SQL$DEFAULT16 ;T SQL$T SYSDBA SQL$DEFAULT42 \-T3 SQL$T3 SYSDBA SQL$DEFAULT13 -  SALES SQL$SALES SYSDBA SQL$DEFAULT11 -SALARY_HISTORY SQL$SALARY_HISTORY SYSDBA SQL$DEFAULT9 90< 1Tl>,>;')PI$) + Ul 18 3 3 / 3@ 2 4 4 3p 3< 3 4 4 4l 48 3 3 3 3l /8 3 243h343344d4033/3d303+GC1 T RDB$94 GC1 T RDB$94 GC1 T RDB$93 C1 T RDB$93 C1 T RDB$92 C1 T RDB$92 sC1 T RDB$91 sC1 T RDB$91 sC1 T RDB$90 C1 T RDB$90 ;C1 T RDB$89 ;C1 T RDB$89 ; C1 T RDB$88  C1 T RDB$88 DB$ d C1 T RDB$87 d C1 T RDB$87 RDBd  C1 T RDB$86  C1 T RDB$86 RDB  C1 T RDB$85  C1 T RDB$85 DB$ 3~ C1 T RDB$84 ~ C1 T RDB$84 RDB~ 1 C1 T RDB$83  C1 T RDB$83 DB$ C1 T RDB$95 C1 T RDB$95 22C3 AR RDB$652 C4 AR RDB$653  C9 AR RDB$658  C1 AR RDB$650  C2 AR RDB$651  C6 AR RDB$655  C11 AR RDB$660  C13 AR RDB$664  C14 AR RDB$665  C15 AR RDB$6 C5 AR RDB$654 C7 AR RDB$656  C8 AR RDB$657 C10 AR RDB$659  C12 AR RDB$661  TYC4 T2 RDB$124 EC1 T2 RDB$121 C2 T2 RDB$122  C5 T2 RDB$125  C6 T2 RDB$126  C7 T2 RDB$127  C12 T2 RDB$132   C14 T2 RDB$134  C15 T2 RDB$135 C16 T2 RDB$481 C3 T2 RDB$123 C8 T2 RDB$128 C9 T2 RDB$129 C10 T2 RDB$130  C11 T2 RDB$131  C13 T2 RDB$133  GC1 T RDB$94 C3 T3 RDB$484 C1 T3 RDB$482 C5 T3 RDB$491 C2 T3 RDB$483 C4 T3 RDB$485 ORDER_STATUS SALES RDB$23  no  DEFAULT 'new'  newLPAID SALES RDB$27  kl  DEFAULT 'n'  nL SALES_REP SALES EMPNO   ITEM_TYPE SALES PRODTYPE    CUST_NO SALES CUSTNO QTY_ORDERED SALES RDB$28 90 D|S U, gT X[0H[@-GET_EMP_PROJ SQL$GET_EMP_PROJ SYSDBA -ADD_EMP_PROJ SQL$ADD_EMP_PROJ SYSDBA -SUB_TOT_BUDGET SQL$SUB_TOT_BUDGET SYSDBA -DELETE_EMPLOYEE   SQL$DELETE_EMPLOYEE SYSDBA  ----CJ DEPARTMENTG/DEPT_NO)BUDGETCOCJ DEPARTMENTG/ HEAD_DEPT)NM]BUDGET/)CJ DEPARTMENTG/ HEAD_DEPT)DEPT_NOx DEPT_BUDGET"))LDELETE_EMPLOYEE   SQL$DELETE_EMPLOYEE SYSDBA DECLARE VARIABLE any_sales INTEGER; BEGIN any_sales = 0; /* * If there are any sales records referencing this employee, * can't delete the employee until the sales are re-assigned * to another employee or changed to NULL. */ SELECT count(po_number) FROM sales WHERE sales_rep = :emp_num INTO :any_sales; IF (any_sales > 0) THEN BEGIN EXCEPTION reassign_sales; SUSPEND; END /* * If the employee is a manager, update the department. */ UPDATE department SET mngr_no = NULL WHERE mngr_no = :emp_num; /* * If the employee is a project leader, update project. */ UPDATE project SET team_leader = NULL WHERE team_leader = :emp_num; /* * Delete the employee from any projects. */ DELETE FROM employee_project WHERE emp_no = :emp_num; /* * Delete old salary records. */ DELETE FROM salary_history WHERE emp_no = :emp_num; /* * Delete the employee. */ DELETE FROM employee WHERE emp_no = :emp_num; SUSPEND; END -COCJSALESG/ SALES_REP)NM] PO_NUMBER1REASSIGN_SALESCJ DEPARTMENTG/MNGR_NO) -MNGR_NOCJPROJECTG/ TEAM_LEADER) - TEAM_LEADERCJEMPLOYEE_PROJECTG/EMP_NO)CJSALARY_HISTORYG/EMP_NO)CJEMPLOYEEG/EMP_NO)LSUB_TOT_BUDGET SQL$SUB_TOT_BUDGET SYSDBA BEGIN SELECT SUM(budget), AVG(budget), MIN(budget), MAX(budget) FROM department WHERE head_dept = :head_dept INTO :tot_budget, :avg_budget, :min_budget, :max_budget; SUSPEND; ENDIII  ----COCJ DEPARTMENTG/ HEAD_DEPT)NMTBUDGETUBUDGETWBUDGETVBUDGET))))))))LADD_EMP_PROJ SQL$ADD_EMP_PROJ SYSDBA BEGIN BEGIN INSERT INTO employee_project (emp_no, proj_id) VALUES (:emp_no, :proj_id); WHEN SQLCODE -530 DO EXCEPTION unknown_emp_id; END SUSPEND; END JEMPLOYEE_PROJECT)EMP_NO)PROJ_IDUNKNOWN_EMP_IDLGET_EMP_PROJ SQL$GET_EMP_PROJ SYSDBA mmmBEGIN FOR SELECT proj_id FROM employee_project WHERE emp_no = :emp_no INTO :proj_id DO SUSPEND; END -CJEMPLOYEE_PROJECTG/EMP_NO)PROJ_ID))L90!69T69;>\>> > :l 28 4 8 9 8X 4 6 5 5x 5@ 5 5 5 5d 40 2 5 3 9T 3 463LANG ALL_LANGS RDB$64 COUNTRY ALL_LANGS RDB$63 GRADE ALL_LANGS RDB$62 CODE ALL_LANGS RDB$61  LANGUAGES SHOW_LANGS RDB$60 CTY SHOW_LANGS RDB$59 GRADE SHOW_LANGS RDB$58 CODE SHOW_LANGS RDB$57 PO_NUM SHIP_ORDER RDB$56 LINE6 MAIL_LABEL RDB$55 LINE5 MAIL_LABEL RDB$54 LINE4 MAIL_LABEL RDB$53 LINE3 MAIL_LABEL RDB$52 LINE2 MAIL_LABEL RDB$51 LINE1 MAIL_LABEL RDB$50 CUST_NO MAIL_LABEL RDB$49 EMP_CNT ORG_CHART RDB$48 TITLE ORG_CHART RDB$47  MNGR_NAME ORG_CHART RDB$46  DEPARTMENT ORG_CHART RDB$45  HEAD_DEPT ORG_CHART RDB$44 TOT DEPT_BUDGET RDB$43 DNO DEPT_BUDGET RDB$42 EMP_NUM DELETE_EMPLOYEE RDB$41  MAX_BUDGET SUB_TOT_BUDGET RDB$40  MIN_BUDGET SUB_TOT_BUDGET RDB$39  AVG_BUDGET SUB_TOT_BUDGET RDB$38  TOT_BUDGET SUB_TOT_BUDGET RDB$37  HEAD_DEPT SUB_TOT_BUDGET RDB$36 PROJ_ID ADD_EMP_PROJ RDB$35 EMP_NO ADD_EMP_PROJ RDB$34 PROJ_ID GET_EMP_PROJ RDB$33 EMP_NO GET_EMP_PROJ RDB$32 90UL ]gQ-DEPT_BUDGET  SQL$DEPT_BUDGET SYSDBA - ORG_CHART  SQL$ORG_CHART SYSDBA {{{ (((((( (-(-(-(-(-(-&-&-&- &-  &-  &-  &-  &- & --CJCUSTOMERG/CUST_NO)CUSTOMER CONTACT_FIRST CONTACT_LAST ADDRESS_LINE1  ADDRESS_LINE2 CITY STATE_PROVINCE COUNTRY  POSTAL_CODE;=;='' ;=  ;=  / USA;= '''' ,   ''  ;= '' ,   ''  ))))) )  ))))) )  L ORG_CHART  SQL$ORG_CHART SYSDBA GDECLARE VARIABLE mngr_no INTEGER; DECLARE VARIABLE dno CHAR(3); BEGIN FOR SELECT h.department, d.department, d.mngr_no, d.dept_no FROM department d LEFT OUTER JOIN department h ON d.head_dept = h.dept_no ORDER BY d.dept_no INTO :head_dept, :department, :mngr_no, :dno DO BEGIN IF (:mngr_no IS NULL) THEN BEGIN mngr_name = '--TBH--'; title = ''; END ELSE SELECT full_name, job_code FROM employee WHERE emp_no = :mngr_no INTO :mngr_name, :title; SELECT COUNT(emp_no) FROGM employee WHERE dept_no = :dno INTO :emp_cnt; SUSPEND; END END??? -------Cw DEPARTMENTD DEPARTMENTHPG/ HEAD_DEPTDEPT_NOFHDEPT_NO DEPARTMENT DEPARTMENTMNGR_NODEPT_NO=--TBH--CJEMPLOYEEG/EMP_NO FULL_NAMEJOB_CODECOCJEMPLOYEEG/DEPT_NONM]EMP_NO)))))  )))))  LDEPT_BUDGET  SQL$DEPT_BUDGET SYSDBA DECLARE VARIABLE sumb DECIMAL(12, 2); DECLARE VARIABLE rdno CHAR(3); DECLARE VARIABLE cnt INTEGER; BEGIN tot = 0; SELECT budget FROM department WHERE dept_no = :dno INTO :tot; SELECT count(budget) FROM department WHERE head_dept = :dno INTO :cnt; IF (cnt = 0) THEN SUSPEND; FOR SELECT dept_no FROM department WHERE head_dept = :dno INTO :rdno DO BEGIN EXECUTE PROCEDURE dept_budget :rdno RETURNING_VALUES :sumb; tot = tot + sumb; END SUSPEND; END90 =SDy(QZ-MAIL_LABEL SQL$MAIL_LABEL SYSDBA -SHIP_ORDER SQL$SHIP_ORDER SYSDBA <<<&&& &-- 4CJJOBG:::/JOB_CODE)/ JOB_GRADE)/ JOB_COUNTRY);= LANGUAGE_REQk LANGUAGE_REQ/ NULL"))LSHIP_ORDER SQL$SHIP_ORDER SYSDBA WDECLARE VARIABLE ord_stat CHAR(7); DECLARE VARIABLE hold_stat CHAR(1); DECLARE VARIABLE cust_no INTEGER; DECLARE VARIABLE any_po CHAR(8); BEGIN SELECT s.order_status, c.on_hold, c.cust_no FROM sales s, customer c WHERE po_number = :po_num AND s.cust_no = c.cust_no INTO :ord_stat, :hold_stat, :cust_no; /* This purchase order has been already shipped. */ IF (ord_stat = 'shipped') THEN BEGIN EXCEPTION order_already_shipped; SUSPEND; END /* Customer is on hold. */ ELSE IF (hold_stat = '*') THEN BEGIN EXCEPTION customer_on_hold; SUSPEND; END /* * If there is an unpaid balance on orders shipped over 2 months ago, * put the customer on hold. */ FOR SELECT po_number FROM sales WHERE cust_no = :cust_no AND order_status = 'shipped' AND paid = 'n' AND ship_date < CAST('NOW' AS TIMESTAMP) - 60 INTO :any_po DO BEGIN EXCEPTION customer_check; UPDATE customer SET on_hold = '*' WHERE cust_no = :cust_no; SUSPEND; END /* * Ship the order. */ UPDATE sales SETW order_status = 'shipped', ship_date = 'NOW' WHERE po_number = :po_num; SUSPEND; END ----CSALESSCUSTOMERCG:/ PO_NUMBER)/CUST_NOCUST_NO ORDER_STATUSON_HOLDCUST_NO/shippedORDER_ALREADY_SHIPPED/*CUSTOMER_ON_HOLDCJSALESG:::/CUST_NO/ ORDER_STATUSshipped/PAIDn3 SHIP_DATE##NOW< PO_NUMBERCUSTOMER_CHECKCJCUSTOMERG/CUST_NO *ON_HOLDCJSALESG/ PO_NUMBER) shipped ORDER_STATUSNOW SHIP_DATELMAIL_LABEL SQL$MAIL_LABEL SYSDBA DECLARE VARIABLE customer VARCHAR(25); DECLARE VARIABLE first_name VARCHAR(15); DECLARE VARIABLE last_name VARCHAR(20); DECLARE VARIABLE addr1 VARCHAR(30); DECLARE VARIABLE addr2 VARCHAR(30); DECLARE VARIABLE city VARCHAR(25); DECLARE VARIABLE state VARCHAR(15); DECLARE VARIABLE country VARCHAR(15); DECLARE VARIABLE postcode VARCHAR(12); DECLARE VARIABLE cnt INTEGER; BEGIN line1 = ''; line2 = ''; line3 = ''; line4 = ''; line5 = ''; line6 = ''; SELECT customer, contact_first, contact_last, address_line1, address_line2, city, state_province, country, postal_code FROM CUSTOMER WHERE cust_no = :cust_no INTO :customer, :first_name, :last_name, :addr1, :addr2, :city, :state, :country, :postcode; IF (customer IS NOT NULL) THEN line1 = customer; IF (first_name IS NOT NULL) THEN line2 = first_name || ' ' || last_name; ELSE line2 = last_name; IF (addr1 IS NOT NULL) THEN line3 = addr1; IF (addr2 IS NOT NULL) THEN line4 = addr2; IF (country = 'USA') THEN BEGIN IF (city IS NOT NULL) THEN line5 = city || ', ' || state || ' ' || postcode; ELSE line5 = state || ' ' || postcode; END ELSE BEGIN IF (city IS NOT NULL) THEN line5 = city || ', ' || state; ELSE line5 = state; line6 = country || ' ' || postcode; END SUSPEND; END90XH S t  Q-SHOW_LANGS  SQL$SHOW_LANGS SYSDBA - ALL_LANGS  SQL$ALL_LANGS SYSDBA  ALL_LANGS  SQL$ALL_LANGS SYSDBA BEGIN FOR SELECT job_code, job_grade, job_country FROM job INTO :code, :grade, :country DO BEGIN FOR SELECT languages FROM show_langs (:code, :grade, :country) INTO :lang DO SUSPEND; /* Put nice separators between rows */ code = '====='; grade = '====='; country = '==============='; lang = '=============='; SUSPEND; END END &&&&&-&-&-&-CJJOBJOB_CODE JOB_GRADE JOB_COUNTRYC| SHOW_LANGS LANGUAGES))))=======================================))))))))LSHOW_LANGS  SQL$SHOW_LANGS SYSDBA DECLARE VARIABLE i INTEGER; BEGIN i = 1; WHILE (i <= 5) DO BEGIN SELECT language_req[:i] FROM joB WHERE ((job_code = :code) AND (job_grade = :grade) AND (job_country = :cty) AND (language_req IS NOT NULL)) INTO :languages; IF (languages = ' ') THEN /* Prints 'NULL' instead of blanks */ languages = 'NULL'; i = i +1; SUSPEND; END END90`,s[xUZCUSTOMER_CHECK " Overdue balance -- can not ship.CUSTOMER_ON_HOLD This customer is on hold.ORDER_ALREADY_SHIPPED Order status is "shipped."REASSIGN_SALES ;9Reassign the sales records before deleting this employee.UNKNOWN_EMP_ID (&Invalid employee number or project id.9090%I=%I=9090 !=*=ى=%I>%I>%I>ى=%I>*=%I=1 C=!=9090 1 C=1 C=%I=>9c=9c=>%I=1 C=1 C=9090 1 <1 <6W=&=ى=9c=&= 6W=< 1 <1 <9090 ===.=.=.= = ==90 tX< x\@    5490:909090 *>*>*>*>*>>*>*>*>9090%I=.:= L>L>.:=.:=%I=9090*= 9= L>L>9=>9=*=9090 /<>> ><><>>></</<9090 ><.:=*>.:==> >= >.:= > *>.:=><90;90908( $̊؎ύ ěščřž ><ěščřžýáíéúůďťňóĚŠČŘŽÝÁÍÉÚŮĎŤŇÓ9090>909069090@"6,~ rx  X 8  Z  6d  Z  f`  ( Z `f@*d                                                         HHH 68J (08@HPX `hpx  (08 @ D HLP T `df   <<<(8 @*D ( , 0 48FH JHHH   6<<<  <<< 6 lll 3 $ Dd xz|3  $ DHVl 6'8JQTTTT&(9<W``` (0L^ 90+ HT3 SQL$T3 SYSDBA SQL$DEFAULT13 T SQL$T SYSDBA SQL$DEFAULT12 T2 SQL$T2 SYSDBA SQL$DEFAULT16  gC13C11C10C9C8C3C16C15C14 C12 C7 C6 C5 C2C1C4Y:C12 ) ( C10 ) (C8 ) (C7 ) (C5 ) (C15 ) (C14 ) (C13 ) (C11 ) (  C6 ) ( C2 Y X H:G;3G\ C1 C9 ) ( C4 ) (C3 A @ H:G;-SYSDBA SQL$DEFAULT17   PHONE_NO PHONE_NO PHONE_EXT PHONE_EXT LAST_NAME LAST_NAMEEMP_NOEMP_NO LOCATION LOCATION FIRST_NAME FIRST_NAMEJ?kAGED# SHIP_DATE ORDER_DATEL DATE_NEEDED SHIP_DATE ORDER_DATE NOWL ;=L PO_NUMBER7VL ;=L DISCOUNT L ;=L TOTAL_VALUE ;=L QTY_ORDERED L ;=LCUST_NO1L ;=L ITEM_TYPEsoftwareLJ999/software/hardware/other/N/AL ;=L SALES_REP PAID nL ORDER_STATUS newL ;=L POST_NEW_ORDER CHECK_11 CHECK_12 CHECK_13 CHECK_14 CHECK_15 CHECK_16 CHECK_17 CHECK_18 CHECK_19 CHECK_20 CHECK_21 CHECK_22 CHECK_23 CHECK_24 CHECK_25 CHECK_26 CHECK_27 CHECK_28) AJOB_REQUIREMENT MAX_SALARY L1L ;=L MIN_SALARY L1L ;=L JOB_GRADE8L ;=L LANGUAGE_REQ ) (U JOB_TITLE ;=L JOB_COUNTRY ;=L JOB_CODE199999L ;=L CHECK_1 CHECK_2SYSDBA   PHONE_NO PHONE_NO PHONE_EXT PHONE_EXT LAST_NAME LAST_NAMEEMP_NOEMP_NO LOCATION LOCATION FIRST_NAME FIRST_NAMEY:C12 ) ( C10 ) (C8 ) (C7 ) (C5 ) (C15 ) (C14 ) (C13 ) (C11 ) (  C6 ) ( C2 Y X /:G@@:P3G/: C1 C9 ) ( C4 ) (C3 A @ /:G@@:90 165LA =43:81P/;::d7(;;4 3 3 3 3d 3( 9 4 7 2P 6 1 ' 4 3X 3 947|2D61'43H72AAHBBMt?(I PHONE_LIST EMPLOYEE FIRST_NAME  PHONE_LIST DEPARTMENT LOCATION  PHONE_LIST EMPLOYEE EMP_NO  PHONE_LIST EMPLOYEE LAST_NAME  PHONE_LIST EMPLOYEE PHONE_EXT  PHONE_LIST DEPARTMENT PHONE_NO  PHONE_LIST EMPLOYEE  PHONE_LIST DEPARTMENT  PHONE_LIST EMPLOYEE DEPT_NO  PHONE_LIST DEPARTMENT DEPT_NO SAVE_SALARY_CHANGE SALARY_HISTORY OLD_SALARY SAVE_SALARY_CHANGE EMPLOYEE SALARY SAVE_SALARY_CHANGE SALARY_HISTORY PERCENT_CHANGE CHECK_8 SALARY_HISTORY PERCENT_CHANGE CHECK_7 SALARY_HISTORY PERCENT_CHANGE CHECK_6 PROJ_DEPT_BUDGET FISCAL_YEAR CHECK_5 PROJ_DEPT_BUDGET FISCAL_YEAR  SET_EMP_NO EMP_NO_GEN  SET_EMP_NO EMPLOYEE EMP_NO CHECK_4 JOB MIN_SALARY CHECK_4 EMPLOYEE SALARY CHECK_4 JOB CHECK_4 JOB JOB_CODE CHECK_4 EMPLOYEE JOB_CODE CHECK_4 JOB JOB_GRADE CHECK_4 EMPLOYEE JOB_GRADE CHECK_4 JOB JOB_COUNTRY CHECK_4 EMPLOYEE JOB_COUNTRY CHECK_4 JOB MAX_SALARY CHECK_3 JOB MIN_SALARY CHECK_3 EMPLOYEE SALARY CHECK_3 JOB CHECK_3 JOB JOB_CODE CHECK_3 EMPLOYEE JOB_CODE CHECK_3 JOB JOB_GRADE CHECK_3 EMPLOYEE JOB_GRADE CHECK_3 JOB JOB_COUNTRY CHECK_3 EMPLOYEE JOB_COUNTRY CHECK_3 JOB MAX_SALARY CHECK_2 JOB MIN_SALARY CHECK_2 JOB MAX_SALARY CHECK_1 JOB MIN_SALARY CHECK_1 JOB MAX_SALARY  PHONE_LIST EMPLOYEE FIRST_NAME  PHONE_LIST DEPARTMENT LOCATION  PHONE_LIST EMPLOYEE EMP_NO  PHONE_LIST EMPLOYEE LAST_NAME  PHONE_LIST EMPLOYEE PHONE_EXT  PHONE_LIST DEPARTMENT PHONE_NO  PHONE_LIST EMPLOYEE  PHONE_LIST DEPARTMENT  PHONE_LIST EMPLOYEE DEPT_NO  PHONE_LIST DEPARTMENT DEPT_NO RDB$31 SALES SHIP_DATE RDB$31 SALES ORDER_DATE RDB$17 SALARY_HISTORY OLD_SALARY RDB$17 SALARY_HISTORY PERCENT_CHANGE RDB$9 EMPLOYEE LAST_NAME RDB$9 EMPLOYEE FIRST_NAME 901(( T T4  L t TT  H  Tx , L  T D T$  T \ T< TtT TTxT$TLLPH](Xn]0X H:G;3G\ ע&(0A(a bb ccc dddd eeeee !"#$0 @ /:G@@:a(abbC5 bb (ccccccdddd ) ddddeeeeeeeeeeC14 fffffff78901234fffffff78901234(0A(a bb ccc dddd eeeee(0,(0X /:G@@:P3G/: (00(  (00( H@H@(08(  (08((08((08(cTv(08( Q @Q @(08(V]xEc]xEc(08(f T (08(fCB(08( (08( Q @Q @ (00( H@H@  (08(cTv  (0,((08((00(  (08(  0X /:G@@:P3G/: 0 @ /:G@@:aabbbbccccccddddddddeeeeeeeeeefffffff78901234fffffff7890123490!O\SSSdOS Nx H( N N N4 T S N@ N S NL P T NT T TP`OMRlOTNtS$MSNV93N5822Isoftware nshippedgcbV93B1002'software yshippedV93I4700hardware ynopenvV93F0020software =nshippedV93H0500L>jhardware =nopen0V93H3009L= software =nshippedV94S6400>software ywaitingV93S4702hardware yyshippedV9456220hardware yopenP8V93C0990=Jb(hardware HyshippedƿV93C0120 other HyshippedmbWV9345139=2software yshipped"V9345200>2)software yshipped V9346200?software nwaitingV9336100L=Ȩsoftware nwaitingտտпV93006 other nshipped}V93005software yshippedV9427029)>hardware nshipped`V9420099>/dsoftware nopenV9320630L>[hardware nopenO?? V9324320?software yshipped@88"V9324200L>~Vhardware Hyshipped6V94H0079L= software =nopenV93H0030L> software vyopenV93F2051software nwaitingV93F2030qhardware yopenVJV93F3088@B software nshippedkkV92F3004@ software yshippedCCV93J3100=hwsoftware vyshippedV93J2004Rsoftware vyshippedƾV92J1003software =yshippedV92E0340jhardware yshippedV91E0210=  hardware yshipped901,2l282 ,,,,\,0,, , , ,T ,( , , , ,x ,L , , , , ,p ,< 2 , 2 , ,X ,, , , , ,| ,P ,( ( ()(x2L, ,-.,d-$@elaine$@ =elaine$@qelainey$@(elainev$@elaineH$@q_elaine= r#@ͳwelaine  ytjk Otji ytjU tj.@eRVelaine^@[VelaineS@GVelaineH@MVelaineG@-VelaineA@[Velaine=@>Velaine4@`vVelaine-@RVelaine, @Di9Velaine%@51Velaine$ @7ZVelaine"@(eVelaine@!Velaine@LwVelaine@9Velaine@PkbVelaine@(eVelaine@@NVelaine @rVelaine @mVelaine @^Velaine@mKadmin2-@@KLKadmin2,@g5Kadmin2%@-Kadmin2$@`SKadmin2"@^Kadmin2@coKadmin2@zKadmin2@[Kadmin2@^Kadmin2@>IKadmin2 @jKadmin2  ^)P @`Kadmin2 {/L @@TKadmin2 =U @@Kadmin2$@Kadmin2900T(0T-T,,T+ T ,, T , T ,, T , T ,, T + T ,, T , T ,, T ,T,,T,T,,T,T|-(T-Tx,$T-Tp-T,. 100VBASE(08( , 100VBASE(08( * 100VBASE(08( Zb( 622VBASE(08( J]& 621VBASE(08( +S $ 621VBASE(08( '" 110MKTPR(08(   100MKTPR(08(  672MKTPR(08( ' 623MKTPR(08( 0MKTPR(08( -1 110MKTPR(08(  100MKTPR(08(  672MKTPR(08( z 623MKTPR(08(  622HWRII(08( Zb 621HWRII(08(  670HWRII(08(  671MAPDB(08( [ 622MAPDB(08(  = 621MAPDB(08(  621MAPDB(08( @ 671GUIDE(08( -1 100GUIDE(08( 90tX< x\@$    | ` D (   4MKTPRMKTPRMKTPR"MKTPRnMKTPRUMKTPR MKTPRiMKTPR.MKTPRGMAPDBMAPDBGUIDEqGUIDEGUIDEGUIDE-VBASEVBASESVBASEVBASE,VBASEVBASEGVBASEVBASEVBASEVBASEDGPIIqDGPIIDGPII90 yD=l9 u :P h B vP B ? N/AUMarketing project 3MKTPR2a/Expand marketing and sales in the Pacific Rim. 2Set up a field office in Australia and Singapore.  softwareTranslator upgradeHWRII7V7Integrate the hand-writing recognition module into the universal language translator.  softwareMapBrowser portMAPDB/H/Port the map browsing database software to run on the automobile model.  hardware AutoMapGUIDE2U2Develop a prototype for the automobile version of #the hand-held map browsing device. other  DigiPizzaDGPII.w.Develop second generation digital pizza maker $with flash-bake heating element and %digital ingredient measuring system.  software-Video DatabaseVBASE/Y/Design a video data base management system for *controlling on-demand video distribution. 90d0  p wd d| ` LA P.0.Box 702 2514(070) 44 91 18 Neppelenbroek Netherlands Den HaagK.M. GeoTech Inc.ARue Royale 350 1210 02 500 5940 Hessels Belgium BrusselsGretaDyno ConsultingAVia Eugenia, 15 20124 02 404 6284 LorenziItalyMilan AndreasLorenzi Export, Ltd.A22 Place de la Concorde 75008 1 43 60 61RocheFranceParis Michelle 3D-Pad Corp.AFlorhofgasse 10 8005 01 221 16 50 Granges SwitzerlandZurichVictorDynamic Intelligence CorpA2-64-7 Sasazuka 150 3 880 77 19 MiyamotoJapanTokyoMiwakoMPM Corporation)1 Emerald Cove 22 01 23*Fiji Turtle IslandMaxMaxA3320 Lawai Road 96766(808) 835-7605BriggsUSAHILihue LeilaniAnini Vacation RentalsQP.O. Box 22743 93953 Mrs. BeauvaisUSACA Pebble Beach Mrs. Beauvais@ Suite 15020 Carling Avenue K1V 9G1(613) 229 3323BrightCanadaONOttawaTomasDataServe InternationalI400 Connaught Road(852) 850 43 98Wu Hong KongCentral Hong KongTaiDT Systems, LTD.A66 Lloyd Street M2 3LA 61 211 99 88 Brocket England Manchester Elizabeth Central Bank@ Suite 1012300 Newbury Street 02115(617) 488-1864ButtleUSAMABostonJamesButtle, Griffith and Co.P. O. Box 470 75205(214) 960-2233Brown*USATXDallasGlenDallas TechnologiesA15500 Pacific Heights Blvd. 92121(619) 530-2710LittleUSACA San Diego Dale J.Signature Design90&O`MMPpM N K N0 Q T M< P P OH R V NL R Q QX L RUXSMSdPSLtM$OJM4TTR<NO@[[265JohnsonUSADoc623ScottHSFGlon FranceSRep123Jacques@#C8492YanowskiUSASRep100Michael@N1 Ferrari yItalySRep125Roberto@,23Yamamoto vJapanSRep115Takashi@g5247ParkerrUSAEng623Bill@>I845PageqUSAEng671Mary@F#~22Ichida nJapanEng115Yuki@2)~202BrownmUSAAdmin600Kelly@ũ{894CookkUSADir670Kevin@D255BenderiUSACEO0 Oliver H.@FU0}(UEnglish German n G(French   :G1f BA/BS and +2-4 years experience in technical support. 1Knowledge of several European languages helpful. !.c- EngineerUSAEng  BA/BS and 3-5 years experience. 9/  EngineerJapanEngU0}(U Japanese Mandarin G(English   :G%5+ years experience. "BA/BS and/or MS degrees required. %Customer support experience desired. #Knowledge of Japanese and English. @T@KL EngineerUSAEng:5+ years experience. BA/BS required. MS degree preferred. اj EngineerUSAEng%=Distinguished engineer. %Ph.D/MS/BS or equivalent experience.  g5Financial AnalystUSAFinan3_35-10 years of accounting and financial experience. Strong analytical skills. CPA/MBA required. `S* AccountantUSAAccntA`CPA with 3-5 years experience. ASpreadsheet, data entry, and word processing knowledge required. @KLMarketing AnalystUSAMktg/e BA/BS required. MBA preferred. 3-5 years experience. /Knowledgeable with spreadsheets and databases. z =Marketing AnalystUSAMktg/=MBA required. /10+ years experience in high tech environment. .c%&Public Relations Rep.USAPRel(`r%Administrative AssistantEnglandAdmin =!Administrative AssistantUSAAdmin.b2-4 years clerical experience. .Facility with word processing and data entry. AA degree preferred.  `Sg5!Administrative AssistantUSAAdmin9}/3-5 years experience in executive environment. 9Strong organizational and communication skills required. BA degree preferred.  [- ManagerUSAMngr'''5+ years office management experience. [ ManagerUSAMngr'PBA/BS required. 3-5 years in management, 'plus 2-4 years engineering experience. pr DirectorUSADir@T@5-10 years as a director in computer or electronics industries. An advanced degree. @]zVice PresidentUSAVPNo specific requirements.  Chief Financial OfficerUSACFO*Z*15+ years in finance or 5+ years as a CFO with a proven track record. MBA or J.D. degree. @x}@]Chief Executive OfficerUSACEONo specific requirements. 90P\QFTNd  Mx ( OX ` ZX dXPX\@H[-|`>0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. Knowledge of Japanese required. Travel required.  [*Sales Representative SwitzerlandSRepU0}(UGerman French G(English Italian  :GK0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. KKnowledge of German required; one or more other European language helpful. Travel required. jH(Sales RepresentativeCanadaSRepU0}(UEnglish French G( rench   :G>0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. Travel required. 4English plus speaking knowledge of French required. ;f`rSales Representative EnglandSRepU0}(UEnglish German G(French   :G>0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. 1Knowledge of several European languages helpful. Travel required. Sales RepresentativeUSASRepU0}(UEnglish Spanish G( rench   :G>0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. $Some knowledge of Spanish required. Travel required. PG(Sales Co-ordinator EnglandSalesU0}(UEnglish German n G(French   :G1)Experience in sales and public relations in a high tech environment. Excellent communication skills. BA or equivalent. 1Knowledge of several European languages helpful. j =Sales Co-ordinatorUSASales)w)Experience in sales and public relations in a high tech environment. Excellent communication skills. BA or equivalent.  =!Technical WriterUSADoc7}7BA in English/journalism or excellent language skills. &Some programming experience required. 2-4 years of technical writing. [9Technical WriterUSADoc#"4+ years writing highly technical software documentation. #A bachelor's degree or equivalent. !Programming experience required. Excellent language skills. g5%& EngineerUSAEng 1BA/BS preferred. 2-4 years technical experience. #sB$ Engineer EnglandEng90d[ T \ < \`˅[Sales RepresentativeFranceSRepU0}(UEnglish French G(Spanish  talian  :G>0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. =Fluency in French; some knowledge of German/Spanish helpful. Travel required. [ESales RepresentativeItalySRepU0}(UItalian German G(French  talian  :G>0Computer/electronics industry sales experience. >Excellent communications, negotiation, and analytical skills. =Experience in establishing long term customer relationships. 6Fluency in Italian; some knowledge of German helpful. Travel required. ~_@ Sales RepresentativeJapanSRepU0}(U Japanese English G( nglish  talian  :G902 RDB$PRIMARY1 COUNTRY $I? RDB$PRIMARY1 COUNTRY 90$''`,<#$'(+p+@-( ) & FDollarFiji SchillingAustriaBFranc Belgium Guilder NetherlandsHKDollar Hong Kong ADollar AustraliaD-Mark GermanyFFrancFranceLiraItalyYenJapanSFranc SwitzerlandCdnDlrCanadaPound EnglandDollarUSA90    B l ( Bs`QC9MDJ9MlJ$GjpH(GjtH_8KFLV888:;=ON_HOLD0ON_HOLD*check_constraintL(((CHECK (on_hold IS NULL OR on_hold = '*')@SAVE_SALARY_CHANGE EMPLOYEE   0SALARYSALARYJSALARY_HISTORYEMP_NOEMP_NONOW CHANGE_DATE, UPDATER_IDSALARY OLD_SALARY%$#SALARYSALARYdSALARYPERCENT_CHANGELAAAAS BEGIN IF (old.salary <> new.salary) THEN INSERT INTO salary_history (emp_no, change_date, updater_id, old_salary, percent_change) VALUES ( old.emp_no, 'NOW', user, old.salary, (new.salary - old.salary) * 100 / old.salary); END @CHECK_8 SALARY_HISTORY   LLL93PERCENT_CHANGE1PERCENT_CHANGE2check_constraintL)))CHECK (percent_change between -50 and 50) @CHECK_7 SALARY_HISTORY   LLL93PERCENT_CHANGE1PERCENT_CHANGE2check_constraintL)))CHECK (percent_change between -50 and 50) @CHECK_6 PROJ_DEPT_BUDGET   ///3 FISCAL_YEARcheck_constraintLCHECK (FISCAL_YEAR >= 1993) @CHECK_5 PROJ_DEPT_BUDGET   ///3 FISCAL_YEARcheck_constraintLCHECK (FISCAL_YEAR >= 1993)@SET_EMP_NO EMPLOYEE   333=EMP_NOe EMP_NO_GENEMP_NOLUUUAS BEGIN if (new.emp_no is null) then new.emp_no = gen_id(emp_no_gen, 1); END @CHECK_4 EMPLOYEE   93SALARY+CJJOBG::/JOB_CODEJOB_CODE/ JOB_GRADE JOB_GRADE/ JOB_COUNTRY JOB_COUNTRY MIN_SALARY-1SALARY+CJJOBG::/JOB_CODEJOB_CODE/ JOB_GRADE JOB_GRADE/ JOB_COUNTRY JOB_COUNTRY MAX_SALARY-check_constraintLCHECK ( salary >= (SELECT min_salary FROM job WHERE job.job_code = employee.job_code AND job.job_grade = employee.job_grade AND job.job_country = employee.job_country) AND salary <= (SELECT max_salary FROM job WHERE job.job_code = employee.job_code AND job.job_grade = employee.job_grade AND job.job_country = employee.job_country)) @CHECK_3 EMPLOYEE   93SALARY+CJJOBG::/JOB_CODEJOB_CODE/ JOB_GRADE JOB_GRADE/ JOB_COUNTRY JOB_COUNTRY MIN_SALARY-1SALARY+CJJOBG::/JOB_CODEJOB_CODE/ JOB_GRADE JOB_GRADE/ JOB_COUNTRY JOB_COUNTRY MAX_SALARY-check_constraintLCHECK ( salary >= (SELECT min_salary FROM job WHERE job.job_code = employee.job_code AND job.job_grade = employee.job_grade AND job.job_country = employee.job_country) AND salary <= (SELECT max_salary FROM job WHERE job.job_code = employee.job_code AND job.job_grade = employee.job_grade AND job.job_country = employee.job_country))90 -BtFVC`v T DP w h @ wH  @ RT ` @ R` ` @Udd$@Uhd(@8WX@ 8W@P6M@68M@6pM0@6Mh@ E^@@@93DISCOUNT1DISCOUNTcheck_constraintL'''CHECK (discount >= 0 AND discount <= 1) @CHECK_22 SALES   ///3 TOTAL_VALUEcheck_constraintLCHECK (total_value >= 0) @CHECK_21 SALES   ///3 TOTAL_VALUEcheck_constraintLCHECK (total_value >= 0) @CHECK_20 SALES   ///3 QTY_ORDEREDcheck_constraintLCHECK (qty_ordered >= 1) @CHECK_19 SALES   ///3 QTY_ORDEREDcheck_constraintLCHECK (qty_ordered >= 1) @CHECK_18 SALES   999;9/PAIDy/PAIDncheck_constraintLCHECK (paid in ('y', 'n')) @CHECK_17 SALES   999;9/PAIDy/PAIDncheck_constraintLCHECK (paid in ('y', 'n')) @CHECK_16 SALES   FFF:4 DATE_NEEDED ORDER_DATE;= DATE_NEEDEDcheck_constraintL777CHECK (date_needed > order_date OR date_needed IS NULL) @CHECK_15 SALES   FFF:4 DATE_NEEDED ORDER_DATE;= DATE_NEEDEDcheck_constraintL777CHECK (date_needed > order_date OR date_needed IS NULL) @CHECK_14 SALES   BBB:3 SHIP_DATE ORDER_DATE;= SHIP_DATEcheck_constraintL444CHECK (ship_date >= order_date OR ship_date IS NULL) @CHECK_13 SALES   BBB:3 SHIP_DATE ORDER_DATE;= SHIP_DATEcheck_constraintL444CHECK (ship_date >= order_date OR ship_date IS NULL) @CHECK_12 SALES   ;999/ ORDER_STATUSnew/ ORDER_STATUSopen/ ORDER_STATUSshipped/ ORDER_STATUSwaitingcheck_constraintLYYYCHECK (order_status in ('new', 'open', 'shipped', 'waiting')) @CHECK_11 SALES   ;999/ ORDER_STATUSnew/ ORDER_STATUSopen/ ORDER_STATUSshipped/ ORDER_STATUSwaitingcheck_constraintLYYYCHECK (order_status in ('new', 'open', 'shipped', 'waiting'))@SET_CUST_NO CUSTOMER   666=CUST_NOe CUST_NO_GENCUST_NOLXXXAS BEGIN if (new.cust_no is null) then new.cust_no = gen_id(cust_no_gen, 1); END @CHECK_10 CUSTOMER   888:;=ON_HOLD0ON_HOLD*check_constraintL(((CHECK (on_hold IS NULL OR on_hold = '*') @CHECK_9 CUSTOMER   90 @xE^@|Zb @| Z b @ d $ @@ p @( F8D\O4&@O|&D7@TR_CONNECT   L111AS BEGIN /* enter trigger code here */ END @TR_MULTI COUNTRY r  L111AS BEGIN /* enter trigger code here */ END@POST_NEW_ORDER SALES    new_orderL(((AS BEGIN POST_EVENT 'new_order'; END @CHECK_28 SALES   ooo:/ ORDER_STATUSshipped= 0 AND discount <= 1) @CHECK_23 SALES   90/@@@@@@:H: : : :\ 7$ 7 7 7| 7< ? ? At B4 > < =x =8 = < 9 9H 9 995`5(555|<@<<<<P::::`:$<< PUBLIC SYSDBA I PHONE_LIST  PUBLIC SYSDBA S PHONE_LIST  PUBLIC SYSDBA R EMPLOYEE  PUBLIC SYSDBA D EMPLOYEE  PUBLIC SYSDBA U EMPLOYEE  PUBLIC SYSDBA I EMPLOYEE  PUBLIC SYSDBA S EMPLOYEE  PUBLIC SYSDBA R DEPARTMENT  PUBLIC SYSDBA D DEPARTMENT  PUBLIC SYSDBA U DEPARTMENT  PUBLIC SYSDBA I DEPARTMENT  PUBLIC SYSDBA S DEPARTMENT  PUBLIC SYSDBA R JOB  PUBLIC SYSDBA D JOB  PUBLIC SYSDBA U JOB  PUBLIC SYSDBA I JOB  PUBLIC SYSDBA S JOB  PUBLIC SYSDBA R COUNTRY  PUBLIC SYSDBA D COUNTRY  PUBLIC SYSDBA U COUNTRY  PUBLIC SYSDBA I COUNTRY  PUBLIC SYSDBA S COUNTRY (SYSDBA SYSDBA X ALL_LANGS (SYSDBA SYSDBA X SHOW_LANGS (SYSDBA SYSDBA X SHIP_ORDER (SYSDBA SYSDBA X MAIL_LABEL (SYSDBA SYSDBA X ORG_CHART (SYSDBA SYSDBA X DEPT_BUDGET (SYSDBA SYSDBA X DELETE_EMPLOYEE (SYSDBA SYSDBA X SUB_TOT_BUDGET (SYSDBA SYSDBA X ADD_EMP_PROJ (SYSDBA SYSDBA X GET_EMP_PROJ  SYSDBA SYSDBA R SALES  SYSDBA SYSDBA D SALES  SYSDBA SYSDBA U SALES  SYSDBA SYSDBA I SALES  SYSDBA SYSDBA S SALES  SYSDBA SYSDBA R CUSTOMER  SYSDBA SYSDBA D CUSTOMER  SYSDBA SYSDBA U CUSTOMER  SYSDBA SYSDBA I CUSTOMER  SYSDBA SYSDBA S CUSTOMER  SYSDBA SYSDBA R SALARY_HISTORY  SYSDBA SYSDBA D SALARY_HISTORY  SYSDBA SYSDBA U SALARY_HISTORY  SYSDBA SYSDBA I SALARY_HISTORY  SYSDBA SYSDBA S SALARY_HISTORY 90(+<<L<999\9 9 B BT B B B BD B B Bx B8 @ @ @x @8 @ : : :H : :77d7,77?t?0AB>p<0===t<0/.G SYSDBA SYSDBA U T G SYSDBA SYSDBA I T G SYSDBA SYSDBA S T  PUBLIC SYSDBA X ALL_LANGS  PUBLIC SYSDBA X SHOW_LANGS  PUBLIC SYSDBA X SHIP_ORDER  PUBLIC SYSDBA X MAIL_LABEL  PUBLIC SYSDBA X ORG_CHART  PUBLIC SYSDBA X DEPT_BUDGET  PUBLIC SYSDBA X DELETE_EMPLOYEE  PUBLIC SYSDBA X SUB_TOT_BUDGET  PUBLIC SYSDBA X ADD_EMP_PROJ  PUBLIC SYSDBA X GET_EMP_PROJ  PUBLIC SYSDBA R SALES  PUBLIC SYSDBA D SALES  PUBLIC SYSDBA U SALES  PUBLIC SYSDBA I SALES  PUBLIC SYSDBA S SALES  PUBLIC SYSDBA R CUSTOMER  PUBLIC SYSDBA D CUSTOMER  PUBLIC SYSDBA U CUSTOMER  PUBLIC SYSDBA I CUSTOMER  PUBLIC SYSDBA S CUSTOMER  PUBLIC SYSDBA R SALARY_HISTORY  PUBLIC SYSDBA D SALARY_HISTORY  PUBLIC SYSDBA U SALARY_HISTORY  PUBLIC SYSDBA I SALARY_HISTORY  PUBLIC SYSDBA S SALARY_HISTORY  PUBLIC SYSDBA R PROJ_DEPT_BUDGET  PUBLIC SYSDBA D PROJ_DEPT_BUDGET  PUBLIC SYSDBA U PROJ_DEPT_BUDGET  PUBLIC SYSDBA I PROJ_DEPT_BUDGET  PUBLIC SYSDBA S PROJ_DEPT_BUDGET  PUBLIC SYSDBA R EMPLOYEE_PROJECT  PUBLIC SYSDBA D EMPLOYEE_PROJECT  PUBLIC SYSDBA U EMPLOYEE_PROJECT  PUBLIC SYSDBA I EMPLOYEE_PROJECT  PUBLIC SYSDBA S EMPLOYEE_PROJECT  PUBLIC SYSDBA R PROJECT  PUBLIC SYSDBA D PROJECT  PUBLIC SYSDBA U PROJECT  PUBLIC SYSDBA I PROJECT  PUBLIC SYSDBA S PROJECT  PUBLIC SYSDBA R PHONE_LIST  PUBLIC SYSDBA D PHONE_LIST  PUBLIC SYSDBA U PHONE_LIST 904d404444`4,4 4 4 4\ 4( 4 4 4 4X 4$ 4 4 4 4X 3$ 3333 SYSDBA SYSDBA U T  SYSDBA SYSDBA I T Y SYSDBA SYSDBA S T Y  SYSDBA SYSDBA R T  SYSDBA SYSDBA D T  SDBs SYSDBA SYSDBA R T Bs SYSDBA SYSDBA D T Bs SYSDBA SYSDBA U T s SYSDBA SYSDBA I T s SYSDBA SYSDBA S T sSYs  SYSDBA SYSDBA R T  SYSDBA SYSDBA D T SY B SDB; SYSDBA SYSDBA R T B; SYSDBA SYSDBA D T B; SYSDBA SYSDBA U T ; SYSDBA SYSDBA I T ; SYSDBA SYSDBA S T ;SY;   SYSDBA SYSDBA R T   SYSDBA SYSDBA D T  SY   B  SDBd  SYSDBA SYSDBA R T Bd  SYSDBA SYSDBA D T Bd  SYSDBA SYSDBA U T d  SYSDBA SYSDBA I T d  SYSDBA SYSDBA S T d SYd    SYSDBA SYSDBA R T   SYSDBA SYSDBA D T  SY   B  SDB  SYSDBA SYSDBA R T B  SYSDBA SYSDBA D T   SYSDBA SYSDBA U T   SYSDBA SYSDBA I T  SYSDBA SYSDBA R T  SYSDBA SYSDBA D T  SYSDBA SYSDBA U T  SYSDBA SYSDBA I T  SYSDBA SYSDBA S T  SG SYSDBA SYSDBA R T G SYSDBA SYSDBA D T G GSDBGGG S SYSDBA SYSDBA R T  SYSDBA SYSDBA D T   SYSDBA SYSDBA U T  SYSDBA SYSDBA I T Y SYSDBA SYSDBA S T Y SYSDBA SYSDBA R T2  SYSDBA SYSDBA D T2  SYSDBA SYSDBA U T2  SYSDBA SYSDBA I T2  SYSDBA SYSDBA S T2  SYSDBA SYSDBA R AR  SYSDBA SYSDBA D AR  SYSDBA SYSDBA U AR  SYSDBA SYSDBA I AR  SYSDBA SYSDBA S AR  SYSDBA SYSDBA R T4  SYSDBA SYSDBA D T4  SYSDBA SYSDBA U T4  SYSDBA SYSDBA I T4  SYSDBA SYSDBA S T4  SYSDBA SYSDBA R T3  SYSDBA SYSDBA D T3  SYSDBA SYSDBA U T3  SYSDBA SYSDBA I T3  SYSDBA SYSDBA S T3  SYSDBA SYSDBA R T  SYSDBA SYSDBA D T 90-9|E@9555`5(5 5 Bh B4 3 = =t @( I I ;d ;( ; ; ;t ;8 ; ; ;x G0 GG8dJ(::>dGGCCDPPP`C @CCINTEG_45 NOT NULL PROJ_DEPT_BUDGET NO NO INTEG_44 NOT NULL PROJ_DEPT_BUDGET NO NO INTEG_43 CHECK PROJ_DEPT_BUDGET NO NO INTEG_42 NOT NULL PROJ_DEPT_BUDGET NO NO INTEG_41 FOREIGN KEYEMPLOYEE_PROJECT NO NO RDB$FOREIGN16 INTEG_40 FOREIGN KEYEMPLOYEE_PROJECT NO NO RDB$FOREIGN15 INTEG_39 PRIMARY KEYEMPLOYEE_PROJECT NO NO RDB$PRIMARY14 INTEG_38 NOT NULL EMPLOYEE_PROJECT NO NO INTEG_37 NOT NULL EMPLOYEE_PROJECT NO NO INTEG_36 FOREIGN KEYPROJECT NO NO RDB$FOREIGN13 INTEG_35 PRIMARY KEYPROJECT NO NO RDB$PRIMARY12 INTEG_34 UNIQUE PROJECT NO NO RDB$11 INTEG_33 NOT NULL PROJECT NO NO INTEG_32 NOT NULL PROJECT NO NO INTEG_31 FOREIGN KEYDEPARTMENT NO NO RDB$FOREIGN10 INTEG_30 CHECK EMPLOYEE NO NO INTEG_29 FOREIGN KEYEMPLOYEE NO NO RDB$FOREIGN9 INTEG_28 FOREIGN KEYEMPLOYEE NO NO RDB$FOREIGN8 INTEG_27 PRIMARY KEYEMPLOYEE NO NO RDB$PRIMARY7 INTEG_26 NOT NULL EMPLOYEE NO NO INTEG_25 NOT NULL EMPLOYEE NO NO INTEG_24 NOT NULL EMPLOYEE NO NO INTEG_23 NOT NULL EMPLOYEE NO NO INTEG_22 NOT NULL EMPLOYEE NO NO INTEG_21 NOT NULL EMPLOYEE NO NO INTEG_20 NOT NULL EMPLOYEE NO NO INTEG_19 NOT NULL EMPLOYEE NO NO INTEG_18 NOT NULL EMPLOYEE NO NO INTEG_17 FOREIGN KEYDEPARTMENT NO NO RDB$FOREIGN6 INTEG_16 PRIMARY KEYDEPARTMENT NO NO RDB$PRIMARY5 INTEG_15 UNIQUE DEPARTMENT NO NO RDB$4 INTEG_14 NOT NULL DEPARTMENT NO NO INTEG_13 NOT NULL DEPARTMENT NO NO INTEG_12 CHECK JOB NO NO INTEG_11 FOREIGN KEYJOB NO NO RDB$FOREIGN3 INTEG_10 PRIMARY KEYJOB NO NO RDB$PRIMARY2 INTEG_9 NOT NULL JOB NO NO INTEG_8 NOT NULL JOB NO NO INTEG_7 NOT NULL JOB NO NO INTEG_6 NOT NULL JOB NO NO INTEG_5 NOT NULL JOB NO NO INTEG_4 NOT NULL JOB NO NO INTEG_3 NOT NULL COUNTRY NO NO INTEG_2 PRIMARY KEYCOUNTRY NO NO RDB$PRIMARY1 INTEG_1 NOT NULL COUNTRY NO NO 90#P`PPAADAA A| >, N N ;d ;, 8 H Hd 8, 8 8 5 8L 5 5 5 8l 54 8585DEEE|5D5INTEG_80 CHECK SALES NO NO INTEG_79 CHECK SALES NO NO INTEG_78 FOREIGN KEYSALES NO NO RDB$FOREIGN26 INTEG_77 FOREIGN KEYSALES NO NO RDB$FOREIGN25 INTEG_76 PRIMARY KEYSALES NO NO RDB$PRIMARY24 INTEG_75 CHECK SALES NO NO INTEG_74 NOT NULL SALES NO NO INTEG_73 CHECK SALES NO NO INTEG_72 NOT NULL SALES NO NO INTEG_71 CHECK SALES NO NO INTEG_70 NOT NULL SALES NO NO INTEG_69 CHECK SALES NO NO INTEG_68 CHECK SALES NO NO INTEG_67 CHECK SALES NO NO INTEG_66 NOT NULL SALES NO NO INTEG_65 CHECK SALES NO NO INTEG_64 NOT NULL SALES NO NO INTEG_63 NOT NULL SALES NO NO INTEG_62 NOT NULL SALES NO NO INTEG_61 FOREIGN KEYCUSTOMER NO NO RDB$FOREIGN23 INTEG_60 PRIMARY KEYCUSTOMER NO NO RDB$PRIMARY22 INTEG_59 CHECK CUSTOMER NO NO INTEG_58 NOT NULL CUSTOMER NO NO INTEG_57 NOT NULL CUSTOMER NO NO INTEG_56 FOREIGN KEYSALARY_HISTORY NO NO RDB$FOREIGN21 INTEG_55 PRIMARY KEYSALARY_HISTORY NO NO RDB$PRIMARY20 INTEG_54 CHECK SALARY_HISTORY NO NO INTEG_53 NOT NULL SALARY_HISTORY NO NO INTEG_52 NOT NULL SALARY_HISTORY NO NO INTEG_51 NOT NULL SALARY_HISTORY NO NO INTEG_50 NOT NULL SALARY_HISTORY NO NO INTEG_49 NOT NULL SALARY_HISTORY NO NO INTEG_48 FOREIGN KEYPROJ_DEPT_BUDGET NO NO RDB$FOREIGN19 INTEG_47 FOREIGN KEYPROJ_DEPT_BUDGET NO NO RDB$FOREIGN18 INTEG_46 PRIMARY KEYPROJ_DEPT_BUDGET NO NO RDB$PRIMARY17 90CxD4DDDhD$D D DX D D C DH DINTEG_78 INTEG_27 FULL RESTRICT RESTRICT INTEG_77 INTEG_60 FULL RESTRICT RESTRICT INTEG_61 INTEG_2 FULL RESTRICT RESTRICT INTEG_56 INTEG_27 FULL RESTRICT RESTRICT INTEG_48 INTEG_35 FULL RESTRICT RESTRICT INTEG_47 INTEG_16 FULL RESTRICT RESTRICT INTEG_41 INTEG_35 FULL RESTRICT RESTRICT INTEG_40 INTEG_27 FULL RESTRICT RESTRICT INTEG_36 INTEG_27 FULL RESTRICT RESTRICT INTEG_31 INTEG_27 FULL RESTRICT RESTRICT INTEG_29 INTEG_10 FULL RESTRICT RESTRICT INTEG_28 INTEG_16 FULL RESTRICT RESTRICT INTEG_17 INTEG_16 FULL RESTRICT RESTRICT INTEG_11 INTEG_2 FULL RESTRICT RESTRICT 90=%&&`'4) '((&l&D&) % ) (t (L &$ ' ( * % &X &0 & ( % & *d &< & & & % *l )@ ) - & & &p 'H & '(&+|'T'()''''`'8' *''*h'@'INTEG_73 CHECK_22 INTEG_73 CHECK_21 INTEG_72 TOTAL_VALUE INTEG_71 CHECK_20 INTEG_71 CHECK_19 INTEG_70 QTY_ORDERED INTEG_69 CHECK_18 INTEG_69 CHECK_17 INTEG_68 CHECK_16 INTEG_68 CHECK_15 INTEG_67 CHECK_14 INTEG_67 CHECK_13 INTEG_66 ORDER_DATE INTEG_65 CHECK_12 INTEG_65 CHECK_11 INTEG_64 ORDER_STATUS INTEG_63 CUST_NO INTEG_62 PO_NUMBER INTEG_59 CHECK_10 INTEG_59 CHECK_9 INTEG_58 CUSTOMER INTEG_57 CUST_NO INTEG_54 CHECK_8 INTEG_54 CHECK_7 INTEG_53 PERCENT_CHANGE INTEG_52 OLD_SALARY INTEG_51 UPDATER_ID INTEG_50 CHANGE_DATE INTEG_49 EMP_NO INTEG_45 DEPT_NO INTEG_44 PROJ_ID INTEG_43 CHECK_6 INTEG_43 CHECK_5 INTEG_42 FISCAL_YEAR INTEG_38 PROJ_ID INTEG_37 EMP_NO INTEG_33 PROJ_NAME INTEG_32 PROJ_ID INTEG_30 CHECK_4 INTEG_30 CHECK_3 INTEG_26 SALARY INTEG_25 JOB_COUNTRY INTEG_24 JOB_GRADE INTEG_23 JOB_CODE INTEG_22 DEPT_NO INTEG_21 HIRE_DATE INTEG_20 LAST_NAME INTEG_19 FIRST_NAME INTEG_18 EMP_NO INTEG_14 DEPARTMENT INTEG_13 DEPT_NO INTEG_12 CHECK_2 INTEG_12 CHECK_1 INTEG_9 MAX_SALARY INTEG_8 MIN_SALARY INTEG_7 JOB_TITLE INTEG_6 JOB_COUNTRY INTEG_5 JOB_GRADE INTEG_4 JOB_CODE INTEG_3 CURRENCY INTEG_1 COUNTRY 90'''`'8'''INTEG_80 CHECK_28 INTEG_80 CHECK_27 INTEG_79 CHECK_26 INTEG_79 CHECK_25 INTEG_75 CHECK_24 INTEG_75 CHECK_23 INTEG_74 DISCOUNT 90( TEST_ROLE SYSDBA 90$L$ H $  p  (  8 x(|$P RDB$FOREIGN15 EMPLOYEE_PROJECT  RDB$PRIMARY7 $RIMARY7 `UU?RDB$FOREIGN13 PROJECT  RDB$PRIMARY7 #RIMARY7  q?RDB$FOREIGN10 DEPARTMENT  RDB$PRIMARY7 "RIMARY2 ?RDB$FOREIGN9 EMPLOYEE  RDB$PRIMARY2 !RIMARY5 ?RDB$FOREIGN8 EMPLOYEE  RDB$PRIMARY5 RDB$FOREIGN6 DEPARTMENT  RDB$PRIMARY5 RIMARY1 $I?RDB$FOREIGN3 JOB  RDB$PRIMARY1 $I?RDB$PRIMARY1 COUNTRY  ;? MAXSALX JOB  MINSALX JOB !?RDB$PRIMARY2 JOB $I? BUDGETX DEPARTMENT RDB$PRIMARY5 DEPARTMENT  a? RDB$4 DEPARTMENT E  a? NAMEX EMPLOYEE RDB$PRIMARY7 EMPLOYEE R  ?CUSTREGION CUSTOMER R  ? CUSTNAMEX CUSTOMER  ?RDB$PRIMARY22 CUSTOMER `UU? PRODTYPEX PROJECT `UU?RDB$PRIMARY12 PROJECT `UU? RDB$11 PROJECT  $I?RDB$PRIMARY14 EMPLOYEE_PROJECT  `UU?RDB$PRIMARY17 PROJ_DEPT_BUDGET  `UU? CHANGEX SALARY_HISTORY  UPDATERX SALARY_HISTORY  ?RDB$PRIMARY20 SALARY_HISTORY E?QTYX SALES  SALESTATX SALES  NEEDX SALES RDB$PRIMARY24 SALES ?RDB$INDEX_43 RDB$RELATION_CONSTRAINTS $I?RDB$INDEX_41 RDB$INDICES ?RDB$INDEX_39 RDB$ROLES  a?RDB$INDEX_32 RDB$TRANSACTIONS RDB$INDEX_31 RDB$INDICES RDB$INDEX_29 RDB$USER_PRIVILEGES RDB$INDEX_28 RDB$DEPENDENCIES `UU?RDB$INDEX_26 RDB$COLLATIONS RDB$INDEX_25 RDB$CHARACTER_SETS ?RDB$INDEX_23 RDB$EXCEPTIONS RDB$INDEX_22 RDB$PROCEDURES ?RDB$INDEX_20 RDB$COLLATIONS RDB$INDEX_19 RDB$CHARACTER_SETS ?RDB$INDEX_17 RDB$FILTERS RDB$INDEX_15 RDB$RELATION_FIELDS RDB$INDEX_14 RDB$CHECK_CONSTRAINTS 90 L,l+-l+x,1H/+/11X121.T+T,1$-+ -1 -,+ ,` 7( 7, 71 7 7H 7 7 7 7h 74 1 1 1 1d 10 1 1 : :H : :::X::::p1<1:::L:::: SYSDBA  SYSDBASYSDBAd SQL$T  SYSDBA  SQL$DEFAULT39    SQL$DEFAULT36  SYSDBA SQL$T   :  SQL$DEFAULT35  SYSDBA: SQL$T  Y: o  SQL$DEFAULT34  SYSDBASYo SQL$T  o F  SQL$DEFAULT33  BASYSDBAF SQL$T  AF   SQL$DEFAULT32  A SYSDBA SQL$T   SQL$DEFAULT31  ?SYSDBA  SYSDBA  DBASYSDBA   SYSDBA  BASYSDBA  SYSDBA  SYSDBA  SYSDBASYSDBASYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBASYSDBASYSDBASYSDBASYSDBASYSDBASYSDBASYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  SYSDBA  - SQL$ALL_LANGS  -SQL$SHOW_LANGS   -SQL$SHIP_ORDER   -SQL$MAIL_LABEL  - SQL$ORG_CHART  -SQL$DEPT_BUDGET  -SQL$DELETE_EMPLOYEE  -SQL$SUB_TOT_BUDGET  -SQL$ADD_EMP_PROJ  -SQL$GET_EMP_PROJ  - SQL$DEFAULT17  5-SQL$PHONE_LIST  3- SQL$DEFAULT16  p90tF.@MV92V91E02102E0340F3004J1003 320630 4200 3203300566100451392006200B1002C0120990F00202030513088 H00305003009I4700J20043100N5822S4702420099702956220 H0079S6400 p90_.@O&`dfgpw`&hnoja x  _jV(Sp ĵ@ !.X-.` q p90D,@M openny shippedn  y  waitingn y x90q7` ]??s ? ˕ Ϣ Ѧ ۊ   @  ? @  ?p Χ Ѡ ۡ  @ p90}8`SF&&{HɈadmin2&{HɈadmin2&{HɈadmin2 &elaine"&elaine&&{HɈadmin2 elaine  38elaine(&{HɈadmin2 elaine,&{HɈadmin2 elaine.&{HɈadmin2 elaine4&{HɈadmin2 elaine 8&{HɈadmin2 elaine<&{HɈadmin2 elaine =&{HɈadmin2 elaine A&{HɈadmin2 elaine B&{HɈadmin2 elaine &{HɈadmin2 elaineF&{HɈadmin2 elaine&{HɈadmin2 elaineG&38tjJ&elaineN&elaine  38elaineP@&elaineQ&elaineR&elaine  38elaineT&elaineU@&38tjW&elaineZ@&38tj &38tj ]&38elaine^@&38elaine_&38elaine`&38elaine p901@Vadmin2admin2elainetj x90H2@X:H:HLJO"6w p90$0.PE$MAPDB621(GUIDE100671 HWRII6212 70 MAPDB6212 71 KTPR0001001062372  VBASE1006212,MKTPR1001062372  VBASE1006210VBASE100 p90Q-@G MAPDB VBASE GUIDEMKTPRVBASE (MKTPR ,MKTPR .VBASE  4GUIDE 8DGPIIGUIDE AMKTPR FVBASE  VBASE GMKTPR JMKTPR QMAPDBVBASE  TVBASE U@MKTPR Z@MKTPR [MKTPR \@DGPIIGUIDE aVBASE  @VBASE bDGPII VBASE p90+@CAutoMap DigiPizzaMapBrowser port rketing project 3 Translator upgradeVideo Database p90b, PMDGPIIGUIDE HWRIIMAPDB KTPRVBASE p90,`M N/AMarketing project 3hardwareAutoMapotherDigiPizzasoftwareMapBrowser port Translator upgrade Video Database p90m-@THPX`hpx p90 V+P; 3D-Pad Corp.Anini Vacation RentalsButtle, Griffith and Co. Central BankDT Systems, LTD.allas TechnologiestaServe International ynamic Intelligence Corp  o Consulting GeoTech Inc. Lorenzi Export, Ltd. MPM Corporationax rs. BeauvaisSignature Design p90#l,pD BelgiumBrusselsCanadaOttawaEnglandManchesterFijiTurtle Island ranceParis$Hong KongCentral Hong Kong ItalyMilan JapanTokyoNetherlandsDen Haag SwitzerlandZurich USABostonDallasLihuePebble Beach San Diego p901,@P "&(,.48<=ABFGJNP@QRTU@WZ@[@\@]^@_`a@b p90[f1`FB BaldwinJanetenderOliver H.  netAnn ishopDanarownKellyurbankJennifer M. CookKevin De SouzaRogerFerrariRoberto  isherPete orestPhil GlonJacques reenT.J.uckenheimerMark HallStewartIchidaYukiJohnsonLeslie Scott LambertKim eeTerri ungLukeMacDonaldMary S.ontgomeryJohnNelsonRobertordstromCarolO'BrienSue AnnesbornePierre PageMary padopoulosChris rkerBillhongLeslieRamanathanAshokeevesRogerStansburyWillieeadmanWalterutherlandClaudiaWestonK. J.illiamsRandyYamamotoTakashinowskiMichaeloungBruce Katherine p90o-PJCo Consumer Electronics Div.rporate Headquarters ustomer Services upport Engineeringuropean Headquarters Field Office: Canada  East CoastFranceItalyJapan Singapore witzerlandnance MarketingPacific Rim HeadquartersQuality Assurance Research and DevelopmentSales and Marketingoftware Development Products Div. p90- S12000100105620135 30 408060020123 7012900 x90L,@Q? ?? ?     p90-`DAAccntUSA dminUSA EnglandUSA CEOUSA FOUSA DirUSA ocUSAUSA EngUSA Japan USA England USAUSAFinanUSA MktgUSAUSA  ngrUSA USA PRelUSASRepCanada England France Italy Japan Switzerland USAalesEnglandUSA VPUSA p90,`FCanadaQEnglandp =q zG p =qFrance' =pItaly@Japank SwitzerlandffffffUSA   ffffff     ffffff        ! * x902`U??                  ?333332?o q?/?s33332?333332 =p < zG \(Ž?ՙ p90+@I Australia ia BelgiumCanadaEngland FijiranceGermany Hong KongItalyJapan Netherlands SwitzerlandUSA p90V+@ICanadaEnglandFranceItalyJapan SwitzerlandUSA p90+, N1`000100102060020 70 p90\, P1000100 105 2013530408060021237012900 p90|;`bAdminAdminUSA EnglandUSA CEOUSA FOUSA DirUSA ocUSA EngUSA Japan USA England USAUSAFinanUSA MktgUSA ngrUSAUSA PRelUSASRepCanada France Italy Japan Switzerland USAalesEngland USA VPUSA p90,@Pdefp"&.4ABGRU@ WZ@]^@`a p90D'@i48F U@ p90&-@T8  (,.48AFGJQ TU@Z@[\@a@b 90   d  RDB$FOREIGN26 SALES  RDB$PRIMARY7 +IMARY22  ?RDB$FOREIGN25 SALES  RDB$PRIMARY22 *RIMARY1 E?RDB$FOREIGN23 CUSTOMER  RDB$PRIMARY1 )RIMARY7 ?RDB$FOREIGN21 SALARY_HISTORY  RDB$PRIMARY7 RDB$FOREIGN19 PROJ_DEPT_BUDGET  RDB$PRIMARY12 'RIMARY5  q?RDB$FOREIGN18 PROJ_DEPT_BUDGET  RDB$PRIMARY5 RDB$FOREIGN16 EMPLOYEE_PROJECT  RDB$PRIMARY12 %RIMARY7 E?p90t+ LDGPII GUIDEMAPDBKTPRVBASE p907+ Q0001001062123 7012 p90`0 WMAPDBGUIDE HWRIIMAPDBKTPRVBASE p90F,@Q "&(,.48<=ABFGJNP@QRTU@WZ@ ]^@_` p90 +@K BelgiumCanadaEnglandFiji rance Hong Kong Italy Japan Netherlands SwitzerlandUSA p90R-@T HPX`hpx p90I.@UN&NR]^@ _`a 90 0IhJ E?=h506 9 4 8P 8 5 6 5p 68 7 6 7 6` 00 0 7 7 7P 7 4 4 5x 8@ 5 863d64-863X6(-8BAl98BlA09 GET_EMP_PROJ EMPLOYEE_PROJECT  GET_EMP_PROJ EMPLOYEE_PROJECT EMP_NO  GET_EMP_PROJ EMPLOYEE_PROJECT PROJ_ID  ADD_EMP_PROJ EMPLOYEE_PROJECT  ADD_EMP_PROJ EMPLOYEE_PROJECT EMP_NO  ADD_EMP_PROJ EMPLOYEE_PROJECT PROJ_ID  ADD_EMP_PROJ UNKNOWN_EMP_ID  GET_EMP_PROJ EMPLOYEE_PROJECT  GET_EMP_PROJ EMPLOYEE_PROJECT EMP_NO  GET_EMP_PROJ EMPLOYEE_PROJECT PROJ_ID CHECK_28 SALES ORDER_STATUS CHECK_28 CUSTOMER CHECK_28 CUSTOMER CUST_NO CHECK_28 SALES CUST_NO CHECK_28 CUSTOMER ON_HOLD CHECK_27 SALES ORDER_STATUS CHECK_27 CUSTOMER CHECK_27 CUSTOMER CUST_NO CHECK_27 SALES CUST_NO CHECK_27 CUSTOMER ON_HOLD CHECK_26 SALES ORDER_STATUS CHECK_26 SALES SHIP_DATE CHECK_25 SALES ORDER_STATUS CHECK_25 SALES SHIP_DATE CHECK_24 SALES DISCOUNT CHECK_23 SALES DISCOUNT CHECK_22 SALES TOTAL_VALUE CHECK_21 SALES TOTAL_VALUE CHECK_20 SALES QTY_ORDERED CHECK_19 SALES QTY_ORDERED CHECK_18 SALES PAID CHECK_17 SALES PAID CHECK_16 SALES ORDER_DATE CHECK_16 SALES DATE_NEEDED CHECK_15 SALES ORDER_DATE CHECK_15 SALES DATE_NEEDED CHECK_14 SALES ORDER_DATE CHECK_14 SALES SHIP_DATE CHECK_13 SALES ORDER_DATE CHECK_13 SALES SHIP_DATE CHECK_12 SALES ORDER_STATUS CHECK_11 SALES ORDER_STATUS  SET_CUST_NO CUST_NO_GEN  SET_CUST_NO CUSTOMER CUST_NO CHECK_10 CUSTOMER ON_HOLD CHECK_9 CUSTOMER ON_HOLD SAVE_SALARY_CHANGE SALARY_HISTORY SAVE_SALARY_CHANGE EMPLOYEE EMP_NO SAVE_SALARY_CHANGE SALARY_HISTORY EMP_NO SAVE_SALARY_CHANGE SALARY_HISTORY CHANGE_DATE SAVE_SALARY_CHANGE SALARY_HISTORY UPDATER_ID 90 1=@ <4BX:D < @d 3$ ? 6 ;t <8 <1 4 ; =T 2 : 6 7x .@ 8 9 9 9P < ;0<p80?5>x>8=>98T/7:7|,D8X5DELETE_EMPLOYEE SALES SALES_REP DELETE_EMPLOYEE SALES PO_NUMBER DELETE_EMPLOYEE REASSIGN_SALES  DELETE_EMPLOYEE DEPARTMENT OYDELETE_EMPLOYEE DEPARTMENT MNGR_NO DELETE_EMPLOYEE PROJECT ODELETE_EMPLOYEE PROJECT TEAM_LEADER DELETE_EMPLOYEE EMPLOYEE_PROJECT DELETE_EMPLOYEE EMPLOYEE_PROJECT EMP_NO DELETE_EMPLOYEE SALARY_HISTORY _LDELETE_EMPLOYEE SALARY_HISTORY EMP_NO ELDELETE_EMPLOYEE EMPLOYEE DELETE_EMPLOYEE EMPLOYEE EMP_NO  DEPT_BUDGET DEPARTMENT BUDGET  DEPT_BUDGET DEPARTMENT SUB_TOT_BUDGET DEPARTMENT HEASUB_TOT_BUDGET DEPARTMENT HEAD_DEPT SUB_TOT_BUDGET DEPARTMENT BUDGET DELETE_EMPLOYEE SALES  SHIP_ORDER CUSTOMER ON_HOLD  SHIP_ORDER SALES  SHIP_ORDER SALES PO_NUMBER  SHIP_ORDER SALES ORDER_STATUS  SHIP_ORDER SALES SHIP_DATE  MAIL_LABEL CUSTOMER  MAIL_LABEL CUSTOMER CUST_NO  MAIL_LABEL CUSTOMER CUSTOMER  MAIL_LABEL CUSTOMER CONTACT_FIRST  MAIL_LABEL CUSTOMER CONTACT_LAST  MAIL_LABEL CUSTOMER ADDRESS_LINE1  MAIL_LABEL CUSTOMER ADDRESS_LINE2  MAIL_LABEL CUSTOMER CITY  MAIL_LABEL CUSTOMER STATE_PROVINCE  MAIL_LABEL CUSTOMER COUNTRY  MAIL_LABEL CUSTOMER POSTAL_CODE  ORG_CHART DEPARTMENT  ORG_CHART DEPARTMENT HEAD_DEPT  ORG_CHART DEPARTMENT DEPARTMENT  ORG_CHART DEPARTMENT MNGR_NO  ORG_CHART DEPARTMENT DEPT_NO  ORG_CHART EMPLOYEE FULL_NAME  ORG_CHART EMPLOYEE JOB_CODE  ORG_CHART EMPLOYEE  ORG_CHART EMPLOYEE DEPT_NO  ORG_CHART EMPLOYEE EMP_NO  DEPT_BUDGET DEPARTMENT BUDGET  DEPT_BUDGET DEPARTMENT  DEPT_BUDGET DEPARTMENT HEAD_DEPT  DEPT_BUDGET DEPARTMENT DEPT_NO  DEPT_BUDGET DEPT_BUDGET DELETE_EMPLOYEE SALES SALES_REP DELETE_EMPLOYEE SALES PO_NUMBER DELETE_EMPLOYEE REASSIGN_SALES  DELETE_EMPLOYEE DEPARTMENT OYDELETE_EMPLOYEE DEPARTMENT MNGR_NO DELETE_EMPLOYEE PROJECT ODELETE_EMPLOYEE PROJECT TEAM_LEADER DELETE_EMPLOYEE EMPLOYEE_PROJECT DELETE_EMPLOYEE EMPLOYEE_PROJECT EMP_NO DELETE_EMPLOYEE SALARY_HISTORY _LDELETE_EMPLOYEE SALARY_HISTORY EMP_NO ELDELETE_EMPLOYEE EMPLOYEE DELETE_EMPLOYEE EMPLOYEE EMP_NO SUB_TOT_BUDGET DEPARTMENT SUB_TOT_BUDGET DEPARTMENT HEAD_DEPT SUB_TOT_BUDGET DEPARTMENT BUDGET 90  8 / 6\ 2$ 5 8 8 7 5\ 40 *8 < 1 6 4d 38 ) = SHIP_ORDER ORDER_ALREADY_SHIPPED  SHIP_ORDER CUSTOMER_ON_HOLD  SHIP_ORDER SALES CUST_NO  SHIP_ORDER SALES PAID  SHIP_ORDER CUSTOMER_CHECK  SHIP_ORDER CUSTOMER  SHIP_ORDER CUSTOMER CUST_NO  SHOW_LANGS JOB  SHOW_LANGS JOB JOB_CODE  SHOW_LANGS JOB JOB_GRADE  SHOW_LANGS JOB JOB_COUNTRY  SHOW_LANGS JOB LANGUAGE_REQ  ALL_LANGS JOB  ALL_LANGS JOB JOB_CODE  ALL_LANGS JOB JOB_GRADE  ALL_LANGS JOB JOB_COUNTRY  ALL_LANGS SHOW_LANGS  ALL_LANGS SHOW_LANGS LANGUAGES  SHOW_LANGS JOB  SHOW_LANGS JOB JOB_CODE  SHOW_LANGS JOB JOB_GRADE  SHOW_LANGS JOB JOB_COUNTRY  SHOW_LANGS JOB LANGUAGE_REQ  SHIP_ORDER ORDER_ALREADY_SHIPPED  SHIP_ORDER CUSTOMER_ON_HOLD  SHIP_ORDER SALES CUST_NO  SHIP_ORDER SALES PAID  SHIP_ORDER CUSTOMER_CHECK  SHIP_ORDER CUSTOMER  SHIP_ORDER CUSTOMER CUST_NO 90 T E N$AHDEPARTMENT SQL$DEPARTMENT SYSDBA SQL$DEFAULT4 3BUDGET PL:1'4L PHONE_NO555-1234LMNGR_NO LOCATION HEAD_DEPT399/000:104999=L DEPARTMENT ;=LDEPT_NO399/000:104999=L ;=L EMPLOYEE SQL$EMPLOYEE SYSDBA SQL$DEFAULT5 3*SALARY L1L ;=L HIRE_DATE NOWL ;=L JOB_GRADE8L ;=L PHONE_EXT LAST_NAME ;=LEMP_NO ;=L FULL_NAME&'' LAST_NAME,  FIRST_NAMEL JOB_COUNTRY ;=L JOB_CODE199999L ;=L DEPT_NO399/000:104999=L ;=L FIRST_NAME ;=L SET_EMP_NO SAVE_SALARY_CHANGE CHECK_3 CHECK_4 CUSTOMER SQL$CUSTOMER SYSDBA SQL$DEFAULT10 ADDRESS_LINE2ADDRESS_LINE1CUST_NO1L ;=L POSTAL_CODE PHONE_NO CONTACT_LASTON_HOLD-LCOUNTRYSTATE_PROVINCE CITY CONTACT_FIRST CUSTOMER ;=L SET_CUST_NO CHECK_10 CHECK_9 T4 SQL$T4 SYSDBA SQL$DEFAULT14  ` V_WIN1250V_NONE V_OCTETSC_UTF8C1V_UTF8 C_WIN1250C_NONE C_OCTETS PROJECT SQL$PROJECT SYSDBA SQL$DEFAULT6 J PROJ_DESCPRODUCTsoftwareLJ999/software/hardware/other/N/AL ;=L TEAM_LEADER PROJ_NAME ;=LPROJ_ID /gL ;=LEMPLOYEE_PROJECT SQL$EMPLOYEE_PROJECT SYSDBA SQL$DEFAULT7 PROJ_DEPT_BUDGET SQL$PROJ_DEPT_BUDGET SYSDBA SQL$DEFAULT8 3PROJECTED_BUDGET PL:1'4LQUART_HEAD_CNT ) (  FISCAL_YEAR ;=LDEPT_NO399/000:104999=L ;=LPROJ_ID /gL ;=L CHECK_5 CHECK_6SALARY_HISTORY SQL$SALARY_HISTORY SYSDBA SQL$DEFAULT9 8 NEW_SALARY8" OLD_SALARY%$ OLD_SALARYPERCENT_CHANGEdLPERCENT_CHANGE L ;=L OLD_SALARY L1L ;=L CHANGE_DATE NOWL ;=L UPDATER_ID ;=LEMP_NO ;=L CHECK_7 CHECK_8  SALES SQL$SALES SYSDBA SQL$DEFAULT11 J?kAGED# SHIP_DATE ORDER_DATEL DATE_NEEDED SHIP_DATE ORDER_DATE NOWL ;=L PO_NUMBER7VL ;=L DISCOUNT L ;=L TOTAL_VALUE ;=L QTY_ORDERED L ;=LCUST_NO1L ;=L ITEM_TYPEsoftwareLJ999/software/hardware/other/N/AL ;=L SALES_REP PAID nL ORDER_STATUS newL ;=L POST_NEW_ORDER CHECK_11 CHECK_12 CHECK_13 CHECK_14 CHECK_15 CHECK_16 CHECK_17 CHECK_18 CHECK_19 CHECK_20 CHECK_21 CHECK_22 CHECK_23 CHECK_24 CHECK_25 CHECK_26 CHECK_27 CHECK_2890` COUNTRY SQL$COUNTRY SYSDBA SQL$DEFAULT2  JOB SQL$JOB SYSDBA SQL$DEFAULT3 ) AJOB_REQUIREMENT MAX_SALARY L1L ;=L MIN_SALARY L1L ;=L JOB_GRADE8L ;=L LANGUAGE_REQ ) (U JOB_TITLE ;=L JOB_COUNTRY ;=L JOB_CODE199999L ;=L CHECK_1 CHECK_2909089123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 909089123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567908912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345679089123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567908912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345679089123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790 89123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456790891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567908912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345679089123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456_78912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345906789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123459067891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234590678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345906789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123459067891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234590678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678990678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345906789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123459067891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234590678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678912345678990    ` px y 3x t 3r p 3o m 3i 9090fdb-1.4.9+dfsg1/LICENSE.TXT0000644000215700017510000000452512431143160013651 0ustar rstuartit======= LICENSE ======= The following contributors hold Copyright (c) over their respective portions of code and documentation: The main portion of initial code (~95%); Current maintainer: Pavel Cisar Contributors: [Initial trace API & nbackup support; Python 3 support] Philippe Makowski Some code in inital version is Python code from KInterbasDB 3.3.0. As it's very hard to find out who exactly was the original author of used code, here is the full list of KInterbasDB contributors: [Author of original version; maintained through version 2.0:] 1998-2001 [alex] Alexander Kuznetsov [Author of ~90% of current code, most of current documentation; maintained through version 3.3:] 2002-2007 [dsr] David S. Rushby [Finishing touch to v3.3; New Documentation; Current maintainer:] 2008-2011 [paci] Pavel Cisar [Significant Contributors:] 2001-2002 [maz] Marek Isalski Marek made important first steps in removing the limitations of version 2.0 in preparation for version 3.0. 2001 [eac] Evgeny A. Cherkashin Evgeny wrote the first version of the distutils build script, which was included in a 2.x point release. 2001-2002 [janez] Janez Jere Janez contributed several bugfixes, including fixes for the date and time parameter conversion code in preparation for version 3.0. Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee or royalty is hereby granted, provided that the above copyright notice appears in all copies and that both the copyright notice and this permission notice appear in supporting documentation or portions thereof, including modifications, that you make. The authors disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall any author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software.