Livecode Wiki
Advertisement

Valentina database is designed to support Relational Model, which is a standard one for the last 10-15 years for DBMS world, and smoothly and natural extend it to Object-Relational model with powerful addition of Navigational Model elements! You can read the details at this article.

A key advantage of object-relational model of Valentina is that it allows you to build databases using the relational model, then add object features when you are ready, much like the migration from programming in C to C++ (or C#).

The main ideas behind Valentina database model are:

  • Data Model should reflect to real world concepts as much as possible.
  • The more concepts a DBMS knows and understands the better.
  • RDBMS:
    • Table with Fields
    • Views
    • Triggers
    • Stored Procedures
    • Indexes as optimization structures
  • ValentinaDB adds to that:
    • RecID/OID Fields - the base IDs of records to be used on all Valentina DB levels.
    • “Link”abstraction of few kinds:
      • ForeigkKey as link, instead as constraint.
      • ObjectPtr link
      • BinaryLink
      • KeyValue Store - as universal store of Key-Value pairs. It can be integrated to Tables and Links.
      • Properties for Tables, Fields, Links, KeyValues, i.e. to any DB Schema object.
  • RecID and OID
    • Each Valentina table have hidden RecID and OID fields. RecID gives a unique identifier of a record in the scope of a table, OID - in the scope of database.
    • Mature RDBMS sometimes has an analog of RecID names usually as “rowid”. OO DBMS following ODMG standard does have OID field for objects. But Valentina beat them both in implementation of this feature!

Let you have table with million records. RDBMS will eat for rowid 4MB of data + about 12MB of index. Valentina for RecID eats ZERO Disk/Ram space! For OID field others use 8Mb + about 18MB index, Valentina still uses ZERO Disk/Ram space. New Abstraction "Link"

Intalling[]

  1. Close livecode
  2. Intall ValentinaDB for livecode
  3. Launch Livecode
  4. Open the file install.rev
  5. Close livecode

Now Valentina for Livecode is installed.

Examples[]

Creating an Employee Database[]

In order to start you should initialize Valentina with the help of Valentina_Init() function. It can be done in the openCard event, for example:

on OpenCard
   get Valentina_Init( 10 * 1024 * 1024  )
end OpenCard

on CloseCard
   get Valentina_ShutDown
end CloseCard

Firstly we have to construct the database object. It will be stored inside the plugin. After this we have to save resulting reference into some variable for further operating. And finally we write some code to open the database or to create it.

local mDatabase

on DatabaseCreate
   put VDatabase_Constructor() into mDatabase
  
   -- Build db full path near to stack:
   get the effective filename of this stack
   set the itemDel to slash
   put the (item 1 to -2 of it) & slash & "Database1" into dbPath

   get VDatabase_Open( mDatabase, dbPAth )
   
   if VDatabase_ErrNumber(mDatabase) is not "0" then
      get VDatabase_Create( mDatabase, dbPAth, "kDscDatBlbInd" )      
   end if
  
   get VDatabase_DateFormat( mDatabase, "kYMD" ) 
   get VDatabase_DateSep( mDatabase, "-" ) 
end DatabaseCreate

on DatabaseClose
   get VDatabase_Close( mDatabase )
   put VDatabase_Destructor( mDatabase ) into mDatabase
end DatabaseClose

We want to create the table with three fields: Name, LName, BirthDate. The similar way we constructed database we will get the reference to the created table.

on CreateStructure
   put VDatabase_CreateTable(mDatabase, "Person") into pTable  
   get VTable_CreateVarcharField( pTable, "Name", 1022, "fIndexed" )
   get VTable_CreateVarcharField( pTable, "LName", 1022, "fIndexed" )
   get VTable_CreateDateField( pTable, "BirthDate", "fIndexed" )
end CreateStructure

on DatabaseCreate
   put VDatabase_Constructor() into mDatabase
   -- Build db full path near to stack:
   get the effective filename of this stack
   set the itemDel to slash
   put the (item 1 to -2 of it) & slash & "Database1" into dbPath
   get VDatabase_Open( mDatabase, dbPAth )   
  if VDatabase_ErrNumber(mDatabase) is not "0" then
     get VDatabase_Create( mDatabase, dbPAth, "kDscDatBlbInd" )      
     CreateStructure
  end if
  get VDatabase_DateFormat( mDatabase, "kYMD" ) 
  get VDatabase_DateSep( mDatabase, "-" ) 
end DatabaseCreate

At this step you will learn how to create graphic elements to control database.

ValentinaDB

Add button[]

function DoAdd
   put VDatabase_Table( mDatabase, "Person" ) into tblPerson
   get VTable_SetBlank(tblPerson)
   get CollectPanes()
   get VTable_AddRecord(tblPerson)
end DoAdd

Update button[]

function DoUpdate
   put VDatabase_Table( mDatabase, "Person" ) into tblPerson
   get CollectPanes()
   get VTable_UpdateRecord(tblPerson)
end DoUpdate

Delete button[]

function DoDelete
   put VDatabase_Table( mDatabase, "Person" ) into tblPerson
   get VTable_DeleteRecord(tblPerson)
   get PopulateFields()
end DoDelete

Collect and populate[]

function CollectPanes
    put VDatabase_Table( mDatabase, "Person" ) into tblPerson
 
    put VTable_Field( tblPerson, "Name" )  into pName
    put VTable_Field( tblPerson, "LName" )  into pLName
    put VTable_Field( tblPerson, "BirthDate" )  into pBirthDate
 
   get VField_Value( pName, field efName )  
   get VField_Value( pLName, field efLName )  
   get VField_Value( pBirthDate, field efBirthDate )  
end CollectPanes

function PopulateFields
   put VDatabase_Table( mDatabase, "Person" ) into tblPerson
   put VTable_Field( tblPerson, "Name" )  into pName
   put VTable_Field( tblPerson, "LName" )  into pLName
   put VTable_Field( tblPerson, "BirthDate" )  into pBirthDate
   put VField_Value( pName ) into field efName
   put VField_Value( pLName ) into field efLName
   put VField_Value( pBirthDate ) into field efBirthDate
end PopulateFields

First button[]

function DoFirst
   put VDatabase_Table( mDatabase, "Person" ) into tblPerson
   get VTable_FirstRecord(tblPerson)
   get PopulateFields()
end DoFirst

Previous button[]

function DoPrev
 put VDatabase_Table( mDatabase, "Person" ) into tblPerson
 get VTable_PrevRecord(tblPerson)
 get PopulateFields()
end DoPrev

Next Button[]

function DoNext
   put VDatabase_Table( mDatabase, "Person" ) into tblPerson
   get VTable_NextRecord(tblPerson)
   get PopulateFields()
end DoNext

Last button[]

function DoLast
   put VDatabase_Table( mDatabase, "Person" ) into tblPerson
   get VTable_LastRecord(tblPerson)
   get PopulateFields()
end DoLast
Advertisement