RELEASE NOTES for IBO Version 4.x

8/25/2007 Sub-Release 4.8 Build 7 (Beta)

I changed the order of the firing of the events in the TIB_Datasource component such that the associated TIB_DataLinks events fire prior to the events published on the TIB_Datasource. It's not likely this will break anything but it is possible that it could. I made this change because it was discovered the KeyLinks relationships were not properly executed at the time the TIB_Datasource.OnDataChange event was fired. With this change, the KeyLinks relationship will all be fully executed and consistent.

I fixed a bug having to do with extra long VARCHAR columns and TDataset. These are assigned to the TMemoField type and when I recently enhanced it with UTF8 character set support I failed to make it respect the null indicator properly. It was not clearing out the previous records value when scrolled to a record that had a NULL value. Thus, it made the record with NULL appear to have the previous record's value. This is a very bad bug and everyone using this part of IBO should apply this sub-release.

I fixed a bug to do with the parsing of TIB_Script statements. If the statement terminator was set to !! and then used right after the END like this END!! it failed to detect it as terminating the end of the statement. It required as a workaround to put END !! with a space between them. I fixed it so that it is not necessary to put a space prior to the terminator characters.

I fixed a bug in TIBOBaseTable when mixing together setting a range with SetRange() and changing the value of IndexName (or IndexFieldNames). This caused the internal query to get confused about what columns were participating in the range. What it does now is if you change the IndexName (or IndexFieldNames) property TIBOBaseTable will automatically cancel the range if it existed. Thus, after changing the IndexName property it will be necessary to call SetRange() again to establish a range operation. I am considering allowing a new method that will allow SetRange() to also include a new IndexName to be associated with it. The reason is, this will allow the internal query to be impacted once and effectively not cancel the range when changing the index but just immediately use the new range values provided. Please let me know if this would be of value and I'll try and implement it.

I added a public property to the TIB_Statement class called TreatSingletonEmptySetAsEof in order to avoid the exception that is normally raised when this condition occurs. This new property is false by default such that the previous behavior is retained. Unless this property is set to true in your code there will be no change in behavior. What happens if it is set to true and a query is executed that returns no rows is it changes the error code from isc_stream_eof ("attempting to read past the end of the stream") to the error code of 100 which is simply the normal Eof code. Thus, it clears the output buffers and marks the Fields output row having a RowState of rsNone. Active remains false and if it was Active it will be set to false. The AfterExecute event will still be fired as well. Checking if the RowState is rsNone or if Active is true will distinguish between actually having a record returned or not. The StateChange and DataChange events will also be fired as usual.

8/8/2007 Sub-Release 4.8 Build 6

I adjusted the IB_Constants.INC file to exclude the error message message header so that it could be back in the body of the unit and be translated.

In IB_Constants-tr.pas:

{ Cagatay Tengiz <cagatay@tengiz.net> }

{ 06-Aug-2007 }

{ Modification of file to be compatible with version 4.8.5 }

{ Added new constant string. }

I added an extra check for whether the fetching of rows was aborted or not inside the code that performs a Locate(). Gunther Nau reported a case where if one of his users cancelled fetching that the program fell into an infinite loop. While I could not duplicate it myself, Gunther sent me the place in code where it was stuck and that's where I put the added check.

I modified the TIB_Column.SQLTypeSource property to include a parameter telling whether just the base data type only is wanted. Along with this I fixed a bug where TIB_StoredProc was added in the name of the stored procedure with a period as a prefix to the parameter names when there was already a prefix with a period specified. This resulted in a corrupted parameter name with multiple prefixes.

I cleaned some hard paths out of the Code Gear RAD Suite 5.0 runtime package project source file.

8/3/2007 Sub-Release 4.8 Build 5

Per Paul Hope's request, I made the TIB_Grid.VisibleGridRows virtual.

function VisibleGridRows: longint; virtual;

I added the following properties to TIB_Grid so that the programmer can make use of them.

{: Access to the value of an internal property.}

property WasDblClick: boolean read FWasDblClick;

{: Access to the value of an internal property.}

property MouseIsDown: boolean read FMouseIsDown;

{: Access to the value of an internal property.}

property MouseWasMoved: boolean read FMouseWasMoved;

I also included a fix so that the mousewheel work in the TIB_CtrlGrid.

The fix was given by yukio makino [mailto:makino@piconet.jp].

I updated the language IB_Constants-XX.pas units. There is a new string in there that should be translated. I am still waiting for volunteer efforts to fill this in. I moved the non-translatable constants out of the IB_Constants.pas unit file and put them in an include file called IB_Constants.INC so that these will not be redundantly maintained in all the separate language constants units.

I added the capability to make grid cells in the Browse form of IB_SQL hyper linked to open a child windo that has data from another table that links with the data being browsed. This new feature is available by right clicking on a column and then choose the "Link Column As Foreigh Key" menu selection and you will be presented with a dialog that lets you put in the table you want to reference and in the list below you put in what columns in the dataset you are browsing link to what columns in the table being referenced. If it is done wrong then there will be silent behavior. It only works when you make a valid entry. This can also be used to override the existing behavior to try and link tables together using the foreign key information from the metadata. Also in IB_SQL Browse, it was also possible to accidently delete in the lookup list of tables. I set this to read-only to avoid this problem. I noticed that in the IB_SQL Source view of tables that the actions for foreign keys was showing the action in double quotes, which is invalid SQL. I fixed it so that valid SQL will be generated in that pane. Also, I noticed the IB_Connection.FieldsXXXX properties were not being streamed properly when using IB_SQL in stand alone mode. It worked fine as the component editor for TIB_Connection.

I fixed a problem with the TIB_DatasetBar where it wasn't properly working with statements that don't involve a dataset but instead require the ExecSQL method to be called. I was detecting the statement type and changing the glyphs so that it would be more intuitive as to what actions are available. One of the glyphs was not appearing as it should and the hint was not being set as it should.

Thanks to Thomas Steinmaurer I fixed the bug introduced in the past version having to do with retrieving schema cache related information. The error was something like this:

Internal SchemaCache ERRCODE: 335544374 (D:\Programme\Borland\Addon\ibo\IB_Components.pas, Zeile 14518)

It happened when there was an execute procedure with input parameters named differently than as stored in the database when it was created. It was also necessary to have the option to set column attributes based on the SQLType for this bug to bite. I don't often use this feature so my testing didn't catch this.

I modified the behavior of the TIB_StringList object. Nearly everything in IBO that is a string uses this so this is a potentially widespread impact. I am making this change because the impact should merely eliminate ambiguity that is unnecessary. What I noticed is when a link entry was created in the stringlist is if the name side of the link was a TABLE.COL (fully qualified) that when it was stored it would drop the TABLE. prefix and just make the entry with COL=<info>. This actually caused me some grief because this is not intended behavior. It just happens to work because it will still link up with all that it would have previously. The problem is only obvious when you need to store something and have it retain the table prefix to the link name. I anticipate this should not have any negative impact on any applications unless it is specifically depending on the prefix getting dropped. I rather doubt it.

I changed the default setting of internally created transaction objects to announce focus so that it is possible to turn on the receive focus capability of the transaction bar and have access to controling the transactions inside the datasets that are not assigned to one of their own or associated with a connection's default transaction. If you are using the announcement of focus capabilities for transactions then this could impact your application.

I fixed another parsing bug that showed up when there were two very complicated select procedures with input parameters and they were left joined. Everything executed fine but IBO was not properly parsing the RelAliasName for the columns. This likely only affected things if the dataset was being used for updates or in a master-detail relationship at the same time.

I changed the C++ Builder intermediate directory to use $(BCB)\projects\lib instead of $(BCB)\inter. Some versions were using one and some versions using the other and so I decided to make things consistent. The automated installer will insure that this directory exists so if you install them manually please make sure to create this directory before building the packages. I also realized I had not included the packages for the Web Snap extensions for C++ Builder 6.

I changed the installer to use a consistent location for the design-time packages. It will now use a subdirectory just below the sources where IBO is installed. Run-time and Run-time/Design-time packages will continue to be placed in the Windows\System32 directory.

I added an extra check for callback fetching handling of the Locate() method to help make it work more smoothe. There was one case where records were being fetched in without the callbacks being issued and the user having an opportunity to cancel the operation. I added a comment on how to use the FetchingAbortedGen property so that its possible to tell if an operation was aborted with accuracy.

7/24/2007 Sub-Release 4.8 Build 4

I fixed a bug in the IB_Monitor component. There was a nil pointer causing an access violation because Firebird 1.5 doesn't implement the DLL export 'fb_interpret' and IBO assumed that it did.

I fixed the installation for D2007. [ 8/3/2007 NOTE: There are some people who noticed not all packages being installed. ]

I nearly rewrote the button bar controls in order to make them have uniform features and to remove a problem where resource efficiency was introduced that caused some problems with other versions of Delphi. It is now possible to change the order of the buttons in code by populating an array with the button type in the order desired. Please see the ButtonsOrder[] array property for more details.

7/23/2007 Sub-Release 4.8 Beta 3

I enhanced the parser to properly recognize the case of CREATE OR ALTER. I also fixed a couple more spots in the parser. I had a few more places where I was using case sensitive comparisons that should be case insensitive.

I added UTF8 character set transliteration support for long VARCHAR and CHAR columns that TDataset decides to handle using a TMemoField instead of a TStringField. I have yet to finish UTF8 transliteration support for BLOB MEMO columns.

Added UTF8 to the CharSet pick list on the Connection tab of the IB_SQL tool and TIB_Connection component editor.

I made it so that IB_SQL will properly handle default values on input parameters of stored procedures when the Edit button is selected in the Browse form.

I made some improvements to the handling of RequestLive datasets with TIB_Cursor when doing cursor based updates. It is now possible to process edits that were not allowed previously. There are some bugs in Firebird surrounding cursor based updates so it is possible the server will return an error in some cases that it shouldn't.

When using TIB_StoredProc the input parameters will now be in the format of PROCNAME.PARAMNAME instead of just PARAMNAME. This way I can quickly determine the name of the stored proceudre in use.

I made the ParamCheck and ParamChar properties published for the TIB_Cursor component. I also added a Params checkbox to the component editor for the TIB_Cursor component.

I fixed a bug having to do with a custom master-detail arrangement that is managed using Filter and OnFilterRecord in combination with CachedUpdates being set to true. There was a case when refreshing the detail dataset it was not properly applying the OnFilterRecord logic when deciding if cached insert records should be included in the active buffer for the detail dataset or not.

