
    i                         S SK JrJr  S SKJr  S SKr\" 5       rSrS r " S S\5      r	\R                  S5      S	 5       r\R                  S
5      S\4S j5       r\R                  S5      S\S\	4S j5       rg)    )FastAPIHTTPException)	BaseModelNzDriver={ODBC Driver 18 for SQL Server};Server=192.168.1.13;Database=Home;UID=unabomber;PWD=n116533891W2k;Encrypt=yes;TrustServerCertificate=yes;c                  4    [         R                  " [        SS9$ )NF)
autocommit)pyodbcconnectCONN_STR     /var/www/html/main.pyget_connr      s    >>(u55r   c                   :    \ rS rSr% \\S'   \\   \S'   \\S'   Srg)MarkRequest   
keepFileIddeleteFileIdstoDeleter   N)	__name__
__module____qualname____firstlineno__int__annotations__listbool__static_attributes__r   r   r   r   r      s    O9Nr   r   z//dup-groupsc            	         [        5       n  U R                  5       nUR                  S5        UR                  5       n/ nSnU Hm  n[	        UR
                  5      n[	        UR                  5      nUS-
  U-  nUR                  [        U5      [        UR                  5      UUUS.5        US-  nMo     UU R                  5         $ ! U R                  5         f = f)z
Returns groups that have duplicates.
Assumes your 'files' table has: id, path, sizeBytes (or size), hash, todelete, MTimeUtc, LastSeenUtc
Adjust column names as needed.
aH  
            SELECT
                FullHash,
                sizeBytes = MAX(sizeBytes),
                fileCount = COUNT(*)
            FROM files
            WHERE FullHash IS NOT NULL
            GROUP BY FullHash, sizeBytes
            HAVING COUNT(*) > 1
            ORDER BY (COUNT(*) - 1) * MAX(sizeBytes) DESC
           )groupIdFullHash	sizeBytes	fileCountwastedBytes)r   cursorexecutefetchallr   r"   r#   appendstrr!   close)	conncurrowsoutgroup_idr
size_bytes
file_countwasteds	            r   list_dup_groupsr4      s     :D kkm 
 
	 ||~AQ[[)JQ[[)J 1n
2FJJx=

O''%  MH  



s   B)C Cz//dup-groups/{group_id}r/   c                     [        U 5      nUS:  a
  [        5       e [        5       n UR	                  5       nUR                  SU5        UR                  5       nU(       d
  [        SSS9eUR                  n[        UR                  5      nUR                  SXV5        / nUR                  5        H{  nUR                  [        UR                  5      [        UR                  5      [        UR                  5      UR                  UR                  [!        UR"                  5      S	.5        M}     [        U5      [        U5      UUS
.UR%                  5         $ ! [         a    [        SSS9ef = f! UR%                  5         f = f)z
Since our simple list endpoint invents groupId values, we re-derive by rank.
For production: store groups in a table with a stable groupId.
r     *group_id must be a positive integer stringstatus_codedetailag  
            WITH dup AS (
                SELECT
                    FullHash,
                    sizeBytes,
                    fileCount = COUNT(*),
                    wastedBytes = (COUNT(*) - 1) * MAX(sizeBytes),
                    rn = ROW_NUMBER() OVER (
                        ORDER BY (COUNT(*) - 1) * MAX(sizeBytes) DESC
                    )
                FROM files
                WHERE FullHash IS NOT NULL
                GROUP BY FullHash, sizeBytes
                HAVING COUNT(*) > 1
            )
            SELECT FullHash, sizeBytes
            FROM dup
            WHERE rn = ?
          Group not foundz
            SELECT FileId, path, sizeBytes, MTimeUtc, LastSeenUtc, todelete
            FROM files
            WHERE FullHash = ? AND sizeBytes = ?
            ORDER BY path
        )FileIdpathr"   MTimeUtcLastSeenUtctodelete)r    r!   r"   files)r   
ValueErrorr   r   r%   r&   fetchoner!   r"   r'   r(   r=   r)   r>   r?   r@   r   rA   r*   )	r/   idxr+   r,   gthe_hashr1   rB   r0   s	            r   	get_grouprH   C   s\   b(m7, 
 :D9kkm 	 $ %	( LLNC8IJJ::%
 	 
 	# ALLahh-AFF -JJ }} ,    3xH#	
 	

{  b4`aabz 	

s   E DE1 E.1Fz//dup-groups/{group_id}/markreqc                    UR                   UR                  ;   a
  [        SSS9eUR                  (       d
  [        SSS9e [        U 5      nUS:  a
  [	        5       e [        5       n UR                  5       nUR                  SU5        UR                  5       nU(       d
  [        SS	S9eUR                  n[        UR                  5      nS
R                  S UR                   5       5      nSU S3n	UR                  (       a  SOSXg/UR                  -   n
UR                  X5        UR                  5         SUR                  0UR                  5         $ ! [         a    [        SSS9ef = f! UR                  5         f = f)zU
Sets todelete bit for req.deleteFileIds.
Safety: ensure keepFileId is not included.
r6   z%keepFileId cannot be in deleteFileIdsr8   zNo deleteFileIds suppliedr   r7   a  
            WITH dup AS (
                SELECT
                    FullHash,
                    sizeBytes,
                    rn = ROW_NUMBER() OVER (
                        ORDER BY (COUNT(*) - 1) * MAX(sizeBytes) DESC
                    )
                FROM files
                WHERE FullHash IS NOT NULL
                GROUP BY FullHash, sizeBytes
                HAVING COUNT(*) > 1
            )
            SELECT FullHash, sizeBytes
            FROM dup
            WHERE rn = ?
        r;   r<   ,c              3   &   #    U  H  nS v   M	     g7f)?Nr   ).0_s     r   	<genexpr>mark_group.<locals>.<genexpr>   s     ?->->s   z
            UPDATE files
            SET todelete = ?
            WHERE FullHash = ? AND sizeBytes = ?
              AND FileId IN (z
)
        r   updated)r   r   r   r   rC   r   r%   r&   rD   r!   r"   joinr   commitrowcountr*   )r/   rI   rE   r+   r,   rF   rG   r1   placeholderssqlparamss              r   
mark_grouprY      sn    ~~***4[\\4OPPb(m7, 
 :D+kkm   !	$ LLNC8IJJ::%
 xx?S->->?? +^ ,		 ||!HACDUDUUC 3<<(

_  b4`aab^ 	

s   E (CE/ E,/F)fastapir   r   pydanticr   r   appr
   r   r   getr4   r)   rH   postrY   r   r   r   <module>r_      s    *  i& 	6) 
 ' 'R 	"#G G $GR 
()? ?; ? *?r   