Ruby Driver

CUBRID Ruby driver implements the interface to enable access from applications in Ruby to CUBRID database server and official one is available as a RubyGem package.

CUBRID Ruby driver is written based on CCI API so affected by CCI configurations such as CCI_DEFAULT_AUTOCOMMIT.

Installing and Configuring Ruby

Requirements

  • Ruby 1.8.7 or later

  • CUBRID gem

  • ActiveRecord gem

Linux

You can install the CUBRID Connector through gem. Make sure that you add the -E option so that the environment path where CUBRID has been installed cannot be reset by the sudo command.

sudo -E gem install cubrid

Windows

Enter the command line below to install the latest version of CUBRID Ruby driver.

gem install cubrid

Ruby Sample Program

This section will explain how to use Ruby ActiveRecord adapter to work with CUBRID database. Create tables by executing the following SQL script.

CREATE TABLE countries(
    id integer AUTO_INCREMENT,
    code character varying(3) NOT NULL UNIQUE,
    name character varying(40) NOT NULL UNIQUE,
    record_date datetime DEFAULT sysdatetime NOT NULL,
    CONSTRAINT pk_countries_id PRIMARY KEY(id)
);

CREATE TABLE cities(
    id integer AUTO_INCREMENT NOT NULL UNIQUE,
    name character varying(40) NOT NULL,
    country_id integer NOT NULL,
    record_date datetime DEFAULT sysdatetime NOT NULL,
    FOREIGN KEY (country_id) REFERENCES countries(id) ON DELETE RESTRICT ON UPDATE RESTRICT,
    CONSTRAINT pk_cities_id PRIMARY KEY(id)
);

Loading Library

Create a new file named tutorial.rb and add basic configuration.

require 'rubygems'
require 'active_record'
require 'pp'

Establishing Database Connection

Define the connection parameters as follows:

ActiveRecord::Base.establish_connection(
 :adapter => "cubrid",
 :host => "localhost",
 :database => "demodb" ,
 :user => "dba"
)

Inserting Objects into a Database

Before starting to operate on tables, you must declare the two tables’ mapping in the database as ActiveRecord classes.

class Country < ActiveRecord::Base
end

class City < ActiveRecord::Base
end

Country.create(:code => 'ROU', :name => 'Romania')
Country.create(:code => 'HUN', :name => 'Hungary')
Country.create(:code => 'DEU', :name => 'Germany')
Country.create(:code => 'FRA', :name => 'France')
Country.create(:code => 'ITA', :name => 'Italy', :record_date => Time.now)
Country.create(:code => 'SPN', :name => 'Spain')

Selecting Records from a Database

Select records from a database as follows:

romania = Country.find(1)
pp(romania)

romania = Country.where(:code => 'ROU')
pp(romania)

Country.find_each do |country|
 pp(country)
end

Updating Database Records

Change the Spain code from ‘SPN’ to ‘ESP’.

Country.transaction do
 spain = Country.where(:code => 'SPN')[0]
 spain.code = 'ESP'
 spain.save
end

Deleting Database Records

Delete records from a database as follows:

Country.transaction do
 spain = Country.where(:code => 'ESP')[0]
 spain.destroy
end

Working with Associations

One method to add cities to a country would be to select the Country and assign the country code to a new City object.

romania = Country.where(:code => 'ROU')[0]
City.create(:country_id => romania.id, :name => 'Bucharest');

A more elegant solution would be to let ActiveRecord know about this relationship and declare it in the Country class.

class Country < ActiveRecord::Base
 has_many :cities, :dependent => :destroy
end

class City < ActiveRecord::Base
end

In the code above, it is declared that one country can have many cities. Now it will be very easy to add new city to a country.

italy = Country.where(:code => 'ITA')[0]
italy.cities.create(:name => 'Milano');
italy.cities.create(:name => 'Napoli');

pp (romania.cities)
pp (italy.cities)

This would be very helpful because when we access cities we get all the cities recorded for the referenced country. Another use is that when you delete the country, all its cities are removed. All is done in one statement.

romania.destroy

ActiveRecord also supports other relationship including one-to-one, many-to-many, etc.

Working with Metadata

ActiveRecord enables the code to work with on different database backends without modifying the code.

Defining a database structure

A new table can be defined using ActiveRecord::Schema.define. Let’s create two tables: books and authors with a one-to-many relationship between authors and books (one-to-many).

ActiveRecord::Schema.define do
 create_table :books do |table|
  table.column :title, :string, :null => false
  table.column :price, :float, :null => false
  table.column :author_id, :integer, :null => false
 end

 create_table :authors do |table|
  table.column :name, :string, :null => false
  table.column :address, :string
  table.column :phone, :string
 end

 add_index :books, :author_id
end

CUBRID-supported column types are :string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :boolean, :bit, :smallint, :bigint, and :char. Currently, :binary is not supported.

Managing table columns

You can add, update, delete columns by using features from ActiveRecord::Migration.

ActiveRecord::Schema.define do
 create_table :todos do |table|
  table.column :title, :string
  table.column :description, :string
 end

 change_column :todos, :description, :string, :null => false
 add_column :todos, :created, :datetime, :default => Time.now
 rename_column :todos, :created, :record_date
 remove_column :todos, :record_date

end

Dumping database schema

You can use ActiveRecord::SchemaDumper.dump to dump information for currently used schema. This is done into a platform independent format that is understood by Ruby ActiveRecord.

Note that if you are using custom column types database specific (:bigint, :bit), this may not work.

Obtaining Server Capabilities

You can get database information extracted from the current connections as in the example below:

puts "Maximum column length        : " + ActiveRecord::Base.connection.column_name_length.to_s
puts "SQL statement maximum length : " + ActiveRecord::Base.connection.sql_query_length.to_s
puts "Quoting : '''test'''         : " + ActiveRecord::Base.connection.quote("'''test'''")

Creating a schema

Due to the way CUBRID is functioning, you cannot programmatically create a schema as in the following example:

ActiveRecord::Schema.define do
 create_database('not_supported')
end