File: database.rb

package info (click to toggle)
ruby-dbd-odbc 0.2.5%2Bgem2deb-1
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd, wheezy
  • size: 276 kB
  • ctags: 118
  • sloc: ruby: 1,083; sql: 52; makefile: 2
file content (128 lines) | stat: -rw-r--r-- 3,501 bytes parent folder | download | duplicates (2)
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
#
# See DBI::BaseDatabase.
#
class DBI::DBD::ODBC::Database < DBI::BaseDatabase
    def disconnect
        @handle.rollback
        @handle.disconnect 
    rescue DBI::DBD::ODBC::ODBCErr => err
        raise DBI::DatabaseError.new(err.message)
    end

    def database_name
        @handle.get_info('SQL_DATABASE_NAME')
    end

    def ping
        @handle.connected?
    end

    #
    # See DBI::BaseDatabase#columns. Additional Attributes:
    #
    # * nullable: boolean, true if NULLs are allowed in this column.
    #
    def columns(table)
        cols = []

        stmt = @handle.columns(table)
        stmt.ignorecase = true

        stmt.each_hash do |row|
            info = Hash.new
            cols << info

            info['name']      = row['COLUMN_NAME']
            info['type_name'] = row['TYPE_NAME']
            info['sql_type']  = row['DATA_TYPE']
            info['nullable']  = 
                case row['NULLABLE']
                when 1
                    true
                when 0
                    false
                else
                    nil
                end
            info['precision'] = row['PRECISION']
            info['scale']     = row['SCALE']
        end

        stmt.drop
        cols
    rescue DBI::DBD::ODBC::ODBCErr => err
        raise DBI::DatabaseError.new(err.message)
    end

    def tables
        stmt = @handle.tables
        stmt.ignorecase = true
        tabs = [] 
        stmt.each_hash {|row|
            tabs << row["TABLE_NAME"]
        }
        stmt.drop
        tabs
    rescue DBI::DBD::ODBC::ODBCErr => err
        raise DBI::DatabaseError.new(err.message)
    end

    def prepare(statement)
        DBI::DBD::ODBC::Statement.new(@handle.prepare(statement), statement)
    rescue DBI::DBD::ODBC::ODBCErr => err
        raise DBI::DatabaseError.new(err.message)
    end

    def do(statement, *bindvars)
        @handle.do(statement, *bindvars) 
    rescue DBI::DBD::ODBC::ODBCErr => err
        raise DBI::DatabaseError.new(err.message)
    end

    def execute(statement, *bindvars)
        stmt = @handle.run(statement, *bindvars) 
        DBI::DBD::ODBC::Statement.new(stmt, statement)
    rescue DBI::DBD::ODBC::ODBCErr => err
        raise DBI::DatabaseError.new(err.message)
    end

    #
    # Additional Attributes on the DatabaseHandle:
    #
    # * AutoCommit: force a commit after each statement execution.
    # * odbc_ignorecase: Be case-insensitive in operations. 
    # * odbc_timeout: Return after a certain time regardless of whether the operation returned anything.
    #
    def []=(attr, value)
        case attr
        when 'AutoCommit'
            @handle.autocommit(value)
        when 'odbc_ignorecase'
            @handle.ignorecase(value)
        when 'odbc_timeout'
            @handle.timeout(value)
        else
            if attr =~ /^odbc_/ or attr != /_/
                raise DBI::NotSupportedError, "Option '#{attr}' not supported"
            else # option for some other driver - quitly ignore
                return
            end
        end
        @attr[attr] = value
    rescue DBI::DBD::ODBC::ODBCErr => err
        raise DBI::DatabaseError.new(err.message)
    end

    def commit
        @handle.commit
    rescue DBI::DBD::ODBC::ODBCErr => err
        raise DBI::DatabaseError.new(err.message)
    end

    def rollback
        @handle.rollback
    rescue DBI::DBD::ODBC::ODBCErr => err
        raise DBI::DatabaseError.new(err.message)
    end

end # class Database