
    (i%5                        d dl Z d dlZd dlmZ d dlmZmZ d dl	m
Z
mZ d dlmZmZmZmZmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZ d dlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% d Z&dZ'd	Z(d
Z)d Z*dZ+d	Z,d
Z-d	Z.dZ/ ed      Z0 ee0      Z1 ejd                  d      Z3d%dZ4d%dZ5d%dZ6d Z7d Z8d Z9d Z:d Z;d Z<d Z=d Z>d Z?d&dZ@d'dZAd&dZBd ZCd ZDd ZEd ZFd  ZGd! ZHd" ZId# ZJd$ ZKy)(    N)Q)gettextgettext_noop)transaction
connection)BookCatalogAuthorGenreSeriesbseriesbauthorbgenre	bookshelfCounter	LangCodes)SIZE_BOOK_FILENAMESIZE_BOOK_PATHSIZE_BOOK_FORMATSIZE_BOOK_DOCDATESIZE_BOOK_LANGSIZE_BOOK_TITLESIZE_BOOK_ANNOTATION)SIZE_CAT_CATNAMESIZE_CAT_PATHSIZE_AUTHOR_NAME
SIZE_GENRESIZE_GENRE_SECTIONSIZE_GENRE_SUBSECTIONSIZE_SERIES         zUnknown genreu   [𐀀-􏿿]c                     t         j                  dk7  r| rt        d       yyt        d       t        j                         }|j	                  d       |j	                  d       t        d       y)z' TODO: Table optimizations for Postgre 
postgresqlz,No PostgreSql connection backend detected...z'Start PostgreSql tables optimization...z4alter table opds_catalog_book SET ( fillfactor = 50)zVACUUM FULL opds_catalog_bookz1PostgreSql tables internal structure optimized...N)r   vendorprintcursorexecuteverboser(   s     !/opt/sopds/opds_catalog/opdsdb.pypg_optimizer-   -   s]    L(@A  	78""$MN67AB    c                    t        j                         }|j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d	       |j                  d
       y )Nz delete from opds_catalog_bseriesz delete from opds_catalog_bauthorzdelete from opds_catalog_bgenrez"delete from opds_catalog_bookshelfzdelete from opds_catalog_bookz delete from opds_catalog_catalogzdelete from opds_catalog_authordelete from opds_catalog_genrezdelete from opds_catalog_seriesz delete from opds_catalog_counterr   r(   r)   r*   s     r,   	clear_allr2   9   s     F
NN56
NN56
NN45
NN78
NN23
NN56
NN45
NN34
NN45
NN56r.   c                 N    t        j                         }|j                  d       y )Nr0   r1   r*   s     r,   clear_genresr4   F   s     F
NN34r.   c                 8    t         j                  d| d |       }|S )N )utfhighsub)ssizenews      r,   pr<   T   s    
++c!ET(
#CJr.   c                 ~    d}t        |       dk(  r|S t        j                         D ]  }| d   t        |   v s|} |S )N	   r   )lenr   keys)r9   langcodeks      r,   getlangcoderC   X   sI    H
1vqy^^ Q49Q<H Or.   c                  x    t         j                  j                  t        d             j	                  d       y )Nr   availr!   )r   objectsfilterr   update r.   r,   avail_check_preparerK   b   s(    LL$++!+4r.   c                  f    t         j                  j                  d      j                  d      } | S )Nr!   rE   r   )r   rG   rH   rI   	row_counts    r,   books_del_logicalrO   e   s-    ##!#,33!3<Ir.   c                  b    t         j                  j                  d      j                         } | S )Nr!   )
avail__lte)r   rG   rH   deleterM   s    r,   books_del_phisicalrS   i   s*    ##q#188:I r.   c                     t        |       }|dk(  ry||j                  k(  r2t        j                  j	                  |       j                  d      }|S y)u  
       Выясняем изменялся ли архив (ZIP или INP-файл)
       если нет, то пытаемся пропустить сканирование, устанавливая для всех книг из
       архива avail=2
       Если не одной такой книги не нашлось, то считаем что пропуск сканирования не удался
       и возвращаем 0
       Если книги из искомого каталога имелись и для них установлен avail=2, то пропуск возможен 
       и возвращаем 1 (или row_count)      
    Nr   )pathr"   rE   findcatcat_sizer   rG   rH   rI   arcpatharcsizecatalogrN   s       r,   arc_skipr]   p   sZ     gG $
 '"""LL''W'5<<1<E	 r.   c                     t        |       }|dk(  ry||j                  k(  r2t        j                  j	                  |      j                  d      }|S y)u  
       Выясняем изменялся ли INPX-файл)
       если нет, то пытаемся пропустить сканирование, устанавливая для всех книг из
       INPX avail=2
       Если не одной такой книги не нашлось, то считаем что пропуск сканирования не удался
       и возвращаем 0
       Если книги из искомого INPX имелись и для них установлен avail=2, то пропуск возможен 
       и возвращаем 1 (или row_count)      
    Nr   )catalog__parentr"   rE   rV   rY   s       r,   inp_skipr`      sZ     gG $
 '"""LL'''@GGaGP	 r.   c                     t        |       }|dk(  ry||j                  k(  r2t        j                  j	                  |      j                  d      }|S y)uz  
       Выясняем изменялся ли INPX-файл)
       если нет, то пытаемся пропустить сканирование, устанавливая для всех книг из
       INPX avail=2
       Если не одной такой книги не нашлось, то считаем что пропуск сканирования не удался
       и возвращаем 0
       Если книги из искомого INPX имелись и для них установлен avail=2, то пропуск возможен
       и возвращаем 1 (или row_count)
    Nr   )catalog__parent__parentr"   rE   rV   rY   s       r,   	inpx_skiprc      s[     gG $
 '"""LL'''HOOVWOX	 r.   c                     t         j                  j                  |       \  }}	 t        j                  j                  |d t         | d t               }|S # t        j                  $ r d }Y |S w xY w)N)cat_namerU   )	osrU   splitr	   rG   getr   r   DoesNotExist)re   headtailr\   s       r,   rW   rW      sp    h'KT$//%%t4E5E/FXVdWdMe%f N  Ns   /A A.-A.c                 6   t        |       }|r|S | dv r&t        j                  j                  d ddd      d   S t        j
                  j                  |       \  }}t        |      }t        j                  j                  ||d t         | d t         ||      }|S )N)r6   .rm   r   )parentre   rU   cat_type)rn   re   rU   ro   rX   )rW   r	   rG   get_or_createrf   rU   rg   
