Here's BaseTen 1.7 (6.8MB .dmg), released on June 12th, 2009.

Also see the tutorial, the reference manual and the instructions on building BaseTen from the source repository.

An archive of previous versions is also available.

Release Notes for 1.7

  • BaseTen
    • BaseTen's date and time type handling has been significantly overhauled.
      • Timestamp and datetime types are now always returned as NSDates.
      • NSDates are stored into the database in UTC. When fetching, database values are assigned the UTC time zone, or, if they are qualified with some other time zone on the database, converted to UTC.
      • NSCalendar is now used instead of NSCalendarDate when converting NSDates to date strings.
      • PostgreSQL "time" types are now handled. On the Cocoa side, they are converted to NSDates with the appropriate time offset from the reference date.
    • New and changed data type support
      • The XML data type can now be fetched as NSXMLDocument. This happens if the database schema is enforcing document-only values with a constraint such as CHECK(column IS DOCUMENT).
      • "bit" and "varbit" fields are now fully supported. They are fetched as NSStrings because they can't easily be represented as octets.
      • In additiong to fetching "point" fields as NSPoints, NSPoint values can now be saved into the database.
    • Changes to the way BaseTen supports database relationships
      • The default key names for to-many relationships have changed to the format "<relation>Set". The previous form, "<relation>", is now deprecated. Add a symbolic breakpoint to BXDeprecationWarning to find uses of these deprecated keys.
      • BaseTen can now extract direction-specific relationship names from a foreign key constraint's name. The combined length of these two names can be a maximum of 61 bytes of UTF-8. This facility is used by the updated BaseTen Assistant to import the direction-specific names from Xcode Data Modeler schemas.
      • When creating new objects with a field values dictionary, to-one related objects (or their object IDs) can now be specified as an alternative to specifying the values of the foreign key fields. The relationship name is used as the key.
    • Other changes
      • All text transferred between the database and BaseTen will now be normalized to Unicode normal form D, ie. the format produced by -[NSString decomposedStringWithCanonicalMapping].
      • Most locking queries sent by BaseTen can now be disabled, and documentation has been added to describe the locking functionality.
      • More of BaseTen's internals have now been documented in the reference manual.
      • When inserting, updating or deleting rows, BaseTen now notices (and posts notifications of) changes that occur as a result of database triggers or rules firing. The only requirement is that said changes are to entities other than the one being changed by BaseTen; changes to the same entity will still be ignored.
      • BXDatabaseObjectID is now documented as thread-safe since it only uses NSURL.
      • BXSetProxies are now declared as deriving from NSMutableSet, as the NSCountedSet's countability property isn't currently used by BaseTen.
      • BaseTen will no longer try to unescape non-"bytea" columns.
      • More SSL status codes are now available for determining when SSL is unavailable, automatic SSL certificate verification fails, user clicks Cancel in the certificate trust panel or some other SSL error occurs.
      • Worked around potential issues with garbage collection where BaseTen used pointers to objects' internal structures.
      • KVO willChange notifications sent from -setPrimitiveValue:forKey: are now always called before the update. In certain cases with earlier BaseTen versions, observers might receive the notification after the change had been made.
      • Some connection error messages are now more accurate.
  • BaseTenAppKit
    • BXSynchronizedArrayController can now remove objects even if the content set is bound to another array controller.
    • BXSynchronizedArrayController's property fetchesOnConnect is now called fetchesAutomatically. If it's set, a fetch will also be performed when an already-connected database context is assigned to the array controller.
    • BaseTenAppKit now embeds the Interface Builder plug-in. Interface Builder loads the plug-in if the framework has been added to a project.
    • Fixed a crasher which occurred when connecting to a server with SSL capability in asynchronous mode.
    • Fixed awkward user interaction when clicking Cancel in the certificate trust panel.
    • Fixed a bug which caused object creation to fail if BXSynchronizedArrayController was instantiated in a nib and hadn't performed a fetch.
  • BaseTen Assistant
    • BaseTen Assistant can now name both sides of one-to-many and one-to-one relationships with the names entered in the Xcode Data Modeler.
    • Optional relationships are now be created as optional and required relationships as required.
    • Columns will no longer be created for transient attributes in data models.
    • Relationships are now listed in the Inspector and info windows.
    • A graphical representation of the database schema can now be created for use with Graphviz or OmniGraffle.
    • Temporary information can now be deleted from BaseTen schema.
    • Help is now more comprehensive.