I added a new TDataset based sample application called Filters. It's purpose is to demonstrate how to mix them with CachedUpdates as well as to facilitate a manually programmed master detail relationship using filtering instead of parameters. This includes filtering that is resolved on the server as well as filtering that is performed on the buffers on the client. This includes processing of the cached inserts in the buffers as well.

I enhanced the Samples application management of default server and database path information. It will tolerate the base directory moving around better now.

I fixed a bug in the handling of macros that was introduced in the last beta version.

I put an improvement in the Company sample application that gives an excellent demonstration of lookup combo controls embedded in the TIB_Grid and to have the sorting work nice and clean when using the description from lookup tables.

I fixed a bug in the IB_RPL application. There was a problem in the handline of BLOB columns during setup and loading of a replication index. I also needed to add a TIB_SessionProps component so that it would provide default handling for the passive tasks, such as the event alterter that receives notification when there is something to replicate.

I fixed a bug in the IB_FTS application. On some instances there was an OBJECT IN USE error when loading a full text search index. It seemed more pronounced with FB2 forcing me to figure out what was going on and to resolve it. As it turns out, I needed to make sure all the work of the FTS metadata generation was being done in a single transaction at a time. I had more than one transaction active simultaneously and this seemed to be the root of the problem.

I moved the IBF_Base.pas and IBF_Status.pas units/forms to the Core Runtime package IBO40_CRT.dpk as a result of including the option to profile the component instances when an exception is raised.

7/12/2007 Sub-Release 4.8 Beta 2

I fixed the parser having to do with extracting script statements from script files. I had two places where I was using case sensitive comparisons that should be case insensitive. This caused some statements to get parsed incorrectly having to do with the elimination of the need to use the SET TERM for statements that contain a semicolon in their body.

I fixed a problem with parsing where a statement SELECT FIRST 10 * FROM TABLE was parsing the '*' (asterisk) as the multiply symbol instead of as the filed group symbol.

I fixed a problem with parsing of the FROM clause in SQL SELECT statements. It was not correctly dealing with ON clauses.

I fixed a problem with an infinite loop in the handling of error messages. Thanks to Hans for pointing this out and suggesting a fix.

I enhanced the MacroBegin and MacroEnd properties. Before, whatever was in them was doubled when looking for a macro. This made it impossible to use a two character token where the two characters were different. The two characters would get doubled to 4 characters. I made it now so that only when it is a single character does it look for it doubled. If there is more than one character it will not look for it doubled in the SQL text.

I have added native transliteration for UTF8 character set when the database connection CharSet property is set to UTF8. I don't yet have blob memo support finished, just the regular CHAR and VARCHAR. Keep in mind, long varchar or char columns are handled by TMemoField with TIBODataset so you may want to force these to be a TStringField to avoid this problem. I also will be looking into the use of the TWideStringField and getting it supported better for use with UNICODE and UTF8.

I received a report from a user that had a visual quirk with the DevExpress grid when used with TIBOTable. He said upgrading to DevExpress grid version 5 or above resolved the problem.

I adjusted the logic for determining if a calculated column is readonly or not. By default it will be readonly but it is possible to flag it with the ColumnAttribute of MODIFIABLE so that edits are allowed, but it is the responsibility of the programmer to make sure any edits are resolved to the UpdateSQL mechanisms so that the edits will post to the server.

I added the UTF8 CharSet setting to the property editor picklist.

I fixed the UpdateSQL tab's Generate for table capability to update the EditSQL, InsertSQL and DeleteSQL property settings. It was not properly dealing with the use of relation alias names.

1/27/2007 Sub-Release 4.7 Build 16

IBO version 4.7 is now officially released.

There were a few sample apps that needed some touching up.

I fixed some issues in the IB_Actions that were minor, along with some code clean-up.

I fixed a problem with the IProvider support in the handling if updates for TDataset components.

1/20/2007 Sub-Release 4.7 Beta 15

I fixed a problem having to do with the handling of master-detail processing in conjunction with keylinks relationships. In the Company sample application I noticed that the detail dataset would go into edit state when the master dataset was scrolled. This was not supposed to happen at all. It's only supposed to requery the detail dataset according to the new master record.

I included some changes by Hans in IB_SQL and in the DDL extraction component to support the new trigger types with Firebird.

I fixed/worked around a bug in Firebird that has to do with a bogus error when extracting metadata from a database. Seems the internal buffers get messed up after the first use of the SQLDA/SQLVAR buffers of the query to retreive the constraints information from the system tables. Simply unpreparing the cursor to get this data each time avoids the error. It doesn't run as fast, but at least it runs.

I fixed the parser in a few places that will make filters be parsed correctly when using a negative number and I also fixed the parsing of the IsSQLAggregate() method so that it will take this into proper consideration.

1/13/2007 Sub-Release 4.7 Beta 14

I fixed two bugs that had to do with handling the relation alias name parsing for derived tables and select procedures.

I fixed a bug that wasn't parsing table names with double quotes properly that was introduced in a previous beta release.

I added Hans code to allow the TIBOQuery to look at the where clause and find column relationships between master and detail datasets that don't have the same name but are associated in the where clause and so when inserting a record in the detail dataset it would get the associated value from the master dataset.

I discovered a couple of bugs that I am still working on. It is in the Company sample application. Somehow the mixture of MasterLinks and KeyLinks relationships is causing the detail dataset of the MasterLinks relationship to go into edit state when the master dataset scrolls a record. It should not go into edit state, but rather refresh the detail dataset.

1/07/2007 Sub-Release 4.7 Beta 13

(Happy New Year!)

All bugs fixed in this sub-release were a result of new bugs introduced during the beta period.

I included Hans code to show the caret position of the memo controls on the status bar in the component editor forms. This will also affect the IB_SQL tool too.

I fixed a parsing bug that caused the SET TERM in scripts to fail.

I fixed the IB_JPEGImage control so that it will work in the control grid TIB_CtrlGrid.

I published the OnContextPopup event for Delphi 5 and up.

I fixed a problem with the handling of Inserts when an exception was raised when posting and internal flag was set incorrectly in some cases and it would not allow a new data value to be entered and post attempted again.

I fixed the SQL generated by the TIB_LocateCursor if a locate is performed on the server for the case when a column alias is used and it happens to also be a column in the KeyLinks.

12/21/2006 Sub-Release 4.7 Beta 12

I fixed the TIB_Export component to properly clear out previous field names in the DBF file header buffers. What was happening is field names from a previous use were being superimposed in the whitespace of subsequent, shorter, field names.

I included a fix Geoff Worboys provided for the embedding of controls in the IB_Grid more effectively.

I implemented the new Firebird fb_interpret() export in order to avoid potential buffer overruns.

I fixed the TIB_JpegImage control so that it can be used on the TIB_CtrlGrid control.

I publised the OnContextPopup event for the visual controls.

I fixed the reporting of errors with the EIBO_ISCError exception object. I also added an indicator that the error message has been truncated with a (...) notation at the end. To get all the information from the exception object you have to examine all the other properties of it or just call the ShowDialog method.

I fixed the use of IBO with dataset providers for using TClientDatasets with IBO. There were a couple of problems when using dataset fields (kind of like master-detail) and updates.

I fixed the disorganized use of TabOrder in the controls on the TIB_SearchPanel.

I found and fixed a spot in the code that was not allowing the default value of 3 for SQLDialect to be apparent in all circumstances.

I fixed a problem with using a column alias on a column that is part of the KeyLinks columns when the Locate() method is called and an internal query needs to be constructed the alias name caused this to fail. I have now made it so that you can use alias names with columns in the KeyLinks and IBO will figure it all out automatically.

I included support so that IBO will recognize and not choke when using a query against a derived table (new feature in Firebird 2.0).

I fixed some parsing errors having to do with round parenthesis when not skipping them.

I made it so that when using the browse form in IB_SQL that you can copy values from a row to the clipboard and then you can edit those value entries, and even get rid of some of them, and then apply those values from out of the clipboard back to the row. I made the primary key columns appear dark green/olive and I made it so that foreign keys (straight forward ones) can be clicked on via a hyperlink and a popup window will appear with all the values from the record it references. The value NULL is indicated in a softer color so it is easier to distinguish it as NULL instead of a text value.

I added support for the STARTS and STARTS WITH clause in the filter string.

I added some more properties to the TIB_Query component editor on the tab where it is dealing with updates.

12/02/2006 Sub-Release 4.7 Beta 11

I enhanced the performance of acquiring various values for the TIB_Column objects. In order to know if it is participating in a primary key, foreign key, etc. each time the property was read there was a string-based lookup performed in the schema cache. Now, the value is only looked up once and cached. This was because of using this information in the cell coloring of the grid in the IBF_Browse form that is used in the IB_SQL tool and the utility bar as well as the component editors.

I made various improvements to the browse tool in IB_SQL. It is now possible to see foreign keys (single column only) hyperlinked in the grid so that when clicked on you get a popup query window showing the entire record of the table the foreign key references. I also enahnced the coloring a little bit to improve the readability. (NULL) text has been softened to silver and primary key column are in olive.

I failed to take into consideration the CASE ... END statement when parsing statements in scripts. It now handles them properly.

I fixed a bug in the TIB_StatementGrid that prevented new parameter values assigned directly to an input parameter to become shown in the grid. This caused values assigned to the parameter directly to be overwritten by the non-updated value in the grid.

I added some additional properties to the IBF_Query form that is used in IB_SQL and as a component editor. DML Caching flags and a couple others to do with SearchedDeletes, SearchedEdits, etc.

I fixed some issues having to do with provider support for the TDataset based query. I wasn't handling updates accurately because the values were being sent in a parameters object where all the TParam instances were of ParamType of ptUnknown. I had to set them to ptInput and I had to give them their appropriate names. Now updates are handled correctly via provider support in IBO. There was also a problem with how the literal was being sent. It was quoting identifiers with single quotes which is totally wrong. I made it so that it would quote identifiers with a double quote only for dialect 3 and higher.

11/28/2006 Sub-Release 4.7 Beta 9 & 10

I cleaned up the problems with building the C++ Builder version for BDS 4.0 (Delphi 2006). There was a problem with the compiler directives because with this version of Delphi the packages are built for both at the same time. In order to make everything work I had to remove a feature that C++ Builder did not like. It wasn't a big deal. I was trying to use properties that were indexed by an enumerated type. I simply changed to an integer and made constants for each enumerated value. There were no published or streamed properties involved so there will be no impact to existing applications. This also led to the cleanup of the compiler directives in general. I removed the IBO4_BETA stuff because it was only for the purpose of moving from IBO 3.6 to IBO 4.6.

