gbase8sdb 0.2.1__cp27-cp27mu-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
gbase8sdb/cursor.py ADDED
@@ -0,0 +1,405 @@
1
+ # coding: utf-8
2
+ from . import __name__ as MODULE_NAME
3
+ from . import errors
4
+ from .column_metadata import ColumnMetaData
5
+ from .var import Var
6
+ from .driver import DbType
7
+
8
+
9
+ class Cursor(object):
10
+ __module__ = MODULE_NAME
11
+ _cyobj = None
12
+
13
+ def __init__(self, connection):
14
+ self.connection = connection
15
+ self._cyobj = connection._cyobj.create_cursor_impl(False)
16
+
17
+ def __del__(self):
18
+ if self._cyobj is not None:
19
+ self._cyobj.close(in_del=True)
20
+
21
+ def __enter__(self):
22
+ self._verify_open()
23
+ return self
24
+
25
+ def __exit__(self, exc_type, exc_value, exc_tb):
26
+ self._verify_open()
27
+ self._cyobj.close(in_del=True)
28
+ self._cyobj = None
29
+
30
+ def __repr__(self):
31
+ cls_name = "{}.{}".format(self.__class__.__module__, self.__class__.__name__)
32
+ return "<{} on {!r}>".format(cls_name, self.connection)
33
+
34
+ def __iter__(self):
35
+ return self
36
+
37
+ def next(self):
38
+ self._verify_fetch()
39
+ row = self._cyobj.fetch_next_row(self)
40
+ if row is not None:
41
+ return row
42
+ raise StopIteration
43
+
44
+ def _get_gci_attr(self, attr_num, attr_type):
45
+ self._verify_open()
46
+ return self._cyobj._get_gci_attr(attr_num, attr_type)
47
+
48
+ def _set_gci_attr(self, attr_num, attr_type, value):
49
+ self._verify_open()
50
+ self._cyobj._set_gci_attr(attr_num, attr_type, value)
51
+
52
+
53
+ @staticmethod
54
+ def _check_proc_args(parameters, keyword_parameters):
55
+ if parameters is not None and not isinstance(parameters, (list, tuple)):
56
+ errors.raise_error(errors.ERR_ARGS_MUST_BE_LIST_OR_TUPLE)
57
+ if keyword_parameters is not None and not isinstance(
58
+ keyword_parameters, dict
59
+ ):
60
+ errors.raise_error(errors.ERR_KEYWORD_ARGS_MUST_BE_DICT)
61
+
62
+ def _call(
63
+ self,
64
+ name,
65
+ parameters,
66
+ keyword_parameters,
67
+ return_value=None,
68
+ ):
69
+ self._check_proc_args(parameters, keyword_parameters)
70
+ self._verify_open()
71
+ statement, bind_values = self._call_get_execute_args(
72
+ name, parameters, keyword_parameters, return_value
73
+ )
74
+ return self.execute(statement, bind_values)
75
+
76
+ def _call_get_execute_args(
77
+ self,
78
+ name,
79
+ parameters,
80
+ keyword_parameters,
81
+ return_value=None,
82
+ ):
83
+ bind_names = []
84
+ bind_values = []
85
+ statement_parts = ["begin "]
86
+ if return_value is not None:
87
+ statement_parts.append(":retval := ")
88
+ bind_values.append(return_value)
89
+ statement_parts.append(name + "(")
90
+ if parameters:
91
+ bind_values.extend(parameters)
92
+ bind_names = [":%d" % (i + 1) for i in range(len(parameters))]
93
+ if keyword_parameters:
94
+ for arg_name, arg_value in keyword_parameters.items():
95
+ bind_values.append(arg_value)
96
+ bind_names.append("{} => :{}".format(arg_name, len(bind_names) + 1))
97
+ statement_parts.append(",".join(bind_names))
98
+ statement_parts.append("); end;")
99
+ statement = "".join(statement_parts)
100
+ return (statement, bind_values)
101
+
102
+ def _prepare(
103
+ self, statement, tag=None, cache_statement=True
104
+ ):
105
+ self._cyobj.prepare(statement, tag, cache_statement)
106
+
107
+ def _prepare_for_execute(
108
+ self, statement, parameters, keyword_parameters=None
109
+ ):
110
+ self._verify_open()
111
+ self._cyobj._prepare_for_execute(
112
+ self, statement, parameters, keyword_parameters
113
+ )
114
+
115
+ def _verify_fetch(self):
116
+ self._verify_open()
117
+ if not self._cyobj.is_query(self):
118
+ errors.raise_error(errors.ERR_NOT_A_QUERY)
119
+
120
+ def _verify_open(self):
121
+ if self._cyobj is None:
122
+ errors.raise_error(errors.ERR_CURSOR_NOT_OPEN)
123
+ self.connection._verify_connected()
124
+
125
+ def _convert_unicode(self, value):
126
+ if isinstance(value, unicode):
127
+ return value.encode("utf-8")
128
+ return value
129
+
130
+
131
+ def callproc(
132
+ self,
133
+ name,
134
+ parameters=None,
135
+ keyword_parameters=None,
136
+ keywordParameters=None,
137
+ ):
138
+ if keywordParameters is not None:
139
+ if keyword_parameters is not None:
140
+ errors.raise_error(
141
+ errors.ERR_DUPLICATED_PARAMETER,
142
+ deprecated_name="keywordParameters",
143
+ new_name="keyword_parameters",
144
+ )
145
+ keyword_parameters = keywordParameters
146
+ self._call(name, parameters, keyword_parameters)
147
+ if parameters is None:
148
+ return []
149
+ return [
150
+ v.get_value(0) for v in self._cyobj.bind_vars[: len(parameters)]
151
+ ]
152
+
153
+ def execute(
154
+ self,
155
+ statement,
156
+ parameters=None,
157
+ **keyword_parameters
158
+ ):
159
+ statement = self._convert_unicode(statement)
160
+ self._prepare_for_execute(statement, parameters, keyword_parameters)
161
+ impl = self._cyobj
162
+ impl.execute(self)
163
+ if impl.fetch_vars is not None:
164
+ return self
165
+
166
+ def executemany(
167
+ self,
168
+ statement,
169
+ parameters,
170
+ batcherrors=False,
171
+ arraydmlrowcounts=False,
172
+ ):
173
+ self._verify_open()
174
+ statement = self._convert_unicode(statement)
175
+ num_execs = self._cyobj._prepare_for_executemany(
176
+ self, statement, parameters
177
+ )
178
+ self._cyobj.executemany(
179
+ self, num_execs, bool(batcherrors), bool(arraydmlrowcounts)
180
+ )
181
+
182
+ def fetchall(self):
183
+ self._verify_fetch()
184
+ result = []
185
+ fetch_next_row = self._cyobj.fetch_next_row
186
+ while True:
187
+ row = fetch_next_row(self)
188
+ if row is None:
189
+ break
190
+ result.append(row)
191
+ return result
192
+
193
+ def fetchmany(self, size=None, numRows=None):
194
+ self._verify_fetch()
195
+ if size is None:
196
+ if numRows is not None:
197
+ size = numRows
198
+ else:
199
+ size = self._cyobj.arraysize
200
+ elif numRows is not None:
201
+ errors.raise_error(
202
+ errors.ERR_DUPLICATED_PARAMETER,
203
+ deprecated_name="numRows",
204
+ new_name="size",
205
+ )
206
+ result = []
207
+ fetch_next_row = self._cyobj.fetch_next_row
208
+ while len(result) < size:
209
+ row = fetch_next_row(self)
210
+ if row is None:
211
+ break
212
+ result.append(row)
213
+ return result
214
+
215
+ def fetchone(self):
216
+ self._verify_fetch()
217
+ return self._cyobj.fetch_next_row(self)
218
+
219
+ def parse(self, statement):
220
+ self._verify_open()
221
+ self._prepare(statement)
222
+ self._cyobj.parse(self)
223
+
224
+ def bindnames(self):
225
+ self._verify_open()
226
+ if self._cyobj.statement is None:
227
+ errors.raise_error(errors.ERR_NO_STATEMENT_PREPARED)
228
+ return self._cyobj.get_bind_names()
229
+
230
+ def close(self):
231
+ self._verify_open()
232
+ self._cyobj.close()
233
+ self._cyobj = None
234
+
235
+ def setinputsizes(self, *args, **kwargs):
236
+ if args and kwargs:
237
+ errors.raise_error(errors.ERR_ARGS_AND_KEYWORD_ARGS)
238
+ elif args or kwargs:
239
+ self._verify_open()
240
+ return self._cyobj.setinputsizes(self.connection, args, kwargs)
241
+ return []
242
+
243
+ def setoutputsize(self, size, column=0):
244
+ pass
245
+
246
+ def prepare(
247
+ self, statement, tag=None, cache_statement=True
248
+ ):
249
+ self._verify_open()
250
+ self._prepare(statement, tag, cache_statement)
251
+
252
+ def var(
253
+ self,
254
+ typ,
255
+ size=0,
256
+ arraysize=1,
257
+ inconverter=None,
258
+ outconverter=None,
259
+ encoding_errors=None,
260
+ bypass_decode=False,
261
+ convert_nulls=False,
262
+ encodingErrors=None,
263
+ ):
264
+ self._verify_open()
265
+ if encodingErrors is not None:
266
+ if encoding_errors is not None:
267
+ errors.raise_error(
268
+ errors.ERR_DUPLICATED_PARAMETER,
269
+ deprecated_name="encodingErrors",
270
+ new_name="encoding_errors",
271
+ )
272
+ encoding_errors = encodingErrors
273
+ return self._cyobj.create_var(
274
+ self.connection,
275
+ typ,
276
+ size,
277
+ arraysize,
278
+ inconverter,
279
+ outconverter,
280
+ encoding_errors,
281
+ bypass_decode,
282
+ convert_nulls=convert_nulls,
283
+ )
284
+
285
+ def arrayvar(
286
+ self,
287
+ typ,
288
+ value,
289
+ size=0,
290
+ ):
291
+ self._verify_open()
292
+ if isinstance(value, list):
293
+ num_elements = len(value)
294
+ elif isinstance(value, int):
295
+ num_elements = value
296
+ else:
297
+ raise TypeError("expecting integer or list of values")
298
+ var = self._cyobj.create_var(
299
+ self.connection,
300
+ typ,
301
+ size=size,
302
+ num_elements=num_elements,
303
+ is_array=True,
304
+ )
305
+ if isinstance(value, list):
306
+ var.setvalue(0, value)
307
+ return var
308
+
309
+ @property
310
+ def arraysize(self):
311
+ self._verify_open()
312
+ return self._cyobj.arraysize
313
+
314
+ @arraysize.setter
315
+ def arraysize(self, value):
316
+ self._verify_open()
317
+ if not isinstance(value, int) or value <= 0:
318
+ errors.raise_error(errors.ERR_INVALID_ARRAYSIZE)
319
+ self._cyobj.arraysize = value
320
+
321
+ @property
322
+ def bindvars(self):
323
+ self._verify_open()
324
+ return self._cyobj.get_bind_vars()
325
+
326
+ @property
327
+ def description(self):
328
+ self._verify_open()
329
+ if self._cyobj.is_query(self):
330
+ return [
331
+ ColumnMetaData._create_with_cyobj(i) for i in self._cyobj.column_metadata_impls
332
+ ]
333
+
334
+ @property
335
+ def fetchvars(self):
336
+ self._verify_open()
337
+ return self._cyobj.get_fetch_vars()
338
+
339
+ @property
340
+ def inputtypehandler(self):
341
+ self._verify_open()
342
+ return self._cyobj.inputtypehandler
343
+
344
+ @inputtypehandler.setter
345
+ def inputtypehandler(self, value):
346
+ self._verify_open()
347
+ self._cyobj.inputtypehandler = value
348
+
349
+ @property
350
+ def lastrowid(self):
351
+ self._verify_open()
352
+ lastrowid = self._cyobj.get_lastrowid()
353
+ return int(lastrowid) if lastrowid else None
354
+
355
+ @property
356
+ def outputtypehandler(self):
357
+ self._verify_open()
358
+ return self._cyobj.outputtypehandler
359
+
360
+ @outputtypehandler.setter
361
+ def outputtypehandler(self, value):
362
+ self._verify_open()
363
+ self._cyobj.outputtypehandler = value
364
+
365
+ @property
366
+ def prefetchrows(self):
367
+ self._verify_open()
368
+ return self._cyobj.prefetchrows
369
+
370
+ @prefetchrows.setter
371
+ def prefetchrows(self, value):
372
+ self._verify_open()
373
+ self._cyobj.prefetchrows = value
374
+
375
+
376
+ @property
377
+ def rowcount(self):
378
+ if self._cyobj is not None and self.connection._cyobj is not None:
379
+ return self._cyobj.rowcount
380
+ return -1
381
+
382
+ @property
383
+ def rowfactory(self):
384
+ self._verify_open()
385
+ return self._cyobj.rowfactory
386
+
387
+ @rowfactory.setter
388
+ def rowfactory(self, value):
389
+ self._verify_open()
390
+ self._cyobj.rowfactory = value
391
+
392
+ @property
393
+ def scrollable(self):
394
+ self._verify_open()
395
+ return False
396
+
397
+ @property
398
+ def statement(self):
399
+ if self._cyobj is not None:
400
+ return self._cyobj.statement
401
+
402
+ @property
403
+ def warning(self):
404
+ self._verify_open()
405
+ return self._cyobj.warning
gbase8sdb/defaults.py ADDED
@@ -0,0 +1,46 @@
1
+ # coding: utf-8
2
+
3
+ from . import driver
4
+ from . import __name__ as MODULE_NAME
5
+
6
+
7
+ class Defaults(object):
8
+ __module__ = MODULE_NAME
9
+
10
+ def __init__(self):
11
+ self._cyobj = driver.DEFAULTS
12
+
13
+ @property
14
+ def arraysize(self):
15
+ return self._cyobj.arraysize
16
+
17
+ @arraysize.setter
18
+ def arraysize(self, value):
19
+ self._cyobj.arraysize = value
20
+
21
+ @property
22
+ def fetch_lobs(self):
23
+ return self._cyobj.fetch_lobs
24
+
25
+ @fetch_lobs.setter
26
+ def fetch_lobs(self, value):
27
+ self._cyobj.fetch_lobs = value
28
+
29
+ @property
30
+ def fetch_decimals(self):
31
+ return self._cyobj.fetch_decimals
32
+
33
+ @fetch_decimals.setter
34
+ def fetch_decimals(self, value):
35
+ self._cyobj.fetch_decimals = value
36
+
37
+ @property
38
+ def prefetchrows(self):
39
+ return self._cyobj.prefetchrows
40
+
41
+ @prefetchrows.setter
42
+ def prefetchrows(self, value):
43
+ self._cyobj.prefetchrows = value
44
+
45
+
46
+ defaults = Defaults()
gbase8sdb/driver.so ADDED
Binary file
gbase8sdb/dsn.py ADDED
@@ -0,0 +1,39 @@
1
+ # coding: utf-8
2
+ from . import errors
3
+
4
+ def makedsn(
5
+ server_name,
6
+ db_name,
7
+ host = None,
8
+ port = None,
9
+ protocol = 'onsoctcp',
10
+ db_locale = 'zh_CN.57372',
11
+ **params
12
+ ):
13
+ """
14
+ Return a string for use as the dsn parameter for connect().
15
+ """
16
+ dsn = "gbase8s:GBASEDBTSERVER={};DATABASE={};".format(server_name, db_name)
17
+ if 'sqlh_file' in params and params['sqlh_file'] is not None:
18
+ dsn += "SQLH_FILE={};".format(params.pop('sqlh_file'))
19
+ elif all((host, port, protocol)):
20
+ dsn += "HOST={};SERVICE={};PROTOCOL={};".format(host, port, protocol)
21
+ else:
22
+ errors.raise_error(errors.ERR_INVALID_MAKEDSN_ARG,
23
+ context_error_message="The arguments for host, port, and protocol are mandatory if you do not use the argument sqlh_file.",
24
+ name="host|port|protocol")
25
+ if db_locale:
26
+ dsn += "DB_LOCALE={};".format(db_locale)
27
+ for k, v in params.items():
28
+ k_u = k.upper()
29
+ if k_u not in ('GBASEDBTSERVER', 'DATABASE', 'HOST',
30
+ 'PORT', 'PROTOCOL', 'DB_LOCALE', 'CLIENT_LOCALE', 'SQLMODE',
31
+ 'GCI_FACTORY', 'DELIMIDENT'):
32
+ if v is not None:
33
+ dsn += "{}={};".format(k_u, v)
34
+ else:
35
+ errors.raise_error(errors.ERR_INVALID_MAKEDSN_ARG,
36
+ context_error_message="not supported parameter {}".format(k),
37
+ name="params")
38
+ dsn += "CLIENT_LOCALE=zh_CN.57372;SQLMODE=oracle;GCI_FACTORY=4;DELIMIDENT=1;"
39
+ return dsn