Monday, January 31, 2005

Danny Thorpe and Tagawa-san are working on an Update 2 for Delphi 2005

Here's the direct quote:

Actually, I'm knee deep in niggly bug fixes in the compiler, RTL, and
VCL for the next D2005 update. Tagawa-san is, too.

Read more @

Sunday, January 30, 2005

SAS is the company that comissioned the Vulcan port of Firebird

My name is David Shamlin; I am with SAS Institute, Inc ( SAS is the company that comissioned the Vulcan port of Firebird. We are a business and analytic intelligence software vendor.

A year and a half ago we identified a business need to incorporate relational/ACID transaction storage capabilities into our platform bundle and decided to pursue an open source database solution that met our requirements. We chose Firebird because it supported an embedable database engine and implemented many of the SQL semantics our consumers need. Because our software platform runs on a number of 64-bit SMP operating systems, our first order of business was to create a Firebird port to one of these systems and introduce modest (i.e., multiple user requests executing in parallel) multi-threading capabilities to the engine. We entered into a partnership with IBPhoenix and with Paul Beach's help acquired the services of Jim Starkey to do much of the heavy lifting on the project for us.

In December of last year, Jim (with Ann's help) finished the initial phases of this work which has come to be refered to as the Firebird Vulcan project. During that time, we also had the opportunity to address some minor JDBC issues with Roman and discuss testing strategies with Pavel. Currently, SAS has three developers and a DBMS product specialist working full time with the Vulcan source. A couple of additional individuals are contributing on a part time basis to additional porting and testing efforts. We have an initial port to z/OS completed, and I hope to initiate ports to a couple more 64-bit Unix/Linux systems in the first quarter of this year.

SAS's intent since the beginning of the project has been to contribute to the Firebird open source project and continue to be an active supporter through direct development and possibly commissioning further coding projects in the future. Since Jim turned over his final work to us in December, we have accumulated a series of source code changes that address some bugs we've uncovered through our testing. At this point, we're interested in committing these changes to the new Vulcan repository on Sourceforge and would like to enter into a dialog with the Firebird project administrators on how we can most effectively accomplish that.

We're pleased with the results we have achieved with Firebird/Vulcan to date and excited about becoming an active participant in the Firebird project. I trust the community at large also sees the value inherent in Vulcan and will welcome SAS's contribution. We look forward to the opportunity to collaborate with the team and getting to know others involved with Firebird better.

I can be reached for direct follow up at and will continue monitor this mail list in case the group wishes to have a more public discussion.

Thanks for your attention -- David
R&D Director, SAS Institute, Inc

The Code Project - Embedded Firebird: Full-Featured Embedded Database with 2 MB Runtime

Firebird is an database with 20 years of history, full set of features (including transactions, stored procedures, hot-backup, excellent scalability, etc.) and a friendly open source license. It is an overlooked but compelling alternative to Microsoft Jet and Microsoft MSDE 2000/SQL Express 2005. Let's take a look how it can be used embedded in your desktop application. What makes Embedded Firebird ideal for embedding:

  • The embedded runtime is <>
  • The database file (it's just a single file) can have any name and extension. You can associate the extension with your application.
  • The migration to a standalone server couldn't be easier. Just copy the database file to the server and change a connection string on your client.
Read more @

Vulcan Merge

The strategy to merge Vulcan and Firebird 2.0 to form Firebird 3.0 will
probably be gated by a single central question: Will Firebird 3.0 use
the Vulcan provider architecture.

Firebird 2.0 consists of two main pieces: A client library and a server
executable (some platforms have an embedded engine packages as a plug
replacement for the client library). The client library contains a
Y-valve front-ending the remote interface. The server executable
contains the server code, the Y-valve, and an engine.

In the Vulcan provider architecture, the client library (Firebird.dll
or contains only the Y-valve. During the database
attach operation, the Y-valve, under control of a configuration files,
tries to load provider modules from an ordered list until one is able to
successfully attach the database. Vulcan currently has providers for
the engine, the remote interface, and a gateway to legacy Firebird and
Interbase. When the ODS is changed, Vulcan gets another engine
provider, retaining the old shared libraries (buildable only from a CVS
tag) for backwards compatibility. Finally, in Vulcan, the server is an
executable linked to the same client library as ordinary client programs.

The provider architecture has a number of advantages. One is the
ability to perform rolling upgrades. In Firebird 2.0, there are two
ways to provide access to databases with different ODSes. One is to
have the single engine support a variety of ODSes. The other is for the
user to balance two (or more) Firebird installs on the same system. For
former is constraining on development, leading to unnecessarily complex
code to straddle versions, while the latter shift the burden to the
user. The Vulcan provider architecture, on the other hand, allows us to
release a new engine version as a new provider, leaving the existing
engine(s) in place, with a tweak of the core configuration file. This
allow a single program to attach simultaneously two databases of
radically different ODS versions, for a single installation to straddle
versions, and for production and development versions to coexist on a
single system.

The Firebird Y-valve, on the other hand, is hard linked to a fix set of
subsystems managed with conditional compilation.

A further complication is that while the Vulcan Y-valve requires that
each provider be thread safe, the Firebird Y-valve assumes its
subsystems are not, initiating THREAD_ENTER/THREAD_EXIT synchronization
before every subsystem calls, leading to tight integration between the
Firebird Y-valve and engine. Imposing the Vulcan provider architecture
on Firebird 2.0 breaks the division of work between the Firebird why.cpp
and jrd.cpp, and forcing the same global reorganization I had to do for

The provider architecture is, perhaps, the most important aspect of
Vulcan, providing a clear, clean mechanism to manage change. And change
is the one thing we can be certain of.

Vulcan Priorites

Vulcan's highest priority is Firebird 2.0 coexistence. Vulcan and
Firebird 2.0 should be serially shared database files. To this end,
Vulcan needs to bring its ODS up to that of Firebird 2.0. The Vulcan
ODS is based on a bastard snapshot of the Firebird 2.0 development tree
a year ago last December. To the best of my knowledge, and I may well
be wrong, the major difference is index structure. Vulcan desperately
needs Arno's extended indexes. The conversion shouldn't be difficult --
btr.cpp was lightly touched -- and while the page cache manager has been
heavily rebuilt, the macros used for interface has been redefined. The
second part of coexistence is making sure that Vulcan and Firebird 2.0
don't trip over each other. For better or worse, the requirement to
support fine granularity threading dictated a change to the lock manager
format, so actually sharing a database between Vulcan and Firebird 2.0
is out of the question. We should, however, make sure that Vulcan uses
a different lock file with an appropriately different header. I think
we also need to solve, for once and all, a strategy that ensures that
two engines never try to shared a database file using different lock
managers. I'll make this the subject of a different post.

I think the second priority is fixing the Linux/Unix build procedure.
The procedure in place is strictly ad hoc for my personal convenience.
It needs to support building outside of the source directories,
differential build for production releases, and support for hybrid 32/64
releases. The dependency on autoconfig is definitely a problem for
platforms that support both 32 and 64 bit executables. Buildgen is
design to generate "stuff" from component specific Visual Studio 7
project files. Right now it generates complete makefiles. I could also
be used in a more limited way to generate make include files to be used
with component specific, hand maintained makefiles.

The third priority is re-implementing the "execute sql" statement and
building a "services" provider. The Vulcan architecture has full
support for the services API in both user interface and the generic
provider class, but there isn't yet a services provider to field the
calls. The difficult problem is that the individual standalone
utilities that comprise the services module are a profound mess,
containing references to internal engine functions, engine threading,
engine thread data, and engine synchronization primitives, none of which
exist anymore. It's an open question of whether to the "services"
builds of the components or just start over. I don't know. Somebody
needs to do a careful investigation and make a recommendation.

The fourth priority is general improvements. This is include new
features and bug fixes from Firebird 2.0 and general upgrades of the
code, specifically including continuation of the engine mechanism
encapsulation process. The most important of these is the
transformation of the RSB mechanism into a proper C++ hierarchy.

Enterprises Warming Up to Firebird Open-Source Database

Evans Data Corp.'s Winter 2005 Database Development Survey looked at the database preferences of some 406 developers in mostly medium to large enterprises. Of those surveyed, 23 percent of developers picked Firebird for use in "edge" databases—in other words, those that are embedded in systems or in devices, such as a point-of-sale system in a retail outlet or a network device. Runners-up included Microsoft Corp.'s Access, at 21 percent, and Microsoft's SQL Server, at 13 percent.

RFID tagging will likely fuel interest in Firebird, said Joe McKendrick. McKendrick is an analyst for Evans, which is based in Santa Cruz, Calif.,1759,1756876,00.asp

Friday, January 28, 2005

Vulcan Joins Free World!

The Vulcan source code joined the free world last week when the CVS tree
moved to the Firebird tree on SourceForge. Vulcan is now under the same
administrative policies as the rest of Firebird. All new and
contributed Vulcan code has been submitted under IDPL. The source tree
also includes the "buildgen" utility necessary to build Vulcan on
non-Windows platforms.

A technical description of Vulcan is available at, including a
description of missing and incomplete components. I urge anyone
interested in Vulcan to start with this paper.

Vulcan is currently available as source with build procedures for
Windows (Visual Studio 7, also know as Visual Studio .NET 2003), 32 bit
Linux, 64 bit Linux, and 64 bit Solaris (Forte compiler w/ pthreads).
Ann and the Pauls are working on binary installations which should be
available soon.

Another document, VulcanRules.html in the vulcan directory, lists a set
of project management rules for the Vulcan project. The project is now
part of Firebird, so the rules are now advisory, not obligatory. They
are, in my opinion, still good rules.

There is not yet a Vulcan release schedule, nor do I expect to see one
before Firebird 2.0 ships. The source tree is open for development,
however, including propogation of features and bug fixes, as individual
developers feel appropriate, from Firebird 2.0. I personally think it
would be useful if the Vulcan and Firebird 2.0 ODSes were brought into
sync. I do ask that developers announce their intentions before
beginning a task rather than waiting until code is ready to submit.

Vulcan development was a long hard struggle, but now it's time for
Vulcan to take it's place in the Firebird project to sink or swim on its
merits. I think its good stuff, and I hope you will, too.


Jim Starkey
Netfrastructure, Inc.
978 526-1376

"Everything about Release 1.5"

A german Firebird 1.5 article entitled "Everything about Release 1.5" written by Thomas Steinmaurer is in the new edition of the German magazine "Der Entwickler". The magazine is available on February 3rd, 2005.

Global Temporary Tables

From Vlad Horsun:

Hi All !

During last two months i did some research and implementation of
global temporary tables. Here i want to show what i has done and listen
your opinions and critics.


Global temporary table (GTT) is base relation with persistent metadata
definition, stored in database catalog (system tables), and temporary data.
GTT's can be two kinds - with data, persistent within connection or within
transaction only. Data from from different connection\transaction are isolated
one from others but metadata is common.

Syntax and semantics:


Creates metadata for GTT and stored it in database catalog.
If optional ON COMMIT clause is omitted then PRESERVE ROWS is default.

handled by the engine the same way as CREATE TABLE statement - when
issued all necessary entries made in system tables and when transaction
commited all other work are done by DFW. GTT differs from persistent tables
by two new flags in RDB$RELATIONS.RDB$FLAGS. ODS change not

GTT's can have indexes, triggers, field and table constraints as permanent
tables. All constraints between any kind of permanent and temporary tables
follow the rule below:

a) references between permanent and temporary tables are forbidden
b) GTT with ON COMMIT PRESERVE ROWS can't reference on GTT

There is a table for easyer understanding which references are allowed

Master: Permanent Preserve rows Delete rows
Permanent Allow
Preserve rows Allow
Delete rows Allow Allow

Domain constraints also can't reference on GTT.

Instantiation and cleanup:

GTT instance created when it first referenced, usually at statement
prepare time. Each instance has its own private set of pages on which
data and indexes are stored. When connection\transaction ends all
instance pages are released.


Data stored on the same manner as persistent tables. At creation
time GTT has 2 pages allocated - primary pointer page (not necessary
actually) and index root page (all index definitions for GTT stored there).
Let call them "base" pages.

When GTT instance is created, engine allocate new primary pointer page
for it and index root page (this pages not tracked in RDB$PAGES) . "Base"
index root page are readed and all indexes from it created for given GTT
instance. All data\index operations with this GTT instance used this pages.

Storage can be inside database files or outside it. For external storage
purposes introduced concept of "page space" :

"Page space" is a set of pages enumerated from zero to 2^32-1 (SLONG)
on which engine can store all types of pages. Each page space reside in
it's own OS file or set of files. Engine has all necessary info about this files.

All database pages now reside within predefined "base" page space.
Pages of GTT's instances can reside within this "base" page space or within
additional page spaces created and dropped on the fly. Temporary page spaces
creation and deletion performed by the engine automatically. Files created
with "temporary" attribute set (on platforms which have such attribute).
"forced writes" set to "off" for temporary page spaces regardless of database
settings. All pages from all present page spaces are handled within common
page cache.

Blob "problem":

At blob creation time engine not know in which relation (permanent or
temporary) this blob will be attached when materialized. Therefore when blob
will be materialized may arise necessity to move it from initial ("base") page
space into page space of the appropriate relation. To avoid such waste of
time i propose extension of blob parameter block (used when blob created).
This extension allows to set initial page space in which blob pages will be
allocated before materialization. No public API change is necessary, only
few new constants.

Known limitations:

When user create new index already existing GTT's instances will not
know about it (and don't build it of course). Only new instances will read
new index definition from "base" index root page and build it.

This limitation seems not very important to me since this is usually
bad practice to change metadata on working database.

Work progress:

Almost all of said above is implemented in my private tree.

Current implementation allows to have follow kinds of storage for
temporary page spaces:

1. No temporary page spaces - all inside database
2. Page space per attachment
3. Page space per engine process (one common page space for SS or
separate page space per CS process)

Now it is hardcoded but can easy be moved into configuration file.
I have no strong opinion about how files for temporary page spaces must
be configured - where it must be created. Now i simple create each page
space in its own single file with predefined name:

sprintf(file_name, "fb_tmp_%x_%x", pid, hash);

where "pid" is process id and "hash" is hashed full name of primary database
file. Files are placed into GetTempPath(). As temporary solution and for testing
purposes its worked fine but for production use we must introduce some
rules for it.



FIXML is a free utility which can export any table or Select sql
statement to xml.

Designed to work with: firebird 1 & 1.5x and Interbase 6 & 7

Visit for
more info

Some Linux apps are small wonders

While it's easy to sing the praises of big applications like or the GIMP (and rightly so), the heavyweights of the open source world cast a long shadow over a host of much smaller, lesser-known apps that may do just what you need. One of the original philosophies behind Unix was that a program should do one thing and do it well. Here are a few programs that embody that philosophy.

Read more

Thursday, January 27, 2005

Running Windows viruses with Wine

It just isn't fair that Windows users get all the viruses. I mean really, shouldn't Linux users be in on the fun as well? Well... thanks to the folks running the Wine project, Linux users can "catch the virus bug" too -- sort of.

Read the rest

Vulcan is now alive and well within the Firebird CVS tree on Sourceforge!

Vulcan is now alive and well within the Firebird CVS tree on Sourceforge. The Source Code can be downloaded and built from there using the module name of vulcan. For those of you who want to know more about Vulcan, we have prepared an overview document (.pdf), detailing the work that went into it, what still needs to be finished, how to build it and use it.

Embedded Firebird and MSDE 2000 Feature Comparison


This is a basic comparison of Firebird 1.5 and Microsoft MSDE 2000 that stresses the advantages of Firebird. The whole matter is not so simple, especially when you are trying to compare Embedded Firebird (that is not a standalone server) and not Firebird Server. I'm going to expand this comparison later (and to bring a Firebird/SQL Express 2005 comparison as well).

FeatureEmbedded Firebird 1.5Microsoft MSDE 2000
Deployment and Administration
Single database file No
Embeddable Details... Limited*
XCOPY data deployment Details...
Hot backup (24x7 availability is possible)
Can run on Windows 98
Database file size limit Unlimited*** 2 GB
Multiple concurrent users Limited**
Engine Features
Autoincrement fields
Stored procedures and triggers
BLOB fields
Unicode support
National character sets support (including sorting)
ADO.NET Provider
Open-source license Details...
License allows use in commercial applications Details...

* Embedding. MSDE can be installed with the host application but it still is a separate server. You need to accept MSDE EULA before redistribution. Firebird can be installed as a server or can be used as as a part of the application (just a single DLL copied into the application directory that doesn't expose any TCP/IP or other interface to other applications).

** Multiple concurrent users. MSDE contains a workload governor which adds performance penalty when there are more than 5 concurrent connections working (NB working not just open).

*** Database file size limitation. Firebird is limited only by file system (e.g. 16+ TB on NTFS).

To summarize: Embedded Firebird is a clear win when you need a fully embedded database that users are not aware of. Comparing standalone Firebird server is a different story and we will come back to it later. The clear advantages of Embedded Firebird are:

  • Licensing. You can't beat Firebird's open-source license that allows use in commercial applications without any viral effect (i.e. no need to open your proprietary code). Any kind of a "free redistribution" license is just too far from that.
  • XCOPY Data Deployment. A Firebird database is a single file. Just copy it somewhere on disk and open it. Compress it and send it by e-mail. Use your own file extension and associate it with your application.
  • XCOPY Runtime Deployment. Not only the data but the runtime (which is a single DLL and optional supporting files) can be just copied to your application's directory.
  • Runtime size. Compare the MSDE 40+ MB download with the 2 MB Firebird runtime.
  • No performance limitations. With Firebird you can have a database of any size and open multiple connections without any penalty.
  • Real embedding. Users and administrators don't need to be aware that your application is using Embedded Firebird because it is only accessible from your application.



I mentioned already in Migration from MySQL I. that in Firebird you should use a generator instead of AUTO_INCREMENT:



In that example we used a stored procedure SP_MYTABLEINSERT to insert the data. If you need to get the number that was returned by the generator you can modify this stored procedure to return the generator value:


We increase the generator value by one and store the result in ID variable. After modifying the stored procedure header we now return the inserted id.

Migration from MySQL II.


If you are missing a tool like phpMyAdmin when coming from MySQL, you should try ibWebAdmin.

Migration from MySQL I.


Why you should do that:

  • stored procedures support
  • views support
  • transactions (these are also supported in InnoDB tables in MySQL)
  • friendly open source license that allows commercial use and embedding for free
  • embeddable (with a small runtime)
  • hot backup
How to:

1) Autoincrement fields

There are no autoincrement fields in Firebird. You need to use a generator. It is a server variable that stores the last number used. You need to call it when inserting a new row:
  • in an inserting stored procedure
  • in a trigger
Given that we have a table

CREATE TABLE mytable (

mytext VARCHAR(20)
the generator would look like this:

the trigger would look like this:


and the inserting stored procedure like this:



2) NOW()


SELECT * FROM mytable WHERE mydate = NOW();

There are three special variables for current date and time:
  • CURRENT_TIMESTAMP (date and time, TIMESTAMP type)
  • CURRENT_DATE (date, DATE type)
  • CURRENT_TIME (time, TIME type)
3) LIMIT x, y (return first y rows starting at offset x)

In Firebird it looks like this :

LIMIT x (take first 10 rows) looks like this:

SELECT FIRST x * FROM mytable;

Wednesday, January 26, 2005

Components4Developers are happy to present kbmMW v. 2.50.00.

kbmMW v. 2.50.00 is currently running in beta test.

With this release, new SKU's are being introduced, OpenSource, Standard, Pro and Enterprise.
Existing kbmMW v2 license holders will automatically be upgraded to a special SKU referenced to as kbmMW ProPlus.

Some of the major new features to mention:

- FULL safe .Net serverside and client side support for D2005.Net.
- Safe .Net client side support for Compact Framework
- Java client side support in addition to the existing Java serverside support.
- D2005/Win32 support
- Additional messaging capabilities including support for loadbalancing and persistant message stores.
- Loadbalancer teaching and learning capabilities.
- Additional database adapters.
- Highly detailed Windows Performance Monitoring support for complete application server monitoring.
- Even higher performance for certain areas.
- and much more!

Please checkout feature matrix and price information on site at

Fulltext Search in Firebird


Firebird doesn't support fulltext search. You need to rely on third party tools. That seems odd, but it doesn't have to be so bad as it looks at first.

I am using DotLucene. It is an open source .NET library (ported from Java) that can index any data (structured or unstructed) that you are able to convert to raw text.

On a server, it is no problem to store the index in a separate directory (you can also load it to RAM to make your searches super fast - if you have enough RAM, of course). In a desktop application, it might be useful to store the index in a Firebird database.

For example: MySQL fulltext search has these drawbacks (compared to DotLucene):

  • You can use it only in MyISAM tables (i.e. no transactions)
  • You can't browse the index (see Luke)
  • You need to store transformed text in the DB (i.e. HTML without tags)
  • It doesn't support highlighting of the query words in the result
  • You will hardly modify the sources to do custom changes
  • The license doesn't allow to use it in commercial application for free
  • It is reported to be slow on large data sets

IBFirstAID 1.5 and IBAnalyst 1.7 are released

What's new in IBFirstAID 1.5

  • Support for multi-volume databases. Now IBFirstAID 1.5 is able to diagnose and repair databases which contain several volumes.
  • Detecting and fixing BLOB errors. IBFirstAID 1.5 walks through each BLOB in every table and checks its integrity, alerts errors and fix links to corrupted BLOBs.
  • Page Inventory Pages (PIP) repairing. Missed page inventory pages will be automatically recreated if needed. It increases capability to repair databases with large amount of lost data.
  • Improved repairing of pointer pages errors. IBFirstAID recreates and chains again missed pointer pages.
  • Enhanced algorithm of data pages checking and repairing.
  • Fixed bug with large databases checking
  • Fixed bug with index checking for InterBase 7.x databases
  • Improved user interface
  • New license types: Site License allows to use IBFirstAID on all computers in your company and Vendor License allows you to use IBFirstAID to fix your customers databases

What is new in IBAnalyst 1.7

  • Improved transaction state view (Summary page) with rewritten hints and recommendations.
  • Graphical transactions relation representation (Absolute and relative view)
  • Additional computed numbers that helps to understand database load (average transactions per day, active transactions %, frequency of automatic sweep start and so on).
  • Massive updates/deletes detection
  • Tables fragmented by blobs detection
  • Useless indices detection
  • InterBase 7.5 index null keys report
  • Ability to copy data to clipboard (right mouse click)
  • Examples of statistics with explanations
  • New Options (Transactions, Tables, Indices, Interfase)
  • Additional documents, explaining getting statistics and Summary page owerview.
  • Improved analytic algorythms and hints

Download free installation of IBFirstAID 1.5 Diagnostician

Download free installation package of IBAnalyst 1.7 Evaluation

Security changes in firebird 2.0 - README.sha1

Alexander Peshkov Added File:

Log Message:readme for security review
IF YOU GET MESSAGE "cannot attach to password database" TRYING TO START FIREBIRD AFTER UPGRADE FROM 1.5, PLEASE READ ~/upgrade/v2/security_database.txt.

WARNING! Firebird security level is still not satisfactory in one serious aspect, therefore carefully read this document before opening port 3050 to "big dirty" net.

Very important security problem of firebird, which is still unresolved - transmission of badly encrypted passwords (read - clear) across network. Unfortunately, it's impossible to solve this problem without breaking old clients, i.e. user who has set password using new secure way will not be able to attach to the server with old client. This fact (and plans to upgrade some aspects of API in next version) lead to decision not to modify way of passwords transmission in firebird 2.0. Fortunately, this problem may be easily solved using any IP-tunneling software (like ZeBeDee) to move data to and from firebird server (this is true for both 1.5 and 2.0) and this is recommended way to access your remote firebird server across internet.
Special attention was paid on the following aspects of security:
- none brut-force resistant passwords encryption in security.fdb;
- ability for any remote user (with valid account) to open security.fdb and read hashes from it (specially interesting in combination with previous point);
- inability for user to change his own password;
- no protection from remote brut-forcing of passwords on the server directly.
Lets have a look at the process of user identification in firebird 1.5. DES algorithm is used to hash password twice - first by client, next by server before comparison with hash stored in security database. But this sequence becomes completely broken when one SYSDBA changes password - client performs hash calculation twice and stores resulting hash directly in security database. Therefore hash management is completely client-dependent (or even better to say client-defined). To be able to use stronger hashes another approach should be used - hash to be stored on the server is always calculated by server side. And such schema already exists in firebird - this is services API. Therefore decision was made to use services API in any client activity related with users management. For today gsec and isc_user_add(modify,delete) API both use services to access security database (with exception of embedded access to POSIX CS, see below). Now it became quite easy to make any changes to way of passwords hashing - it's always performed by server. Should notice, that new gsec successfully works with old firebird versions - as long as server supports services, it's not a problem of gsec, how will be calculated the hash for security database, it simply asks services to do the work!
New hashing algorithm, selected for firebird 2.0, is SHA-1. Data, stored in PASSWORD field of security database, contains two parts - some random number, used as salt for calculating this particular hash, and hash itself (it's calculated as SHA1 (salt || username || password)). This method leads to the facts that (first) hash valid for user A is invalid for user B and (second) when user changes his password even to absolutely the same as later, new data is stored in PASSWORD field of security.fdb. This facts don't increase resistance to any attempt to brut-force password, but make "visual" analysis of stolen password database much harder.
One of the problems, solved during security review, was old gsec. Certainly, no one can change data in security database without correct password knowledge, but it's relatively easy to use old version of gsec. It will write bad old hash in PASSWORD field, and if LegacyHash parameter of firebird.conf is set to 0 (this is default, 1 should be used only during upgrade process), login to server becomes impossible. Therefore special measures were taken to make remote connection to security database impossible at all. Don't be surprised if some old program, trying to use such direct access, fails - this is by design, only services API (and isc_user_* API functions, in turn using services internally) may be used now to access users info.
Structure of security database was changed. In general, now it contains patch by Ivan Prenosil, enabling any user to change his own password. But there also some small differences. In firebird 1.5 table USERS had to be readable by PUBLIC - it was engines requirement, other case process of password validation failed. In Ivan's patch solution with view, having condition USER = '' in where clause, was used. That worked due to another bug in engine, which left USER SQL variable empty, not 'authenticator', as it might seem from engine's code. After fixing that bug, it was certainly possible to add condition USER = 'authenticator', which in short-term was OK, because normal username is always converted to upper case. But better solution was found, and now user authentication process does not depend from such tricks. As the result - non-SYSDBA user can see only his login in any user-management tool (gsec, any GUI, which uses services API). SYSDBA certainly has full access to manage users' accounts.
The chance left for hacker to break firebird installation is trying to brut-force password. Taking into account, that maximum password length is 8 bytes, this is a bit possible for firebird. Version 2.0 has protection from it - after too many attempts to enter wrong password authentication process is locked for a while, minimizing the chance of finding correct password during reasonable time.
POSIX classic server.
For some technical and historical reasons, this kind of installation is specially dangerous from security point of view. Users, having embedded access to databases, MUST be given at least read access to such critical place as security database. This is the main reason that no matter of the fact that in firebird 2 security database is protected from any remote access, use of enhanced password hashes in it was really required step. Imagine malicious user, having user-level access to firebird. He can easily steel security database, take it home and quietly brut-force old DES hashes! After it he can change data in critical databases, stored on that server - specially dangerous kind of attack. In firebird 2 such activity was made much harder to perform.
But embedded POSIX server has one more problem with security - services API on it uses that same command line gsec, as normal users do. Therefore this utility must have full access to security database. Luckily, the main reason to reason to restrict direct access to security database was protecting from use of old versions of client software. But it's quite unlikely to have old client and new server on the production box. Therefore current solution of giving full embedded access to local security database in embedded mode is not too dangerous.

New documents added to firebird 2.0 Unstable by Dmitry Yemanov

Changes can be traced in the What's new text file on sourceforge . Some documents are not added yet.

* SQL improvements:
1) Introduced SEQUENCE as a synonym for GENERATOR (as per SQL-99)
2) Added SQL-99 compliant NEXT VALUE FOR
3) Implemented REVOKE ADMIN OPTION FROM statement
See also:
* ISQL improvement:
Command line switch -b to bail out on error when used in non-interactive mode.
Also,return an error code to the operating system.
See also:/doc/README.isql_enhancements.txt

