- Создан файл .gitignore для исключения временных и сгенерированных файлов. - Добавлен файл .python-version для указания версии Python. - Реализован класс OracleDatabase для работы с базой данных Oracle. - Создан основной файл main.py с логикой бота на aiogram. - Добавлен middleware для работы с сессией базы данных. - Создан файл pyproject.toml для управления зависимостями. - Добавлен README.md с инструкциями по запуску. - Создан скрипт run.cmd для запуска бота с необходимыми переменными окружения. - Добавлен файл uv.lock для управления зависимостями через uv.
60 lines
2.7 KiB
Python
60 lines
2.7 KiB
Python
# db.py
|
|
import oracledb
|
|
from typing import Optional, Tuple
|
|
|
|
class OracleDatabase:
|
|
def __init__(self, user: str, password: str, dsn: str):
|
|
self._user = user
|
|
self._password = password
|
|
self._dsn = dsn
|
|
self._pool: Optional[oracledb.ConnectionPool] = None
|
|
|
|
async def connect(self):
|
|
# Oracle does not support true async I/O; use threaded connection pool
|
|
self._pool = oracledb.create_pool(
|
|
user=self._user,
|
|
password=self._password,
|
|
dsn=self._dsn,
|
|
min=1,
|
|
max=4,
|
|
increment=1,
|
|
getmode=oracledb.POOL_GETMODE_WAIT
|
|
)
|
|
|
|
async def close(self):
|
|
if self._pool:
|
|
self._pool.close()
|
|
|
|
async def fetch_user(self, user_id: int):
|
|
# Manual async wrapper since oracledb is synchronous (threaded)
|
|
def _query():
|
|
with self._pool.acquire() as conn:
|
|
with conn.cursor() as cur:
|
|
cur.execute("SELECT id, name FROM users WHERE id = :id", {"id": user_id})
|
|
return cur.fetchone()
|
|
import asyncio
|
|
return await asyncio.to_thread(_query)
|
|
|
|
async def fetch_vin_info(self, vin: str) -> Tuple[str, str, str]:
|
|
# Manual async wrapper since oracledb is synchronous (threaded)
|
|
def _query():
|
|
with self._pool.acquire() as conn:
|
|
with conn.cursor() as cur:
|
|
query = """
|
|
select 'None',
|
|
COALESCE((select value from m_JSONS_FROM_NHTSA v3 where v3.svin =s.svin and v3.variableid ='26'),
|
|
(select val from vind2 where svin = substr(s.vin, 1, 8) || '*' || substr(s.vin, 10, 2) and varb = 'Make'),'UNKNOWN') make,
|
|
COALESCE((select value from m_JSONS_FROM_NHTSA v3 where v3.svin =s.svin and v3.variableid ='28'),
|
|
(select val from vind2 where svin = substr(s.vin, 1, 8) || '*' || substr(s.vin, 10, 2) and varb = 'Model'),'UNKNOWN') model,
|
|
COALESCE((select value from m_JSONS_FROM_NHTSA v3 where v3.svin =s.svin and v3.variableid ='29'),
|
|
(select val from vind2 where svin = substr(s.vin, 1, 8) || '*' || substr(s.vin, 10, 2) and varb = 'Model Year'),'UNKNOWN') year
|
|
from (select substr(:vin,1,10) svin, :vin vin from dual) s
|
|
"""
|
|
cur.execute(query, {"vin": vin})
|
|
result = cur.fetchone()
|
|
if result:
|
|
return result[1], result[2], result[3] # make, model, year
|
|
return "UNKNOWN", "UNKNOWN", "UNKNOWN"
|
|
import asyncio
|
|
return await asyncio.to_thread(_query)
|