I have modified the FullFieldName property of TIB_Column in its behavior. It used to include the SQLName if there was a RelName value for the column. However, with the addition of the concept of relation aliases and encorporating them into how columns are referenced I realized I have two different ways to reference a fully qualified field. Thus, I have divided it into two separate properties. FullFieldName and FullSQLName. FullFieldName will contain the relation alias and the column alias whereas the FullSQLName will contain the actual relation name and the actual column name. In most cases these are the same, but this is how I have chosen to separate the logic. Also, when doing value binding with the stringlist based properties, priority will first be given to matches on the relation alias and column alias, if there is no match there then it will attempt to match on the actual relation name and column name of the underlying table. I realize this could be problematic and lead to potential bleeding of values between multiple columns, but with care all these problems can be avoided by providing specific values for everything that has an alias.

While I've been deep into the parsing routines, I've started laying the groudwork to deal with UNION statements better.

I fixed a bug where the relation alias is not being used properly when KeyLinks are autodefined. If there is a relation alias in use then this should be used in the KeyLinks, MasterLinks, etc. properties as well.

I fixed a bug in the logic surrounding posting records. It was possible for an exception to take place after the record had been successfully submitted to the server, which made IBO think that nothing had posted. The case that I discovered simply was to do with the BufferSyncFlags having an exception raised when it was refreshing the buffer after the post. In the case of an exception here, the fact that the record was inserted should be reflected by going to browse state. It will now go to the proper state and still raise whatever exception happened.

I included some additional properties in the TIB_Query editor on the UpdateSQL tab. I also added the ability to manipulate the stringlist based properties at the TIB_Connection level.

I included the fix so that the TIB_Grid will respond to the context sensitive help coming from clicking the question mark on the upper right of the form and then clicking on the grid.

11/24/2006 Sub-Release 4.7 Beta 8

I updated the various button bar controls so that when using custom glyphs it will figure out the num of glyphs based on the ration of its height compared to the width. It will set it to either 1 or 2 automatically. Thus, people can provide one or two glyphs depending on the size of the single image associated to the button.

I added a new column type for TIBODataset called TIBOLargeInt. The reason I did this was to override its SetVariant() setter method so that instead of raising an exception it would go ahead and actually store the value. Just because variants don't have a native 64 bit integer, doesn't mean they cannot carry information that can properly be translated to a 64 bit integer value.

I put in a fix to compensate for TParams.ParseSQL deficiency to handle a statement with special characters in it. For some reason, it failed to add a TParam when it should have. I check for a missing parameter and put it in so that we avoid a missing parameter error later on.

I added the file types for InterBase 7 (*.ib) and Firebird SQL (*.fdb) to the IB_SQL tool's open file filter dialog.

I created a new design-time propery editor for the TIB_LookupCombo.DisplayField property. I did this so that it would not include the relation alias name or the relation name. In the future I will finish it such that it will only display the columns that are participating in the KeyLinks or KeyDescLinks relationship.

I merged in the donated enhancement to the TIB_Export component to SkipHiddenFields.

I completed some fairly extensive revisions to my parsing routines and while I was at it I made it possible to execute scripts in the TIB_Script component without having to use the SET TERM mechanism to avoid parsing errors when using a semicolon as a statement terminator and having semicolons in the stored procedure and trigger language.

I added to the TIB_Database component the ExecSQL() method which will allow a statement to be directly executed against the database using its current default transaction. The transaction will be activated as a result of this call since it is assumed it will be to effect some kind of change on the server.

I made some fairly involved revisions to the handling of cached updates in conjunction with using master-detail relationships. There are cases where it is possible to end up with orphaned cached updates and I am now making it so that orphaned cached updates will be silently purged from the buffers. I also do what I can to proactively avoid creating orphaned cached updates. For example, if you are inserting a master record and also inserting detail records, if you change the value of a linking column in the master record it will propagate that change to all the inserted records in the detail dataset.

I revised a spot in my code where I roll over a counter by catching an exception with an exception handler. I recall receiving feedback that this is problematic for some people's debugging efforts to have exceptions raised even if they are handled. I simply changed the logic to that it will not need any exception handling.

I added code that will keep the events assigned to the TIB_Column instances consistent between the Fields columns and the BufferFields columns. Also, when assigning values between TIB_Column instances it will compensate for the OnGetText and OnSetText alterations such that the value passed will be resolved to its value for storage purposes rather than for display purposes. Thus, it isn't advisable to use the OnGetText and OnSetText logic as a means of trying to manipulate values in order to establish a data relationship. This change has the potential of affecting existing applications that use these events.

I was getting some very strange behaviors in the KeyLinks lookup relationship when I discovered that somehow I had stale pointers in a list of column object references used for optimized column referencing. I discovered and fixed that was not fully invalidating all of my pointers in the place designed for that purpose. This was a result of changing some other unrelated things around such that that this problem now became evident. It was possible that the pointers were being properly maintained prior to these inadvertant results because the resulting problem was very easy to see.

11/23/2006 Sub-Release 4.7 Beta 5, 6 & 7

I changed the logic of how a request to return a record count is handled. The first thing I did was allow it to fire the event OnGetRecordCount if it is assigned. Before I would only call the event if the buffers were not already fully populated with the records from the server. Also, if the query was an aggregate or some other complicated query that I cannot figure out by simply fetching all rows I will now raise an exception that the record count cannot be obtained. This will happen if you are in search mode and you request the record count of a query that is too difficult or impossible to parse together a statement to get that count from the server. NOTE: With the advent of the EXECUTE BLOCK statement capabilities, I will in the near future allow the record count to be obtained by placing the query inside of it and executing it and then having it count the resulting records and return that. Keep in mind, this is a very poor client server mechanism and it should only be used sparingly. Still, even though inefficient, it's nice to have the functionality there when we need it.

I improved the logic of dealing with column types such that assumptions won't be made based on the SQLScale value. There was confusion between numeric types and blob types because blobs are starting to make use of the storage in SQLScale for its own purposes.

I fixed the dialog where exceptions are displayed so that it will properly get the line and column information and show the cursor in the proper position where the error is at.

I made it so that the row state of the TIB_Row that handle input parameters will keep the row state either rsUnmodified or rsModified. There were some problems when it would remain set at rsNone and there is no need for the row state of rsNone to be used when working with input parameters.

I also made it so that text trimming rules will be applied to parameters.

I fixed the TIB_Grid so that the values of an insert being processed will not be lost in a rare case where if the up arrow is pressed it will revert the values in the row buffer to null or blank.

I fixed some additional points where information was being put into the schema cache and other string settings that expected them to have special characters escaped but they were not being escaped and thus when this information was interpreted it was getting garbled if there was a # in any of the field names.

I significantly revised the TIB_StatementGrid control so that column widths are maintained according to the widths of the data being stored. I also revised the display of the column information to always show the class name and to always show the SQL definition of the column's datatype. It will also show the domain name if requested, surrounded by square brackets.

11/22/2006 Sub-Release 4.7 Beta 2, 3 & 4

I went through all the sample apps and updated them according to the needed changes below where the relation alias naming is concerned. They are all able to be used again without errors.

I noticed that Firebird 2.x does not allow a database handle to be shared from the BDE with IBO. I tried to use the Events sample app which uses this feature and it failed. I also had to fix the TestScan application as well.

I significantly improved the Survey sample application. There is a lot less code to do the same and more of what it was doing before. This is a good example of how to use drag and drop with TIB_Grid and how to do some fairly tricky data manipulations to manually set the order of records. It is also an excellent demonstration of the automatic synchronization of buffers between datasets as changes are made.

I fixed numerous aspects having to do with using the relation alias name in the SQL parsed together and sent to the server. IBO puts together many SQL statements on your behalf that need to know the relaion alias name in order to produce statements that properly reflect what the server will accept. This had to do with establishing that the KeyRelation property will actually store the relaion alias name if one is being used. I had a number of places to touch up as a result of this. One of them in particular had to do with figuring out how to transfer the RelAliasName value to the other column objects. Normally all the basic column information is stored in the XSQLVAR structure and I would just read it out of the buffers and transfer it by copying the buffers. However, there isn't a place in the buffers for the relation alias so I had to figure out an alternative method. This was particularly difficut for the KeyFields columns. Things like whether a column can be updated or if it is how it is posted to the server, whether a column can be searched against, etc. were being affected by this.

I fixed a bug in the logic that maintains a stringlist of the actual text (minus comments) used in the select list of a query so that I can parse together statements that rely on knowing what SQL went into the creation of an output column in a statement. This information is stored with various controls characters escaped. There are multiple places where this string list is modified and in the past I made the assumption I could add straight field names to it since they wouldn't have characters in them that would need to be escaped. However, since the addition of quoted identifiers I needed to go ahead and escape everything that goes into this stringlist so that when it is read from the information comes back correctly. There was only a problem if you were using the '#' character in your field names.

I added an OnMultiSelect event notification of the ToggleSelected method of TIB_BDataset (TIB_Query) is called.

I improved the internal handling of the GetSeekCursor so that a more technically correct understanding of an error will be returned in case of an exception. It was giving an invalid statement handle error before but it wasn't known what the problem that caused it was. Now it will return the exception of what was causing the statement handle to be invalid.

I put in a fix for function TIBODataset.GetIndexField( Index: integer ): TField; such that it will use the TIB_Column.BDEFieldName instead of TIB_Column.FieldName when doing a TDataset.FindField() call since the fields were created based on what the BDEFieldName returned.

I fixed TIBODataset handling of parameter values when using the AssignWithSQLSearch() method. It was losing the parameter values in the transfer such that the new query would not draw any records due to no input parameter values being transferred.

I fixed the problem where blank exception messages were being returned in some situations.

11/16/2006 Sub-Release 4.7 Beta 1

All properties that store snippets of text that may end up being parsed into a SELECT statement sent to the server should use the relation alias name instead of the relation name if a relation alias is being used. This includes the KeyLinks, MasterLinks, JoinLinks, GeneratorLinks, MasterParamLinks, etc. properties. While some things may still work when leaving the relation name in when using a relation alias name, it is advisable to change to use the alias name. It is very likely that existing applications may need to check these settings and update them to reflect the relation alias setting or else they will have exceptions raised.

I fixed a bug in function TIB_Column.GetAsExtended: extended; so that it would handle INT_64 numeric type natively.