* Context variables
Added support for context variables via RDB$GET_CONTEXT and RDB$SET_CONTEXT system functions
See also:/doc/sql.extentions/README.context_variables2

* SQL improvement:
Allowed PLAN, ROWS and ORDER BY clauses in UPDATE/DELETE statements
See also:/doc/sql.extentions/README.select_expressions
Added an equivalence predicate which behaves exactly as equality/inequality, but treats NULL = NULL as TRUE
See also:/doc/sql.extentions/README.distinct

* More SQL improvements:
1) Allowed FIRST/SKIP/ROWS/PLAN and ORDER BY clauses in views
2) Added CROSS JOIN (A CROSS JOIN B means something like A INNER JOIN B ON 1 = 1 or just FROM A, B)
3) Allowed UNION in subqueries and INSERT statement
See also:/doc/sql.extentions/README.select_expressions

* UDF improvement:
Ability to signal SQL NULL via a NULL pointer
See also: /doc/sql.extentions/README.ddl.txt

* Expression indices:
Implemented indices based on arbitrary expressions
See also:/doc/sql.extentions/README.expression_indices

* IIF builtin function :
Added IIF (, , ) as a shortcut for CASE WHEN THEN ELSE END
See also:

* Improved ISQL:
1) Fixed bug SF #910430 - ISQL and database dialect
2) Add SET HEADING ON/OFF option
3) Add -M2 command-line option to send output of statistics and plans to the same file than the rest of the output
See also:/doc/README.isql_enhancements.txt