addcattreecreater   r   )re   archiver:   r\   rj   rk   rn   new_cats           r,   rq   rq      s    hG8,,D3S[\,]^_``h'KT$dFoo$$FTBSCS=T[cdrer[s  F  QU$  VGNr.   c                     	 t         j                  j                  | d t         |d t               }|r|rd|_        |j                          |S # t         j
                  $ r d }Y 4w xY w)N)filenamerU   r"   )r   rG   rh   r   r   ri   rF   save)namerU   setavailbooks       r,   findbookr{      sh    ||.A/A)Bo~I^_ 
		K  s   /A A&%A&c
                 &   t         j                  j                  | d t         |d t         |||j                         d t         |d t         |j                         d t         t        |t              |d t         |d t         |	dt        |            }
|
S )Nr"   )rv   rU   r\   filesizeformattitlesearch_title
annotationdocdatelangro   rF   	lang_code)r   rG   rr   r   r   lowerr   r   upperr<   r   r   r   rC   )rx   rU   catextenr   r   r   r   r:   rs   rz   s              r,   addbookr      s    <<-@.@(AtO^G\ehrv  D  J  J  L  M^  N^  _,_-5;;=IY/;Zfghr  tH  gI 2!23o~9NX_fgs~  @E  tF  GD Kr.   c                     	 t         j                  j                  | d t               d d }|S # t         j                  $ r d }Y |S w xY w)N)	full_namer!   )r
   rG   rH   r   ri   )r   authors     r,   
findauthorr      sW    &&;L<L1M&NrPQR M  Ms   *. AAc                     t         j                  j                  | d t         | j	                         d t         t        |       d      \  }}|S )N)search_full_namer   )r   defaults)r
   rG   rp   r   r   rC   )r   r   createds      r,   	addauthorr      sw    nn22YGXHX=Y  yB  yH  yH  yJ  K\  L\  y]q|  ~G  rHeI2 JOFGMr.   c                 >    t        | |      }|j                          y )N)rz   r   )r   rw   )rz   r   bas      r,   
addbauthorr      s    	d6	*BGGIr.   c                 x    t         j                  j                  | d t         t        | d t
         d      \  } }| S )N)section
subsection)genrer   )r   rG   rp   r   unknown_genrer   )r   r   s     r,   addgenrer      sR    ]]00u[j7I_l  |A  BX  CX  |Y  UZ0  [NE7Lr.   c                 >    t        | |      }|j                          y )N)rz   r   )r   rw   )rz   r   bgs      r,   	addbgenrer     s    	T	'BGGIr.   c                     t         j                  j                  | d t         | j	                         d t         t        |       d      \  }}|S )N)
search_serr   )serr   )r   rG   rp   r    r   rC   )r   seriesr   s      r,   	addseriesr     s]    nn22s<K7Hadajajalmynyaz  IT  UX  IY  TZ2  [OFGMr.   c                 @    t        | ||      }|j                          y )N)rz   r   ser_no)r   rw   )rz   r   r   bss       r,   
addbseriesr   
  s    	dF	3BGGIr.   c                 .    t        j                  |        y N)r   set_autocommit)
autocommits    r,   r   r     s    z*r.   c                  ,    t        j                          y r   )r   commitrJ   r.   r,   r   r     s    r.   )F)r   r   )r   )Lrf   redjango.db.modelsr   django.utils.translationr   _r   _noop	django.dbr   r   opds_catalog.modelsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    
CAT_NORMALCAT_ZIPCAT_INPXCAT_INPCMP_NONE
CMP_NORMAL
CMP_STRONG	CMP_CLEARCMP_TITLE_FTYPE_FSIZECMP_TITLE_AUTHORSunknown_genre_enr   compiler7   r-   r2   r4   r<   rC   rK   rO   rS   r]   r`   rc   rW   rq   r{   r   r   r   r   r   r   r   r   r   r   rJ   r.   r,   <module>r      s"   
 	  I - } } } } _  _  _ V  V  V 
		
	
 



	  
 (  ! "**/
0
C755886

+r.   