
    hj5                     
   d dl mZmZ d dlZd dlZd dlZd dlZd dlZd dlm	Z	 ddl
mZmZmZmZ ddlmZmZ ddlmZ ddlmZ dd	lmZmZmZmZmZmZmZmZmZ erd dlZ	 d d
l m!Z! erddl"m#Z# ere$Z% G d de&      Z'y#  Y xY w)    )print_functionunicode_literalsN)
itemgetter   )ANYWINPY2TYPE_CHECKINGunicode)LEELOO_DALLASVFS)bos)up2k_wark_from_hashlist)	HAVE_SQLITE3DaemonPebkacabsrealgen_filekeymin_exquoteps3decvjoin)Path)HttpSrvc                   D    e Zd Zd ZddZd Zd Zd Zd Zd Z	d Z
d	 Zy
)U2idxc                    |j                   | _        |j                  | _        |j                  | _        | j                  j                  | _        t        s| j                  d       y d| _        d | _        i | _	        t        j                  dd      j                         | _        | j                  j                  d       d | _        d| _        d| _        y )Nz=your python does not have sqlite3; searching will be disabled z:memory:F)check_same_threadzcreate table a (b text)g        )loglog_funcasrvargs	srch_timetimeoutr   	active_id
active_curcursqlite3connectcursormem_curexecutesh_curp_endp_dur)selfhsrvs     D/jellyfin/media/venv/lib/python3.12/site-packages/copyparty/u2idx.py__init__zU2idx.__init__+   s    II	II	yy**HHTU zUKRRT78

    c                 *    | j                  d||       y )Nu2idx)r    )r0   msgcs      r2   r   z	U2idx.logA   s    gsA&r4   c                 p   t         sy | j                  j                         D ]?  }|j                  }	 |j	                          |j                          |j                          A | j                  | j                  fD ]1  }|s|j                  }|j                          |j                          3 y #  Y sxY w)N)r   r'   values
connection	interruptcloser+   r-   )r0   r'   dbs      r2   shutdownzU2idx.shutdownD   s    88??$ 	CB IIKHHJ	 LL$++. 	C^^		
		s   B11B5c           	          t         sg S |d   }|d   }t        | j                  j                  ||      }d}|dd |g}	 | j	                  ||||ddd      d	   S #  t        d
t                     xY w)zsearch by up2k hashlistsizehashzsubstr(w,1,16) = ? and w = ?N   FTi r     )r   r   r"   warksalt	run_queryr   r   )	r0   unamevolsbodyfsizefhashwarkuquvs	            r2   fsearchzU2idx.fsearchX   s     IVV&tyy'9'95%H+Sb	4 	(>>%r2udEJ1MM	(fh''s   A A.c                 4   | j                   r| j                   S t        r| j                  j                  sy t	        j
                  | j                  j                  dd      }|j                         }|j                  d      j                          || _         |S )N   Fr$   r   zpragma table_info("sh"))
r-   r   r"   shrr(   r)   shr_dbr*   r,   fetchall)r0   r>   r'   s      r2   get_shrzU2idx.get_shrk   sn    ;;;;499== __TYY--qERiik-.779
r4   c                    | j                   j                  |j                        }|r|S t        rd|j                  vry |j                  }| j
                  j                  j                  j                  |      }|s| j                  d|       y t        j                  j                  |d      }t        j                  j                  |      sy d }t        rt        j                  j                  |dz         sd}	 dj                  t!        |      j#                               }t%        j&                  |ddd	
      }|j)                         }|j+                  d      j-                          | j                  d|       |s:t%        j&                  |dd	      j)                         }| j                  d|       || j                   |<   |S #  | j                  dj                  |t/                            d }Y |xY w)Ne2dzno dbpath for zup2k.dbz-walr   z{}?mode=ro&nolock=1rQ   TF)r$   urir   zpragma table_info("up")zro: zcould not open read-only: {}
{}rR   zopened )r'   getrealpathr   flagsr!   vfsdbpathsr   ospathjoinr   existsr   formatr   as_urir(   r)   r*   r,   fetchoner   )r0   vnr'   ptophistpathdb_pathrY   r>   s           r2   get_curzU2idx.get_cury   s   hhll2;;'JuBHH4 {{99==((,,T2HH412'',,x3xxw'#((//'F*:;C	+224=3G3G3IJ__S!QVWiik56??AW./  //'1NUUWCHHG-.
;BB3QRs   >BG -G>c           	         t         sg g dfS d}d}g }d}d}	d}
d}d}g d}g d}t        j                  d      }t        j                  d      }t        j                  d      }	 |j                         }|sn"d}||z   D ].  }|j	                  |      s||v }	|t        |      d	 }d}||z  } n |rP|j	                  d
      rl|dd	 j                  d