* New database shutdown modes are introduced Single-user and full
shutdown modes are implemented
See also:/doc/README.shutdown_modes.txt

* Implemented EXECUTE BLOCK statement It is now possible to use dynamic PSQL with this statement
See also:/doc/sql.extentions/README.execute_block

* Implemented support for default parameters for stored procedures
See also:/doc/sql.extentions/README.default_parameters

* Re-worked logic of updatable views This solves problems with views that are implicitly updatable,but still have update triggers
See also:/doc/sql.extentions/README.view_updates

* Added SQL200X ROWS clause New syntax to limit amount of records you want to get
See also:/doc/sql.extentions/README.rows

* Support for explicit cursor syntax in PSQL It is now possible to declare and use multiple cursors in PSQL
See also:/doc/sql.extentions/README.cursors

* Improved PLAN clause Allowed to specify more possible paths for the engine
See also:/doc/sql.extentions/README.plan

* Added LEAVE syntax support PSQL loops now may be marked with labels and terminated in Java style
See also:/doc/sql.extentions/README.leave_labels

* Improved ROW_COUNT Now it's possible to get number of selected rows as well
See also: /doc/sql.extentions/README.context_variables

* Derived tables support Implemented support for derived tables in DSQL (subqueries in FROM clause) as defined by SQL200X
See also:/doc/sql.extentions/README.derived_tables.txt

