GDA stands for GNOME Data Access and is a library to wrap database connections and its data using GObject classes, you can execute queries and much more.
VDA stands for Vala Data Access, is a library providing a heavily object oriented API to access databases’s data.
The API developed for VDA is going to be:
- Heavily Object Oriented
- Asynchronous almost by default
- Provides GObject to database mapping
Object Oriented
GDA uses lot of structures, they are hard to be introspectable, so hard to be used outside C and Vala.
Providers now are Connection
objects, so you have to instantiate them and then call open
and catch opened
signal to know if you are up with the connection.
SQL statements now are Query
objects, created from string and now from structured objects with simple API, they can use execute
on itself to get a TableModel
, AffectedRows
or any other Result
object. An object for almost all kind of SQL commands will be added, with a simple easy to use API to provides the data it needs to be executed over the Connection
.
There are models for tables, rows and columns, some of them implementing GLib.ListModel
, so can iterate over their members, like rows in a table or columns in a row.
Asynchronous
Database operations can take time to be executed on servers, locally or remote, so you now have all Query
execution as async
methods, so for opening connections.
API
As you can notice, some API are still in development for VDA, so you can use the one already working or access GDA’s Connection objects if you are using Providers from it.
Eventually all API will be implemented by native Connection objects, without bind GDA. Searching to provide an easy and fast way to access introspection data from databases.
Easy API for New Database Servers
Currently GDA implementation for Providers is hard to implement for new database servers. VDA provides a new easy to implement interfaces, for new database servers, so is possible to extend VDA by creating new libraries, without depend on plugins.
Map objects to databases
Recently, VDA gains Vda.DataObject
interface, it provides mapping your object to database’s table’s row, where the row’s columns are mapped to object’s properties and back.
Vda.DataObject
supports:
- Gets data from the database, through a
SELECT
query execution - Sets data in a table’s row using an
UPDATE
command - Creates new rows in the tables using an
INSERT
command - Removes a row in the table using a
DELETE
command
Best of all you just need:
- Implement
Vda.DataObject
with just 3 properties - Mark your object’s properties you want to map to the database’s table’s row’s column, using its nick with a text like:
@Property Name::id
, this is: your field’s in the data base can have any supported name, including spaces, we use@
to mark a property as to be mapped and::id
to mark it as an ID property used to query from the database.
All queries to read/write data to the database will be calculated automatically for you. Your class should set a Vda.Connection
and the table’s name, through Vda.DataObject.database_connection
and Vda.DataObject.database_table properties
, this last one just at construction time.
This an example on how your code could be seen. Pay attention at initialization()
method, was added here to show you how the table is created in the database and how the data is mapped using compatible types, in this case string
to variant
. In the near feature, could be possible to add automatic table creation if it doesn’t exits yet.
public class Client : Object, Vda.DataObject { // Database mapping [Description (nick="@id::id")] public string id { get; set; } [Description (nick="@name")] public string name { get; set; } [Description (nick="@description")] public string description { get; set; } [Description (nick="@phone")] public string phone { get; set; } construct { database_table_name = "clients"; id = GLib.Uuid.string_random (); } public async string initialization () throws GLib.Error { var qct = database_connection.parse_string ("CREATE TABLE IF NOT EXISTS clients (id varchar(50), name varchar(50), description varchar(50), phone varchar(50))"); yield qct.execute (null); var qi = database_connection.parse_string ("INSERT INTO clients (id, name, description, phone) VALUES ('"+id+"','"+name+"','"+description+"','"+phone+"')"); yield qi.execute (null); return id; } // DataObject public string database_table_name { get; construct set; } public Vda.Connection database_connection { get; set; } public Cancellable cancellable { get; set; } }