Elevate Software


Login Login

ProductsBulletSalesBulletSupportBulletDownloadsBulletAbout





Home » Elevate Software Blog

Icon Elevate Software Blog

ElevateDB 2.31 Build 2 Released
Posted by Tim Young on Tue, May 7 2019

ElevateDB 2.31 Build 2 is now available for download. If you're an existing customer, then you should be receiving an email shortly with download instructions.

This build contains a bug fix for a critical issue with exclusively-opened tables:

# 4739 Updating Exclusively-Opened Tables Can Cause Corruption in the Session-Level Table Buffer Manager


Tags: ElevateDB, New BuildsPermanent Link0 Comments

Elevate Web Builder 3 Progress Update for April 2019
Posted by Tim Young on Fri, Apr 26 2019

Just a quick update on Elevate Web Builder 3. I almost done with the new compiler/interpreter, and just need to implement the new external interfaces to native Delphi code (modules) over the weekend, and then I'll be starting on re-integrating the compiler/interpreter back into the new EWB 3 IDE. After that, I need to finish up some aspects of the server-side application run-time support code and then I'm done with the initial beta candidate. I'm trying like crazy to get this all completed by the middle of May.

So, just to revisit all that I've been working on:
  • EWB 3 has a new IDE, which you can see here:

    Elevate Web Builder 3 IDE Screen Shot

    You can manage any number of EWB 3 web servers directly from within the IDE, including managing all deployed content and content folders. There is no longer any distinction between the "internal server" web server built into the IDE and an "external server" web server, as far as the IDE/deployment is concerned. The only difference is that the EWB 3 internal web server is in-process as part of the IDE. But, even the internal server stores its database and content in a special AppData location. And, you will be able to migrate the settings of any web server instance to any other web server instance with a simple IDE context menu option.

    There is also a new component navigator in the IDE, and the component library has been moved to the left-hand side of the IDE. Also, all of the ancillary IDE panels can be moved into the gutters by simply double-clicking on the title bar of each panel or the special move icon on each panel's title bar.


  • EWB 3 has a new web server:

    The new web server has a lot of new features, including user/role/privilege management (including anonymous access), built-in, transparent TLS support (just need to specify the cert name you want to use), automatic authentication and session handling, remote content management, support for existing EWB web server modules (native code), and support for new, interpreted server applications.

    The new server applications rely on the new EWB 3 interpreter (see below) and can be created/compiled/deployed/debugged directly in the IDE. You run them similarly to a DLL in Delphi, in that you can specify a client application to run that will make requests to the server application and trigger any breakpoints, etc. The server applications also have support for features like encrypted payloads so that vendors can require a license key in order to permit execution, but these features will most likely be released at a later time.

    The database support has also been improved quite a bit, and uses a new REST-ful API that is easier to access for non-EWB client applications. In addition, the database support now includes the ability to echo back generated/identity columns to the client application for inserts/updates, which has been sorely missing for a while.


  • EWB 3 has a new compiler:

    The new compiler has a brand-new front-end (parsing/identifier resolution) that is much, much better at symbol/identifier resolution and doesn't have issues with odd constructs like the existing compiler. The existing compiler was created primarily as a JavaScript transpiler, and it did an okay job, but it was inadequate for emitting instructions for an interpreter (see next).

    After the conversations on the support forums about the code editor improvements, I went ahead and took a week and a half of time in April to move the parsing/tokenizing for the code editor into the source manager for the IDE. What this does is streamline the parsing/tokenizing process and remove the necessity of having both the code editor and the compiler parsing the same source (improves performance). Instead, the parsing/tokenizing is now handled once in the source manager and can be incrementally updated as the source code is changed, which makes it possible to implement the code editor improvements very soon after the initial EWB 3 release. In addition, this change allows me to expose these services in the IDE for plugins and IDE add-ons in the near future so that plugin code can response to changes in the source code, etc. This also opens up the possibility for different source parsers for JSON, HTML, etc. in the IDE with syntax highlighting. Finally, this change moves the undo/redo into the source manager, where it can track such changes for history tracking/source control (again, future feature).


  • EWB 3 has a new interpreter:

    The existing EWB interpreter uses an AST-walker implementation where it simply walks the abstract syntax tree nodes generated from the compiler. This is sufficient for IDE usage, but is/was woefully inadequate for server-side production usage.

    The new interpreter includes some neat new features like much better constant folding and memory safety. It is impossible for EWB code to generate an AV in the new interpreter: all array/string indexes are checked for validity, all object references are checked for validity to ensure that they are not invalid, and the interpreter can do post-mortems that will show any memory leaks in an application (memory management is still manual and deterministic).

    The new interpreter also uses a special design and instruction set that allows it to be fairly fast. For example, the following code (1 million object array initialization and iteration) executes in ~407 msecs on an i7:

    program AssignTests;
    
    type
    
       TSubObjectType = (sotNone,sotString,sotInteger);
    
       TMySubObject = class(TObject)
          private
             FSubObjectType: TSubObjectType=sotInteger;
          public
             property SubObjectType: TSubObjectType read FSubObjectType
                                                    write FSubObjectType;
          end;
    
       TMySubObjectArray = array of TMySubObject;
    
       TMyObject = class(TObject)
          private
             FName: String;
             FCount: Integer;
             FSubObjects: TMySubObjectArray;
             procedure SetName(const Value: String);
             function GetSubObject(Index: Integer): TMySubObject;
          public
             constructor Create(ACount: Integer); virtual;
             property Name: String read FName write SetName;
             property Count: Integer read FCount;
             property SubObjects[Index: Integer]: TMySubObject read GetSubObject; default;
          end;
    
    constructor TMyObject.Create(ACount: Integer);
    var
       I: Integer;
    begin
       inherited Create;
       FCount:=ACount;
       SetLength(FSubObjects,FCount);
       for I:=0 to FCount-1 do
          FSubObjects[I]:=TMySubObject.Create;
    end;
    
    procedure TMyObject.SetName(const Value: String);
    begin
       if (Value <> FName) then
          FName:=Value;
    end;
    
    function TMyObject.GetSubObject(Index: Integer): TMySubObject;
    begin
       Result:=FSubObjects[Index];
    end;
    
    var
       TempObject: TMyObject;
       TempValue1: Integer;
       TempValue2: Integer;
       I: Integer;
       TempResults: TMySubObjectArray;
       TempCount: Integer;
    begin
       TempObject:=TMyObject.Create(1000000);
       try
          TempObject.Name:='Assignment Tests';
          TempValue1:=Random(0,999999);
          TempValue2:=Random(0,999999);
          TempObject[TempValue1].SubObjectType:=sotString;
          TempObject[TempValue2].SubObjectType:=sotNone;
          SetLength(TempResults,2);
          TempCount:=0;
          for I:=0 to 999999 do
             begin
             if (TempObject[I].SubObjectType <> sotInteger) then
                begin
                TempResults[TempCount]:=TempObject[I];
                Inc(TempCount);
                end;
             end;
       finally
          TempObject.Free;
       end;
    end.

    A basic array population (1 million elements) like this takes ~172 msecs:

    program ForArray;
    
    function UserIntToStr(Value: Integer): String;
    begin
       Result:=IntToStr(Value);
    end;
    
    var
       I: Integer;
       TempStrings: array of String;
    begin
       SetLength(TempStrings,1000000);
       for I:=0 to 999999 do
          TempStrings[I]:=UserIntToStr(I);
    end.