* New backup technology Implemented fast on-line physical incremental backup facilities
See also: /doc/README.nbackup.txt

* Generic cleanup. Various cleaning and tidying up of code, warnings removal,64-bitness cleanup, numerous minor bugfixes

Tuesday, January 25, 2005

Open Source Database – Will Proprietary Databases Survive?

Open Source Database – Will Proprietary Databases Survive? By Robin Bloor on Mentions Firebird, "If you want hot transaction performance then FireBird is probably the candidate."

FBExport V1.55 has been released

FBExport V1.55 has been released and is available for download. FBExport is an open source command-line and GUI tool for exporting/importing data to and from Firebird and InterBase databases. It is based on the IBPP C++ library, and runs on both Windows and Linux.

Monday, January 24, 2005

PostgreSQL opens up to Windows

PostgreSQL opens up to Windows on Tectonic, mentions Firebird.

"UK way behind Continent on open source"

"UK way behind Continent on open source" by Ingrid Marson on Funnily enough this article reflects IBPhoenix's experiences, in terms of trying to get information on the use of Open Source software from the current UK Government.

Sunday, January 23, 2005

ANN: JVCS 2.40 RC3 appserver ports released on SF

On behalf of the JEDI VCS team I'm pleased to announce the
third Release Candiate of the JVCS 2.40 appserver setups.
This RC is intended to be the last release candidate before the
2.40 final is released.
If you have contributed to JVCS and you don't find your name in
the list of contributors, please add a note to:
to include a complete list in the final release.

