o
    bO                     @   s   d dl Z d dlmZ d dlZd dlmZmZmZ d dl	m
Z
 d dlmZ edejd ZedZd	d
 ZG dd dZG dd deZdS )    N)
namedtuple)BaseDatabaseIntrospection	FieldInfo	TableInfo)Index)_lazy_re_compiler   )pkhas_json_constraintz&^\s*(?:var)?char\s*\(\s*(\d+)\s*\)\s*$c                 C   s   t | }|rt|d S dS )z8 Extract the size number from a "varchar(11)" type name    N)field_size_researchint)namem r   g/var/www/secure340b-portal/env/lib/python3.10/site-packages/django/db/backends/sqlite3/introspection.pyget_field_size   s   
r   c                   @   s   e Zd Zi ddddddddddd	d
dd
dddddddddddddddddddddd d!Zd"d# Zd$S )%FlexibleFieldLookupDictboolZBooleanFieldbooleanZsmallintSmallIntegerFieldzsmallint unsignedZPositiveSmallIntegerFieldZsmallintegerr   IntegerFieldintegerZbigintBigIntegerFieldzinteger unsignedZPositiveIntegerFieldzbigint unsignedZPositiveBigIntegerFielddecimalZDecimalFieldrealZ
FloatFieldtextZ	TextFieldcharZ	CharFieldZvarcharZblobZBinaryFielddateZ	DateFieldZDateTimeFieldZ	TimeField)datetimetimec                 C   s"   |  ddd  }| j| S )N(r
   r   )lowersplitstripbase_data_types_reverse)selfkeyr   r   r   __getitem__4   s   
z#FlexibleFieldLookupDict.__getitem__N)__name__
__module____qualname__r%   r(   r   r   r   r   r      sP    	
r   c                       s   e Zd Ze Z fddZdd Zdd Zddd	Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Z  ZS )DatabaseIntrospectionc                    s.   t  ||}|jr|dv rdS |jrdS |S )N>   r   r   r   Z	AutoFieldZ	JSONField)superget_field_typer   r	   )r&   	data_typedescriptionZ
field_type	__class__r   r   r.   <   s   z$DatabaseIntrospection.get_field_typec                 C   s   | d dd | D S )z>Return a list of table and view names in the current database.z
            SELECT name, type FROM sqlite_master
            WHERE type in ('table', 'view') AND NOT name='sqlite_sequence'
            ORDER BY namec                 S   s"   g | ]}t |d  |d d  qS )r   r
   )r   ).0rowr   r   r   
<listcomp>N   s   " z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)executefetchall)r&   cursorr   r   r   get_table_listF   s   
z$DatabaseIntrospection.get_table_listc                    s   | d| jj|  | }| || t | jjjr<|D ]}|d }d| }| d||g	 }|r;
| q  fdd|D S )zi
        Return a description of the table with the DB-API cursor.description
        interface.
        zPRAGMA table_info(%s)r
   z%%json_valid("%s")%%z
                    SELECT sql
                    FROM sqlite_master
                    WHERE
                        type = 'table' AND
                        name = %s AND
                        sql LIKE %s
                c                    sH   g | ] \}}}}}}t ||d t|d d | | ||dk|v qS )Nr
   )r   r   get)r3   Zcidr   r/   Znotnulldefaultr   
collationsZjson_columnsr   r   r5   g   s    z?DatabaseIntrospection.get_table_description.<locals>.<listcomp>)r6   
connectionops
quote_namer7   _get_column_collationssetfeaturesZcan_introspect_json_fieldfetchoneadd)r&   r8   
table_nameZ
table_infolinecolumnZjson_constraint_sqlr	   r   r<   r   get_table_descriptionP   s&   

z+DatabaseIntrospection.get_table_descriptionr   c                 C   s   |  ||}||dgS )N)tablerH   )get_primary_key_column)r&   r8   rF   Ztable_fieldsZpk_colr   r   r   get_sequenceso   s   z#DatabaseIntrospection.get_sequencesc                 C   st  i }| d|g | \}}|dkr|S ||dd |d }|dD ]}| }|dr4q(td|tj	}|s?q(d	d
 |
 D \}	}
