o
    zf:                     @   s   d dl mZmZ d dlmZ d dlmZmZ d dlm	Z	 d dlm
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d dlZd dlZd dlZdd ZG dd dZdS )    )create_enginefunc)sessionmaker)IntegrityErrorResourceClosedError)	QueuePool)Session)debug_message)lataa_www_sivu)vuoropari_int_to_str)jakso_into_to_str)parsi_x_palot)parsi_jaksonumero)
Otteludata)gcurrent_app)Config)BeautifulSoupNc               
   C   sF   dt vr z
ttjt _W t jS  ty }  ztd| d} ~ ww t jS )u   
    Palauttaa tietokanta-instanssin. Luo uuden, jos sitä ei ole olemassa.

    Palauttaa:
        Database: tietokanta-instanssi

    Nostaa:
        RuntimeError: Jos tietokanta-instanssia ei voida luoda
    dbu"   Tietokantayhteyttä ei voitu luodaN)r   Databaser   SQLALCHEMY_DATABASE_URIr   	ExceptionRuntimeError)e r   !/var/www/html/flask-app/app/db.pyget_db   s   
r   c                   @   sP   e Zd Zdd Zdd Zdd Zdd Zdd
dZdd Zdd Z	dddZ
dS )r   c                 C   s>   t d|  t|tdd| _t| jd}| | _t d d S )NzConnecting to database: F)	poolclassechobindzConnected to database)r	   r   r   enginer   session)selfdatabase_urir   r   r   r   __init__-   s
   zDatabase.__init__c                 C   s6   t d | jrt d | j  t d | j  d S )NzClosing database connectionzClosing sessionzDisposing engine)r	   r"   closer!   dispose)r#   r   r   r   close_connection4   s   
zDatabase.close_connectionc              
   C   s~   zd| j _| j  |W S  ty( } z| j  t| W Y d }~dS d }~w ty> } zt| W Y d }~dS d }~ww )NF)r!   r   r"   commitr   rollbackprintr   )r#   ottelur   r   r   r   r)   <   s   

zDatabase.commitc              
   C   s   | j r| j   t| jd}| | _ z+td| dt d j  | j t	j
|d }|r3|W S td| d W dS  tyY } ztd	| tj W Y d }~dS d }~w tyt } ztd
| tj W Y d }~dS d }~ww )Nr   zget_match_by_ottelunumero() called by:    )ottelunumerozOttelua u    ei löytynyt kannastaFzResourceClosedError: zError: )r"   r&   r   r!   r	   inspectstackfunctionqueryr   	filter_byfirstr   	constantsDEBUG_MESSAGE_LEVEL_ERRORr   )r#   r/   r   r,   r   r   r   r   get_match_by_ottelunumeroI   s(   
z"Database.get_match_by_ottelunumeror   c                 C   sb   |dkr|dkrt ||d}n| jtt j }t |d |d}| j| | j  |jS )Nr.   r   )r/   pesistulokset)	r   r"   r3   r   maxr/   scalaraddr)   )r#   r9   r/   r,   max_ottelunumeror   r   r   uusi_ottelua   s   
zDatabase.uusi_otteluc              
   C   s  |  |}|rld|v r|j|jkr|d |_|d |_d|v r0|j|jkr+|d |_|d |_d|v rnd|v rn|d dkrNt||d t||d d  n |d dkrntt||d dkrnt||d t||d d  d|v r|d d	krt|jd
k r|jd |_|d dkrd|_|d dkr|j	dkr|j	d |_	t
|j	|_d|_t|j|_|d dkr|j	dk r|j	d |_	t
|j	|_d|_t|j|_|d dkr|jdkr|jd |_t|j|_| | |d dkr	|jdk r	|jd |_t|j|_| | |d dkr| | zQzd| j_| j  W W |   dS  tyI } z| j  t| W Y d }~W |   dS d }~w ty_ } z
t| W Y d }~nd }~ww W |   dS |   w dS )Nkotijoukkuevierasjoukkueupdate_valueactionlisaar.   vahennar   
lisaa_palo   Xpoista_palot jakso_taaksejakso_eteenpain   vuoropari_taaksevuoropari_eteenpain   vaihda_lyontivuoroFT)r8   r?   nykyinen_lyontivuoror@   setattrgetattrintlenpalot	jakso_nror   	jakso_txtvuoropari_nror   vuoropari_txtrP   r!   r   r"   r)   r(   r   r*   r+   r   )r#   r/   paramsr,   r   r   r   r   update_matchl   s   




 







	

