File: sample.rb

package info (click to toggle)
ruby-gnome2 0.15.0-1.1etch1
  • links: PTS
  • area: main
  • in suites: etch
  • size: 7,704 kB
  • ctags: 8,558
  • sloc: ansic: 69,912; ruby: 19,511; makefile: 97; xml: 35; sql: 13
file content (135 lines) | stat: -rw-r--r-- 4,755 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135

require 'libgda'

def list_datasources
    Gda::DataSource.each do |ds|
        puts "NAME: '#{ds.name}', PROVIDER: '#{ds.provider}', CNC: '#{ds.cnc_string}', " \
             "USER: '#{ds.username}', PASSWORD: '#{ds.password}'."
    end
end

def list_providers
    Gda::Provider.each { |provider| puts "ID: '#{provider.prov_id}'." }
end

def save_ds
    ds = Gda::DataSource.new("arrakis", 
                             "MySQL", 
                             "DATABASE=pinux;HOST=192.168.1.1",
                             "MySQL connection to arrakis for user pinux", 
                             "pinux", "pinux@arrakis")
    ds.save
end

def remove_ds
    Gda::DataSource.find("arrakis").remove
end

def show_errors(conn)
    # Obtains errors list and loop for getting error information.
    conn.errors.each do |error|
        puts "Error no: #{error.number.to_s}"
        puts "Description: #{error.description}"
        puts "Source: #{error.source}"
        puts "SQL state: #{error.sqlstate}"
    end
end

def show_table(dm)
    dm.each_column { |title| puts title }
    puts ""
    dm.each_row { |row| row.each_value { |val| puts val.to_s } }
end

def create_command(text)
    Gda::Command.new(text, 
                     Gda::Command::TYPE_SQL, 
                     Gda::Command::OPTION_STOP_ON_ERRORS)
end

def execute_sql_non_query(conn, text)
    command = create_command(text)
    conn.execute_non_query(command)
end

def execute_sql_command(conn, text)
    command = create_command(text)
    array = conn.execute_command(command)
    array.each { |datamodel| show_table(datamodel) }
end

def execute_some_queries(conn)
    execute_sql_non_query(conn, "DELETE FROM customers")
    execute_sql_non_query(conn, "INSERT INTO customers (ref, name, surname, phone) " \
                                "VALUES (1, 'Linus', 'Torvalds', '264-85529-23');" \
                                "INSERT INTO customers (ref, name, surname, phone) " \
                                "VALUES (2, 'Alan', 'Cox', '05-564791235416');")
    execute_sql_non_query(conn, "DELETE FROM accounts;" \
                                "INSERT INTO accounts (ref_customer, balance) " \
                                "VALUES (1, 1000);" \
                                "INSERT INTO accounts (ref_customer, balance) " \
                                "VALUES (2, 5000);")
    execute_sql_command(conn, "SELECT * FROM customers;" \
                              "SELECT * FROM accounts") 
end

def process_accounts(conn)
    # Creates first transaction.
    transaction_one = Gda::Transaction.new("accounts1")
    # Changes the isolation level.
    transaction_one.isolation_level = Gda::Transaction::ISOLATION_SERIALIZABLE
    # Links it to connection.
    conn.begin_transaction(transaction_one)

    command = Gda::Command.new("UPDATE accounts SET balance=balance+50 WHERE ref_customer=1",
                               Gda::Command::TYPE_SQL,
                               Gda::Command::OPTION_STOP_ON_ERRORS)
    # Links command to transaction.
    command.transaction = transaction_one
    conn.execute_non_query(command)

    command = Gda::Command.new("UPDATE accounts SET balance=balance-50 WHERE ref_customer=2",
                               Gda::Command::TYPE_SQL,
                               Gda::Command::OPTION_STOP_ON_ERRORS)
    command.transaction = transaction_one
    conn.execute_non_query(command)

    # Makes commit on transaction.
    conn.commit_transaction(transaction_one)

    transaction_two = Gda::Transaction.new("accounts2")
    transaction_two.isolation_level = Gda::Transaction::ISOLATION_SERIALIZABLE
    conn.begin_transaction(transaction_two)

    command = Gda::Command.new("UPDATE accounts SET balance=balance+400 WHERE ref_customer=1",
                               Gda::Command::TYPE_SQL,
                               Gda::Command::OPTION_STOP_ON_ERRORS)
    command.transaction = transaction_two
    conn.execute_non_query(command)

    command = Gda::Command.new("UPDATE accounts SET balance=balance-400 WHERE ref_customer=2",
                               Gda::Command::TYPE_SQL,
                               Gda::Command::OPTION_STOP_ON_ERRORS)
    command.transaction = transaction_two
    conn.execute_non_query(command)

    # Makes rollback on second transaction.
    conn.rollback_transaction(transaction_two)

    execute_sql_command(conn, "SELECT * FROM accounts")
end

Gda.init("TestGDA", "0.1")
save_ds
Gda.main do
    list_providers
    list_datasources
    client = Gda::Client.new
    client.open_connection("arrakis", nil, nil) do |conn|
        conn.signal_connect('error') { show_errors(conn) }
        execute_some_queries(conn)
        process_accounts(conn)   
    end
    remove_ds
end