<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/wordpress-mu-1.2.3-2.2.1" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>Steve Shaughnessy</title>
	<link>http://blogs.codegear.com/steveshaughnessy</link>
	<description></description>
	<pubDate>Mon, 28 Jul 2008 05:07:09 +0000</pubDate>
	<generator>http://wordpress.org/?v=wordpress-mu-1.2.3-2.2.1</generator>
	<language>en-US</language>
			<item>
		<title>Tiburon DataSnap enhancements</title>
		<link>http://blogs.codegear.com/steveshaughnessy/2008/07/20/38912</link>
		<comments>http://blogs.codegear.com/steveshaughnessy/2008/07/20/38912#comments</comments>
		<pubDate>Mon, 21 Jul 2008 01:48:53 +0000</pubDate>
		<dc:creator>Steve Shaughnessy</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.codegear.com/steveshaughnessy/2008/07/20/38912</guid>
		<description><![CDATA[
Delphi now provides a new component based DataSnap server technology.  Existing applications can host their RemoteDataModules inside this new DataSnap server.  Our new DataSnap server does not support the DCOM technology.  If you still need DCOM, the older component set for DataSnap is still included in the product.  For the new DataSnap server, JSON/RPC based [...]]]></description>
			<content:encoded><![CDATA[<h1></h1>
<p><font face="Times New Roman">Delphi now provides a new component based DataSnap server technology.<span>  </span>Existing applications can host their RemoteDataModules inside this new DataSnap server.<span>  </span>Our new DataSnap server does not support the DCOM technology.<span>  </span>If you still need DCOM, the older component set for DataSnap is still included in the product.<span>  </span>For the new DataSnap server, JSON/RPC based messaging layer and pluggable transport layer is provided.</font></p>
<p><font face="Times New Roman">In addition to supporting existing RemoteDataModules, we now provide support for server methods and server connections.<span>  </span>Server methods are our light weight mechanism for remote method invocation.<span>  </span>They are ideal for writing stored procedure logic in an object oriented language such as Object Pascal.<span>  </span>Server methods can be invoked from dbExpress or ADO.NET clients in the same way that stored procedures are.<span>  </span>This is a very simple, easy to use mechanism for remote method invocation.<span>  </span>The DataSnap server uses dynamic method invocation to execute server methods.<span>  </span>This approach allows simple methods on plain old objects to be called from remote clients.<span>  </span>There is no need for a proprietary interface definition language or complicated tools to generate stubs and proxies.  Some developers have expressed interest in statically typed client side proxies for server classes.<span>  </span>These are not difficult to generate and support for this will be provided.<span>  </span>In the initial Tiburon release we may have to provide this capability as a separate example utility due to time constraints.<span>  </span>Tiburon already provides support to collect all the class/method/parameter metadata required to generate proxies allowing us to at least create an example utility to generate proxies.<span>  </span>Note that the more “dynamic” execution of a command by name described in more detail below and a “static” proxy approach are both viable. <span>  </span>There are trade offs to both approaches.<span>  </span>The dynamic approach blends in well with applications that work more directly with SQL queries and stored procedures.<span>  </span>The static approach provides better support for things like code insight and client side type safety when server side methods are refactored.</font></p>
<p><font face="Times New Roman">Server connections allow a client and server application to share a server side dbExpress database connection.<span>  </span>Only the DBXClient driver is needed on the client to access any dbExpress driver installed on the server.<span>  </span>The DBXClient is 100% Object Pascal making for a simple client side deployment.<span>  </span>Server connections allow a client to share the same database connection and transactional context with a server application.<span>  </span>An interesting application of server connections is to allow the client to perform select queries to read data, and to call server methods that use the same server connection to perform all insert, update and delete operations on the data.</font></p>
<p><span></span></p>
<p><font face="Times New Roman">The new DataSnap components are implemented in Object Pascal.<span>  </span>We currently provide win32 server side applications.<span>  </span>On the client we support both win32 and .net applications.<span>  </span>Server methods and server connections can both be accessed through both our dbExpress and ADO.NET connectivity solutions.<span>  </span>Going forward, we’d also like to support more client and server side platforms including javascript, php, .net and java.</font></p>
<h3><font face="Arial">Creating Server methods.</font></h3>
<p><font face="Times New Roman"><br />
Delphi developers will most likely want to add their server methods to a TDataModule class.<span>  </span>Delphi classes that contain server methods must be compiled with METHOD_INFO enabled because we use<br />
Delphi’s RTTI for the dynamic invocation of methods..<span>  </span>All server methods must be made public.<span>  </span>Here is a simple example of a TDataModule with server methods:</p>
<p></font><font face="Times New Roman"><font face="Times New Roman"><font face="Times New Roman"><font face="Times New Roman"><font face="Times New Roman"><a rel="attachment wp-att-38913" href="http://blogs.codegear.com/steveshaughnessy/2008/07/20/38912/i1_699jpg/" title="i1_699.jpg"><img src="http://blogs.codegear.com/files/2008/07/i1_699.jpg" alt="i1_699.jpg" /></a></font></font><font face="Times New Roman"> </font></font></font></font><font face="Times New Roman"><font face="Times New Roman"><font face="Times New Roman"><font face="Times New Roman"><font face="Times New Roman">Server methods parameters directions can be specified as input, input/output (var), output (out), and return (assign to Result).<span>  </span>Parameter types supported include the scalar values supported by dbExpress/ADO.NET drivers such as integer, string, date, time, floating point, etc.<span>  </span>Very large binary parameters can be passed as a TStream.<span>  </span>A TParams object can be used to pass an array of values or to return a single row result to the client.<span>  </span>Table shaped objects such as a TDataSet or a TDBXReader can be used as parameters and return values.<span>  </span>On the .net platform, a DataReader, DataView or DataTable can be used as parameters by the client.<span>  </span>Note that for table parameters the object type used on the client does not have to match the object type used in the signature of the server method.<span>  </span>This is because the messaging layer maps all table objects to a TDBXReader.<span>  </span>Custom TDBXReaders are fairly simple to implement.<span>  </span>It should not be too difficult to map a collection of object for an OR mapping technology into a TDBXReader inside a server method and return it to a client which reads it into a TDataSet.</font></font><font face="Times New Roman"><font face="Times New Roman">The implementation of these simple server methods is </font></font></font><font face="Times New Roman"><font face="Times New Roman"><font face="Times New Roman">listed below:</font></font></font></font></p>
<p><font face="Times New Roman"><font face="Times New Roman"><font face="Times New Roman"><font face="Times New Roman"><font face="Times New Roman"><a rel="attachment wp-att-38914" href="http://blogs.codegear.com/steveshaughnessy/2008/07/20/38912/i2_701jpg/" title="i2_701.jpg"><img src="http://blogs.codegear.com/files/2008/07/i2_701.jpg" alt="i2_701.jpg" /></a></font></font></font></font></font></p>
<p></font></p>
<h3></h3>
<h3><font face="Arial">Exposing server methods to clients</font></h3>
<p><font face="Times New Roman">Once you have implemented your server methods, they must be exposed by a DataSnap server.<span>  </span>This is easy.<span>  </span>Its best to create a separate DataModule for your DataSnap server.<span>  </span>Create a new DataModule and drop three components from the new “DataSnap Server” component category:<span>  </span>TDSServer, TDSTCPServerTransport, and TDSServerClass.<span>  </span>Set the TDSTCPServerTransport.Server property and the TDSServerClass.Server properties to the TDSServer.<span>  </span>The TDSServerClass.OnGetClass event must be set to your server class like this:</font></p>
<p><font face="Times New Roman"><a rel="attachment wp-att-38915" href="http://blogs.codegear.com/steveshaughnessy/2008/07/20/38912/i3_703jpg/" title="i3_703.jpg"><img src="http://blogs.codegear.com/files/2008/07/i3_703.jpg" alt="i3_703.jpg" /></a></font></p>
<p><font face="Times New Roman">Now execute the application and the server will be started automatically.<span>  </span>There is a TDSServer.AutoStart property that defaults to true which causes the server to start when it is notified that the component is being loaded.</font></p>
<h3><font face="Arial">Calling server methods from a client</font></h3>
<p><font face="Times New Roman">From the client’s perspective, server methods look a lot like stored procedures.<span>  </span>There are some notable exceptions though.<span>  </span>Server methods can send multiple table objects from the server to the client and from the client to the server.<span>  </span>Here is a simple example of a client calling one of the server methods above from within a dunit test case:</font></p>
<p><a rel="attachment wp-att-38916" href="http://blogs.codegear.com/steveshaughnessy/2008/07/20/38912/i4_705jpg/" title="i4_705.jpg"></a></p>
<h3><font face="Arial">Using server connections</font></h3>
<p><font face="Times New Roman">The DataSnap dbExpress connection can be used by a client application to access a server side dbExpress connection.<span>  </span>By default, a DataSnap dbExpress connection is only able to execute server methods on the DataSnap server it is connected to.<span>  </span>If the TDBXPropertyNames.ServerConnection property is set to a server method that returns an instance of TDBXConnection, then the client side DataSnap connection will also be able to execute sql commands against the returned TDBXConnection. <span>  </span>Here is an example of a server method that returns an instance of TDXConnection:</font></p>
<p><a rel="attachment wp-att-38918" href="http://blogs.codegear.com/steveshaughnessy/2008/07/20/38912/i4_708jpg/" title="i4_708.jpg"><img src="http://blogs.codegear.com/files/2008/07/i4_708.jpg" alt="i4_708.jpg" /></a><a rel="attachment wp-att-38916" href="http://blogs.codegear.com/steveshaughnessy/2008/07/20/38912/i4_705jpg/" title="i4_705.jpg"></a></p>
<p><font face="Times New Roman">The goal with this example is to keep things short and simple.<span>  </span>Note that some<br />
Delphi developers have pointed out that they prefer to use a separate try/finally for each object allocation with the allocation being made before the try.<span>  </span>An advantage of this approach over the one used above is that if an exception occurs in the destructor of an inner finally block, the out finally blocks will still be executed.<span>  </span>Another point that has been made is that the calls to FreeAndNil here are overkill since they are never accessed after they are freed.<span>  </span>As a matter of habit I like to use FreeAndNil in dunit test cases because for us there tends to be a higher likelihood of reallocating an object in a test case method than in a typical application method.</font><font face="Times New Roman"> A client side connection can establish associate itself with this connection by setting its ServerConnection connection property to:</font><font face="Times New Roman"><font face="Times New Roman">ServerConnection=ServerMethodsDataModule.GetServerConnection</font></p>
<p><font face="Times New Roman">Note that there is a built-in Server method called DSAdmin.GetConnection that can be used to establish server connections using the dbxconnections.ini on the server.<span>  </span>This server method has a string input parameter which is used to specify what connection to use.<span>  </span>This example shows how to set the server connection to an ibconnection item in the dbxconnections.ini file:</font></p>
<p><font face="Times New Roman">ServerConnection=DSAdmin.GetConnection("ibconnection")</font></p>
<p></font></p>
<h3><font face="Arial">Hosting existing remote data modules</font></h3>
<p><font face="Times New Roman">RemoteDataModules are configured similar to any other server class.<span>  </span>As with other server classes, you will need to use a TDSServerClass component and wire the OnGetClass event to return your RemoteDataModule class.<span>  </span>On the client, you will need to use the new TDBXAppServerConnection.</font></p>
<p class="akst_link"><a href="http://blogs.codegear.com/steveshaughnessy/?p=38912&amp;akst_action=share-this"  title="Post to del.icio.us, etc." id="akst_link_38912" class="akst_share_link" rel="nofollow">Share This</a> | <a href="mailto:?subject=Tiburon%20DataSnap%20enhancements&body=Have you seen this? http%3A%2F%2Fblogs.codegear.com%2Fsteveshaughnessy%2F2008%2F07%2F20%2F38912" id="akst_email_38912" class="akst_share_email" rel="nofollow">Email this page to a friend</a></p>]]></content:encoded>
			<wfw:commentRss>http://blogs.codegear.com/steveshaughnessy/2008/07/20/38912/feed</wfw:commentRss>
		</item>
		<item>
		<title>Blackfish SQL part 2</title>
		<link>http://blogs.codegear.com/steveshaughnessy/2007/09/10/38908</link>
		<comments>http://blogs.codegear.com/steveshaughnessy/2007/09/10/38908#comments</comments>
		<pubDate>Mon, 10 Sep 2007 21:17:23 +0000</pubDate>
		<dc:creator>Steve Shaughnessy</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.codegear.com/steveshaughnessy/2007/09/10/38907/</guid>
		<description><![CDATA[In my second blog on Blackfish SQL I have highlighted several of its key features.  Many of these features are what make this product easy to work with and easy to deploy.  
Simple deployment.
There are single file deployment options for both the .NET and Java platforms.  If you use the windows version, there is only one [...]]]></description>
			<content:encoded><![CDATA[<p>In my second blog on Blackfish SQL I have highlighted several of its key features.  Many of these features are what make this product easy to work with and easy to deploy.<span>  </span></p>
<p><strong>Simple deployment.</strong></p>
<p>There are single file deployment options for both the .NET and Java platforms.<span>  </span>If you use the windows version, there is only one .NET assembly you need to deploy.<span>  </span><span>  </span>This is particularly nice for ASP.NET applications.<span>  </span>No longer need to rent a database from your ISP.<span>  </span>On the Java platform there is a single jar file to deploy.<span>  </span>The license file also needs to be deployed, but this is small and it is “not” machine locked.<span>  </span>This makes it easy to do simple xcopy deployments.<span>  </span>On both platforms the delployment size of the binaries is about 1.3 megabytes.</p>
<p><strong>Industry compliance.</strong></p>
<p>SQL-92 compliant.<span>  </span>Local and remote ADO.NET providers.<span>  </span>Local and remote JDBC drivers.<span>  </span>DBX4 100% Object Pascal win32/.NET driver.</p>
<p><strong>Performance.</strong></p>
<p>Early on we would do benchmarks against other Java databases.<span>  </span>However we quickly found that we were orders of magnitude faster than them.<span>  </span>We also found that we had no problem competing with databases written in native code.<span>  </span>Invariably, every time we found ourselves being beat it had nothing to do with managed code vs native code.<span>  </span>We could always match or beat the competition with better algorithms.<span>  </span>I know native code can be made faster for simple code, but with the complexity of transactional, high concurrency database kernel, better algorithms are king.<span>  </span>We have not performed major tuning for a while, and I’m not going to claim it’s the fastest, but this database is fast.</p>
<p><strong>In-process execution.</strong></p>
<p>The local ADO.NET and JDBC “local” drivers execute in process for improved performance and ease of deployment.</p>
<p><strong>Delphi, C#,<span>  </span>VB.NET, and Java stored procedures and triggers.</strong></p>
<p>These are safer and more powerful languages to write database stored procedures and triggers in.<span>  </span>In addition to using mainstream languages, you can also use off the shelf IDEs, debuggers and profilers to develop your stored procedures and triggers.</p>
<p><strong>Really cross platform.</strong> </p>
<p>Blackfish SQL pretty much runs every where .NET and Java run. We also have built a compact framework assembly for Blackfish SQL for the compact framework as well.<span>  </span>We are not ready to release this now, but we know it can be done. </p>
<p><strong>Unicode.</strong></p>
<p>This is the only way Blackfish ever knew to handle character data.<span>  </span>Dealing with character data is always simple.<span>  </span>No multi-byte, national character, etc issues.<span>  </span>You also don’t need to specify the length of a string for performance reasons.<span>  </span>String storage is transparently managed.<span>  </span>For collation we use the collation key support provided by the .NET and Java platforms.<span>  </span>Why reinvent the wheel? </p>
<p><strong>64 bit support.</strong></p>
<p>We didn’t have to lift a finger for this support.<span>  </span>If the .NET virtual machine is 64 bit, you can have a 64 bit database cache.<span>  </span>The same for a 64 bit Java vm.<span>  </span>Same binary for both 32 and 64 bit platforms.</p>
<p><strong>Security.</strong></p>
<p>Databases can be password protected and there is SQL based security including support for oles.<span>  </span>The database file itself can be encrypted using the Two fish 128 bit Two Fish block cipher.<span>  </span>Don’t forget your password.<span>  </span>There is no back door.<span>  </span>Some security conscious companies and government agencies view 100% managed code solutions as more secure.</p>
<p><strong>BDE.</strong></p>
<p>We have mentioned in our roadmap that Blackfish SQL as a BDE replacement.<span>  </span>Today this is still a bit of work because it requires that you move away from the simple TTable/Query navigational data access model.<span>  </span>Going forward we will be looking at what we can do to support a navigational model to facilitate BDE application migration to Blackfish SQL.<span>  </span>The idea is to support native win32/64 client applications that can connect to a Blackfish SQL server using a navigational data access model (TTable).</p>
<p><strong>Tooling.</strong></p>
<p>Our Blackfish SQL tooling is very basic. <span> </span>Leonel put a lot of work into adding ADO.NET, dbExpress 4 and query builder support into the DataExplorer in a relatively short period of time.<span>  </span>Our plan is to improve the capabilities and extensibility of DataExplorer going forward not just for Blackfish SQL, but also for Interbase and the rest of the databases we support as well.<span>  </span>In the mean time, Blackfish SQL has built-in “DB_ADMIN” stored procedures that allow applications to perform many common administrative tasks including database backup/copy/defragment/verify/encrypt/configuration, change password, metadata retrieval, active connections, lock manager state, and server side logging configuration.<span>  </span>The built-in DB_ADMIN stored process allows us to avoid polluting the name space of our standards based SQL dialect with Blackfish SQL specific extensions.</p>
<p class="akst_link"><a href="http://blogs.codegear.com/steveshaughnessy/?p=38908&amp;akst_action=share-this"  title="Post to del.icio.us, etc." id="akst_link_38908" class="akst_share_link" rel="nofollow">Share This</a> | <a href="mailto:?subject=Blackfish%20SQL%20part%202&body=Have you seen this? http%3A%2F%2Fblogs.codegear.com%2Fsteveshaughnessy%2F2007%2F09%2F10%2F38908" id="akst_email_38908" class="akst_share_email" rel="nofollow">Email this page to a friend</a></p>]]></content:encoded>
			<wfw:commentRss>http://blogs.codegear.com/steveshaughnessy/2007/09/10/38908/feed</wfw:commentRss>
		</item>
		<item>
		<title>ADO.NET 2.0 in about 4000 lines of Object Pascal</title>
		<link>http://blogs.codegear.com/steveshaughnessy/2007/09/10/38906</link>
		<comments>http://blogs.codegear.com/steveshaughnessy/2007/09/10/38906#comments</comments>
		<pubDate>Mon, 10 Sep 2007 20:51:03 +0000</pubDate>
		<dc:creator>Steve Shaughnessy</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.codegear.com/steveshaughnessy/2007/09/10/38811/</guid>
		<description><![CDATA[This release of RAD studio 2007 includes a new ADO.NET 2.0 provider implemented with about 4000 lines of Object Pascal.  Take out the comments and it is less than 4000 lines of code.  This provider is called the AdoDbxClient and it is the ADO.NET 2.0 provider for all dbExpress drivers that implement the new dbExpress 4.0 metadata.  [...]]]></description>
			<content:encoded><![CDATA[<p>This release of RAD studio 2007 includes a new ADO.NET 2.0 provider implemented with about 4000 lines of Object Pascal.<span>  </span>Take out the comments and it is less than 4000 lines of code.<span>  </span>This provider is called the AdoDbxClient and it is the ADO.NET 2.0 provider for all dbExpress drivers that implement the new dbExpress 4.0 metadata.<span>  </span>There are 9 drivers included in RAD studio 2007 that implement the new dbExpress 4.0 metadata.</p>
<p>This 4000 lines of code also replaces the all of the BDP ADO.NET 1.1 driver.<span>  </span>The reason this is possible is that we pushed most of the capabilities needed for an ADO.NET 2.0 driver into the dbExpress 4.0 framework.<span>  </span>In this way our win32 customers can benefit from the same features.<span>  </span>The new dbExpress 4.0 metadata is a perfect example of this shared capability.</p>
<p>BDP was implemented in C# and directly implemented the deprecated ADO.NET 1.1 interfaces.<span>  </span>This prohibited win32 applications from benefiting from any BDP improvements over dbExpress.<span>  </span>ADO.NET 2.0 also implemented many BDP extensions in an incompatible fashion.<span>  </span>Supporting both dbExpress and BDP would have created a lot more work for our development team.<span>  </span>Its maddening to have to maintain two separate code bases that provide many of the same capabilities for 8 or so different database vendors.</p>
<p>Unlike BDP, the AdoDbxClient bridges from Ado to dbExpress.<span>  </span>This approach allows us to “adapt” ADO.NET 2.0 to dbExpress 4. <span> </span>This also makes it easier for us to adapt to future changes in ADO.NET.<span>  </span>When you don’t control an API like ADO.NET, it is better to bridge than to extend.<span>  </span>This allows us to continue improving dbExpress and adapt to changes in ADO.NET as needed.</p>
<p>This is one more significant step towards making it easier to write database drivers using Delphi.<span>  </span>A conformant dbExpress 4 driver with dbExpress 4 metadata support can now be surfaced as an ADO.NET 2.0 provider with no additional work.</p>
<p>Our development team is very good at creating leverage.<span>  </span>With each new release we create new features along with new foundations for features in future releases.<span>  </span>The ADO.NET 2.0 provider is a perfect example of how this approach has paid off.<span>  </span>The dbExpress 4 framework was surfaced in our win32 release.<span>  </span>With the addition of broader and more consistent metadata, we were able to create an ADO.NET 2.0 provider for 9 different dbExpress drivers in a small number of months.</p>
<p class="akst_link"><a href="http://blogs.codegear.com/steveshaughnessy/?p=38906&amp;akst_action=share-this"  title="Post to del.icio.us, etc." id="akst_link_38906" class="akst_share_link" rel="nofollow">Share This</a> | <a href="mailto:?subject=ADO.NET%202.0%20in%20about%204000%20lines%20of%20Object%20Pascal&body=Have you seen this? http%3A%2F%2Fblogs.codegear.com%2Fsteveshaughnessy%2F2007%2F09%2F10%2F38906" id="akst_email_38906" class="akst_share_email" rel="nofollow">Email this page to a friend</a></p>]]></content:encoded>
			<wfw:commentRss>http://blogs.codegear.com/steveshaughnessy/2007/09/10/38906/feed</wfw:commentRss>
		</item>
		<item>
		<title>The new dbExpress 4.0 MetaData</title>
		<link>http://blogs.codegear.com/steveshaughnessy/2007/09/07/38810</link>
		<comments>http://blogs.codegear.com/steveshaughnessy/2007/09/07/38810#comments</comments>
		<pubDate>Fri, 07 Sep 2007 11:31:20 +0000</pubDate>
		<dc:creator>Steve Shaughnessy</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.codegear.com/steveshaughnessy/2007/09/07/38777/</guid>
		<description><![CDATA[In the effort to consolidate the dbExpress and BDP driver frameworks into one we needed to enhance the metadata for dbexpress.  The dbExpress 3 metadata is written in C.  The BDP metadata is written in C#.  The dbExpress metadata was not rich enough for the tooling infrastructure we want to support in the future for [...]]]></description>
			<content:encoded><![CDATA[<p><P>In the effort to consolidate the dbExpress and BDP driver frameworks into one we needed to enhance the metadata for dbexpress.<SPAN style="mso-spacerun: yes">  </SPAN>The dbExpress 3 metadata is written in C.<SPAN style="mso-spacerun: yes">  </SPAN>The BDP metadata is written in C#.<SPAN style="mso-spacerun: yes">  </SPAN>The dbExpress metadata was not rich enough for the tooling infrastructure we want to support in the future for both win32 and .NET.<SPAN style="mso-spacerun: yes">  </SPAN>Our solution was to implement new metadata for all drivers in Object Pascal.<SPAN style="mso-spacerun: yes">  </SPAN>This can be compiled for both win32 and .NET.</P> <P> </P> <P>On the .net side this is also the metadata we use for our ADO.NET 2.0 AdoDbxClient provider which allows any of our dbExpress drivers to be surfaced as an ADO.NET 2.0 provider.</P> <P> </P> <P>Another interesting aspect is that the new metadata is provider based making it pluggable.<SPAN style="mso-spacerun: yes">  </SPAN>This allows other dbExpress driver implementations that use the same back end to reuse our metadata implementation.<SPAN style="mso-spacerun: yes">  </SPAN>It also allows us to potentially support other vendor&#8217;s ADO.NET drivers with our tooling.<SPAN style="mso-spacerun: yes">  </SPAN>For example, the DataExplorer can use Microsoft&#8217;s ADO.NET driver with our MS-SQL metadata provider.</P> <P> </P> <P>The provider is specified in the dbxdrivers.ini.<SPAN style="mso-spacerun: yes">  </SPAN>If this entry does not exist in the dbxdrivers.ini file, the metadata request will be passed on to the underlying driver.<SPAN style="mso-spacerun: yes">  </SPAN>In the case of our dbxDrivers, you will get dbExpress 3 metadata support.</P> <P> </P> <P>I&#8217;d say about 25% of the dbExpress driver implementations deal with metadata support.<SPAN style="mso-spacerun: yes">  </SPAN>There is already a large amount of framework implementation shared for all drivers.<SPAN style="mso-spacerun: yes">  </SPAN>With the new metadata we are one more significant step towards a 100% Object Pascal solution.<SPAN style="mso-spacerun: yes">  </SPAN>Object Pascal provides us with the portability we need to support win32, .NET and eventually win64.</P> <P> </P> <P>The new metadata commands are documented in the DbxCommon.pas.<SPAN style="mso-spacerun: yes">  </SPAN>There are also several classes with constants and documentation for the new metadata tables and their columns.<SPAN style="mso-spacerun: yes">  </SPAN>The new metadata extends dbExpress 3 metadata with support for retrieving:<SPAN style="mso-spacerun: yes">  </SPAN>data types, views, synonyms, catalogs, schemas, procedure source, package source, package procedure parameters, roles, and reserved words.</P> <P> </P> <P>We also now provide driver independent support for editing metadata.<SPAN style="mso-spacerun: yes">  </SPAN>Support for creating sql dialect sensitive create, alter, drop statements was initially only provided for tooling purposes in the DataExplorer.  However we have now also exposed a DbxMetaDataProvider class that surfaces this capability for applications.  This will make a slight increase in the size of your application since you will need to include the metadata writers.  The ability to generically create tables is useful for many applications.  The interface allows you to describe what a table and its columns should look like.  This description is passed to the TdbxMetaDataProvider.CreateTable.  Here is a very simple example that shows how to create a table with an int32 column named "C1", a decimal with a precision of 10 and scale of 2 named "C2" and a character based column with a precision of 32 named "C3". </P> <P><SPAN style="FONT-FAMILY: 'Courier New'">var<BR>  MetaDataTable: TDBXMetaDataTable;<BR>  DataGenerator: TDbxDataGenerator;<BR>  Command: TDBXCommand;<BR>  Row: Integer;<BR>begin<BR>  MetaDataTable := TDBXMetaDataTable.Create; </SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">  MetaDataTable.TableName := &#8216;QCXXX_TABLE&#8217;;<BR>  MetaDataTable.AddColumn(TDBXInt32Column.Create(&#8217;C1&#8242;));<BR>  MetaDataTable.AddColumn(TDBXDecimalColumn.Create(&#8217;C2&#8242;, 10, 2));<BR>  MetaDataTable.AddColumn(TDBXUnicodeCharColumn.Create(&#8217;C3&#8242;, 32));<BR>  MetaDataProvider.CreateTable(MetaDataTable); <BR><BR></SPAN></P> <P>TDBXInt32Column, DecimalColumn and UnicodeCharColumn are pre fabricated class extensions of the TDBXMetaDataColumn class.  The TDBXMetaDataColumn class contains several column properties including data type, precision, scale, is fixed length, is Unicode, etc.  You can create your own pre fabricated classes for column types common to your application.  The MetaDataProvider will find the best possible match of each TDBXMetaDataColumn to the underlying type system of the targeted database backend.</P> <P> </P></p>
<p class="akst_link"><a href="http://blogs.codegear.com/steveshaughnessy/?p=38810&amp;akst_action=share-this"  title="Post to del.icio.us, etc." id="akst_link_38810" class="akst_share_link" rel="nofollow">Share This</a> | <a href="mailto:?subject=The%20new%20dbExpress%204.0%20MetaData&body=Have you seen this? http%3A%2F%2Fblogs.codegear.com%2Fsteveshaughnessy%2F2007%2F09%2F07%2F38810" id="akst_email_38810" class="akst_share_email" rel="nofollow">Email this page to a friend</a></p>]]></content:encoded>
			<wfw:commentRss>http://blogs.codegear.com/steveshaughnessy/2007/09/07/38810/feed</wfw:commentRss>
		</item>
		<item>
		<title>Blackfish SQL</title>
		<link>http://blogs.codegear.com/steveshaughnessy/2007/09/06/38776</link>
		<comments>http://blogs.codegear.com/steveshaughnessy/2007/09/06/38776#comments</comments>
		<pubDate>Thu, 06 Sep 2007 22:24:15 +0000</pubDate>
		<dc:creator>Steve Shaughnessy</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.codegear.com/steveshaughnessy/2007/09/06/33377/</guid>
		<description><![CDATA[We&#8217;ve been going about 90 miles an hour this summer working to get the next release of BDS studio out.&#160; On the database side of the house there are a ton of new features.&#160; I don&#8217;t know what we were thinking putting so much into the product and shipping at the end of the summer.&#160; [...]]]></description>
			<content:encoded><![CDATA[<p><P>We&#8217;ve been going about 90 miles an hour this summer working to get the next release of BDS studio out.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>On the database side of the house there are a ton of new features.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I don&#8217;t know what we were thinking putting so much into the product and shipping at the end of the summer.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>The good news is that there&#8217;s lots of cool features to talk about now.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>In this blog I&#8217;m going to talk about one of the big features &#8211; Blackfish SQL 8.0.</P> <P>&nbsp;</P> <P>Blackfish SQL is an embeddable database which is now a feature of Delphi.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Delphi Pro, Enterprise and Architect customers have unlimited deployment licenses of Blackfish SQL.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>There are file size and user limits, but these limits should be acceptable for a large number of smaller scale applications.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Deployment licenses can be purchased if the user or file size limits need to be increased.</P> <P>&nbsp;</P> <P>The Blackfish SQL database was written completely in Java for its first 7 revisions.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>The database product was called JDataStore then.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>A couple years ago or so Jens Ole created a Java to C# translator so that we could create a .NET version of the database. <SPAN style="mso-spacerun: yes">&nbsp;</SPAN>The bulk of the database kernel, query engine and driver layers are written in Java with minimal dependencies on runtime classes.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Since at its core the C# language and .NET runtime is semantically very similar to Java&#8217;s, and because we had minimal runtime dependencies, the Java to .NET translator came together fairly quickly (well, much faster than rewriting the database).<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>This translator allows us to continue extending the internals in Java and then automatically translate to C# to produce the .NET edition.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>There is a very high degree of compatibility between the .NET and Java editions.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>.NET clients can connect to Java servers and visa versa.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>The file format is compatible as well.</P> <P>&nbsp;</P> <P>We also have introduced a 100% Object Pascal DBX4 driver that can connect to Blackfish SQL called DbxClient.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Source code for this driver is included in the product.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>It can be compiled for either win32 or .NET. Because it is 100% Object Pascal and requires no client library you can even build &#8220;big fat win32 exes&#8221; that connect to either a Blackfish SQL for windows (.NET) or Blackfish SQL for Java server.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>No additional client library is required.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>This is a perfect example of why I really like seeing database drivers implemented in Object Pascal.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>This allows us to use the same code for both .NET and win32 as packages or linked directly into the exe.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>When there is 64 bit Delphi we can reuse the same code yet again.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>What other language and runtime can do this as elegantly as Delphi (or even at all)?<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>To me this is one of the many reasons Delphi just flat out rocks.</P> <P>&nbsp;</P> <P>What else is cool about DbxClient?<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Well, its not called the Blackfish SQL DBX4 driver.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>It&#8217;s a driver that remotes the interfaces of the DBX4 framework.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>It can connect to anything that understands its JSON based streaming protocol.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Today only the Blackfish SQL for windows and Blackfish SQL for Java support this protocol.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>However, I&#8217;d really like to see if we can leverage this technology as a connectivity solution for DataSnap as well.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I view a database driver is a fairly&nbsp;capable&nbsp;RPC layer.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>The streaming protocol is currently a hybrid where it will mix binary data with text data.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>In the future we&#8217;d also like to implement a full text mode to support other transports like http(s).<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>The binary hybrid mode is more compact and performant.</P> <P>&nbsp;</P> <P>Another interesting aspect of the DbxClient is the source code.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I already mentioned that it was 100% Object Pascal compliable for win32, .NET and someday the win64 platform.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>If you look at the source code you will notice that some units are located under a pas directory tree and some are located under an xpas directory tree.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>The source code in the pas directories was authored in Delphi.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>The source code in the xpas was not.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Jens Ole has taught his Java to C# translator a new trick.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>It now can also translate from Java to Object Pascal.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Its pretty hard to tell it came from Java though.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Typical Delphi naming conventions are applied as part of the translation process and multiple related classes are packaged into single Delphi units.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Often times a Java package of classes logically maps to a Delphi unit.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Why do we do this?<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>By using Java as &#8220;pseudo code&#8221;, we can maintain this JSON based streaming protocol on 3 different platforms:<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Delphi/C++ win32/win64, .NET and Java.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Keep in mind we have a .NET and a Java server at the other end of the DbxClient that need to be able to interpret the same JSON streaming protocol.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>This same technique was also applied for the new DBX4 metadata.</P> <P>&nbsp;</P> <P>DBXClient also has some DBX4 extensions.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>It is the first dbExpress driver we have created that supports streaming blobs and parameter metadata.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>You don&#8217;t need to read the entire contents of the blob in one shot.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>This is not that big of a deal for things like pictures.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>But for things like video streams you really want to be able to stream the blob.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>The DBXClient also supports parameter metadata.<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>If you don&#8217;t add parameters to the command, it will add them for you when you prepare the statement.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>This saves coding and is less error prone than creating parameter objects yourself.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I&#8217;d like to make these important capabilities part of a &#8220;DBX5&#8221; in the future.</P> <P>&nbsp;</P> <P>That&#8217;s enough for one blog&#8230;</P></p>
<p class="akst_link"><a href="http://blogs.codegear.com/steveshaughnessy/?p=38776&amp;akst_action=share-this"  title="Post to del.icio.us, etc." id="akst_link_38776" class="akst_share_link" rel="nofollow">Share This</a> | <a href="mailto:?subject=Blackfish%20SQL&body=Have you seen this? http%3A%2F%2Fblogs.codegear.com%2Fsteveshaughnessy%2F2007%2F09%2F06%2F38776" id="akst_email_38776" class="akst_share_email" rel="nofollow">Email this page to a friend</a></p>]]></content:encoded>
			<wfw:commentRss>http://blogs.codegear.com/steveshaughnessy/2007/09/06/38776/feed</wfw:commentRss>
		</item>
		<item>
		<title>The Delphi Renaissance</title>
		<link>http://blogs.codegear.com/steveshaughnessy/2007/03/21/33376</link>
		<comments>http://blogs.codegear.com/steveshaughnessy/2007/03/21/33376#comments</comments>
		<pubDate>Wed, 21 Mar 2007 10:54:28 +0000</pubDate>
		<dc:creator>Steve Shaughnessy</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.codegear.com/steveshaughnessy/2007/03/21/32311/</guid>
		<description><![CDATA[I was chatting with Dan Miser about the new Delphi 2007 yesterday and he made an interesting comment about the product:&#160; &#8220;yeah. i like the renaissance going on with Delphi&#8221;.&#160; I thought to myself that &#8220;renaissance&#8221; was a really cool way to describe what is going on with Delphi and CodeGear as a whole.&#160; I&#8217;d [...]]]></description>
			<content:encoded><![CDATA[<p><P>I was chatting with Dan Miser about the new Delphi 2007 yesterday and he made an interesting comment about the product:<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>&#8220;yeah. i like the renaissance going on with Delphi&#8221;.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I thought to myself that &#8220;renaissance&#8221; was a really cool way to describe what is going on with Delphi and CodeGear as a whole.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I&#8217;d like to take a few minutes to describe what I think is fueling this renaissance.</P> <P>&nbsp;</P> <P>I think its interesting to take a look at what is going on in the inside of the Delphi team.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Many measures were taken during this development cycle to improve the quality of the product and the productivity of the team.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>The product is continuously built and tested as developers check into the source code repository.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Its pretty much a criminal act to check in something that either breaks the build or our automated tests.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>The obvious benefits of this are that you ship a better quality product in a timely fashion and the overall productivity of the team is increased because we don&#8217;t loose as much time to product breakages.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>There were also several other key efforts to improve our automation of the mundane including string resourcing, help system production and the construction of developer builds.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>In addition to process improvements the team as a whole really pulled together in these last two months working really hard to create the best possible Delphi 2007. </P> <P>&nbsp;</P> <P>CodeGear Enablement.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>When it comes to management, you really have to watch what is done and not what they said.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I do think many positive steps have been implemented to enable CodeGear products and their respective teams to succeed.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>This isn&#8217;t rocket science, just good old fashioned common sense.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Enable CodeGear to focus on the tools business.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Pay attention to developers.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Continue to invest in successful products.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Invest in new products.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>The morale and energy in CodeGear is much higher than it has been in years.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>In Scotts Valley alone we have many talented employees who had previously left the company who have now returned.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>We have many talented new employees as well.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>A high quality Delphi 2007 release was delivered in a timely fashion.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>We are on the verge of releasing several other products.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>These are the positive signs and benefits of enablement.</P> <P>&nbsp;</P> <P>I think what makes great products is the convergence of motivated and talented people who care about the products and customers.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>To enable this convergence the products and teams must be provided the environment and means to succeed.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>These things are all key to creating a renaissance.</P> <P>&nbsp;</P> <P>-Steve</P></p>
<p class="akst_link"><a href="http://blogs.codegear.com/steveshaughnessy/?p=33376&amp;akst_action=share-this"  title="Post to del.icio.us, etc." id="akst_link_33376" class="akst_share_link" rel="nofollow">Share This</a> | <a href="mailto:?subject=The%20Delphi%20Renaissance&body=Have you seen this? http%3A%2F%2Fblogs.codegear.com%2Fsteveshaughnessy%2F2007%2F03%2F21%2F33376" id="akst_email_33376" class="akst_share_email" rel="nofollow">Email this page to a friend</a></p>]]></content:encoded>
			<wfw:commentRss>http://blogs.codegear.com/steveshaughnessy/2007/03/21/33376/feed</wfw:commentRss>
		</item>
		<item>
		<title>DbExpress 4 Performance.</title>
		<link>http://blogs.codegear.com/steveshaughnessy/2007/02/24/32310</link>
		<comments>http://blogs.codegear.com/steveshaughnessy/2007/02/24/32310#comments</comments>
		<pubDate>Sat, 24 Feb 2007 00:16:26 +0000</pubDate>
		<dc:creator>Steve Shaughnessy</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.codegear.com/steveshaughnessy/2007/02/24/31866/</guid>
		<description><![CDATA[In my first blog on the new DbExpress driver framework concerns were raised about its performance.  I worry about this a lot myself.  The initial goal was to make sure we didn&#8217;t make anything slower.  Justin is a member on our team who has completed some preliminary tests that show that there is no measurable [...]]]></description>
			<content:encoded><![CDATA[<p><P>In my first blog on the new DbExpress driver framework concerns were raised about its performance.<SPAN style="mso-spacerun: yes">  </SPAN>I worry about this a lot myself.<SPAN style="mso-spacerun: yes">  </SPAN>The initial goal was to make sure we didn&#8217;t make anything slower.<SPAN style="mso-spacerun: yes">  </SPAN>Justin is a member on our team who has completed some preliminary tests that show that there is no measurable degradation between dbExpress 3 and 4.<SPAN style="mso-spacerun: yes">  </SPAN>In some cases the performance has actually improved.<SPAN style="mso-spacerun: yes">  </SPAN>There are so many variables in performance analysis and tuning.<SPAN style="mso-spacerun: yes">  </SPAN>All of our tests are still preliminary and need more investigation.<SPAN style="mso-spacerun: yes">  </SPAN>So I am not going to that we are as good or better across the board.<SPAN style="mso-spacerun: yes">  </SPAN>At least not yet.</P> <P> </P> <P>The dbExpress 4 vcl (the SqlExpr unit) is now single sourced and sits on top of the new dbExpress 4 driver framework.<SPAN style="mso-spacerun: yes">  </SPAN>This makes for a clean separation of component and driver layers.<SPAN style="mso-spacerun: yes">  </SPAN>The dbExpress 4 driver framework is also fairly easy to use, it just doesn&#8217;t have all of the features of the components that sit on top of it.</P> <P> </P> <P>So what makes dbExpress 4 faster?<SPAN style="mso-spacerun: yes">  </SPAN>If you use the new dbExpress 4 driver framework directly there will be less over head because you are little closer to the metal.<SPAN style="mso-spacerun: yes">  </SPAN>Scans of large tables don&#8217;t usually show much of a win.<SPAN style="mso-spacerun: yes">  </SPAN>But there is a small, significant difference when executing multiple short duration select statements.<SPAN style="mso-spacerun: yes">  </SPAN>Execution of non-select statements is about 2 times faster on the native platform.<SPAN style="mso-spacerun: yes">  </SPAN>This is due to the fact that the vcl was closing the statement for every execution of non-select statements.<SPAN style="mso-spacerun: yes">  </SPAN>Turns out that there were 3 or 4 drivers that had bugs where they did not support executing a parameterized non-select statement more than once.<SPAN style="mso-spacerun: yes">  </SPAN>You never saw this problem because the vcl always closed the statement.<SPAN style="mso-spacerun: yes">  </SPAN>We fixed these problems for BDS2007.</P> <P> </P> <P>On the managed size, the performance difference between BDS2006 and BDS2007 vcl is much larger.<SPAN style="mso-spacerun: yes">  </SPAN>I have not had time to get to the bottom of this, but one reason may be the way we use pinvoke in the new framework. <SPAN style="mso-spacerun: yes"> </SPAN>In the new framework we try to provide pinvoke with as much information as possible about what we are trying to do.<SPAN style="mso-spacerun: yes">  </SPAN>Instead of passing data by pointer, the values are typed.<SPAN style="mso-spacerun: yes">  </SPAN>For example, instead of passing a pointer to a buffer that contains an int, we pass an int.<SPAN style="mso-spacerun: yes">  </SPAN>Pinvoke can choose to just pass this on the stack. <SPAN style="mso-spacerun: yes"> </SPAN>For Strings we pass String, for Strings we want return values for we pass a StringBuffer.<SPAN style="mso-spacerun: yes">  </SPAN>Pinvoke knows how to handle both.<SPAN style="mso-spacerun: yes">  </SPAN>We also mark all parameters with in and out attributes as needed.<SPAN style="mso-spacerun: yes">  </SPAN>The thinking is that we will provide as much information to pinvoke as possible.<SPAN style="mso-spacerun: yes">  </SPAN>This will at least make the interaction more safe and will hopefully also provide better performance.</P> <P> </P> <P>The new dbExpress 4 framework also has a new TDBXPool connection pool.<SPAN style="mso-spacerun: yes">  </SPAN>If your application frequently opens and closes connections, this will provide a significant performance boost.</P> <P> </P> <P>The analysis is not complete, but I don&#8217;t think most existing applications will see any significant degradation.<SPAN style="mso-spacerun: yes">  </SPAN>If you use pooling or start using the dbExpress driver framework directly, you will see some improvements for connection opens and short duration statement executions.<SPAN style="mso-spacerun: yes">  </SPAN>The improvements on the managed size have many times better than for the native side.<SPAN style="mso-spacerun: yes">  </SPAN><SPAN style="mso-spacerun: yes">  </SPAN></P></p>
<p class="akst_link"><a href="http://blogs.codegear.com/steveshaughnessy/?p=32310&amp;akst_action=share-this"  title="Post to del.icio.us, etc." id="akst_link_32310" class="akst_share_link" rel="nofollow">Share This</a> | <a href="mailto:?subject=DbExpress%204%20Performance.&body=Have you seen this? http%3A%2F%2Fblogs.codegear.com%2Fsteveshaughnessy%2F2007%2F02%2F24%2F32310" id="akst_email_32310" class="akst_share_email" rel="nofollow">Email this page to a friend</a></p>]]></content:encoded>
			<wfw:commentRss>http://blogs.codegear.com/steveshaughnessy/2007/02/24/32310/feed</wfw:commentRss>
		</item>
		<item>
		<title>What&#8217;s New?</title>
		<link>http://blogs.codegear.com/steveshaughnessy/2007/02/16/31865</link>
		<comments>http://blogs.codegear.com/steveshaughnessy/2007/02/16/31865#comments</comments>
		<pubDate>Fri, 16 Feb 2007 18:37:23 +0000</pubDate>
		<dc:creator>Steve Shaughnessy</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.codegear.com/steveshaughnessy/2007/02/16/30194/</guid>
		<description><![CDATA[  Michael Swindell just came in my office and asked me to blog on what we are cooking up in the database side of the Delphi house.  I&#8217;m pretty busy right now, so I&#8217;m just going to rattle off some things that I hope developers will find interesting.  Excuse me if I ramble, I&#8217;m not [...]]]></description>
			<content:encoded><![CDATA[<p><P> </P> <P>Michael Swindell just came in my office and asked me to blog on what we are cooking up in the database side of the Delphi house.<SPAN style="mso-spacerun: yes">  </SPAN>I&#8217;m pretty busy right now, so I&#8217;m just going to rattle off some things that I hope developers will find interesting.<SPAN style="mso-spacerun: yes">  </SPAN>Excuse me if I ramble, I&#8217;m not going to spend a lot of time editing this.</P> <P> </P> <P>I am not new to database technology, Borland or CodeGear, but I am relatively new to Delphi.<SPAN style="mso-spacerun: yes">  </SPAN>I joined the team last May.<SPAN style="mso-spacerun: yes">  </SPAN>Coming into this team I was fully aware of the proud Delphi heritage as tool for rapidly building database applications.<SPAN style="mso-spacerun: yes">  </SPAN>No question about it, this continues to be a key strength of the Delphi product.<SPAN style="mso-spacerun: yes">  </SPAN>However over time, several database related technologies have been introduced that either need modernization or provide redundant solutions to our customers.<SPAN style="mso-spacerun: yes">  </SPAN>Our customers need cutting edge technology, innovation, and consolidation of our technology offerings with as much backward compatibility and ease of migration as possible.<SPAN style="mso-spacerun: yes">  </SPAN>That&#8217;s a mouthful and an ambitious goal.<SPAN style="mso-spacerun: yes">  </SPAN>However we have a strong development team in place and with ongoing involvement of the Delphi developer community, I think we can pull it off. </P> <P> </P> <P><B>Delphi</B><B> the Super Platform</B></P> <P> </P> <P>I think when the .net framework first came out, many people thought it would replace most interest in developing native applications.<SPAN style="mso-spacerun: yes">  </SPAN>This thinking proved to be wrong.<SPAN style="mso-spacerun: yes">  </SPAN>Hindsight is 20-20 though.<SPAN style="mso-spacerun: yes">  </SPAN>We have customers that develop both native and managed applications.<SPAN style="mso-spacerun: yes">  </SPAN>We do not want to treat either as second class.<SPAN style="mso-spacerun: yes">  </SPAN>Luckily Delphi is the only language and runtime that I know of that allows software to be developed for both native and managed applications in a &#8220;first class&#8221; fashion.<SPAN style="mso-spacerun: yes">  </SPAN>There are ways to compile both .net and java applications into native executables, but they are just bringing their managed runtime into the app as a separate subsystem.<SPAN style="mso-spacerun: yes">  </SPAN>To me this is not first class.<SPAN style="mso-spacerun: yes">  </SPAN>Delphi on the other hand is more of a proper managed app when executing under .net and a proper native app when executing under the native win32 platform.<SPAN style="mso-spacerun: yes">  </SPAN>For example, Delphi will use .net memory management when executing on the .net platform and Delphi will use the existing highly optimized native memory management when executing on the win32 platform.<SPAN style="mso-spacerun: yes">  </SPAN>To me this an important feature that makes Delphi a &#8220;super platform&#8221;.<SPAN style="mso-spacerun: yes">  </SPAN>Microsoft with enormous R&amp;D resources could not achieve this kind of cross platform support for VB.<SPAN style="mso-spacerun: yes">  </SPAN>Delphi just turns out to be better suited as a super platform.</P> <P> </P> <P>The new software we are writing is single sourced.<SPAN style="mso-spacerun: yes">  </SPAN>We compile the same source code for both win32 and .net.<SPAN style="mso-spacerun: yes">  </SPAN>We build and run our dunit test suites every day for both win32 and .net.<SPAN style="mso-spacerun: yes">  </SPAN>It works well and allows us to provide a &#8220;first class&#8221; feature set for both our win32 and .net customers.</P> <P> </P> <P><B>Technology Consolidation</B></P> <P> </P> <P>Delphi has some redundant database related technologies.<SPAN style="mso-spacerun: yes">  </SPAN>Sometimes we will try to consolidate these offerings.<SPAN style="mso-spacerun: yes">  </SPAN>This allows us to put more energy into a common solution and simplify the choices for our customers.</P> <P> </P> <P>When I started last May we had two database SQL connectivity technologies:<SPAN style="mso-spacerun: yes">  </SPAN>dbExpress and BDP.<SPAN style="mso-spacerun: yes">  </SPAN>Delphi provides 8 dbExpress drivers and 8 or so BDP drivers out of the box.<SPAN style="mso-spacerun: yes">  </SPAN>The internals of the dbExpress and BDP actually share a common heritage.<SPAN style="mso-spacerun: yes">  </SPAN>They were both created by the same developers, but they are entirely separate code bases.<SPAN style="mso-spacerun: yes">  </SPAN>This is a lot of drivers to enhance and maintain.<SPAN style="mso-spacerun: yes">  </SPAN>Early on I made the call to consolidate these two technologies into one.<SPAN style="mso-spacerun: yes">  </SPAN>The result is the dbExpress 4 framework that will be included in the next Delphi result. The dbExpress framework is written in 100% Delphi. <SPAN style="mso-spacerun: yes"> </SPAN>This replaces the com based dbExpress 3 framework.<SPAN style="mso-spacerun: yes">  </SPAN>The dbExpress 4 framework is single sourced so applications that use the dbExpress framework can be compiled for both win32 and the .net platform without any source code modification.</P> <P> </P> <P>So what about BDP? It provides our customers with an ADO.NET solution.<SPAN style="mso-spacerun: yes">  </SPAN>However BDP is based on an older &#8220;interface&#8221; based version of ADO.NET.<SPAN style="mso-spacerun: yes">  </SPAN>The newer ADO.NET 2.0 introduced an interface based on abstract base classes and deprecated the more brittle interface based solution.<SPAN style="mso-spacerun: yes">  </SPAN>In my opinion, implementations of the ADO.NET abstract classes should not add methods to their implementations to add features.<SPAN style="mso-spacerun: yes">  </SPAN>This is Microsoft&#8217;s name space.<SPAN style="mso-spacerun: yes">  </SPAN>However, I want us to be able to innovate in our connectivity solution.<SPAN style="mso-spacerun: yes">  </SPAN>This is why I decided that we should create a &#8220;bridge&#8221; from ADO.NET to our new dbExpress Drivers and not &#8220;extend&#8221; the ADO.NET classes.<SPAN style="mso-spacerun: yes">  </SPAN>This allows us to move forward on our dbExpress technology and use a very lightweight bridge to provide a single ADO.NET driver.<SPAN style="mso-spacerun: yes">  </SPAN>In many ways the dbExpress 4 driver framework is a superset of the ADO.NET technology.</P> <P> </P> <P>The end result is that we have cut the drivers we must enhance and maintain in half, all driver features are provided to both native and managed applications, and we have an ADO.NET 2.0 driver that bridges to any dbExpress driver.<SPAN style="mso-spacerun: yes">    </SPAN>BDP and its support for the older version of ADO.NET 1.1 will be replaced with a new ADO to dbExpress bridge This bridge is implemented using the newer ADO.NET 2.0 abstract base classes.</P> <P> </P> <P><B>Product Innovation</B></P> <P> </P> <P>We have several innovative technologies in the works.<SPAN style="mso-spacerun: yes">  </SPAN>I&#8217;d like to talk about some interesting driver extensibility features that came out of our work to consolidate the dbExpress and BDP driver solutions.<SPAN style="mso-spacerun: yes">  </SPAN>The new dbExpress 4 framework introduces &#8220;delegate drivers&#8221;.<SPAN style="mso-spacerun: yes">  </SPAN>Delegate drivers are light weight and can be used to provide both pre and post processing of all public methods and properties of the dbExpress 4 framework.<SPAN style="mso-spacerun: yes">  </SPAN>There is a single connection property used to place a delegate driver in front of a regular dbExpress driver.<SPAN style="mso-spacerun: yes">  </SPAN>Here is a snippet below from my dbxconnections.ini file:</P> <P> </P> <P><SPAN style="FONT-FAMILY: 'Courier New'">[IBCONNECTION]</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">DelegateConnection=DBXTraceConnection</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">DriverName=Interbase</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">Database=workerbee:c:\BorlandInterbaseexamplesdatabaseemployee.gdb</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">&#8230;</SPAN></P> <P> </P> <P>The first line indicates that when we connect to IBCCONNECTION, it will be delegated to by the DBXTraceConnection.<SPAN style="mso-spacerun: yes">  </SPAN>DBXTraceConnection has properties in the same dbxconnections.ini file.<SPAN style="mso-spacerun: yes">  </SPAN>So its treated very similar to a full fledged driver.<SPAN style="mso-spacerun: yes">  </SPAN>Earlier in the same dbxconnections.ini file there is an entry for DBXTraceConnection as well:</P> <P> </P> <P><SPAN style="FONT-FAMILY: 'Courier New'">[DBXTraceConnection]</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">DriverName=DBXTrace</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">;TraceFile=c:\tempdbxtrace.txt</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">TraceFlags=PARAMETER;ERROR;EXECUTE;COMMAND;CONNECT;TRANSACT;BLOB;MISC;VENDOR;READER;DRIVER_LOAD;METADATA</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">;TraceDriver=true</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">;TraceFlags=NONE</SPAN></P> <P><SPAN style="mso-spacerun: yes"></SPAN> </P> <P> </P> <P>You can also chain delegate drivers.<SPAN style="mso-spacerun: yes">  </SPAN>For example, you can have a connection pool delegate that delegates to a trace delegate which in turn delegates to an Interbase driver.<SPAN style="mso-spacerun: yes">  </SPAN>We will included full source code for two dbExpress delegate drivers:<SPAN style="mso-spacerun: yes">  </SPAN>TDBXTrace and TDBXPool.<SPAN style="mso-spacerun: yes">  </SPAN>TDBXTrace provides framework level tracing.<SPAN style="mso-spacerun: yes">  </SPAN>The output is kind interesting.<SPAN style="mso-spacerun: yes">  </SPAN>Instead of &#8220;binding&#8221; this or &#8220;describing&#8221; that (who understands that stuff any way?), it outputs Delphi code that indicates how the framework is being used.<SPAN style="mso-spacerun: yes">  </SPAN>Here is a snippet from the execution of one of our dunit tests:</P> <P> </P> <P><SPAN style="FONT-FAMILY: 'Courier New'">{CONNECT<SPAN style="mso-spacerun: yes">        </SPAN>} Connection2.Open;</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">{COMMAND<SPAN style="mso-spacerun: yes">        </SPAN>} Command2_1 := Connection2.CreateCommand;</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">{COMMAND<SPAN style="mso-spacerun: yes">        </SPAN>} Command2_1.CommandType := Dbx.SQL;</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">{COMMAND<SPAN style="mso-spacerun: yes">        </SPAN>} Command2_1.Text := &#8216;SELECT * FROM BASICDML order by F_VARCHAR&#8217;;</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">{PREPARE<SPAN style="mso-spacerun: yes">        </SPAN>} Command2_1.Prepare;</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">{COMMAND<SPAN style="mso-spacerun: yes">        </SPAN>} Reader2_1_1 := Command2_1.ExecuteQuery;</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">{COMMAND<SPAN style="mso-spacerun: yes">        </SPAN>} Command2_2 := Connection2.CreateCommand;</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">{COMMAND<SPAN style="mso-spacerun: yes">    </SPAN><SPAN style="mso-spacerun: yes">    </SPAN>} Command2_2.CommandType := Dbx.MetaData;</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">{COMMAND<SPAN style="mso-spacerun: yes">        </SPAN>} Command2_2.Text := &#8216;GetIndexes "workerbee:c:\BorlandInterbaseexamplesdatabaseemployee.gdb"."sysdba"."BASICDML" &#8216;;</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">{COMMAND<SPAN style="mso-spacerun: yes">        </SPAN>} Reader2_2_1 := Command2_2.ExecuteQuery;</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'">{COMMAND<SPAN style="mso-spacerun: yes">        </SPAN>} FreeAndNil(Command2_2);</SPAN></P> <P><SPAN style="FONT-FAMILY: 'Courier New'"> </SPAN></P> <P>So if you are a database developer most of this is going to be much easier to understand than typical database client library trace output.<SPAN style="mso-spacerun: yes">  </SPAN>It shows exactly what is being called in the dbExpress framework. <SPAN style="mso-spacerun: yes"> </SPAN>You can also enable lower level client library logging as well (this is what dbExpress 3 provided), but I have it disabled in this snippet.<SPAN style="mso-spacerun: yes">  </SPAN>The comment in the front of each line shows the trace category.<SPAN style="mso-spacerun: yes">  </SPAN>&#8220;Connection2&#8221; means that this was the second connection created since logging was started.<SPAN style="mso-spacerun: yes">  </SPAN>&#8220;Commnad2_1&#8221; means that this was created by connection 2 and that it was the first connection created by connection 2.<SPAN style="mso-spacerun: yes">  </SPAN>Reader has three numbers and as you can probably guessed, this indicates that it is the first reader created by the first command of the second connection.<SPAN style="mso-spacerun: yes">  </SPAN>This numbering scheme is especially useful for multi-threaded logging.</P> <P> </P> <P>Take note of the line that sets Command2_2.Text to &#8216;GetIndexes&#8217;.<SPAN style="mso-spacerun: yes">  </SPAN>This demonstrates another innovative feature of dbExpress that I call &#8220;extended commands&#8221;.<SPAN style="mso-spacerun: yes">  </SPAN>Metadata requests pass parameters (i.e. catalog, schema, table pattern), and return a Reader.<SPAN style="mso-spacerun: yes">   </SPAN>Sounds like a command, so why not make them the same? <SPAN style="mso-spacerun: yes">  </SPAN>To support this, a command type property was added so that the driver knows this a metadata command, not a sql statement or stored procedure.<SPAN style="mso-spacerun: yes">  </SPAN>The command type is a string that enables us and other driver vendors to provide new name spaces for commands.</P> <P> </P> <P>TDBXPool provides basic connection pooling for all dbExpress drivers.<SPAN style="mso-spacerun: yes">  </SPAN>This delegate driver also implemented its own extended command that returns a reader with a row for each connection pool that is currently active.</P> <P> </P> <P>The combination of delegate drivers and extended commands makes for a very extensible driver framework. <SPAN style="mso-spacerun: yes"> </SPAN>Delegate drivers are trivial to write.<SPAN style="mso-spacerun: yes">  </SPAN>If you don&#8217;t like my connection pool or my tracing, it won&#8217;t be hard to replace them.<SPAN style="mso-spacerun: yes">  </SPAN>Or maybe you can improve them and give them back.</P> <P> </P> <P>Ok, I better wrap things up now.<SPAN style="mso-spacerun: yes">  </SPAN>We have a lot more in the works for this year that I don&#8217;t want to talk about just yet.<SPAN style="mso-spacerun: yes">  </SPAN>Today I mostly touched on database connectivity.<SPAN style="mso-spacerun: yes">  </SPAN>However, this is not the only alligator we are wrestling with.<SPAN style="mso-spacerun: yes">  </SPAN>Tooling, runtime components, multi-tier development and core database technology itself are all in the works or at least on the radar.<SPAN style="mso-spacerun: yes">  </SPAN>We also fixed some really old bugs this year.<SPAN style="mso-spacerun: yes">  </SPAN>We have a great development and QA team skilled at creating highly leveraged solutions.<SPAN style="mso-spacerun: yes">  </SPAN>I have met many Delphi developers that are very intelligent, highly skilled, and passionate about Delphi.<SPAN style="mso-spacerun: yes">  </SPAN>Delphi developers also tend to be incredibly savvy about building database applications. <SPAN style="mso-spacerun: yes"> </SPAN>I am counting on the Delphi developer community to constantly be looking closely at we are doing and provide the kind of feedback that will make Delphi database technology the best it can be.<SPAN style="mso-spacerun: yes">  </SPAN>The end result will be much better if we have lots of bright minds critiquing and extending the technology.<SPAN style="mso-spacerun: yes">  </SPAN>To that end we will try to continue offering open solutions with source code included when ever possible.</P> <P> </P> <P>-Steve</P></p>
<p class="akst_link"><a href="http://blogs.codegear.com/steveshaughnessy/?p=31865&amp;akst_action=share-this"  title="Post to del.icio.us, etc." id="akst_link_31865" class="akst_share_link" rel="nofollow">Share This</a> | <a href="mailto:?subject=What%27s%20New%3F&body=Have you seen this? http%3A%2F%2Fblogs.codegear.com%2Fsteveshaughnessy%2F2007%2F02%2F16%2F31865" id="akst_email_31865" class="akst_share_email" rel="nofollow">Email this page to a friend</a></p>]]></content:encoded>
			<wfw:commentRss>http://blogs.codegear.com/steveshaughnessy/2007/02/16/31865/feed</wfw:commentRss>
		</item>
		<item>
		<title>Learning Delphi</title>
		<link>http://blogs.codegear.com/steveshaughnessy/2006/12/03/30193</link>
		<comments>http://blogs.codegear.com/steveshaughnessy/2006/12/03/30193#comments</comments>
		<pubDate>Sun, 03 Dec 2006 20:58:49 +0000</pubDate>
		<dc:creator>Steve Shaughnessy</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.codegear.com/steveshaughnessy/2006/12/03/24595/</guid>
		<description><![CDATA[I recently made a passing comment on our Delphi database field test forum about my recent experience of learning Delphi.&#160; I was quickly asked to blog it.&#160; So here are some quick notes on my experience learning Delphi.&#160; A little background first though.&#160; I started my software career writing in c and some assembly, using [...]]]></description>
			<content:encoded><![CDATA[<p><P>I recently made a passing comment on our Delphi database field test forum about my recent experience of learning Delphi.&nbsp; I was quickly asked to blog it.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>So here are some quick notes on my experience learning Delphi.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>A little background first though.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I started my software career writing in c and some assembly, using make and vi.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>While at Borland I moved on to C++, Java with JBuilder and Eclipse and a little bit of c#.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>In my 17 or so years at Borland I had never developed in Delphi.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>For the past 10 years I have been doing most of my development in Java.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I started developing in Delphi last May.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN></P> <P>&nbsp;</P> <P>Learning Delphi has been an interesting experience for me.&nbsp; Initially I thought the different syntax might be a bit of a hassle.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Its easy for a developer to unnecessarily get hung up on things like editor key bindings and programming language syntax.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>However, Delphi syntax isn&#8217;t really a problem for me.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Sometimes its actually an improvement.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>For example, the notion of a &#8220;Result&#8221; variable for return values can come in handy when writing function logic and the property syntax makes for elegant, easy to read code.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>At the end of the day the more important issue to me is the ability to create object oriented abstractions.&nbsp; Delphi&#8217;s support for single inheritance, delegates (events) and interfaces is powerful and straight forward.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Records (value types) can be especially convenient and efficient for non-gc based memory management. Delphi&#8217;s reference based objects with fields that are set to nil on creation are efficient and less error prone.</P> <P>&nbsp;</P> <P>Packages, units, interface/implementation sections were a little different from what I was used to.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>These features do help to provide good structure and encapsulation for Delphi applications.</P> <P><SPAN style="mso-spacerun: yes"></SPAN>&nbsp;</P> <P>I remember years ago that Anders Hjelsberg was giving me a demonstration of a new &#8220;override&#8221; feature for virtual methods in Delphi.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>He explained it more than once I think because I was not showing enough excitement for the feature.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>At the time I was working in Java so it wasn&#8217;t something I was going to get to use anyway.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Now that I am developing in Delphi, I really like this feature.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Without the override key word, implementing virtual methods through inheritance is more error prone.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Sometimes it&#8217;s the little things that make all the difference.</P> <P>&nbsp;</P> <P>The Delphi compiler itself is lightning fast.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Sometimes I compile twice because I&#8217;m not sure I actually hit the compile key.</P> <P>&nbsp;</P> <P>The Delphi naming conventions for classes, fields and parameters kind of make me laugh &#8211; in a good way.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I remember when I was working in the JBuilder team in the early days of Java that the Delphi guys would come over and say:<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>&#8220;You know, you really should put a &#8220;T&#8221; in front of your classes, and an &#8220;F&#8221; in front of you fields&#8221;.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Well that wasn&#8217;t really going to go over well with the rest of the Java world.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>However now that I am working in Delphi, I never have to worry about how to differentiate that names for parameters, fields, classes, and objects instances.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Its simple, it works, and it is expected by the rest of the Delphi developers in the world.</P> <P>&nbsp;</P> <P>Another aspect of Delphi that has been very interesting to me is the ability to write software that runs in both native and managed platforms.&nbsp; I don&#8217;t know of any other development environment that comes close to supporting this as well as Delphi.&nbsp; I like this idea of the delphi language/rtl/vcl being a "super platform" for win32/64, .net, .net cf.&nbsp; Of course going forward Delphi could become even better at this.&nbsp; I have had to factor out platform specific code into separate units and use some ifdefs.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>&#8220;Single source&#8221; may or may not be a big benefit for the Delphi community at large.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>However, I like leveraging this feature so that we can provide similar or identical features for both the native and managed platforms that we support.</P> <P>&nbsp;</P> <P>There are things I see missing and some things I don&#8217;t like in Delphi.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>However almost all of these are correctable and the team already has plans to address many of these in future releases.</P> <P>&nbsp;</P> <P>Well I&#8217;ve only scratched the surface of Delphi. <SPAN style="mso-spacerun: yes">&nbsp;</SPAN>Overall I have really enjoyed developing software in Delphi.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Its well suited to rapidly developing large scale, high performance, object oriented software.</P> <P>&nbsp;</P> <P>-Steve</P></p>
<p class="akst_link"><a href="http://blogs.codegear.com/steveshaughnessy/?p=30193&amp;akst_action=share-this"  title="Post to del.icio.us, etc." id="akst_link_30193" class="akst_share_link" rel="nofollow">Share This</a> | <a href="mailto:?subject=Learning%20Delphi&body=Have you seen this? http%3A%2F%2Fblogs.codegear.com%2Fsteveshaughnessy%2F2006%2F12%2F03%2F30193" id="akst_email_30193" class="akst_share_email" rel="nofollow">Email this page to a friend</a></p>]]></content:encoded>
			<wfw:commentRss>http://blogs.codegear.com/steveshaughnessy/2006/12/03/30193/feed</wfw:commentRss>
		</item>
		<item>
		<title>DevCo</title>
		<link>http://blogs.codegear.com/steveshaughnessy/2006/05/04/24594</link>
		<comments>http://blogs.codegear.com/steveshaughnessy/2006/05/04/24594#comments</comments>
		<pubDate>Thu, 04 May 2006 11:59:45 +0000</pubDate>
		<dc:creator>Steve Shaughnessy</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.codegear.com/steveshaughnessy/2006/05/04/1/</guid>
		<description><![CDATA[I recently joined the Borland DevCo spin off (April 25, 2006).&#160; I have spent most of my working career at Borland&#160;between February 8, 1988 to October 14, 2005.&#160; In that time frame, I worked with many great teams and projects.&#160; Most of my work has been some how related to database technology.&#160; I&#8217;ve always had [...]]]></description>
			<content:encoded><![CDATA[<p><P>I recently joined the Borland DevCo spin off (April 25, 2006).<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I have spent most of my working career at Borland&nbsp;between February 8, 1988 to October 14, 2005.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>In that time frame, I worked with many great teams and projects.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Most of my work has been some how related to database technology.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I&#8217;ve always had a fascination with time and space trade offs.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Database related problems are full of these kinds of trade offs, so I guess that is one reason why I am drawn to them.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>My interest in optimization goes beyond the execution of software.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I also enjoy finding ways to create highly leveraged development teams through the development of reusable software, better tools and process.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Creating highly leveraged teams allows us to work in smaller groups, move quicker, produce more reliable software, and spend more time on the interesting problems.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>As a developer this makes life a lot more fun.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Along these lines, I also have a keen interest in making sure our solutions are no harder than they need to be.</P> <P>&nbsp;</P> <P>I have been hired on at DevCo in a leadership role for the Delphi database technologies.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I am still coming up to speed on my responsibilities and Highlander planning.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I already see some cool things we can do, but I&#8217;m still processing a lot of information and suggestions.</P> <P>&nbsp;</P> <P>In my prior work at Borland I did not work directly as a member of the Delphi team.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>We did collaborate on the shared designs between the JBuilder and Delphi from to time to time.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I have a very high regard for the Delphi product, team and the development community.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Although I have a lot of related experience in the context of other Borland products, I still want to develop a good understanding of what it means to be Delphi.</P> <P>&nbsp;</P> <P>I thought it might be a little interesting to talk briefly about the new old guy&#8217;s first impressions of DevCo.</P> <P>&nbsp;</P> <P>I really, really like the products.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>They are a big part of the Borland heritage.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Going forward there is a lot we can do to grow the existing products and to introduce exciting new products.</P> <P>&nbsp;</P> <P>There is a good talent base at DevCo.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>We are a little too lean in a few places, but this is correctable.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I and others here at Borland have already been contacted by several people who would like to join DevCo.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Many of these people are &#8220;quality&#8221; ex-Borlanders.</P> <P>&nbsp;</P> <P>DevCo has a solid revenue base from a collection of IDE and database products.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>There is a real company here with real growth potential.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>For many years a large part of the profits from these products have gone elsewhere.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>The Borland management has been more focused in other markets for some time.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Reversing this trend will create growth for DevCo.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>We have the opportunity now to focus and invest in our products and our customer base.</P> <P>&nbsp;</P> <P>That&#8217;s all I have for now.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>I&#8217;m very excited about my new team and the potential of DevCo.</P> <P>&nbsp;</P> <P>-Steve</P></p>
<p class="akst_link"><a href="http://blogs.codegear.com/steveshaughnessy/?p=24594&amp;akst_action=share-this"  title="Post to del.icio.us, etc." id="akst_link_24594" class="akst_share_link" rel="nofollow">Share This</a> | <a href="mailto:?subject=DevCo&body=Have you seen this? http%3A%2F%2Fblogs.codegear.com%2Fsteveshaughnessy%2F2006%2F05%2F04%2F24594" id="akst_email_24594" class="akst_share_email" rel="nofollow">Email this page to a friend</a></p>]]></content:encoded>
			<wfw:commentRss>http://blogs.codegear.com/steveshaughnessy/2006/05/04/24594/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
