Our SynPdf unit has been updated to the 1.14 version. Some enhancements: new SetCMYKFillColor and SetCMYKStrokeColor methods for TPdfCanvas now handles EMR_POLYBEZIER* commands in conversion from meta file content fixed EZeroDivided error when enumerating SetWindowExtEx(szlExtent(0,0)) some […]
Is Object-Relational Mapping the Paradise of Computer Science?
2011-07-02. Open Source › 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!
Faster variant late binding
2011-07-02. Open Source › 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-07-01
SynOleDB: OpenSource Unit for direct access to any database via OleDB
2011-07-01. Open Source › 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:
- Tested with SQL Server 2008 R2 and Oracle 11g providers from Microsoft and Oracle;
- Ability to be truly Unicode, even with pre-Unicode version of Delphi (like Delphi 7 or 2007);
- Could access any local or remote Database, from any version of Delphi, since it doesn't use the DB.pas unit or any related part of the VCL (even the Delphi 7 personal or the Turbo Explorer editions), just for free;
- Handle NULL or BLOB content for parameters and results;
- Avoid most memory copy or unnecessary allocation: we tried to access the data directly from the retrieved data buffer, just as given from OleDB;
- Was therefore designed to achieve the best performance possible: most time is spent in OleDB: the code layer added to the OleDB customer is very thin;
- True OOP architecture, to be used with any OleDB provider (allowing custom parameters or such), and even without OleDB (in the future, direct access to any DB client could be used);
- Could be safely used in a multi-threaded application/server (with one
TOleDBConnectionper thread); - Allow parameter bindings of requests, with fast access to any parameter or
column name (thanks to
TDynArrayHashed); - Late binding of column values in Delphi code;
- Direct JSON content creation, with no temporary data copy nor allocation;
- Designed to be used with our
mORMot ORM, but could be used stand-alone (a full Delphi 7 client
executable is just about 200 KB), or even in any existing Delphi application,
thanks to a
TQuery-like wrapper.
2011-06-29
Synopse SQLite3 framework 1.14
2011-06-29. Open Source › mORMot Framework
Our ORM framework has been released as version 1.14.
It's mainly a bug-fix release:
- Integrated SQLite3 engine updated to latest version 3.7.7.1;
- Fix several issues about JSON generation layout;
- Enhanced automated User Interface generation for object on-screen edition;
- SynPdf unit now handles Bézier curves from TCanvas, and some CMYK functions; also enhanced PDF/A-1compatibility;
- Some speed enhancements, and new functions for the SynOleDB unit.
2011-06-16
Which Delphi compiler produces faster code?
2011-06-16. Pascal Programming
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:
- The 4,500,000 unitary tests of our SQlite3 ORM Framework;
- The SynLZ compression algorithm.
2011-06-07
Intercepting exceptions: a patch to rule them all
2011-06-07. Pascal Programming
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:
- Modify the
Sytem.passource code, adding the newRtlUnwindProcvariable, just like Delphi 7; - Patch the assembler code, directly in the process memory.
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.
True per-class variable
2011-06-07. Pascal Programming
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.
« previous entries - page 40 of 52 - next entries »