I enhanced function TIB_Row.GetByName( AFieldName: string; var AIB_Field: TIB_Column ): boolean; so that it would work with the RelAliasName better.

I change the SQLDialect property to default to 3 instead of 1. This may affect apps as this value was not stored in the DFM if it was 1 but upon upgrading it will become 3 because of the new default. This probably won't affect much since as soon as you connect to a database the SQLDialect changes to reflect whatever dialact the database actually is. This change of default value should only affect situations where you are creating a new database and you have not explicitly set the dialect to what you want. I have made it so that the value will always be stored in the DFM so that I can change the default value again without causing an unexpected change of value in the future.

I added the following to the TIB_ConnectCharacteristics record:

dbPlatform: string;

dbBuildType: string;

dbBuildInfo: string;

dbServer_Major_Version:integer;

dbServer_Minor_Version:integer;

dbServer_Release:integer;

dbServer_Build:integer;

I fixed a bug in the TIBOBaseTable.CreateTable; method. It was not properly distinguishing between MEMO and BINARY blob types. It still doesn't allow for specifying other blob sub types other than 1 for text and 0 for binary.

I fixed a bug in function TIBODataset.GetIndexField( Index: integer ): TField; and function TIBODataset.GetIsIndexField(Field: TField): Boolean; methods so that it will better handle the relation name or relation alias name in the ORDER BY clause.

The statement parser has been enhaced to handle situations where there are two separate words that define a single token. For example, the ORDER BY clause, the FOR UPDATE clause, GROUP BY, etc. This became necessary in order to distinguish the use of the FOR token. The new language feature allowing access to a generator by calling FOR NEXT VALUE needs to be distinguished from the FOR UPDATE clause.

I added a procedure to my parsing library that will take an SQL statement and populate a supplied TStrings object with a list of the relation names in the query with their alias name.

The list will have entries as follows: [RELATION ALIAS NAME]=[RELATION NAME].

If there is no alias then it will return entries as follows: [RELATION NAME]=[RELATION NAME]

procedure GetRelAliasList( const SQL: string; RelAliasList: TStrings );

Included the isc_info_sql_relation_alias = 25; piece of data in the IB_Header.pas file so that this information can be received from the server. IBO will now call the server (Firebird 2.x only) to have the relation alias information returned in the TIB_Column instances. Otherwise, IBO will rely on the parsing of the statement and associating the relation alias with the relation name. Thus, for the time being, it is possible for IBO to get the RelAliasName confused if there is more than one instance of the same table in the statement. In the future I will actually parse the relation alias information of the column out of the select list of the query and properly associate it to avoid this potential problem.

I am making it easier to control how IBO deals with an application needing to yield in order to process messages. I had places in code where calls were directly made to Application.ProcessMessages. However, depending on the circumstances, this could be a very undesirable behavior being forced on the developer. My intentions are to make it so that this will be centrally controlled and easily configurable. I am going to move it to the TIB_Session property where its behavior can be defined once and for all. It will be possible to override the method DoAppCallback and have it do as you please. It will default to the same behavior as before.

This change described below was carried out in all of the button bar controls. For the time being, this may break some applications that use only a single glyph in their custom lglyphs settings. I plan to fix this in such a way that it will either auto-detect your custom image size or to include a property that will allow you to directly configure it.

{------------------------------------------------------------------------------}

{ Salvatore Besso <s.besso@mclink.it> }

{ 21-Jul-2006 }

{ Normalized procedure LoadCustomGlyphs so that it is the same in all }

{ IB....bar.pas files. Made this change because not all bars worked with }

{ custom glyphs }

{------------------------------------------------------------------------------}

I renamed the constant variables in IB_Constants to have a prefix of IBO_ instead of IB_ in order to avoid tokens being the same name as tokens in other libraries. If you have made reference to any of these token in your application code you will need to update your sources in order to compile your application. I provided a file in the main source directory called Constants_IBO.rep that can be opened with GReplace and you can perform these substitutions on your application code and resolve the problem very quickly and easily.

I added the OnDrawFixedCell to the TIB_Grid so that all fixed cells may be enhanced in how they are presented.

7/17/2006 Sub-Release 4.6 Bc

Completed Firebird 2.0 support.

7/11/2006 Sub-Release 4.6 Bb

Touched up parsing of table alias name parsing logic.

7/10/2006 Sub-Release 4.6 Ba

Added in support for EXECUTE BLOCK statement in Firebird version 2.

Added in support for dealing with strict table aliases. More to come.

I fixed an access violation that happened with the component editors if the client library had not been loaded yet.

5/12/2006 Release 4.6 B

Added in Geoff's support for the -- SQL comment so that single line comments can be passed to the server as a part of valid SQL.

Added in Geoff's improved code to handle Stretch and KeepScale on the TIB_Image control.

Removed the ES_MULTILINE Windows Param from the TIB_Currency control.

Added some of Geoff's changes to tidy up the handling of Macro Substitution events for cleaner debugging and more readable code.

Added a check for the import of the API methods when dealing with dbHandleShared and dbHandle property of TIB_Connection. It was possible that API calls were made without the session properly loaded and an access violation would happen.

Added a check for a valid session when TIB_Component.BeginBusy() is called.

Added DOMAIN ColumnAttribute setting so that fields or params can take on the behaviors attributed to a particular domain.

ZLIB dependency was removed for versions of Delphi prior to 7 in order to avoid conflicts with other packages that also used this library in their own way. As a result, the TIB_OleContainer component will no longer be installed automatically. It can be manually installed into its own package as it was before I tried to add this to the standard IBO library.

I modified TIB_Session so that it will automatically put itself first in the creation order of the form or data module is it placed on.

I removed the default aspect from the TimerInterval property of the TIB_Session component so that it would always be stored in the DFM.

I added a published reference to the IB_Session property for the TIB_Connection and TIB_Transaction components so that in the future it will be possible to have a connection/transaction configured to different sessions that is intended to allow for a single application to access data through different client libraries. For example, if it is necessary to use both a Firebird and an InterBase database but each must use its own client, it will be necessary to configure a session components for each client library and then to configure which session the connection/transaction will use. This is still a work in progress. Another aspect that has been affected by this is the binding to the client library has been changed so that it doesn’t happen rights away but on demand. As a result of this, it was necessary to put in checks for the demand and load the client. There were some places where checks were not being made and API calls were being made to methods that had not been imported yet.

There was a problem with the API call to get_database_info. It was interesting that in the old days using a method worked even though it was used incorrectly. Now that Firebird has been worked on and things have been cleaned up I am forced to use the client correctly. Thanks to Ramil for his help in finding and fixing this problem.

I modified the handling of an internal counter so that it would never raise an exception even though it would have been handled. This apparently was causing a problem for people that have programs break on an exception even though it will end up being handled.

I modified the order in which default values are applied to a record when it is being inserted. In some cases there are columns that get their values from a master-detail relationship instead of from a generator. By getting values from a generator first and then replacing them with values from a master-detail relationship resulted in generator values being needlessly used.

When using CachedUpdates there is a flag on the dataset called UpdatesPending but it is only true after a cached update is posted to the buffers. If a dataset is using cached updates and is merely in an edit state then UpdatesPending will not show as true. As a result of this the transaction level flag CachedUpdatesPendingCount was not properly reflecting datasets in an edit state that could result in a cached update being generated. In short, I consider a dataset using cached updates in an edit state to be sufficient to register its condition as pending with this property. It will now do so.

When using Cached Updates and ColorScheme I wasn’t showing the data aware controls with the proper color. I decided it is best to show the record in the color depending on the type of update is pending on the record. So, even though posted from insert state, if the record was inserted it will continue to show the color scheme that it is an inserted record.

There were some circumstances where I wouldn’t perform a locate in the client buffers but instead I just performed the locate on the server using SQL. However, it is possible there could still be a record in the buffer that is no longer on the server so an erroneous result for the given dataset buffered in memory could be obtained. I have made it so that when doing a locate it will always scan the records buffered on the client before attempting to do the locate on the server.

There are some older versions of Delphi that don’t handle the 64 bit integer numerics that well and there were some places in the code that needed some exceptions to be raised where it was simply remaining silent.

All the international translated units were updated.

I moved the TIB_UtilityBar into the package that holds the forms. It was more appropriate there.

I made some improvements to the IBF_Base form that I use as a base class for lots of my own work. It is used extensively in the IB_SQL application as well as many private apps I’ve written. It has a lot of automated transaction context management features that I rely on.

I’ve put a lot of work into cleaning up the package source files for the BCB versions.

1/17/2006 Release 4.6 A

Support for Delphi 2006 for Win32 was added in this release.

The metadata queries needed to be touched up in order to work with the alpha of Firebird version 2.

I removed the reference to the ZLIB library in the Delphi 7 package source file for the visual controls.

Geoff Worboys fixed a bug in the macro substitution routine and also in the replace_string routine. He had some pretty far out cases in a battery of tests but leave it to Geoff to find and fix stuff like this.

I fixed a parsing bug in the TIB_Script component where a trailing byte after a /* ... */ comment was in some cases being ignored if it was a special character like a parenthesis or a bracket. Thanks go to Carlos Cantu for a script with a stored procedure that was able to demonstrate this problem.

Apparently doing a Count query (when accessing RecordCount or QueryRecordCount) with a UNION in your SQL could lead to an exception in some cases. However, apparently in Firebird 2 this query will return an accurate count of records so now the query is allowed.

Input parameters that were of the format "ATableName".ACOLNAME were not being parsed correctly. The period after the quoted table name was being taken as the end of the parameter name but now it will continue to the end of the actual parameter name.

Rade Vojvodic reworked the button bars to line up better and added the ability to show captions in them. He also added BOOLEAN column support to the TIB_Export component.

PrefixRemove property added to the TIB_SearchPanel so that a uniform prefix to your field names can be removed from the labels so that the field labels are more user friendly.

I added a new property to TIB_Connection:

{: This property sets the default behavior of whether or not the length of

strings shall be checked for an overflow of the storage space provided. The

current default behavior is to silently ignore the problem while truncating

the new string to fit in the given storage. If you desire to have an

exception produced instead of this silent truncation then set this property to

false.

<br><br>

Setting the FieldsTrimming property of any column will customize it and this

setting will no longer apply to those columns.}

property DefaultNoLengthCheck: boolean read FDefaultNoLengthCheck

write FDefaultNoLengthCheck

default true;

