
    Xj"                         d dl mZ d dlmZ d dlmZ  ee          Z G d d          Zdede	de
fd	Zdede	de
fd
ZdS )    )text)Session)
get_loggerc            
          e Zd Zg dZg dZededefd            Zede	dede
fd            Zede	dede
fd	            Zedde	dede
de
fd            Zedde	dedz  fd            Zed             Zede	dede
fd            Zede	dedede
fd            Zede	dee         fd            Zede	dededz  fd            ZdS )TenantSchemaManager)tenantsusersalembic_versionrolesmenus
user_roles
role_menusrole_permissionscasbin_rule
audit_logspermission_audit_logsmodel_providersmodels)agentschat_messagesknowledge_basesknowledge_categoriesknowledge_documentsknowledge_tagsdocument_tagsdocument_vectorsdocument_versionsknowledge_qaknowledge_metadata_fieldsdocument_metadata_valuesdata_modelsdata_model_fieldstag_categoriestag_auto_rulestax_documents	tenant_idreturnc                     d|  S )Ntenant_ )r&   s    </lsinfo/ai/hellotax_ai/base_platform/app/db/tenant_schema.pyget_schema_namez#TenantSchemaManager.get_schema_name-   s    $$$$    dbschema_namec                     	 |                      t          d          d|i          }|                                d uS # t          $ r(}t                              d|            Y d }~dS d }~ww xY w)NzOSELECT schema_name FROM information_schema.schemata WHERE schema_name = :schemaschemaz!Error checking schema existence: F)executer   fetchone	Exceptionloggererror)r.   r/   resultes       r+   schema_existsz!TenantSchemaManager.schema_exists1   s    
	ZZe  ;'	 F ??$$D00 	 	 	LL@Q@@AAA55555	s   := 
A/A**A/c                    t                               |          }	 t                               | |          r t                              d| d           dS |                     t          d| d                     |                                  t                              d|            dS # t          $ r?}t          	                    d| d|            | 
                                 Y d }~d	S d }~ww xY w)
NSchema z already existsTzCREATE SCHEMA IF NOT EXISTS ""zCreated schema: zError creating schema : F)r   r,   r9   r5   infor2   r   commitr4   r6   rollbackr.   r&   r/   r8   s       r+   create_schemaz!TenantSchemaManager.create_schema?   s   )99)DD	"00[AA BkBBBCCCtJJtJKJJJKKLLLIIKKKKK8;889994 	 	 	LLD+DDDDEEEKKMMM55555	s   9B0 AB0 0
C9:4C44C9Tcascadec                    t                               |          }	 t                               | |          s t                              d| d           dS |rdnd}|                     t          d| d|                      |                                  t                              d|            dS # t          $ r?}t          
                    d	| d
|            |                                  Y d }~dS d }~ww xY w)Nr;   z does not existTCASCADERESTRICTzDROP SCHEMA IF EXISTS "z" zDeleted schema: zError deleting schema r=   F)r   r,   r9   r5   warningr2   r   r?   r>   r4   r6   r@   )r.   r&   rC   r/   cascade_clauser8   s         r+   delete_schemaz!TenantSchemaManager.delete_schemaO   s   )99)DD	&44REE EEEEFFFt*1AYYzNJJtUkUU^UUVVWWWIIKKKKK8;889994 	 	 	LLD+DDDDEEEKKMMM55555	s   9B8 AB8 8
D4C<<DNc                    	 |r`t                               |          }|                     t          d| d                     t                              d| d           d S |                     t          d                     t                              d           d S # t          $ r#}t                              d|             d }~ww xY w)NzSET search_path TO "z	", publiczSet search_path to: z, publiczSET search_path TO publiczSet search_path to: publiczError setting search_path: )r   r,   r2   r   r5   debugr4   r6   rA   s       r+   set_search_pathz#TenantSchemaManager.set_search_path`   s    
	 ;1AA)LL

4 M{ M M MNNOOOIKIIIJJJJJ

4 ;<<===9::::: 	 	 	LL:q::;;;	s   A B" $<B" "
C,C

Cc                  ,   ddl m}  d | j        j                                        D             }d |D             }t          t          t          j                  |z
            }|r.t          
                    dd                    |                     |S )Nr   Basec                 F    g | ]}|j         t          j        v |j        |S N)namer   TENANT_TABLESr1   .0tables     r+   
<listcomp>zDTenantSchemaManager.get_tenant_table_definitions.<locals>.<listcomp>r   s:     
 
 
z0>>>5<CW CWCWCWr-   c                     h | ]	}|j         
S r*   )rR   rT   s     r+   	<setcomp>zCTenantSchemaManager.get_tenant_table_definitions.<locals>.<setcomp>w   s    !H!H!H%*!H!H!Hr-   zISkipped tenant table definitions not registered as schema-less tables: %sz, )app.db.baserO   metadatatablesvaluessortedsetr   rS   r5   rK   join)rO   tenant_tablesregistered_table_namesmissing_table_namess       r+   get_tenant_table_definitionsz0TenantSchemaManager.get_tenant_table_definitionsn   s    $$$$$$
 
-4466
 
 

 "I!H-!H!H!H$#1225KK
 
  	LL[		-..   r-   c                 V   ddl m} t                              |          }t                                          }|st
                              d           dS 	 |                                                     d |i          }|j	        
                    ||d           |                                  t
                              dt          |          |           dS # t          $ r?}t
                              d	| d
