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¶
- Ruby 1.8.7 or later
- CUBRID gem
- ActiveRecord gem
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
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) );
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') spain.code = 'ESP' spain.save end
Deleting Database Records
Delete records from a database as follows:
Country.transaction do spain = Country.where(:code => 'ESP') 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') 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') 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.
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