Class: DBI::DBD::SQLAnywhere::Database

Inherits:
BaseDatabase
  • Object
show all
Includes:
Utility
Defined in:
lib/dbd/sqlanywhere/database.rb

Constant Summary collapse

COLUMN_SELECT_STRING =
<<END_OF_STATEMENT       
SELECT SYS.SYSTABCOL.column_name,
       MIN (SYS.SYSIDXCOL.index_id) AS "index_id",
       SYS.SYSTABCOL."nulls",
       SYS.SYSTABCOL."default",
       SYS.SYSTABCOL.scale, 
       SYS.SYSTABCOL.width,
       SYS.SYSDOMAIN.type_id,
       SYS.SYSDOMAIN.domain_name,
       MIN (SYS.SYSIDX."unique") AS "unique",
       SYS.SYSTABCOL.column_id
FROM   (SYS.SYSTABLE join SYS.SYSTABCOL join SYS.SYSDOMAIN) left outer join (SYS.SYSIDXCOL join SYS.SYSIDX)
WHERE  table_name = ?
GROUP BY 
       SYS.SYSTABCOL.column_name,
       SYS.SYSTABCOL."nulls",
       SYS.SYSTABCOL."default",
       SYS.SYSTABCOL.scale, 
       SYS.SYSTABCOL.width,
       SYS.SYSDOMAIN.type_id,
       SYS.SYSDOMAIN.domain_name,
       SYS.SYSTABCOL.column_id
ORDER BY SYS.SYSTABCOL.column_id
END_OF_ST
TABLE_SELECT_STRING =
<<END_OF_STATEMENT       
SELECT table_name 
FROM SYS.SYSUSER, SYS.SYSTAB 
WHERE user_name not in ('SYS', 'dbo', 'rs_systabgroup') 
AND SYS.SYSUSER.user_id = SYS.SYSTAB.creator
END_OF_ST
SQLANY_to_DBI =
{
	   5 => DBI::SQL_SMALLINT,
	   4 => DBI::SQL_INTEGER,
	   2 => DBI::SQL_NUMERIC,
	   7 => DBI::SQL_FLOAT,
	   8 => DBI::SQL_DOUBLE,
	   9 => DBI::SQL_DATE,
	   1 => DBI::SQL_CHAR,
	  12 => DBI::SQL_VARCHAR,
	  -1 => DBI::SQL_LONGVARCHAR,
	  -2 => DBI::SQL_BINARY,
	  -4 => DBI::SQL_LONGVARBINARY,
	  11 => DBI::SQL_TIMESTAMP,
	  10 => DBI::SQL_TIME,
	  -6 => DBI::SQL_TINYINT,
	  -5 => DBI::SQL_BIGINT,
	  -9 => DBI::SQL_INTEGER, 
	 -10 => DBI::SQL_SMALLINT,
	 -11 => DBI::SQL_BIGINT,
	  -7 => DBI::SQL_BIT,
	   2 => DBI::SQL_DECIMAL,
	  -2 => DBI::SQL_VARBINARY,
	 -15 => DBI::SQL_BINARY,
	 -16 => DBI::SQL_VARBINARY,
	 -17 => DBI::SQL_LONGVARBINARY,
	 -18 => DBI::SQL_LONGVARCHAR,
	 -12 => DBI::SQL_CHAR,
	 -13 => DBI::SQL_VARCHAR,
	 -14 => DBI::SQL_LONGVARCHAR,
}

Constants included from Utility

Utility::INPUT_ONLY, Utility::INPUT_OUTPUT, Utility::NO_DIRECTION, Utility::OUTPUT_ONLY

Instance Method Summary collapse

Methods included from Utility

#do_bind!

Instance Method Details

#[](attr) ⇒ Object



244
245
246
# File 'lib/dbd/sqlanywhere/database.rb', line 244

def [] (attr)
	 @attr[attr]
end

#[]=(attr, val) ⇒ Object



248
249
250
# File 'lib/dbd/sqlanywhere/database.rb', line 248

def []= (attr, val)
	 @attr[attr] = val
end

#columns(table) ⇒ Object



181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
# File 'lib/dbd/sqlanywhere/database.rb', line 181