|dr_td|tj	}|d d}n	| d d}| d|	g | d }|d  }|d|d}}||d | }|dD ]#}| }|drq|ddd d}||
kr||	f||<  nqq(|S )z
        Return a dictionary of {field_name: (field_name_other_table, other_table)}
        representing all relationships to the given table.
        USELECT sql, type FROM sqlite_master WHERE tbl_name = %s AND type IN ('table', 'view')viewr!   r
   ),UNIQUEz$references (\S*) ?\(["|]?(.*)["|]?\)c                 S   s   g | ]}| d qS )"r$   r3   sr   r   r   r5      s    z7DatabaseIntrospection.get_relations.<locals>.<listcomp>zFOREIGN KEYzFOREIGN KEY\s*\(([^\)]*)\).*rR   r   z1SELECT sql FROM sqlite_master WHERE tbl_name = %s )r6   rD   indexrindexr#   r$   
startswithrer   Igroupsmatchr7   )r&   r8   rF   Z	relations
create_sql
table_typeresults
field_descr   rJ   rH   
field_nameresultZother_table_resultsliriZ
other_descZ
other_namer   r   r   get_relationss   sJ   


z#DatabaseIntrospection.get_relationsc                 C   s   g }| d|dg | d  }||dd |d }t|dD ]'\}}| }|dr5q't	d	|tj
}|s@q'|td
d | D  q'|S )z
        Return a list of (column_name, referenced_table_name, referenced_column_name)
        for all key columns in given table.
        z?SELECT sql FROM sqlite_master WHERE tbl_name = %s AND type = %srJ   r   r!   r
   rO   rP   rQ   z("(.*)".*references (.*) \(["|](.*)["|]\)c                 s   s    | ]}| d V  qdS )rR   NrS   rT   r   r   r   	<genexpr>       z8DatabaseIntrospection.get_key_columns.<locals>.<genexpr>)r6   rD   r$   rW   rX   	enumerater#   rY   rZ   r   r[   appendtupler\   )r&   r8   rF   Zkey_columnsr`   Zfield_indexra   r   r   r   r   get_key_columns   s   