d      \  }}|j                  d      r2|j                  d
d      \  }}|d	d d
z   |z   }|j                  d      r2|j                         }n*|dz   j                  dd      \  }}|j                  dd
      }|	rd}	|dk(  rd}d}
n|dk(  rd}d}n|dk(  rd}d}nu|dk(  rd}|j                  d       n\|dk(  rd}nT|dk(  s|j                  |      r#d}d}|dk(  rd}ndj                  |      }d|z   }nt        d d!j                  |            ||dz   z  }d}d}|rcd}t        j                  d"d|      j                         }d#D ]6  }	 t        j                  t!        j"                  t%        |      |            } nQ nO|
rd}
t'        t)        |      d$z  d$z        }n0|j	                  d%      rd&}|dd	 }|j                  d%      rd'}|d	d }|d(j                  ||      z  }|j                  |       d}	|r||z  }d}|j+                  |      }t-        |      }|r|j+                  |      s|j/                          |j                  |j1                                |d	|j3                          }|j5                         \  }}|d)v r|d*j                  |      z  }n|d+j                  ||      z  }6	 | j7                  |||||d|      S #  Y xY w# t8        $ r}t        d,t;        |            d	}~ww xY w)-zsearch by query paramsFr   T)()zand zor znot )===z!=>z>=<z<=zlike z^\.?[a-z_-]+$z (mt\.v) ([=<!>]+) \? \) $z[a-zA-Z]N"r   \ z\"rA   zup.szdatezup.mtup_atzup.atr`   ztrim(?||up.rd,'/')
rdnamezup.fntagsz) zmt.vz+mt.k = '{}' and mt.vz-exists(select 1 from mt where mt.w = mtw and i  zinvalid key [{}]z	[tzTZ, ]+)z%Y-%m-%d %H:%M:%Sz%Y-%m-%d %H:%Mz%Y-%m-%d %Hz%Y-%m-%dz%Y-%mz%Yi   *z'%'||z||'%'z {}?{} )ro   rn   z {} like ? ) z lower({}) {} ? ) rD   )r   recompilestrip
startswithlensplitendswithreplaceappendmatchrc   r   subcalendartimegmtimestrptimestrintfloatsearchr
   poplowerstartgroupsrF   	Exceptionrepr)r0   rG   rH   rM   limqvvahave_mtis_keyis_sizeis_date	field_endkw_keykw_valptn_mtptn_lcptn_lcvokkwv2vqheadtailfmtmzsfieldoperexs                                 r2   r   zU2idx.search   s(    r5= 	2A,-9:**[)BBvo ==$6\FCGIBBGA }}S!12S!,2jj&XXc1-FB#2r)A jj& XXZc((a02IIeS);A"G&[A"G'\A"G&[,AIIf%&[A&[FLLO"G $IF{#4;;A>G"LA !&8&?&?&BCCQWDDFF<a0668 C$OODMM#a&#,FG a4$./ <<$"D!"A::c?"D#2A!!$--AIIaLFY	 a ABGNN2.FFHIIbhhj!+AGGIA((*KE4{"_++E22)00==q t	(>>%q"gtSIISR  	(d2h''	(s$   .2N2N: 2N7:	OOOc                    | j                   j                  }|r[d}	dj                  |D 
cg c]  }
d|
j                  d|
j                    c}
      }| j                  |	t        |      |fz  d       g }dj                  t        j                         t        j                         j                        | _        t        | j                  d| j                  |f       |r|sd}g }n|rd	|z   }nd
