Lianja v2.0 Release Notes

Lianja is a community driven development project so if there is anything specifically that you would like to see supported in the product that you do not see on this list then please submit an enhancement request.

We value your feedback so if you find anything that does not behave as expected please submit a ticket so that we can get it fixed. If we don't know about them they won't get fixed!

If there is something on the roadmap that you would like to see pulled forward in time, these can be developed as sponsored features.

   download_win    download_mac    download_linux  

Development Roadmap

The development roadmap can be found here.

Lianja v2.0 Release

Lianja PhoneGap Mobile Apps for phones and tablets

JQL query language for JSON

Additional built-in Sections

Increased Functionality and Performance

Major Upgrade

Lianja Mobile Apps

Lianja v2.0 sees the introduction of Lianja Mobile Apps for phones and tablets. Lianja Mobile Apps are multi-tier client/server Apps that run on iOS, Android and Windows Phone phones and tablets. They interoperate with a Lianja Cloud Server running in the cloud on either Windows or Linux.

Read A guide to building Lianja Mobile business database Apps to get started.

  • Fully integrated with the Adobe PhoneGap build service (in the Lianja App Builder "PhoneGap" workspace) to package up mobile apps, upload them to the build service and build installable Android and iOS Apps that can be submitted to the Apple App Store and Google Play.
  • The 'Phone App View' and 'Tablet App View' in the Lianja App Builder provide 'LiveView' integrated support for building and testing Lianja PhoneGap mobile Apps for phones and tablets. You develop your Apps locally then see the changes instantly on your mobile device (iOS, Android and WinPhone). There is no need to re-sign, re-compile, or reinstall your app to test your code as Lianja App Builder integrates in with the Adobe PhoneGap Developer App which is a free download for iOS (Apple App Store), Android (Google Play) and Windows Phone (Windows Phone App Store). Running the Adobe Developer App on your mobile device and entering the IP address of the machine that Lianja App Builder is running on, you will see your app on the mobile device changing dynamically as you develop it visually in Lianja. There is no need to install any SDK or other software (everything is included in Lianja APaaS Developer) and you can develop and test iOS, Android and WinPhone Apps on any of the operating systems that Lianja APaaS Developer runs on.  Additionally, as you change the visual appearance and/or code of your App in the Lianja App Builder, the mobile app will instantly show your latest changes. With access to device APIs not available in web browsers, you don't have to sacrifice the confidence that your app will work as you intended on the devices you are targeting.
  • The following sections are available in the Lianja Mobile client on mobile devices and work in the same way as in the Lianja Web Client.
    • attachments section
    • calendarview section
    • canvas section
    • carouselview section
    • catalogview section
    • chart sections
    • commentsview section
    • custom section
    • form section
    • galleryview section
    • grid section
    • imagestrip section
    • orgchart section
    • pagecenter section
    • panelview section
    • report section
    • tabview section
    • webview section
  • New methods added to the Lianja system object in the LianjaWebFrameWork.  Some of these provide an abstraction above PhoneGap and will only function when run on a mobile device.
    • Lianja.beep()
    • Lianja.getConnection()
    • Lianja.getCurrentPosition( onSuccess, onError )
    • Lianja.getCurrentAcceleration( onSuccess, onError )
    • Lianja.getPicture( onSuccess, onError, cameraOptions )
    • Lianja.isConnected()
    • Lianja.vibrate( nSeconds )
  • New methods added to the Lianja system object to determine if your App is running on a mobile device
    • Lianja.isPhoneGap()                           // returns true if running on a mobile device
    • Lianja.phonegapDevice()                    // returns phone, tablet or an empty string
    • Lianja.phonegapPlatform()                 // returns android, ios, winphone or an empty string
    • Lianja.phonegapVersion()                   // returns the version of phonegap the app was built against
  • New methods added to the Lianja system object which render as platform specific native UI when called on mobile devices.
    • Lianja.alert()
    • Lianja.confirm()
    • Lianja.inputBox()
    • Lianja.messageBox()
  • If the "Login required" attribute in the App Settings is checked, Lianja looks for a page in the App which is a "Login Page" (Page attribute). This becomes the first page to be made visible when you run the App on a mobile device.  If no "Login Page" is specified, then Lianja will create a default one for you that you use to sign in. Once authenticated, the "Initial Page" (as defined in the App Settings) is made visible. To logout and return to the "Login Page" touch the "Home" icon in the page headerbar.
  • Touching an editable image gadget displays the photo gallery (or camera) on mobile devices where the user can choose an existing photo or take a new photo with the camera. This new photo is automatically uploaded and replaces the one in the database column on the server. This is all handled by data binding with no coding required.
  • Orientation changes are automatically detected and the "Orientation changed" delegate is called. 
  • In the presentation rules for Sections, Gadgets and Fields you can specify whether these should be visible based on the orientation of "Portrait", "Landscape" or "Both". So, an automatic relayout of the UI will be performed as you change the orientation of a phone or tablet.
  • The Lianja Developer Community Mobile App Development Forum has been specifically created for mobile app development questions and best practices.  