JVCS server setups 2.40 RC3 Setup are now available for download at:

For changes please read the Release documentation also available in the
SF files section.

For reporting problems please use the JVCS Bug/Wish list on


Thomas Huber
(JVCS Coordinator)

Saturday, January 22, 2005

Firebird database provider will be part of the next release of Mono 1.1.xx.

FireBird: Carlos Guzmán's Firebird database provider has been checked into CVS and will be part of the next release of Mono 1.1.xx.

Firebird SQL can be used either in server/client mode, or it can be embedded into your application to simplify configuration and deployment of smaller applications. Both modes are supported by Carlos' provider.

from mono blog

Imported vulcan sources into cvs

Pavel Cisar imported vulcan source into cvs on sourceforgeand then on Jim's request removed some of files

Testing Testing Testing Firebird

Pavel Cisar modified testing module (qmdb) with a new README

"BDC Software’s BDC 2.1 is built on award winning Firebird database for scalability and performance."

Technology-Tennessee Dealership Sales Hold Steady as Sales Plummet across the Country for the Mitsubishi Brand. You are already wondering what this has to do with Firebird, read on until it mentions that "BDC Software’s BDC 2.1 is built on award winning Firebird database for scalability and performance."

MySQL and Firebird battle for database top spot

MySQL and Firebird battle for database top spot by Ingrid Marson, ZDNet UK.

