rupython 1.1.7__py3-none-any.whl → 1.1.9__py3-none-any.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.
- rupython/__main__.py +22 -4
- rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/241/342/225/250/320/244.py +118 -38
- {rupython-1.1.7.dist-info → rupython-1.1.9.dist-info}/METADATA +1 -1
- {rupython-1.1.7.dist-info → rupython-1.1.9.dist-info}/RECORD +7 -7
- {rupython-1.1.7.dist-info → rupython-1.1.9.dist-info}/LICENSE +0 -0
- {rupython-1.1.7.dist-info → rupython-1.1.9.dist-info}/WHEEL +0 -0
- {rupython-1.1.7.dist-info → rupython-1.1.9.dist-info}/top_level.txt +0 -0
rupython/__main__.py
CHANGED
@@ -4,9 +4,27 @@ import sys as Система
|
|
4
4
|
|
5
5
|
Путь_к_файлу = ОС.path.realpath(Система.argv[1])
|
6
6
|
Название_файла = ОС.path.basename(Система.argv[1])
|
7
|
-
|
7
|
+
|
8
|
+
def Перехватчик_прерывания_клавиатурой(тип_исключения, значение, предыдущие_шаги):
|
9
|
+
if тип_исключения == KeyboardInterrupt: print('\nСработало прерывание клавиатурой.')
|
10
|
+
else: Система.__excepthook__(тип, значение, предыдущие_шаги)
|
11
|
+
Система.excepthook = Перехватчик_прерывания_клавиатурой
|
12
|
+
|
8
13
|
Исходник = Преобразователь.Преобразовать_код(Путь_к_файлу)
|
9
|
-
if Исходник:
|
10
|
-
|
14
|
+
if Исходник: Преобразователь.Запустить_код(Название_файла, Исходник, Путь_к_файлу)
|
15
|
+
|
16
|
+
def Ожидать_нажатие_клавиши(сообщение):
|
17
|
+
if ОС.name == 'nt':
|
18
|
+
import msvcrt
|
19
|
+
print('\n' + сообщение)
|
20
|
+
msvcrt.getch()
|
21
|
+
else:
|
22
|
+
import tty
|
23
|
+
import termios
|
24
|
+
print('\n' + сообщение)
|
25
|
+
fd = Система.stdin.fileno()
|
26
|
+
old_settings = termios.tcgetattr(fd)
|
27
|
+
try: tty.setraw(fd); Система.stdin.read(1)
|
28
|
+
finally: termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
|
11
29
|
|
12
|
-
|
30
|
+
Ожидать_нажатие_клавиши('=== Исполнение кода завершено. Нажмите любую клавишу для выхода. ===')
|
@@ -1,9 +1,7 @@
|
|
1
1
|
import sqlite3
|
2
|
+
import re as РегВыр
|
2
3
|
|
3
4
|
Ошибка = sqlite3.Error
|
4
|
-
ОшибкаБазыДанных = sqlite3.DatabaseError
|
5
|
-
ОшибкаПрограммования = sqlite3.ProgrammingError
|
6
|
-
ОшибкаОперации = sqlite3.OperationalError
|
7
5
|
|
8
6
|
Разбор_объявленных_типов = sqlite3.PARSE_DECLTYPES
|
9
7
|
Разбор_названий_столбцов = sqlite3.PARSE_COLNAMES
|
@@ -16,7 +14,7 @@ import sqlite3
|
|
16
14
|
|
17
15
|
Словарь_перевода = {
|
18
16
|
'НАЧАТЬ': 'BEGIN',
|
19
|
-
'
|
17
|
+
'ЗАВЕШИТЬ': 'END',
|
20
18
|
'ТРАНЗАКЦИЮ': 'TRANSACTION',
|
21
19
|
'ОТЛОЖЕННО': 'DEFERRED',
|
22
20
|
'НЕМЕДЛЕННО': 'IMMEDIATE',
|
@@ -80,6 +78,13 @@ import sqlite3
|
|
80
78
|
'ЕСЛИ': 'IF',
|
81
79
|
'СУЩЕСТВУЕТ': 'EXISTS',
|
82
80
|
|
81
|
+
'ОПРЕДЕЛИВ': 'WITH',
|
82
|
+
'ВЫБОР': 'CASE',
|
83
|
+
'ПРИ': 'WHEN',
|
84
|
+
'ЭТО': 'THEN',
|
85
|
+
'КОНЕЦ': 'END',
|
86
|
+
'РЕКУРСИВНО': 'RECURSIVE',
|
87
|
+
|
83
88
|
'ЦЕЛОЕ': 'INTEGER',
|
84
89
|
'ВЕЩЕСТВЕННОЕ': 'REAL',
|
85
90
|
'ТЕКСТ': 'TEXT',
|
@@ -98,6 +103,7 @@ import sqlite3
|
|
98
103
|
'НЕТ': 'FALSE',
|
99
104
|
'ПО_УМОЛЧАНИЮ': 'DEFAULT',
|
100
105
|
'САМОУВЕЛИЧИВАЮЩЕЕСЯ': 'AUTO_INCREMENT',
|
106
|
+
'ССЫЛАЕТСЯ НА': 'REFERENCES',
|
101
107
|
|
102
108
|
'КОЛИЧЕСТВО': 'COUNT',
|
103
109
|
'СУММА': 'SUM',
|
@@ -254,21 +260,76 @@ def Перевести_код_запроса(текст):
|
|
254
260
|
запрос = Собрать_запрос(переведённые_токены)
|
255
261
|
return запрос
|
256
262
|
|
263
|
+
Переводы_ошибок = {
|
264
|
+
r"no such table: (.+)": r'Таблица "\1" не существует.',
|
265
|
+
r"database is locked": r'База данных заблокована.',
|
266
|
+
r"near \"(.+)\": syntax error": r'Синтаксическая ошибка около "\1".',
|
267
|
+
r"table (.+) already exists": r'Таблица "\1" уже существует.',
|
268
|
+
r"no such column: (.+)": r'Столбец "\1" не существует.',
|
269
|
+
r"(.+) has no column named (.+)": r'Таблица "\1" не имеет столбца "\2".',
|
270
|
+
r"cannot open database file": r'Не удалось открыть файл базы данных.',
|
271
|
+
r"database or disk is full": r'База данных или диск переполнены.',
|
272
|
+
r"attempt to write a readonly database": r'Попытка записи в базу данных, доступную только для чтения.',
|
273
|
+
r"no such index: (.+)": r'Индекс "\1" не существует.',
|
274
|
+
r"too many SQL variables": r'Слишком много переменных в запросе.',
|
275
|
+
r"maximum recursion depth exceeded": r'Превышена максимальная глубина рекурсии в запросе.',
|
276
|
+
r"incomplete input": r'Неполный запрос.',
|
277
|
+
r"malformed database schema \((.+)\)": r'Некорректная схема базы данных: \1.',
|
278
|
+
r"file is not a database": r'Файл не является базой данных.',
|
279
|
+
r"database disk image is malformed": r'Образ диска базы данных повреждён.',
|
280
|
+
r"incorrect number of bindings supplied. The statement has (\d+) parameters, and (\d+) were supplied": r'Неверное количество переданных параметров. Ожидаемых запросом параметров - \1, передано - \2.',
|
281
|
+
r"You did not supply a value for binding (\d+)": r'Не указано значение для параметра \1.',
|
282
|
+
r"Cannot operate on a closed database": r'Невозможно выполнить операцию на закрытой базе данных.',
|
283
|
+
r"Cannot operate on a closed cursor": r'Невозможно выполнить операцию на закрытом указателе.',
|
284
|
+
r"column (.+) is not unique": r'Столбец "\1" должен быть уникальным.',
|
285
|
+
r"number of bound variables does not match number of parameters": r'Количество привязанных переменных не соответствует количеству параметров.',
|
286
|
+
r"only one statement is allowed": r'Разрешено выполнять только один запрос за раз.',
|
287
|
+
r"NOT NULL constraint failed: (.+)": r'Нарушение ограничения НЕ ПУСТО для столбца "\1".',
|
288
|
+
r"UNIQUE constraint failed: (.+)": r'Нарушение ограничения УНИКАЛЬНЫЙ для столбца "\1".',
|
289
|
+
r"FOREIGN KEY constraint failed": r'Нарушение ограничения ВНЕШНИЙ КЛЮЧ.',
|
290
|
+
r"CHECK constraint failed: (.+)": r'Нарушение ограничения ПРОВЕРЯТЬ: \1.',
|
291
|
+
r"PRIMARY KEY must be unique": r'Первичный ключ должен быть уникальным.',
|
292
|
+
r"Error binding parameter (\d+) - probably unsupported type": r'Ошибка привязки параметра \1 - вероятно, неподдерживаемый тип.',
|
293
|
+
r"Cursor needed to be reset because of commit/rollback and can no longer be fetched from": r'Указатель должен быть сброшен из-за утверждения или отката и больше не может быть использован.',
|
294
|
+
r"Warning: You can only execute one statement at a time": r'Можно выполнять только один запрос за раз.',
|
295
|
+
r"(.+) not supported by this database": r'Операция "\1" не поддерживается этой базой данных.',
|
296
|
+
r"too many connections": r'Слишком много активных подключений к базе данных.',
|
297
|
+
r"no such function: (.+)": r'Функция "\1" не существует.',
|
298
|
+
r"no such module: (.+)": r'Модуль "\1" не существует.',
|
299
|
+
r"parameters are of unsupported type": r'Параметры имеют неподдерживаемый тип.',
|
300
|
+
r"interrupted": r'Операция была прервана.',
|
301
|
+
r"out of memory": r'Недостаточно памяти для выполнения операции.'
|
302
|
+
}
|
303
|
+
|
304
|
+
def Перевести_ошибку(исключение):
|
305
|
+
сообщение = str(исключение)
|
306
|
+
for шаблон, перевод in Переводы_ошибок.items():
|
307
|
+
совпадение = РегВыр.match(шаблон, сообщение)
|
308
|
+
if совпадение:
|
309
|
+
return РегВыр.sub(шаблон, перевод, сообщение)
|
310
|
+
return f"Неизвестная ошибка: {сообщение}"
|
311
|
+
|
257
312
|
class Указатель():
|
258
313
|
def __init__(здесь, курсор):
|
259
314
|
здесь._курсор = курсор
|
260
315
|
|
261
316
|
def Выполнить_запрос(здесь, запрос, параметры=()):
|
262
|
-
|
263
|
-
|
317
|
+
try:
|
318
|
+
запрос = Перевести_код_запроса(запрос)
|
319
|
+
здесь._курсор.execute(запрос, параметры)
|
320
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
264
321
|
|
265
322
|
def Выполнить_запросы(здесь, запрос, последовательность_параметров):
|
266
|
-
|
267
|
-
|
323
|
+
try:
|
324
|
+
запрос = Перевести_код_запроса(запрос)
|
325
|
+
здесь._курсор.executemany(запрос, последовательность_параметров)
|
326
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
268
327
|
|
269
328
|
def Выполнить_сценарий(здесь, сценарий):
|
270
|
-
|
271
|
-
|
329
|
+
try:
|
330
|
+
скрипт = Перевести_код_запроса(сценарий)
|
331
|
+
здесь._курсор.executescript(скрипт)
|
332
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
272
333
|
|
273
334
|
def Извлечь_запись(здесь):
|
274
335
|
return здесь._курсор.fetchone()
|
@@ -305,48 +366,67 @@ class Соединение():
|
|
305
366
|
elif уровень_изоляции == 'ИСКЛЮЧИТЕЛЬНО': уровень_изоляции = 'EXCLUSIVE'
|
306
367
|
else: уровень_изоляции = None
|
307
368
|
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
369
|
+
try:
|
370
|
+
здесь._соединение = sqlite3.connect(
|
371
|
+
путь,
|
372
|
+
timeout=таймаут,
|
373
|
+
detect_types=обнаружение_типов,
|
374
|
+
isolation_level=уровень_изоляции,
|
375
|
+
check_same_thread=проверять_тот_же_ли_поток,
|
376
|
+
cached_statements=кэш_инструкций,
|
377
|
+
uri=является_ссылкой
|
378
|
+
)
|
379
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
317
380
|
|
318
381
|
def Создать_указатель(здесь):
|
319
|
-
|
320
|
-
|
382
|
+
try:
|
383
|
+
курсор = здесь._соединение.cursor()
|
384
|
+
return Указатель(курсор)
|
385
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
321
386
|
|
322
387
|
def Выполнить_запрос(здесь, запрос, параметры=()):
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
388
|
+
try:
|
389
|
+
запрос = Перевести_код_запроса(запрос)
|
390
|
+
указатель = здесь._соединение.execute(запрос, параметры)
|
391
|
+
return Указатель(указатель)
|
392
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
393
|
+
|
394
|
+
def Выполнить_запросы(здесь, запрос, параметры):
|
395
|
+
try:
|
396
|
+
запрос = Перевести_код_запроса(запрос)
|
397
|
+
указатель = здесь._соединение.executemany(запрос, параметры)
|
398
|
+
return Указатель(указатель)
|
399
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
331
400
|
|
332
401
|
def Выполнить_сценарий(здесь, сценарий):
|
333
|
-
|
334
|
-
|
402
|
+
try:
|
403
|
+
скрипт = Перевести_код_запроса(сценарий)
|
404
|
+
здесь._соединение.executescript(скрипт)
|
405
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
335
406
|
|
336
407
|
def Создать_функцию(здесь, имя, количество_параметров, функция):
|
337
|
-
здесь._соединение.create_function(имя, количество_параметров, функция)
|
408
|
+
try: здесь._соединение.create_function(имя, количество_параметров, функция)
|
409
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
338
410
|
|
339
|
-
def Создать_агрегатную_функцию(здесь, имя,
|
340
|
-
здесь._соединение.create_aggregate(имя,
|
411
|
+
def Создать_агрегатную_функцию(здесь, имя, число_аргументов, класс):
|
412
|
+
try: здесь._соединение.create_aggregate(имя, число_аргументов)
|
413
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
341
414
|
|
342
415
|
def Создать_сопоставление(здесь, имя, функция):
|
343
|
-
здесь._соединение.create_collation(имя, функция)
|
416
|
+
try: здесь._соединение.create_collation(имя, функция)
|
417
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
344
418
|
|
345
|
-
def Закрыть(здесь):
|
419
|
+
def Закрыть(здесь):
|
420
|
+
try: здесь._соединение.close()
|
421
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
346
422
|
|
347
|
-
def Утвердить(здесь):
|
423
|
+
def Утвердить(здесь):
|
424
|
+
try: здесь._соединение.commit()
|
425
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
348
426
|
|
349
|
-
def Откатить(здесь):
|
427
|
+
def Откатить(здесь):
|
428
|
+
try: здесь._соединение.rollback()
|
429
|
+
except Ошибка as ош: raise Ошибка(Перевести_ошибку(ош)) from ош
|
350
430
|
|
351
431
|
@property
|
352
432
|
def В_транзакции(здесь): return здесь._соединение.in_transaction
|
@@ -1,12 +1,12 @@
|
|
1
|
-
rupython/__main__.py,sha256=
|
1
|
+
rupython/__main__.py,sha256=a2Uh9VhUlxF2O4IpE-8tpbNr__XXoYeVo5ZiuUUvvAk,1660
|
2
2
|
rupython/__Заголовочный_код__.py,sha256=VWghfQc6dv9lwIeQvJotpdOlBtHZeN00NBeL4RdWloA,10998
|
3
3
|
rupython/Преобразователь.py,sha256=YaR4lZaQxgo4vEZFk0i4_1Nx41AoH3N0mSbV2KH3wEM,42790
|
4
|
-
rupython/Модули/БД.py,sha256=
|
4
|
+
rupython/Модули/БД.py,sha256=sMsPwyMLxrgPZmXZACdWGoyaTo3vr0A4jrMZQ7ydwzE,22107
|
5
5
|
rupython/Модули/Матем.py,sha256=d8ekm7GJreu7LJ9KmAKcTOciIUQ-VBI567BfK_QeLSc,3587
|
6
6
|
rupython/Модули/РегВыр.py,sha256=yeXYfeDF2qw4DSKVdZVSFInMUW52U7Nq_KOJKvm4XnM,6349
|
7
7
|
rupython/Модули/Случ.py,sha256=oeVdSdFVb4X_T-nX2P7NSIhise1zUPIS4lk7h-67XSg,2689
|
8
|
-
rupython-1.1.
|
9
|
-
rupython-1.1.
|
10
|
-
rupython-1.1.
|
11
|
-
rupython-1.1.
|
12
|
-
rupython-1.1.
|
8
|
+
rupython-1.1.9.dist-info/LICENSE,sha256=iWzdt1wyTlK8qNSu7TzK8pjjIcCvLvWHycp7ACRcWEc,59
|
9
|
+
rupython-1.1.9.dist-info/METADATA,sha256=0hFPOg9rj5kOcb70A5c6RNYT2x5CJkap5U5wD-GtZnA,13869
|
10
|
+
rupython-1.1.9.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
|
11
|
+
rupython-1.1.9.dist-info/top_level.txt,sha256=GtXaS8JTsBm5hpQxxtQlrxK6rExvSAK_Cp44FrY4210,9
|
12
|
+
rupython-1.1.9.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|