About the Synopse Informatique company and our Open Source approach.
If your project needs Delphi software development, it's the right place to search.
To content | To menu | To search
2011, Monday August 15
By A.Bouchez on 2011, Monday August 15, 12:00 - Synopse Company
About the Synopse Informatique company and our Open Source approach.
If your project needs Delphi software development, it's the right place to search.
2011, Thursday August 11
By A.Bouchez on 2011, Thursday August 11, 11:05 - Pascal Programing
For those how are interested in FireMonkey, I made some screenshots of some DXScene sample app.
It may give you some good starting point about the features of the upcoming Delphi XE2 user interface components.
2011, Wednesday August 10
By A.Bouchez on 2011, Wednesday August 10, 20:52 - mORMot Framework
The framework documentation was just updated.
The general organization of the SAD document (which is the one to be read in all cases) has been refreshed, and is now separated in smaller chapters.
The new official name has been changed into "Synopse SQLite3/mORMot framework"...
2011, Monday August 8
By A.Bouchez on 2011, Monday August 8, 06:41 - mORMot Framework
Everybody is buzzing about FireMonkey...

Our little mORMot will like FireMonkey!
Here is why...
2011, Sunday August 7
By A.Bouchez on 2011, Sunday August 7, 09:46 - mORMot Framework
Our downloadable documentation has been enhanced, and contains now a description about the main feature of the near-to-come 1.15 version, i.e. "database agnosticism".
The core database of our mORMot / SQLite3 framework uses the SQLite3 library, which is a Free, Secure, Zero-Configuration, Server-less, Single Stable Cross-Platform Database File database engine.
As stated below, you can use any other database access layer, if you wish. A fast in-memory engine is included, and can be used instead or together with the SQLite3 engine. Since revision 1.15 of the framework you may be able to access any remote database, and use one or more OleDB (or Oracle) connections to store your precious ORM objects. The SQlite3 will be used as the main SQL engine, able to JOIN all those tables, thanks to its Virtual Table unique feature.
2011, Monday July 25
By A.Bouchez on 2011, Monday July 25, 22:19 - mORMot Framework
Our ORM RESTful Framework is about to access any available database engine.
It will probably change its name (since it won't use only SQlite3 as database), to become mORMot - could be an acronym for "Manage Object Relational Mapping Over Tables", or whatever you may think of...
We'll still rely on SQLite3 on the server, but a dedicated mechanism will allow to access via OleDB any remote database, and mix those tables content with the native ORM tables of the framework. A flexible Virtual Tables and column mapping will allow any possible architecture: either a new project in pure ORM, either a project relying on an existing database with its own table layout.
2011, Friday July 22
By A.Bouchez on 2011, Friday July 22, 17:14 - Open Source libraries
For our ORM framework, we implemented an efficient SQLite3 wrapper, joining statically (i.e. without any external dll) the SQLite3 engine to the executable. SQLite3 is in fact used as the DB kernel of the framework. For instance, thanks to its unique virtual table mechanism, even tables in other databases (like Oracle or MSSQL) are available as if they were SQLite3 tables.
We just made this wrapper independent from our ORM, in a new dedicated unit,
named
SynSQLite3.pas.
It was an easy task to let this unit be called from our SynDB database abstract classes.
2011, Saturday July 9
By A.Bouchez on 2011, Saturday July 9, 11:46 - mORMot Framework
For our upcoming mORMot framework, and in completion to our SynOleDB unit, we just added a new Open Source unit, named SynDBOracle. It allows direct access to any remote Oracle server, using the Oracle Call Interface.
Oracle Call Interface (OCI) is the most comprehensive, high
performance, native unmanaged interface to the Oracle Database that exposes the
full power of the Oracle Database. We wrote a direct call of the
oci.dll library, using our DB abstraction classes introduced for
SynOleDB.
We tried to implement all best-practice patterns detailed in the official Building High Performance Drivers for Oracle document
Resulting speed is quite impressive: for all requests, SynDBOracle is 3 to 5 times faster than a SynOleDB connection using the native OleDB Provider supplied by Oracle. We noted also that our implementation is 10 times faster than the one provided with ZEOS/ZDBC, which is far from optimized.
You can use the latest version of the Oracle Instant Client
provided by Oracle - see this
link - which allows you to run your applications without installing
the standard (huge) Oracle client or having an ORACLE_HOME. Just
deliver the dll files in the same directory than your application,
and it will work.
2011, Monday July 4
By A.Bouchez on 2011, Monday July 4, 06:09 - SQLite3 Framework
If you want to implement an HTTP client access in your application, you may consider several choices:
For our ORM, we tried to avoid external dependencies, and did not have the
need of all Indy's features and overhead.
We fist wrote our own WinSock wrapper, then tried out
WinInet.
When used on our testing benchmark, we found out that WinINet was
dead slow.
Then we tried WinHTTP, the new API provided by Microsoft, and we found
out this was blazing fast. As fast as direct WinSock access,
without the need of writing all the wrapper code.
2011, Sunday July 3
By A.Bouchez on 2011, Sunday July 3, 20:12 - SQLite3 Framework
Here is what wikipedia states at http://en.wikipedia.org/wiki/Shared_nothing_architecture:
A shared nothing architecture (SN) is a distributed computing architecture in which each node is independent and self-sufficient, and there is no single point of contention across the system. People typically contrast SN with systems that keep a large amount of centrally-stored state information, whether in a database, an application server, or any other similar single point of contention.
This is just one approach of "sharding". Sharding is indeed related to a
shared nothing architecture - once sharded, each shard can live in a totally
separate logical schema instance.
"I sharded, therefore it scales"...
You can do this in Delphi... and opens a new world of scaling opportunities... Just as Google, Facebook, or eBay do...
2011, Saturday July 2
By A.Bouchez on 2011, Saturday July 2, 19:51 - Synopse PDF engine
Our SynPdf unit has been updated to the 1.14 version.
Some enhancements:
Compatible with Delphi 5 up to Delphi XE.
Source code released
under GPL/LGPL/MPL license, on choice.
That means: free, like a bird, and like a beer.
Comments and feedback are welcome on our forum.
By A.Bouchez on 2011, Saturday July 2, 11:32 - mORMot Framework
There is a well known syndrome around, against ORM.
Do you remember The Vietnam of Computer Science article?
It is worth reading... and commenting.
Sounds a bit outdated by now. Tempus fugit!
By A.Bouchez on 2011, Saturday July 2, 10:27 - mORMot Framework
For both our SynOleDB and SynBigTable units, we allow late-binding of data row values, using a variant and direct named access of properties. Thanks to this unique feature (as far as I know in the Delphi database world),
This allows clear and valid code as such:
var Customer: Variant;
begin
with Props.Execute(
'select * from Sales.Customer where AccountNumber like ?',
['AW000001%'],@Customer) do
while Step do
assert(Copy(Customer.AccountNumber,1,8)='AW000001');
end;
In practice, this code is slower than using a standard property based access, like this:
while Step do
assert(Copy(Column['AccountNumber'],1,8)='AW000001');
But the first version, using late-binding of column name, just sounds more natural.
Of course, since it's late-binding, we are not able to let the compiler check at compile time for the column name. If the column name in the source code is wrong, an error will be triggered at runtime only. But it would not be an issue, since it would be the same for the SQL code inserted: it's only executed at runtime (this is one of the benefits of using an ORM, by the way: the ORM will generate correct SQL code for you...).
The default VCL implementation of this late-binding was a bit slow
for our purpose.
Since it has to deal with Ole Automation, and because it's fun, we
hacked the VCL to provide a lighter and faster version for our custom variant
types.
2011, Friday July 1
By A.Bouchez on 2011, Friday July 1, 09:09 - mORMot Framework
That's it, our SynOleDB unit seems alive and running well.
OLE DB (Object Linking and Embedding, Database, sometimes written as OLEDB or OLE-DB) is an API designed by Microsoft for accessing data from a variety of sources in a uniform manner. It was designed as a higher-level replacement for, and successor to, ODBC, extending its feature set to support a wider variety of non-relational databases, such as object databases and spreadsheets that do not necessarily implement SQL.
SynOleDB unit implementation has been made with several points in
mind:
TOleDBConnection per thread); TDynArrayHashed);TQuery-like wrapper.2011, Wednesday June 29
By A.Bouchez on 2011, Wednesday June 29, 06:10 - SQLite3 Framework
Our ORM framework has been released as version 1.14.
It's mainly a bug-fix release:
2011, Thursday June 16
By A.Bouchez on 2011, Thursday June 16, 21:55 - Pascal Programing
After a question on StackOverflow, I wanted to comment about the speed of generated code by diverse Delphi compiler versions.
Since performance matters when we write general purpose libraries like ours, we have some feedback to propose:
2011, Tuesday June 7
By A.Bouchez on 2011, Tuesday June 7, 22:45 - Pascal Programing
In order to let our TSynLog logging class intercept all
exceptions, we use the low-level global RtlUnwindProc pointer,
defined in System.pas.
Alas, under Delphi 5, this global RtlUnwindProc variable is not
existing. The code calls directly the RtlUnWind Windows API
function, with no hope of custom interception.
Two solutions could be envisaged:
Sytem.pas source code, adding the new
RtlUnwindProc variable, just like Delphi 7; The first solution is simple. Even if compiling System.pas is a
bit more difficult than compiling other units, we already made that for our
Enhanced
RTL units. But you'll have to change the whole build chain in order to
use your custom System.dcu instead of the default one. And some
third-party units (only available in .dcu form) may not like the
fast that the System.pas interface changed...
So we used the second solution: change the assembler code in the running
process memory, to let call our RtlUnwindProc variable instead of
the Windows API.
By A.Bouchez on 2011, Tuesday June 7, 21:40 - Pascal Programing
For our ORM, we needed a class variable to be available for each
TSQLRecord class type.
This variable is used to store the properties of this class type, i.e. the
database Table properties (e.g. table and column names and types) associated
with a particular TSQLRecord class, from which all our ORM objects
inherit.
The class var statement was not enough for us:
- It's not available on earlier Delphi versions, and we try to have our
framework work with Delphi 6-7 up to XE;
- This class var instance will be shared by all classes inheriting
from the class where it is defined - and we need ONE instance PER class type,
not ONE instance for ALL
We needed to find another way to implement this class variable.
An unused VMT slot in the class type description was identified, then each class definition was patched in the process memory to contain our class variable.
2011, Monday June 6
By A.Bouchez on 2011, Monday June 6, 20:49 - Synopse PDF engine
Our SynPdf unit has been refreshed to the 1.13 version.
2011, Sunday June 5
By A.Bouchez on 2011, Sunday June 5, 17:45 - SQLite3 Framework
This is a major step for the framework.
Among a lot of new features and bug fixes:
TDynArray
wrapper);TSQLRecordRTree to implement R-Tree
virtual tables;Open Source project, for Delphi 6 up to XE, licensed under a MPL/LGPL/GPL tri-license.
« previous entries - page 2 of 6 - next entries »