Database developers are favouring Firebird and MySQL over PostgreSQL, according to new research.

The Evans Data Corporation survey of 400 database developers found that MySQL accounted for 40 percent of open source database deployments, while Firebird accounted for 39 percent. PostgreSQL accounted for 11 percent of deployments, said the survey.

MySQL and FirebirdSQL Top Open Source DB List

MySQL and FirebirdSQL Top Open Source DB List by Sean Michael Kerner on

FireBird burns through open source database market

FireBird burns through open source database market: Survey by Liam Lahey on eChannelLine, Canada.

Wednesday, January 19, 2005

AMD64 Builds of Firebird 1.5.2 are recalled

Because some potential corruption problems have shown up with pre-existing databases on the AMD64 Linux installations of Firebird 1.5.2, the kits have been recalled to the pre-release area for further testing.

FireBird is the most used open source database for Enterprise applications

FireBird Soars into Database Deployments, New Evans Data; Survey Open Source Databases Usurp Market Share

SANTA CRUZ, Calif.--(BUSINESS WIRE)--Jan. 18, 2005--FireBird is making major inroads in the database space, according to Evans Data Corporation's new Winter 2005 Database Development Survey. FireBird is the most used open source database for Enterprise applications, more database developers use FireBird for single purpose applications and FireBird is tied for the most used database for workgroup applications. Further, MySQL and FireBird are locked in a virtual tie in the open source database space with each being used by just over half of database developers who use open source databases

more reading this link

Firebird and Web Services - question

Anybody out there using firebird as a backend for "Web Services" ?
I have used FB for backend of web services and web sites for many years
using cgi/isapi and more recently C# with the fb .net privider.


Si Carter

[ED: i think there is no problem using it from any language java,php . Webservices are open standards]

Stored Functions idea on Firebird-Architect

From: Fabricio Araujo
Appear that some people would like
to implement some simple functions in
FB PL/SQL. There are some (easy/
not sloppy) way to implement something
like a CREATE FUNCTION statement
(will return a scalar type - varchar,
integers, floats, etc only one value).
No allowed to return resultsets.

That will make some simple functions
to be implemented as SQL functions
instead of the (trickier) UDF functions.

What do you think about?

and response From:Dmitry Yemanov

> I believe Dmitry has this already working
> in his private tree. The trick is to write
> a selectable procedure and to have DSQL
> automatically wrap it in singleton select.

Correct. Just for the record, I wanted true SQL
functions, not just an another call type for
procedures with single return parameter. So DSQL
parser should be extended to process new DDL properly,
as well as support RETURN clause (disallowing
SUSPEND/EXIT at the same time) and generate valid
selectable BLR. Also a minor ODS change is required
to clearly distinguish between procedures and functions.
I was about to propose the necessary stuff, but the
well-known "external procedures" talk happened exactly that
time and I've shut my mouth to have the external
stuff agreed on first, as these things are interrelated.
Now I'm not sure when and how we should
reopen this question. I just know that we definitely should.

Sunday, January 16, 2005

KylixDriver version 2.0 release

KylixDriver is a RAD Kylix-oriented and integrated software for PC hardware access. At the current stage of development this toolkit can be efficiently used for writing Linux device drivers for PCI specific hardware and broad range of other types of peripherals.

Why not to drive hardware directly from user applications? Why not to diagnose hardware resources right at Kylix design time and, at once, to create the driver skeleton for your device?

KylixDriver is a ready-made solution!

KylixDriver Outside Documentation on the Web is here.

Firebird 1.5 Error Codes - posted

Firebird 1.5 Error Codes submited by Helen Borrie (PDF)

Full listing of SQLCODES, GDSCODES, Symbols and Messages, extracted from msg.gdb for use in "The Firebird Book"