I addition to this change I also enhanced the FieldsTrimming property to have entries that also specify that the length of the string being stored should be checked and raise an exception if too many characters are being passed in.

I also corrected the sentence trimming such that if there is a period it will allow two space characters to follow it instead of deleting one of them.

I made it so that the Isolation property will always be stored in the DFM. Apparently there was some kind of very unusual bug in Delphi 7 that made it store the setting for Isolation improperly and then a setting other than what was expected would be used in an application at run-time and cause problems.

I enhanced the preservation of parameter values. When certain operations are taking place with a dataset the parameter objects would need to be freed and recreated and the way I was storing and restoring their values was flawed if you had binary data in a string, such as a #0 character. The data would get truncated. Now the values will be preserved as they should and compatibility with the old storage values also remains for backwards compatibility.

I use counters for internal purposes and so I watch for when they roll over and have to be reset. Before I was just catching an exception and then handling it but this causes some hassles for a customer the way they have things setup so I went ahead and put a check for the value reaching the max and am setting it to zero explicitly to avoid any exception at all.

I fixed a bug with the InvalidateRows method. I was internally using -1 as a value to indicate that there wasn't any specific row it was referring to but that all rows were being invalidated. However, due to the horizontal dataset refinement feature, it is possible to have a row number of -1 as a legitimate record and so it is possible there could have been confusion between the two cases.

I fixed another bug where InvalidateRows was not triggering a datachanged notification when the current row is invalidated. This showed up with the DMLCaching when changes are being synchronized with the server and not immediately appearing even though they were refreshed to the buffer of the dataset.

I fixed a bug having to do with cancelling an inserted row and the value that appeared in the AsString property of a field in the OnStateChange event. The value was not properly representative of the new record that was in the buffer once the cancel was complete. It showed null instead of the correct value.

I fixed a bug with cached updates where the internal reference counter for inserted and deleted records was not being kept accurate in all cases. Before, with certain usage patterns, the pending inserts to be applied or pending deletes to be applied showed that there were still cached records to be resolved but in fact they either already had or were already cancelled.

The TIB_ParamEdit control didn't have all the new properties from Delphi 4 and onward published so they are now published for use at design-time.

These are changes in IB_Session.pas:

{ Geoff Worboys <geoff@telesiscomputing.com.au> }

{ 12-Jul-2005 }

{ Changes to allow application to define what client library to use. }

(*

To use the change an application need only do something

like this...

- - - start dpr project file - - -

program

MyProgram;

uses

Forms,

IB_Session, // Must use IB_Session

[...]

function GetFBClientLibName: string;

begin

Result := 'myfbclient.dll';

end;

[...]

begin

// Tell IB_Session where to get the client lib name

IB_GetClientLibNameFunc := GetFBClientLibName;

// then continue with the normal stuff

Application.Initialize;

[...]

end.

- - - end dpr project file - - -

*)

{ }

{ Geoff Worboys <geoff@telesiscomputing.com.au> }

{ 14-Apr-2005 }

{ Changed to try first fbclient.dll, if not found then try gds32.dll. }

{ }

{: This method can be used to force IBO to unload the IB/FB client library.

<br><br>

This should be used with extreme caution. In general this means ensuring that

there are no active connections (or other users of the library functions). Any

IB_Monitor instances should have been disabled. Any call to this function

in a threaded system should be performed within the GlobalCS critical section.

<br><br>

This is a "use at your own risk" function, it may break your application if

used incorrectly.

<br><br>

To force the library to be reopened again after calling this function use the

RevertToOriginalHooks procedure.

<br><br>

Note that, combined with the IB_GetClientLibName function variable, calling

this function and then RevertToOriginalHooks may make it possible to change

from one client library to another without closing the application.

}

procedure UnloadClientLibrary;

{: Allow an application to override the default ib/fb client library name.

<br><br>

When IBO needs to open the Firebird/Interbase client library it will, by

default, try the Firebird client library first, and if not found

will try the Interbase client library.

<br><br>

An application can optionally override the library selection by creating a

function and assigning it to this function variable. If you define a function

and assign it to this variable IBO will first call that function (though this

variable) to obtain the name. If the returned value is blank (zero length)

then IBO will revert to default processing (see above), otherwise IBO will try

to open the specified library name - if it fails IBO will NOT try the default

library names. IBO does not revert to defaults on failure, because such action

may hide real problem and make it difficult to understand what went wrong. }

IB_GetClientLibNameFunc: function: string;

The AcquireOriginalHooks method has been deprecated/removed.

These are changes in IB_Metadata.pas

{ Geoff Worboys <geoff@telesiscomputing.com.au> }

{ 20-Jun-2005 }

{ * Fixed bug in TIB_DDLEntity.GetEntityByName (was not checking for nil). }

{ }

{ Geoff Worboys <geoff@telesiscomputing.com.au> }

{ 15-May-2005 }

{ * Added the "SkipBlr" option to the metadata component. BLR is not used }

{ much anyway (so reading is a waste of time) and more importantly it }

{ seemed to be causing inconsistent engine failures with FB v1.5.2. }

{ So turning it off by default, turn it on if your want to use the }

{ various BLR properties (of triggers, procedures and views). }

{ }

{ Geoff Worboys <geoff@telesiscomputing.com.au> }

{ 13-Apr-2005 }

{ * By Descripter udfs were defined as By Reference. I have tried to }

{ ensure that future changes to parameter mechanisms will generator an }

{ error rather than silently ignore inconsistencies. }

{ }

{ Geoff Worboys <geoff@telesiscomputing.com.au> }

{ 20-Feb-2005 }

{ * UDFs were always being detected as null (checking the wrong column). }

I added the OnMacroSubstitute event to the TDataset based query.

I added an optimization to check for actual parameter changes when a master-detail relationship with the TDataset based datasets takes place. Apparently the detail dataset was being refreshed when it wasn't necessary in some cases.

3/19/2005 Release 4.5 B

I added TIB_OleContainer to the controls that are standard with IBO as well as some enhancements to TIB_JPEGImage that were contributed by Thomas Steinmaurer. An interesting feature of the OleContainer control is it also includes the ability to store it compressed using the ZLIB library.

I fixed a problem where when using macro substitution the method GetSQLIsAggregate was not aware of the result SQL and potentially not catching a case that it should be.

I fixed a potential access violation due to some changes made in the last release optimizing the processing of KeyLinks and MasterLinks relationships.

I fixed a parsing problem in the determination of the search criteria of columns that are based on an inline SELECT statement. The first parenthesis was bumped off when it shouldn't be.

{ Salvatore Besso <s.besso@mclink.it> }

{ 15-Jan-2005 }

{ Completely rewritten TIB_CustomDateTimePicker.SysUpdateData to fix a }

{ problem with field assignment when Kind = dtkTime. Amended with latest }

{ version of original IB_Controls.pas as of version 4.5Ai Eval. To find it }

{ quickly, search for SB comments sorrounded by curly brackets }

{ Rade Vojvodic <rvojvodic@rsdef.org> }

{ 11/25/2004 }

{ TIB_CustomEdit Windows XP Theme enabled. In uses clause added Theme unit}

{ In DrawButton procedure added code to show button according to current }

{ Xp Theme. Added FHot private property to be able to find out if mouse }

{ is over button for hot state of the button. If ellipsis type of button }

{ pushbutton is shown, otherwise (dropdown) button looks like any other }

{ combobox. Added CMMouseEnter and CMMouseLeave for determining Hot state }

{ of the button. }

{ Rade Vojvodic <rvojvodic@rsdef.org> }

{ 11/25/2004 }

{ TIB_CustomRadioGroup changed to be able to look like any other radiogroup}

{ in Windows. Added two more properties }

{ property Caption; }

{ property DisplayLabelAsCaption: Boolean read FDisplayLabelAsCaption }

{ write SetDisplayLabelAsCaption }

{ default false; }

{ If borderStyle property is set to bsNone then TIB_RadioGroup looks like }

{ TRadioGroup from Delphi VCL. Additionaly DisplayLabelAsCaption works }

{ the same way as in TIB_CheckBox. Paint and ArrangeButtons procedures }

{ required minor changes to achieve this. Every change is commented with }