Release Notes for 1.6.2

  • BaseTen 1.6.2 was released on April 2nd, 2009.
  • Features
    • BaseTen Assistant now has a menu item for installing the BaseTen schema.
  • Bug fixes
    • Fixed a bug in baseten.disable SQL function. The bug caused the function search baseten tables from the search path instead of the baseten schema. This could have caused data loss if tables named “mod__” or “lock__” followed by the disabled table's oid existed in the search path.
    • Fixed a bug in AuthenticationView.nib which caused some controls in the authentication panel not to be disabled during authentication.
    • BXNetServiceConnector now removes the password from BXDatabaseContext's URI when authentication request gets cancelled.
    • The Bonjour menu in BaseTen Assistant's connection panel now works.
    • Some old SQL function names had been left to BaseTen Assistant. Renamed them.
    • Removing BaseTen schema no longer leaves BaseTen Assistant into an inconsistent state.
    • If BXDatabaseContext's delegate called BXSynchronizedArrayController's fetch in connection callback, the entity mightn't have been prepared earlier. Now it will be prepared if not set when fetching.
    • Made BXNetServiceConnector replace the URI only if it changes when setting the host. Earlier, the entity descriptions which the database context had already passed around could have become invalid.
    • When building BaseTen, special characters in paths to m4 files (which do exist inside the project folder) are now handled correctly.
    • Made the PostgreSQL build script build the whole database server instead of just psql and libpq because it failed on an 8-core machine.