DOWNLOAD Right-click to download as PDF

is located on the documentation page

Scheduler option into Firebird ?

DY> Isn't it what e.g. cron is for? ;-)

BTW, I do not agree to this. I believe that something like


is much more simpler way to add task compared to creating a script and
adding a cron job to execute an SQL script. How to add this feature to
ClassicServer is another question (probably will not be an issue for
Firebird 3.0). Under which account with which rights to execute it, that one
more question to answer.

But that's my personal opinion.

and Jim's response:

Netfrastructure has such a feature. For better or worse, the schedule is expressed in CRON format extended with seconds. There are two schedulers, one for system tasks and one for user tasks. System tasks are things like the memory scavenger and the Java garbage collector. User tasks are used for replication, calendar notification, report generation, backups, etc.
A major difference between Netfrastructure and Firebird, of course, is that Netfrastructure has an internal Java Virtual Machine that the scheduler uses for scheduler wakeups. In the Firebird context, I don't think stored procedures have enough computational power to be as useful, but it would be a start.

As for rights, the solution is simple. A secheduled procedure runs with the rights of the user who scheduled it.

The Firebird Federation Data Archive

Since we all deal with a lot of common data it makes sense to provide an

archive where that data can be centralised. There have been various
discussions on things like postcodes, zip codes and the like, and
providing a means of combining data from several sources seems to be the
best way forward.

Since the Foundation only covers this planet, and I'm sure someone will
come up with inter-planetary records, we are probably creating a
'Federation' of data sources.

So far I have
COUNTRIES with ISO2 and ISO3 code
- need to add dialing number/international ref no
DE_STATE with state code
US_STATE with state code
CA_PROVINCE with code and space for flags
- but then I could not load them ;)

Hopefully people get the idea, and I am sure we will be adding such
things as country flags, and other elements, but they will not be
compatible with a csv download :( So I suspect we will have an image
less view as an option for creating the csv extract.

I do have the GB Postcode list, but I'll refrain from posting that
1492000 records making 200Mb of data, and while it has been created from
sources I have control off, I'm not sure on the 'copyright' position
over postcode data. I will have an 'area' code list - the first half of
the postcode - but anything more accurate will need investigating.

Can someone with better SQL skills than me tell me if we can combine the
county/state/province tables to produce a world 'state' list as a view
on the other tables, or will I need to 'build' the larger table via
scripts and 'pump' the data?

Who else has some contributions?
Eating places in the Gamma Quadrant?

Of cause you all have access to Black Crystal communications, so you
know that the link is

I've created a second demo database with the information in, and
ibWebAdmin provides a csv upload/download, in addition to on line editing.

Lester Caine
L.S.Caine Electronic Services

firebird 1.5.2 - debian status

I am in process of building firebird-1.5.2 packages. I used the 1.5.1 diff.gz as starters and then just fixed the failing hunks.

Also, I've fixed the lintian complains. These include:
1) short description starting with a capital letter (but see #288568)
2) non-dev packages containing symlinks to libraries, i.e. -> These are moved in -dev
3) maybe others I can't remember.