z%DatabaseIntrospection.get_key_columnsc           	      C   s   | d|g | }|du rtd| |\}}|dkrdS ||dd |d }|dD ]}| }td	|}|rP|d rJ|d   S |d
   S q2dS )z>Return the column name of the primary key for the given table.rM   NzTable %s does not existrN   r!   r
   rO   rP   z1(?:(?:["`\[])(.*)(?:["`\]])|(\w+)).*PRIMARY KEY.*   )	r6   rD   
ValueErrorrW   rX   r#   r$   rZ   r]   )	r&   r8   rF   r4   r^   r_   Z
fields_sqlra   r   r   r   r   rK      s$    z,DatabaseIntrospection.get_primary_key_columnc           
      C   sd   i }| d| jj|  | D ]}|d d \}}}}}	|gdd||	fddd|d| < q|S )NzPRAGMA foreign_key_list(%s)   Fcolumnsprimary_keyuniqueforeign_keycheckrW   zfk_%d)r6   r>   r?   r@   r7   )
r&   r8   rF   constraintsr4   Zid__rJ   Zfrom_tor   r   r   _get_foreign_key_constraints   s   z2DatabaseIntrospection._get_foreign_key_constraintsc                 C   s  d }d }d }d }d}g }d}	g }
d}|D ]!}| tjjdr$|d7 }n"| tjjdr8|d8 }|dk r7 n n|dkrF| tjjdrF n|d u rU| tjjd}|rUq|r|d u rz|jtjjtjjfv rj|j}n|jtjjj	j
krz|jdd }| tjjd	rd
}|}n_|r||kr|rd}q|jtjjtjjfv r||j nB|jtjjj	j
kr||jdd  n.|d u r|jtjjtjjfv r|j}n|jtjjj	j
kr|jdd }| tjjd	r|g}| tjjdrd
}	|}q|	r6||kr|
rd}	q|jtjjtjjfv r|j|v r|
|j q|jtjjj	j
kr6|jdd |v r6|
|jdd  q|rCd
|dd dddnd }|
rQd
|
ddd ddnd }||||fS )NFr   r!   r
   rO   rP   Z
CONSTRAINTrQ   TZCHECK)rs   rq   rr   rt   ru   rW   )ru   rq   rr   rs   rt   rW   )r]   sqlparsetokensPunctuationKeywordttypeNamevalueLiteralStringSymbolrj   )r&   r|   rq   tokenZis_constraint_definitionrb   constraint_namers   Zunique_columnsru   Zcheck_columnsZbraces_deepZunique_braces_deepZcheck_braces_deepZunique_constraintZcheck_constraintr   r   r   &_parse_column_or_constraint_definition   s   

z<DatabaseIntrospection._parse_column_or_constraint_definitionc                 C   s   t |d }i }d}dd | D }|D ]}|t jjdr" nq	 | ||\}}	}
}|	rA|r7|	||< n
|d7 }|	|d| < |
rT|rJ|
||< n
|d7 }|
|d| < |t jjdr_	 |S q$)	Nr   c                 s   s    | ]}|j s|V  qd S N)Zis_whitespace)r3   r   r   r   r   rg   Q  rh   zADatabaseIntrospection._parse_table_constraints.<locals>.<genexpr>r!   Tr
   z__unnamed_constraint_%s__rO   )r{   parseflattenr]   r|   r}   r   )r&   sqlrq   Z	statementrv   Zunnamed_constrains_indexr|   r   r   rs   ru   Z	end_tokenr   r   r   _parse_table_constraintsK  s0   

z.DatabaseIntrospection._parse_table_constraintsc              	   C   s  i }z| d| jj|f  d }W n	 ty   Y nw dd | ||D }|| || | d| jj|  |	 D ]m}|dd \}}}	| d| jj|  | p_d	\}
|
sdqC| d
| jj|  |	 D ]\}}}||vrg dt
|	dddd||< || d | qt|| d rtj|| d< | |
}|dur||| d< qC| ||}|r|gdddddd|d< || || |S )zu
        Retrieve any constraints or keys (unique, pk, fk, check, index) across
        one or more columns.
        z<SELECT sql FROM sqlite_master WHERE type='table' and name=%sr   c                 S   s   h | ]}|j qS r   )r   r3   infor   r   r   	<setcomp>z  s    z8DatabaseIntrospection.get_constraints.<locals>.<setcomp>zPRAGMA index_list(%s)N   z<SELECT sql FROM sqlite_master WHERE type='index' AND name=%sr   zPRAGMA index_info(%s)FTrp   rq   rW   typeordersZ__primary__)r6   r>   r?   r@   rD   	TypeErrorrI   updater   r7   r   rj   r   suffix_get_index_columns_ordersrK   ry   )r&   r8   rF   rv   Ztable_schemarq   r4   numberrW   rs   r   Z
index_rankZcolumn_rankrH   r   Z	pk_columnr   r   r   get_constraintsi  sj   


z%DatabaseIntrospection.get_constraintsc                 C   sP   t |d }|D ]}t|t jjr%t|dd}dd |D   S q	d S )Nr   (), c                 S   s   g | ]}| d rd ndqS )ZDESCASC)endswithr   r   r   r   r5     s    zCDatabaseIntrospection._get_index_columns_orders.<locals>.<listcomp>)r{   r   
isinstancer   ZParenthesisstrr$   r#   )r&   r   r|   r   rq   r   r   r   r     s   z/DatabaseIntrospection._get_index_columns_ordersc                 C   s   | d|g }|si S |d }tt|d d dd}i }|D ],}|dd   }|d d}	t|D ]\}
}|dkrK||
d  } nq;d }|||	< q&|S )	Nzn
            SELECT sql
            FROM sqlite_master
            WHERE type = 'table' AND name = %s
        r   rz   r   r   r
   rR   ZCOLLATE)r6   rD   r   r{   r   r$   r#   ri   )r&   r8   rF   r4   r   rq   r=   rH   r|   Zcolumn_namerW   r   Z	collationr   r   r   rA     s*   "
z,DatabaseIntrospection._get_column_collations)r   )r)   r*   r+   r   Zdata_types_reverser.   r9   rI   rL   rf   rl   rK   ry   r   r   r   r   rA   __classcell__r   r   r1   r   r,   9   s    


:ZOr,   )rZ   collectionsr   r{   Z%django.db.backends.base.introspectionr   r   ZBaseFieldInfor   Zdjango.db.modelsr   Zdjango.utils.regex_helperr   _fieldsr   r   r   r,   r   r   r   r   <module>   s    	