persistentstorage/dbms/group/RELEASE.TXT
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     1 Version 1.05(063)
       
     2 =================
       
     3 (Made by Mark Cawston on 23 November 2001)
       
     4 
       
     5 Dependencies
       
     6 
       
     7 Built against Hurricane Release build 00629
       
     8 
       
     9 Defects fixed : DON-587EA3 (Corrupted Cdbv2.dat prevents device from booting)
       
    10 
       
    11 Testing
       
    12 
       
    13 automatic F32tests run on MINT UDEB, UREL, WINS UDEB.
       
    14 
       
    15 Version 1.05(062)
       
    16 =================
       
    17 (Made by Mark Cawston on 23 November 2001)
       
    18 
       
    19 Dependencies
       
    20 
       
    21 Built against GT6.2 Release build 00558
       
    22 
       
    23 Building
       
    24 
       
    25 Use bldmake and abld
       
    26 
       
    27 Testing
       
    28 
       
    29 Tests modified to verify defects fixed T_BENCH, T_COMP tested on WINS UDEB and
       
    30 MISA ARM4 (Assabet) UDEB.
       
    31 
       
    32 Defects fixed
       
    33 
       
    34 Hurricane : ROS-534E69: DBMS should use CleanupArrayDeletePushL()
       
    35 
       
    36 Version 1.05(061)
       
    37 =================
       
    38 (Made by Mark Dowman on 26 July 2000)
       
    39 
       
    40 Dependencies
       
    41 
       
    42 Built against GT6.0 Release build 00039
       
    43 
       
    44 Building
       
    45 
       
    46 Use bldmake and abld
       
    47 
       
    48 Testing
       
    49 
       
    50 Tests modified to verify defects fixed. T_DBMS, T_DBS, T_SQL and T_TRANS passed on WINS UDEB and ARM4(BRUTUS) UDEB.
       
    51 
       
    52 Defects fixed
       
    53 
       
    54 ER6.0 : EDNATHE-4MCL2K: RDbDatabase::IsDamaged() always false after opening database.
       
    55 ER6.0 : EDNPHAR-4L4KY2: DBMS access violation when sending a fax.
       
    56 
       
    57 Version 1.05(060)
       
    58 =================
       
    59 (Made by Andrew Thoelke on 20 May 1999)
       
    60 
       
    61 For EPOC Release 5 Unicode
       
    62 MSVC++ 6.0 compatible source only release
       
    63 
       
    64 Dependencies
       
    65 
       
    66 This release has been built against Baseline 0801
       
    67 
       
    68 Building
       
    69 
       
    70 Use bldmake, etc.
       
    71 
       
    72 Testing
       
    73 
       
    74 Tests added to verify defect fixes. All tests passed on WINS UREL, WINS UDEB, ARM ROM 306
       
    75 
       
    76 Changes
       
    77 
       
    78 RDbs::Version() now reports "1.05(060)"
       
    79 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.
       
    80 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.
       
    81 
       
    82 Defects fixed
       
    83 
       
    84 ER5:EDNBBAR-463J5D: Concurrent server start-up does not panic and hang the second client attempting to connect.
       
    85 ER5:EDNATHE-48AEZW: Automatic cursor recovery after row deletion is now much more capable than previously.
       
    86 ER5U:EDNATHE-497KWW: Explicitly load 16-bit values using 8-bit reads to prevent incorrect use of half-word load instructions.
       
    87 
       
    88  
       
    89 Version 1.05(058)
       
    90 =================
       
    91 (Made by Andrew Thoelke on 20 May 1999)
       
    92 
       
    93 EPOC Release 5u baseline component
       
    94 
       
    95 Dependencies
       
    96 
       
    97 This release was built with
       
    98      Tools: E32TOOLS 120, E32TOOLP 107
       
    99 Components: E32 185, F32 145, STORE 062
       
   100 
       
   101 Building
       
   102 
       
   103 Mostly standard EBLD syntax supported. Invoking EBLD without parameters gives usage information
       
   104 
       
   105 Release components
       
   106 
       
   107 All 4 build variants have been released.
       
   108 
       
   109 Testing
       
   110 
       
   111 No testing has been done
       
   112 
       
   113 Changes
       
   114 
       
   115 RDbs::Version() now reports "1.05(058)"
       
   116 The DATAZIP tool has been removed - it was not supported for Unicode data documents in any case
       
   117 
       
   118  
       
   119 Version 1.05(057)
       
   120 =================
       
   121 (Made by Andrew Thoelke on 15 January 1999)
       
   122 
       
   123 EPOC Release 5 candidate component
       
   124 
       
   125 Dependencies
       
   126 
       
   127 This release was built with
       
   128      Tools: E32TOOLS 095, E32TOOLP 098
       
   129 Components: E32 158, F32 124, STORE 051
       
   130 
       
   131 Binary Compatibility
       
   132 
       
   133 Fully binary compatible with 054-6
       
   134 
       
   135 Building
       
   136 
       
   137 Mostly standard EBLD syntax supported. Invoking EBLD without parameters gives usage information
       
   138 
       
   139 Release components
       
   140 
       
   141 All 8 build variants have been released.
       
   142 MARM ASCII release build EDBMS.DLL + EDBSRV.EXE is 130,276 + 496 bytes (127.7K) in ROM
       
   143 To install DBMS for MARM:
       
   144 	edbms.dll : install to \System\Libs\
       
   145 	edbsrv.exe: install to \System\Programs\
       
   146 
       
   147 Known problems
       
   148 
       
   149 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
       
   150 
       
   151 Testing
       
   152 
       
   153 Test code amended and extended to verify the defect fixes. All test code passes on all platforms.
       
   154 
       
   155 Changes
       
   156 
       
   157 RDbs::Version() now reports "1.05(057)"
       
   158 
       
   159 Defects Fixed
       
   160 
       
   161 590829: CDbTableDatabase::CheckIdle() no longer causes an access violation if the table collection is modified while it iterates across the tables.
       
   162 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.
       
   163 
       
   164  
       
   165 Version 1.05(056)
       
   166 =================
       
   167 (Made by Andrew Thoelke on 5 January 1999)
       
   168 
       
   169 EPOC Release 5 candidate component
       
   170 
       
   171 Dependencies
       
   172 
       
   173 This release was built with
       
   174      Tools: E32TOOLS 095, E32TOOLP 098
       
   175 Components: E32 158, F32 124, STORE 051
       
   176 
       
   177 Binary Compatibility
       
   178 
       
   179 Fully binary compatible with 054-5
       
   180 
       
   181 Building
       
   182 
       
   183 Mostly standard EBLD syntax supported. Invoking EBLD without parameters gives usage information
       
   184 
       
   185 Release components
       
   186 
       
   187 All 8 build variants have been released.
       
   188 MARM ASCII release build EDBMS.DLL + EDBSRV.EXE is 130,280 + 496 bytes (127.7K) in ROM
       
   189 To install DBMS for MARM:
       
   190 	edbms.dll : install to \System\Libs\
       
   191 	edbsrv.exe: install to \System\Programs\
       
   192 
       
   193 Known problems
       
   194 
       
   195 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
       
   196 
       
   197 Testing
       
   198 
       
   199 Test code amended and extended to verify the defect fixes. All test code passes on all platforms.
       
   200 
       
   201 Changes
       
   202 
       
   203 RDbs::Version() now reports "1.05(056)"
       
   204 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
       
   205 
       
   206 Defects Fixed
       
   207 
       
   208 632258: RDbNamedDatabase::Create() will now only delete the file on cleanup if it created the file, and not delete an existing file
       
   209 
       
   210  
       
   211 Version 1.05(055)
       
   212 =================
       
   213 (Made by Andrew Thoelke on 9 December 1998)
       
   214 
       
   215 EPOC Release 5 candidate component
       
   216 
       
   217 Dependencies
       
   218 
       
   219 This release was built with
       
   220      Tools: E32TOOLS 095, E32TOOLP 098
       
   221 Components: E32 156, F32 122, STORE 051
       
   222 
       
   223 Binary Compatibility
       
   224 
       
   225 Fully binary compatible with 054
       
   226 
       
   227 Building
       
   228 
       
   229 Mostly standard EBLD syntax supported. Invoking EBLD without parameters gives usage information
       
   230 
       
   231 Release components
       
   232 
       
   233 All 8 build variants have been released.
       
   234 MARM ASCII release build EDBMS.DLL + EDBSRV.EXE is 130,288 + 496 bytes (127.7K) in ROM
       
   235 To install DBMS for MARM:
       
   236 	edbms.dll : install to \System\Libs\
       
   237 	edbsrv.exe: install to \System\Programs\
       
   238 
       
   239 Known problems
       
   240 
       
   241 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
       
   242 
       
   243 Testing
       
   244 
       
   245 Test code amended and extended to verify the defect fixes. All test code passes on all platforms.
       
   246 
       
   247 Changes
       
   248 
       
   249 RDbs::Version() now reports "1.05(055)"
       
   250 
       
   251 Defects Fixed
       
   252 
       
   253 SW1-488	Regression from 043: deleting a row can cause an access	violation. A simple fix added and tested by T_BIG.
       
   254 Rebuilt with MSVC++ 5.0 Service Pack 3 to ensure good WINS release builds.
       
   255 Boiler-plated the source code using the SysDoc tool.
       
   256 
       
   257  
       
   258 Version 1.05(054)
       
   259 =================
       
   260 (Made by Andrew Thoelke on 16th November, 1998)
       
   261 
       
   262 This is an EPOC Release 5 component.
       
   263 
       
   264 
       
   265 Dependencies
       
   266 
       
   267 The requires EPOC Release 5 components to build and run. This release
       
   268 was built with
       
   269 
       
   270      Tools: E32TOOLS 095, E32TOOLP 097
       
   271 Components: E32 156, F32 122, STORE 050
       
   272 
       
   273 
       
   274 Binary Compatibility
       
   275 
       
   276 Backwards binary compatible with 053
       
   277 RDbNotifier::Notify() has changed names, making this release source
       
   278 incompatible, and RDbNotifer has gained a new export (see Changes).
       
   279 
       
   280 
       
   281 Building
       
   282 
       
   283 Mostly standard EBLD syntax supported. Invoking EBLD without parameters
       
   284 gives usage information
       
   285 
       
   286 
       
   287 Release components
       
   288 
       
   289 All 8 build variants have been released.
       
   290 MARM ASCII release build EDBMS.DLL + EDBSRV.EXE is 130,280 + 496 bytes
       
   291 (127.7K) in ROM
       
   292 
       
   293 To install DBMS for MARM:
       
   294 	edbms.dll : install to \System\Libs\
       
   295 	edbsrv.exe: install to \System\Programs\
       
   296 
       
   297 For ROM building, edbsrv.exe should be marked as a FIXED process, the
       
   298 process priority has yet to be specified.
       
   299 
       
   300 DBMS can be successfully installed an run from C: (RAM drive) on a
       
   301 EPOC Release 5 ROM
       
   302 
       
   303 
       
   304 Known problems
       
   305 
       
   306 DATAZIP will not work on new unicode database documents, as it does not
       
   307 recognise the new Data App UID. This tool is likely to be migrated out
       
   308 of DBMS in the near future
       
   309 
       
   310 
       
   311 Testing
       
   312 
       
   313 Test code amended and extended to verify the defect fixes and changes.
       
   314 All platforms have been fully tested.
       
   315 
       
   316 
       
   317 Changes
       
   318 
       
   319 RDbs::Version() now reports "1.05(054)"
       
   320 
       
   321 The notification interface of RDbNotifer has changed:
       
   322 *	Notify() has been renamed to NotifyUnlock(), inidicating that all
       
   323 	events are reported, including "unlock" events.
       
   324 *	A new request NotifyChange() has been added which only completes
       
   325 	when a change event (all except unlock) occurs on the database.
       
   326 Note that change events occuring between notifier completion and making a
       
   327 new request will not be missed (as they are in 053), see the fix for
       
   328 SW1-334 below.
       
   329 
       
   330 
       
   331 Defects Fixed
       
   332 
       
   333 Defects are from EPOC Software Defects.
       
   334 
       
   335 SW1-320	File and Path not found errors are now returned by
       
   336 	RDbNamedDatabase::Open() when appropriate.
       
   337 
       
   338 SW1-326	Attempting to read Long columns can return KErrAccessDenied if
       
   339 	compaction or statistics update is in progress in the same
       
   340 	client. 053 only reported this if a different client was
       
   341 	compacting, but panic'd if it was the same client.
       
   342 
       
   343 SW1-334	Database "change" events which occur after a request is completed
       
   344 	are now stored by the notifier and reported immediately when the
       
   345 	next notification request is made. Only the most significant event
       
   346 	is stored, following this ordering:
       
   347 
       
   348 		Recover > Rollback > Commit
       
   349 
       
   350 	The more "significant" events have a larger impact on client views.
       
   351 
       
   352 
       
   353  
       
   354 Version 1.05(053)
       
   355 =================
       
   356 (Made by Andrew Thoelke on 28th October, 1998)
       
   357 
       
   358 This is a beta EPOC Release 5 component.
       
   359 
       
   360 
       
   361 Dependencies
       
   362 
       
   363 The requires EPOC Release 5 compatibility components to build and run
       
   364 
       
   365      Tools: E32TOOLS 095, E32TOOLP 096
       
   366 Components: E32 156, F32 122, STORE 050
       
   367 
       
   368 
       
   369 Binary Compatibility
       
   370 
       
   371 Only WINS REL, MARM REL and MARM DEB releases are fully binary compatible
       
   372 with 052
       
   373 
       
   374 WINS DEB is now BC with WINS REL
       
   375 WINS UREL is BC with WINS UDEB
       
   376 MARM UREL is BC with MARM UDEB
       
   377 
       
   378 
       
   379 Building
       
   380 
       
   381 Mostly standard EBLD syntax supported. Invoking EBLD without parameters
       
   382 gives usage information
       
   383 
       
   384 
       
   385 Release components
       
   386 
       
   387 All 8 build variants have been released.
       
   388 MARM ASCII release build EDBMS.DLL + EDBSRV.EXE is 130,020 + 496 bytes
       
   389 (127.5K) in ROM
       
   390 
       
   391 To install DBMS for MARM:
       
   392 	edbms.dll : install to \System\Libs\
       
   393 	edbsrv.exe: install to \System\Programs\
       
   394 
       
   395 For ROM building, edbsrv.exe should be marked as a FIXED process, the
       
   396 process priority has yet to be specified.
       
   397 
       
   398 DBMS can be successfully installed an run from C: (RAM drive) on a
       
   399 EPOC Release 4 ROM
       
   400 
       
   401 
       
   402 Known problems
       
   403 
       
   404 DATAZIP will not work on new unicode database documents, as it does not
       
   405 recognise the new Data App UID at the moment. This will be remedied once
       
   406 the new unicode Data app UID is available.
       
   407 
       
   408 
       
   409 Testing
       
   410 
       
   411 All platforms have been fully tested.
       
   412 
       
   413 
       
   414 Changes
       
   415 
       
   416 1.	RDbs::Version() now reports "1.05(053)"
       
   417 
       
   418 2.	New UIDs allocated for Unicode:
       
   419 		0x10003B0E: Unicode EDBMS.DLL
       
   420 		0x10003B0F: KDbmsDriverUid16
       
   421 
       
   422 
       
   423 
       
   424 Version 1.05(052)
       
   425 =================
       
   426 (Made by Andrew Thoelke on 13th October, 1998)
       
   427 
       
   428 This is a beta EPOC Release 5 component.
       
   429 
       
   430 
       
   431 Dependencies
       
   432 
       
   433 This component requires at least EPOC Release 4 in order to be built and
       
   434 run.
       
   435 Components required: E32 144, F32 115, STORE 049
       
   436 Tools: E32TOOLS 095, E32TOOLP 093
       
   437 
       
   438 
       
   439 Binary Compatibility
       
   440 
       
   441 This release is fully backwards binary compatible with DBMS 051.
       
   442 
       
   443 However, internal changes mean that different versions of DBMS 050+ in ROM
       
   444 and RAM can cause problems.
       
   445 
       
   446 DBMS 052 adds three more exports to the client interface, to support
       
   447 enquiry of database properties such as size and usage.
       
   448 
       
   449 
       
   450 Building
       
   451 
       
   452 WINS components were built using MSVC++ 5.0, hence the debugging databases
       
   453 are incompatible with previous versions of MSDev.
       
   454 
       
   455 Command-line building now uses the "EBLD" syntax. Invoking EBLD from the
       
   456 GROUP sub-project will provide usage information. All MNT verbs which
       
   457 could previously be used for building have been removed.
       
   458 
       
   459 EBLD TOOL ... is used to build the tools
       
   460 
       
   461 
       
   462 Release components
       
   463 
       
   464 All 8 build variants have been released.
       
   465 MARM ASCII release build EDBMS.DLL + EDBSRV.EXE is 130,020 + 496 bytes
       
   466 (127.5K) in ROM
       
   467 
       
   468 To install DBMS 052 for MARM:
       
   469 	edbms.dll : install to \System\Libs\
       
   470 	edbsrv.exe: install to \System\Programs\
       
   471 
       
   472 For ROM building, edbsrv.exe should be marked as a FIXED process, the
       
   473 process priority has yet to be specified.
       
   474 
       
   475 DBMS 052 can be successfully installed an run from C: (RAM drive) on a
       
   476 EPOC Release 4 ROM
       
   477 
       
   478 
       
   479 Testing
       
   480 
       
   481 All platforms have been fully tested.
       
   482 
       
   483 A new SQL-script test program has been added, and further SQL scripts are
       
   484 planned to validate the query analysis and evaluation engine.
       
   485 
       
   486 
       
   487 Changes
       
   488 
       
   489 1.	RDbs::Version() now reports "1.05(052)"
       
   490 
       
   491 2.	To complement database compaction, a query function which returns
       
   492 	the database size and usage has been added: RDbDatabase::Size().
       
   493 	This returns a structure containing the database size (in bytes)
       
   494 	and the usage (in percent). A value <0 indiciates an inability to
       
   495 	evaluate the property, this may be because the database does not
       
   496 	support the query (such as RDbStoreDatabase), or because the value
       
   497 	is not immediately available. For hard-to-compute values (like
       
   498 	usage) this function will return a cached value, these "stats" can
       
   499 	be updated by calling RDbDatabase::UpdateStats() (which may be
       
   500 	long-running) or using the incremental version
       
   501 	RDbIncremental::UpdateStats(TInt&).
       
   502 
       
   503 3.	RDbNotifier's can now also be opened on a client-side database:
       
   504 	attempting this operation with build 050 or 051 panic'd. The
       
   505 	current implementation only supports a single notifier for a
       
   506 	client-side database, but continues to support any number of
       
   507 	notifiers opened on a client-server database.
       
   508 
       
   509 4.	SQL Query optimisation has arrived. No longer is there only one
       
   510 	way to evaluate a query, DBMS 052 will now make use of indexes to
       
   511 	optimise query evaluation. The implications for database design
       
   512 	(what to index) and access (undefined behaviour) are significant.
       
   513 
       
   514 4.1.	Indexes may be used to evaluate the WHERE clause, the ORDER BY
       
   515 	clause, or both. Pre DBMS 051 the exact method of evaluating a
       
   516 	query was well defined, and could be relied on: e.g. an ORDER BY
       
   517 	clause had to be evluated with an index, and WHERE clause was done
       
   518 	on-the-fly; the TDbWindow paramater to RDbView::Prepare() was
       
   519 	followed precisely. This can no longer be relied on in the
       
   520 	presence of indexes.
       
   521 
       
   522 4.2.	If a window is requested, the rowset is guaranteed to use one: but
       
   523 	a window'd View may be provided for a request which did not
       
   524 	specify one, because that may be the only (or best) way to
       
   525 	evaluate the query. This implies that Views must be Evaluate()'d
       
   526 	after preparation, and they may behave differently if this or
       
   527 	another view updates the underlying table.
       
   528 
       
   529 4.3.	An ORDER BY clause may be evaluated without an index (even if an
       
   530 	appropriate one is available), in which case none of the rows will
       
   531 	appear in the view until they have all been evaluated. So the "get
       
   532 	results as they come in" approach used in the Data application
       
   533 	will not look as cool--however, the results might appear 10 times
       
   534 	faster to make up for this.
       
   535 
       
   536 4.4.	Table rowsets continue to have the same behaviour as before.
       
   537 
       
   538 5.	The server, DBMS drivers and open tables are now held in a expiry
       
   539 	cache when they are no longer "in use", and discarded after a
       
   540 	short time if not re-used. This significantly improves performance
       
   541 	in situations where these objects are repeatedly opened and closed.
       
   542 
       
   543 6.	Cluster caching is now dynamically increased when it would benefit
       
   544 	access performance.
       
   545 
       
   546 7.	RDbRowSet::CountL() and RDbRowSet::FindL() are implemented one
       
   547 	layer "deeper" allowing the server implementation to improve their
       
   548 	performance by an order of magnitude.
       
   549 
       
   550 8.	All references to "Library" and "ISAM" are now "Driver". DBMS
       
   551 	driver extensions will have the extension .dbx.
       
   552 
       
   553 
       
   554 Defects fixed
       
   555 
       
   556 Defect numbers refer to the EPOC Software Defects database
       
   557 
       
   558 SW1-183: Null columns do not always return zero values (as spec'd by the
       
   559 	SDK). The row buffer code has been adapted to do the right thing
       
   560 	for all null columns. Test code amended to verify this in the
       
   561 	"problem" cases.
       
   562 
       
   563 SW1-225: An emulator-only defect where the server thread was being
       
   564 	cleaned up by the OS because of incorrect ownership. Test code
       
   565 	amended to verify this fix.
       
   566 
       
   567 *	It was possible to set up a database state combining a transaction
       
   568 	and long column access, that caused STORE to panic on rollback:
       
   569 	this was not ideal for client-side access, but deadly for
       
   570 	client-server access as it killed the server. The transaction
       
   571 	locking system has now added transient read-locks for long column
       
   572 	access to prevent this state. However, this may now cause a
       
   573 	RDbColReadStream::Open() call to fail with "KErrLocked" if
       
   574 	another client holds an exclusive lock on the database (e.g. they
       
   575 	are updating a table, or compacting...). This can be handled
       
   576 	earlier by using a transaction to enclose the read, in which case
       
   577 	Begin() may fail with KErrLocked.
       
   578 
       
   579 
       
   580 
       
   581 
       
   582 Version 1.03.051
       
   583 ================
       
   584 (Made by AjThoelke, 28 August 1998)
       
   585 
       
   586 This is an alpha EPOC Release 5 component.
       
   587 
       
   588 
       
   589 Dependencies
       
   590 
       
   591 This component ideally requires at least EPOC Release 4 in order to be built
       
   592 and run.
       
   593 Components required: E32 143, F32 115, STORE 049
       
   594 Tools: E32TOOLS 094, E32TOOLP 093
       
   595 
       
   596 
       
   597 Binary Compatibility
       
   598 
       
   599 This release is fully backwards binary compatible with DBMS 043
       
   600 This release is backwards source compatible with DBMS 050
       
   601 
       
   602 DBMS now has the full E5 API, having now added support for data modification
       
   603 SQL statements. Hopefully this API will not be changed in future E5 releases.
       
   604 
       
   605 The SQL execution has changed from 050, although the new API remains source
       
   606 (but not binary) compatible,.
       
   607 
       
   608 
       
   609 Building
       
   610 
       
   611  Binaries: From the BMAKE sub-project invoke the BLD batch file
       
   612     Tools: From the TOOLS sub-project invoke the BLD batch file
       
   613 
       
   614 
       
   615 Release components
       
   616 
       
   617 All 8 build variants have been released.
       
   618 MARM ASCII release build EDBMS.DLL is 120,732 bytes (117.9K) in ROM
       
   619 
       
   620 To install DBMS 051 for MARM:
       
   621 	edbms.dll : install to \System\Libs\
       
   622 	edbsrv.exe: install to \System\Programs\
       
   623 
       
   624 For ROM building, edbsrv.exe should be marked as a FIXED process, the process
       
   625 priority has yet to be specified.
       
   626 
       
   627 DBMS 051 can be successfully installed an run from C: on a EPOC Release 4 ROM
       
   628 
       
   629 
       
   630 Testing
       
   631 
       
   632 All platforms have been fully tested.
       
   633 
       
   634 Note that some of the new functionality requires new test code to be written
       
   635 to ensure it's correctness--this work is planned for the next release.
       
   636 
       
   637 
       
   638 Defects fixed
       
   639 
       
   640 Defect numbers refer to the EPOC Software Defects database
       
   641 
       
   642 *	SW1-65: DBMS 051 should be MSVC 5.0 friendly
       
   643 
       
   644 *	SW1-71: Function renamed to RDbs::ResourceCount()
       
   645 
       
   646 *	SW1-173: LIKE '*?a?*' could fail to match rows that it should, this has
       
   647 	been remedied
       
   648 
       
   649 *	Faulting previously correct SQL due to the additon of reserved keywords
       
   650 	is not really backwards compatible, and this restriction is now lifted.
       
   651 	Tables,	indexes and columns can be named after SQL keywords. This is not,
       
   652 	however, recommended if you want to remain forwards compatible with 043.
       
   653 
       
   654 *	SQL create-table-statements could contain invalid data types and cause
       
   655 	unexpected things to happen: e.g. "UNSIGNED BINARY" was not flagged as
       
   656 	an error.
       
   657 
       
   658 *	If the last record in a partially evaluated view was deleted and further
       
   659 	evaluation generated more rows, the cursor put itself into an
       
   660 	inconsistent state, often resulting in a panic. This situation is now
       
   661 	detected and dealt with correctly.
       
   662 
       
   663 
       
   664 Changes and additions
       
   665 
       
   666 A full explanation of the API changes can be found in "r:\dbms\dsdk\api.doc",
       
   667 and the SQL grammar is described in "r:\dbms\dsdk\sql.doc".
       
   668 
       
   669 *	ORDER BY clauses in RDbView queries can now be evaluated without
       
   670 	requiring the support of an index (hooray!). In fact, it is now
       
   671 	recommended that you do _not_ create indexes for the sole purpose of
       
   672 	evaluating an ORDER BY clause: they are slower and bigger, particularly
       
   673 	for text keys. More detail on those issues in the next release...
       
   674 
       
   675 *	RDbDatabase::Execute() now supports DML as well as DDL statements.
       
   676 	(see api.doc and sql.doc for details)
       
   677 
       
   678 *	Added class RDbUpdate to incrementally execute data modification SQL
       
   679 	statements. (see api.doc)
       
   680 
       
   681 *	Started caching tables which have been opened, but are no longer used
       
   682 	by any cursor, until the current transaction completes. This
       
   683 	particularly improves performance of multiple SQL insert-statements
       
   684 	run inside a transaction, as well as removing a nearly-silent-failure
       
   685 	mode from the transaction system.
       
   686 
       
   687 *	Major reworking of the SQL engine involving:
       
   688 
       
   689 *	Rewrite of the lexer, removing most dependencies on TLex and TChar
       
   690 	for performance reasons. TChar functions are only used for non-ASCII
       
   691 	characters encountered in identifiers or spaces. TLex is only used
       
   692 	for lexing floating point numbers. Keyword identification now uses a
       
   693 	case-insensitive comparison, rather than folding.
       
   694 
       
   695 *	Literal values are managed and converted by a single class
       
   696 
       
   697 *	Added support for DML statements to the parser
       
   698 
       
   699 *	Access plan generation has been moved into a new class, in preparation
       
   700 	for query optimization in the next release.
       
   701 
       
   702 
       
   703 
       
   704 Version 1.02.050
       
   705 ================
       
   706 (Made by AjThoelke, 7 May 1998)
       
   707 
       
   708 
       
   709 Binary Compatibility
       
   710 
       
   711 This release is fully backwards binary compatible with DBMS 043.
       
   712 
       
   713 The new API in this release of DBMS is NOT frozen at present, and it has
       
   714 beta status. It is liable to be changed in incompatible ways in the next
       
   715 release.
       
   716 
       
   717 Additionally, some of the functionality in 043 has been enhanced, so code
       
   718 which relies on the new behaviour will fail when used with 043.
       
   719 
       
   720 
       
   721 Build
       
   722 
       
   723 E32 release 126, for debug/release compatibility and Security framework
       
   724 F32 release 095
       
   725 STORE release 048, for RSecureStorePagePool and assertion fix
       
   726 E32TOOLS 089
       
   727 
       
   728 ARM narrow release size is 111,364 bytes (108.8K), as reported from ROMBUILD.
       
   729 
       
   730 *	Reorganised the source code, SQL classes are now in sub-project USQL
       
   731 
       
   732 *	Added two new source directories for the DBMS server: SDBMS contains all
       
   733 	classes which are built into EDBMS.DLL, SEXE contains the code for the
       
   734 	server process MARM executable.
       
   735 
       
   736 
       
   737 Release
       
   738 
       
   739 *	All MARM binaries have been validated
       
   740 
       
   741 *	All test code has been run against compatible platforms
       
   742 
       
   743 *	The build number has been bumped just in case a small incremental release
       
   744 	based on 043 is required for EPOC release 4 (e.g. for a bug fix). 050 is
       
   745 	not ready for platform release.
       
   746 
       
   747 *	MARM now releases an executable as well as a DLL. EDBSRV.EXE should go
       
   748 	in \system\programs and is required if and only if client/server DBMS is
       
   749 	used. WINS does not have any additional objects
       
   750 
       
   751 
       
   752 Defects fixed
       
   753 
       
   754 *	Obscure "phantom row" defect, discovered during code review.
       
   755 	If a row is deleted through rowset A, and then rowset B deletes what would
       
   756 	be the next record for rowset A; then NextL() on rowset A would fail to
       
   757 	move to the next record after that, resulting in a KErrNotFound error on
       
   758 	a subsequent GetL() on rowset A. NextL() now checks for this state and
       
   759 	navigates correctly
       
   760 
       
   761 *	LIKE '?' fails to match a text column containing a single character.
       
   762 	Certain patterns in an SQL like-predicate failed to match when they
       
   763 	should. The patterns which would failed are characterised by ending in
       
   764 	one or more '?' followed by zero or more '*', as long as the '?'s were
       
   765 	not preceeded by a regular character. e.g.
       
   766 		'?' would not match any single character string
       
   767 		'?*' would only match strings of length >=2 rather than	>=1
       
   768 
       
   769 
       
   770 Changes and additions
       
   771 
       
   772 These release notes contain just the highlights of the changes made to DBMS.
       
   773 The document "r:\dbms\dsdk\api.doc" provides more detail on the new API	and
       
   774 behaviour of shared databases.
       
   775 
       
   776 *	RDbs is the client session handle for sharing databases through the DBMS
       
   777 	server. It provides resource checking and heap failure tools
       
   778 
       
   779 *	RDbNamedDatabase provide the generic mechanism for instantiating a
       
   780 	database, by providing a name and a format-spec. Databases can be opened
       
   781 	client-side for exclusive write access or shared read-only access, or
       
   782 	through the DBMS server for shared write access.
       
   783 
       
   784 *	RDbNotifier provides change notification for shared databases. They can
       
   785 	only be opened on a database which has been opened using the DBMS server
       
   786 
       
   787 *	RDbDatabase::Begin() now returns a TInt error code. For client databases
       
   788 	this is garaunteed to be KErrNone (thus ensuring B.C.), but a client-server
       
   789 	database may return KErrLocked if another client has locked the database
       
   790 
       
   791 *	A single transaction can share DDL operations and DML operations. Any
       
   792 	affected rowsets which are open when a DDL operation is begun will be
       
   793 	invalidated, and if the DDL operation is rolled back all rowsets are
       
   794 	invalidated. In this state, most operations on the rowset result in a
       
   795 	KErrDisconnected error, and the rowset has to be Close()'d--it cannot
       
   796 	be Reset()
       
   797 
       
   798 *	RDbDatabase::Compact() and RDbIncremental::Compact() provide a way to
       
   799 	compact a database. This can be used for RDbStoreDatabase's as an
       
   800 	alternative	to the compaction functions available on CStreamStore. These
       
   801 	will fail if anyone has an outstanding transaction (including the caller)
       
   802 
       
   803 *	RDbDatabase::Execute() and RDbIncrmental::Execute() can execute DDL SQL
       
   804 	statements. See	"r:\dbms\dsdk\sql.doc" for the SQL syntax of these
       
   805 	statements.
       
   806 
       
   807 	*** If your databases contain tables, indexes or columns which use an SQL
       
   808 	keyword for their name: then any SQL passed to DBMS 050, including
       
   809 	RDbView::Prepare(), can fail with KErrArgument. The list SQL reserved
       
   810 	words is also in the document.
       
   811 
       
   812 *	Relaxed	constraints on getting and setting integral columns on a rowset
       
   813 	and also for specifying integral key values in a TDbSeekKey. These are
       
   814 	primarily provided to ease the implementation of non-C++ interfaces to
       
   815 	DBMS, note that utilising the new functionality will panic'd on DBMS 043.
       
   816 
       
   817 
       
   818 Test code
       
   819 
       
   820 *	Revised the current test code to use and test the new API for database
       
   821 	instantiation and DDL SQL, and also to test dynamic binding of the DBMS
       
   822 	driver library
       
   823 
       
   824 *	Added a new test program to test database sharing
       
   825 
       
   826 
       
   827 Version 1.02.043
       
   828 ================
       
   829 (Made by AjThoelke, 30 March 1998)
       
   830 
       
   831 Binary Compatibility
       
   832 
       
   833 This release is fully backwards and forwards binary compatible with DBMS 042.
       
   834 
       
   835 Build
       
   836 
       
   837 E32 release 125, for debug/release compatibility and Security framework
       
   838 F32 release 095
       
   839 STORE release 047, for RSecureStorePagePool
       
   840 E32TOOLS 089
       
   841 
       
   842 ARM narrow release size is 81964 bytes (80.0K), as reported from ROMBUILD.
       
   843 
       
   844 Fixed
       
   845 
       
   846 1.	The compressor could generate an invalid compressed database due to
       
   847 	faulty analysis of the database data. The data written is subtly
       
   848 	different to the original database, so analysis for the encoding should
       
   849 	take place on the data that is written, not on the data that is read:
       
   850 	which is what DBMS 042 was doing.
       
   851 	
       
   852 	This has been fixed: compression is now a little slower, and DBMS is
       
   853 	.5K smaller.
       
   854 
       
   855 
       
   856 Version 1.02.042
       
   857 ================
       
   858 (Made by AjThoelke, 18 March 1998)
       
   859 
       
   860 Binary Compatibility
       
   861 
       
   862 With the exception of compressed databases, this release is fully backwards and
       
   863 forwards binary compatible with DBMS 041.
       
   864 
       
   865 The compression format has changed slightly, resulting in a data incompatibility
       
   866 for compressed databases between 041 and 042. You must use DBMS 042 to compress
       
   867 databases for use with this release.
       
   868 
       
   869 Build
       
   870 
       
   871 E32 release 125, for debug/release compatibility and Security framework
       
   872 F32 release 095
       
   873 STORE release 047, for RSecureStorePagePool
       
   874 E32TOOLS 089
       
   875 
       
   876 ARM narrow release size is 82448 bytes (80.5K), as reported from ROMBUILD.
       
   877 
       
   878 Changes
       
   879 
       
   880 1.	The compression format has been changed to provide a larger look-back
       
   881 	for better compression of long streams; and now uses a stream terminator
       
   882 	resulting in faster decompression code.
       
   883 
       
   884 
       
   885 Version 1.02.041
       
   886 ================
       
   887 (Made by AjThoelke, 13 March 1998)
       
   888 
       
   889 Binary Compatibility
       
   890 
       
   891 Fully backwards and forwards binary compatible with DBMS 040
       
   892 
       
   893 Build
       
   894 
       
   895 E32 release 125, for debug/release compatibility and Security framework
       
   896 F32 release 095
       
   897 STORE release 047, for RSecureStorePagePool
       
   898 E32TOOLS 089
       
   899 
       
   900 ARM narrow release size is 82524 bytes (80.6K), as reported from ROMBUILD.
       
   901 
       
   902 Fixed
       
   903 
       
   904 1.	Compression failed for databases which had no LongText or LongBinary
       
   905 	data. The huffman code generator could not cope with a no-data
       
   906 	situation. This has been fixed so that non-encodings are supported.
       
   907 
       
   908 2.	Some code slipped out of 040 which ensures that enforces the read-only
       
   909 	nature of a compressed database. Otherwise the database could be
       
   910 	modified and left in a corrupt and unreadable state.
       
   911 
       
   912 3.	Reduced the memory requirements for compression by a factor of 4 or
       
   913 	more for databases with large streams.
       
   914 
       
   915 
       
   916 Version 1.02.040
       
   917 ================
       
   918 (Made by AjThoelke, 6 March 1998)
       
   919 
       
   920 Binary Compatibility
       
   921 
       
   922 Fully backwards binary compatible with DBMS 039
       
   923 Forwards compatible with 039 if you do not use either of the two new exports:
       
   924 
       
   925 	RDbStoreDatabase::CompressL(CStreamStore&,TStreamId);
       
   926 	RDbStoreDatabase::DecompressL(CStreamStore&,TStreamId);
       
   927 
       
   928 in d32dbms.h. (See below)
       
   929 
       
   930 Build
       
   931 
       
   932 E32 release 125, for debug/release compatibility and Security framework
       
   933 F32 release 095
       
   934 STORE release 047, for RSecureStorePagePool
       
   935 E32TOOLS 089
       
   936 
       
   937 ARM narrow release size is 82384 bytes (80.5K), as reported from ROMBUILD.
       
   938 
       
   939 Fixed
       
   940 
       
   941 1.	Writing to a LongText column using the WriteL(RReadStream&,TInt)
       
   942 	overload can result in an incorrect column size being stored in the row.
       
   943 	This defect has only been introduced in 039, and was not present before
       
   944 	that release.
       
   945 	This has been fixed, and test code has been changed to test the
       
   946 	behaviour of stream-to-stream writing to LongText columns.
       
   947 
       
   948 New stuff
       
   949 
       
   950 1.	Provided primarily to support compression of help files in ROM...
       
   951 	Store databases can be compressed[1]. These new static functions of
       
   952 	RDbStoreDatabase
       
   953 
       
   954 	CompressL(CStreamStore&,TStreamId)
       
   955 	DecompressL(CStreamStore&,TStreamId)
       
   956 
       
   957 	convert a (non-encrypted) database from normal to compressed form and
       
   958 	back again.
       
   959 
       
   960 	These functions operate synchronously, and can take an extended time to
       
   961 	complete[2]. On return the database is not open, and the store file
       
   962 	should be CompactL()'d and CommitL()'d after compression or
       
   963 	decompression is successful. If they fail, the database will be in its
       
   964 	previous state, i.e. the database is still good.
       
   965 
       
   966 	Index data cannot be compressed (unfortunately).
       
   967 
       
   968 	Once compressed the database is read-only, but otherwise operates as
       
   969 	normal: the data is decompressed on the fly as required.
       
   970 
       
   971 	I have included the compression code on MARM (4.5K of ROM) as this
       
   972 	might prove useful, although it is less aggressive when compressing
       
   973 	than the WINS/WINC code. The resulting database is about 7% larger
       
   974 	but takes half the time to compress. Compression requires quite a bit of
       
   975 	memory.
       
   976 
       
   977 	[1] Test on help files show compression ratios between 2.5:1 and 4:1
       
   978 	[2] e.g. the Series5 help file (343K) takes 10 seconds to compress on
       
   979 	an E32 125 ROM.
       
   980 
       
   981 2.	A new releasable TOOLS contains a WINC\REL executable DataZip.exe which
       
   982 	can compress a Data Document (including help files). This has the same
       
   983 	EPOC dependencies as DBMS 040 (of course).
       
   984 
       
   985 	To run this program you need to have E32 WINC 125+, F32 WINC 095+, STORE
       
   986 	WINS 047+, DBMS WINS 040+ and DataZip all in the same directory. The
       
   987 	source and target file names for the program must be specified in full
       
   988 	due to a limitation of WINC at present
       
   989 
       
   990 	
       
   991 Version 1.02.039
       
   992 ================
       
   993 (Made by AjThoelke, 19 February 1998)
       
   994 
       
   995 Binary Compatibility
       
   996 
       
   997 Only the client API (d32dbms.h) in MARM REL, WINS REL and WINS DEB builds
       
   998 remains binary compatible with DBMS 038.
       
   999 
       
  1000 *	This is the first release to support unicode properly, in particular,
       
  1001 	the unicode releases are not BC with the 038 pre-release.
       
  1002 
       
  1003 *	MARM Debug builds have broken BC in order to become BC with the
       
  1004 	release build, enabling debug/release component mix'n'match.
       
  1005 
       
  1006 *	In order to enable client-server and future extensions to DBMS, the
       
  1007 	implementors' interface has been thoroughly broken. This interface is
       
  1008 	described by d32dbas.h, d32rec.h and d32table.h; it has never been
       
  1009 	documented and will no longer be supported by DBMS. These header files
       
  1010 	have been withdrawn until Akula completes its changes to this API.
       
  1011 
       
  1012 *	The client interface, described by d32dbms.h, is completely backwards
       
  1013 	binary compatible with 038, adding some new functionality in the shape
       
  1014 	of secure databases (see below).
       
  1015 
       
  1016 If you are building a release/debug compatible component you must use at least
       
  1017 E32 125, F32 95, STORE 047 and DBMS 039.
       
  1018 
       
  1019 Build
       
  1020 
       
  1021 E32 release 125, for debug/release compatibility and Security framework
       
  1022 F32 release 095
       
  1023 STORE release 047, for RSecureStorePagePool
       
  1024 E32TOOLS 089
       
  1025 
       
  1026 ARM narrow release size is 75920 bytes (74.1K), as reported from ROMBUILD.
       
  1027 
       
  1028 MAKMAKE is now used throughout DBMS. The new BMAKE directory contains the batch
       
  1029 file (bld.bat), makefiles and mmp files to build DBMS. BWINS and BMARM now just
       
  1030 contain the export definitions files.
       
  1031 
       
  1032 DBMS can still be built using the mnt verbs, or by invoking BLD in the BMAKE
       
  1033 directory. Invoking BLD without parameters gives the basic syntax used.
       
  1034 
       
  1035 Test code is built either in each test code sub-project using bld.bat or the
       
  1036 makefile, or using mnt.cmd from the group as before to build all test code.
       
  1037 
       
  1038 Fixed
       
  1039 
       
  1040 1.	SW1-792: Following DeleteL() on a filtered rowset, the cursor now
       
  1041 	correctly determines the NextL() row in the set.
       
  1042 
       
  1043 2.	Loopholes in the LongText column streaming code allowed clever, but
       
  1044 	incorrect, things to be done with text-only columns (such as embedded
       
  1045 	stores etc.). These columns might now be encrypted, and so do not
       
  1046 	support seeking or combined read and write: so this condition is
       
  1047 	asserted. LongText streams should only ever stream text in or out,
       
  1048 	LongBinary columns must be used for embedding stores.
       
  1049 
       
  1050 
       
  1051 3.	An SQL view which had a comparison operator on a long unicode column
       
  1052 	could be evaluated incorrectly due to a /2 error in a length
       
  1053 	calculation. This has been fixed.
       
  1054 
       
  1055 4.	The SQL parser could fail in new ways in Unicode (such as OOM) when
       
  1056 	parsing numeric values. The parser was re-engineered to correctly report
       
  1057 	the real error code, instead of reporting a generic error
       
  1058 	(KErrArgument).
       
  1059 
       
  1060 5.	RDbTable::SeekL(), when looking up a unicode column key would not use
       
  1061 	the whole key value given (another divide-by-2 error). Fixed.
       
  1062 
       
  1063 Changes and additions
       
  1064 
       
  1065 1.	Unicode is here (properly this time). Test code has been modified to run
       
  1066 	in unicode builds. Missing LongText16 functionality has been
       
  1067 	implemented, and a couple of unicode column flaws have been fixed.
       
  1068 
       
  1069 2.	LongText16 columns could not be used in LIKE predicates in SQL. The
       
  1070 	required classes and code has been implemented to match the 8-bit code.
       
  1071 
       
  1072 3.	Long column optimizations have been overhauled to allow many more than
       
  1073 	previously (the limit has been rasied from 32 to 504, if there are no
       
  1074 	other columns). To reduce memory consumption when large numbers of long
       
  1075 	columns are used, the row buffer is now sized dynamically; are whereas
       
  1076 	the RDbRowSet::SetColL() members may have left with KErrTooBig, they can
       
  1077 	now fail with KErrNoMemory if the buffer cannot be expanded. Overall
       
  1078 	this may reduce the memory requirements for using DBMS.
       
  1079 
       
  1080 4.	AlterTable() has some added powers. As long as the respective columns
       
  1081 	are not indexed, it now possible to increase the maximum length of
       
  1082 	Text8, Text16 and Binary columns--up to their maximum of 255 bytes--or
       
  1083 	to change such a column into its respective long type. The reverse is
       
  1084 	not allowed (shortening a Text column or changing LongText->Text).
       
  1085 	
       
  1086 	Changing the maximum length of a column in a StoreDatabase does not
       
  1087 	require the table to be	re-written, and so is a quick operation.
       
  1088 	Changing the column type does require the entire table to be re-written
       
  1089 	and so can take an extended time to complete.
       
  1090 
       
  1091 5.	Encrypted databases are also now available (thanks to an addition to the
       
  1092 	security framework in the Base). The database is encrypted by a key it
       
  1093 	generates itself, access to this key is protected by encryption and
       
  1094 	decryption keys provided by clients. This allows a client to change the
       
  1095 	user password (for example) without requiring the entire database to be
       
  1096 	re-encrypted. For this reason it is not possible to turn a secure
       
  1097 	database into a plain-text database and vice-versa: this can only be
       
  1098 	done by copying the data from one database to another. It is worth noting
       
  1099 	that encrypting a database does have an impact on performance.
       
  1100 
       
  1101 	The three new API functions:
       
  1102 
       
  1103 	RDbStoreDatabase::CreateL(CStreamStore*,CSecurityEncryptBase*)
       
  1104 
       
  1105 	This creates a secure version of the store database. It cannot be read
       
  1106 	using DBMS 038 or earlier (it will fail with KErrNotSupported). The
       
  1107 	second parameter is an encryption object (such as returned from
       
  1108 	CSecurityBase::NewEncryptL) which is used to create authentication
       
  1109 	data in the database. The key object is deleted by this function.
       
  1110 
       
  1111 	A matching CSecurityDecryptBase object (i.e. same key, same algorithm)
       
  1112 	must be provided to allow access to the database at any later stage.
       
  1113 	
       
  1114 	RDbStoreDatabase::OpenL(CStreamStore*,TStreamId,CSecurityDecryptBase*)
       
  1115 
       
  1116 	This is the secure version of opening a store database. The supplied
       
  1117 	decryption key will be authenticated first before the database is
       
  1118 	opened. It should match the Encryption key used to create the database,
       
  1119 	or the last security change. The key object is deleted by this function.
       
  1120 
       
  1121 	If the key fails to access the database this fails with KErrGeneral.
       
  1122 	If the database is not encrypted this fails with KErrArgument.
       
  1123 	If the database is encrypted using an unknown algorithm this fails with
       
  1124 	KErrNotSupported.
       
  1125 	
       
  1126 	RDbDatabase::ChangeSecurity(CSecurityDecryptBase*,CSecurityEncryptBase*)
       
  1127 
       
  1128 	This is used to change the access key for the database. The first
       
  1129 	parameter is the current decryption key, which is authenticated (just as
       
  1130 	for opening a database); the second parameter is the new encryption key,
       
  1131 	used to re-encrypt the authentication data. Both keys are deleted by
       
  1132 	this function.
       
  1133 
       
  1134 	If the database is not encrypted this fails with KErrArgument.
       
  1135 	If the key fails to access the database this fails with KErrGeneral.
       
  1136 	
       
  1137 6.	Cluster (records) caching has been changed to provide caching for
       
  1138 	multiple record-clusters, paving the way for more efficient multiple
       
  1139 	client access.
       
  1140 
       
  1141 7.	Internal column sets are now crossed indexed by name, making table
       
  1142 	creation and alteration, and view preparation faster when tha table has
       
  1143 	a large number of columns. Creating tables up the the record limits is
       
  1144 	quite acceptably fast now.
       
  1145 
       
  1146 8.	Took the opportunity presented by losing back-end API compatibility to
       
  1147 	rectify one or two design flaws in the implementation classes, and begin
       
  1148 	the work on turning it into a dynamically loaded generic-database
       
  1149 	framework.
       
  1150 
       
  1151 
       
  1152 Version 1.01.038
       
  1153 ================
       
  1154 (Made by AjThoelke, 16 October 1997)
       
  1155 
       
  1156 1.	Built using Platform 001 releases of E32, F32 and STORE; used E32TOOLS/067
       
  1157 
       
  1158 	Only debug binaries have been modified by this release.
       
  1159 	
       
  1160 	Size of EDBMS.DLL
       
  1161 
       
  1162 	WINS ASCII Release      66,560 bytes (65.0K)
       
  1163 	WINS ASCII Debug        -
       
  1164 	MARM ASCII Release      68,748 bytes (67.1K)	(ROMBUILD)
       
  1165 	MARM ASCII Debug        82,076 bytes (80.2K)	(ROMBUILD)
       
  1166 
       
  1167 2.	Fixed SW1-393 as described. Change T_INDEX to check the assertion.
       
  1168 
       
  1169 
       
  1170 Version 1.00.037
       
  1171 ================
       
  1172 (Made by Geert, 2 June 1997)
       
  1173 
       
  1174 1.	Built using Platform 001 releases of E32, F32 and STORE; used E32TOOLS/067
       
  1175 
       
  1176 	Size of EDBMS.DLL
       
  1177 
       
  1178 	WINS ASCII Release      66,560 bytes (65.0K)
       
  1179 	WINS ASCII Debug        -
       
  1180 	MARM ASCII Release      68,748 bytes (67.1K)	(ROMBUILD)
       
  1181 	MARM ASCII Debug        82,076 bytes (80.2K)	(ROMBUILD)
       
  1182 
       
  1183 2.	Fixed SW3-1060 as described.
       
  1184 
       
  1185 
       
  1186 Version 1.00.036
       
  1187 ================
       
  1188 (Made by AjThoelke, 28 May 1997)
       
  1189 
       
  1190 1.	Built using Platform 001 releases of E32, F32 and STORE; used E32TOOLS/067
       
  1191 
       
  1192 	Size of EDBMS.DLL
       
  1193 
       
  1194 	WINS ASCII Release      66,560 bytes (65.0K)
       
  1195 	WINS ASCII Debug        -
       
  1196 	MARM ASCII Release      68,732 bytes (67.1K)	(ROMBUILD)
       
  1197 	MARM ASCII Debug        82,060 bytes (80.1K)	(ROMBUILD)
       
  1198 
       
  1199 2.	Fixed MNT VALID: needed -e32 in pediff command line.
       
  1200 
       
  1201 
       
  1202 Version 1.00.035
       
  1203 ================
       
  1204 (Made by AjThoelke, 19 May 1997)
       
  1205 
       
  1206 Build
       
  1207 
       
  1208 	Built using Platform releases of E32, F32 and STORE; used E32TOOLS/066
       
  1209 
       
  1210 	Size of EDBMS.DLL
       
  1211 
       
  1212 	WINS ASCII Release      66,560 bytes (65.0K)
       
  1213 	WINS ASCII Debug        -
       
  1214 	MARM ASCII Release      68,732 bytes (67.1K)	(ROMBUILD)
       
  1215 	MARM ASCII Debug        82,060 bytes (80.1K)	(ROMBUILD)
       
  1216 
       
  1217 Binary Compatibility
       
  1218 
       
  1219 	Fully binary compatible with Platform release 034.
       
  1220 
       
  1221 	Four reserved virtual functions on the CDbDatabase and CDbCursor classes
       
  1222 	defined in d32dbas.h were incorrectly declared as public. These now have
       
  1223 	private access. The only real changes required to the releasables was new
       
  1224 	WINS import libraries.
       
  1225 
       
  1226 	Nobody should have got anywhere near calling these exports, but they
       
  1227 	have been made private to protect against anyone doing so "by accident".
       
  1228 	You should not be building against this release: use the platform
       
  1229 	version 034.
       
  1230 
       
  1231 Changes
       
  1232 
       
  1233 1.	Removed Name builds from the BWINS project make file.
       
  1234 
       
  1235 2.	Added map files to MARM releaseables
       
  1236 
       
  1237 Differences from 034:
       
  1238 
       
  1239 
       
  1240 Version 0.06.034
       
  1241 ================
       
  1242 (Made by AjThoelke, 17 April 1997)
       
  1243 
       
  1244 1.	Uses E32/098, F32/068, STORE/042, E32TOOLS/063
       
  1245 
       
  1246 	Binary compatible with 033.
       
  1247 	File compatible with 033.
       
  1248 
       
  1249 	Build sizes for EDBMS[D].DLL
       
  1250 
       
  1251 	WINS ASCII Release      66,560 bytes (65.0K)
       
  1252 	WINS ASCII Debug        -
       
  1253 	MARM ASCII Release      68,732 bytes (67.1K)	(ROMBUILD)
       
  1254 	MARM ASCII Debug        82,060 bytes (80.1K)
       
  1255 
       
  1256 2.	New Uid scheme adopted for MARM releasables. For MARM, requires
       
  1257 	E32 098 for anything other than narrow release.
       
  1258 
       
  1259 3.	Fixed SW-3494. Calling RDbRowSet::Cancel() before the database had
       
  1260 	actually been modified when in a real transaction left the transaction
       
  1261 	machinery in an invalid state. This has been cured.
       
  1262 
       
  1263 
       
  1264 Version 0.06.033
       
  1265 ================
       
  1266 (Made by AjThoelke, 11 April 1997)
       
  1267 
       
  1268 1.	Uses E32/097, F32/067, STORE/041, E32TOOLS/060
       
  1269 
       
  1270 2.	Binary incompatible with 032.
       
  1271 	File compatible with 032.
       
  1272 
       
  1273 3.	Build (ROM) sizes for EDBMS[D].DLL
       
  1274 
       
  1275 	WINS ASCII Release      66,560 bytes (65.0K)
       
  1276 	WINS ASCII Debug        -
       
  1277 	MARM ASCII Release      68,728 bytes (67.1K)	(ROMBUILD)
       
  1278 	MARM ASCII Debug        82,056 bytes (80.1K)
       
  1279 
       
  1280 4.	Full Binary compatibility review complete. API is now frozen.
       
  1281 
       
  1282 	Adjusted exports to provide a full implementation API, for potential
       
  1283 	other implementations of the client API.
       
  1284 
       
  1285 	Added some reserved virtual space onto the DBMS implementation framework
       
  1286 	for future development.
       
  1287 
       
  1288 
       
  1289 Version 0.06.032
       
  1290 ================
       
  1291 (Made by AjThoelke, 10 April 1997)
       
  1292 
       
  1293 1.	Uses E32/096, F32/066, STORE/040, E32TOOLS/060
       
  1294 
       
  1295 2.	Binary compatible with 031. File compatible with 031.
       
  1296 
       
  1297 3.	Build (ROM) sizes for EDBMS[D].DLL
       
  1298 
       
  1299 	WINS ASCII Release      66,048 bytes (64.5K)
       
  1300 	WINS ASCII Debug        -
       
  1301 	MARM ASCII Release      68,580 bytes (66.9K)	(ROMBUILD)
       
  1302 	MARM ASCII Debug        81,824 bytes (79.9K)
       
  1303 
       
  1304 4.	Fixed a bug when evaluating unrestricted views (no WHERE clause): a
       
  1305 	single evaluation step was doing full evaulation, rather than a bite-
       
  1306 	size chunk.
       
  1307 
       
  1308 5.	MARM releasables are now pre-PETRAN'd. Obey file uids are history.
       
  1309 
       
  1310 
       
  1311 Version 0.05.031
       
  1312 ================
       
  1313 (Made by AjT, 21 February 1997)
       
  1314 
       
  1315 1.	Uses E32/089, F32/055, STORE/036, E32TOOLS/051
       
  1316 
       
  1317 2.	Binary compatible with 030. File compatible with 030.
       
  1318 
       
  1319 3.	Build (ROM) sizes for EDBMS[D].DLL
       
  1320 
       
  1321 	WINS ASCII Release      66,048 bytes (64.5K)
       
  1322 	WINS ASCII Debug        -
       
  1323 	MARM ASCII Release      68,584 bytes (66.9K)
       
  1324 	MARM ASCII Debug        81,832 bytes (79.9K)
       
  1325 
       
  1326 4.	API tweaklet. TDbSeekKey::Add() members now return a reference to
       
  1327 	the seek key, to assist in construction of multi-column keys. This
       
  1328 	is similar to the CDbColSet::AddL() and CDbKey::AddL() functions.
       
  1329 
       
  1330 	e.g.
       
  1331 
       
  1332 	TDbSeekMultiKey<3> key;
       
  1333 	key.Add(value1).Add(_L("value2")).Add(value3);
       
  1334 	table.SeekL(key);
       
  1335 
       
  1336 	This change does not affect binary compatibility.
       
  1337 
       
  1338 
       
  1339 Version 0.05.030
       
  1340 ================
       
  1341 (Made by AjT, 3 February 1997)
       
  1342 
       
  1343 1.	Uses E32/086, F32/050, STORE/035, E32TOOLS/051
       
  1344 
       
  1345 2.	Binary compatible with 029.
       
  1346 	This is the B5 release.
       
  1347 
       
  1348 3.	Build (ROM) sizes for EDBMS[D].DLL
       
  1349 
       
  1350 	WINS ASCII Release      66,048 bytes (64.5K)
       
  1351 	WINS ASCII Debug        -
       
  1352 	MARM ASCII Release      68,520 bytes (67.0K)
       
  1353 	MARM ASCII Debug        81,768 bytes (79.9K)
       
  1354 
       
  1355 4.	API tweaklet. In the process of documentation, I discovered that two
       
  1356 	inline functions on RDbRowSet, Beginning() and End() can leave if
       
  1357 	the rowset was specified to have insert-only access. I have put an
       
  1358 	L onto the end of these inline functions, which will not break any
       
  1359 	binary compatibility, but might affect program logic.
       
  1360 
       
  1361 	If the rowset is read-only or updatable (the default) then these
       
  1362 	functions are guaranteed not to leave.
       
  1363 
       
  1364 4.	Fixed a bug in RDbRowSet::DeleteL(). It was not reporting any errors,
       
  1365 	even when there was one. Error propagation has been reinstated.
       
  1366 
       
  1367 5.	Fixed two bugs to do with synchronising mutliple rowsets during
       
  1368 	concurrent updates to the same table.
       
  1369 
       
  1370 
       
  1371 Version 0.05.029
       
  1372 ================
       
  1373 (Made by AjT, 21st January 1997)
       
  1374 
       
  1375 1.	Uses E32/085, F32/049, STORE/033, E32TOOLS/050
       
  1376 
       
  1377 2.	Binary incompatible with any predecessor.
       
  1378 
       
  1379 3.	Build (ROM) sizes for EDBMS[D].DLL
       
  1380 
       
  1381 	WINS ASCII Release      66,048 bytes (64.5K)
       
  1382 	WINS ASCII Debug        -
       
  1383 	MARM ASCII Release      68,448 bytes (66.8K)
       
  1384 	MARM ASCII Debug        81,628 bytes (79.7K)
       
  1385 
       
  1386 4.	The code for parsing text into TTime has been passed on to the base,
       
  1387 	knocking 3.5K off the DLL.
       
  1388 
       
  1389 5.	Fixed an SQL bug: Strings in SQL could not have embedded quote
       
  1390 	characters (').	This can now be done by using two adjacent quote
       
  1391 	characters.
       
  1392 
       
  1393 
       
  1394 Version 0.04.028
       
  1395 ================
       
  1396 (Made by AjT, 4th December 1996)
       
  1397 
       
  1398 1.	Uses E32/076, F32/042, STORE/031, E32TOOLS/048
       
  1399 
       
  1400 2.	Minor version number set to 4. This is the B4 release
       
  1401 
       
  1402 3.	Binary incompatible with any predecessor.
       
  1403 	File compatibility has been completely broken again. This should be the
       
  1404 	last time.
       
  1405 
       
  1406 4.	Build sizes for EDBMS[D].DLL
       
  1407 
       
  1408 	WINS ASCII Release      68,096 bytes (66.5K)
       
  1409 	WINS ASCII Debug        -
       
  1410 	MARM ASCII Release      71,268 bytes (69.6K)
       
  1411 	MARM ASCII Debug        84,608 bytes (82.6K)
       
  1412 
       
  1413 5.	The embedded class RDbRowSet::RConstraint has been unembedded, and is now
       
  1414 	RDbRowConstraint, it's behaviour is unchanged.
       
  1415 
       
  1416 6.	The class RDbDatabase::RIncremental and its derived classes have been
       
  1417 	turned into a single unembedded class RDbIncremental. Instead of
       
  1418 	constructing the class required for the operation (RDbDatabase::RCreateIndex
       
  1419 	for example) and then invoking the Open() member, you now construct an
       
  1420 	instance of RDbIncremental, and invoke the required member (CreateIndex()
       
  1421 	for the above operation). Otherwise the behaviour of incremental operations
       
  1422 	is unchanged.
       
  1423 
       
  1424 7.	RDbRowSet::ColSet() has been dropped, only the leaving version ColSetL()
       
  1425 	remains.
       
  1426 
       
  1427 8.	A const KDbUnlimitedWindow has been introduced, this is a TDbWindow
       
  1428 	constructed to represent an unlimited window.
       
  1429 
       
  1430 9.	RDbDatabase::IsDamaged() and RDbDatabase::InTransaction() are now const
       
  1431 	members
       
  1432 
       
  1433 10.	The test to date/time conversion has been temporarily adopted by DBMS.
       
  1434 	search-conditions in WHERE clauses for view preparation, or row
       
  1435 	constraints can now contain comparisons with DateTime columns. The literal
       
  1436 	date should be specified by enclosing it in '#'s, e.g.
       
  1437 
       
  1438 	SELECT * FROM EMPLOYEES WHERE START_DATE >= #1 Jan 1996#
       
  1439 
       
  1440 11.	DBMS RXxx objects previously would automatically close if opened/prepared
       
  1441 	before being explicitly closed. This functionality has been removed: DBMS
       
  1442 	handles now behave like F32 handles.
       
  1443 
       
  1444 12.	All KErrDoesNotExist errors have been replaced by KErrNotFound
       
  1445 
       
  1446 13.	Attempting to use a database/rowset between a failure and a transaction
       
  1447 	Rollback (or rowset Cancel) now results in the error KErrDied (previously
       
  1448 	was KErrAbort).
       
  1449 
       
  1450 14.	Some verification now takes place as clusters and records are loaded to
       
  1451 	ensure that they have not been corrupted externally. These checks now
       
  1452 	result in KErrCorrupt errors, as opposed to ASSERTion panics, or memory
       
  1453 	overwrites (in release mode).
       
  1454 
       
  1455 
       
  1456 Version 0.01.027
       
  1457 ================
       
  1458 (Made by AjT, 25th November 1996)
       
  1459 
       
  1460 1.	Uses E32/074, F32/040, STORE/029, E32TOOLS/046
       
  1461 
       
  1462 2.	Binary compatible 026. Totally file compatible too.
       
  1463 	Bugs in F32 040 (and 041) may cause incorrect behaviour.
       
  1464 
       
  1465 3.	Build sizes for EDBMS[D].DLL
       
  1466 
       
  1467 	WINS ASCII Release      65,536 bytes (64.0K)
       
  1468 	WINS ASCII Debug        -
       
  1469 	MARM ASCII Release      68,012 bytes (66.4K)
       
  1470 	MARM ASCII Debug        80,116 bytes (78.2K)
       
  1471 
       
  1472 4.	Fixed:
       
  1473 
       
  1474 	Insert/SetColL/Cancel/InsertCopy resulted in the row data from the
       
  1475 	cancelled insertion being in the row buffer following the call to
       
  1476 	InsertCopyL. Fixed.
       
  1477 	
       
  1478 	Alien bookmarks (from another table) caused panics or corruption,
       
  1479 	rather than being rejected. A new verification scheme has been
       
  1480 	implemented to handle this (see #7 below).
       
  1481 
       
  1482 5.	Added two more typedefs
       
  1483 
       
  1484 	typedef TBufC<KDbMaxName> TDbNameC;
       
  1485 	typedef TBufC<KDbMaxColName> TDbColNameC;
       
  1486 
       
  1487 	These are used in place of the explicit TBufC variants in the interface.
       
  1488 
       
  1489 6.	Schema enquiry has been added to RDbDatabase. This is the last OVAL
       
  1490 	related omission.
       
  1491 
       
  1492 	CDbTableNames* RDbDatabase::TableNamesL() const;
       
  1493 	CDbColSet* RDbDatabase::ColSetL(const TDesC& aName) const;
       
  1494 	CDbIndexNames* RDbDatabase::IndexNamesL(const TDesC& aTable) const;
       
  1495 	CDbKey* RDbDatabase::KeyL(const TDesC& aName,const TDesC& aTable) const;
       
  1496 
       
  1497 	TableNamesL() returns a list of tables in the database.
       
  1498 	ColSetL() returns a the column set for a given table.
       
  1499 	IndexNamesL() returns a list of indexes for the table.
       
  1500 	KeyL() returns a key for the index on the table.
       
  1501 
       
  1502 	The objects returned need to be destroyed by the caller.
       
  1503 
       
  1504 	The Names functions return an instance of the CDbNames class, which can
       
  1505 	be iterated through by using the Count() member and [] operator.
       
  1506 
       
  1507 7.	A bookmark's persistence can now be specified explicitly:
       
  1508 	
       
  1509 	A bookmark taken from a	view A is valid in view A following
       
  1510 	re-evaluation, and also in any view B based on a query using the
       
  1511 	same select list on the same table.
       
  1512 	A bookmark from a RDbTable object is valid for any RDbTable opened
       
  1513 	on the same table, with or without a SetIndex.
       
  1514 	
       
  1515 	These all operate with the proviso that the record in question has
       
  1516 	not been deleted (of course).
       
  1517 
       
  1518 8.	The table-structure cache/map has been overhauled, resulting in
       
  1519 	faster backwards navigation and reduced overall memory usage.
       
  1520 
       
  1521 9.	The heuristic used to determine the clustering for a table has been
       
  1522 	improved following profiling tests. It is more optimistic than
       
  1523 	previously, especially for variable length columns. This results in
       
  1524 	significantly lower stream counts and therefore faster performance.
       
  1525 
       
  1526 10.	The "inlining" limit for Long columns has been upped to 255 bytes
       
  1527 	as #9 has ensured that this doesn't have a serious clustering
       
  1528 	penalty.
       
  1529 
       
  1530 
       
  1531 Version 0.01.026
       
  1532 ================
       
  1533 (Made by AjT, 29th October 1996)
       
  1534 
       
  1535 1.	Uses E32/072, F32/038, STORE/028, E32TOOLS/045
       
  1536 
       
  1537 2.	Not binary compatible release with 025.
       
  1538 	Can read files from 025, but writes files which cannot be read
       
  1539 	by 025.
       
  1540 
       
  1541 3.	Build sizes for EDBMS[D].DLL
       
  1542 
       
  1543 	WINS ASCII Release      62.0K
       
  1544 	WINS ASCII Debug        -
       
  1545 	MARM ASCII Release      64.2K
       
  1546 	MARM ASCII Debug        75.7K
       
  1547 
       
  1548 4.	Made use of TCardinality from STORE to give a little more
       
  1549 	compression to some DBMS store structures, reducing storage
       
  1550 	overhead to less than 2 bytes per record in ideal conditions.
       
  1551 
       
  1552 Version 0.01.025
       
  1553 ================
       
  1554 (Made by AjT, 18th October 1996)
       
  1555 
       
  1556 1.	Uses E32/070, F32/036, STORE/026, E32TOOLS/045
       
  1557 
       
  1558 2.	Binary compatible release with 024. I lied about the file
       
  1559         formats though: but it wasn't my fault really. This should be
       
  1560         the last time they change though.
       
  1561 
       
  1562 3.	Build sizes for EDBMS[D].DLL
       
  1563 
       
  1564 	WINS ASCII Release      62.0K
       
  1565 	WINS ASCII Debug        -
       
  1566 	MARM ASCII Release      64.2K
       
  1567 	MARM ASCII Debug        75.6K
       
  1568 
       
  1569 4.      Fixed a bug in RDbRowSet::InsertCopyL: BLOBs were not being
       
  1570         duplicated.
       
  1571 
       
  1572 5.      Added Auto-Increment support due to overwhelming demand. This has
       
  1573         effected the file format change which makes all previous
       
  1574         databases unreadable.
       
  1575 
       
  1576         TDbCol::EAutoIncrement can be added to the attributes of any
       
  1577         integral column 32 bits wide or less. The next value of the
       
  1578         counter is used to initialise any auto-increment columns when
       
  1579         RDbRowSet::InsertL() or RDbRowSet::InsertCopyL() is used. So the
       
  1580         value is available before PutL() is called.
       
  1581 
       
  1582         The columns are not verified for uniqueness (you can use a
       
  1583         unique index to do that), nor are clients prevented from
       
  1584         changing the value in an auto-increment column.
       
  1585         
       
  1586         It is implemented as an unsigned 32 bit counter, beginning
       
  1587         from 0, with the following effects given the choice of column:
       
  1588 
       
  1589         EDbColUint32: Wrap-around from KMaxUint32 -> 0
       
  1590         EDbColUint16: KErrOverflow in PutL() at KMaxUint16+1
       
  1591         EDbColUint8:  KErrOverflow in PutL() at KMaxUint8+1
       
  1592         EDbColBit:    KErrOverflow in PutL() at 2
       
  1593         EDbColInt32:  Wrap-around from KMaxInt32 -> KMinInt32
       
  1594         EDbColInt16:  KErrOverflow in PutL() at KMaxInt16+1
       
  1595         EDbColInt8:   KErrOverflow in PutL() at KMaxInt8+1
       
  1596 
       
  1597 6.      RDbTable::SeekL(TDbSeekKey const&,TComparison=EEqualTo) has
       
  1598         been implemented. This allows fast key-based lookup of a
       
  1599         particular row in a table, using an index. To use it the index
       
  1600         has to be created, and the RDbTable has to be set to use this
       
  1601         index using the SetIndex() member.
       
  1602 
       
  1603         Two classes are provided for passing keys to Seek: TDbSeekKey
       
  1604         is used for passing a single-column key, the template class
       
  1605         TDbSeekMultiKey is used for multi-column keys: the template
       
  1606         parameter is the number of columns in the key. Key values are
       
  1607         added to the key using the Add() members. Single column keys can
       
  1608         be constructed directly from the key value with the
       
  1609         TDbSeekKey(... aKey) constructors.
       
  1610 
       
  1611         The key values used must match the column types in the index
       
  1612         definition exactly, except for integral types <=32 bits wide
       
  1613         which are all passed as 32 bit values. You can specify less key
       
  1614         columns than are present in the index, and the search will be
       
  1615         restricted to the columns in the key you provide.
       
  1616 
       
  1617         Results of using different comparisons are:
       
  1618 
       
  1619         ELessThan:      the last row which compares strictly less than
       
  1620                         the key
       
  1621         ELessEqual:     the last row which compares less than or
       
  1622                         matches the key
       
  1623         EEqualTo:       the first row which matches the key
       
  1624         EGreaterEqual:  the first row which matches or compares greater
       
  1625                         than the key
       
  1626         EGreaterThan:   the first row which compares strictly greater
       
  1627                         then the key
       
  1628 
       
  1629         SeekL() returns non-false to indicate when a row matching the
       
  1630         key and comparison was found.
       
  1631 
       
  1632         Note:
       
  1633         a) that if more than one row matches the provided key,
       
  1634         EEqualTo and EGreaterEqual will return the same row, but
       
  1635         ELessEqual will return a different row: the _last_ row which
       
  1636         matches.
       
  1637 
       
  1638         b) the comparison type does not take into account whether an
       
  1639         index column is descending: i.e. a row which is "less than" a
       
  1640         key (for Seek) can contain a column value numerically greater
       
  1641         than the value in the key.
       
  1642 
       
  1643 
       
  1644 Version 0.01.024
       
  1645 ================
       
  1646 (Made by AjT, 4th October 1996)
       
  1647 
       
  1648 1.	Uses E32/069, F32/035, STORE/025, E32TOOLS/042
       
  1649 
       
  1650 2.	Binary compatible release with 023. As with STORE 025, the final
       
  1651 	adjustments in file format come with this release: all future
       
  1652 	releases should be able to read databases written with this
       
  1653 	release.
       
  1654 
       
  1655 3.	Build sizes for EDBMS[D].DLL
       
  1656 
       
  1657 	WINS ASCII Release      60.5K
       
  1658 	WINS ASCII Debug        -
       
  1659 	MARM ASCII Release      62.4K
       
  1660 	MARM ASCII Debug        73.6K
       
  1661 
       
  1662 4.	Recompiled against STORE 025 to bring in an inline bug fix.
       
  1663 
       
  1664 5.	Fixed a failure-to-initialise bug which occured following a
       
  1665 	failure during RDbDatabase::RDropTable::Open() and
       
  1666 	RDbDatabase::RRecover::Open()
       
  1667 
       
  1668 6.	Fixed a couple of bugs related to index recovery in stressed
       
  1669 	conditions: resulted in corrupting the stream-structure of the
       
  1670 	database, and a bogus index after rollback.
       
  1671 
       
  1672 7.	Failure during RDbView::Prepare() or RDbTable::Open() could
       
  1673 	leave the database in an invalid transaction state. Fixed.
       
  1674 
       
  1675 
       
  1676 Version 0.01.023
       
  1677 ================
       
  1678 (Made by AjT, 1st October 1996)
       
  1679 
       
  1680 1.	Uses E32/069, F32/035, STORE/024, E32TOOLS/042
       
  1681 
       
  1682 2.	This is the DBMS B2 release.
       
  1683 
       
  1684 	There are one or two weird bugs lurking in there somewhere, which 
       
  1685 	we are trying to fish out at the moment. They only show up under
       
  1686 	heavy alloc fail and thread shooting tests. Rather like trying to 
       
  1687 	catch exotic sub-atomic particles really.
       
  1688 
       
  1689 3.	Build sizes for EDBMS[D].DLL
       
  1690 
       
  1691 	WINS ASCII Release      60.5K
       
  1692 	WINS ASCII Debug        -
       
  1693 	MARM ASCII Release      62.1K
       
  1694 	MARM ASCII Debug        72.9K
       
  1695 
       
  1696 4.	Binary incompatible with any previous release.
       
  1697 
       
  1698 5.	Fixed:
       
  1699 
       
  1700 	Navigating to Next after Deleting a record from a windowed view
       
  1701 	and then trying to read the record resulted in KErrDoesNotExist.
       
  1702 	The next row is now correctly found.
       
  1703 
       
  1704 	Rowset returning an (incorrectly) empty row after a failed row
       
  1705 	read (due to e.g. OOM). Row buffer/cache fixed.
       
  1706 
       
  1707 	Specifying a Unicode column for a LIKE match in an SQL string
       
  1708 	now results in KErrNotSupported, rather than undefined (random)
       
  1709 	behaviour.
       
  1710 
       
  1711 	Rollback due to a failed Update/Put left the rowset with invalid
       
  1712 	data in the row. This could be returned a valid row after resetting
       
  1713 	the rowset. This is now correctly invalidated.
       
  1714 
       
  1715 	Could not navigate on a rowset while any other rowset was between
       
  1716 	Update/Insert and Put. Changed Transaction states to allow this.
       
  1717 
       
  1718 	Fixed an incorrect assert in the transaction states.
       
  1719 
       
  1720 6.	RDbColXmmmmStream::StoreL[C] have been withdrawn. Use the 
       
  1721 	CEmbeddedStore class in STORE instead to achieve store embedding
       
  1722 	in LongBinary columns.
       
  1723 
       
  1724 7.	With support from STORE 024, Recovery is now fully operational.
       
  1725 
       
  1726 
       
  1727 Version 0.01.022
       
  1728 ================
       
  1729 (Made by AjT, 23rd September 1996)
       
  1730 
       
  1731 1.	Uses E32/067, F32/033, STORE/022, E32TOOLS/041
       
  1732 
       
  1733 	This release has not used the latest E32 etc., in order to
       
  1734 	make the new DBMS functionality available to its clients
       
  1735 	immediately.
       
  1736 
       
  1737 2.	Build sizes for EDBMS[D].DLL
       
  1738 
       
  1739 	WINS ASCII Release      60.5K
       
  1740 	WINS ASCII Debug        -
       
  1741 	MARM ASCII Release      61.8K
       
  1742 	MARM ASCII Debug        72.7K
       
  1743 
       
  1744 3.	Binary incompatible with any previous release.
       
  1745 	Files are also incompatible: the DBMS head stream is now typed
       
  1746 	and validated whn opened.
       
  1747 
       
  1748 4.	Fixed a bug in the calculation of maximum record size in the
       
  1749 	presence of a DateTime column.
       
  1750 
       
  1751 5.	Indexes now support truncated Text and LongText keys.
       
  1752 
       
  1753 	TDbKeyCol has a new member iLength and a new ctor:
       
  1754 
       
  1755 	TDbKeyCol(const TDesC& aColumn,TInt aLength,TOrder anOrder=EAsc);
       
  1756 
       
  1757 	*	The length should only be defined for Text or LongText columns.
       
  1758 	
       
  1759 	*	The lengths specified need to equal the maximum column length
       
  1760 		(or be left undefined), _except_ for the last key column, for 
       
  1761 		which it can be smaller. Key values will be truncated to fit.
       
  1762 
       
  1763 	*	With unique indexes the _truncated_ key will have to be unique.
       
  1764 
       
  1765 	*	ORDER BY (which is only supported in the presence of an index) 
       
  1766 		is relaxed so that rows are returned in the order of the 'best' 
       
  1767 		matching index available: i.e. between indexes containing all 
       
  1768 		necessary columns, the one that stores most of the final key
       
  1769 		column. Clearly if a truncated-key index is not unique, the rows
       
  1770 		may be returned in not-quite-order.
       
  1771 
       
  1772 	*	LongText columns, like short ones, can be indexed. LongText 
       
  1773 		columns can only ever be used as the last column in a key 
       
  1774 		specification, and must have a length specified.
       
  1775 
       
  1776 	*	Every key value in an index takes up the maximum space.
       
  1777 
       
  1778 	As a guide: The maximum allowable unique Text key is 248 bytes, the
       
  1779 	maximum allowable non-unique Text key is 244 bytes.
       
  1780 
       
  1781 6.	Database safety and Transaction support.
       
  1782 
       
  1783 	*	The Database uses the Store commit/revert protocol to achieve
       
  1784 		transaction support. Therefore is is _vital_ that clients do
       
  1785 		not do so themselves while they have the database open. Failure
       
  1786 		to do so may result in an unrecoverable database.
       
  1787 
       
  1788 	*	Until a transaction is commited, the updates are not persistent:
       
  1789 		Rollback or closing and re-opening the database will result in
       
  1790 		loss of the updates and possible recoverable damage to the
       
  1791 		database.
       
  1792 
       
  1793 	*	Without the explicit use of transactions on the database, all
       
  1794 		update operations take place within their own automatic
       
  1795 		transaction:
       
  1796 
       
  1797 		*	DDL incremental operations are committed on successful
       
  1798 			completion, or rolled back when the incremental object
       
  1799 			is closed if the operation failed or was not completed.
       
  1800 
       
  1801 		*	DML: RDbRowSet::UpdateL() or Insert[Copy]L() begins a auto-
       
  1802 			transaction and PutL() commits it, on any failure, 
       
  1803 			Cancel() will invoke the rollback. DeleteL() does all of
       
  1804 			this within the single function.
       
  1805 
       
  1806 		*	Interleaved DML operations on separate rowsets are treated
       
  1807 			as a single transaction on the database, so it is possible
       
  1808 			to make a multi-table update be atomic using the auto-
       
  1809 			transaction feature. e.g.
       
  1810 			
       
  1811 			View1.UpdateL();	// transaction begins here
       
  1812 			View2.UpdateL();
       
  1813 			...
       
  1814 			View1.PutL();
       
  1815 			View2.PutL();		// transaction commits here
       
  1816 
       
  1817 			For such a transaction to rollback on failure, all rowsets
       
  1818 			with pending updates must be Cancel()led.
       
  1819 
       
  1820 	*	Explicit use of RDbDatabase::Begin(), Commit() and Rollback() 
       
  1821 		precludes the above behaviour. If the database is in an explicit
       
  1822 		transaction, update operations do not invoke invoke their own
       
  1823 		auto-transactions.
       
  1824 
       
  1825 		DML and DDL cannot (and never could be) operated at the same
       
  1826 		time, but they can be done within the same database transaction.
       
  1827 
       
  1828 	*	When an operation fails during a transaction, and before any
       
  1829 		rollback, the database is left in an "abort" state, and
       
  1830 		attempting other operations will result in an KErrAbort error.
       
  1831 		The appropriate rollback mechanism must be used before commencing
       
  1832 		(Cancel() rowset updates, Close() incremental objects, Rollback()
       
  1833 		any explicit transactions).
       
  1834 
       
  1835 		The database may be damaged following rollback, but this can be
       
  1836 		repaired.
       
  1837 
       
  1838 	*	After a Rollback, all rowsets lose their current position, this
       
  1839 		results in a return/leave code of KErrNotReady when attempting
       
  1840 		to use the table or view. The rowset must be Reset() which
       
  1841 		returns it to the state it was in immediately after opening or
       
  1842 		preparing. (So a view may need to be re-evaluated at this point).
       
  1843 		The rowset does not need to be closed and re-prepared.
       
  1844 
       
  1845 	*	If a client requires that some Store updates are commited to
       
  1846 		the Store at the same save-point as some database updates,
       
  1847 		an explicit transaction should be used, and both the store and
       
  1848 		database updates carried out within the transaction. Commiting
       
  1849 		the database will then commit the Store.
       
  1850 
       
  1851 	*	Why use transactions? Apart from providing atomicity of multiple
       
  1852 		updates across one or more tables, they vastly improve
       
  1853 		performance when doing bulk updates.
       
  1854 	
       
  1855 		Some statistics: the test was writing 1000 records (about 40 bytes
       
  1856 		per record) to a table in a database. (timings from the rack)
       
  1857 
       
  1858 		Automatic transactions (each record is written within its own
       
  1859 		transaction):
       
  1860 			File size: 529,667 bytes
       
  1861 			Time:      90.1s
       
  1862 		Explicit transactions (a single transaction is used for all 1000
       
  1863 		record writes):
       
  1864 			File size: 38,762 bytes		(14 x smaller)
       
  1865 			Time:      1.54s			(>50 x faster)
       
  1866 
       
  1867 		The file size difference is entirely compactible on STORE
       
  1868 		(eventually--when STORE provides compaction), as the extra space
       
  1869 		comes from having to flush buffers and commit the store after
       
  1870 		every record is written.
       
  1871 
       
  1872 7.	The recovery code is in place, but requires some more Btree
       
  1873 	support from STORE than comes with 022.
       
  1874 
       
  1875 	*	Following Rollback (auto or explicit): if any indexes have 
       
  1876 		been updated, they are considered broken. The database is
       
  1877 		still operational (although it reports that it is damaged).
       
  1878 		Any damaged indexes cannot be used for DML (reporting 
       
  1879 		KErrCorrupt) and so may prevent some views being operational 
       
  1880 		after rollback and reset.
       
  1881 
       
  1882 	*	Damaged indexes can be dropped (STORE does not support this
       
  1883 		yet). The database will still report damage, though recovery
       
  1884 		will then be trivial.
       
  1885 
       
  1886 	*	Recovering the database involves rebuilding all damaged
       
  1887 		indexes. (ditto about STORE)
       
  1888 
       
  1889 	*	All tables and views must be closed on the database before 
       
  1890 		recovery can commence.
       
  1891 
       
  1892 8.	There is now a limit of 32 indexes on any one table in database.
       
  1893 
       
  1894 9.	Incremental operations now take larger than minimal steps, and
       
  1895 	should modify the step count more sensibly than before.
       
  1896 
       
  1897 10.	Indexing should be one helluvalot faster now: without any commit
       
  1898 	framework the previous release was doing some excessive streaming
       
  1899 	to the file.
       
  1900 
       
  1901 
       
  1902 Version 0.01.021
       
  1903 ================
       
  1904 (Made by AjT, 6th September 1996)
       
  1905 
       
  1906 1.	Uses E32/066, F32/031, STORE/021, E32TOOLS/039
       
  1907 
       
  1908 2.	Build sizes for EDBMS[D].DLL
       
  1909 
       
  1910 	WINS ASCII Release	54.0K
       
  1911 	WINS ASCII Debug        -
       
  1912 	MARM ASCII Release      55.4K
       
  1913 	MARM ASCII Debug        64.9K
       
  1914 
       
  1915 3.      Binary incompatible with previous release.
       
  1916 
       
  1917 4.      Any API to do with compaction has been removed as compaction is
       
  1918         ommitted. Compaction of the file-store should be done with the
       
  1919         STORE API.
       
  1920 
       
  1921 5.      Added RDbColXxxxStream::StoreL() and RDbColXxxxStream::StoreLC()
       
  1922         to enable a persistent store to be embedded in LongBinary
       
  1923         columns. Use in the same way as RStoreXxxxStream::StoreL() etc.
       
  1924 
       
  1925 6.      New persistent table structure: robust and PermanentStore
       
  1926         friendly. Records are clustered and clusters are cached in
       
  1927         memory, resulting in lower storage overhead and faster record
       
  1928         access.
       
  1929 
       
  1930 7.      The rule about EDbColBit columns being not-null has been
       
  1931         withdrawn. Nullable Bit columns are back.
       
  1932 
       
  1933 8.      No provision for serious text to time conversion has been made,
       
  1934         so date columns cannot be used in WHERE clauses, and the date-
       
  1935         literal is removed from the grammar.
       
  1936 
       
  1937 9.      Removed trivial constructors and destructors from abstract
       
  1938         classes, there by saving code space (~1K) and preventing
       
  1939         vtables being generated for these classes.
       
  1940 
       
  1941 Version 0.01.020
       
  1942 ================
       
  1943 (Made by AjT, 2nd September 1996)
       
  1944 
       
  1945 1.	Uses E32/066, F32/031, STORE/021, E32TOOLS/039
       
  1946 
       
  1947 2.	Build sizes for EDBMS[D].DLL
       
  1948 
       
  1949 	WINS ASCII Release	52.5K
       
  1950 	WINS ASCII Debug        -
       
  1951 	MARM ASCII Release      53.5K
       
  1952 	MARM ASCII Debug        62.6K
       
  1953 
       
  1954 3.      Binary compatible with 019
       
  1955 
       
  1956 4.      DBMS is no longer tested against the Fragment file store layout,
       
  1957         as this is being phased out and the future releases will start
       
  1958         using file store features not supported by CFragmentFileStore.
       
  1959         Changed your code to using CPermanentFileStore now!
       
  1960 
       
  1961 5.      Views now follow the spec for cursor position after DeleteL,
       
  1962         PutL and Cancel.
       
  1963 
       
  1964         Following from DeleteL, the current position is in between what
       
  1965         would have been the Next and Previous rows, so Next and Previous
       
  1966         after DeleteL will go to the same row as if DeleteL had not been
       
  1967         called.
       
  1968 
       
  1969         After a PutL the current row will be the row just Put. Which row
       
  1970         appears following subsequent Next/Previous depends on how the
       
  1971         view is evaluated. For Unlimited windows it is well defined (see
       
  1972         note 8 to release 018). For Table views with no set index,
       
  1973         Updated rows remain in the same place, Insert[Copy]ed rows are
       
  1974         appended, so following Insert/Put the current row is the Last
       
  1975         row.
       
  1976 
       
  1977         After a Cancel the view should be located in the same place it
       
  1978         was prior to the Update/Insert.
       
  1979 
       
  1980 6.      Support for co-ordinating multiple views on the same table has
       
  1981         been added. If one view modifies the table this can affect other
       
  1982         rowsets. DBMS tries to recover the other view cursors when they
       
  1983         are next used, but this is not always possible. Some RDbRowSet
       
  1984         members can fail in special ways in this situations:
       
  1985 
       
  1986         If another view has deleted the rowset's current row, GetL and
       
  1987         DeleteL will fail with KErrDoesNotExist. Depending on how the
       
  1988         view is evaluated the view may still be able to move to
       
  1989         PreviousL and NextL. If the cursor cannot be recovered, NextL
       
  1990         and PreviousL will fail with KErrNotReady and the view will be
       
  1991         left on an invalied row.
       
  1992 
       
  1993         If another view has modified the table between between a call to
       
  1994         UpdateL and PutL, PutL will fail with KErrGeneral. [I'm trying to
       
  1995         think of a more appropriate error for this]. To continue you
       
  1996         need to Cancel() and then try to update again.
       
  1997 
       
  1998         As DBMS is not a server, you should usually be in control of
       
  1999         multiple views, and how they will interact with each other.
       
  2000 
       
  2001 7.      Long columns are inlined into the record when they are short
       
  2002         enough. This has no affect on the API to access them, as this is
       
  2003         primarily to reduce the storage overheads for short BLOBs.
       
  2004 
       
  2005 
       
  2006 Version 0.01.019
       
  2007 ================
       
  2008 (Made by AjT, 21 August 1996)
       
  2009 
       
  2010 1.	Uses E32/065, F32/029, STORE/020, E32TOOLS/039
       
  2011 
       
  2012         A release to upgrade to the new components and directory
       
  2013         structure.
       
  2014 
       
  2015 2.	Build sizes for EDBMS[D].DLL
       
  2016 
       
  2017 	WINS ASCII Release	51,200
       
  2018 	WINS ASCII Debug        -
       
  2019 	MARM ASCII Release      52,812
       
  2020 	MARM ASCII Debug        61,268
       
  2021 
       
  2022 Version 0.01.018
       
  2023 ================
       
  2024 (Made by AjT, 20 August 1996)
       
  2025 
       
  2026 1.	Uses E32/064, F32/028, STORE/019, E32TOOLS/036
       
  2027 
       
  2028 2.	Build sizes for EDBMS[D].DLL
       
  2029 
       
  2030 	WINS ASCII Release	51,200
       
  2031 	MARM ASCII Release      52,860
       
  2032 	MARM ASCII Debug        61,308
       
  2033 
       
  2034 3.      Fix: Table names are compared folded when opening tables or
       
  2035         views on the database.
       
  2036         
       
  2037 4.      A final record layout has been adopted: Long columns are not yet
       
  2038         inlined when they contain sufficiently little data. Any
       
  2039         databases from previous versions will be read incorrectly. The
       
  2040         new format means that the order of the columns in a newly
       
  2041         created table may not be the same as that in the column set
       
  2042         provided for RDbDatabase::CreateTable() or
       
  2043         RDbDatabase::AlterTable().
       
  2044 
       
  2045         Specifying columns as Not-Null reduces the persistent storage
       
  2046         requirements for numerical columns. Bit columns must always be
       
  2047         Not-Null.
       
  2048 
       
  2049 5.      Dropping and altering tables, creating and dropping indexes, and
       
  2050         evaluating a view are now done incrementally. The non-incremental
       
  2051         forms use the incremental objects/functions. These are done in
       
  2052         rather small steps at the moment, this will be changed to more
       
  2053         efficient larger steps at some stage.
       
  2054 
       
  2055 6.      AlterTable has arrived. Specification of the altered column set:
       
  2056 
       
  2057         Any column with the same name in the altered set as one in the
       
  2058         original table is considered unchanged. So it must have the same
       
  2059         definition, with the exception that the TDbCol in the altered set
       
  2060         can have iMaxLength set to KDbUndefinedLength.
       
  2061 
       
  2062         Any number of columns may be deleted, provided they are not used
       
  2063         in any index key. Any number of nullable columns may be added.
       
  2064         Any number of Not-null columns may be added to an empty table:
       
  2065         it is an error to try and add Not-null columns to a non-empty
       
  2066         table.
       
  2067 
       
  2068         If the table is empty, or no columns are being dropped this
       
  2069         completes immediately. Otherwise the entire dataset need to be
       
  2070         modified and the operation is potentially long-running.
       
  2071 
       
  2072 7.      Query text and the comparison type to be used in the query are
       
  2073         now packaged into a class TDbQuery, which can be constructed
       
  2074         from a descriptor, or a descriptor and a comparison type.
       
  2075 
       
  2076         This affects the following functions:
       
  2077         RDbRowSet::RConstraint::Open()
       
  2078         RDbRowSet::FindL()
       
  2079         RDbView::Prepare()
       
  2080 
       
  2081 8.      The RDbView::Prepare API now looks like:
       
  2082         
       
  2083         TInt Prepare(RDbDatabase&,const TDbQuery&,TAccess =EUpdatable);
       
  2084         TInt Prepare(RDbDatabase&,const TDbQuery&,const TDbWindow&);
       
  2085         TInt Prepare(RDbDatabase&,const TDbQuery&,const TDbWindow&,TAccess);
       
  2086 
       
  2087         effectively you have
       
  2088         
       
  2089         Prepare(Database, Query [,Window] [,Access])
       
  2090 
       
  2091         The Query can be directly constructed from a descriptor, in
       
  2092         which case normal text comparison is used in the query
       
  2093         evaluation. Other comparison modes can be set by explicitly
       
  2094         constructing a TDbQuery from the query descriptor and comparison
       
  2095         type.
       
  2096 
       
  2097         The Access parameter is as specified before, and always defaults
       
  2098         to RDbRowSet::EUpdatable.
       
  2099 
       
  2100         The Window parameter is the new one. This defaults to
       
  2101         TDbWindow::ENone, which provides the previous behaviour for the
       
  2102         view: evaluation or navigation may take an extended time to
       
  2103         complete, depending on how the query is evaluated, as little
       
  2104         memory is used as possible.
       
  2105 
       
  2106         If TDbWindow::EUnlimited is specified, the view takes on Dynaset
       
  2107         behaviour. Evaluation may take an extended time to generate a
       
  2108         set of all the rows in the query, but then navigation is
       
  2109         guaranteed to take constant time. This does impact the way
       
  2110         modified or inserted rows appear in the set: modified rows will
       
  2111         stay in the same place in the set, even if an ORDER BY clause is
       
  2112         specified in the query or they no longer match the WHERE clause;
       
  2113         inserted rows will always appear at the end of the set, even
       
  2114         when they do not match a WHERE clause. If the set is re-
       
  2115         evaluated, these rows will then appear (or not) in the correct
       
  2116         place.
       
  2117 
       
  2118         A limited size window can be specified, which allows for
       
  2119         guaranteed quick navigation within the window, without the
       
  2120         memory overhead of generating a set of every row in the query.
       
  2121         This is specified with the TDbWindow constructor overload:
       
  2122 
       
  2123         TDbWindow(TInt aForeSlots,TInt aRearSlots);
       
  2124 
       
  2125         aForeSlots indicates the number of row references which should be
       
  2126         "cached" for navigating to Next, and aRearSlots indicates the
       
  2127         number which should be cached for going to Previous. The current
       
  2128         row is not included. The window then provides a restricted view
       
  2129         over the underlying query; when fully evaluated the window will
       
  2130         try to match the requested shape if possible. Navigation is
       
  2131         restricted to the window, CountL() reports the number of rows in
       
  2132         the window, and going past the end will report AtEnd and
       
  2133         AtBeginning as for other rowsets. To "move" the window, the
       
  2134         view needs to be evaluated some more.
       
  2135 
       
  2136         Updated records in a restricted window will remain in place,
       
  2137         though further navigation and evaluation may result in it
       
  2138         appearing elsewhere later. Inserted records are not added to the
       
  2139         window, they may appear later after further evaluation.
       
  2140         Restricted windows are therefore not ideal for modifying the
       
  2141         data.
       
  2142 
       
  2143         Note: Some queries will demand an unlimited window (ORDER BY on
       
  2144         a non-indexed column (not yet available), so the parameter to
       
  2145         Prepare can only be used as a suggestion to DBMS.
       
  2146 
       
  2147         
       
  2148         Evaluation API:
       
  2149 
       
  2150         void Reset();
       
  2151         TInt Evaluate();
       
  2152         void Evaluate(TRequestStatus& aStatus);
       
  2153         TBool Unevaluated() const;
       
  2154         TInt EvaluateAll();
       
  2155 
       
  2156         The view can be Reset() to its condition immediately after
       
  2157         Prepare(). For views with a window, this results in an empty
       
  2158         window, and evaluation is required to make any rows available.
       
  2159         The view is repositioned back to the beginning.
       
  2160 
       
  2161         Evaluate() does a unit of evaluation work. A return value <0
       
  2162         is an error code; KErrNone implies that evaluation is complete
       
  2163         for the window/set; >0 implies that further evaluation can be
       
  2164         done. Evaluate(TRequestStatus& aStatus) is an asynchronous
       
  2165         version of Evaluate(), the status reporting the same as the
       
  2166         return code.
       
  2167         
       
  2168         At any time, RDbView::Unevaluated() will return whether
       
  2169         Evaluate() has any work to do or not.
       
  2170 
       
  2171         EvaluateAll() invokes Evaluate() until evaluation is complete.
       
  2172 
       
  2173         Evaluation and navigation can be mixed. An interesting side
       
  2174         effect is that if the view is navigated off the end of the
       
  2175         window, resulting in being AtEnd, and then further evaluation
       
  2176         results in rows being added to the window, the view will then be
       
  2177         positioned at the new row, its state changing from AtEnd to
       
  2178         AtRow.
       
  2179 
       
  2180         To fully re-evaluate an unlimited window, use Reset() followed
       
  2181         by EvaluateAll().
       
  2182 
       
  2183 
       
  2184 Version 0.01.017
       
  2185 ================
       
  2186 (Made by AjT, 5 August 1996)
       
  2187 
       
  2188 1.	Uses E32/064, F32/028, STORE/019, E32TOOLS/036
       
  2189 	
       
  2190 	This is just a component upgrade release
       
  2191 
       
  2192 2.	MARM ASCII Release size down to 46,776 due to IMPORT stub
       
  2193 	shortening
       
  2194 
       
  2195 Version 0.01.016
       
  2196 ================
       
  2197 (Made by AjT, 26 July 1996)
       
  2198 
       
  2199 1.	Uses E32/063, F32/027, STORE/018, E32TOOLS/034
       
  2200 
       
  2201 2.	Build sizes for EDBMS[D].DLL
       
  2202 
       
  2203 	WINS ASCII Release	46,592
       
  2204 	WINS ASCII Debug	110,592
       
  2205 	MARM ASCII Release	46,980
       
  2206 	MARM ASCII Debug	54,580
       
  2207 
       
  2208 3.	Bugs fixed:
       
  2209 
       
  2210 	Key uniqueness was not being persisted, so unique indexes would
       
  2211 	not work when the database was re-opened after closing.
       
  2212 
       
  2213 4.	Bookmarks are here. It is possible to bookmark any cursor position,
       
  2214 	including the beginning and end of the set.
       
  2215 
       
  2216 5.	Finding within a rowset is operational.
       
  2217 	RDbRowSet::RConstraint, MatchL and FindL are fully functional as
       
  2218 	spec'd in the previous release notes.
       
  2219 
       
  2220 6.	Incremental database operations are now functional, though their
       
  2221 	implementation is currently a mock-up based on their single call
       
  2222 	siblings. So they will all report 1 step after the call to
       
  2223 	Open(...) and complete after the first call to Next().
       
  2224 
       
  2225 7.	A TDbCol constructed as a short Text column (EDbColText[8|16]) now
       
  2226 	has a default iMaxLength of KDbDefaultTextColLength (50) rather than
       
  2227 	KDbUndefinedLength.
       
  2228 
       
  2229 	This allows default length text columns to be indexed, as the
       
  2230 	previous default (which translates to 255 characters in the
       
  2231 	database-in-a-store) meant that the key was too large and the index
       
  2232 	creation failed. The value chosen matches a default in
       
  2233 	Microsoft Access.
       
  2234 
       
  2235 8.	The enum TDbPosition has been renamed to RDbRowSet::TPosition, and
       
  2236 	as all its values are now scoped by RDbRowSet, the 'Db' prefix
       
  2237 	to the enumeratiuon values has been dropped.
       
  2238 
       
  2239 9.	RDbRowSet::SetColNull() has had an 'L' suffix added as it may leave
       
  2240 	when a Long column is being set to Null. It will never leave if the
       
  2241 	column is not a Long column or it is already Null.
       
  2242 
       
  2243 10.	The base class for the incremental operations has been renamed from
       
  2244 	RDbDatabase::RState to RDbDatabase::RIncremental which better
       
  2245 	reflects its purpose.
       
  2246 
       
  2247 11.	RDbView's evaluation interface has been changed after thought about
       
  2248 	incremental evalution.
       
  2249 	
       
  2250 	IMPORTANT: Evaluate() has been renamed to EvaluateAll(). Evaluate()
       
  2251 	will eventually invoke a single step in the evaluation of the view,
       
  2252 	but this member has been commented out for this release to
       
  2253 	help spot uses of this member which need to be changed.
       
  2254 	
       
  2255 	EvaluteAll() will eventually use the incremental evaluation
       
  2256 	mechanism to generate the rowset.
       
  2257 
       
  2258 12.	RDbRowSet::CountL() is fully implemented now, and will restore the
       
  2259 	previous cursor position if it is necessary to navigate the entire
       
  2260 	set in order to calculate the number of rows.
       
  2261 
       
  2262 13.	RDbRowSet::IsEmptyL() is also now implemented.
       
  2263 
       
  2264 Version 0.01.015
       
  2265 ================
       
  2266 (Made by AjT, 11 July 1996)
       
  2267 
       
  2268 1.	Uses E32/063, F32/027, STORE/017(018), E32TOOLS/034
       
  2269 
       
  2270 	Upgraded to new releases. Store 017 and 018 are binary
       
  2271 	compatible. Use 018, it provided between 300 and 800% speed
       
  2272 	increase for the DBMS test code.
       
  2273 
       
  2274 2.	Build sizes for EDBMS[D].DLL
       
  2275 
       
  2276 	WINS ASCII Release	44,032
       
  2277 	WINS ASCII Debug	115,712
       
  2278 	MARM ASCII Release	44,068
       
  2279 	MARM ASCII Debug	51,080
       
  2280 
       
  2281 	Tool change resulted in 18% code size reduction. Implementation
       
  2282 	of indices and addition of new API has added an extra 9.5K.
       
  2283 
       
  2284 	Debug MARM version for the first time included.
       
  2285 
       
  2286 3.	Indices are here! Single- and multi-column keys can be used to create
       
  2287 	indices. Once created, all indices on a table will be updated when
       
  2288 	the table has rows inserted, deleted or updated.
       
  2289 
       
  2290 	RDbTable::SetIndex() (see below) allows direct index navigation of the
       
  2291 	table record set.
       
  2292 
       
  2293 	ORDER BY will work as long as the ordering matches an index, including
       
  2294 	the text ordering (see 7 below) for text columns. "Matching" includes
       
  2295 	reversing the index order and truncating a multi-key index to a
       
  2296 	shorter sort-specification.
       
  2297 
       
  2298 4.	Following the spec meeting, the API has undergone some major work
       
  2299 	detailed below. All the additions which have not been implemented
       
  2300 	should still link OK, but the EXPORT_C'd stubs Panic at runtime with
       
  2301 	EDbUnimplemented.
       
  2302 
       
  2303 5.	TDbCol attributes are now a member enumeration and the attributes
       
  2304 	member name has been changed:
       
  2305 
       
  2306 	KDbColNotNull is now TDbCol::ENotNull
       
  2307 	KDbColAutoIncr is now TDbCol::EAutoIncrement
       
  2308 	TDbCol::iColAtt is now TDbCol::iAttributes
       
  2309 
       
  2310 	CDbColSet::New() has been withdrawn.
       
  2311 
       
  2312 6.	The TDbSortOrder enumeration is now a member of TDbKeyCol and the
       
  2313 	sorting order member of TDbKeyCol has changed:
       
  2314 
       
  2315 	TDbSortOrder is now TDbKeyCol::TOrder
       
  2316 	EDbSortAsc is now TDbKeyCol::EAsc
       
  2317 	EDbSortDesc is now TDBKeyCol::EDesc
       
  2318 
       
  2319 	CDbKey::New() has been withdrawn.
       
  2320 	CDbKey::Unique() is now CDbKey::IsUnique()
       
  2321 
       
  2322 7.	Enumeration TDbTextComparison has been introduced to specify how text
       
  2323 	data is compared and ordered:
       
  2324 
       
  2325 	EDbCompareNormal - use "binary" order
       
  2326 	EDbCompareFolded - use folded order (case and accent insensitive)
       
  2327 	EDbCompareCollated - use the locale collation order
       
  2328 
       
  2329 	Where-ever SQL expressions are used in the API, a companion parameter
       
  2330 	of this type is now required to specify how text columns in the query
       
  2331 	are compared. This parameter is query-wide, and affects text columns
       
  2332 	within a WHERE clause as well as those in an ORDER BY clause.
       
  2333 	So the RDbView::Prepare(...) and Evaluate(...) members have been changed.
       
  2334 
       
  2335 	This is also an attribute of an index key, specifying how the text
       
  2336 	columns in the index are ordered. If a key has no text columns, this
       
  2337 	attribute is ignored. Use the CDbKey::SetComparison() and
       
  2338 	CDbKey::Comparison() members to	set and test this attribute.
       
  2339 
       
  2340 8.	Row data in a rowset is not retrieved automatically anymore.
       
  2341 	RDbRowSet::GetL() must be called before any column extraction can be
       
  2342 	done without a Panic. RDbRowSet::UpdateL() does not require
       
  2343 	the use of GetL() before or after it is called, the row is read as
       
  2344 	part of the UpdateL(). If Cancel() is used after an UpdateL() or
       
  2345 	InsertL(), then GetL() is required to re-retrieve the data for the
       
  2346 	row previously in view.
       
  2347 
       
  2348 9.	A copy of the current row can be inserted into the rowset using
       
  2349 	RDbRowSet::InsertCopyL(). This will provide new values for
       
  2350 	auto-increment columns.	For views with a projected column set, i.e.
       
  2351 	those using a non trivial (*) select-list in the query, it is not
       
  2352 	defined whether the un-viewed columns are copied or not.
       
  2353 
       
  2354 10.	RDbRowSet::Count() is now CountL(TAccuracy anAccuracy=EEnsure)
       
  2355 	to reflect the fact that counting may not be a trivial operation
       
  2356 	The default behaviour is to go to whatever lengths are required
       
  2357 	to provide an exact count of the membership of the row set, this
       
  2358 	can take an extended time to evaluate.
       
  2359 
       
  2360 	If EQuick is passed as the accuracy parameter this member will
       
  2361 	return a count only if it is immediately available, otherwise it
       
  2362 	will return KDbUndefinedCount (-1). Not fully implemented.
       
  2363 
       
  2364 11.	For similar reasons RDbRowSet::IsEmpty() is now IsEmptyL()
       
  2365 	This is not as hard to evaluate as the Count, but may still be a
       
  2366 	non-trivial operation in some cases.
       
  2367 
       
  2368 12.	The rowset positioning operations have two new additions:
       
  2369 	RDbRowSet::Beginning() and End() which are always available (hence no
       
  2370 	trailingL). The positioning members	are all implemented in terms of
       
  2371 	RDbRowSet::GotoL(TDbPosition), which is also available for clients.
       
  2372 
       
  2373 	RDbRowSet::FirstL(), LastL(), NextL() and PreviousL() now all return
       
  2374 	TBool to indicate whether or not they are at a row. i.e. calling
       
  2375 	RDbRowSet::AtRow() after a call to one of the above will return the
       
  2376 	same value.
       
  2377 
       
  2378 	You can write your loops in lots of ways now
       
  2379 
       
  2380 	for (view.FirstL;view.AtRow();view.NextL())
       
  2381 		{
       
  2382 		}
       
  2383 
       
  2384 	or
       
  2385 
       
  2386 	view.Beginning();
       
  2387 	while (view.NextL())
       
  2388 		{
       
  2389 		}
       
  2390 
       
  2391 	etc.
       
  2392 
       
  2393 13.	RDbTable provides the ability to view the records in named index order
       
  2394 	using RDbTable::SetIndex(const TDesC& anIndex). Or back in default
       
  2395 	order using RDbTable::SetNoIndex().
       
  2396 
       
  2397 14.	RDbDatabase::PrepareCommit() and FinishCommit() withdrawn. Two phase
       
  2398 	commit belongs to a different scale of database.
       
  2399 
       
  2400 15.	RDbDatabase::CreateTable(...,const CDbKey&) added to support
       
  2401 	implementations	which use a primary key in a table definition. The
       
  2402 	Store database implementation will not support this.
       
  2403 
       
  2404 16. RDbs and RDbsDatabase have been withdrawn.
       
  2405 
       
  2406 
       
  2407 The following changes have been made to the API, but are not yet implemented:
       
  2408 
       
  2409 17.	Bookmarks to reposition to a previously accessed row. Use them like this:
       
  2410 
       
  2411 	TDbBookmark mark=view.Bookmark();
       
  2412 	// use the view to do something
       
  2413 	view.GotoL(mark);
       
  2414 
       
  2415 18.	Searching across a rowset using:
       
  2416 
       
  2417 	TInt RDbRowSet::FindL(TDirection,const TDesC&,TDbTextComparison)
       
  2418 
       
  2419 	The matching constraint is defined by the search-condition part of a
       
  2420 	SQL WHERE clause, i.e. "Name like '*john*'", passed as the second
       
  2421 	parameter, the third parameter specifies the text comparison to use
       
  2422 	(see 7 above). The first parameter is either EForwards or EBackwards
       
  2423 	and specifies which direction the search should move through the row
       
  2424 	set. The search always starts at the current record. The search
       
  2425 	terminates when either:
       
  2426 	a)	a match is found and the number of records searched minus 1 is
       
  2427 		returned (so if	the current record matches the condition 0 is
       
  2428 		returned) or
       
  2429 	b)	the	end of the set is reached and KNotFound is returned
       
  2430 
       
  2431 	The API also provides a way of testing a row against a given condition.
       
  2432 	The condition is built into an RDbRowSet::RConstraint object and can
       
  2433 	then be tested against individual rows using the RDbRowSet::MatchL()
       
  2434 	member. As the constraint involves allocating resources it should be
       
  2435 	closed when no longer required.
       
  2436 
       
  2437 19.	Incremental forms for RDbRowSet::Evaluate()
       
  2438 
       
  2439 	All the incremental operations have a single basic function
       
  2440 	TInt Next(TInt& aStep) // synchronous form
       
  2441 	The integer aStep is decremented for each step, though it may be in
       
  2442 	units > 1. When aStep reaches 0, the operation is complete. Some of
       
  2443 	the operations' step-counts are very hard to predict, and so finish much
       
  2444 	earlier than predicted.
       
  2445 
       
  2446 20.	Seeking within an index for a record which matches a specified key can
       
  2447 	be achieved with RDbTable::SeekL(). The index used for the look up is
       
  2448 	set using RDbTable::SetIndex() (see 13 above) and the key is specified
       
  2449 	using the TDbSeekKey or TDbSeekMultiKey<S> classes. The templated class
       
  2450 	allows seeking with an index which has multiple	key columns. Each key
       
  2451 	value is added to the TDbSeekKey, and should match the column type in
       
  2452 	the table.
       
  2453 	
       
  2454 	RDbTable::SeekL() also takes a parameter which specifies which record to
       
  2455 	find in the index. If it succeeds in locating a record which matches the
       
  2456 	key and comparison it returns true; otherwise the rowset is left in an
       
  2457 	undefined position.
       
  2458 
       
  2459 20.	RDbDatabase::IsDamaged() and Recover() added to support recovery.
       
  2460 	This is done on a opened database. When open IsDamaged() reports whether
       
  2461 	the database requires recovery: if it is damaged then no other
       
  2462 	operations can be performed on the database, and they will report the
       
  2463 	error KErrCorrupt.
       
  2464 
       
  2465 21.	RDbDatabase::Compact() will compact an open database. It must not be
       
  2466 	in use for anything else concurrently.
       
  2467 
       
  2468 22. Incremental database operations are supported by the RDbDatabase::RState
       
  2469 	class and those derived from it.
       
  2470 
       
  2471 Version 0.01.014
       
  2472 ================
       
  2473 (Made by AjT, 30 May 1996)
       
  2474 
       
  2475 1)	Uses E32/060, F32/024, STORE/015, E32TOOLS/028
       
  2476 
       
  2477 2)	Binary compatible with build 013.
       
  2478 	Making use of the -fcheck-new flag in MAKTRAN(028)
       
  2479 
       
  2480 3)	EDBMS.DLL build sizes:
       
  2481 
       
  2482 	WINS Ascii Debug		93,696
       
  2483 	WINS Ascii Release		34,304
       
  2484 
       
  2485 	MARM Ascii Release		41,496
       
  2486 
       
  2487 4)	Bugs fixed:
       
  2488 	
       
  2489 	MNT bug: failed to create an E32DATA directory, which is required
       
  2490 	during EPOC32 startup!
       
  2491 
       
  2492 	Clearing or rewriting a Long column while in an RDbRowSet::UpdateL
       
  2493 	caused a USER panic.
       
  2494 
       
  2495 	When updating a row, making columns smaller or setting them to
       
  2496 	Null, could result in data on the end of the row being lost or
       
  2497 	corrupted.
       
  2498 
       
  2499 5)	STORE 015 fixed the worst of the Rewritable file store problems.
       
  2500 
       
  2501 Version 0.01.013
       
  2502 ================
       
  2503 (Made by AndrewT, 24 May 1996)
       
  2504 
       
  2505 1)	Uses E32/059, F32/023. STORE/014, E32TOOLS/024
       
  2506 
       
  2507 2)	EDBMS.DLL build sizes
       
  2508 
       
  2509 	WINS Ascii Debug		93,696
       
  2510 	WINS Ascii Release		34,304
       
  2511 
       
  2512 	MARM Ascii Release		47,108
       
  2513 
       
  2514 3)	The ODBC implementation has been removed from the release
       
  2515 
       
  2516 4)	Bugs fixed:
       
  2517 
       
  2518 	Word swapping doubles was written without alignment in mind, caused
       
  2519 	the rack to hang sometimes in RDbRowSet::PutL(). Fixed
       
  2520 
       
  2521 5)  	New features:
       
  2522 
       
  2523 	[NOT] LIKE in the search condition is now case-insensitive (using Folding);
       
  2524 	The other comparison operators are (and will remain) case sensitive
       
  2525 
       
  2526 	Select-lists are now supported: so
       
  2527 	"select Name,Dept from Personnel where ID>3"
       
  2528 	will now work. The columns in the RDbView are ordered exactly as in the
       
  2529 	list in the SQl statement.
       
  2530 
       
  2531 6)	WARNING!
       
  2532 
       
  2533 	A bug in CRewritableFileStore in STORE 014 means that once a
       
  2534 	CRewritableFileStore file has been closed, opening and adding new streams
       
  2535 	will make the last stream (by id) corrupt and the first one (by position)
       
  2536 	invisible. This will also happen when more than 16 streams are created in a
       
  2537 	newly created store.
       
  2538 	Signs of corruption are duff stream data or non-exisitence of a stream when
       
  2539 	reading, but may be hard to track down.
       
  2540 	Opening a CRewritableFileStore for reading if no corruption has yet occured
       
  2541 	is not a problem.
       
  2542 
       
  2543 	This will affect databases in RewritableFileStores.
       
  2544 
       
  2545 7)	Due to dependence on STORE 014, which has changed the format of file store
       
  2546 	headers, files written using DBMS(012)/STORE(013) are unreadable with
       
  2547 	DBMS(013)/STORE(014)
       
  2548 
       
  2549 Version 0.01.012
       
  2550 ================
       
  2551 (Made by AndrewT, 13 May 1996)
       
  2552 
       
  2553 1)	Uses E32/059, F32/023. STORE/013, E32TOOLS/023
       
  2554 
       
  2555 2)	EMARM build sizes from e32rom.log:
       
  2556 
       
  2557 	Rom file size:			64K
       
  2558 	Total Raw Data size:	43K
       
  2559 
       
  2560 3)	Bugs fixed:
       
  2561 
       
  2562 	RDbRowSet::IsColNull(), ColSize() and ColLength() return as for a
       
  2563 	NULL column when invoked on a Long column in a rowset which has not
       
  2564 	had any other column evaluated.
       
  2565 
       
  2566 	Various problems with recovery after errors when opening databases
       
  2567 	or views.
       
  2568 
       
  2569 4)  New features:
       
  2570 
       
  2571 	LongText8 columns can now be specified in the WHERE clause of a
       
  2572 	query.
       
  2573 
       
  2574 	Table names and columns sets are fully validated when a table is
       
  2575 	created.
       
  2576 
       
  2577 	Rows are fully validated before they are written to the table.
       
  2578 
       
  2579 5)	Data format has changed, so databases written with build 011 of
       
  2580 	DBMS will fail to open correctly with this build.
       
  2581 
       
  2582 
       
  2583 Version 0.01.011
       
  2584 ================
       
  2585 (Made by AndrewT, 30 April 1996)
       
  2586 
       
  2587 1)	Uses E32/057, F32/021. STORE/012, E32TOOLS/021
       
  2588 
       
  2589 2)	EMARM build sizes from e32rom.log:
       
  2590 
       
  2591 	Rom file size:		64K
       
  2592 	Total Raw Data size:	42K
       
  2593 
       
  2594 3)	Bugs fixes:
       
  2595 
       
  2596 	E32 panic during cleanup if Store database open or creation failed.
       
  2597 
       
  2598 	Deleting last row in a table generated an End-Of-File error.
       
  2599 
       
  2600 4)	API Changes:
       
  2601 
       
  2602 	KNullColNo has become KDbNullColNo
       
  2603 
       
  2604 	Added new member TDbColType RDbRowSet::ColType(TDbColNo) which just
       
  2605 	reports the column type.
       
  2606 
       
  2607 	In the RDbView::Prepare(), RDbView::Evalyate() and RDbTable::Open()
       
  2608 	functions, the allowUpdates boolean flag has been replaced by an enum
       
  2609 	RDbRowSet::TAccess, which takes one of the three values:
       
  2610 
       
  2611 		EUpdatable:  the default, rows can be read or written
       
  2612 		EReadOnly:   the rows can only be read, InsertL/DeleteL/UpdateL
       
  2613 					 will leave with KErrWrite
       
  2614 		EInsertOnly: the rows can only be inserted. Any navigation
       
  2615 					 functions and DeleteL will leave with KErrWrite
       
  2616 
       
  2617 5)	Long columns are now length counted when written, so ColSize() and
       
  2618 	ColLength() should report correctly. Only one column can be streamed
       
  2619 	in at a time on a single rowset, and only one Long column can be
       
  2620 	streamed out at a time. Column streams must be closed before setting
       
  2621 	other columns, navigating, etc. on the rowset.
       
  2622 
       
  2623 6)	Search conditions are now supported in the query passed to
       
  2624 	RDbView::Prepare() and RDbView::Evaluate().
       
  2625 
       
  2626 	See R:\DBMS\DSPEC\SQL.DOC for the supported grammar in search
       
  2627 	conditions. Searching on date columns cannot be done currently as I
       
  2628 	am waiting for TTime support for descriptors.
       
  2629 
       
  2630 
       
  2631 Version 0.01.010
       
  2632 ================
       
  2633 (Made by AndrewT, 22 April 1996)
       
  2634 
       
  2635 1).	Still uses E32/056, F32/020. STORE/011, E32TOOLS/019
       
  2636 
       
  2637 2)	API changes:
       
  2638 
       
  2639 	KDbUndefinedLength is used for TDbCol::iMaxLength to imply that no
       
  2640 	maximum has been set, and also to report the RDbRow::ColSize() could
       
  2641 	not be determined.
       
  2642 
       
  2643 	KDbUndefinedCount is returned from RDbRowSet::Count() when the number of
       
  2644 	rows cannot be determined
       
  2645 
       
  2646 	Static member TBool TDbCol::IsLong(TDbColType) has been added for
       
  2647 	convenience to test whether the column type is one of the "Long" types.
       
  2648 
       
  2649 	CDbColSet and CDbKey are implemented using Packed arrays, and provide a
       
  2650 	NewLC() member.
       
  2651 	
       
  2652 	TDbColSetIter has been introduced to provide simple, but fast forward
       
  2653 	iteration over a column set. Use as:
       
  2654 
       
  2655 	for (TDbColSetIter col(aColSet);col;++col)
       
  2656 		{
       
  2657 		if (col->iType==EDbColBit)
       
  2658 			// etc.
       
  2659 		}
       
  2660 
       
  2661 	RDbRowSet has two new members
       
  2662 		TInt ColCount()
       
  2663 		TDbCol ColDef(TDbColNo)
       
  2664 	These report the column definition on a column by column basis: ColSet()
       
  2665 	and ColSetL() are now implemented in terms of these new members.
       
  2666 
       
  2667 3)	EDBMS (the real thing) now supports a Database-in-a-Store in Win32
       
  2668 	ASCII Debug & Release builds and the MARM ASCII Release.
       
  2669 
       
  2670 	Supports Database creation/deletion within a Store.
       
  2671 	Supported Table creation/dropping with all column types. Column
       
  2672 	attributes (KDbColNotNUll and KDbColAutoIncr) are not supported.
       
  2673 	Long columns cannot report their length	yet.
       
  2674 	RDbTables and whole-table views ("SELECT * FROM <table>" exactly: no extra
       
  2675 	spaces) are supported for Viewing, Adding, Editing and Deleting rows.
       
  2676 	
       
  2677 Version 0.01.009
       
  2678 ================
       
  2679 (Made by AndrewT, 10 April 1996)
       
  2680 
       
  2681 1).	Uses E32/056, F32/020, STORE/011, E32TOOLS/019
       
  2682 	Reinstated F32 as a dependency, as STORE is dependant on it.
       
  2683 
       
  2684 2).	Fixed a few duff header dependencies in the test code.
       
  2685 
       
  2686 Version 0.01.008
       
  2687 ================
       
  2688 (Made by AndrewT, 29 March 1996)
       
  2689 
       
  2690 1). Includes MARM releasables for the first time. The release components are
       
  2691 	now called EWINS, EWINSDB and EMARM. EMARM is 8-bit release mode only.
       
  2692 
       
  2693 	Uses E32/055, STORE/010 and E32TOOLS/017.
       
  2694 
       
  2695 2). DBMS has been reorganised to prepare for the ODBC mock-up being phased out
       
  2696 	and replaced by the Real Thing. A clean getsrc is required as a number of
       
  2697 	files and directories are new or have been renamed.
       
  2698 
       
  2699 	The ODBC implementation has been relegated to a set of DLLs of its own;
       
  2700 	EODBC*.DLL, available for WINS only. To use ODBC, link against these,
       
  2701 	rather than the standard EDBMS*.DLL ones.
       
  2702 	DBMS test programs demonstrate one way of dealing with this situation. They
       
  2703 	feature new Win32 ODBC Debug and Release configurations causing them to be
       
  2704 	linked against the alternative libraries.
       
  2705 
       
  2706 3). There is now a stream store-based flavour of database, as well as a
       
  2707 	server-based one. EODBC*.DLLs export a mock-up of both flavours.
       
  2708 	EDBMS*.DLLs, identical on WINS and ARM, do not export the server-based
       
  2709 	database, and the store-based one currently exported will refuse to open,
       
  2710 	leaving with KErrGeneral.
       
  2711 	
       
  2712 	Note that DBMS v1 will *not* include the DBMS server.
       
  2713 
       
  2714 4). If you use the DDL pre-processor you should stick it in \tools using
       
  2715 	"getrel dbms ddlpp <ver>". The Custom-Build on Build/Settings in MSVC 4
       
  2716 	is dead handy for using this tool. See the T_DDL test program for details.
       
  2717 
       
  2718 5). KDbMaxColumnLength is a const which specifies the maximum "MaxLength" that
       
  2719     can be used for EDbColText8, EDbColText16 and EDbColBinary columns. For the
       
  2720 	text columns "Length" has the same meaning as for descriptors.
       
  2721 
       
  2722 6). EDbColLongText8, EDbColLongText16, EDbColLongBinary are the Long column
       
  2723 	types. They can only be read or written using the new stream column
       
  2724 	accessors (see 7), the other SetColL() and ColXxx() members of RDbRowSet
       
  2725 	will Panic. "Short" columns can be read but not written using the column
       
  2726 	streams. "Short" text or binary columns can always be read directly using
       
  2727 	the ColDes8/16() accessors.
       
  2728 
       
  2729 	EDbLongText8 and EDbLongBinary have been implemented for ODBC. Unicode
       
  2730 	columns are still unsupported.
       
  2731 	
       
  2732 	EDbColObject has been removed.
       
  2733 
       
  2734 7).	RDbColReadStream, RDbColWriteStream provide the stream interface to the Long
       
  2735 	columns. Although 'MExternalizer's are in the RDbColWriteStream interface
       
  2736 	they are not implemented at the moment. They require a RDbRowSet and a column
       
  2737 	number to open: the row set must be positioned at a valid row for reading
       
  2738 	and must be in insert/update mode for writing, as for the other column
       
  2739 	accessors.
       
  2740 
       
  2741 8). Two new members RDbRowSet::ColSize(), RDbRowSet::ColLength() provide size
       
  2742 	information for the current row in the row set. ColSize() is the size in
       
  2743 	bytes of the data available if streamed using RDbColReadStream. ColLength(),
       
  2744 	in the spirit of TDesC::Length(), returns the number of "units" of data in
       
  2745 	the column. For non text/binary columns this will be 0 or 1 indicating
       
  2746 	whether the column is NULL or not, for text columns this returns the number
       
  2747 	of characters available in the column, and for binary columns returns the
       
  2748 	same value as the ColSize() member.
       
  2749 
       
  2750 	If this cannot be evaluated -1 is returned;
       
  2751 
       
  2752 9). RDbDatabase has lost the ability to Open/Create/etc. a database.
       
  2753 	This functionality is now left to derived classes:
       
  2754 	
       
  2755 	RDbsDatabase provides what was lost from RDbDatabase. This (and RDbs) will
       
  2756 	not be present in the MARM release.
       
  2757 
       
  2758 	RDbStoreDatabase implements the new Open/Create protocol. CreateL returns
       
  2759 	an Id for the database within the store, which is used by OpenL to reopen
       
  2760 	the database on a later occasion. The Real Thing will require a Store
       
  2761 	which supports ExtendL() and RStoreWriteStream::OpenL() (the only
       
  2762 	persistent store which currently provides this is CRewritableFileStore).
       
  2763 	This is supported by ODBC, but don't expect the database to be kept within
       
  2764 	the Store itself, it is in fact somewhere in \E32DATA.
       
  2765 
       
  2766 9). RDbDatabase::Destroy() destroys (deletes) the persistent database and
       
  2767 	closes the RDbDatabase object. This provides for deletion of databases
       
  2768 	created using RDbStoreDatabase
       
  2769 
       
  2770 
       
  2771 Version 0.01.007
       
  2772 ================
       
  2773 (Made by AndrewT, 4 March 1996)
       
  2774 
       
  2775 1).	Updated to E32:054 and F32:018
       
  2776 
       
  2777 Version 0.01.006
       
  2778 ================
       
  2779 (Made by AndrewT, 30 January 1996)
       
  2780 
       
  2781 1).	Updated to E32:053 and F32:017
       
  2782 
       
  2783 Version 0.01.005
       
  2784 ================
       
  2785 (Made by AndrewT, 18 January 1996)
       
  2786 
       
  2787 1).	Updated to E32:052 and F32:016
       
  2788 
       
  2789 1).	Fixed a bug in TDbRow which meant that changing column data for
       
  2790 	text columns would not always change the column data width.
       
  2791 
       
  2792 2)	Changed the accessors for the View. SetColL() does not have overloads
       
  2793 	for 8 or 16 bit integers, The TInt, TInt32, TUint and TUint32 are
       
  2794 	enough - (via ODBC we cannot provide range validation on shorter columns
       
  2795 	due to its signed/unsigned incapabilities).
       
  2796 	
       
  2797 	Any integral column can be extracted using an accessor at least as wide
       
  2798 	as the column definition:
       
  2799 
       
  2800 	e.g. a Bit column can be extracted with ColUint8() ColUint16() or
       
  2801 	ColUint32(), an Int16 column can be extracted with ColInt16() or
       
  2802 	ColInt32() but not ColInt8() - even if the data is in range for this
       
  2803 	extraction.
       
  2804 
       
  2805 Version 0.01.004
       
  2806 ================
       
  2807 (Made by AndrewT, 3 January 1996)
       
  2808 
       
  2809 1).	Updated to E32:051 and F32:015
       
  2810 
       
  2811 2).	Now uses the new TTime and TDateTime classes. TSystemTime is no
       
  2812 	longer supported.
       
  2813 
       
  2814 3).	The pre-processor has also been modified to handle the new TTime.
       
  2815 
       
  2816 Version 0.01.003
       
  2817 ================
       
  2818 (Made by AndrewT, 18 December 1995)
       
  2819 
       
  2820 1).	Updated to E32:050 and F32:014
       
  2821 	The new TBool has broken the SetColL() overloads for RDbRowSet.
       
  2822 	The overload for TBool has been withdrawn for this release, pending a
       
  2823 	rewrite of the set/get interface.
       
  2824 
       
  2825 Version 0.01.002
       
  2826 ================
       
  2827 (Made by AndrewT, 17 October 1995)
       
  2828 
       
  2829 1).	Updated to E32:047 and F32:011
       
  2830 	All functions which used to return TUints as counts or indices now return
       
  2831 	TInts. Specifically RDbRowSet::Count() now returns -1 if it cannot determine
       
  2832 	the actual count.
       
  2833 
       
  2834 2).	Fixed a bug in RDbRowSet::Prepare() to report an error on SQL syntax errors.
       
  2835 
       
  2836 Version 0.01.001
       
  2837 ================
       
  2838 (Made by GeertB, 29 August 1995)
       
  2839 
       
  2840 1). First release.
       
  2841 
       
  2842 	The main header file is D32DBMS.H.
       
  2843 
       
  2844 	The header file D32ADT.H is for the use of implementers of DBMS file
       
  2845 	organisations, "drivers" which are used by the DBMS.
       
  2846 
       
  2847 	Implemented by passing all interesting operations on to Microsoft Access
       
  2848 	through ODBC.
       
  2849 
       
  2850 	Running programs linked against this release requires the installation of
       
  2851 	32-bit ODBC and the Access driver. This is done as follows:
       
  2852 
       
  2853 	- shut down all applications (don't forget Office)
       
  2854 	- run T:\ODBC\BIN32\ODBCAD32.EXE, the 32-bit ODBC Administrator
       
  2855 	- in the resulting dialog, press "Drivers...", then "Add..."
       
  2856 	- type T:\ODBC\BIN32 at the prompt (or use "Browse...")
       
  2857 	- select "Microsoft Access Driver (*.mdb)" in the list that pops up
       
  2858 	- press "OK" (or double click)
       
  2859 	- file copying will start
       
  2860 	- a message like the following will appear: "The file C:\WINNT35\SYSTEM32\
       
  2861 	  MSVCRT20.DLL is currently in use and cannot be removed or updated. Try
       
  2862 	  closing all applications and choosing Retry. (...)"
       
  2863 	  Since it's the ODBC Administrator itself that is using the DLL, complying
       
  2864 	  won't help. Instead, choose "Ignore".
       
  2865 	- if a message along the lines of "An error occurred while copying
       
  2866 	  C:\WINNT35\SYSTEM32\MFC30.DLL. Restart Windows and try installing again
       
  2867 	  (before running any applications which use ODBC)." appears, you've left an
       
  2868 	  application using MFC running. Start again from the top.
       
  2869 	- the installer adds a data source called "sdk21-Access32". It can
       
  2870 	  safely be deleted.
       
  2871 	- in the "Data Sources" dialog, create a data source by pressing "Add..."
       
  2872 	- select the Access driver in the resulting dialog and press "OK"
       
  2873 	- call the new data source "DBMS", leaving other fields blank. Choose "OK".
       
  2874 	- close the ODBC Administrator
       
  2875 	- in case you haven't copied the new (MSVC 2.1) MSVCRT20.DLL from T:\MSVC21\
       
  2876 	  SYSTEM32 yet, do so now. The Access ODBC driver needs the newer version.
       
  2877 	  See the instructions in the E32 0.01.039 release notes.
       
  2878 	
       
  2879 	Warning: on one NT machine, the driver setup program erroneously copied the
       
  2880 	Windows 95 version of CTL3D32.DLL. If this happens, applications--notably
       
  2881 	MSVC--may start complaining about it. The fix is to copy T:\ODBC\REDIST32\
       
  2882 	WINNT\CTL3D32.DLL into your SYSTEM32 directory.
       
  2883 
       
  2884 2). Unicode builds are not supported. ODBC understands only 8-bit text.
       
  2885 	Support for the 8-bit subset of the Unicode character set can be added
       
  2886 	fairly trivially if it turns out to be needed during the life time of this
       
  2887 	implementation.
       
  2888 
       
  2889 3). The initial revision of a tool to help in building programs to run against
       
  2890 	the DBMS is included. It is called DDLPP.EXE and it takes a simple data
       
  2891 	definition language as its input and generates C++ headers and source code.
       
  2892 	See R:\DBMS\DSDK\DDLPP.HLP for more information.
       
  2893 	It is less than perfect as a command line tool at the moment.
       
  2894 	Comments and feedback welcome.
       
  2895 
       
  2896 4). No interpretation of ODBC status codes. In case of an ODBC error,
       
  2897 	KErrGeneral is returned.
       
  2898 
       
  2899 5). RDbViews and RDbTables become unusable when the transaction they were
       
  2900 	created in ends. Currently, if you don't start a transaction using
       
  2901 	RDbDatabase::Begin(), one is implicitly entered for you, and committed
       
  2902 	on RDbRowSet::Put(). Thus the row set is effectively closed after the
       
  2903 	first database modification.
       
  2904 	The workaround is to use explicit transactions.
       
  2905 
       
  2906 6). RDbView::Define() is not implemented, and will in all likelihood be
       
  2907 	withdrawn in a future release.
       
  2908 
       
  2909 7). The Access driver does not accurately report the number of rows in the
       
  2910 	result set. As a result, RDbRowSet::Count() returns KMaxTUint in the
       
  2911 	majority of cases.
       
  2912 	In general, Count() is an expensive operation and should not be used
       
  2913 	lightly.
       
  2914 
       
  2915 8). No interpretation of ODBC status codes. In case of an ODBC error,
       
  2916 	KErrGeneral is returned.
       
  2917 
       
  2918 9). Bit columns (EDbColBit) cannot be NULL.
       
  2919 
       
  2920 10). Text columns (EDbColText8) are currently limited to 255 characters.
       
  2921 
       
  2922 11). Binary column extraction (EDbColBinary) is limited to the first 2K of the
       
  2923 	data.
       
  2924 
       
  2925 12). TUint32 column accessor functions cannot be used at the moment due to an
       
  2926 	overload ambiguity with TSystemTime.
       
  2927 
       
  2928 13). The full range of the unsigned integer column types is not available.
       
  2929 	Values are constrained to the range of the corresponding signed types.
       
  2930 
       
  2931 14). The Access driver does not support NOT NULL columns.
       
  2932 	RDbDatabase::CreateTable() does accept KDbColNotNull columns but cannot
       
  2933 	enforce it.
       
  2934 
       
  2935 15). RDbDatabase::AlterTable() is not currently implemented.
       
  2936 
       
  2937 NOTES
       
  2938 =====
       
  2939 
       
  2940 The DBMS's requirements are currently undergoing extensive revision, due to
       
  2941 changes in ERA's overall strategy for persistent storage. This may result in a
       
  2942 number of changes to the API.
       
  2943