Release Notes for 1.6.1

  • BaseTen 1.6.1 was released on March 30th, 2009
  • Features
    • All PostgreSQL's array types should now be guaranteed to be mapped to NSArray.
  • Bug fixes:
    • BXNetServiceConnector now handles the situation in which an application modal panel is being used and the host is specified in the initial database URI. (Fixes #175.)
    • Updated the part of documentation about enabling relations, especially what should be done if the database schema will be changed. (Fixes #173.)
    • Fixed a bug which caused PGTSTableDescription to return the wrong index as the primary key under certain conditions; the indices were sorted by the index oid instead of relation oid and key primarity.
    • Fixed a bug in BXNetServiceConnector which caused the CFHost's run loop callback to be left pending even after the listener had been deallocated.
    • Fixed a bug in BXSynchronizedArrayController which caused garbage to be left in an ivar.
    • Removed references to inexistent types.

Release Notes for 1.6

  • BaseTen 1.6 was released on March 3rd, 2009.
  • Features
    • Database metadata fetching has been rewritten and is now much faster.
    • BaseTen-specific SQL tables and views have also been optimized to require a smaller number of queries when making a connection.
    • Queries sent after receiving change notifications from the database have also been made simpler.
    • Database metadata is now shared across database contexts.
    • Thread safety in metadata classes.
    • Query logging is possible again. Query results are logged as well.
    • Host existence is now checked before asking the user for login credentials.
    • BXSynchronizedArrayController now sets created objects' foreign key fields if its content is bound to another synchronized array controller.
  • Bug fixes include:
    • BaseTen
      • Self-updating collections now work even if they were initially empty.
      • Reconnecting after system sleep no longer requires SSL if set to prefer.
      • Password will only be stored into the Keychain if it's known to work.
      • Importing entities with equal names from an Xcode data model now works.
      • BaseTenModifications.sql is now included in the framework bundle.
      • More errors are reported, such as fetching from an inexisting entity.
    • BaseTenAppKit
      • User-supplied IPv6 addresses are now handled correctly.
      • Most parts of generic connection panel implementation have been rewritten. The panels should now work more reliably.
    • BaseTen Assistant
      • SQL syntax in certain queries.
      • Helper tables are now removed before replacing entities.
      • Making changes to an Xcode data model no longer requires the assistant to be restarted.
      • Port number field now accepts an empty value after it has been filled once.
      • The main window's position is now stored into preferences.
      • The assistant's help now works.

Release Notes for 1.5

  • BaseTen 1.5 was released on November 28th, 2008.
  • Rewrote most of the PostgreSQL interface.
  • Added support for various predicate and expression types.
  • Unsupported predicates and expressions are now evaluated on the client side.
  • Connection loss is handled at least on system sleep.
  • Text strings are now stored as decomposed in the database.
  • Fixed bugs related to NSKVO compliance of to-one relationships; KVO notifications should now be posted as expected.
  • BaseTen Assistant now has a new GUI.
  • BaseTen can now connect to databases that haven't been BaseTen enabled.
  • Fixed various bugs.

Release Notes for 1.0

  • Leopard compatibility for non-gc applications.
  • The disk image now contains a plug-in for Interface Builder 3.0; the old palette is available as a separate download.
  • Database objects' related object collections may now be key-value observed.
  • Reworked relationship internals for improved reliability.
  • Added various Core Data -like methods to classes.
  • Key-value validation for NOT NULL constraints.
  • Validation for deletion of relationships.
  • Reduced thread creation on connect and fixed other bugs.

Release Notes for RC1

  • BaseTen RC1 was released on May 9th, 2007.
  • Added May 10th: Fixed a bug where both awakeFromInsert and awakeFromFetch were called for an inserted object.
  • BXDatabaseObjects now retain the neighboring objects accessed through relationships. This enables bindings to key paths across relationships, ie. "object.relatedobject.relatedobject.attribute".
  • As the memory management change above can cause cyclical references, we have added the method -[BXDatabaseContext refreshObject:mergeChanges:]. It, like its NSManagedObjectContext counterpart, can be used to re-fault BXDatabaseObjects and hence to release their referenced objects.
  • Simplified the naming of autodiscovered relationships. All relationships can now be accessed with the target table or view name as the key, ie. -[BXDatabaseObject theothertable]. This also works for many-to-many relationships; in those cases, you use the name of the actual target table, not the relationship glue table. The direction-specific names still work and are used by the BaseTen Assistant when importing Core Data models; BaseTen documentation will, however, emphasise the approach based on table names.
  • Other minor improvements and bug fixes.

Release Notes for DP4

  • BaseTen DP4 was released on April 10th, 2007.
  • BaseTen now includes a Bonjour browser and Keychain-enabled username/password entry dialogs. Specifying hostnames and username/password pairs in database URLs is therefore optional.
  • BaseTen honors the default system security policy when deciding whether an SSL certificate is to be trusted. If a certificate is not trusted by default, a dialog is shown. There is also a policy delegate API.
  • See BaseTenStickies for the above dialogs in action.
  • The database context can be set to connect to the database automatically, or only when manually prompted. This setting is also available in the Interface Builder palette.
  • A fetch predicate can now refer to entities across relationships. The syntax is not yet optimal, see ticket #65 for details.
  • The -awakeFromInsert, -isInserted and -isDeleted methods are now available and semantically equivalent to the same NSManagedObject methods
  • Bug fixes related to NSUndoManager support, to using multiple contexts in a single application, and other issues (Thanks to Ashley Clark.)

Release Notes for DP3.1

  • BaseTen DP3.1 was released on February 27th, 2007.
  • The BaseTen Assistant now imports validation predicates (maximum/minimum values, string lengths and regexp validation patterns)
  • There are likely to be bugs and compatibility issues with the Core Data ICU-based regexp validation patterns and the POSIX ones understood by PostgreSQL -- caveat emptor.
  • You can now perform custom SQL queries with two new convenience methods in the database context. The executeQuery:error: method returns the query result as an NSArray of NSDictionaries. The executeCommand:error: returns the number of affected rows:
    - (NSArray *)executeQuery:(NSString *)queryString error:(NSError **)error;
    - (unsigned long long)executeCommand:(NSString *)commandString error:(NSError **)error;
    
  • The database context now implements a Core Data -like setRetainsRegisteredObjects: method.
  • The full accuracy of timestamp columns (timestamp(6), microsecond precision) is now supported. Previously, sub-millisecond digits were discarded in conversions.
  • A number of bugs in DP3 have been fixed for DP3.1. We thank you for all the bug reports and patches.
  • Stay tuned for BaseTen for Workgroups DP3.11.

Release Notes for DP3

  • BaseTen DP3 was released on February 13th, 2007.
  • The keys used for accessing objects behind relationships have been changed. See the Relationships page for more information about the new naming.
  • The NSUndoManager grouping is now used to decide whether SAVEPOINTs are created between SQL statements in non-autocommit mode. This can speed up the processing of a group of related operations.
  • SSL connections are now supported; they can now be required or preferred. The system (Keychain) trust settings will be used by default; there is also a policy delegate API for further control.
  • The database connection can be initiated asynchronously to facilitate the display of certificate trust choice sheets to the end user.
  • The PostgreSQL client library has been updated to version 8.2.3
  • A number of bugs in DP2 have been fixed for DP3. We thank you for all the bug reports and patches.

Release Notes for DP2

  • BaseTen DP2 was released on January 12th, 2007.
  • We've been hard at work on bringing you this developer preview of BaseTen, but it's nowhere near finished. Lots of things work, lots of things don't. The primary function of this DP2 release is to allow you to evaluate the potential of BaseTen in its finished form.
  • A number of bugs in DP1 have been fixed for DP2. We thank you for all the bug reports and patches.
  • The BaseTen Assistant now supports setting the primary key columns of a view for the purposes of generating the database object ids -- this no longer needs to be done using -[BXEntityDescription setPrimaryKey:].
  • BaseTen DP2 can also automatically determine the physical tables a view is based on, so providing this information with -[BXEntityDescription viewIsBasedOnTablesInItsSchema:] or -[BXEntityDescription viewIsBasedOnEntities:] is no longer mandatory. Both of those calls can still be made in cases where, for example, the view depends on tables via an indirection such as a PL/pgSQL procedure.
  • If you want to have a relationship point from a view to another view instead of the physical table the foreign key constraint refers to, you still have to use -[BXEntityDescription setTargetView:forRelationshipNamed:]. We hope to have a nicer way of accomplishing this in a future release.

Release Notes for DP1

  • BaseTen DP1 was released on December 1st, 2006.
  • We've been hard at work on bringing you this developer preview of BaseTen, but it's nowhere near finished. Lots of things work, lots of things don't. The primary function of this DP1 release is to allow you to evaluate the potential of BaseTen in its finished form.
  • The Assistant does not import validation predicates (maximum/minimum values and string lengths, regexp validation patterns) in DP1
  • The debug output is often way too verbose, even in a Release build.
  • Practically all public classes are non-thread-safe, so thread safety must be enforced externally if required. Furthermore, all queries should be performed from the main thread. Exceptions to this are BXDatabaseObject and BXDatabaseObjectID, the thread-safe methods of which have been documented.
  • NSCoding has not been implemented for BXDatabaseObject.
  • Timestamp parsing causes accuracy to be lost if the timestamp precision is greater than 3. The workaround is to cast timestamps to timestamp (3) using views or otherwise.
  • Automatically updating collections currently don’t post KVO notifications. Instead, one should subscribe to NSNotifications kBXInsertNotification, kBXUpdateNotification and kBXDeleteNotification with the entity description as the notification object.