JQL query language for JSON

JQL is the first database independent query language to leverage the complete flexibility of native JSON data types and the full power of SQL.

With JQL, JSON benefits from SQL because it enables developers to model and query data with relationships, and SQL benefits from JSON because it removes the "impedance mismatch" between the data model and the web/mobile application model.

The JQL query language is part of the Lianja database which is embedded into the Lianja Cloud Server in Lianja v2.0.

Read Working with JSON and JQL in Lianja v2.0 to get started.

Additional built-in Sections

  • New "CommentsView" section (similar to Facebook commenting) that can be related to a parent section.  Useful for CRM-like collaboration on records displayed in a DataView.  See here for more information and also the 'Lianja CommentsView Demo' App (example_commentsview) included in the distribution.
  • New "DocumentView" section.  Display PDF files without any plugins required.  See here for more information and also the 'Lianja DocumentView Demo' App (example_docview) included in the distribution.
  • New animated "GalleryView" section.  See here for more information and also the 'Lianja GalleryView Demo' App (example_galleryview) included in the distribution.

Increased Functionality and Performance

  • The App Builder has been upgraded to the very latest version of Qt (5.5) providing a much faster and snappier user experience.
  • Lianja v2.0 uses the latest version of WebKit, which is much faster and provides much better HTML5/CSS3 compliance than earlier versions.
  • WebViews can now be debugged using the Web Inspector by right clicking on them and setting breakpoints and watchpoints. 
  • The App Builder and the Lianja runtime (App Center) now have a built-in web server running internally. This provides you with the ability to write web services (or a management console) that can provide information from a running application.  See this forum article for details. These web services can be written in Lianja/VFP, JavaScript, PHP or Python.  This provides the ability for all desktop apps to provide an API.
  • Lianja.sessionStorage is shared in real-time across all running Lianja processes. You can share data across multiple desktop windows and background worker processes that have no UI. There is a new delegate "Session data changed" in the App Settings that is called when sessionStorage data changes.
  • New: sharedmemory class.
    myshmem = createObject("sharedmemory")
    myshmem.attach("com.lianja.myshmem", 64*1024)
    // you can optionally lock() and unlock() if you want to access many items. 
    // If you don't lock() it will be done for you as you access items in sharedmemory
    myshmem.setItem("key", "value")
    value = myshmem.getItem("key")
  • New: systemsemaphore class.
    mysem = createObject("systemsemaphore")
    // get exclusive access to a resource
    // do some work...
    // release exclusive access
  • New: httpserver class.  Embed a custom web server into your App that listens for requests on a port of your choice to expose information by web services. Desktop App only.
    myhttpserver = createObject("httpserver")
    myhttpserver.listen("localhost", 8003)
    if not myhttpserver.isListening()
      // error
    // now any request for "http://localhost:8003/desktopwebserver/dws_getsomedata.rsp?args.." will be handled internally
    // to listen on all interfaces e.g. for external access specify an empty nodename
    myhttpserver.listen("", 8003)
  • New: LianjaCloudDataServices.js is a small JavaScript library that provides Authentication services, CRUD data services and remote procedure call services to the Lianja Cloud Server.
  • New: Function and Commands for converting codepage encoded data to UTF-8
  • New: LianjaWebFramework function Lianja.evaluateJavaScript() for calling server-side JavaScript code.  Note that the Google V8 JavaScript engine is embedded into the Lianja Cloud Server so this is the same JavaScript engine that is used in node.js.  This provides you with the ability to write end-to-end JavaScript code on the client and server and generate dynamic pages with .jssp pages also.
    // Server: The file myfunction.js should be in the app or library directory and contain a function with the same
    // name as the file.
    function myfunction(arg)
      // do something useful...
      return arg;
    // Client: Call a server-side JavaScript function called myfunction from a client delegate
    var result = Lianja.evaluateJavaScript("myfunction('hello world')");
    If the file 'myfunction.js' does not exist in the app or library directory and the file 'server_functions.js' exists then the function myfunction is assumed to be defined in the 'server_functions.js' file.
  • New: additional "Page defaults" attributes in the App settings to help speedup visual design by removing the repetitive tasks of hiding the left and right sidebars and various icons from the page headerbar.
  • New: "Inactive" delegate in the Web/Mobile client.  Use this to logout inactive users automatically.
  • New: SELECT * FROM table INTO ARRAYOFOBJECTS aobj to generate a one dimensional array of objects that represent rows in a table. This array can be given to json_encode() to generate a JSON encoded array of objects.
  • New: SELECT * FROM table INTO ARRAYOFOBJECTS CONSOLE which outputs a JSON array of objects directly in one command. You can use this effectively in custom Data Web Services written in Lianja/VFP .rsp pages.
  • New: TRUNCATE TABLE tablename [IF EXISTS] SQL command.  This is the equivalent of USE tablename followed by ZAP.
  • New: SQL JSON data type (using CREATE TABLE tablename (data json)) with native SQL support (INSERT, SELECT, UPDATE, DELETE) for JSON data stored in single columns of tables.  See also Working with JSON and JQL in Lianja v2.0.
  • New: the Lianja.evaluate() method in the Web/Mobile client now handles the ability to call business procedures that are contained within custom libraries on the server. To call a procedure in a library prefix the procedure name with the library name followed by :: e.g.
    var result = Lianja.evaluate("mylib::myproc()");
  • New: in Web and Mobile Apps you can now call server-side functions written in Lianja/VFP or JavaScript directly from the Web client JavaScript code.  See this article on the forums for details.
  • New: functions which can be used in .rsp pages and/or server-side Lianja/VFP procedures called from a mobile device.
    • isPhoneGap()               // returns true if called from Lianja Mobile client
    • phoneGapDevice()       // returns phone, tablet or an empty string
    • phoneGapPlatform()    // returns android, ios, winphone or an empty string
    • phoneGapVersion()     // returns the version of phonegap the app was built against
  • New: Page attribute "Auto layout sections" and Section attribute "Auto layout percent".  These provide for a more responsive UI on mobile devices as the sections on a page will be automatically adjusted to a height which is a percentage of the viewport size rather than a fixed value.  If the Section attribute "Auto layout percent" is left at the default value of 0 then the Sections on a page are all made equal height. This may not provide the desired effect when the device orientation is changed to landscape mode, in which case you should use presentation rules to hide various sections in landscape and only show them in portrait mode.
  • SET STRCOMPARE ON is now on by default in the App Builder and the runtime App Center.  This is now consistent across Lianja desktop Apps, Lianja Cloud Server, and Lianja SQL Server.
  • SET DEBUGOUT ON and DEBUGOUT commands can now be used in .rsp pages to assist in debugging.  If an error occurs and SET DEBUGOUT is ON then error details are written to a file in the lianja\debug directory.  This file is called firecat_debugXXX.txt where XXX is the unique connection id as many requests can occur concurrently.
  • ODBC Driver improvements when used with Crystal Reports
  • General performance and stability improvements.
  • Fixed an issue with sqlexec() calls that execute stored procedures.  This did not affect Virtual Tables just the sqlexec() function.
  • Fixed touch issues in the App Center and Page Center.
  • Fixed an issue with two-phase commit in SQL transactions which was broken due to some internal caching issues.
  • Fixed an issue with SMARTQUERY (SET SMARTQUERY ON) in SQL on Windows which was not using the SQL resultset cache correctly. This is now working as expected with much improved performance.
  • Fixed an issue where the CSS on a canvas field was not being included in the Web/Mobile App if the CSS was being read from a file rather than just an inline CSS declaration.
  • Fixed various reported tickets.

Major Upgrade

Lianja v2.0 is a Major Upgrade and requires a Lianja v2 product key license.