Tag - Source
Entries feed
2012, Tuesday January 17
By A.Bouchez on 2012, Tuesday January 17, 23:02 - Open Source libraries
The Open Source SynDBExplorer tool
has been enhanced these days.
Main new features are:
- Execution of the current selected text (if any) instead of the whole memo
content;
- "Exec & Export" new button, for direct export to file.
I really like the selection execution feature - this speed up SQL
process a lot, and allow to switch from one statement to another.
And the new exporting features are opening new possibilities.
Continue reading...
2011, Sunday December 11
By A.Bouchez on 2011, Sunday December 11, 09:59 - Pascal Programing
To my understanding, the so-called "strong-typing" feature is one big
benefit of the Delphi object pascal language.
As stated by wikipedia:
Most generally, "strong typing" implies that the programming language places
severe restrictions on the intermixing that is permitted to occur, preventing
the compiling or running of source code which uses data in what is considered
to be an invalid way. For instance, an addition operation may not be used with
an integer and string values; a procedure which operates upon linked lists may
not be used upon numbers. However, the nature and strength of these
restrictions is highly variable.
Some Delphi users may find this is a limitation of the language, in
comparison with other "fashionable" script idioms (like Python, Javascript of
Ruby). For me, runtime strong typing (alla Python or Ruby) is not true strong
typing. Simon Stuart just
proposed a smartstring kind of string, which is in fact a
weakstring type. As far as I understood his point, he wanted to
get rid of all the warnings emitted by Unicode-version of the Delphi compiler,
about explicit string conversion.
In fact, I use to go in the opposite direction. For wide projects,
strong-typing is one of the big benefit of using Delphi (like other main
"serious" languages like Java, C, C++, Ada or C#).
Continue reading...
2011, Thursday December 8
By A.Bouchez on 2011, Thursday December 8, 10:09 - Pascal Programing
Among all trolling subject in forums, you'll find out the
great Garbage Collection theme.
Fashion languages rely on it. At the core of the .Net and Java framework,
and all scripting languages (like JavaScript, Perl, Python or Ruby), you'll
find a Garbage Collector. New developers, just released from schools, do
learn about handling memory only in theory, and just can't understand how is
memory allocated - we all have seen such rookies involved in Delphi code
maintenance, leaking memory as much as they type. In fact, most of them did not
understood how a computer works. I warned you this will be a trolling
subject.
And, in Delphi, there is no such collector. We handle memory in
several ways:
- Creating static variables - e.g. on the stack, inside a
class
or globally;
- Creating objects with
class instances allocated on heap - in
at least three ways: with a try..finally Free block, with a
TComponent ownership model in the VCL, or by using
an interface (which creates an hidden try..finally
Free block);
- Creating reference-counted variables, i.e.
string, array
of, interface or variant kind of
variables.
It is a bit complex, but it is also deadly powerful. You have several memory
allocation models at hand, which can be very handy if you want to tune your
performance and let program scale. Just like manual recycling at home will save
the planet. Some programmers will tell you that it's a waste of cell brain,
typing and time. Linux kernel gurus would not say so, I'm afraid.
Then came the big Apple company, which presented its new ARC model
(introduced in Mac OS X 10.7 Lion) as a huge benefit for
Objective-C in comparison with the Garbage Collection model. And
let's face it: this ARC just sounds like the Delphi memory model.
Continue reading...
2011, Tuesday December 6
By A.Bouchez on 2011, Tuesday December 6, 22:08 - mORMot Framework
In mORMot, all the methods available to handle many-to-many
relationship (ManySelect, DestGetJoined...) are used to
retrieve the relations between tables from the pivot table point of view. This
saves bandwidth, and can be used in most simple cases, but it is not the only
way to perform requests on many-to-many relationships. And you may have several
TSQLRecordMany instances in the same main record - in this case,
those methods won't help you.
It is very common, in the SQL world, to create a JOINed request at the main
"Source" table level, and combine records from two or more tables in a
database. It creates a set that can be saved as a table or used as is. A JOIN
is a means for combining fields from two or more tables by using values common
to each. Writing such JOINed statements is not so easy by hand, especially
because you'll have to work with several tables, and have to specify the exact
fields to be retrieved; if you have several pivot tables, it may start to be a
nightmare.
Let's see how our ORM will handle it.
Continue reading...
2011, Sunday November 27
By A.Bouchez on 2011, Sunday November 27, 07:21 - mORMot Framework
In order to implement some RESTful Services, a
callback has to be defined on the server side.
The prototype of these method has been modified, to supply an additional
aSession: cardinal parameter: this is a CODE BREAK change and you
shall refresh ALL your server-side code to match the new signature.
Continue reading...
2011, Tuesday November 8
By A.Bouchez on 2011, Tuesday November 8, 21:51 - Pascal Programing
The currency type is the standard Delphi type to be used when
storing and handling monetary values. It will avoid any rounding problems, with
4 decimals precision. It is able to safely store numbers in the range
-922337203685477.5808 .. 922337203685477.5807. Should be enough for your pocket
change.
As stated by the official Delphi documentation:
Currency is a fixed-point data type that minimizes rounding errors in
monetary calculations. On the Win32 platform, it is stored as a scaled 64-bit
integer with the four least significant digits implicitly representing decimal
places. When mixed with other real types in assignments and expressions,
Currency values are automatically divided or multiplied by 10000.
In fact, this type matches the corresponding OLE and
.Net implementation of currency, and the one used by
most database providers (when it comes to money, a dedicated type is worth the
cost in a "rich man's world"). It is still implemented the same in the
Win64 platform (since XE 2). The Int64 binary
representation of the currency type (i.e. value*10000
as accessible via PInt64(aCurrencyValue)^) is a safe and fast
implementation pattern.
In our framework, we tried to avoid any unnecessary conversion to float
values when dealing with currency values. Some dedicated functions
have been implemented for fast and secure access to currency
published properties via RTTI, especially when converting values to or from
JSON text. Using the Int64 binary representation can be not only
faster, but also safer: you will avoid any rounding problem which may be
introduced by the conversion to a float type. Rounding issues are a nightmare
to track - it sounds safe to have a framework handling natively a
currency type from the ground up.
Continue reading...
2011, Sunday September 25
By A.Bouchez on 2011, Sunday September 25, 10:49 - Synopse PDF engine
For our PDF generation Open-Source library, this is a small fix update.
It can now be compiled under Delphi XE2.
But it's still working from all previous IDE versions, starting with Delphi 5,
and still 100% free - released under GPL/LGPL/MPL license, choice is yours.
Continue reading...
2011, Saturday August 20
By A.Bouchez on 2011, Saturday August 20, 10:24 - Open Source libraries
We already shipped a sophisticated set of logging classes some month ago.
Since then, its features have been enhanced, and the system has been deeply
interfaced with our main ORM framework. Now almost all low-level or high-level
operations can be logged on request.
But since the log files tend to be huge (for instance, if you set the
logging for our unitary tests, the 6,000,000 unitary tests creates a 280 MB log
file), a log viewer was definitively in need.
Continue reading...
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"...
Continue reading...
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...
Continue reading...
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.
Continue reading...
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:
- 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 enhancements for better PDF/A-1 conformance to the standard: now
includes the ICC profile for RGB pictures; corrected /Link flag and XML
metadata; new header with 8 bit characters; correct outlines and other minor
issues: now pass e.g. validation tests.
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.
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:
- 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
TOleDBConnection per 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.
Continue reading...
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:
Continue reading...
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:
- Modify the
Sytem.pas source code, adding the new
RtlUnwindProc variable, 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.
Continue reading...
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.
Continue reading...
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.
- code modifications to compile with Delphi 5 compiler;
- added horizontal scaling for GDI enumeration in case of text kerning
(could occur for small fonts);
- fixed "Save when closing with Acrobat Reader X" - thanks to Ondrej for the
fix;
- fixed clipping problems and vertical font positioning issue in
GDI enumeration - thanks to Ondrej for those corrections!
Our pdf engine sounds almost stable by now.
Thanks to the feedback provided by some user of this Open Source library!
Continue reading...
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:
Open Source project, for Delphi 6 up to XE, licensed under a MPL/LGPL/GPL
tri-license.
Continue reading...
2011, Thursday June 2
By A.Bouchez on 2011, Thursday June 2, 16:42 - SQLite3 Framework
The SQLite3 engine defines some standard SQL functions, like
abs() min() max() or upper().
A complete list is available at http://www.sqlite.org/lang_corefunc.html
One of the greatest SQLite3 feature is the ability to define custom
SQL functions in high-level language. In fact, its C API allows to implement
new functions which may be called within a SQL query. In other database engine,
such functions are usually named UDF (for User Defined Functions).
Our framework allows you to add easily such custom functions, directly from
Delphi classes.
Continue reading...
2011, Wednesday June 1
By A.Bouchez on 2011, Wednesday June 1, 08:19 - SQLite3 Framework
According to the n-Tier architecture,
data filtering and validation should be implemented in the business logic, not
in the User Interface.
If you were used to develop RAD database application using Delphi, you may
have to change a bit your habits here. Data filtering and validation should be
implemented not in the User Interface, but in pure Delphi code.
Data filtering is a process run on the User entry: for instance, it will
trim left or right spaces, make the text uppercase...
Data validating is performed before saving the data to the database: for
instance, an email address is checked for consistency, a field value to be
unique...
Some try to implement this using an external
scripting engine, in a procedure/event mode. Back to the 80th...
In our ORM framework, filtering and validation can be performed by creating
some Delphi classes, which may be used on both Server and Client side.
Continue reading...