zDatabase.update_matchc                 C   s,   |r|j |jkr|j|_ d S |j|_ d S d S N)rQ   r?   r@   )r#   r,   r   r   r   rP      s
   zDatabase.vaihda_lyontivuoroNc               	   C   s  t d| dt d j tj |d u r| |}d| d}t|}t|d}|j	ddd	d
 
dj }|j	ddd	d
 
dj }d}d}	|
dddi}
|
d urYd}|si||_||_d|_| |S d
}d
}d }d }d }d }d }d }d }d }|rz&|
	dddi}|d
 
dddij }|d 
dddij }d}	W n ttfy   d }d }d}	Y nw |

dddi}|

dddi}|
dddi
dddij }|dkrd }|
dddi
dddij }|dkrd }|	rd|_|
dddi
dddij }|dkrd }|
dddi
dddij }|dkr,d }|
dddirt|
dddi
dddirf|
dddi
dddij }|
dddi
dddij }|dkrmd }|dkrtd }|
dddi
dddir|
dddi
dddij }|
dddi
dddij }|dkrd }|dkrd }nd|_||_||_||_||_||_||_||_||_||_||_||_||_|
dddir|
dddi}|	dd
 }|	dd  }|j}|j d!krd"}nd#}||_d#|_|
ddd$ir(|j|_|
ddd$ijj}n|
ddd$ir?|j|_|
ddd$ijj}t |}||_!t"||_#z|
ddd%i}|j$d&}t%||_&W n tym   d|_&Y nw t d'tj | |S )(NzlataaOtteludataPesistuloksista(r-   r.   z$https://v2.pesistulokset.fi/ottelut/z#livezhtml.parserdivzmatch-team team-home flexbox)class_r   h3zmatch-team team-away flexboxFclasszmatch-online-result content-boxTzOttelu ei ole alkanutzperiod period-totalzinning totalz	home teamz	away teamzperiod period-0rI   zperiod period-1zperiod period-2ainningzperiod period-3Junioriotteluz"online-match-current-inning-eventsspanu   Ottelu päättyiu   Ottelu päättynyt-zinning currentzright-side out   ×u*   Data parsittu. Päivitetään kantarivi...)'r	   r0   r1   r2   r6   DEBUG_MESSAGE_LEVEL_INFOr8   r
   r   find_allfindtextstripr?   r@   
otteluinfor)   AttributeError
IndexErrorjakso_1_koti_juoksutjakso_1_vieras_juoksutjakso_2_koti_juoksutjakso_2_vieras_juoksutjakso_3_koti_juoksutjakso_3_vieras_juoksutjakso_4_koti_juoksutjakso_4_vieras_juoksutkoti_jaksovoitotvieras_jaksovoitotrZ   rQ   parentr   rW   r   rX   countr   rV   ) r#   r/   r,   url	tulossivusoupr?   r@   ottelun_kirjaus_on_alkanutottelu_on_jaksopeli
tulostauluj1_koti_yhtj1_vieras_yhtj2_koti_yhtj2_vieras_yhtsv_koti_yhtsv_vieras_yht
k_koti_yhtk_vieras_yhtry   rz   jaksovoitotkoti_tuloksetvieras_tuloksetvuoropari_element
first_span	last_spanrZ   	jakso_divjaksorV   palojar   r   r   lataaOtteludataPesistuloksista   s   "


"""
"
""

""




z'Database.lataaOtteludataPesistuloksista)r   r   r]   )__name__
__module____qualname__r%   r(   r)   r8   r>   r\   rP   r   r   r   r   r   r   ,   s    
Hr   ) 
sqlalchemyr   r   sqlalchemy.ormr   sqlalchemy.excr   r   sqlalchemy.poolr   r   app.functionsr	   r
   r   r   r   r   
app.modelsr   flaskr   r   configr   bs4r   r0   timer6   r   r   r   r   r   r   <module>   s(   