def columns( table )
	 prep_stmt = SA.instance.api.sqlany_prepare(@handle, COLUMN_SELECT_STRING)
	 raise error() if prep_stmt.nil?
	 res, param = SA.instance.api.sqlany_describe_bind_param(prep_stmt, 0)
	 raise error() if res == 0 or param.nil?
	 param.set_value(table) 
	 
	 raise error() if SA.instance.api.sqlany_bind_param(prep_stmt, 0, param) == 0
 
	 res = SA.instance.api.sqlany_execute(prep_stmt)     

	 raise error() if res == 0 or prep_stmt.nil?
	 columns = []
	 col_count = 0
	 while (SA.instance.api.sqlany_fetch_next(prep_stmt) == 1)
	    columns << {}

	    res, col_val = SA.instance.api.sqlany_get_column(prep_stmt, 0)
	    raise error() if res == 0
	    columns[col_count]['name'] = col_val

	    res, col_val = SA.instance.api.sqlany_get_column(prep_stmt, 1)
	    raise error() if res == 0
	    columns[col_count]['pkey'] = (col_val == 0)

	    res, col_val = SA.instance.api.sqlany_get_column(prep_stmt, 2)
	    raise error() if res == 0
	    if col_val == 'Y'
  columns[col_count]['nullable'] = true 
	    else 
  columns[col_count]['nullable'] = false 
	    end	 

	    res, col_val = SA.instance.api.sqlany_get_column(prep_stmt, 3)
	    raise error() if res == 0
	    columns[col_count]['default'] = col_val

	    res, col_val = SA.instance.api.sqlany_get_column(prep_stmt, 4)
	    raise error() if res == 0
	    columns[col_count]['scale'] = col_val
	    
	    res, col_val = SA.instance.api.sqlany_get_column(prep_stmt, 5)
	    raise error() if res == 0
	    columns[col_count]['precision'] = col_val

	    res, col_val = SA.instance.api.sqlany_get_column(prep_stmt, 6)
	    raise error() if res == 0 
	    columns[col_count]['sql_type'] = SQLANY_to_DBI[col_val]

	    res, col_val = SA.instance.api.sqlany_get_column(prep_stmt, 7)
	    raise error() if res == 0
	    columns[col_count]['type_name'] = col_val.downcase

	    res, col_val = SA.instance.api.sqlany_get_column(prep_stmt, 8)
	    raise error() if res == 0
	    columns[col_count]['unique'] = (col_val == 1 or col_val == 2)

	    col_count += 1	 
	 end
	 param.finish
	 return columns
end

#commitObject



114
115
116
117
118
# File 'lib/dbd/sqlanywhere/database.rb', line 114

def commit
	 res = SA.instance.api.sqlany_commit(@handle)
	 raise error() if res == 0
	 return res      
end

#disconnectObject



93
94
95
96
97
# File 'lib/dbd/sqlanywhere/database.rb', line 93

def disconnect
	 SA.instance.api.sqlany_rollback(@handle)
	 SA.instance.api.sqlany_disconnect(@handle)
	 SA.instance.api.sqlany_free_connection(@handle)
end

#do(sql, *bindvars) ⇒ Object



148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/dbd/sqlanywhere/database.rb', line 148

def do(sql, *bindvars)
	 prep_stmt = SA.instance.api.sqlany_prepare(@handle, sql);
	 raise error() if prep_stmt.nil?
	 num_params = SA.instance.api.sqlany_num_params(prep_stmt)    
	 raise error("Wrong number of parameters. Supplied #{bindvars.length} but expecting #{num_params}") if (num_params != bindvars.length) 
	 num_params.times do |i|      
	    res, param = SA.instance.api.sqlany_describe_bind_param(prep_stmt, i)
	    raise error() if res == 0 or param.nil?
	    do_bind!(prep_stmt, param, bindvars[i], i, nil)
	    param.finish
	 end
	 res  = SA.instance.api.sqlany_execute(prep_stmt)
	 raise error() if res == 0
	 affected_rows = SA.instance.api.sqlany_affected_rows(prep_stmt)
	 return affected_rows
end

#execute(sql, *bindvars) ⇒ Object



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/dbd/sqlanywhere/database.rb', line 130

def execute(sql, *bindvars)
	 bound = {}
	 prep_stmt = SA.instance.api.sqlany_prepare(@handle, sql);
	 raise error() if prep_stmt.nil?
	 num_params = SA.instance.api.sqlany_num_params(prep_stmt)
	 raise error("Wrong number of parameters. Supplied #{bindvars.length} but expecting #{num_params}") if (num_params != bindvars.length)	 
	 num_params.times do |i|
	    res, param = SA.instance.api.sqlany_describe_bind_param(prep_stmt, i)
	    raise error() if res == 0 or param.nil?
	    do_bind!(prep_stmt, param, bindvars[i], i, bound)
	    param.finish
	 end

	 res = SA.instance.api.sqlany_execute(prep_stmt)
	 raise error() if res == 0   
	 return Statement.new(prep_stmt, @handle, bound)
end

#pingObject



108
109
110
111
112
# File 'lib/dbd/sqlanywhere/database.rb', line 108

def ping
	 res = SA.instance.api.sqlany_execute_immediate(@handle, 'SELECT * FROM dummy')
	 raise error() if res == 0
	 return res
end

#prepare(statement) ⇒ Object



99
100
101
102
103
104
105
106
# File 'lib/dbd/sqlanywhere/database.rb', line 99

def prepare( statement )
	 stmt = SA.instance.api.sqlany_prepare(@handle, statement) 
	 if stmt.nil?
	    raise error()
	 else
	    return Statement.new(stmt, @handle)
	 end
end

#quote(value) ⇒ Object



126
127
128
# File 'lib/dbd/sqlanywhere/database.rb', line 126

def quote(value)
	 value.gsub("'", "''")
end

#rollbackObject



120
121
122
123
124
# File 'lib/dbd/sqlanywhere/database.rb', line 120

def rollback
	 res = SA.instance.api.sqlany_rollback(@handle)     
	 raise error() if res == 0
	 return res
end

#tablesObject



165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/dbd/sqlanywhere/database.rb', line 165

def tables
	 rs = SA.instance.api.sqlany_execute_direct(@handle, TABLE_SELECT_STRING)
	 if rs.nil?
	    return nil
	 else
	    tables = []
	    while (SA.instance.api.sqlany_fetch_next(rs) == 1)
  res, cols = SA.instance.api.sqlany_get_column(rs, 0) 
  raise error() if res == 0 or cols.nil?
  tables << cols
	    end

	    return tables
	 end      
end