UniDAC Roadmap!

Discussion of open issues, suggestions and bugs regarding UniDAC (Universal Data Access Components) for Delphi, C++Builder, Lazarus (and FPC)
Post Reply
Challenger
Devart Team
Posts: 925
Joined: Thu 17 Nov 2005 10:53

UniDAC Roadmap!

Post by Challenger » Mon 29 Dec 2008 15:15

We are planning to release a new version of UniDAC. After analysing the requests concerning the current UniDAC versions, we have formulated the following feature list to make a good product that will meet your needs and demands. We would like to hear your comments and suggestions concerning this list.
  • TUniConnectyion.AssignConnect method that will allow connection sharing beetween main application and dlls
  • TUniLoader component that will allow to use server possibilites of fast data loading
  • TUniDump that will allow to dump and restore tables and data
  • Unified SQL with the following features:

    * Macros that have values specific for different databases (providers). In addition to the predefined macros you can define your own.
    Macro is a set of name, condition and value. Macro evaluates to its value if underlying condition is enabled, or to an empty string if
    the condition is not enabled. Conditions are enabled or disabled depending on the DBMS server TUniConnection is connected to.
    For example, if you connect to Oracle server, the "Oracle" condition will be enabled. For example:

    Code: Select all

         
         UniConnection1.Macros.Add('tablename', 'test.dept', 'MySQL');
         UniConnection1.Macros.Add('tablename', 'dept', 'Oracle');
    
         UniQuery.SQL.Text := 'select * from {tablename}';
    
    * Set of automatically mapped functions.

    UniDac will introduce standard for calling common SQL functions. This is a set of function names with fixed meaning. In the run time the function
    is transformed either to the corresponding native function, or to an equivalent expression (for example, several functions). The construct syntax is

    Code: Select all

         
         {fn Function_Name(parameter1 [,parameter2 ... ])}
    

    For example, the following fragment

    Code: Select all

         
         SELECT {fn TRIM(EName)} FROM emp
    

    evaluates to

    Code: Select all

         
         SELECT TRIM(EName) FROM emp
    

    in MySQL, because there is a counterpart in the DBMS. But in MS SQL Server there is no single corresponding function, so the expression evaluates to

    Code: Select all

         
           SELECT LTRIM(RTRIM(EName)) FROM emp
    

    * Unified standard of literals.
    UniDAC will provide universal syntax for dates, timestamps, intervals, LIKE expressions and quoted identifiers.
    For example:

    Code: Select all

         
         SELECT * FROM emp WHERE HIREDATE>{date '1982-01-15'}
    

    in MySQL evaluates to

    Code: Select all

           
         SELECT * FROM emp WHERE HIREDATE>CAST('1982-01-15' AS DATETIME)
    

    and in Oracle it turns to

    Code: Select all

         
           SELECT * FROM emp WHERE HIREDATE>TO_DATE('1982-01-15', 'YYYY-MM-DD')
    

    * Conditional Execution (IF)
    For the purpose of extra flexibility UniSQL supports conditional inclusion of SQL code into resulting statements. This is as simple as that:

    Code: Select all

         
        {if my_macro} STATEMENT_1 {else} STATEMENT_2 {endif}
    

    If macro my_macro is defined, the STATEMENT_1 is returned, otherwise STATEMENT_2 is the result of the expression. For instance:

    Code: Select all

         
        {if Oracle} 
        SELECT * FROM dept
        {else} 
        SELECT * FROM test.dept
        {endif}
    

    The {else} clause can be omitted. Here is a bit more sophisticated example:

    Code: Select all

         
       SELECT {if Oracle}RowId, {endif} DeptNo, DName FROM dept
    


    * There are also predefined macros that help to solve most common differences in SQL syntax: VARCHAR, DOUBLE, DATETIME, AS, EXCEPT, ServerVersion

    * Outer Joins
    In some old versions of Oracle server SQL syntax for OUTER JOINs differs from the common standard. The problem can be solved using conditional execution, but UniSQL allows to do it even easier with the {oj ...} construct:
    {oj Outer_Join_Expression}

Post Reply