|            |                                  Y d }~dS d }~ww xY w)Nr   rN   z9No tenant table definitions found for schema provisioningF)schema_translate_mapT)bindr\   
checkfirstz+Ensured %s tenant tables exist in schema %sz'Error creating tenant tables in schema r=   )rZ   rO   r   r,   rd   r5   r6   
connectionexecution_optionsr[   
create_allr?   r>   lenr4   r@   )r.   r&   rO   r/   ra   tenant_bindr8   s          r+   create_tenant_tablesz(TenantSchemaManager.create_tenant_tables   s>   $$$$$$)99)DD+HHJJ 	LLTUUU5	--//;;&*K%8 <  K M$$+mX\$]]]IIKKKKK=s=?Q?QS^   4 	 	 	LLU;UURSUUVVVKKMMM55555	s   BC 
D()4D##D(source_tenant_idtarget_tenant_idc                 n   t                               |          }t                               |          }	 t                               | |          sdS |                     t	          d          d|i          }d |D             }|D ]1}|                     t	          d| d| d| d| d	                     2|                                  t                              d	| d
|            dS # t          $ r<}t          	                    d|            | 
                                 Y d }~dS d }~ww xY w)NFz
                    SELECT table_name
                    FROM information_schema.tables
                    WHERE table_schema = :schema
                    AND table_type = 'BASE TABLE'
                r1   c                     g | ]
}|d          S )r   r*   )rU   rows     r+   rW   z>TenantSchemaManager.clone_schema_structure.<locals>.<listcomp>   s    ///c!f///r-   z#
                    CREATE TABLE "z"."z"
                    (LIKE "z!" INCLUDING ALL)
                zCloned schema structure from z to Tz Error cloning schema structure: )r   r,   rB   r2   r   r?   r5   r>   r4   r6   r@   )	r.   ro   rp   source_schematarget_schemar7   r\   rV   r8   s	            r+   clone_schema_structurez*TenantSchemaManager.clone_schema_structure   s   +;;<LMM+;;<LMM	&44R9IJJ uZZ i  =)	 F 0////F  

 r}  r  rQV  r  r  wD  r  r  IN  r  r  r    
 IIKKKKKZZZ=ZZ[[[4 	 	 	LL?A??@@@KKMMM55555	s   C. BC. .
D481D//D4c                 L   	 |                      t          d                    }g }|D ]E}|d         }t          |                    dd                    }|                    ||d           F|S # t
          $ r)}t                              d|            g cY d }~S d }~ww xY w)Nz
                    SELECT schema_name
                    FROM information_schema.schemata
                    WHERE schema_name LIKE 'tenant_%'
                    ORDER BY schema_name
                r   r)    )r&   r/   zError listing tenant schemas: )r2   r   intreplaceappendr4   r5   r6   )r.   r7   schemasrs   r/   r&   r8   s          r+   list_tenant_schemasz'TenantSchemaManager.list_tenant_schemas   s    	ZZ h  F
 G U U!!f 3 3Ir B BCC	Y{SSTTTTN 	 	 	LL=!==>>>IIIIII	s   A-A0 0
B#:BB#B#c                     t                               |          }	 |                     t          d          d|i          }|                                }|r|ndS # t
          $ r(}t                              d|            Y d }~d S d }~ww xY w)Nz
                    SELECT SUM(pg_total_relation_size(quote_ident(schemaname) || '.' || quote_ident(tablename)))
                    FROM pg_tables
                    WHERE schemaname = :schema
                r1   r   zError getting schema size: )r   r,   r2   r   scalarr4   r5   r6   )r.   r&   r/   r7   sizer8   s         r+   get_schema_sizez#TenantSchemaManager.get_schema_size   s    )99)DD	ZZ o  ;'	 F ==??D&44Q& 	 	 	LL:q::;;;44444	s   >A 
B%BB)TrQ   )__name__
__module____qualname__PUBLIC_TABLESrS   staticmethodry   strr,   r   boolr9   rB   rI   rL   rd   rn   rv   listdictr}   r   r*   r-   r+   r   r   	   s?         M  M( %3 %3 % % % \% '      \ ' c d    \  ' c D D    \   G d
    \   \&  S T    \. 7 c UX ]a    \6  DJ    \" G  d
    \  r-   r   r.   r&   r'   c                 H   	 t                               | |          sdS t                               | |          sdS t                              d|            dS # t
          $ r<}t                              d|            |                                  Y d }~dS d }~ww xY w)NFz(Provisioned tenant schema for tenant_id=Tz"Error provisioning tenant schema: )r   rB   rn   r5   r>   r4   r6   r@   )r.   r&   r8   s      r+   provision_tenant_schemar      s    
"00Y?? 	5"77IFF 	5JyJJKKKt   =!==>>>
uuuuus!   A A A 
B!%1BB!c                 <    t                               | |d          S )NT)rC   )r   rI   )r.   r&   s     r+   deprovision_tenant_schemar      s    ,,RD,IIIr-   N)
sqlalchemyr   sqlalchemy.ormr   common_loggingr   r   r5   r   ry   r   r   r   r*   r-   r+   <module>r      s          " " " " " " % % % % % %	H		M M M M M M M M` C D    J' Jc Jd J J J J J Jr-   