So, things are looking good now, and I'm working very hard to get a beta out ASAP. I will keep everyone posted as things progress and the beta gets wrapped up.


Tags: Elevate Web BuilderPermanent Link13 Comments

DBISAM 4.48 Build 3 Released
Posted by Tim Young on Tue, Mar 26 2019

DBISAM 4.48 Build 3 is now available for download. If you're an existing customer, then you should be receiving an email shortly with download instructions.

This build contains a couple of bug fixes, which are detailed here.


Tags: DBISAM, New BuildsPermanent Link1 Comments

ElevateDB 2.31 Released
Posted by Tim Young on Mon, Mar 18 2019

ElevateDB 2.31 is now available for download. If you're an existing customer, then you should be receiving an email shortly with download instructions.

The breaking changes and new features for the ElevateDB VCL/LCL, DAC, and PHP products are below. In addition, this release contains a couple of bug fixes, which are detailed here.

2.31 Breaking Changes
The following are breaking changes in 2.31:

VCL/LCL
  • Per the support email sent out to all ElevateDB customers, the TEDBEngine StandardNullBehavior and the TEDBSession LocalStandardNullBehavior properties have been removed. The non-standard NULL behaviors were never really working correctly, and it was finally determined that it would be impossible to make them work correctly in all situations, so these properties have been removed. If you have set either property to False, then you will need to make sure to open/save any forms or data modules that contain either a TEDBEngine or TEDBSession component in order to prevent any runtime errors regarding missing properties.
DAC/PHP
  • Per the support email sent out to all ElevateDB customers, the STANDARDNULL connection string attribute has been removed. The non-standard NULL behaviors were never really working correctly, and it was finally determined that it would be impossible to make them work correctly in all situations, so this attribute has been removed.


Tags: ElevateDB, New ReleasesPermanent Link0 Comments

DBISAM 4.48 Build 2 Released
Posted by Tim Young on Mon, Mar 11 2019

DBISAM 4.48 Build 2 is now available for download. If you're an existing customer, then you should be receiving an email shortly with download instructions.

This build contains a bug fix for an issue with the use of the LASTAUTOINC function in INSERT statements, which is detailed here.


Tags: DBISAM, New BuildsPermanent Link0 Comments

ElevateDB 2.30 Build 5 Released
Posted by Tim Young on Wed, Feb 27 2019

ElevateDB 2.30 Build 5 is now available for download. If you're an existing customer, then you should be receiving an email shortly with download instructions.

This build contains several bug fixes, which are detailed here.

Tags: ElevateDB, New BuildsPermanent Link0 Comments


Previous Entries: 1-6 7-12 13-18 19-24 25-30 31-36 37-42 43-48 49-54 55-60 61-66 67-72 73-78 79-84 85-90 91-96 97-102 103-108 109-114 115-120 121-126 127-132 133-138 139-144 145-150 151-156 157-162 163-168 169-174 175-180 181-186 187-192 193-198 199-204 205-210 211-216 217-222 223-228 229-234 235-240 241-246 247-252 253-258 259-264 265-270 271-276 277-282 283-288 289-294 295-300 301-306 307-312 313-318 319-324
Image