|z   }| j                  dj                  ||             g }t               }t!        | j                   j"                        }||k\  r|}d}nd}i }|D ]  }|dk  r n|j                  }|j                  }|j$                  }| j'                  |      }|sD|j)                  d      xr ||j*                  j,                  v }|rdnd}|j)                  |      }|r5d}	| j                  |	|||j.                  fz  d       |j)                  d      }|| _        g }|D ]  }|dk(  r|dz   }|j3                  |        g }|j)                  d      }d|v rdnd}|j5                  |t7        |            }|D ]2  } | d d \  }!}"}#}$}%}&}'|$j9                  d      s|%j9                  d      rt;        |$|%      \  }$}%t=        t=        ||$      |%      }(|(|v r]|j?                  |(      rO|rLr'|j?                  |(      r| j                  d|(d       n#|sdd|(z   v rnd}	| j                  |	||(fz  d       tA        |(      })|sd}*n	 tC        tD        jF                  j                  ||$|%            }+tH        s|dk(  rdntK        jL                  |+      jN                  },d tQ        || j                   jR                  |+|#|,      d | z   }*|dz  }|dk  r n|rd!}	| j                  |	||)fz  d       t=        ||)      }| jT                  jV                  j)                  |tX        dd      \  }-}.|-jZ                  xs |-}-|-j                  |k7  r/t]        d"|d#|d$|d%|-j                  d#|-j                  d&      |j_                  |)       |j3                  t!        |"      |#|)|*z   |!d d' d(       5 |D ]8  } | d)   }!| d)= i }/d*}0|j5                  |0|!f      D ]  \  }1}2d||1<   |2|/|1<    |/| d+<   : |ja                  |       |sd,}	| j                  |	|t        |      t        |      fz  d        |j3                  d       d| _        |r|jc                  te        d-      .       |tg        |ji                               |dk  xr | fS c c}
w #  Y xY w)/NzRsearching across all %s volumes in which the user has 'r' (full read access):
  %sz
  /z =    z	{:.6f}_{}zu2idx-terminatorzselect * from upz1select up.*, substr(up.w,1,16) mtw from up where zselect up.* from up where zqs: {!r} {!r}TFr   dotsrchsrch_re_dotssrch_re_nodotz*searching in volume /%s (%s), excluding %s	srch_exclrx   fkfkarQ   r      z//zfiltered by srch_excl:    z/.z4database inconsistency in volume '/%s'; ignoring: %sr   z?k=zin volume '/%s': hit: %sz$database inconsistency! in volume '/z' (z), found file [z] which belongs to volume '/rm   rC   )tsszrpwr   z-select k, v from mt where w = ? and +k != 'x'rz   z-in volume '/%s': got %d hits, %d total so farr   )key)5r"   srch_dbgra   vpathr[   r   r   rc   r   	threadingcurrent_threadidentr%   r   
terminatorsetr   	srch_hitsr\   rj   rZ   axsudotpatternr&   r   r,   tupler   r   r   r   r   r   r_   r`   r   r   statst_inor   fk_saltr!   r]   r   dbvr   addextendsortr   listkeys)3r0   rG   rH   rM   rN   r   r   r   dbgtxr   	done_flagretseen_rpsclampclampedtaglistvolvtoprg   r\   r'   dotsrexrex_cfgvuvr   sretr   fk_algr8   hitr   r   r   rdfnipatvpr   sufapinochk_vn_rz   q2kr   s3                                                      r2   rF   zU2idx.run_query7  sj    ii  eA$OQAGGQZZ@OPBHHQ#d)R(!,	$++IIK11399
 	t 2T^^Y4OP#BBDrIB-2B''B/0EDII''(%<CGG n	=CQw99D<<DIIE,,s#C99Y'AESWW\\,AD#'_B99R=C@dD#++66: 99[1!DOC ;s
A

1	 D4B5.QaFBc
+A :T,/G)2r2r2r==&"--*="2r]FB5r?B/>::b>"w~~b'9 HHB%H!L!%$38*<  VA HHQ$^Q7BZC!$RWW\\$B%?@#)Vq[achhrl>Q>Q  +		))# r# C q72AHHQ$^Q/tRB $		 1 1"mT5 QIFA#ZZ16F||t+'#T2v||V__N 
 R 3r7"BH1Sb6RSu:Tx  	#HHD [[aT2 !EAr!%GAJ DG! #F	# JJt CdCIs3x88!<]n	=` 	HHD)H*D(#'*A'kAAg Px! s   #V >AVV
c                     t        | j                        D ]  }t        j                  d       |s y  || j                  k(  r%| j
                  j                  j                          y y )Nr   )ranger$   r   sleepr%   r&   r;   r<   )r0   
identifierr   r   s       r2   r   zU2idx.terminator  sT    t||$ 	AJJqM	
 'OO&&002 (r4   N)r   )__name__
__module____qualname__r3   r   r?   rO   rV   rj   r   rF   r    r4   r2   r   r   *   s5    ,'((&(TR(h`BD3r4   r   )(
__future__r   r   r   r_   r|   r   r   operatorr   r3   r   r   r	   r
   authsrvr   r   r   up2kr   utilr   r   r   r   r   r   r   r   r   r(   pathlibr   httpsrvr   xranger   objectr   r   r4   r2   <module>r     sp    7  	 	    9 9 '  )
 
 
 	  Ev3F v3	s    A> >B