{ //RV?? so it can be easily found. }

I fixed a bug when exporting DBF files there was a case that it wasn't formatting the file header correctly if the field name was right at the maximum length allowable. Now it will handle all allowable field name lengths and not be corrupted or unusable.

I fixed a small problem with the TIB_Ledger control when there were no records in the dataset.

I fixed a problem with the parsing of macro delimiters that were more than one character long.

I fixed a problem with input parameter name parsing where they were double quoted.

A minor adjustment was made to the sizing logic of the auto lable feature to increase consistency.

I fixed a problem with the TIBODataset that had to do with the handling of TField objects that were created by default. It was possible by doing certain dataset interactions that the flag indicating that default fields were created was omitted and then when the dataset was closed it did not destroy the TField objects as it should. I detected what the flaw was and made it safely maintain the correct value so that it would destroy the field objects appropriately.

There was a problem introduced in the last version that made AssignSQLWithSearch() no longer work with input parameters when assigning to a TIBODataset component. I found the problem and restored the expected behavior.

11/30/2004 Sub-Release 4.5 Ai

I fixed a bug in the Italian translation file that caused it to fail to compile and thus fail to install with the installer.

I added a fix provided by Geoff Worboys to the IBF_Status form where it reads through the session information. Under some circumstances it was possible to have an access violation and he put in code to avoid those cases.

I touched up the TIB_Grid to better handle the DecimalSeparator for the Italian keyboard.

11/26/2004 Release 4.5 Ah

I added a bunch more language translations so now the complete list of supported languages is as follows: English, BrazilianPortuguese, PortugueseStd, Russian, German, French, Japanese, Dutch, Serbian, Spanish, Italian, Czech, Norwegian, Polish, Romanian, Turkish and Bulgarian.

Not all of the above translation files are completed 100% and so there are portions of these languages that still have english entries. I'd appreciate it if people would use the BeyondCompare tool (Google it) and compare their language file with the one for English and look for where there are lines the same on both sides, meaning there is still English in their language file, and translate those missing portions. I've also contemplated using BabbleFish or some other translation tool, but I'm assuming most of those wouldn't know programming jargon so well.

I have been cleaning up how properties are stored in the DFM. Transaction Isolation was always storing tiConcurrency even though it was the default for TIB_Transaction.Isolation. Now, it will not store a value if it is the default value (which I'm changing).

I'm changing the default value of TIB_Transaction.Isolation from tiConcurrency to tiCommitted. The reason is two-fold. Most people just getting into client/server database systems don't fully grasp how this kind of transaction works and they don't understand once they start it they are responsible for doing a Commit and if they don't they aren't going to see new record versions and they are also going to stuff up their server keeping track of all the changes to maintain the snapshot view of the data. This is a property setting that should only be used for specific things and with very controlled and responsible usage. Thus, having it as the default value was foolish on my part. Fortunately, the Isolation property has been stored in the DFM regardless of its value so this will not affect any existing applications that already have the isolation property set to whatever value they wanted. Unfortunately this also means those who have foolishly left it at this state will have that perpetuated, but that is a problem whether I make this change or not, so nothing lost by doing what I'm doing.

I have changed the default colors for the dataset colorscheme colors as follows:

FEditingColor := $00AAFFFF; // clLemon // old value: clYellow;

FInsertingColor := $00C0FFC0; // clApple // old value: clLime;

FDeletingColor := $00C8C8FF; // clPink // old value: clRed;

FSearchingColor := $00F0F0C8; // clLtAqua // old value: clAqua;

This should be much more pleasant to look at. Thankyou to Helen for making this suggestion.

I merged in a couple changes to the TIB_Grid to better handle numeric data entry. In the entering of numbers pressing the period or comma will translate to the DecimalSeparator if ThousandSeparator is not set to a comma. There was also a minor adjustment to keep the popuplist from going off the left side of the screen.

I made some additional improvements to the Login functionality. Because I changed when the BeforeConnection event is fired to being after the login form appears instead of before, if you are setting values for login in this event and then expecting them to appear in the login form pre-filled in, this will not happen anymore. Thus, it is necessary to use the OnLogin event to plug in these values instead of the BeforeConnect event. However, when you used the OnLogin event it made it so that you won't have the default login form appear and there wasn't a simple way to have it appear. So, what I did was add a method called ShowLoginForm that can be called from within the OnLogin event. Just be sure to coordinate the LoginAborted parameter value since it will be set for you when calling the ShowLoginAborted method. I also made the DoLoginFailed virtual method more flexible for those who are sub-classing and customizing how this component deals with failed logins. The property LoginAbortedShowMessage property appeared to be done incorrectly as it was inconsistent between is DFM storage default value and what its value was when created. The logic with it seemed to be wrong too so what I did was change it so that it would by default act the same as before fresh off the pallette but have the correct behavior too. You might do well to review what your connections are set to and make sure they are how you want it. Essentially, is all this property does is determine whether you get a silent Abort exception or an EIB_ConnectionError( E_LoginFailed ) exception that would produce a message window the user would have to click to get rid of. Since they already clicked Abort or Cancel, I really doubt they want to see another message about it again to have to click on.

I discovered that somewhere along the way the BDE emulation that translated its settings of tiDirtyRead and tiReadCommitted were both getting translated to my tiConcurrency which is the equivalent of the BDE's tiRepeatableRead isolation setting which is definitely not correct. Hopefully most people were wise and made the corrections necessary due to this improper mapping of property values.

11/25/2004 Release 4.5 Ag

Happy Thanksgiving!

I commented out the Tree Grid stuff since there was too much work to get it into the 4.5 official release. I will continue to work on it and get it into the IBO 5.x major release.

Added Spanish translation.

Fixed bug in TIB_Ledger control that caused a loop to Eof of the dataset to repeat infinitely.

I touched up the saving of properties in the DFM for the TIB_Query component. There were properties that were being stored even though they were their default values. I believe they were left in as stored because I wanted to change the default value in the past but didn't want to affect people's application behavior in doing so. Now its time to go ahead and let it all wash out.

11/23/2004 Release 4.5 Af

I provided support for Delphi 2005 in this version.

I merged in a new property for using hints with Grid titles.

I included some enhancements contributed by Magnus Johansson that allow greater control over login attempts.

I made some methods in TIB_Transaction virtual so that greater control of the AutoCommit property can be realized in sub-class.

11/17/2004 Release 4.5 Ae

I added a new control called TIB_TrackBar. Should be ready for use. In conjunction with this control there are two new ColumnAttributes to use. MINVAL and MAXVAL will automatically setup the bounds of the control appropriately. Otherwise, you will have to set them on the control itself manually.

I'm in the process of adding in a TIB_TreeView control.

Fixed a problem with CharCase in the TIB_IncSearch control.

Fixed a problem with incremental searching when the dataset is sorted in descending order. It flat out didn't work if there were numerous similar items being sorted though. It only didn't work if it was skipping 10 or more rows for internal optimization. Thus, it was only in some cases where it wouldn't work.

Fixed an access violation in TIB_Grid that was introduced with the new tree in grid functionality.

I added a check for environment variables so that if a username, password, database and/or role were not assigned it will pick them up from the environment.

if FConnectedUsername = '' then

FConnectedUsername := IB_Utils.GetEnvVariable( 'ISC_USER' );

if FConnectedPassword = '' then

FConnectedPassword := IB_Utils.GetEnvVariable( 'ISC_PASSWORD' );

if FConnectedSQLRoleName = '' then

FConnectedSQLRoleName := IB_Utils.GetEnvVariable( 'ISC_ROLE' );

if FConnectedDatabase = '' then

FConnectedDatabase := IB_Utils.GetEnvVariable( 'ISC_DATABASE' );

11/13/2004 Release 4.5 Ad

I fixed a problem where a dataset would try and do a RefreshKeys when the connection was in the process of disconnecting. It resulted in an error from the transaction handle not being present when the query tried to open itself up again. Now it simply closes the dataset.

I modified the behavior of the TIB_Dataset.Edit method such that it will ignore it if it is already in dssEdit state. This will avoid the announcement of events that are not necessary since it is already in edit state. I also enhanced the TIB_UpdateBar such that the edit button will be disabled while in edit state.

I added a new control for working with JPEG images. The control is TIB_JPEGImage and it is a subclass of TIB_CustomImage so it is entirely integrated in with all of the searching and datalink features. It is also able to be used in the TIB_CtrlGrid control as well. This was based on portions of the community contribution of Thomas S. and Martin S. Please see the unit file for all the credits.

I fixed a control focusing issue where using a lookup combo control and in the OnCloseUp event you set focus to another control it would pull it back to the lookup combo control. Now it detects if focus was taken elsewhere and does not take it back.

I added the AutoLabel feature to the TIB_RadioGroup control. Not sure why this wasn't done in the first place but I did it and it seems to work just fine.

There have been a fair number of problems with people installing IBO into Delphi 4 so in order to help with this I have made a batch of CFG files to help make sure the package files get compiled into the right area and so that they are on the search path. Doing this will also help reduce the amount of confusion while I develop the components in Delphi 4 and avoid losing my packages when I delete all "junk" files out of the source directory.

I added the capability to use a TStringField to handle an underlying column of type large integer (BIGINT). This is to work around a problem with the TDBLookupCombo control using variants to handle the values, which fails with largeint types.

I added a check to the TField.Origin property so that I don't remove a setting that is put in at design-time.

11/12/2004 Release 4.5 Ac

I finished the work on optimizing dataset to dataset linkage relationships with lists of fields and params that are referenced together. This way instead of repeatedly doing FieldByName() or ParamByName() calls I am able to directly reference column objects in a field map list. This should make interfaces much snappier when using master-detail relationships and lookup combo controls via the key links relationships. Especially if there are a lot of fields in the table/query.

{ Mark Pickersgill <mpickers@iprimus.com.au> }

{ 13-Nov-2004 }

{ Fixed selection behaviour of Field and Column properties as well as }

{ enabling the Apply button when appropriate. }

I also included Mark's enhancements to the AutoLabel feature of IBO visual controls. It is possible that existing behavior's could be impacted so it is wise to test your applications for any glitches in appearance or behavior. His changes also include some new capabilities that are mentioned in the new documentation he has provided in the source code.

11/6/2004 Release 4.5 Ab

I added the ability to save the contents of a BLOB column to a disk file in the IB_SQL FRM_Browse form.

I pulled most of the include files from the IB_Controls.pas unit back into it so it is in one file.

I fixed some additional issues with Params when using ClientDatasets.

I fixed some parsing problems to do with FIRST and SKIP features of Firebird.

11/4/2004 Release 4.5 Aa

I'm continuing to add in the code allowing the dataset to act as a treed structure. This is a work in progress.

I enhanced the TIB_StringList component to enforce uniqueness at the IndexName level instead of the whole IndexName and IndexValue pair. Thus, if you have multiple entries that use the same name there is a potential problem now. Ideally there shouldn't be such cases in your code and now this change will prevent that from happening.

When scrolling zero records it is possible to have the current record drop out. There was a little confusion surrounding whether or not the BeforeScroll and AfterScroll events should be triggered if nothing was scrolled to and in fact it was not triggering them. Now I made it intelligent enough to trigger them when the record will change when scrolling zero record places.

Changes in IB_Grid.pas:

{ Jason Wharton <jwharton@ibobjects.com> }

{ 01-Nov-2004 }

{ I made it so that when using the mousewheel and attempting to scroll to }

{ the BOF or EOF row and there were current edits they would get lost due }

{ to a DataChange event being fired off because a scroll to the same row }

{ still considered a scroll, although the BeforeScroll and AfterScroll }

{ events may not be fired off causing the edits to be flused to the buffer.}

The problem with a mouse up event causing a click when it wasn't really a click on the grid has been resolved. A mouse click event won't be registered unless there was also a mouse down event to correspond with it.

When using embedded controls in the grid there was a problem when tabbing into and out of the grid. The embedded control wasn't always displaying correctly when first entering focus to the grid by tabbing to it. The embedded controls weren't always showing the correct color either.

Fixed a problem with parameter value handling when using the MIDAS PSExecuteStatement() method. The values were not properly transferred to the new statement generated.

10/30/2004 Release 4.5 A

Marco Menardi provided a fix for TIB_CurrencyEdit that had to do with a VK_DELETE KeyDown event being allowed when the control is ReadOnly.

I fixed a problem with the TIB_LookupCombo control where the color scheme wasn't working correctly when the dataset was in search mode and the affected columns were tagged with the NOSEARCH option in the FieldsReadOnly property.

The ability to have the TIB_Grid control double as a tree viewer has been started with continuing improvements to come over the next few releases. The changes impacted the buffering data structures to some extent as well causing the TIB_Query component to be impacted some to act specifically as a dataset to service records in a treed configuration.

TIB_Dataset has been enhanced with various optimizations surrounding the use of field maps which store references to columns on both sides of KeyLinks, KeyDescLinks, MasterLinks and MasterParamLinks relationships. This is so that it is no longer necessary to repeatedly use FieldByName() calls which are expensive computationally. This should make many operations using these relationships run much snappier.

10/27/2004 Sub-Release 4.3 Ac

I added the ability to deal more robustly with CachedUpdates with the TIBODataset components by adding a new event called OnCheckCachedInsert: TIBOCheckCachedInsert. This event allows you to identify if cached inserted records in the buffer are associated with the various different master records as they are scrolled though. This makes it so that cached updates can be fully used in a master-detail context. The only glitch left is that they will always show up first in the sort order of the detail dataset, but they are flagged as unsorted so that they don't throw off any other algorithms relying upon the dataset being sorted.

I enhanced the DisplayFormat of TNumericField instances when they are based on an underlying integer storage so that they will consistently show as whole numbers.

I fixed a problem when combining the logic of OnFilterRecord and calculated fields during the OnFilterRecord event. It was returning NULL when it should be returning valid data for a column's value. This only had to do with BLOB fields when in the OnFilterRecord context. Thanks to Ed Dressel for isolating and assisting with the resolution of this problem.

I fixed a bug in the handling of TField objects in the InternalSetFieldData method. I thought I was checking the field's ReadOnly property to prevent the setting when appropriately but due to the way the variable reference scope was it was mistakenly reading the dataset's ReadOnly property instead. Thus, I was allowing fields marked as read only to be modified. It will now raise an exception as it should.

I made various enhancements to the core of the buffering structures in IB_Session.pas. These mostly had to do with correcting some problems with CachedUpdates. Some very significant problems were fixed that took me quite some time to root out. Many thanks to Carlos Cantu who has persisted with me and worked dilligently with me to solve these problems and provide testing and feedback.

Changes in IB_Components.pas unit:

{ Jason Wharton <jwharton@ibobjects.com> }

{ 18-Aug-2004 }

{ I eliminated the record re-fetch operation on an Insert or Edit when a }

{ blob column is involved if there are no KeyLinks defined. This avoids }

{ the buffer getting wiped out because it is unable to fetch without }

{ knowing what the KeyLinks are. }

{ }

I added BeforeSavePoint and BeforeLosePoint events to the transaction components.

I moved the event BeforeConnect of the connection component to fire after the processing of the Login so that the BeforeConnect event is just prior to the call to the API to obtain the connection.

I enhanced the database level ApplyUpdates() method so that it would process Detail datasets prior to master datasets.

I fixed a problem with the Locate() method such that when using it on a detail dataset of a master-detail relationship the detail dataset was getting an extra parameter added to the internal locate cursor when it performed the locate on the server that caused it to fail.

I changed the order of calling the AvterOpen event in relation to the initialization of some of the internal RowNode pointers so that they were properly interpreted based on the new status of the dataset rather than any former, potentially bogus values.

I solved a logic problem in the incremental searching routine where it wasn't coordinating the CallbackInitTick setting just right. When a cursor reaches the end of the dataset it sets this timing indicator to 0, which could happen right in the middle of incremental searching processing. I've now made the incremental searching logic deal with it robustly.

I solved a problem with the handling of NULL columns in incremental searching. NULLs are sorted to the end of the dataset and when I was running into the NULL area it was making a comparison based on a blank value rather than a NULL and thinking that it had gone too far in the dataset and that the search should be terminated, thus preventing it from finding targets near the boundary where the NULL values begin. This is because I have an algorith that will skip ahead records by 10, 100 or more records (for having the FetchWholeRows false scenario) so that they can approach the efficiency of a bracketed search in a linear, mostly unbuffered dataset/buffer.

I fixed a bug in the handling of the time portion of the TIB_DateTimePicker control.

I fixed a problem with the base class for service applications. The way the ShutDown logic was causing the host machine to terminate an OS shutdown. The service app would have to be stopped manually in order to proceed with an OS shutdown which caused quite a bit of hassles.

{ Mark Pickersgill <mpickers@iprimus.com.au> }

{ 28-Aug-2004 }

{ Added Spacing property to autolabel to provide more control over the }

{ pixel spacing between the control and the label. }

{ Added new albLeftCenter and albTopCenter Kind options to provide }

{ vertically and horizontally centered labels. }

{ Added TrimX and TrimY to the Options property. }

{ Added Font, Transparent and Color properties. }

The font property above will more than likely be changed to FontColor, FontSize, etc. to conserve resources.

3/13/2004 Sub-Release 4.3 Ab

Changes in IB_Components.pas unit:

{ Steven Beames <s.beames@griffith.edu.au> }

{ 6-Mar-2003 }

{ Changed csLoading to csReading in functions TIB_Statement.SysPrepare }

{ and TIB_Dataset.SysOpen to allow a custom component to initialise owned }

{ TIB components in its Loaded() method. (Based on a suggestion by }

{ Mahris Vasilevskis) }

{ Christopher Hart <cjh@profiletechgroup.com> }

{ 11/24/2003 }

{ Updated support for Boolean Assignment. Was a problem with TIB_Checkbox }

{ and display of Boolean values. }

{ Updates applied to TIB_COLUMN.GetAsVariant and TIB_COLUMN.SetAsVariant. }

I added the option for password storage to TIB_Connection.PasswordStorage property of psParams which simly allows for storing the password in the Params property in plain text.

I added a new dataset refresh action type called raKeepDataPosOrRowNum which allows a dataset to try and refresh using a Bookmark but if it is not able to find the bookmark to then revert to refreshing to the previous row number rather than just going to the top of the dataset.

I solved a problem with master-detail data change event triggering getting caught in a perpetual loop due to the possibility of data types not lining up in such a way that allows their values to exactly match. This is a rare and special case that really took me a long time to get figured out, but in short, IBO is now bullet proof when it comes to master-detail linking with the interruptible fetching of records being in the mix. This is pretty deep stuff, but the gist of it is, if you have a master dataset and you are clicking to scroll from one record to the next you can get mouse click events handled before the detail dataset has refreshed its records based on the new master record scrolled to. Thus, you could go whipping through master records and then the detail dataset would have to untangle where this weird callstack with windows message processing taking place. Now, IBO will always know exactly how to untangle this and have the detail dataset sync up with the master even if much of the work it would normally have done was bypassed. Thus, this is a very unique and powerful feature of IBO allowing much snappier interfaces, to be perfected. Something I am rather proud of accomplishing and hope you will enjoy.

I added a new translated constants file for German, Portugese and Russian.

I fixed the problem with the menu on the TIB_Script editor taking the DELETE keypress away from the editor control.

I added the feature to show NULL values in the FRM_Browse form so that it is easy to tell between a NULL value and a blank value. This is also due to a new feature added to the TIB_Grid control to show nulls.

Consideration of PreventDeleting was added to the logic for determining whether or not the inplace editor for the TIB_Grid goes into edit mode or not.

I improved the handling of the BaseTransaction in the base class form IBF_Base that underlies all the forms of the component editors and dialog forms. It was not using the DefaultTransaction of the associated connection when an explicit Transaction is not provided. This added behavior made sense to do since it had the connection reference, which may have a default transaction reference to make use of.

The ability to explicitly assign a TIB_Session reference to a TIBODataset component was added. The IB_Session property was made writable.

There was a problem with the handling of the field definition of BCD columns that needed to be addressed. It now follows explicitly what is defined in the database to ensure the correct precision is followed in all cases, not just the most typically used ones.

The TIBODataset.CanModify logic was enhanced to include consideration of the EditSQL, InsertSQL and DeleteSQL properties as well as the OnUpdateRecord and UpdateObject references with RequestLive.

I added the option to optionally display FieldTypeInfo in the TIB_StatementGrid.

I enhanced the SchemaCache so that it would take into consideration the explicit PRIMARY KEY constraint type instead of relying upon the naming concention of RDB$PRIMARY.

The usage of macro substitution has been impacted such that the BeginChar and the EndChar are explicitly spelled out with a string rather than being just a char that was doubled. This will add to the flexibility for the future, although it will likely break existing implementations.

A destination stored procedure property was added to the TIB_Import component so that data can be imported via a stored procedure instead of just inserted into a table.

The AbortExecuting method of the TIB_Process component was overrided in TIB_DataScan so that fetching in the dataset will be aborted properly. This will make usage of the TIB_DataPump more friendly.

11/24/2003 Sub-Release 4.3 Aa

I made quite a number of improvements to the TParams handling for those using the TDataset based datasets. I made it so IBO would be more flexible about whether they are named just right or not. I also have better integration of input, inputoutput and output parameter types. The output parameters now get their datatype set correctly at prepare time.

I fixed the TIBODataset.ParamCount property. It was returning the number of input parameters from the underlying internal IB_Query rather than the actual count of TParam objects associated to the dataset and accessed via the ParamByName() method. This would have caused a potential inconsistency between the internal and external param count.

I made various improvements to the TIBOStoredProc component. It is now possible to open them as a dataset even if you only get a single record. The output params are handled more efficiently. They are defined once and then all subsequent calls to ExecProc or ExecSQL are handled efficiently. In the past I had code assuring their correct definition that ran each time one of these methods were called. This was unnecessary and just slowed things down.

I had a problem in the DoUpdateRecord() method. I was calling CalculateFields instead of GetCalcFields. This difference being the latter properly sets the dataset state so that the OnCalcFields event can make modifications to the fields without an exception "Dataset not in edit state" error.

I added a contributed fix for parameter boolean handling in TDataset. It will now distinguish whether the underlying column is a string or numeric and provide an appropriate assignment. There is yet some work to make this smart enough to know how to resolve a boolean parameter for all underlying column configurations. Use care when dealing with the AsBoolean property and TParam objects.

I fixed an access violation in the GetBookmarkData() method. If there is no row node associated to the RecInfo structure it just ignores the request to populate the bookmark data rather than raising an exception.

I added a flag to prevent the continuous "Problem in Binding Cursor" message. This was triggered by a painting of the grid, which would cause a message to appear and as soon as it was closed the grid would repaint causing the message to appear over and over. Now it will only show the message once per prepare.

Added support for the SQL_BOOLEAN column type in the TIB_Column.GetAsVariant and TIB_Column.SetAsVariant methods.

I removed a condition that would cause an Assert() to be generated. This came about if you had a difference in case between the actual field names and the fieldname entered into your TField properties in the IDE.

I turned warnings off for Delphi 7. Most of those are not applicable and it made my builds take much longer. Too bad they didn't make those added .NET warnings optional. If they did, someone please tell me how.

11/7/2003 Release 4.3 A

Added a confirm password for the user management form of IB_SQL.

Added IB_DataSourceEditor for enhanced design-time editing via the TIB_DataSource component.

Added new WebSnap components:

TIB_LoginFormAdapter

TIB_AdapterPageProducer

TIB_LoginFormAdapterLoginAction

TIB_AdapterEmailLoginField

Changes in the replication components.

Fixed a bug that had to do with queue management. If a certain sequence of events took place the queue would get confused about a record that should be deleted and yet was not, due to the record associated to the queue record not being present anymore. I now properly initialize the local variables used to determine if the record still exists or not. If it doesn't exist then a delete is performed as it should be.

In the synchronization routine an update message can come through and the target record may not exist. In this case, I log an entry in the DIFF table and proceed by treating the update request as an insert request and give the record a presence.

Changes in IB_Header.pas unit.

{ Geoff Worboys <geoff@telesiscomputing.com.au> }

{ 27-Apr-2003 }

{ Added isc_info_firebird_version db info item to allow detect of FB. }

Changes in IB_Session.pas unit.

{ Jason Wharton <jwharton@ibobjects.com> }

{ 11/07/2003 }

{ Changed the OnError Sender to the notifying Sender rather than Self so }

{ the event will pass on the component where the error was originated. }

{ Copyright (C) 2001 Jason Wharton }

{ }

{ Hans added global variable to set the limit for a VarChar to be returned as }

{ a ftString FieldType, before it becomes a ftMemo FieldType in TIBODataSet. }

Changes in IB_Schema.pas unit.

{ Jason Wharton <jwharton@ibobjects.com> }

{ 11/07/2003 }

{ Added OldParameterOrder function to assist with input parameter }

{ handling. }

{ }

{ Fixed a problem with generator handling. It was not properly dealing }

{ with negative values and interpreting them as a high positive number. }

Changes in IB_Components.pas unit.

I merged in a user's improvements to my StringListParamSort() routine so that it works much faster when there are many duplicate values in the list being sorted.

LosePoint method added to the TIB_Transaction component and integrated into all other transaction characteristics. It is also used to release a lock when pessimistic locking is used.

{ Jason Wharton <jwharton@ibobjects.com> }

{ 08-Nov-2003 }

{ I fixed the handling of input parameters such that it will respect an }

{ externally supplied value using the Bound property of TParam or }

{ TIB_Column. }

{ }

{ Jason Wharton <jwharton@ibobjects.com> }

{ 11/07/2003 }

{ I the callback event handle a request to abort fetching work more }

{ robust in regard to nested fetching requests. Now it will cause all }

{ levels prior to the request to abort to recognize the request. Before, }

{ it was getting mixed up since only a toggle was managing this state. }

{ It now uses an integer counter that will properly roll-over. }

{ }

{ Jason Wharton <jwharton@ibobjects.com> }

{ 11/06/2003 }

{ I made the RPL$SYNC_ID column show up as a COMPUTED column. }

{ }

{ Added an exception on the BeforeEdit buffer synchro event if it is }

{ unable to lock the record. Before it would just ignore the condition. }

{ }

{ Fixed parsing to properly handle the FIRST and SKIP tokens in a SELECT }

{ statement. There were problems with the keylinks being setup as DB_KEY }

{ columns as well as various odd cases that tripped up proper }

{ identification of these clauses. }

{ Copyright (C) 2004 Jason Wharton }

{ }

{ Jason Wharton <jwharton@ibobjects.com> }

{ 11/03/2003 }

{ I added a new way of dealing with the parameter ordering situation }

{ In Firebird 1.5 the order of the input parameters was changed so that }

{ the are now in byte order in the SQL string. Before there was a weird }

{ priority such that the order was more difficult. This new way of }

{ ordering input parameters was made the default. IBO will now try and use }

{ the method the server is configured to use. I submit a statement to the }

{ server and examine the order the parameters come back in and then use }

{ them accordingly. It is also possible to hard-code which ever way you }

{ want to save the cost of sending this test query for each new connect. }

{ Copyright (C) 2004 Jason Wharton }

{ }

{ Jason Wharton <jwharton@ibobjects.com> }

{ 10/28/2003 }

{ I took out the call to RoundDown() when getting values out of the }

{ column buffers. There was a problem with interpretation of the floating }

{ point value for certain values. It has to do with the differences }

{ between the double and extended types. }

{ Copyright (C) 2004 Jason Wharton }

{ }

{ Jason Wharton <jwharton@ibobjects.com> }

{ 10/??/2003 }

{ I added the CancelQuery method for those using IB 7.x that would like to }

{ be able to asynchronously cancel the currently running query. }

{ }

{ I added a check on the record count so that if it is a select procedure }

{ it will not parse together a new COUNT( * ) statement but instead make }

{ sure to just fetch all records for the dataset and return the row count. }

{ }

{ I made it so that if NULL was declared as the default value for a column }

{ on the server that it will make it be properly applied on the client if }

{ GetServerDefaults is applied. }

{ Copyright (C) 2004 Jason Wharton }

Changes in IB_Parse.pas unit.

{ Marcel Brink <mbrink@xploration.nl> }

{ 16-Oct-2003 }

{ Corrected the FindSQLForUpdate() method so it would deal with the new }

{ syntax of Firebird 1.5 WITH LOCK for pessimistic locking. }

{ }

{ H. Senner <hsenner@web.de> }

{ 20-Aug-2003 }

{ GetSQLFirstAndSkip did not always return the correct string; if the }

{ SKIP keyword was included the EndPos-Parameter of the called }

{ inline function getValue was less than the BegPos-Parameter; so the }

{ token behind SKIP was never parsed. I set EndPos to the Length of the }

{ parsed string. }

{ The function did not recognize mathematical expressions and the }

{ '?'-variable. }

{ The result is now the string as it is written in }

{ in the underlying SQL ending either with a space or a ')' in order }

{ to be able to extract it from the SQL in an easier way if necessary. }

{ (because SELECT FIRST (n*m)* FROM TABLE without space between ')' }

{ and '*' is correct syntax ) }

{ }

{ Jason Wharton <jwharton@ibobjects.com> }

{ 06-Jun-2003 }

{ Optimized and simplified Daniel's corrections }

{ }

{ Daniel Rail <daniel@accra.ca> }

{ 24-Apr-2003 }

{ Made some corrections in the procedure GetSQLFirstAndSkip, so that the }

{ field names and parameters that contain the keywords FIRST and SKIP are }

{ recognized properly. }

Changes in IB_Export.pas unit.

{ Harald Klomann <klomann@nibler.net> }

{ 16 Oct 2003 }

{ Fixed the DecSeparator so it was initialized properly and moved it to }

{ become a published property so it can be set manually. }

{ }

Changes in IB_Metadata.pas unit.

Geoff Worboys made numerous enhancements to support Firebird 1.5. Proper version identification and BIGINT support. Universal triggers support.

Changes in IB_Grid.pas unit.

{ Meir Kriheli <meir@mksoft@co.il> }

{ 27-May-2003 }

{ Fixed BiDi functionality for proper drawing of indicators and titles in }

{ TIB_CustomGrid.DrawCell when using bdRightToLeft mode. Added another }

{ TRect var (tmpRect2) to that procedure - needed as a holder for tmpRect }

{ before using drawEdge (can't modify ARect - needed down the road) }

{ }

{ Wassim Haddad <lobolo2000@hotmail.com> }

{ 06-Jan-2003 }

{ Added support for an interface extension that supports owner }

{ draw controls. }

Changes in IB_Ledger.pas unit.

Added user support for widestring/Unicode text.

Changes in IB_DataScan.pas unit.

{ Jason Wharton <jwharton@ibobjects.com> }

{ 11/07/2003 }

{ I added a call to AbortFetching prior to closing on a call to }

{ ResetCursor. The intent being to avoid an exception being raised. }

Changes in IBODataset.pas for the TDataset based components.

{ 31-Oct-2003 }

{ I enhanced the handling of RefreshParams() method which handles }

{ master-detail and input parameter changes to refresh a dataset. Prior to }

{ the way it is now I only invoked minimal notification in the process of }

{ opening and closing the internal cursor. Now, I actually call the }

{ dataset's Close and Open method to take in the full notification }

{ potential. This was due to third party components like DevExpress QGrid }

{ failing to keep in synch because it didn't know there was a new batch }

{ of records in the dataset because there was no notification to react to. }

{ }

{ 22-Aug-2003 }

{ I needed to do more work to avoid an AV when using calculated fields, }

{ an OnFilterRecord event and AutoFetchAll set to true. I made it so that }

{ the internal dataset will not do the auto fetch of records until after }

{ the TDataset wrapper is prepared for it. }

PreparedEdits, PreparedInserts, OrderingField, OrderingRefinePos properties and incremental searching methods and properties were added to the TIBODataset based components.

I totally revamped how TParams are handled and provided some optimizations too. They should work exactly as they did in the BDE. IBO also handles output parameters more efficiently as well. It used to define them when calling ExecSQL each time. Now I check a flag to see if output parameters are in place and avoid the extra work on subsequent calls to ExecSQL.

Delphi 6 allows TParams to take precision into account so I added support for it.

I cleaned up the way RequiredFields behave and the CheckRequiredFields in all versions of Delphi. There were some subtle differences from one version of the VCL to the next.

I fixed a bug in the memo fields that were associated to long varchar columns. It was not properly storing the length of the varchar column.

I fixed the handling of BCD fields. Before the wrong size and precision were being reported. Now it will properly match how it is defined in your database. Old incorrect values stored in persistent field definitions will be corrected automatically at run-time so no errors should come up in your application.

I fixed a bug that had to do with large integer columns. I didn't have certain fieldtypes able to exchange values. Is all I had to do was add in the code to handle transferring value from one type to another.

I fixed a bug in the handling of master-detail relationships and assigning filed values in the detail for columns that somehow matched up with columns in the associated master dataset. It was not plugging in the values under situations that it should have been.

Added new actions:

IB_ActionAppend: TIB_ActionAppend;

IB_ActionOrder: TIB_ActionOrder;

IB_ActionSearch: TIB_ActionSearch;

IB_ActionCount: TIB_ActionCount;

Added Found property to the TIB_LocateEdit control.

Enhanced handling of date masks for the TIB_Date control when in unbound mode.

TIB_StoredProc.CommitAction defaults now to caFetchAll.