Remaining lintian warnings:
1) about NMU - since I am not in the Uploaders: lintian thinks this is a NMU build. Should I include myself in Uploaders or just ignore the warning?
2) .dsc file contains strange architectures in Architectures: like "darwin-i386" and such. This comes from @arches@ in debian/ where it is replaced by the output of `type-handling i386 any'. I see 1.5.1-4 has the same list of strange architectures.

Unfortunatelly I have no hosting at hand. Is there a place I can upload the files for review/testing?

Damyan Ivanov

Mandrake and Firebird

Good news !

Firebird.src.rmp is in the Mandrake cvs

the guy from Mandrake made the job, so I hope we have a strong
probability to be in the next release of Mandrake.


the first rmp is in cooker
so Mandrake i586 users can have a try
-- Philippe Makowski

Firebird news...

IT for free, the catalogue of open source products is growing in breadth and sophistication. But can it really form the basis for a comprehensive – and free – enterprise software stack? On Infoconomy by Tim Bradshaw mentions Firebird.

Updated ODBC Snapshots (V2.0 Beta, V1.3 Beta) are available for download.

Devrace announce the availability of FIBPlus V6.1.

IBEasy+ 1.3.1 is now available for download.

Borland Data Provider for Firebird (1.0 Alpha 4) is now availiable for download.

IBReplicator Beta is available for download..

Wednesday, January 12, 2005

SUSE Linux 9.2 Released to Mirrors

SUSE Linux 9.2 was released to mirrors few days ago. Novell is providing both the traditional Net Install Disc as well as DVD ISO's for i386 and x86_64. Here's the Distrowatch Link.

IBM offers 500 patents for open-source use

IBM has decided to let open-source developers use 500 software patents without fear of an infringement lawsuit, a new step in its encouragement of the collaborative programming philosophy.

Read more @

kbmMW v. 2.50.00 beta launched!

Loads of new stuff, including:

- support for Delphi 2005 Win32 and .Net as fully safe code!
- Loadbalancing teaching/learning capabilities
- Indy 10 support
- SDAC3 database adapter support
- Windows Performance Monitor support

and much more!

kbmMW aims for being the preferred middle tier framework for everything from individual applications to worldwide enterprise setups requiring 100% uptime and peak performance!

Tuesday, January 11, 2005

Unified Interbase (UIB) 2.0 RC 4

# New component TJvUIBRepair.
# New component TJvUIBSecurity (thanks to Volkan Ceylan).
# New component TJvUIBEvents.
# Rewritten TJvUIBScript to handle large script.
# Corrected dataset (FPC 1.9.5 compatibility).
# Improved TJvUIBDatabase to retrieve database informations.
# Corrected "jvuibmetadata" to retrieve array informations.
# Read/write faster NUMERIC data types. (thanks to Volkan Ceylan).
# Delphi 2005 for win32 compatibility.
# new compiler option: "HAVE_SYNEDIT", if you don't want to use synedit, desactivate this option in
# Firebird 2 compatibility.
# Again faster :)

Compatibility with previous version
# In previous version of TJvUIBBackUp & TJvUIBRestore you need to implement the OnVerbose event to wait for the end of the operation. Now you also have to set the new "verbose" property to true.
# If you use the dataset with persistent BCD fields you have to regenerate them !!!

JVCL 3 RC1 is out!

JVCL 3 Release Candidate 1 is out. It is available at SourceForge. We encourage users to use it and let us know about any bugs in Mantis after having registered a user name.

Monday, January 10, 2005

Firebird .NET connection string

Connection string for connecting to Firebird in .NET applications:

“User=SYSDBA;Password=masterkey; Database=SampleDatabase.fdb; DataSource=localhost; Port=3050;Dialect=3;Charset=NONE;Role=; Connection lifetime=15;Pooling=true;MinPoolSize=0;MaxPoolSize=50;Packet Size=8192;ServerType=0″

Database connection strings

Firebird unable to connect to local loopback server

Firebird tip From the FAQ

On Windows XP (SP2), when I disconnect the network cable, my local programs are unable to connect to the local loopback server ( Localhost). Is there something I have to set in the Firebird configuration?

No, it’s a “feature” of WinXP called DHCP Media Sense, that automatically disables the TCP/IP stack whenever there is no network connection. Switching it off requires adding a key to the Windows Registry. Open the Registry Editor and locate the folder HKEY_LOCAL_MACHINESystemCurrentControlSetServicesTcpipParameters. Add a new DWORD key named DisableDHCPMediaSense with a value of 1. To re-enable Media Sense, change the value to 0.

Getting started with Firebird

This guide is an introduction for the complete newcomer to a few essentials for getting off to a quick start with a Firebird binary kit. For the fine details of configuring and running your server and tuning your installation, please refer to Chapters 4-6 of the Using Firebird manual, distributed on the IBPhoenix CD. The Firebird Quick Start Guide started life as Chapter 1 of the Using Firebird manual, sold on CD by IBPhoenix. Later it was published separately on the Internet. In June 2004, IBPhoenix donated the guide to the Firebird Project.

Start reading the complete guide.

Connecting to Firebird with C#

 using System;

using System.Data;
using FirebirdSql.Data.Firebird;

public class Test
public static void Main(string[] args)
string connectionString =
"User=SYSDBA;" +
"Password=masterkey;" +
"Dialect=3;" +

IDbConnection dbcon = new FbConnection(connectionString);
IDbCommand dbcmd = dbcon.CreateCommand();
string sql = "SELECT * FROM employee";
dbcmd.CommandText = sql;
IDataReader reader = dbcmd.ExecuteReader();
while(reader.Read()) {
object dataValue = reader.GetValue(0);
string sValue = dataValue.ToString();
Console.WriteLine("Value: " + sValue);
// clean up
reader = null;
dbcmd = null;
dbcon = null;

Building Firebird 1.5.x on MacOSX

This page is an extract from a larger HOWTO entitled Firebird Relational Database on MacOSX .
These sections are posted here in the hope that someone can make immediate use of the info....

XML *IN* Firebird - question

Lester Caine is asking on Firebird-Architects :

The job for the new year is to make a better interface to the XML
schemas that I am being asked to process. Having already established
that we do not want to store raw data as an unprocessed flat file with
all the XML tags in place, the obvious next question is "How should we
store it".

I think the discussion here should be on a 'standard' way of processing
any XML schema such that we can map the information into additional XML$
system tables and be able to rebuild the schema from that. (*NOT* part
of the engine just yet , but perhaps something for FB6 or 7 ). This
would then provide a basis on which to build the data that goes with the
schema, while at the same time making it searchable in a relational way.

As a starting point, I am looking at genealogical data. I have a 2000+
grid of CAINE/HUM PHRIES family history in a GEDCOM format, which I
would like to convert to XML. Both are flat file with tags formats, so
the basic conversion is simple, but there is no agreement on an XML
schema yet for the data, so I am looking at a data model to store the
raw data in Firebird, which can then be extracted in which ever way the
final XML goes. *THAT* is when I realised that the architecture of how
to do it is much more important than the XML.

So the first element of the jigsaw, is probably a table of elements,
with a tree structure describing the links to source elements, and
fields for storing the format and pattern information. This should
perhaps be something that the 'XML Binary Characterisation Working
Group' should be looking into as part of the standard, but they seem to
be having trouble deciding who pays for the catering next time they meet ;)

So am I alone here, or am I on the right track. I am having fun at the
moment with the simple matter of managing locations in the genealogical
data. Every event has a location, but there is no means of populating
that location from a location table. *THAT* seems to me what is
fundamentally wrong with XML, or have I just missed the trick of how to
do it?

Lester Caine

Anyone still thinks we don't need 38-digit arithmetics?

it started as an problem description on firebird-devel

"Marco Kregar" wrote:

> V1 DECIMAL(18,4),
> V2 DECIMAL(18,4),
> V3 DECIMAL(18,4)
> );
> INSERT INTO TEST (V1, V2, V3) VALUES (10000000, 1, 1);
> The select statement generate an unespected INTEGER OVERFLOW

This is by design. The resulting scale will be 4 + 4 + 4 = 12, to avoid any
precision loss. Since the maximum precision for NUMERIC is 18, it means that
only 6 decimal digits are allowed for the integral part of the result. Your
10M value overflows this limit.

Anyone still thinks we don't need 38-digit arithmetics? ;-)


Preparing for v2.0 Alpha

quote from devel list (Dimitry) :

"I've just committed the updated version of WhatsNew. Everyone who did some
development please review this document and extend it where you feel it's
necessary. I'd also expect some features to be documented in the README
format under the /doc directory in HEAD. This documentation effort of us
will significantly help Helen to create the first RelNotes draft.

If anyone has any urgent active work in progress, please let us know. I'm
going to update the version string tomorrow and hopefully tag the tree in
one week. If there's something I missed, feel free to remind.


Firebird database readies SMP release

Firebird database readies SMP release by Ingrid Marson on ZDNet UK.

Firebird is mentioned in the PHP Solutions-Magazine

Firebird is mentioned in the PHP Solutions-Magazine, a multi-language web-builders' periodical that's distributed across Europe and the Americas.

New version of Advanced Data Generator Version 1.2.6

Upscene announce a new version of Advanced Data Generator Version 1.2.6. A fast test-data generator tool that comes with a library of real-life data, many filling options, presets etc. More information and a 30-day trial version is available at

Sunday, January 02, 2005

"Best Database Poll" - by

Another "Best Database Poll" - this one by This is the poll that we lost last year to MySQL by one vote. You have to register to vote (quick, free) and, after voting, you won't see the results graph again until the poll ends.

Saturday, January 01, 2005

Happy new year!

I would like to take this opportunity to wish all of Firebird users and developers a happy new year.