Posts tagged livecode

Introducing Remote DB Lib

livecode, english

DB Lib is a minimalistic database library for LiveCode that works on Desktop and Mobile and allows you to build database-savvy apps without writing SQL directly. This post is to introduce a great new feature called Remote DB Lib. As you may know from posts on the How To Use LiveCode mailing list and forums, many developers would like to use DB Lib in their apps over the internet. Like all other database libraries that work on top of RevDB, DB Lib (until today) needed to connect directly to the database server to work and this is not a good solution for apps that work over the internet since exposing MySQL to the internet at large is a huge security risk.

Today I am releasing the first version of a drop-in replacement library called Remote DB Lib. This new library has the same API as the current DB Lib but instead of working on top of RevDB, it works alongside a matching PHP file on your server, it is this PHP file that actually talks to the database server. The Remote DB Lib picks all your DB Lib calls and packs it on an encrypted message that is sent to the PHP file where it is decrypted and executed. This library is using state of the art AES 256 encryption (you can also add a free SSL certificate from Let’s Encrypt to add even more security) to protect your data.

DB Lib Goes Open Source with GPL

livecode, english

DB Lib is a minimalistic database library for LiveCode that works on Desktop and Mobile and allows you to build database-savvy apps without writing SQL directly. For example consider the following code:

dbWhere "country", "Brazil" put dbGet("contacts") into tDataA set the dgdata of control "contacts" to tDataA

It picks all records from the contacts table that have the country field equals to Brazil and set a datagrid to it. It’s very easy to use. A more involved example:

on mouseUp -- assemble array put dbCardToArray("contacts") into tDataA -- check if we're adding a new record -- or updating an existing one. -- -- this check depends on the record id being present. if field "id" is empty then get dbInsert("contacts", tDataA) if it is not a number then answer error it else answer "New Record Saved" end if go card "contact list" else dbWhere "id", field "id" get dbUpdate("contacts", tDataA) if it is not a number then answer error it else answer "Record Updated" end if go card "contact list" end if end mouseUp

In this code first we pick the data from a card using dbCardToArray(), a function that magically picks data from fields, buttons and other controls, and assemble an array that is used to insert or update a given record depending on the presence of an id field.

This is just a quick glimpse of what you can do with DB Lib. It is basically a ORM for LiveCode.

A simple publisher/subscriber library for LiveCode

livecode, english

This is a simple library I made to use in a game we’re making where we needed a way for objects to interact with each other without hard coded object references. This pattern is known as the publisher/subscriber pattern or the observer pattern.

In this pattern objects can register themselves as listeners for specific events. Once an object triggers an event, all objects that we’re listening for such event will receive a callback message. You can use this pattern to allow controls to react to events in your program without the need to hard code dispatch/send messages. A good example is a progress bar that listens for a message that is triggered by a download operation. The download routine would trigger this message without the knowledge of the progress bar, it is just broadcasting it like: “hey, I am downloading something” and the progress bar will listen for this broadcast and react to it. The code could be like:

on openCard put the long id of scrollbar "progress" into tTarget addEventListener "downloadProgress", "downloadProgressCallback", tTarget libURLSetStatusCallback "urlstatus" load URL myURL with message "downloadComplete" end openCard on urlstatus pURL, pStatus switch item 1 of pStatus case "loading" put 0 into tDataA["start"] put item 3 of pStatus into tDataA["end"] put item 2 of pStatus into tDataA["progress"] trigger "downloadProgress", tDataA break end switch end urlstatus on downloadComplete ## this is just cosmetic to guarantee that ## the progress bar goes to 100% once the download ## is completed. put 0 into tDataA["start"] put 100 tDataA["end"] put 100 into tDataA["progress"] trigger "downloadProgress", tDataA end downloadComplete

In the given scrollbar script:

on downloadProgressCallback pDataA set the startValue of me to pDataA["start"] set the endValue of me to pDataA["end"] set the thumbpos of me to pDataA["progress"] end downloadProgressCallback

This way we can change the UI that reacts to the download without touching the urlstatus message implementation. We could have many controls listening for the downloadProgress event. Also check out how both the urlstatus message and the downloadComplete message trigger the downloadProgress event. None of these messages have any prior knowledge of whom is receiving this event and nothing is hardcoded.

Using such patterns, you can decouple your user interface from the inner workings of your application easier than before. In our little game we have stuff such as objects broadcasting events like “exploded” and “died” so that other objects can react. Since in games you tend to create and destroy objects at runtime a lot, this library makes our life easier.

This library is released in the public domain. Use it as you see fit, can’t sue me. To download this library, use the link on the sidebar (or link below if you’re using a mobile device).