sl@0: Version 1.05(063) sl@0: ================= sl@0: (Made by Mark Cawston on 23 November 2001) sl@0: sl@0: Dependencies sl@0: sl@0: Built against Hurricane Release build 00629 sl@0: sl@0: Defects fixed : DON-587EA3 (Corrupted Cdbv2.dat prevents device from booting) sl@0: sl@0: Testing sl@0: sl@0: automatic F32tests run on MINT UDEB, UREL, WINS UDEB. sl@0: sl@0: Version 1.05(062) sl@0: ================= sl@0: (Made by Mark Cawston on 23 November 2001) sl@0: sl@0: Dependencies sl@0: sl@0: Built against GT6.2 Release build 00558 sl@0: sl@0: Building sl@0: sl@0: Use bldmake and abld sl@0: sl@0: Testing sl@0: sl@0: Tests modified to verify defects fixed T_BENCH, T_COMP tested on WINS UDEB and sl@0: MISA ARM4 (Assabet) UDEB. sl@0: sl@0: Defects fixed sl@0: sl@0: Hurricane : ROS-534E69: DBMS should use CleanupArrayDeletePushL() sl@0: sl@0: Version 1.05(061) sl@0: ================= sl@0: (Made by Mark Dowman on 26 July 2000) sl@0: sl@0: Dependencies sl@0: sl@0: Built against GT6.0 Release build 00039 sl@0: sl@0: Building sl@0: sl@0: Use bldmake and abld sl@0: sl@0: Testing sl@0: sl@0: Tests modified to verify defects fixed. T_DBMS, T_DBS, T_SQL and T_TRANS passed on WINS UDEB and ARM4(BRUTUS) UDEB. sl@0: sl@0: Defects fixed sl@0: sl@0: ER6.0 : EDNATHE-4MCL2K: RDbDatabase::IsDamaged() always false after opening database. sl@0: ER6.0 : EDNPHAR-4L4KY2: DBMS access violation when sending a fax. sl@0: sl@0: Version 1.05(060) sl@0: ================= sl@0: (Made by Andrew Thoelke on 20 May 1999) sl@0: sl@0: For EPOC Release 5 Unicode sl@0: MSVC++ 6.0 compatible source only release sl@0: sl@0: Dependencies sl@0: sl@0: This release has been built against Baseline 0801 sl@0: sl@0: Building sl@0: sl@0: Use bldmake, etc. sl@0: sl@0: Testing sl@0: sl@0: Tests added to verify defect fixes. All tests passed on WINS UREL, WINS UDEB, ARM ROM 306 sl@0: sl@0: Changes sl@0: sl@0: RDbs::Version() now reports "1.05(060)" sl@0: DBMS stores all Unicode text columns (Text and Text16 columns) using the standard unicode compression algorithm available in STORE. This breaks the data format for all databases containing text - and to ensure that old databases cannot be loaded by this build of DBMS the internal database version numbers have been increased. All existing databases are now unreadable. sl@0: Long columns that are not inlined but still under a certain threshold (currently 1.5K) are now extracted from the database without requiring a read-lock on the database. This allows moderate sized BLOBs to be read from a shared database while another client is updating or compacting the database. sl@0: sl@0: Defects fixed sl@0: sl@0: ER5:EDNBBAR-463J5D: Concurrent server start-up does not panic and hang the second client attempting to connect. sl@0: ER5:EDNATHE-48AEZW: Automatic cursor recovery after row deletion is now much more capable than previously. sl@0: ER5U:EDNATHE-497KWW: Explicitly load 16-bit values using 8-bit reads to prevent incorrect use of half-word load instructions. sl@0: sl@0: sl@0: Version 1.05(058) sl@0: ================= sl@0: (Made by Andrew Thoelke on 20 May 1999) sl@0: sl@0: EPOC Release 5u baseline component sl@0: sl@0: Dependencies sl@0: sl@0: This release was built with sl@0: Tools: E32TOOLS 120, E32TOOLP 107 sl@0: Components: E32 185, F32 145, STORE 062 sl@0: sl@0: Building sl@0: sl@0: Mostly standard EBLD syntax supported. Invoking EBLD without parameters gives usage information sl@0: sl@0: Release components sl@0: sl@0: All 4 build variants have been released. sl@0: sl@0: Testing sl@0: sl@0: No testing has been done sl@0: sl@0: Changes sl@0: sl@0: RDbs::Version() now reports "1.05(058)" sl@0: The DATAZIP tool has been removed - it was not supported for Unicode data documents in any case sl@0: sl@0: sl@0: Version 1.05(057) sl@0: ================= sl@0: (Made by Andrew Thoelke on 15 January 1999) sl@0: sl@0: EPOC Release 5 candidate component sl@0: sl@0: Dependencies sl@0: sl@0: This release was built with sl@0: Tools: E32TOOLS 095, E32TOOLP 098 sl@0: Components: E32 158, F32 124, STORE 051 sl@0: sl@0: Binary Compatibility sl@0: sl@0: Fully binary compatible with 054-6 sl@0: sl@0: Building sl@0: sl@0: Mostly standard EBLD syntax supported. Invoking EBLD without parameters gives usage information sl@0: sl@0: Release components sl@0: sl@0: All 8 build variants have been released. sl@0: MARM ASCII release build EDBMS.DLL + EDBSRV.EXE is 130,276 + 496 bytes (127.7K) in ROM sl@0: To install DBMS for MARM: sl@0: edbms.dll : install to \System\Libs\ sl@0: edbsrv.exe: install to \System\Programs\ sl@0: sl@0: Known problems sl@0: sl@0: DATAZIP will not work on new unicode database documents, as it does not recognise the new Data App UID. This tool is likely to be migrated out of DBMS in the near future sl@0: sl@0: Testing sl@0: sl@0: Test code amended and extended to verify the defect fixes. All test code passes on all platforms. sl@0: sl@0: Changes sl@0: sl@0: RDbs::Version() now reports "1.05(057)" sl@0: sl@0: Defects Fixed sl@0: sl@0: 590829: CDbTableDatabase::CheckIdle() no longer causes an access violation if the table collection is modified while it iterates across the tables. sl@0: 394751: The server panics clients in such a way as to avoid trying to complete the offending message twice, which caused a KERN-EXEC 4 in the server. sl@0: sl@0: sl@0: Version 1.05(056) sl@0: ================= sl@0: (Made by Andrew Thoelke on 5 January 1999) sl@0: sl@0: EPOC Release 5 candidate component sl@0: sl@0: Dependencies sl@0: sl@0: This release was built with sl@0: Tools: E32TOOLS 095, E32TOOLP 098 sl@0: Components: E32 158, F32 124, STORE 051 sl@0: sl@0: Binary Compatibility sl@0: sl@0: Fully binary compatible with 054-5 sl@0: sl@0: Building sl@0: sl@0: Mostly standard EBLD syntax supported. Invoking EBLD without parameters gives usage information sl@0: sl@0: Release components sl@0: sl@0: All 8 build variants have been released. sl@0: MARM ASCII release build EDBMS.DLL + EDBSRV.EXE is 130,280 + 496 bytes (127.7K) in ROM sl@0: To install DBMS for MARM: sl@0: edbms.dll : install to \System\Libs\ sl@0: edbsrv.exe: install to \System\Programs\ sl@0: sl@0: Known problems sl@0: sl@0: DATAZIP will not work on new unicode database documents, as it does not recognise the new Data App UID. This tool is likely to be migrated out of DBMS in the near future sl@0: sl@0: Testing sl@0: sl@0: Test code amended and extended to verify the defect fixes. All test code passes on all platforms. sl@0: sl@0: Changes sl@0: sl@0: RDbs::Version() now reports "1.05(056)" sl@0: New RProcess::Create() and RLibrary::Load() functions which take a TUidType parameter are now used for launching the server and loading drivers with full UID type checking sl@0: sl@0: Defects Fixed sl@0: sl@0: 632258: RDbNamedDatabase::Create() will now only delete the file on cleanup if it created the file, and not delete an existing file sl@0: sl@0: sl@0: Version 1.05(055) sl@0: ================= sl@0: (Made by Andrew Thoelke on 9 December 1998) sl@0: sl@0: EPOC Release 5 candidate component sl@0: sl@0: Dependencies sl@0: sl@0: This release was built with sl@0: Tools: E32TOOLS 095, E32TOOLP 098 sl@0: Components: E32 156, F32 122, STORE 051 sl@0: sl@0: Binary Compatibility sl@0: sl@0: Fully binary compatible with 054 sl@0: sl@0: Building sl@0: sl@0: Mostly standard EBLD syntax supported. Invoking EBLD without parameters gives usage information sl@0: sl@0: Release components sl@0: sl@0: All 8 build variants have been released. sl@0: MARM ASCII release build EDBMS.DLL + EDBSRV.EXE is 130,288 + 496 bytes (127.7K) in ROM sl@0: To install DBMS for MARM: sl@0: edbms.dll : install to \System\Libs\ sl@0: edbsrv.exe: install to \System\Programs\ sl@0: sl@0: Known problems sl@0: sl@0: DATAZIP will not work on new unicode database documents, as it does not recognise the new Data App UID. This tool is likely to be migrated out of DBMS in the near future sl@0: sl@0: Testing sl@0: sl@0: Test code amended and extended to verify the defect fixes. All test code passes on all platforms. sl@0: sl@0: Changes sl@0: sl@0: RDbs::Version() now reports "1.05(055)" sl@0: sl@0: Defects Fixed sl@0: sl@0: SW1-488 Regression from 043: deleting a row can cause an access violation. A simple fix added and tested by T_BIG. sl@0: Rebuilt with MSVC++ 5.0 Service Pack 3 to ensure good WINS release builds. sl@0: Boiler-plated the source code using the SysDoc tool. sl@0: sl@0: sl@0: Version 1.05(054) sl@0: ================= sl@0: (Made by Andrew Thoelke on 16th November, 1998) sl@0: sl@0: This is an EPOC Release 5 component. sl@0: sl@0: sl@0: Dependencies sl@0: sl@0: The requires EPOC Release 5 components to build and run. This release sl@0: was built with sl@0: sl@0: Tools: E32TOOLS 095, E32TOOLP 097 sl@0: Components: E32 156, F32 122, STORE 050 sl@0: sl@0: sl@0: Binary Compatibility sl@0: sl@0: Backwards binary compatible with 053 sl@0: RDbNotifier::Notify() has changed names, making this release source sl@0: incompatible, and RDbNotifer has gained a new export (see Changes). sl@0: sl@0: sl@0: Building sl@0: sl@0: Mostly standard EBLD syntax supported. Invoking EBLD without parameters sl@0: gives usage information sl@0: sl@0: sl@0: Release components sl@0: sl@0: All 8 build variants have been released. sl@0: MARM ASCII release build EDBMS.DLL + EDBSRV.EXE is 130,280 + 496 bytes sl@0: (127.7K) in ROM sl@0: sl@0: To install DBMS for MARM: sl@0: edbms.dll : install to \System\Libs\ sl@0: edbsrv.exe: install to \System\Programs\ sl@0: sl@0: For ROM building, edbsrv.exe should be marked as a FIXED process, the sl@0: process priority has yet to be specified. sl@0: sl@0: DBMS can be successfully installed an run from C: (RAM drive) on a sl@0: EPOC Release 5 ROM sl@0: sl@0: sl@0: Known problems sl@0: sl@0: DATAZIP will not work on new unicode database documents, as it does not sl@0: recognise the new Data App UID. This tool is likely to be migrated out sl@0: of DBMS in the near future sl@0: sl@0: sl@0: Testing sl@0: sl@0: Test code amended and extended to verify the defect fixes and changes. sl@0: All platforms have been fully tested. sl@0: sl@0: sl@0: Changes sl@0: sl@0: RDbs::Version() now reports "1.05(054)" sl@0: sl@0: The notification interface of RDbNotifer has changed: sl@0: * Notify() has been renamed to NotifyUnlock(), inidicating that all sl@0: events are reported, including "unlock" events. sl@0: * A new request NotifyChange() has been added which only completes sl@0: when a change event (all except unlock) occurs on the database. sl@0: Note that change events occuring between notifier completion and making a sl@0: new request will not be missed (as they are in 053), see the fix for sl@0: SW1-334 below. sl@0: sl@0: sl@0: Defects Fixed sl@0: sl@0: Defects are from EPOC Software Defects. sl@0: sl@0: SW1-320 File and Path not found errors are now returned by sl@0: RDbNamedDatabase::Open() when appropriate. sl@0: sl@0: SW1-326 Attempting to read Long columns can return KErrAccessDenied if sl@0: compaction or statistics update is in progress in the same sl@0: client. 053 only reported this if a different client was sl@0: compacting, but panic'd if it was the same client. sl@0: sl@0: SW1-334 Database "change" events which occur after a request is completed sl@0: are now stored by the notifier and reported immediately when the sl@0: next notification request is made. Only the most significant event sl@0: is stored, following this ordering: sl@0: sl@0: Recover > Rollback > Commit sl@0: sl@0: The more "significant" events have a larger impact on client views. sl@0: sl@0: sl@0: sl@0: Version 1.05(053) sl@0: ================= sl@0: (Made by Andrew Thoelke on 28th October, 1998) sl@0: sl@0: This is a beta EPOC Release 5 component. sl@0: sl@0: sl@0: Dependencies sl@0: sl@0: The requires EPOC Release 5 compatibility components to build and run sl@0: sl@0: Tools: E32TOOLS 095, E32TOOLP 096 sl@0: Components: E32 156, F32 122, STORE 050 sl@0: sl@0: sl@0: Binary Compatibility sl@0: sl@0: Only WINS REL, MARM REL and MARM DEB releases are fully binary compatible sl@0: with 052 sl@0: sl@0: WINS DEB is now BC with WINS REL sl@0: WINS UREL is BC with WINS UDEB sl@0: MARM UREL is BC with MARM UDEB sl@0: sl@0: sl@0: Building sl@0: sl@0: Mostly standard EBLD syntax supported. Invoking EBLD without parameters sl@0: gives usage information sl@0: sl@0: sl@0: Release components sl@0: sl@0: All 8 build variants have been released. sl@0: MARM ASCII release build EDBMS.DLL + EDBSRV.EXE is 130,020 + 496 bytes sl@0: (127.5K) in ROM sl@0: sl@0: To install DBMS for MARM: sl@0: edbms.dll : install to \System\Libs\ sl@0: edbsrv.exe: install to \System\Programs\ sl@0: sl@0: For ROM building, edbsrv.exe should be marked as a FIXED process, the sl@0: process priority has yet to be specified. sl@0: sl@0: DBMS can be successfully installed an run from C: (RAM drive) on a sl@0: EPOC Release 4 ROM sl@0: sl@0: sl@0: Known problems sl@0: sl@0: DATAZIP will not work on new unicode database documents, as it does not sl@0: recognise the new Data App UID at the moment. This will be remedied once sl@0: the new unicode Data app UID is available. sl@0: sl@0: sl@0: Testing sl@0: sl@0: All platforms have been fully tested. sl@0: sl@0: sl@0: Changes sl@0: sl@0: 1. RDbs::Version() now reports "1.05(053)" sl@0: sl@0: 2. New UIDs allocated for Unicode: sl@0: 0x10003B0E: Unicode EDBMS.DLL sl@0: 0x10003B0F: KDbmsDriverUid16 sl@0: sl@0: sl@0: sl@0: Version 1.05(052) sl@0: ================= sl@0: (Made by Andrew Thoelke on 13th October, 1998) sl@0: sl@0: This is a beta EPOC Release 5 component. sl@0: sl@0: sl@0: Dependencies sl@0: sl@0: This component requires at least EPOC Release 4 in order to be built and sl@0: run. sl@0: Components required: E32 144, F32 115, STORE 049 sl@0: Tools: E32TOOLS 095, E32TOOLP 093 sl@0: sl@0: sl@0: Binary Compatibility sl@0: sl@0: This release is fully backwards binary compatible with DBMS 051. sl@0: sl@0: However, internal changes mean that different versions of DBMS 050+ in ROM sl@0: and RAM can cause problems. sl@0: sl@0: DBMS 052 adds three more exports to the client interface, to support sl@0: enquiry of database properties such as size and usage. sl@0: sl@0: sl@0: Building sl@0: sl@0: WINS components were built using MSVC++ 5.0, hence the debugging databases sl@0: are incompatible with previous versions of MSDev. sl@0: sl@0: Command-line building now uses the "EBLD" syntax. Invoking EBLD from the sl@0: GROUP sub-project will provide usage information. All MNT verbs which sl@0: could previously be used for building have been removed. sl@0: sl@0: EBLD TOOL ... is used to build the tools sl@0: sl@0: sl@0: Release components sl@0: sl@0: All 8 build variants have been released. sl@0: MARM ASCII release build EDBMS.DLL + EDBSRV.EXE is 130,020 + 496 bytes sl@0: (127.5K) in ROM sl@0: sl@0: To install DBMS 052 for MARM: sl@0: edbms.dll : install to \System\Libs\ sl@0: edbsrv.exe: install to \System\Programs\ sl@0: sl@0: For ROM building, edbsrv.exe should be marked as a FIXED process, the sl@0: process priority has yet to be specified. sl@0: sl@0: DBMS 052 can be successfully installed an run from C: (RAM drive) on a sl@0: EPOC Release 4 ROM sl@0: sl@0: sl@0: Testing sl@0: sl@0: All platforms have been fully tested. sl@0: sl@0: A new SQL-script test program has been added, and further SQL scripts are sl@0: planned to validate the query analysis and evaluation engine. sl@0: sl@0: sl@0: Changes sl@0: sl@0: 1. RDbs::Version() now reports "1.05(052)" sl@0: sl@0: 2. To complement database compaction, a query function which returns sl@0: the database size and usage has been added: RDbDatabase::Size(). sl@0: This returns a structure containing the database size (in bytes) sl@0: and the usage (in percent). A value <0 indiciates an inability to sl@0: evaluate the property, this may be because the database does not sl@0: support the query (such as RDbStoreDatabase), or because the value sl@0: is not immediately available. For hard-to-compute values (like sl@0: usage) this function will return a cached value, these "stats" can sl@0: be updated by calling RDbDatabase::UpdateStats() (which may be sl@0: long-running) or using the incremental version sl@0: RDbIncremental::UpdateStats(TInt&). sl@0: sl@0: 3. RDbNotifier's can now also be opened on a client-side database: sl@0: attempting this operation with build 050 or 051 panic'd. The sl@0: current implementation only supports a single notifier for a sl@0: client-side database, but continues to support any number of sl@0: notifiers opened on a client-server database. sl@0: sl@0: 4. SQL Query optimisation has arrived. No longer is there only one sl@0: way to evaluate a query, DBMS 052 will now make use of indexes to sl@0: optimise query evaluation. The implications for database design sl@0: (what to index) and access (undefined behaviour) are significant. sl@0: sl@0: 4.1. Indexes may be used to evaluate the WHERE clause, the ORDER BY sl@0: clause, or both. Pre DBMS 051 the exact method of evaluating a sl@0: query was well defined, and could be relied on: e.g. an ORDER BY sl@0: clause had to be evluated with an index, and WHERE clause was done sl@0: on-the-fly; the TDbWindow paramater to RDbView::Prepare() was sl@0: followed precisely. This can no longer be relied on in the sl@0: presence of indexes. sl@0: sl@0: 4.2. If a window is requested, the rowset is guaranteed to use one: but sl@0: a window'd View may be provided for a request which did not sl@0: specify one, because that may be the only (or best) way to sl@0: evaluate the query. This implies that Views must be Evaluate()'d sl@0: after preparation, and they may behave differently if this or sl@0: another view updates the underlying table. sl@0: sl@0: 4.3. An ORDER BY clause may be evaluated without an index (even if an sl@0: appropriate one is available), in which case none of the rows will sl@0: appear in the view until they have all been evaluated. So the "get sl@0: results as they come in" approach used in the Data application sl@0: will not look as cool--however, the results might appear 10 times sl@0: faster to make up for this. sl@0: sl@0: 4.4. Table rowsets continue to have the same behaviour as before. sl@0: sl@0: 5. The server, DBMS drivers and open tables are now held in a expiry sl@0: cache when they are no longer "in use", and discarded after a sl@0: short time if not re-used. This significantly improves performance sl@0: in situations where these objects are repeatedly opened and closed. sl@0: sl@0: 6. Cluster caching is now dynamically increased when it would benefit sl@0: access performance. sl@0: sl@0: 7. RDbRowSet::CountL() and RDbRowSet::FindL() are implemented one sl@0: layer "deeper" allowing the server implementation to improve their sl@0: performance by an order of magnitude. sl@0: sl@0: 8. All references to "Library" and "ISAM" are now "Driver". DBMS sl@0: driver extensions will have the extension .dbx. sl@0: sl@0: sl@0: Defects fixed sl@0: sl@0: Defect numbers refer to the EPOC Software Defects database sl@0: sl@0: SW1-183: Null columns do not always return zero values (as spec'd by the sl@0: SDK). The row buffer code has been adapted to do the right thing sl@0: for all null columns. Test code amended to verify this in the sl@0: "problem" cases. sl@0: sl@0: SW1-225: An emulator-only defect where the server thread was being sl@0: cleaned up by the OS because of incorrect ownership. Test code sl@0: amended to verify this fix. sl@0: sl@0: * It was possible to set up a database state combining a transaction sl@0: and long column access, that caused STORE to panic on rollback: sl@0: this was not ideal for client-side access, but deadly for sl@0: client-server access as it killed the server. The transaction sl@0: locking system has now added transient read-locks for long column sl@0: access to prevent this state. However, this may now cause a sl@0: RDbColReadStream::Open() call to fail with "KErrLocked" if sl@0: another client holds an exclusive lock on the database (e.g. they sl@0: are updating a table, or compacting...). This can be handled sl@0: earlier by using a transaction to enclose the read, in which case sl@0: Begin() may fail with KErrLocked. sl@0: sl@0: sl@0: sl@0: sl@0: Version 1.03.051 sl@0: ================ sl@0: (Made by AjThoelke, 28 August 1998) sl@0: sl@0: This is an alpha EPOC Release 5 component. sl@0: sl@0: sl@0: Dependencies sl@0: sl@0: This component ideally requires at least EPOC Release 4 in order to be built sl@0: and run. sl@0: Components required: E32 143, F32 115, STORE 049 sl@0: Tools: E32TOOLS 094, E32TOOLP 093 sl@0: sl@0: sl@0: Binary Compatibility sl@0: sl@0: This release is fully backwards binary compatible with DBMS 043 sl@0: This release is backwards source compatible with DBMS 050 sl@0: sl@0: DBMS now has the full E5 API, having now added support for data modification sl@0: SQL statements. Hopefully this API will not be changed in future E5 releases. sl@0: sl@0: The SQL execution has changed from 050, although the new API remains source sl@0: (but not binary) compatible,. sl@0: sl@0: sl@0: Building sl@0: sl@0: Binaries: From the BMAKE sub-project invoke the BLD batch file sl@0: Tools: From the TOOLS sub-project invoke the BLD batch file sl@0: sl@0: sl@0: Release components sl@0: sl@0: All 8 build variants have been released. sl@0: MARM ASCII release build EDBMS.DLL is 120,732 bytes (117.9K) in ROM sl@0: sl@0: To install DBMS 051 for MARM: sl@0: edbms.dll : install to \System\Libs\ sl@0: edbsrv.exe: install to \System\Programs\ sl@0: sl@0: For ROM building, edbsrv.exe should be marked as a FIXED process, the process sl@0: priority has yet to be specified. sl@0: sl@0: DBMS 051 can be successfully installed an run from C: on a EPOC Release 4 ROM sl@0: sl@0: sl@0: Testing sl@0: sl@0: All platforms have been fully tested. sl@0: sl@0: Note that some of the new functionality requires new test code to be written sl@0: to ensure it's correctness--this work is planned for the next release. sl@0: sl@0: sl@0: Defects fixed sl@0: sl@0: Defect numbers refer to the EPOC Software Defects database sl@0: sl@0: * SW1-65: DBMS 051 should be MSVC 5.0 friendly sl@0: sl@0: * SW1-71: Function renamed to RDbs::ResourceCount() sl@0: sl@0: * SW1-173: LIKE '*?a?*' could fail to match rows that it should, this has sl@0: been remedied sl@0: sl@0: * Faulting previously correct SQL due to the additon of reserved keywords sl@0: is not really backwards compatible, and this restriction is now lifted. sl@0: Tables, indexes and columns can be named after SQL keywords. This is not, sl@0: however, recommended if you want to remain forwards compatible with 043. sl@0: sl@0: * SQL create-table-statements could contain invalid data types and cause sl@0: unexpected things to happen: e.g. "UNSIGNED BINARY" was not flagged as sl@0: an error. sl@0: sl@0: * If the last record in a partially evaluated view was deleted and further sl@0: evaluation generated more rows, the cursor put itself into an sl@0: inconsistent state, often resulting in a panic. This situation is now sl@0: detected and dealt with correctly. sl@0: sl@0: sl@0: Changes and additions sl@0: sl@0: A full explanation of the API changes can be found in "r:\dbms\dsdk\api.doc", sl@0: and the SQL grammar is described in "r:\dbms\dsdk\sql.doc". sl@0: sl@0: * ORDER BY clauses in RDbView queries can now be evaluated without sl@0: requiring the support of an index (hooray!). In fact, it is now sl@0: recommended that you do _not_ create indexes for the sole purpose of sl@0: evaluating an ORDER BY clause: they are slower and bigger, particularly sl@0: for text keys. More detail on those issues in the next release... sl@0: sl@0: * RDbDatabase::Execute() now supports DML as well as DDL statements. sl@0: (see api.doc and sql.doc for details) sl@0: sl@0: * Added class RDbUpdate to incrementally execute data modification SQL sl@0: statements. (see api.doc) sl@0: sl@0: * Started caching tables which have been opened, but are no longer used sl@0: by any cursor, until the current transaction completes. This sl@0: particularly improves performance of multiple SQL insert-statements sl@0: run inside a transaction, as well as removing a nearly-silent-failure sl@0: mode from the transaction system. sl@0: sl@0: * Major reworking of the SQL engine involving: sl@0: sl@0: * Rewrite of the lexer, removing most dependencies on TLex and TChar sl@0: for performance reasons. TChar functions are only used for non-ASCII sl@0: characters encountered in identifiers or spaces. TLex is only used sl@0: for lexing floating point numbers. Keyword identification now uses a sl@0: case-insensitive comparison, rather than folding. sl@0: sl@0: * Literal values are managed and converted by a single class sl@0: sl@0: * Added support for DML statements to the parser sl@0: sl@0: * Access plan generation has been moved into a new class, in preparation sl@0: for query optimization in the next release. sl@0: sl@0: sl@0: sl@0: Version 1.02.050 sl@0: ================ sl@0: (Made by AjThoelke, 7 May 1998) sl@0: sl@0: sl@0: Binary Compatibility sl@0: sl@0: This release is fully backwards binary compatible with DBMS 043. sl@0: sl@0: The new API in this release of DBMS is NOT frozen at present, and it has sl@0: beta status. It is liable to be changed in incompatible ways in the next sl@0: release. sl@0: sl@0: Additionally, some of the functionality in 043 has been enhanced, so code sl@0: which relies on the new behaviour will fail when used with 043. sl@0: sl@0: sl@0: Build sl@0: sl@0: E32 release 126, for debug/release compatibility and Security framework sl@0: F32 release 095 sl@0: STORE release 048, for RSecureStorePagePool and assertion fix sl@0: E32TOOLS 089 sl@0: sl@0: ARM narrow release size is 111,364 bytes (108.8K), as reported from ROMBUILD. sl@0: sl@0: * Reorganised the source code, SQL classes are now in sub-project USQL sl@0: sl@0: * Added two new source directories for the DBMS server: SDBMS contains all sl@0: classes which are built into EDBMS.DLL, SEXE contains the code for the sl@0: server process MARM executable. sl@0: sl@0: sl@0: Release sl@0: sl@0: * All MARM binaries have been validated sl@0: sl@0: * All test code has been run against compatible platforms sl@0: sl@0: * The build number has been bumped just in case a small incremental release sl@0: based on 043 is required for EPOC release 4 (e.g. for a bug fix). 050 is sl@0: not ready for platform release. sl@0: sl@0: * MARM now releases an executable as well as a DLL. EDBSRV.EXE should go sl@0: in \system\programs and is required if and only if client/server DBMS is sl@0: used. WINS does not have any additional objects sl@0: sl@0: sl@0: Defects fixed sl@0: sl@0: * Obscure "phantom row" defect, discovered during code review. sl@0: If a row is deleted through rowset A, and then rowset B deletes what would sl@0: be the next record for rowset A; then NextL() on rowset A would fail to sl@0: move to the next record after that, resulting in a KErrNotFound error on sl@0: a subsequent GetL() on rowset A. NextL() now checks for this state and sl@0: navigates correctly sl@0: sl@0: * LIKE '?' fails to match a text column containing a single character. sl@0: Certain patterns in an SQL like-predicate failed to match when they sl@0: should. The patterns which would failed are characterised by ending in sl@0: one or more '?' followed by zero or more '*', as long as the '?'s were sl@0: not preceeded by a regular character. e.g. sl@0: '?' would not match any single character string sl@0: '?*' would only match strings of length >=2 rather than >=1 sl@0: sl@0: sl@0: Changes and additions sl@0: sl@0: These release notes contain just the highlights of the changes made to DBMS. sl@0: The document "r:\dbms\dsdk\api.doc" provides more detail on the new API and sl@0: behaviour of shared databases. sl@0: sl@0: * RDbs is the client session handle for sharing databases through the DBMS sl@0: server. It provides resource checking and heap failure tools sl@0: sl@0: * RDbNamedDatabase provide the generic mechanism for instantiating a sl@0: database, by providing a name and a format-spec. Databases can be opened sl@0: client-side for exclusive write access or shared read-only access, or sl@0: through the DBMS server for shared write access. sl@0: sl@0: * RDbNotifier provides change notification for shared databases. They can sl@0: only be opened on a database which has been opened using the DBMS server sl@0: sl@0: * RDbDatabase::Begin() now returns a TInt error code. For client databases sl@0: this is garaunteed to be KErrNone (thus ensuring B.C.), but a client-server sl@0: database may return KErrLocked if another client has locked the database sl@0: sl@0: * A single transaction can share DDL operations and DML operations. Any sl@0: affected rowsets which are open when a DDL operation is begun will be sl@0: invalidated, and if the DDL operation is rolled back all rowsets are sl@0: invalidated. In this state, most operations on the rowset result in a sl@0: KErrDisconnected error, and the rowset has to be Close()'d--it cannot sl@0: be Reset() sl@0: sl@0: * RDbDatabase::Compact() and RDbIncremental::Compact() provide a way to sl@0: compact a database. This can be used for RDbStoreDatabase's as an sl@0: alternative to the compaction functions available on CStreamStore. These sl@0: will fail if anyone has an outstanding transaction (including the caller) sl@0: sl@0: * RDbDatabase::Execute() and RDbIncrmental::Execute() can execute DDL SQL sl@0: statements. See "r:\dbms\dsdk\sql.doc" for the SQL syntax of these sl@0: statements. sl@0: sl@0: *** If your databases contain tables, indexes or columns which use an SQL sl@0: keyword for their name: then any SQL passed to DBMS 050, including sl@0: RDbView::Prepare(), can fail with KErrArgument. The list SQL reserved sl@0: words is also in the document. sl@0: sl@0: * Relaxed constraints on getting and setting integral columns on a rowset sl@0: and also for specifying integral key values in a TDbSeekKey. These are sl@0: primarily provided to ease the implementation of non-C++ interfaces to sl@0: DBMS, note that utilising the new functionality will panic'd on DBMS 043. sl@0: sl@0: sl@0: Test code sl@0: sl@0: * Revised the current test code to use and test the new API for database sl@0: instantiation and DDL SQL, and also to test dynamic binding of the DBMS sl@0: driver library sl@0: sl@0: * Added a new test program to test database sharing sl@0: sl@0: sl@0: Version 1.02.043 sl@0: ================ sl@0: (Made by AjThoelke, 30 March 1998) sl@0: sl@0: Binary Compatibility sl@0: sl@0: This release is fully backwards and forwards binary compatible with DBMS 042. sl@0: sl@0: Build sl@0: sl@0: E32 release 125, for debug/release compatibility and Security framework sl@0: F32 release 095 sl@0: STORE release 047, for RSecureStorePagePool sl@0: E32TOOLS 089 sl@0: sl@0: ARM narrow release size is 81964 bytes (80.0K), as reported from ROMBUILD. sl@0: sl@0: Fixed sl@0: sl@0: 1. The compressor could generate an invalid compressed database due to sl@0: faulty analysis of the database data. The data written is subtly sl@0: different to the original database, so analysis for the encoding should sl@0: take place on the data that is written, not on the data that is read: sl@0: which is what DBMS 042 was doing. sl@0: sl@0: This has been fixed: compression is now a little slower, and DBMS is sl@0: .5K smaller. sl@0: sl@0: sl@0: Version 1.02.042 sl@0: ================ sl@0: (Made by AjThoelke, 18 March 1998) sl@0: sl@0: Binary Compatibility sl@0: sl@0: With the exception of compressed databases, this release is fully backwards and sl@0: forwards binary compatible with DBMS 041. sl@0: sl@0: The compression format has changed slightly, resulting in a data incompatibility sl@0: for compressed databases between 041 and 042. You must use DBMS 042 to compress sl@0: databases for use with this release. sl@0: sl@0: Build sl@0: sl@0: E32 release 125, for debug/release compatibility and Security framework sl@0: F32 release 095 sl@0: STORE release 047, for RSecureStorePagePool sl@0: E32TOOLS 089 sl@0: sl@0: ARM narrow release size is 82448 bytes (80.5K), as reported from ROMBUILD. sl@0: sl@0: Changes sl@0: sl@0: 1. The compression format has been changed to provide a larger look-back sl@0: for better compression of long streams; and now uses a stream terminator sl@0: resulting in faster decompression code. sl@0: sl@0: sl@0: Version 1.02.041 sl@0: ================ sl@0: (Made by AjThoelke, 13 March 1998) sl@0: sl@0: Binary Compatibility sl@0: sl@0: Fully backwards and forwards binary compatible with DBMS 040 sl@0: sl@0: Build sl@0: sl@0: E32 release 125, for debug/release compatibility and Security framework sl@0: F32 release 095 sl@0: STORE release 047, for RSecureStorePagePool sl@0: E32TOOLS 089 sl@0: sl@0: ARM narrow release size is 82524 bytes (80.6K), as reported from ROMBUILD. sl@0: sl@0: Fixed sl@0: sl@0: 1. Compression failed for databases which had no LongText or LongBinary sl@0: data. The huffman code generator could not cope with a no-data sl@0: situation. This has been fixed so that non-encodings are supported. sl@0: sl@0: 2. Some code slipped out of 040 which ensures that enforces the read-only sl@0: nature of a compressed database. Otherwise the database could be sl@0: modified and left in a corrupt and unreadable state. sl@0: sl@0: 3. Reduced the memory requirements for compression by a factor of 4 or sl@0: more for databases with large streams. sl@0: sl@0: sl@0: Version 1.02.040 sl@0: ================ sl@0: (Made by AjThoelke, 6 March 1998) sl@0: sl@0: Binary Compatibility sl@0: sl@0: Fully backwards binary compatible with DBMS 039 sl@0: Forwards compatible with 039 if you do not use either of the two new exports: sl@0: sl@0: RDbStoreDatabase::CompressL(CStreamStore&,TStreamId); sl@0: RDbStoreDatabase::DecompressL(CStreamStore&,TStreamId); sl@0: sl@0: in d32dbms.h. (See below) sl@0: sl@0: Build sl@0: sl@0: E32 release 125, for debug/release compatibility and Security framework sl@0: F32 release 095 sl@0: STORE release 047, for RSecureStorePagePool sl@0: E32TOOLS 089 sl@0: sl@0: ARM narrow release size is 82384 bytes (80.5K), as reported from ROMBUILD. sl@0: sl@0: Fixed sl@0: sl@0: 1. Writing to a LongText column using the WriteL(RReadStream&,TInt) sl@0: overload can result in an incorrect column size being stored in the row. sl@0: This defect has only been introduced in 039, and was not present before sl@0: that release. sl@0: This has been fixed, and test code has been changed to test the sl@0: behaviour of stream-to-stream writing to LongText columns. sl@0: sl@0: New stuff sl@0: sl@0: 1. Provided primarily to support compression of help files in ROM... sl@0: Store databases can be compressed[1]. These new static functions of sl@0: RDbStoreDatabase sl@0: sl@0: CompressL(CStreamStore&,TStreamId) sl@0: DecompressL(CStreamStore&,TStreamId) sl@0: sl@0: convert a (non-encrypted) database from normal to compressed form and sl@0: back again. sl@0: sl@0: These functions operate synchronously, and can take an extended time to sl@0: complete[2]. On return the database is not open, and the store file sl@0: should be CompactL()'d and CommitL()'d after compression or sl@0: decompression is successful. If they fail, the database will be in its sl@0: previous state, i.e. the database is still good. sl@0: sl@0: Index data cannot be compressed (unfortunately). sl@0: sl@0: Once compressed the database is read-only, but otherwise operates as sl@0: normal: the data is decompressed on the fly as required. sl@0: sl@0: I have included the compression code on MARM (4.5K of ROM) as this sl@0: might prove useful, although it is less aggressive when compressing sl@0: than the WINS/WINC code. The resulting database is about 7% larger sl@0: but takes half the time to compress. Compression requires quite a bit of sl@0: memory. sl@0: sl@0: [1] Test on help files show compression ratios between 2.5:1 and 4:1 sl@0: [2] e.g. the Series5 help file (343K) takes 10 seconds to compress on sl@0: an E32 125 ROM. sl@0: sl@0: 2. A new releasable TOOLS contains a WINC\REL executable DataZip.exe which sl@0: can compress a Data Document (including help files). This has the same sl@0: EPOC dependencies as DBMS 040 (of course). sl@0: sl@0: To run this program you need to have E32 WINC 125+, F32 WINC 095+, STORE sl@0: WINS 047+, DBMS WINS 040+ and DataZip all in the same directory. The sl@0: source and target file names for the program must be specified in full sl@0: due to a limitation of WINC at present sl@0: sl@0: sl@0: Version 1.02.039 sl@0: ================ sl@0: (Made by AjThoelke, 19 February 1998) sl@0: sl@0: Binary Compatibility sl@0: sl@0: Only the client API (d32dbms.h) in MARM REL, WINS REL and WINS DEB builds sl@0: remains binary compatible with DBMS 038. sl@0: sl@0: * This is the first release to support unicode properly, in particular, sl@0: the unicode releases are not BC with the 038 pre-release. sl@0: sl@0: * MARM Debug builds have broken BC in order to become BC with the sl@0: release build, enabling debug/release component mix'n'match. sl@0: sl@0: * In order to enable client-server and future extensions to DBMS, the sl@0: implementors' interface has been thoroughly broken. This interface is sl@0: described by d32dbas.h, d32rec.h and d32table.h; it has never been sl@0: documented and will no longer be supported by DBMS. These header files sl@0: have been withdrawn until Akula completes its changes to this API. sl@0: sl@0: * The client interface, described by d32dbms.h, is completely backwards sl@0: binary compatible with 038, adding some new functionality in the shape sl@0: of secure databases (see below). sl@0: sl@0: If you are building a release/debug compatible component you must use at least sl@0: E32 125, F32 95, STORE 047 and DBMS 039. sl@0: sl@0: Build sl@0: sl@0: E32 release 125, for debug/release compatibility and Security framework sl@0: F32 release 095 sl@0: STORE release 047, for RSecureStorePagePool sl@0: E32TOOLS 089 sl@0: sl@0: ARM narrow release size is 75920 bytes (74.1K), as reported from ROMBUILD. sl@0: sl@0: MAKMAKE is now used throughout DBMS. The new BMAKE directory contains the batch sl@0: file (bld.bat), makefiles and mmp files to build DBMS. BWINS and BMARM now just sl@0: contain the export definitions files. sl@0: sl@0: DBMS can still be built using the mnt verbs, or by invoking BLD in the BMAKE sl@0: directory. Invoking BLD without parameters gives the basic syntax used. sl@0: sl@0: Test code is built either in each test code sub-project using bld.bat or the sl@0: makefile, or using mnt.cmd from the group as before to build all test code. sl@0: sl@0: Fixed sl@0: sl@0: 1. SW1-792: Following DeleteL() on a filtered rowset, the cursor now sl@0: correctly determines the NextL() row in the set. sl@0: sl@0: 2. Loopholes in the LongText column streaming code allowed clever, but sl@0: incorrect, things to be done with text-only columns (such as embedded sl@0: stores etc.). These columns might now be encrypted, and so do not sl@0: support seeking or combined read and write: so this condition is sl@0: asserted. LongText streams should only ever stream text in or out, sl@0: LongBinary columns must be used for embedding stores. sl@0: sl@0: sl@0: 3. An SQL view which had a comparison operator on a long unicode column sl@0: could be evaluated incorrectly due to a /2 error in a length sl@0: calculation. This has been fixed. sl@0: sl@0: 4. The SQL parser could fail in new ways in Unicode (such as OOM) when sl@0: parsing numeric values. The parser was re-engineered to correctly report sl@0: the real error code, instead of reporting a generic error sl@0: (KErrArgument). sl@0: sl@0: 5. RDbTable::SeekL(), when looking up a unicode column key would not use sl@0: the whole key value given (another divide-by-2 error). Fixed. sl@0: sl@0: Changes and additions sl@0: sl@0: 1. Unicode is here (properly this time). Test code has been modified to run sl@0: in unicode builds. Missing LongText16 functionality has been sl@0: implemented, and a couple of unicode column flaws have been fixed. sl@0: sl@0: 2. LongText16 columns could not be used in LIKE predicates in SQL. The sl@0: required classes and code has been implemented to match the 8-bit code. sl@0: sl@0: 3. Long column optimizations have been overhauled to allow many more than sl@0: previously (the limit has been rasied from 32 to 504, if there are no sl@0: other columns). To reduce memory consumption when large numbers of long sl@0: columns are used, the row buffer is now sized dynamically; are whereas sl@0: the RDbRowSet::SetColL() members may have left with KErrTooBig, they can sl@0: now fail with KErrNoMemory if the buffer cannot be expanded. Overall sl@0: this may reduce the memory requirements for using DBMS. sl@0: sl@0: 4. AlterTable() has some added powers. As long as the respective columns sl@0: are not indexed, it now possible to increase the maximum length of sl@0: Text8, Text16 and Binary columns--up to their maximum of 255 bytes--or sl@0: to change such a column into its respective long type. The reverse is sl@0: not allowed (shortening a Text column or changing LongText->Text). sl@0: sl@0: Changing the maximum length of a column in a StoreDatabase does not sl@0: require the table to be re-written, and so is a quick operation. sl@0: Changing the column type does require the entire table to be re-written sl@0: and so can take an extended time to complete. sl@0: sl@0: 5. Encrypted databases are also now available (thanks to an addition to the sl@0: security framework in the Base). The database is encrypted by a key it sl@0: generates itself, access to this key is protected by encryption and sl@0: decryption keys provided by clients. This allows a client to change the sl@0: user password (for example) without requiring the entire database to be sl@0: re-encrypted. For this reason it is not possible to turn a secure sl@0: database into a plain-text database and vice-versa: this can only be sl@0: done by copying the data from one database to another. It is worth noting sl@0: that encrypting a database does have an impact on performance. sl@0: sl@0: The three new API functions: sl@0: sl@0: RDbStoreDatabase::CreateL(CStreamStore*,CSecurityEncryptBase*) sl@0: sl@0: This creates a secure version of the store database. It cannot be read sl@0: using DBMS 038 or earlier (it will fail with KErrNotSupported). The sl@0: second parameter is an encryption object (such as returned from sl@0: CSecurityBase::NewEncryptL) which is used to create authentication sl@0: data in the database. The key object is deleted by this function. sl@0: sl@0: A matching CSecurityDecryptBase object (i.e. same key, same algorithm) sl@0: must be provided to allow access to the database at any later stage. sl@0: sl@0: RDbStoreDatabase::OpenL(CStreamStore*,TStreamId,CSecurityDecryptBase*) sl@0: sl@0: This is the secure version of opening a store database. The supplied sl@0: decryption key will be authenticated first before the database is sl@0: opened. It should match the Encryption key used to create the database, sl@0: or the last security change. The key object is deleted by this function. sl@0: sl@0: If the key fails to access the database this fails with KErrGeneral. sl@0: If the database is not encrypted this fails with KErrArgument. sl@0: If the database is encrypted using an unknown algorithm this fails with sl@0: KErrNotSupported. sl@0: sl@0: RDbDatabase::ChangeSecurity(CSecurityDecryptBase*,CSecurityEncryptBase*) sl@0: sl@0: This is used to change the access key for the database. The first sl@0: parameter is the current decryption key, which is authenticated (just as sl@0: for opening a database); the second parameter is the new encryption key, sl@0: used to re-encrypt the authentication data. Both keys are deleted by sl@0: this function. sl@0: sl@0: If the database is not encrypted this fails with KErrArgument. sl@0: If the key fails to access the database this fails with KErrGeneral. sl@0: sl@0: 6. Cluster (records) caching has been changed to provide caching for sl@0: multiple record-clusters, paving the way for more efficient multiple sl@0: client access. sl@0: sl@0: 7. Internal column sets are now crossed indexed by name, making table sl@0: creation and alteration, and view preparation faster when tha table has sl@0: a large number of columns. Creating tables up the the record limits is sl@0: quite acceptably fast now. sl@0: sl@0: 8. Took the opportunity presented by losing back-end API compatibility to sl@0: rectify one or two design flaws in the implementation classes, and begin sl@0: the work on turning it into a dynamically loaded generic-database sl@0: framework. sl@0: sl@0: sl@0: Version 1.01.038 sl@0: ================ sl@0: (Made by AjThoelke, 16 October 1997) sl@0: sl@0: 1. Built using Platform 001 releases of E32, F32 and STORE; used E32TOOLS/067 sl@0: sl@0: Only debug binaries have been modified by this release. sl@0: sl@0: Size of EDBMS.DLL sl@0: sl@0: WINS ASCII Release 66,560 bytes (65.0K) sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 68,748 bytes (67.1K) (ROMBUILD) sl@0: MARM ASCII Debug 82,076 bytes (80.2K) (ROMBUILD) sl@0: sl@0: 2. Fixed SW1-393 as described. Change T_INDEX to check the assertion. sl@0: sl@0: sl@0: Version 1.00.037 sl@0: ================ sl@0: (Made by Geert, 2 June 1997) sl@0: sl@0: 1. Built using Platform 001 releases of E32, F32 and STORE; used E32TOOLS/067 sl@0: sl@0: Size of EDBMS.DLL sl@0: sl@0: WINS ASCII Release 66,560 bytes (65.0K) sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 68,748 bytes (67.1K) (ROMBUILD) sl@0: MARM ASCII Debug 82,076 bytes (80.2K) (ROMBUILD) sl@0: sl@0: 2. Fixed SW3-1060 as described. sl@0: sl@0: sl@0: Version 1.00.036 sl@0: ================ sl@0: (Made by AjThoelke, 28 May 1997) sl@0: sl@0: 1. Built using Platform 001 releases of E32, F32 and STORE; used E32TOOLS/067 sl@0: sl@0: Size of EDBMS.DLL sl@0: sl@0: WINS ASCII Release 66,560 bytes (65.0K) sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 68,732 bytes (67.1K) (ROMBUILD) sl@0: MARM ASCII Debug 82,060 bytes (80.1K) (ROMBUILD) sl@0: sl@0: 2. Fixed MNT VALID: needed -e32 in pediff command line. sl@0: sl@0: sl@0: Version 1.00.035 sl@0: ================ sl@0: (Made by AjThoelke, 19 May 1997) sl@0: sl@0: Build sl@0: sl@0: Built using Platform releases of E32, F32 and STORE; used E32TOOLS/066 sl@0: sl@0: Size of EDBMS.DLL sl@0: sl@0: WINS ASCII Release 66,560 bytes (65.0K) sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 68,732 bytes (67.1K) (ROMBUILD) sl@0: MARM ASCII Debug 82,060 bytes (80.1K) (ROMBUILD) sl@0: sl@0: Binary Compatibility sl@0: sl@0: Fully binary compatible with Platform release 034. sl@0: sl@0: Four reserved virtual functions on the CDbDatabase and CDbCursor classes sl@0: defined in d32dbas.h were incorrectly declared as public. These now have sl@0: private access. The only real changes required to the releasables was new sl@0: WINS import libraries. sl@0: sl@0: Nobody should have got anywhere near calling these exports, but they sl@0: have been made private to protect against anyone doing so "by accident". sl@0: You should not be building against this release: use the platform sl@0: version 034. sl@0: sl@0: Changes sl@0: sl@0: 1. Removed Name builds from the BWINS project make file. sl@0: sl@0: 2. Added map files to MARM releaseables sl@0: sl@0: Differences from 034: sl@0: sl@0: sl@0: Version 0.06.034 sl@0: ================ sl@0: (Made by AjThoelke, 17 April 1997) sl@0: sl@0: 1. Uses E32/098, F32/068, STORE/042, E32TOOLS/063 sl@0: sl@0: Binary compatible with 033. sl@0: File compatible with 033. sl@0: sl@0: Build sizes for EDBMS[D].DLL sl@0: sl@0: WINS ASCII Release 66,560 bytes (65.0K) sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 68,732 bytes (67.1K) (ROMBUILD) sl@0: MARM ASCII Debug 82,060 bytes (80.1K) sl@0: sl@0: 2. New Uid scheme adopted for MARM releasables. For MARM, requires sl@0: E32 098 for anything other than narrow release. sl@0: sl@0: 3. Fixed SW-3494. Calling RDbRowSet::Cancel() before the database had sl@0: actually been modified when in a real transaction left the transaction sl@0: machinery in an invalid state. This has been cured. sl@0: sl@0: sl@0: Version 0.06.033 sl@0: ================ sl@0: (Made by AjThoelke, 11 April 1997) sl@0: sl@0: 1. Uses E32/097, F32/067, STORE/041, E32TOOLS/060 sl@0: sl@0: 2. Binary incompatible with 032. sl@0: File compatible with 032. sl@0: sl@0: 3. Build (ROM) sizes for EDBMS[D].DLL sl@0: sl@0: WINS ASCII Release 66,560 bytes (65.0K) sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 68,728 bytes (67.1K) (ROMBUILD) sl@0: MARM ASCII Debug 82,056 bytes (80.1K) sl@0: sl@0: 4. Full Binary compatibility review complete. API is now frozen. sl@0: sl@0: Adjusted exports to provide a full implementation API, for potential sl@0: other implementations of the client API. sl@0: sl@0: Added some reserved virtual space onto the DBMS implementation framework sl@0: for future development. sl@0: sl@0: sl@0: Version 0.06.032 sl@0: ================ sl@0: (Made by AjThoelke, 10 April 1997) sl@0: sl@0: 1. Uses E32/096, F32/066, STORE/040, E32TOOLS/060 sl@0: sl@0: 2. Binary compatible with 031. File compatible with 031. sl@0: sl@0: 3. Build (ROM) sizes for EDBMS[D].DLL sl@0: sl@0: WINS ASCII Release 66,048 bytes (64.5K) sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 68,580 bytes (66.9K) (ROMBUILD) sl@0: MARM ASCII Debug 81,824 bytes (79.9K) sl@0: sl@0: 4. Fixed a bug when evaluating unrestricted views (no WHERE clause): a sl@0: single evaluation step was doing full evaulation, rather than a bite- sl@0: size chunk. sl@0: sl@0: 5. MARM releasables are now pre-PETRAN'd. Obey file uids are history. sl@0: sl@0: sl@0: Version 0.05.031 sl@0: ================ sl@0: (Made by AjT, 21 February 1997) sl@0: sl@0: 1. Uses E32/089, F32/055, STORE/036, E32TOOLS/051 sl@0: sl@0: 2. Binary compatible with 030. File compatible with 030. sl@0: sl@0: 3. Build (ROM) sizes for EDBMS[D].DLL sl@0: sl@0: WINS ASCII Release 66,048 bytes (64.5K) sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 68,584 bytes (66.9K) sl@0: MARM ASCII Debug 81,832 bytes (79.9K) sl@0: sl@0: 4. API tweaklet. TDbSeekKey::Add() members now return a reference to sl@0: the seek key, to assist in construction of multi-column keys. This sl@0: is similar to the CDbColSet::AddL() and CDbKey::AddL() functions. sl@0: sl@0: e.g. sl@0: sl@0: TDbSeekMultiKey<3> key; sl@0: key.Add(value1).Add(_L("value2")).Add(value3); sl@0: table.SeekL(key); sl@0: sl@0: This change does not affect binary compatibility. sl@0: sl@0: sl@0: Version 0.05.030 sl@0: ================ sl@0: (Made by AjT, 3 February 1997) sl@0: sl@0: 1. Uses E32/086, F32/050, STORE/035, E32TOOLS/051 sl@0: sl@0: 2. Binary compatible with 029. sl@0: This is the B5 release. sl@0: sl@0: 3. Build (ROM) sizes for EDBMS[D].DLL sl@0: sl@0: WINS ASCII Release 66,048 bytes (64.5K) sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 68,520 bytes (67.0K) sl@0: MARM ASCII Debug 81,768 bytes (79.9K) sl@0: sl@0: 4. API tweaklet. In the process of documentation, I discovered that two sl@0: inline functions on RDbRowSet, Beginning() and End() can leave if sl@0: the rowset was specified to have insert-only access. I have put an sl@0: L onto the end of these inline functions, which will not break any sl@0: binary compatibility, but might affect program logic. sl@0: sl@0: If the rowset is read-only or updatable (the default) then these sl@0: functions are guaranteed not to leave. sl@0: sl@0: 4. Fixed a bug in RDbRowSet::DeleteL(). It was not reporting any errors, sl@0: even when there was one. Error propagation has been reinstated. sl@0: sl@0: 5. Fixed two bugs to do with synchronising mutliple rowsets during sl@0: concurrent updates to the same table. sl@0: sl@0: sl@0: Version 0.05.029 sl@0: ================ sl@0: (Made by AjT, 21st January 1997) sl@0: sl@0: 1. Uses E32/085, F32/049, STORE/033, E32TOOLS/050 sl@0: sl@0: 2. Binary incompatible with any predecessor. sl@0: sl@0: 3. Build (ROM) sizes for EDBMS[D].DLL sl@0: sl@0: WINS ASCII Release 66,048 bytes (64.5K) sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 68,448 bytes (66.8K) sl@0: MARM ASCII Debug 81,628 bytes (79.7K) sl@0: sl@0: 4. The code for parsing text into TTime has been passed on to the base, sl@0: knocking 3.5K off the DLL. sl@0: sl@0: 5. Fixed an SQL bug: Strings in SQL could not have embedded quote sl@0: characters ('). This can now be done by using two adjacent quote sl@0: characters. sl@0: sl@0: sl@0: Version 0.04.028 sl@0: ================ sl@0: (Made by AjT, 4th December 1996) sl@0: sl@0: 1. Uses E32/076, F32/042, STORE/031, E32TOOLS/048 sl@0: sl@0: 2. Minor version number set to 4. This is the B4 release sl@0: sl@0: 3. Binary incompatible with any predecessor. sl@0: File compatibility has been completely broken again. This should be the sl@0: last time. sl@0: sl@0: 4. Build sizes for EDBMS[D].DLL sl@0: sl@0: WINS ASCII Release 68,096 bytes (66.5K) sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 71,268 bytes (69.6K) sl@0: MARM ASCII Debug 84,608 bytes (82.6K) sl@0: sl@0: 5. The embedded class RDbRowSet::RConstraint has been unembedded, and is now sl@0: RDbRowConstraint, it's behaviour is unchanged. sl@0: sl@0: 6. The class RDbDatabase::RIncremental and its derived classes have been sl@0: turned into a single unembedded class RDbIncremental. Instead of sl@0: constructing the class required for the operation (RDbDatabase::RCreateIndex sl@0: for example) and then invoking the Open() member, you now construct an sl@0: instance of RDbIncremental, and invoke the required member (CreateIndex() sl@0: for the above operation). Otherwise the behaviour of incremental operations sl@0: is unchanged. sl@0: sl@0: 7. RDbRowSet::ColSet() has been dropped, only the leaving version ColSetL() sl@0: remains. sl@0: sl@0: 8. A const KDbUnlimitedWindow has been introduced, this is a TDbWindow sl@0: constructed to represent an unlimited window. sl@0: sl@0: 9. RDbDatabase::IsDamaged() and RDbDatabase::InTransaction() are now const sl@0: members sl@0: sl@0: 10. The test to date/time conversion has been temporarily adopted by DBMS. sl@0: search-conditions in WHERE clauses for view preparation, or row sl@0: constraints can now contain comparisons with DateTime columns. The literal sl@0: date should be specified by enclosing it in '#'s, e.g. sl@0: sl@0: SELECT * FROM EMPLOYEES WHERE START_DATE >= #1 Jan 1996# sl@0: sl@0: 11. DBMS RXxx objects previously would automatically close if opened/prepared sl@0: before being explicitly closed. This functionality has been removed: DBMS sl@0: handles now behave like F32 handles. sl@0: sl@0: 12. All KErrDoesNotExist errors have been replaced by KErrNotFound sl@0: sl@0: 13. Attempting to use a database/rowset between a failure and a transaction sl@0: Rollback (or rowset Cancel) now results in the error KErrDied (previously sl@0: was KErrAbort). sl@0: sl@0: 14. Some verification now takes place as clusters and records are loaded to sl@0: ensure that they have not been corrupted externally. These checks now sl@0: result in KErrCorrupt errors, as opposed to ASSERTion panics, or memory sl@0: overwrites (in release mode). sl@0: sl@0: sl@0: Version 0.01.027 sl@0: ================ sl@0: (Made by AjT, 25th November 1996) sl@0: sl@0: 1. Uses E32/074, F32/040, STORE/029, E32TOOLS/046 sl@0: sl@0: 2. Binary compatible 026. Totally file compatible too. sl@0: Bugs in F32 040 (and 041) may cause incorrect behaviour. sl@0: sl@0: 3. Build sizes for EDBMS[D].DLL sl@0: sl@0: WINS ASCII Release 65,536 bytes (64.0K) sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 68,012 bytes (66.4K) sl@0: MARM ASCII Debug 80,116 bytes (78.2K) sl@0: sl@0: 4. Fixed: sl@0: sl@0: Insert/SetColL/Cancel/InsertCopy resulted in the row data from the sl@0: cancelled insertion being in the row buffer following the call to sl@0: InsertCopyL. Fixed. sl@0: sl@0: Alien bookmarks (from another table) caused panics or corruption, sl@0: rather than being rejected. A new verification scheme has been sl@0: implemented to handle this (see #7 below). sl@0: sl@0: 5. Added two more typedefs sl@0: sl@0: typedef TBufC TDbNameC; sl@0: typedef TBufC TDbColNameC; sl@0: sl@0: These are used in place of the explicit TBufC variants in the interface. sl@0: sl@0: 6. Schema enquiry has been added to RDbDatabase. This is the last OVAL sl@0: related omission. sl@0: sl@0: CDbTableNames* RDbDatabase::TableNamesL() const; sl@0: CDbColSet* RDbDatabase::ColSetL(const TDesC& aName) const; sl@0: CDbIndexNames* RDbDatabase::IndexNamesL(const TDesC& aTable) const; sl@0: CDbKey* RDbDatabase::KeyL(const TDesC& aName,const TDesC& aTable) const; sl@0: sl@0: TableNamesL() returns a list of tables in the database. sl@0: ColSetL() returns a the column set for a given table. sl@0: IndexNamesL() returns a list of indexes for the table. sl@0: KeyL() returns a key for the index on the table. sl@0: sl@0: The objects returned need to be destroyed by the caller. sl@0: sl@0: The Names functions return an instance of the CDbNames class, which can sl@0: be iterated through by using the Count() member and [] operator. sl@0: sl@0: 7. A bookmark's persistence can now be specified explicitly: sl@0: sl@0: A bookmark taken from a view A is valid in view A following sl@0: re-evaluation, and also in any view B based on a query using the sl@0: same select list on the same table. sl@0: A bookmark from a RDbTable object is valid for any RDbTable opened sl@0: on the same table, with or without a SetIndex. sl@0: sl@0: These all operate with the proviso that the record in question has sl@0: not been deleted (of course). sl@0: sl@0: 8. The table-structure cache/map has been overhauled, resulting in sl@0: faster backwards navigation and reduced overall memory usage. sl@0: sl@0: 9. The heuristic used to determine the clustering for a table has been sl@0: improved following profiling tests. It is more optimistic than sl@0: previously, especially for variable length columns. This results in sl@0: significantly lower stream counts and therefore faster performance. sl@0: sl@0: 10. The "inlining" limit for Long columns has been upped to 255 bytes sl@0: as #9 has ensured that this doesn't have a serious clustering sl@0: penalty. sl@0: sl@0: sl@0: Version 0.01.026 sl@0: ================ sl@0: (Made by AjT, 29th October 1996) sl@0: sl@0: 1. Uses E32/072, F32/038, STORE/028, E32TOOLS/045 sl@0: sl@0: 2. Not binary compatible release with 025. sl@0: Can read files from 025, but writes files which cannot be read sl@0: by 025. sl@0: sl@0: 3. Build sizes for EDBMS[D].DLL sl@0: sl@0: WINS ASCII Release 62.0K sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 64.2K sl@0: MARM ASCII Debug 75.7K sl@0: sl@0: 4. Made use of TCardinality from STORE to give a little more sl@0: compression to some DBMS store structures, reducing storage sl@0: overhead to less than 2 bytes per record in ideal conditions. sl@0: sl@0: Version 0.01.025 sl@0: ================ sl@0: (Made by AjT, 18th October 1996) sl@0: sl@0: 1. Uses E32/070, F32/036, STORE/026, E32TOOLS/045 sl@0: sl@0: 2. Binary compatible release with 024. I lied about the file sl@0: formats though: but it wasn't my fault really. This should be sl@0: the last time they change though. sl@0: sl@0: 3. Build sizes for EDBMS[D].DLL sl@0: sl@0: WINS ASCII Release 62.0K sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 64.2K sl@0: MARM ASCII Debug 75.6K sl@0: sl@0: 4. Fixed a bug in RDbRowSet::InsertCopyL: BLOBs were not being sl@0: duplicated. sl@0: sl@0: 5. Added Auto-Increment support due to overwhelming demand. This has sl@0: effected the file format change which makes all previous sl@0: databases unreadable. sl@0: sl@0: TDbCol::EAutoIncrement can be added to the attributes of any sl@0: integral column 32 bits wide or less. The next value of the sl@0: counter is used to initialise any auto-increment columns when sl@0: RDbRowSet::InsertL() or RDbRowSet::InsertCopyL() is used. So the sl@0: value is available before PutL() is called. sl@0: sl@0: The columns are not verified for uniqueness (you can use a sl@0: unique index to do that), nor are clients prevented from sl@0: changing the value in an auto-increment column. sl@0: sl@0: It is implemented as an unsigned 32 bit counter, beginning sl@0: from 0, with the following effects given the choice of column: sl@0: sl@0: EDbColUint32: Wrap-around from KMaxUint32 -> 0 sl@0: EDbColUint16: KErrOverflow in PutL() at KMaxUint16+1 sl@0: EDbColUint8: KErrOverflow in PutL() at KMaxUint8+1 sl@0: EDbColBit: KErrOverflow in PutL() at 2 sl@0: EDbColInt32: Wrap-around from KMaxInt32 -> KMinInt32 sl@0: EDbColInt16: KErrOverflow in PutL() at KMaxInt16+1 sl@0: EDbColInt8: KErrOverflow in PutL() at KMaxInt8+1 sl@0: sl@0: 6. RDbTable::SeekL(TDbSeekKey const&,TComparison=EEqualTo) has sl@0: been implemented. This allows fast key-based lookup of a sl@0: particular row in a table, using an index. To use it the index sl@0: has to be created, and the RDbTable has to be set to use this sl@0: index using the SetIndex() member. sl@0: sl@0: Two classes are provided for passing keys to Seek: TDbSeekKey sl@0: is used for passing a single-column key, the template class sl@0: TDbSeekMultiKey is used for multi-column keys: the template sl@0: parameter is the number of columns in the key. Key values are sl@0: added to the key using the Add() members. Single column keys can sl@0: be constructed directly from the key value with the sl@0: TDbSeekKey(... aKey) constructors. sl@0: sl@0: The key values used must match the column types in the index sl@0: definition exactly, except for integral types <=32 bits wide sl@0: which are all passed as 32 bit values. You can specify less key sl@0: columns than are present in the index, and the search will be sl@0: restricted to the columns in the key you provide. sl@0: sl@0: Results of using different comparisons are: sl@0: sl@0: ELessThan: the last row which compares strictly less than sl@0: the key sl@0: ELessEqual: the last row which compares less than or sl@0: matches the key sl@0: EEqualTo: the first row which matches the key sl@0: EGreaterEqual: the first row which matches or compares greater sl@0: than the key sl@0: EGreaterThan: the first row which compares strictly greater sl@0: then the key sl@0: sl@0: SeekL() returns non-false to indicate when a row matching the sl@0: key and comparison was found. sl@0: sl@0: Note: sl@0: a) that if more than one row matches the provided key, sl@0: EEqualTo and EGreaterEqual will return the same row, but sl@0: ELessEqual will return a different row: the _last_ row which sl@0: matches. sl@0: sl@0: b) the comparison type does not take into account whether an sl@0: index column is descending: i.e. a row which is "less than" a sl@0: key (for Seek) can contain a column value numerically greater sl@0: than the value in the key. sl@0: sl@0: sl@0: Version 0.01.024 sl@0: ================ sl@0: (Made by AjT, 4th October 1996) sl@0: sl@0: 1. Uses E32/069, F32/035, STORE/025, E32TOOLS/042 sl@0: sl@0: 2. Binary compatible release with 023. As with STORE 025, the final sl@0: adjustments in file format come with this release: all future sl@0: releases should be able to read databases written with this sl@0: release. sl@0: sl@0: 3. Build sizes for EDBMS[D].DLL sl@0: sl@0: WINS ASCII Release 60.5K sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 62.4K sl@0: MARM ASCII Debug 73.6K sl@0: sl@0: 4. Recompiled against STORE 025 to bring in an inline bug fix. sl@0: sl@0: 5. Fixed a failure-to-initialise bug which occured following a sl@0: failure during RDbDatabase::RDropTable::Open() and sl@0: RDbDatabase::RRecover::Open() sl@0: sl@0: 6. Fixed a couple of bugs related to index recovery in stressed sl@0: conditions: resulted in corrupting the stream-structure of the sl@0: database, and a bogus index after rollback. sl@0: sl@0: 7. Failure during RDbView::Prepare() or RDbTable::Open() could sl@0: leave the database in an invalid transaction state. Fixed. sl@0: sl@0: sl@0: Version 0.01.023 sl@0: ================ sl@0: (Made by AjT, 1st October 1996) sl@0: sl@0: 1. Uses E32/069, F32/035, STORE/024, E32TOOLS/042 sl@0: sl@0: 2. This is the DBMS B2 release. sl@0: sl@0: There are one or two weird bugs lurking in there somewhere, which sl@0: we are trying to fish out at the moment. They only show up under sl@0: heavy alloc fail and thread shooting tests. Rather like trying to sl@0: catch exotic sub-atomic particles really. sl@0: sl@0: 3. Build sizes for EDBMS[D].DLL sl@0: sl@0: WINS ASCII Release 60.5K sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 62.1K sl@0: MARM ASCII Debug 72.9K sl@0: sl@0: 4. Binary incompatible with any previous release. sl@0: sl@0: 5. Fixed: sl@0: sl@0: Navigating to Next after Deleting a record from a windowed view sl@0: and then trying to read the record resulted in KErrDoesNotExist. sl@0: The next row is now correctly found. sl@0: sl@0: Rowset returning an (incorrectly) empty row after a failed row sl@0: read (due to e.g. OOM). Row buffer/cache fixed. sl@0: sl@0: Specifying a Unicode column for a LIKE match in an SQL string sl@0: now results in KErrNotSupported, rather than undefined (random) sl@0: behaviour. sl@0: sl@0: Rollback due to a failed Update/Put left the rowset with invalid sl@0: data in the row. This could be returned a valid row after resetting sl@0: the rowset. This is now correctly invalidated. sl@0: sl@0: Could not navigate on a rowset while any other rowset was between sl@0: Update/Insert and Put. Changed Transaction states to allow this. sl@0: sl@0: Fixed an incorrect assert in the transaction states. sl@0: sl@0: 6. RDbColXmmmmStream::StoreL[C] have been withdrawn. Use the sl@0: CEmbeddedStore class in STORE instead to achieve store embedding sl@0: in LongBinary columns. sl@0: sl@0: 7. With support from STORE 024, Recovery is now fully operational. sl@0: sl@0: sl@0: Version 0.01.022 sl@0: ================ sl@0: (Made by AjT, 23rd September 1996) sl@0: sl@0: 1. Uses E32/067, F32/033, STORE/022, E32TOOLS/041 sl@0: sl@0: This release has not used the latest E32 etc., in order to sl@0: make the new DBMS functionality available to its clients sl@0: immediately. sl@0: sl@0: 2. Build sizes for EDBMS[D].DLL sl@0: sl@0: WINS ASCII Release 60.5K sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 61.8K sl@0: MARM ASCII Debug 72.7K sl@0: sl@0: 3. Binary incompatible with any previous release. sl@0: Files are also incompatible: the DBMS head stream is now typed sl@0: and validated whn opened. sl@0: sl@0: 4. Fixed a bug in the calculation of maximum record size in the sl@0: presence of a DateTime column. sl@0: sl@0: 5. Indexes now support truncated Text and LongText keys. sl@0: sl@0: TDbKeyCol has a new member iLength and a new ctor: sl@0: sl@0: TDbKeyCol(const TDesC& aColumn,TInt aLength,TOrder anOrder=EAsc); sl@0: sl@0: * The length should only be defined for Text or LongText columns. sl@0: sl@0: * The lengths specified need to equal the maximum column length sl@0: (or be left undefined), _except_ for the last key column, for sl@0: which it can be smaller. Key values will be truncated to fit. sl@0: sl@0: * With unique indexes the _truncated_ key will have to be unique. sl@0: sl@0: * ORDER BY (which is only supported in the presence of an index) sl@0: is relaxed so that rows are returned in the order of the 'best' sl@0: matching index available: i.e. between indexes containing all sl@0: necessary columns, the one that stores most of the final key sl@0: column. Clearly if a truncated-key index is not unique, the rows sl@0: may be returned in not-quite-order. sl@0: sl@0: * LongText columns, like short ones, can be indexed. LongText sl@0: columns can only ever be used as the last column in a key sl@0: specification, and must have a length specified. sl@0: sl@0: * Every key value in an index takes up the maximum space. sl@0: sl@0: As a guide: The maximum allowable unique Text key is 248 bytes, the sl@0: maximum allowable non-unique Text key is 244 bytes. sl@0: sl@0: 6. Database safety and Transaction support. sl@0: sl@0: * The Database uses the Store commit/revert protocol to achieve sl@0: transaction support. Therefore is is _vital_ that clients do sl@0: not do so themselves while they have the database open. Failure sl@0: to do so may result in an unrecoverable database. sl@0: sl@0: * Until a transaction is commited, the updates are not persistent: sl@0: Rollback or closing and re-opening the database will result in sl@0: loss of the updates and possible recoverable damage to the sl@0: database. sl@0: sl@0: * Without the explicit use of transactions on the database, all sl@0: update operations take place within their own automatic sl@0: transaction: sl@0: sl@0: * DDL incremental operations are committed on successful sl@0: completion, or rolled back when the incremental object sl@0: is closed if the operation failed or was not completed. sl@0: sl@0: * DML: RDbRowSet::UpdateL() or Insert[Copy]L() begins a auto- sl@0: transaction and PutL() commits it, on any failure, sl@0: Cancel() will invoke the rollback. DeleteL() does all of sl@0: this within the single function. sl@0: sl@0: * Interleaved DML operations on separate rowsets are treated sl@0: as a single transaction on the database, so it is possible sl@0: to make a multi-table update be atomic using the auto- sl@0: transaction feature. e.g. sl@0: sl@0: View1.UpdateL(); // transaction begins here sl@0: View2.UpdateL(); sl@0: ... sl@0: View1.PutL(); sl@0: View2.PutL(); // transaction commits here sl@0: sl@0: For such a transaction to rollback on failure, all rowsets sl@0: with pending updates must be Cancel()led. sl@0: sl@0: * Explicit use of RDbDatabase::Begin(), Commit() and Rollback() sl@0: precludes the above behaviour. If the database is in an explicit sl@0: transaction, update operations do not invoke invoke their own sl@0: auto-transactions. sl@0: sl@0: DML and DDL cannot (and never could be) operated at the same sl@0: time, but they can be done within the same database transaction. sl@0: sl@0: * When an operation fails during a transaction, and before any sl@0: rollback, the database is left in an "abort" state, and sl@0: attempting other operations will result in an KErrAbort error. sl@0: The appropriate rollback mechanism must be used before commencing sl@0: (Cancel() rowset updates, Close() incremental objects, Rollback() sl@0: any explicit transactions). sl@0: sl@0: The database may be damaged following rollback, but this can be sl@0: repaired. sl@0: sl@0: * After a Rollback, all rowsets lose their current position, this sl@0: results in a return/leave code of KErrNotReady when attempting sl@0: to use the table or view. The rowset must be Reset() which sl@0: returns it to the state it was in immediately after opening or sl@0: preparing. (So a view may need to be re-evaluated at this point). sl@0: The rowset does not need to be closed and re-prepared. sl@0: sl@0: * If a client requires that some Store updates are commited to sl@0: the Store at the same save-point as some database updates, sl@0: an explicit transaction should be used, and both the store and sl@0: database updates carried out within the transaction. Commiting sl@0: the database will then commit the Store. sl@0: sl@0: * Why use transactions? Apart from providing atomicity of multiple sl@0: updates across one or more tables, they vastly improve sl@0: performance when doing bulk updates. sl@0: sl@0: Some statistics: the test was writing 1000 records (about 40 bytes sl@0: per record) to a table in a database. (timings from the rack) sl@0: sl@0: Automatic transactions (each record is written within its own sl@0: transaction): sl@0: File size: 529,667 bytes sl@0: Time: 90.1s sl@0: Explicit transactions (a single transaction is used for all 1000 sl@0: record writes): sl@0: File size: 38,762 bytes (14 x smaller) sl@0: Time: 1.54s (>50 x faster) sl@0: sl@0: The file size difference is entirely compactible on STORE sl@0: (eventually--when STORE provides compaction), as the extra space sl@0: comes from having to flush buffers and commit the store after sl@0: every record is written. sl@0: sl@0: 7. The recovery code is in place, but requires some more Btree sl@0: support from STORE than comes with 022. sl@0: sl@0: * Following Rollback (auto or explicit): if any indexes have sl@0: been updated, they are considered broken. The database is sl@0: still operational (although it reports that it is damaged). sl@0: Any damaged indexes cannot be used for DML (reporting sl@0: KErrCorrupt) and so may prevent some views being operational sl@0: after rollback and reset. sl@0: sl@0: * Damaged indexes can be dropped (STORE does not support this sl@0: yet). The database will still report damage, though recovery sl@0: will then be trivial. sl@0: sl@0: * Recovering the database involves rebuilding all damaged sl@0: indexes. (ditto about STORE) sl@0: sl@0: * All tables and views must be closed on the database before sl@0: recovery can commence. sl@0: sl@0: 8. There is now a limit of 32 indexes on any one table in database. sl@0: sl@0: 9. Incremental operations now take larger than minimal steps, and sl@0: should modify the step count more sensibly than before. sl@0: sl@0: 10. Indexing should be one helluvalot faster now: without any commit sl@0: framework the previous release was doing some excessive streaming sl@0: to the file. sl@0: sl@0: sl@0: Version 0.01.021 sl@0: ================ sl@0: (Made by AjT, 6th September 1996) sl@0: sl@0: 1. Uses E32/066, F32/031, STORE/021, E32TOOLS/039 sl@0: sl@0: 2. Build sizes for EDBMS[D].DLL sl@0: sl@0: WINS ASCII Release 54.0K sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 55.4K sl@0: MARM ASCII Debug 64.9K sl@0: sl@0: 3. Binary incompatible with previous release. sl@0: sl@0: 4. Any API to do with compaction has been removed as compaction is sl@0: ommitted. Compaction of the file-store should be done with the sl@0: STORE API. sl@0: sl@0: 5. Added RDbColXxxxStream::StoreL() and RDbColXxxxStream::StoreLC() sl@0: to enable a persistent store to be embedded in LongBinary sl@0: columns. Use in the same way as RStoreXxxxStream::StoreL() etc. sl@0: sl@0: 6. New persistent table structure: robust and PermanentStore sl@0: friendly. Records are clustered and clusters are cached in sl@0: memory, resulting in lower storage overhead and faster record sl@0: access. sl@0: sl@0: 7. The rule about EDbColBit columns being not-null has been sl@0: withdrawn. Nullable Bit columns are back. sl@0: sl@0: 8. No provision for serious text to time conversion has been made, sl@0: so date columns cannot be used in WHERE clauses, and the date- sl@0: literal is removed from the grammar. sl@0: sl@0: 9. Removed trivial constructors and destructors from abstract sl@0: classes, there by saving code space (~1K) and preventing sl@0: vtables being generated for these classes. sl@0: sl@0: Version 0.01.020 sl@0: ================ sl@0: (Made by AjT, 2nd September 1996) sl@0: sl@0: 1. Uses E32/066, F32/031, STORE/021, E32TOOLS/039 sl@0: sl@0: 2. Build sizes for EDBMS[D].DLL sl@0: sl@0: WINS ASCII Release 52.5K sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 53.5K sl@0: MARM ASCII Debug 62.6K sl@0: sl@0: 3. Binary compatible with 019 sl@0: sl@0: 4. DBMS is no longer tested against the Fragment file store layout, sl@0: as this is being phased out and the future releases will start sl@0: using file store features not supported by CFragmentFileStore. sl@0: Changed your code to using CPermanentFileStore now! sl@0: sl@0: 5. Views now follow the spec for cursor position after DeleteL, sl@0: PutL and Cancel. sl@0: sl@0: Following from DeleteL, the current position is in between what sl@0: would have been the Next and Previous rows, so Next and Previous sl@0: after DeleteL will go to the same row as if DeleteL had not been sl@0: called. sl@0: sl@0: After a PutL the current row will be the row just Put. Which row sl@0: appears following subsequent Next/Previous depends on how the sl@0: view is evaluated. For Unlimited windows it is well defined (see sl@0: note 8 to release 018). For Table views with no set index, sl@0: Updated rows remain in the same place, Insert[Copy]ed rows are sl@0: appended, so following Insert/Put the current row is the Last sl@0: row. sl@0: sl@0: After a Cancel the view should be located in the same place it sl@0: was prior to the Update/Insert. sl@0: sl@0: 6. Support for co-ordinating multiple views on the same table has sl@0: been added. If one view modifies the table this can affect other sl@0: rowsets. DBMS tries to recover the other view cursors when they sl@0: are next used, but this is not always possible. Some RDbRowSet sl@0: members can fail in special ways in this situations: sl@0: sl@0: If another view has deleted the rowset's current row, GetL and sl@0: DeleteL will fail with KErrDoesNotExist. Depending on how the sl@0: view is evaluated the view may still be able to move to sl@0: PreviousL and NextL. If the cursor cannot be recovered, NextL sl@0: and PreviousL will fail with KErrNotReady and the view will be sl@0: left on an invalied row. sl@0: sl@0: If another view has modified the table between between a call to sl@0: UpdateL and PutL, PutL will fail with KErrGeneral. [I'm trying to sl@0: think of a more appropriate error for this]. To continue you sl@0: need to Cancel() and then try to update again. sl@0: sl@0: As DBMS is not a server, you should usually be in control of sl@0: multiple views, and how they will interact with each other. sl@0: sl@0: 7. Long columns are inlined into the record when they are short sl@0: enough. This has no affect on the API to access them, as this is sl@0: primarily to reduce the storage overheads for short BLOBs. sl@0: sl@0: sl@0: Version 0.01.019 sl@0: ================ sl@0: (Made by AjT, 21 August 1996) sl@0: sl@0: 1. Uses E32/065, F32/029, STORE/020, E32TOOLS/039 sl@0: sl@0: A release to upgrade to the new components and directory sl@0: structure. sl@0: sl@0: 2. Build sizes for EDBMS[D].DLL sl@0: sl@0: WINS ASCII Release 51,200 sl@0: WINS ASCII Debug - sl@0: MARM ASCII Release 52,812 sl@0: MARM ASCII Debug 61,268 sl@0: sl@0: Version 0.01.018 sl@0: ================ sl@0: (Made by AjT, 20 August 1996) sl@0: sl@0: 1. Uses E32/064, F32/028, STORE/019, E32TOOLS/036 sl@0: sl@0: 2. Build sizes for EDBMS[D].DLL sl@0: sl@0: WINS ASCII Release 51,200 sl@0: MARM ASCII Release 52,860 sl@0: MARM ASCII Debug 61,308 sl@0: sl@0: 3. Fix: Table names are compared folded when opening tables or sl@0: views on the database. sl@0: sl@0: 4. A final record layout has been adopted: Long columns are not yet sl@0: inlined when they contain sufficiently little data. Any sl@0: databases from previous versions will be read incorrectly. The sl@0: new format means that the order of the columns in a newly sl@0: created table may not be the same as that in the column set sl@0: provided for RDbDatabase::CreateTable() or sl@0: RDbDatabase::AlterTable(). sl@0: sl@0: Specifying columns as Not-Null reduces the persistent storage sl@0: requirements for numerical columns. Bit columns must always be sl@0: Not-Null. sl@0: sl@0: 5. Dropping and altering tables, creating and dropping indexes, and sl@0: evaluating a view are now done incrementally. The non-incremental sl@0: forms use the incremental objects/functions. These are done in sl@0: rather small steps at the moment, this will be changed to more sl@0: efficient larger steps at some stage. sl@0: sl@0: 6. AlterTable has arrived. Specification of the altered column set: sl@0: sl@0: Any column with the same name in the altered set as one in the sl@0: original table is considered unchanged. So it must have the same sl@0: definition, with the exception that the TDbCol in the altered set sl@0: can have iMaxLength set to KDbUndefinedLength. sl@0: sl@0: Any number of columns may be deleted, provided they are not used sl@0: in any index key. Any number of nullable columns may be added. sl@0: Any number of Not-null columns may be added to an empty table: sl@0: it is an error to try and add Not-null columns to a non-empty sl@0: table. sl@0: sl@0: If the table is empty, or no columns are being dropped this sl@0: completes immediately. Otherwise the entire dataset need to be sl@0: modified and the operation is potentially long-running. sl@0: sl@0: 7. Query text and the comparison type to be used in the query are sl@0: now packaged into a class TDbQuery, which can be constructed sl@0: from a descriptor, or a descriptor and a comparison type. sl@0: sl@0: This affects the following functions: sl@0: RDbRowSet::RConstraint::Open() sl@0: RDbRowSet::FindL() sl@0: RDbView::Prepare() sl@0: sl@0: 8. The RDbView::Prepare API now looks like: sl@0: sl@0: TInt Prepare(RDbDatabase&,const TDbQuery&,TAccess =EUpdatable); sl@0: TInt Prepare(RDbDatabase&,const TDbQuery&,const TDbWindow&); sl@0: TInt Prepare(RDbDatabase&,const TDbQuery&,const TDbWindow&,TAccess); sl@0: sl@0: effectively you have sl@0: sl@0: Prepare(Database, Query [,Window] [,Access]) sl@0: sl@0: The Query can be directly constructed from a descriptor, in sl@0: which case normal text comparison is used in the query sl@0: evaluation. Other comparison modes can be set by explicitly sl@0: constructing a TDbQuery from the query descriptor and comparison sl@0: type. sl@0: sl@0: The Access parameter is as specified before, and always defaults sl@0: to RDbRowSet::EUpdatable. sl@0: sl@0: The Window parameter is the new one. This defaults to sl@0: TDbWindow::ENone, which provides the previous behaviour for the sl@0: view: evaluation or navigation may take an extended time to sl@0: complete, depending on how the query is evaluated, as little sl@0: memory is used as possible. sl@0: sl@0: If TDbWindow::EUnlimited is specified, the view takes on Dynaset sl@0: behaviour. Evaluation may take an extended time to generate a sl@0: set of all the rows in the query, but then navigation is sl@0: guaranteed to take constant time. This does impact the way sl@0: modified or inserted rows appear in the set: modified rows will sl@0: stay in the same place in the set, even if an ORDER BY clause is sl@0: specified in the query or they no longer match the WHERE clause; sl@0: inserted rows will always appear at the end of the set, even sl@0: when they do not match a WHERE clause. If the set is re- sl@0: evaluated, these rows will then appear (or not) in the correct sl@0: place. sl@0: sl@0: A limited size window can be specified, which allows for sl@0: guaranteed quick navigation within the window, without the sl@0: memory overhead of generating a set of every row in the query. sl@0: This is specified with the TDbWindow constructor overload: sl@0: sl@0: TDbWindow(TInt aForeSlots,TInt aRearSlots); sl@0: sl@0: aForeSlots indicates the number of row references which should be sl@0: "cached" for navigating to Next, and aRearSlots indicates the sl@0: number which should be cached for going to Previous. The current sl@0: row is not included. The window then provides a restricted view sl@0: over the underlying query; when fully evaluated the window will sl@0: try to match the requested shape if possible. Navigation is sl@0: restricted to the window, CountL() reports the number of rows in sl@0: the window, and going past the end will report AtEnd and sl@0: AtBeginning as for other rowsets. To "move" the window, the sl@0: view needs to be evaluated some more. sl@0: sl@0: Updated records in a restricted window will remain in place, sl@0: though further navigation and evaluation may result in it sl@0: appearing elsewhere later. Inserted records are not added to the sl@0: window, they may appear later after further evaluation. sl@0: Restricted windows are therefore not ideal for modifying the sl@0: data. sl@0: sl@0: Note: Some queries will demand an unlimited window (ORDER BY on sl@0: a non-indexed column (not yet available), so the parameter to sl@0: Prepare can only be used as a suggestion to DBMS. sl@0: sl@0: sl@0: Evaluation API: sl@0: sl@0: void Reset(); sl@0: TInt Evaluate(); sl@0: void Evaluate(TRequestStatus& aStatus); sl@0: TBool Unevaluated() const; sl@0: TInt EvaluateAll(); sl@0: sl@0: The view can be Reset() to its condition immediately after sl@0: Prepare(). For views with a window, this results in an empty sl@0: window, and evaluation is required to make any rows available. sl@0: The view is repositioned back to the beginning. sl@0: sl@0: Evaluate() does a unit of evaluation work. A return value <0 sl@0: is an error code; KErrNone implies that evaluation is complete sl@0: for the window/set; >0 implies that further evaluation can be sl@0: done. Evaluate(TRequestStatus& aStatus) is an asynchronous sl@0: version of Evaluate(), the status reporting the same as the sl@0: return code. sl@0: sl@0: At any time, RDbView::Unevaluated() will return whether sl@0: Evaluate() has any work to do or not. sl@0: sl@0: EvaluateAll() invokes Evaluate() until evaluation is complete. sl@0: sl@0: Evaluation and navigation can be mixed. An interesting side sl@0: effect is that if the view is navigated off the end of the sl@0: window, resulting in being AtEnd, and then further evaluation sl@0: results in rows being added to the window, the view will then be sl@0: positioned at the new row, its state changing from AtEnd to sl@0: AtRow. sl@0: sl@0: To fully re-evaluate an unlimited window, use Reset() followed sl@0: by EvaluateAll(). sl@0: sl@0: sl@0: Version 0.01.017 sl@0: ================ sl@0: (Made by AjT, 5 August 1996) sl@0: sl@0: 1. Uses E32/064, F32/028, STORE/019, E32TOOLS/036 sl@0: sl@0: This is just a component upgrade release sl@0: sl@0: 2. MARM ASCII Release size down to 46,776 due to IMPORT stub sl@0: shortening sl@0: sl@0: Version 0.01.016 sl@0: ================ sl@0: (Made by AjT, 26 July 1996) sl@0: sl@0: 1. Uses E32/063, F32/027, STORE/018, E32TOOLS/034 sl@0: sl@0: 2. Build sizes for EDBMS[D].DLL sl@0: sl@0: WINS ASCII Release 46,592 sl@0: WINS ASCII Debug 110,592 sl@0: MARM ASCII Release 46,980 sl@0: MARM ASCII Debug 54,580 sl@0: sl@0: 3. Bugs fixed: sl@0: sl@0: Key uniqueness was not being persisted, so unique indexes would sl@0: not work when the database was re-opened after closing. sl@0: sl@0: 4. Bookmarks are here. It is possible to bookmark any cursor position, sl@0: including the beginning and end of the set. sl@0: sl@0: 5. Finding within a rowset is operational. sl@0: RDbRowSet::RConstraint, MatchL and FindL are fully functional as sl@0: spec'd in the previous release notes. sl@0: sl@0: 6. Incremental database operations are now functional, though their sl@0: implementation is currently a mock-up based on their single call sl@0: siblings. So they will all report 1 step after the call to sl@0: Open(...) and complete after the first call to Next(). sl@0: sl@0: 7. A TDbCol constructed as a short Text column (EDbColText[8|16]) now sl@0: has a default iMaxLength of KDbDefaultTextColLength (50) rather than sl@0: KDbUndefinedLength. sl@0: sl@0: This allows default length text columns to be indexed, as the sl@0: previous default (which translates to 255 characters in the sl@0: database-in-a-store) meant that the key was too large and the index sl@0: creation failed. The value chosen matches a default in sl@0: Microsoft Access. sl@0: sl@0: 8. The enum TDbPosition has been renamed to RDbRowSet::TPosition, and sl@0: as all its values are now scoped by RDbRowSet, the 'Db' prefix sl@0: to the enumeratiuon values has been dropped. sl@0: sl@0: 9. RDbRowSet::SetColNull() has had an 'L' suffix added as it may leave sl@0: when a Long column is being set to Null. It will never leave if the sl@0: column is not a Long column or it is already Null. sl@0: sl@0: 10. The base class for the incremental operations has been renamed from sl@0: RDbDatabase::RState to RDbDatabase::RIncremental which better sl@0: reflects its purpose. sl@0: sl@0: 11. RDbView's evaluation interface has been changed after thought about sl@0: incremental evalution. sl@0: sl@0: IMPORTANT: Evaluate() has been renamed to EvaluateAll(). Evaluate() sl@0: will eventually invoke a single step in the evaluation of the view, sl@0: but this member has been commented out for this release to sl@0: help spot uses of this member which need to be changed. sl@0: sl@0: EvaluteAll() will eventually use the incremental evaluation sl@0: mechanism to generate the rowset. sl@0: sl@0: 12. RDbRowSet::CountL() is fully implemented now, and will restore the sl@0: previous cursor position if it is necessary to navigate the entire sl@0: set in order to calculate the number of rows. sl@0: sl@0: 13. RDbRowSet::IsEmptyL() is also now implemented. sl@0: sl@0: Version 0.01.015 sl@0: ================ sl@0: (Made by AjT, 11 July 1996) sl@0: sl@0: 1. Uses E32/063, F32/027, STORE/017(018), E32TOOLS/034 sl@0: sl@0: Upgraded to new releases. Store 017 and 018 are binary sl@0: compatible. Use 018, it provided between 300 and 800% speed sl@0: increase for the DBMS test code. sl@0: sl@0: 2. Build sizes for EDBMS[D].DLL sl@0: sl@0: WINS ASCII Release 44,032 sl@0: WINS ASCII Debug 115,712 sl@0: MARM ASCII Release 44,068 sl@0: MARM ASCII Debug 51,080 sl@0: sl@0: Tool change resulted in 18% code size reduction. Implementation sl@0: of indices and addition of new API has added an extra 9.5K. sl@0: sl@0: Debug MARM version for the first time included. sl@0: sl@0: 3. Indices are here! Single- and multi-column keys can be used to create sl@0: indices. Once created, all indices on a table will be updated when sl@0: the table has rows inserted, deleted or updated. sl@0: sl@0: RDbTable::SetIndex() (see below) allows direct index navigation of the sl@0: table record set. sl@0: sl@0: ORDER BY will work as long as the ordering matches an index, including sl@0: the text ordering (see 7 below) for text columns. "Matching" includes sl@0: reversing the index order and truncating a multi-key index to a sl@0: shorter sort-specification. sl@0: sl@0: 4. Following the spec meeting, the API has undergone some major work sl@0: detailed below. All the additions which have not been implemented sl@0: should still link OK, but the EXPORT_C'd stubs Panic at runtime with sl@0: EDbUnimplemented. sl@0: sl@0: 5. TDbCol attributes are now a member enumeration and the attributes sl@0: member name has been changed: sl@0: sl@0: KDbColNotNull is now TDbCol::ENotNull sl@0: KDbColAutoIncr is now TDbCol::EAutoIncrement sl@0: TDbCol::iColAtt is now TDbCol::iAttributes sl@0: sl@0: CDbColSet::New() has been withdrawn. sl@0: sl@0: 6. The TDbSortOrder enumeration is now a member of TDbKeyCol and the sl@0: sorting order member of TDbKeyCol has changed: sl@0: sl@0: TDbSortOrder is now TDbKeyCol::TOrder sl@0: EDbSortAsc is now TDbKeyCol::EAsc sl@0: EDbSortDesc is now TDBKeyCol::EDesc sl@0: sl@0: CDbKey::New() has been withdrawn. sl@0: CDbKey::Unique() is now CDbKey::IsUnique() sl@0: sl@0: 7. Enumeration TDbTextComparison has been introduced to specify how text sl@0: data is compared and ordered: sl@0: sl@0: EDbCompareNormal - use "binary" order sl@0: EDbCompareFolded - use folded order (case and accent insensitive) sl@0: EDbCompareCollated - use the locale collation order sl@0: sl@0: Where-ever SQL expressions are used in the API, a companion parameter sl@0: of this type is now required to specify how text columns in the query sl@0: are compared. This parameter is query-wide, and affects text columns sl@0: within a WHERE clause as well as those in an ORDER BY clause. sl@0: So the RDbView::Prepare(...) and Evaluate(...) members have been changed. sl@0: sl@0: This is also an attribute of an index key, specifying how the text sl@0: columns in the index are ordered. If a key has no text columns, this sl@0: attribute is ignored. Use the CDbKey::SetComparison() and sl@0: CDbKey::Comparison() members to set and test this attribute. sl@0: sl@0: 8. Row data in a rowset is not retrieved automatically anymore. sl@0: RDbRowSet::GetL() must be called before any column extraction can be sl@0: done without a Panic. RDbRowSet::UpdateL() does not require sl@0: the use of GetL() before or after it is called, the row is read as sl@0: part of the UpdateL(). If Cancel() is used after an UpdateL() or sl@0: InsertL(), then GetL() is required to re-retrieve the data for the sl@0: row previously in view. sl@0: sl@0: 9. A copy of the current row can be inserted into the rowset using sl@0: RDbRowSet::InsertCopyL(). This will provide new values for sl@0: auto-increment columns. For views with a projected column set, i.e. sl@0: those using a non trivial (*) select-list in the query, it is not sl@0: defined whether the un-viewed columns are copied or not. sl@0: sl@0: 10. RDbRowSet::Count() is now CountL(TAccuracy anAccuracy=EEnsure) sl@0: to reflect the fact that counting may not be a trivial operation sl@0: The default behaviour is to go to whatever lengths are required sl@0: to provide an exact count of the membership of the row set, this sl@0: can take an extended time to evaluate. sl@0: sl@0: If EQuick is passed as the accuracy parameter this member will sl@0: return a count only if it is immediately available, otherwise it sl@0: will return KDbUndefinedCount (-1). Not fully implemented. sl@0: sl@0: 11. For similar reasons RDbRowSet::IsEmpty() is now IsEmptyL() sl@0: This is not as hard to evaluate as the Count, but may still be a sl@0: non-trivial operation in some cases. sl@0: sl@0: 12. The rowset positioning operations have two new additions: sl@0: RDbRowSet::Beginning() and End() which are always available (hence no sl@0: trailingL). The positioning members are all implemented in terms of sl@0: RDbRowSet::GotoL(TDbPosition), which is also available for clients. sl@0: sl@0: RDbRowSet::FirstL(), LastL(), NextL() and PreviousL() now all return sl@0: TBool to indicate whether or not they are at a row. i.e. calling sl@0: RDbRowSet::AtRow() after a call to one of the above will return the sl@0: same value. sl@0: sl@0: You can write your loops in lots of ways now sl@0: sl@0: for (view.FirstL;view.AtRow();view.NextL()) sl@0: { sl@0: } sl@0: sl@0: or sl@0: sl@0: view.Beginning(); sl@0: while (view.NextL()) sl@0: { sl@0: } sl@0: sl@0: etc. sl@0: sl@0: 13. RDbTable provides the ability to view the records in named index order sl@0: using RDbTable::SetIndex(const TDesC& anIndex). Or back in default sl@0: order using RDbTable::SetNoIndex(). sl@0: sl@0: 14. RDbDatabase::PrepareCommit() and FinishCommit() withdrawn. Two phase sl@0: commit belongs to a different scale of database. sl@0: sl@0: 15. RDbDatabase::CreateTable(...,const CDbKey&) added to support sl@0: implementations which use a primary key in a table definition. The sl@0: Store database implementation will not support this. sl@0: sl@0: 16. RDbs and RDbsDatabase have been withdrawn. sl@0: sl@0: sl@0: The following changes have been made to the API, but are not yet implemented: sl@0: sl@0: 17. Bookmarks to reposition to a previously accessed row. Use them like this: sl@0: sl@0: TDbBookmark mark=view.Bookmark(); sl@0: // use the view to do something sl@0: view.GotoL(mark); sl@0: sl@0: 18. Searching across a rowset using: sl@0: sl@0: TInt RDbRowSet::FindL(TDirection,const TDesC&,TDbTextComparison) sl@0: sl@0: The matching constraint is defined by the search-condition part of a sl@0: SQL WHERE clause, i.e. "Name like '*john*'", passed as the second sl@0: parameter, the third parameter specifies the text comparison to use sl@0: (see 7 above). The first parameter is either EForwards or EBackwards sl@0: and specifies which direction the search should move through the row sl@0: set. The search always starts at the current record. The search sl@0: terminates when either: sl@0: a) a match is found and the number of records searched minus 1 is sl@0: returned (so if the current record matches the condition 0 is sl@0: returned) or sl@0: b) the end of the set is reached and KNotFound is returned sl@0: sl@0: The API also provides a way of testing a row against a given condition. sl@0: The condition is built into an RDbRowSet::RConstraint object and can sl@0: then be tested against individual rows using the RDbRowSet::MatchL() sl@0: member. As the constraint involves allocating resources it should be sl@0: closed when no longer required. sl@0: sl@0: 19. Incremental forms for RDbRowSet::Evaluate() sl@0: sl@0: All the incremental operations have a single basic function sl@0: TInt Next(TInt& aStep) // synchronous form sl@0: The integer aStep is decremented for each step, though it may be in sl@0: units > 1. When aStep reaches 0, the operation is complete. Some of sl@0: the operations' step-counts are very hard to predict, and so finish much sl@0: earlier than predicted. sl@0: sl@0: 20. Seeking within an index for a record which matches a specified key can sl@0: be achieved with RDbTable::SeekL(). The index used for the look up is sl@0: set using RDbTable::SetIndex() (see 13 above) and the key is specified sl@0: using the TDbSeekKey or TDbSeekMultiKey classes. The templated class sl@0: allows seeking with an index which has multiple key columns. Each key sl@0: value is added to the TDbSeekKey, and should match the column type in sl@0: the table. sl@0: sl@0: RDbTable::SeekL() also takes a parameter which specifies which record to sl@0: find in the index. If it succeeds in locating a record which matches the sl@0: key and comparison it returns true; otherwise the rowset is left in an sl@0: undefined position. sl@0: sl@0: 20. RDbDatabase::IsDamaged() and Recover() added to support recovery. sl@0: This is done on a opened database. When open IsDamaged() reports whether sl@0: the database requires recovery: if it is damaged then no other sl@0: operations can be performed on the database, and they will report the sl@0: error KErrCorrupt. sl@0: sl@0: 21. RDbDatabase::Compact() will compact an open database. It must not be sl@0: in use for anything else concurrently. sl@0: sl@0: 22. Incremental database operations are supported by the RDbDatabase::RState sl@0: class and those derived from it. sl@0: sl@0: Version 0.01.014 sl@0: ================ sl@0: (Made by AjT, 30 May 1996) sl@0: sl@0: 1) Uses E32/060, F32/024, STORE/015, E32TOOLS/028 sl@0: sl@0: 2) Binary compatible with build 013. sl@0: Making use of the -fcheck-new flag in MAKTRAN(028) sl@0: sl@0: 3) EDBMS.DLL build sizes: sl@0: sl@0: WINS Ascii Debug 93,696 sl@0: WINS Ascii Release 34,304 sl@0: sl@0: MARM Ascii Release 41,496 sl@0: sl@0: 4) Bugs fixed: sl@0: sl@0: MNT bug: failed to create an E32DATA directory, which is required sl@0: during EPOC32 startup! sl@0: sl@0: Clearing or rewriting a Long column while in an RDbRowSet::UpdateL sl@0: caused a USER panic. sl@0: sl@0: When updating a row, making columns smaller or setting them to sl@0: Null, could result in data on the end of the row being lost or sl@0: corrupted. sl@0: sl@0: 5) STORE 015 fixed the worst of the Rewritable file store problems. sl@0: sl@0: Version 0.01.013 sl@0: ================ sl@0: (Made by AndrewT, 24 May 1996) sl@0: sl@0: 1) Uses E32/059, F32/023. STORE/014, E32TOOLS/024 sl@0: sl@0: 2) EDBMS.DLL build sizes sl@0: sl@0: WINS Ascii Debug 93,696 sl@0: WINS Ascii Release 34,304 sl@0: sl@0: MARM Ascii Release 47,108 sl@0: sl@0: 3) The ODBC implementation has been removed from the release sl@0: sl@0: 4) Bugs fixed: sl@0: sl@0: Word swapping doubles was written without alignment in mind, caused sl@0: the rack to hang sometimes in RDbRowSet::PutL(). Fixed sl@0: sl@0: 5) New features: sl@0: sl@0: [NOT] LIKE in the search condition is now case-insensitive (using Folding); sl@0: The other comparison operators are (and will remain) case sensitive sl@0: sl@0: Select-lists are now supported: so sl@0: "select Name,Dept from Personnel where ID>3" sl@0: will now work. The columns in the RDbView are ordered exactly as in the sl@0: list in the SQl statement. sl@0: sl@0: 6) WARNING! sl@0: sl@0: A bug in CRewritableFileStore in STORE 014 means that once a sl@0: CRewritableFileStore file has been closed, opening and adding new streams sl@0: will make the last stream (by id) corrupt and the first one (by position) sl@0: invisible. This will also happen when more than 16 streams are created in a sl@0: newly created store. sl@0: Signs of corruption are duff stream data or non-exisitence of a stream when sl@0: reading, but may be hard to track down. sl@0: Opening a CRewritableFileStore for reading if no corruption has yet occured sl@0: is not a problem. sl@0: sl@0: This will affect databases in RewritableFileStores. sl@0: sl@0: 7) Due to dependence on STORE 014, which has changed the format of file store sl@0: headers, files written using DBMS(012)/STORE(013) are unreadable with sl@0: DBMS(013)/STORE(014) sl@0: sl@0: Version 0.01.012 sl@0: ================ sl@0: (Made by AndrewT, 13 May 1996) sl@0: sl@0: 1) Uses E32/059, F32/023. STORE/013, E32TOOLS/023 sl@0: sl@0: 2) EMARM build sizes from e32rom.log: sl@0: sl@0: Rom file size: 64K sl@0: Total Raw Data size: 43K sl@0: sl@0: 3) Bugs fixed: sl@0: sl@0: RDbRowSet::IsColNull(), ColSize() and ColLength() return as for a sl@0: NULL column when invoked on a Long column in a rowset which has not sl@0: had any other column evaluated. sl@0: sl@0: Various problems with recovery after errors when opening databases sl@0: or views. sl@0: sl@0: 4) New features: sl@0: sl@0: LongText8 columns can now be specified in the WHERE clause of a sl@0: query. sl@0: sl@0: Table names and columns sets are fully validated when a table is sl@0: created. sl@0: sl@0: Rows are fully validated before they are written to the table. sl@0: sl@0: 5) Data format has changed, so databases written with build 011 of sl@0: DBMS will fail to open correctly with this build. sl@0: sl@0: sl@0: Version 0.01.011 sl@0: ================ sl@0: (Made by AndrewT, 30 April 1996) sl@0: sl@0: 1) Uses E32/057, F32/021. STORE/012, E32TOOLS/021 sl@0: sl@0: 2) EMARM build sizes from e32rom.log: sl@0: sl@0: Rom file size: 64K sl@0: Total Raw Data size: 42K sl@0: sl@0: 3) Bugs fixes: sl@0: sl@0: E32 panic during cleanup if Store database open or creation failed. sl@0: sl@0: Deleting last row in a table generated an End-Of-File error. sl@0: sl@0: 4) API Changes: sl@0: sl@0: KNullColNo has become KDbNullColNo sl@0: sl@0: Added new member TDbColType RDbRowSet::ColType(TDbColNo) which just sl@0: reports the column type. sl@0: sl@0: In the RDbView::Prepare(), RDbView::Evalyate() and RDbTable::Open() sl@0: functions, the allowUpdates boolean flag has been replaced by an enum sl@0: RDbRowSet::TAccess, which takes one of the three values: sl@0: sl@0: EUpdatable: the default, rows can be read or written sl@0: EReadOnly: the rows can only be read, InsertL/DeleteL/UpdateL sl@0: will leave with KErrWrite sl@0: EInsertOnly: the rows can only be inserted. Any navigation sl@0: functions and DeleteL will leave with KErrWrite sl@0: sl@0: 5) Long columns are now length counted when written, so ColSize() and sl@0: ColLength() should report correctly. Only one column can be streamed sl@0: in at a time on a single rowset, and only one Long column can be sl@0: streamed out at a time. Column streams must be closed before setting sl@0: other columns, navigating, etc. on the rowset. sl@0: sl@0: 6) Search conditions are now supported in the query passed to sl@0: RDbView::Prepare() and RDbView::Evaluate(). sl@0: sl@0: See R:\DBMS\DSPEC\SQL.DOC for the supported grammar in search sl@0: conditions. Searching on date columns cannot be done currently as I sl@0: am waiting for TTime support for descriptors. sl@0: sl@0: sl@0: Version 0.01.010 sl@0: ================ sl@0: (Made by AndrewT, 22 April 1996) sl@0: sl@0: 1). Still uses E32/056, F32/020. STORE/011, E32TOOLS/019 sl@0: sl@0: 2) API changes: sl@0: sl@0: KDbUndefinedLength is used for TDbCol::iMaxLength to imply that no sl@0: maximum has been set, and also to report the RDbRow::ColSize() could sl@0: not be determined. sl@0: sl@0: KDbUndefinedCount is returned from RDbRowSet::Count() when the number of sl@0: rows cannot be determined sl@0: sl@0: Static member TBool TDbCol::IsLong(TDbColType) has been added for sl@0: convenience to test whether the column type is one of the "Long" types. sl@0: sl@0: CDbColSet and CDbKey are implemented using Packed arrays, and provide a sl@0: NewLC() member. sl@0: sl@0: TDbColSetIter has been introduced to provide simple, but fast forward sl@0: iteration over a column set. Use as: sl@0: sl@0: for (TDbColSetIter col(aColSet);col;++col) sl@0: { sl@0: if (col->iType==EDbColBit) sl@0: // etc. sl@0: } sl@0: sl@0: RDbRowSet has two new members sl@0: TInt ColCount() sl@0: TDbCol ColDef(TDbColNo) sl@0: These report the column definition on a column by column basis: ColSet() sl@0: and ColSetL() are now implemented in terms of these new members. sl@0: sl@0: 3) EDBMS (the real thing) now supports a Database-in-a-Store in Win32 sl@0: ASCII Debug & Release builds and the MARM ASCII Release. sl@0: sl@0: Supports Database creation/deletion within a Store. sl@0: Supported Table creation/dropping with all column types. Column sl@0: attributes (KDbColNotNUll and KDbColAutoIncr) are not supported. sl@0: Long columns cannot report their length yet. sl@0: RDbTables and whole-table views ("SELECT * FROM " exactly: no extra sl@0: spaces) are supported for Viewing, Adding, Editing and Deleting rows. sl@0: sl@0: Version 0.01.009 sl@0: ================ sl@0: (Made by AndrewT, 10 April 1996) sl@0: sl@0: 1). Uses E32/056, F32/020, STORE/011, E32TOOLS/019 sl@0: Reinstated F32 as a dependency, as STORE is dependant on it. sl@0: sl@0: 2). Fixed a few duff header dependencies in the test code. sl@0: sl@0: Version 0.01.008 sl@0: ================ sl@0: (Made by AndrewT, 29 March 1996) sl@0: sl@0: 1). Includes MARM releasables for the first time. The release components are sl@0: now called EWINS, EWINSDB and EMARM. EMARM is 8-bit release mode only. sl@0: sl@0: Uses E32/055, STORE/010 and E32TOOLS/017. sl@0: sl@0: 2). DBMS has been reorganised to prepare for the ODBC mock-up being phased out sl@0: and replaced by the Real Thing. A clean getsrc is required as a number of sl@0: files and directories are new or have been renamed. sl@0: sl@0: The ODBC implementation has been relegated to a set of DLLs of its own; sl@0: EODBC*.DLL, available for WINS only. To use ODBC, link against these, sl@0: rather than the standard EDBMS*.DLL ones. sl@0: DBMS test programs demonstrate one way of dealing with this situation. They sl@0: feature new Win32 ODBC Debug and Release configurations causing them to be sl@0: linked against the alternative libraries. sl@0: sl@0: 3). There is now a stream store-based flavour of database, as well as a sl@0: server-based one. EODBC*.DLLs export a mock-up of both flavours. sl@0: EDBMS*.DLLs, identical on WINS and ARM, do not export the server-based sl@0: database, and the store-based one currently exported will refuse to open, sl@0: leaving with KErrGeneral. sl@0: sl@0: Note that DBMS v1 will *not* include the DBMS server. sl@0: sl@0: 4). If you use the DDL pre-processor you should stick it in \tools using sl@0: "getrel dbms ddlpp ". The Custom-Build on Build/Settings in MSVC 4 sl@0: is dead handy for using this tool. See the T_DDL test program for details. sl@0: sl@0: 5). KDbMaxColumnLength is a const which specifies the maximum "MaxLength" that sl@0: can be used for EDbColText8, EDbColText16 and EDbColBinary columns. For the sl@0: text columns "Length" has the same meaning as for descriptors. sl@0: sl@0: 6). EDbColLongText8, EDbColLongText16, EDbColLongBinary are the Long column sl@0: types. They can only be read or written using the new stream column sl@0: accessors (see 7), the other SetColL() and ColXxx() members of RDbRowSet sl@0: will Panic. "Short" columns can be read but not written using the column sl@0: streams. "Short" text or binary columns can always be read directly using sl@0: the ColDes8/16() accessors. sl@0: sl@0: EDbLongText8 and EDbLongBinary have been implemented for ODBC. Unicode sl@0: columns are still unsupported. sl@0: sl@0: EDbColObject has been removed. sl@0: sl@0: 7). RDbColReadStream, RDbColWriteStream provide the stream interface to the Long sl@0: columns. Although 'MExternalizer's are in the RDbColWriteStream interface sl@0: they are not implemented at the moment. They require a RDbRowSet and a column sl@0: number to open: the row set must be positioned at a valid row for reading sl@0: and must be in insert/update mode for writing, as for the other column sl@0: accessors. sl@0: sl@0: 8). Two new members RDbRowSet::ColSize(), RDbRowSet::ColLength() provide size sl@0: information for the current row in the row set. ColSize() is the size in sl@0: bytes of the data available if streamed using RDbColReadStream. ColLength(), sl@0: in the spirit of TDesC::Length(), returns the number of "units" of data in sl@0: the column. For non text/binary columns this will be 0 or 1 indicating sl@0: whether the column is NULL or not, for text columns this returns the number sl@0: of characters available in the column, and for binary columns returns the sl@0: same value as the ColSize() member. sl@0: sl@0: If this cannot be evaluated -1 is returned; sl@0: sl@0: 9). RDbDatabase has lost the ability to Open/Create/etc. a database. sl@0: This functionality is now left to derived classes: sl@0: sl@0: RDbsDatabase provides what was lost from RDbDatabase. This (and RDbs) will sl@0: not be present in the MARM release. sl@0: sl@0: RDbStoreDatabase implements the new Open/Create protocol. CreateL returns sl@0: an Id for the database within the store, which is used by OpenL to reopen sl@0: the database on a later occasion. The Real Thing will require a Store sl@0: which supports ExtendL() and RStoreWriteStream::OpenL() (the only sl@0: persistent store which currently provides this is CRewritableFileStore). sl@0: This is supported by ODBC, but don't expect the database to be kept within sl@0: the Store itself, it is in fact somewhere in \E32DATA. sl@0: sl@0: 9). RDbDatabase::Destroy() destroys (deletes) the persistent database and sl@0: closes the RDbDatabase object. This provides for deletion of databases sl@0: created using RDbStoreDatabase sl@0: sl@0: sl@0: Version 0.01.007 sl@0: ================ sl@0: (Made by AndrewT, 4 March 1996) sl@0: sl@0: 1). Updated to E32:054 and F32:018 sl@0: sl@0: Version 0.01.006 sl@0: ================ sl@0: (Made by AndrewT, 30 January 1996) sl@0: sl@0: 1). Updated to E32:053 and F32:017 sl@0: sl@0: Version 0.01.005 sl@0: ================ sl@0: (Made by AndrewT, 18 January 1996) sl@0: sl@0: 1). Updated to E32:052 and F32:016 sl@0: sl@0: 1). Fixed a bug in TDbRow which meant that changing column data for sl@0: text columns would not always change the column data width. sl@0: sl@0: 2) Changed the accessors for the View. SetColL() does not have overloads sl@0: for 8 or 16 bit integers, The TInt, TInt32, TUint and TUint32 are sl@0: enough - (via ODBC we cannot provide range validation on shorter columns sl@0: due to its signed/unsigned incapabilities). sl@0: sl@0: Any integral column can be extracted using an accessor at least as wide sl@0: as the column definition: sl@0: sl@0: e.g. a Bit column can be extracted with ColUint8() ColUint16() or sl@0: ColUint32(), an Int16 column can be extracted with ColInt16() or sl@0: ColInt32() but not ColInt8() - even if the data is in range for this sl@0: extraction. sl@0: sl@0: Version 0.01.004 sl@0: ================ sl@0: (Made by AndrewT, 3 January 1996) sl@0: sl@0: 1). Updated to E32:051 and F32:015 sl@0: sl@0: 2). Now uses the new TTime and TDateTime classes. TSystemTime is no sl@0: longer supported. sl@0: sl@0: 3). The pre-processor has also been modified to handle the new TTime. sl@0: sl@0: Version 0.01.003 sl@0: ================ sl@0: (Made by AndrewT, 18 December 1995) sl@0: sl@0: 1). Updated to E32:050 and F32:014 sl@0: The new TBool has broken the SetColL() overloads for RDbRowSet. sl@0: The overload for TBool has been withdrawn for this release, pending a sl@0: rewrite of the set/get interface. sl@0: sl@0: Version 0.01.002 sl@0: ================ sl@0: (Made by AndrewT, 17 October 1995) sl@0: sl@0: 1). Updated to E32:047 and F32:011 sl@0: All functions which used to return TUints as counts or indices now return sl@0: TInts. Specifically RDbRowSet::Count() now returns -1 if it cannot determine sl@0: the actual count. sl@0: sl@0: 2). Fixed a bug in RDbRowSet::Prepare() to report an error on SQL syntax errors. sl@0: sl@0: Version 0.01.001 sl@0: ================ sl@0: (Made by GeertB, 29 August 1995) sl@0: sl@0: 1). First release. sl@0: sl@0: The main header file is D32DBMS.H. sl@0: sl@0: The header file D32ADT.H is for the use of implementers of DBMS file sl@0: organisations, "drivers" which are used by the DBMS. sl@0: sl@0: Implemented by passing all interesting operations on to Microsoft Access sl@0: through ODBC. sl@0: sl@0: Running programs linked against this release requires the installation of sl@0: 32-bit ODBC and the Access driver. This is done as follows: sl@0: sl@0: - shut down all applications (don't forget Office) sl@0: - run T:\ODBC\BIN32\ODBCAD32.EXE, the 32-bit ODBC Administrator sl@0: - in the resulting dialog, press "Drivers...", then "Add..." sl@0: - type T:\ODBC\BIN32 at the prompt (or use "Browse...") sl@0: - select "Microsoft Access Driver (*.mdb)" in the list that pops up sl@0: - press "OK" (or double click) sl@0: - file copying will start sl@0: - a message like the following will appear: "The file C:\WINNT35\SYSTEM32\ sl@0: MSVCRT20.DLL is currently in use and cannot be removed or updated. Try sl@0: closing all applications and choosing Retry. (...)" sl@0: Since it's the ODBC Administrator itself that is using the DLL, complying sl@0: won't help. Instead, choose "Ignore". sl@0: - if a message along the lines of "An error occurred while copying sl@0: C:\WINNT35\SYSTEM32\MFC30.DLL. Restart Windows and try installing again sl@0: (before running any applications which use ODBC)." appears, you've left an sl@0: application using MFC running. Start again from the top. sl@0: - the installer adds a data source called "sdk21-Access32". It can sl@0: safely be deleted. sl@0: - in the "Data Sources" dialog, create a data source by pressing "Add..." sl@0: - select the Access driver in the resulting dialog and press "OK" sl@0: - call the new data source "DBMS", leaving other fields blank. Choose "OK". sl@0: - close the ODBC Administrator sl@0: - in case you haven't copied the new (MSVC 2.1) MSVCRT20.DLL from T:\MSVC21\ sl@0: SYSTEM32 yet, do so now. The Access ODBC driver needs the newer version. sl@0: See the instructions in the E32 0.01.039 release notes. sl@0: sl@0: Warning: on one NT machine, the driver setup program erroneously copied the sl@0: Windows 95 version of CTL3D32.DLL. If this happens, applications--notably sl@0: MSVC--may start complaining about it. The fix is to copy T:\ODBC\REDIST32\ sl@0: WINNT\CTL3D32.DLL into your SYSTEM32 directory. sl@0: sl@0: 2). Unicode builds are not supported. ODBC understands only 8-bit text. sl@0: Support for the 8-bit subset of the Unicode character set can be added sl@0: fairly trivially if it turns out to be needed during the life time of this sl@0: implementation. sl@0: sl@0: 3). The initial revision of a tool to help in building programs to run against sl@0: the DBMS is included. It is called DDLPP.EXE and it takes a simple data sl@0: definition language as its input and generates C++ headers and source code. sl@0: See R:\DBMS\DSDK\DDLPP.HLP for more information. sl@0: It is less than perfect as a command line tool at the moment. sl@0: Comments and feedback welcome. sl@0: sl@0: 4). No interpretation of ODBC status codes. In case of an ODBC error, sl@0: KErrGeneral is returned. sl@0: sl@0: 5). RDbViews and RDbTables become unusable when the transaction they were sl@0: created in ends. Currently, if you don't start a transaction using sl@0: RDbDatabase::Begin(), one is implicitly entered for you, and committed sl@0: on RDbRowSet::Put(). Thus the row set is effectively closed after the sl@0: first database modification. sl@0: The workaround is to use explicit transactions. sl@0: sl@0: 6). RDbView::Define() is not implemented, and will in all likelihood be sl@0: withdrawn in a future release. sl@0: sl@0: 7). The Access driver does not accurately report the number of rows in the sl@0: result set. As a result, RDbRowSet::Count() returns KMaxTUint in the sl@0: majority of cases. sl@0: In general, Count() is an expensive operation and should not be used sl@0: lightly. sl@0: sl@0: 8). No interpretation of ODBC status codes. In case of an ODBC error, sl@0: KErrGeneral is returned. sl@0: sl@0: 9). Bit columns (EDbColBit) cannot be NULL. sl@0: sl@0: 10). Text columns (EDbColText8) are currently limited to 255 characters. sl@0: sl@0: 11). Binary column extraction (EDbColBinary) is limited to the first 2K of the sl@0: data. sl@0: sl@0: 12). TUint32 column accessor functions cannot be used at the moment due to an sl@0: overload ambiguity with TSystemTime. sl@0: sl@0: 13). The full range of the unsigned integer column types is not available. sl@0: Values are constrained to the range of the corresponding signed types. sl@0: sl@0: 14). The Access driver does not support NOT NULL columns. sl@0: RDbDatabase::CreateTable() does accept KDbColNotNull columns but cannot sl@0: enforce it. sl@0: sl@0: 15). RDbDatabase::AlterTable() is not currently implemented. sl@0: sl@0: NOTES sl@0: ===== sl@0: sl@0: The DBMS's requirements are currently undergoing extensive revision, due to sl@0: changes in ERA's overall strategy for persistent storage. This may result in a sl@0: number of changes to the API. sl@0: