o
    
=h
F                     @   s   d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dl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 )    )
namedtupleN)DatabaseError)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 )z6Extract the size number from a "varchar(11)" type name   N)field_size_researchint)namem r   `/var/www/ecommerce/venv/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boolBooleanFieldbooleansmallintSmallIntegerFieldzsmallint unsignedPositiveSmallIntegerFieldsmallintegerr   IntegerFieldintegerbigintBigIntegerFieldzinteger unsignedPositiveIntegerFieldzbigint unsignedPositiveBigIntegerFielddecimalDecimalFieldreal
FloatFieldtext	TextFieldchar	CharFieldvarcharblobBinaryFielddate	DateFieldDateTimeField	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__6   s   
z#FlexibleFieldLookupDict.__getitem__N)__name__
__module____qualname__r8   r;   r   r   r   r   r      sP    	
r   c                       st   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  ZS )DatabaseIntrospectionc                    s.   t  ||}|jr|dv rdS |jrdS |S )N>   r   r    r   	AutoField	JSONField)superget_field_typer
   r   )r9   	data_typedescription
field_type	__class__r   r   rC   >   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>V   s   " z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)executefetchall)r9   cursorr   r   r   get_table_listL   s   z$DatabaseIntrospection.get_table_listc                    s   | d| jj|  | }|std| d| || t | jjj	rF|D ]}|d }d| }| d||g
 }|rE| q* fdd|D }d	d t|D }	t|	dkrn|	D ]}
||
 jd
d||
< qa|S )zi
        Return a description of the table with the DB-API cursor.description
        interface.
        zPRAGMA table_xinfo(%s)zTable z does not exist (empty pragma).r   z%%json_valid("%s")%%z
                    SELECT sql
                    FROM sqlite_master
                    WHERE
                        type = 'table' AND
                        name = %s AND
                        sql LIKE %s
                c                    sR   g | ]%\}}}}}}}|d v rt ||t|ddd| | |t||v qS ))r         N)r   r   getr   )rI   cidr   rD   notnulldefaultr
   hidden
collationsjson_columnsr   r   rK   v   s&    z?DatabaseIntrospection.get_table_description.<locals>.<listcomp>c                 S   s   g | ]	\}}|j r|qS r   r
   )rI   index
field_infor   r   r   rK      s
    
FrZ   )rL   
connectionops
quote_namerM   r   _get_column_collationssetfeaturescan_introspect_json_fieldfetchoneadd	enumeratelen_replace)r9   rN   
table_name
table_infolinecolumnjson_constraint_sqlr   table_descriptionprimary_keyr[   r   rW   r   get_table_descriptionX   s>   


z+DatabaseIntrospection.get_table_descriptionr   c                 C   s   |  ||}||dgS )N)tablerl   )get_primary_key_column)r9   rN   ri   table_fieldspk_colr   r   r   get_sequences   s   z#DatabaseIntrospection.get_sequencesc                 C   *   | d| jj|  dd | D S )z
        Return a dictionary of {column_name: (ref_column_name, ref_table_name)}
        representing all foreign keys in the given table.
        zPRAGMA foreign_key_list(%s)c                 S   s"   i | ]^}}}}}}|||fqS r   r   )rI   _ref_table_namecolumn_nameref_column_namer   r   r   
<dictcomp>   s    z7DatabaseIntrospection.get_relations.<locals>.<dictcomp>rL   r]   r^   r_   rM   r9   rN   ri   r   r   r   get_relations   s   	z#DatabaseIntrospection.get_relationsc                 C   rv   )NzPRAGMA table_info(%s)c                 S   s   g | ]^}}}}|r|qS r   r   )rI   rw   r   r
   r   r   r   rK          zADatabaseIntrospection.get_primary_key_columns.<locals>.<listcomp>r|   r}   r   r   r   get_primary_key_columns   s   z-DatabaseIntrospection.get_primary_key_columnsc                 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   r4   r   ),
CONSTRAINTUNIQUETCHECK)uniquecolumnsro   foreign_keycheckr[   )r   r   ro   r   r   r[   )matchsqlparsetokensPunctuationKeywordttypeNamevalueLiteralStringSymbolappend)r9   r   r   tokenis_constraint_definition
field_nameconstraint_namer   unique_columnsr   check_columnsbraces_deepunique_braces_deepcheck_braces_deepunique_constraint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)is_whitespace)rI   r   r   r   r   	<genexpr>  s    zADatabaseIntrospection._parse_table_constraints.<locals>.<genexpr>r4   Tr   z__unnamed_constraint_%s__r   )r   parseflattenr   r   r   r   )r9   sqlr   	statementconstraintsunnamed_constrains_indexr   r   r   r   r   	end_tokenr   r   r   _parse_table_constraints  sF   


z.DatabaseIntrospection._parse_table_constraintsc              	   C   s  i }z| d|g d }W n	 ty   Y nw dd | ||D }|| || | d| jj|  |	 D ]h}|dd \}}}	| d|g | pTd	\}
|
sYq=| d
| jj|  |	 D ]\}}}||vrg dt
|	dddd||< || d | qi|| d rtj|| d< | |
}|dur||| d< q=| ||}|r|dddddd|d< t| || }|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   rI   infor   r   r   	<setcomp>O  s    z8DatabaseIntrospection.get_constraints.<locals>.<setcomp>zPRAGMA index_list(%s)NrQ   z<SELECT sql FROM sqlite_master WHERE type='index' AND name=%sr   zPRAGMA index_info(%s)FTr   ro   r   r   r   r[   r   r[   typeorders__primary__c              
   S   s8   i | ]\}\}\}}d | |gdd||fdddqS )fk_Fr   r   )rI   r[   ry   rz   rx   r   r   r   r{     s    	z9DatabaseIntrospection.get_constraints.<locals>.<dictcomp>)rL   rd   	TypeErrorrp   updater   r]   r^   r_   rM   r   r   r   suffix_get_index_columns_ordersr   rf   r~   items)r9   rN   ri   r   table_schemar   rJ   numberr[   r   r   
index_rankcolumn_rankrl   r   
pk_columns	relationsr   r   r   get_constraints?  s|   



	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 )DESCASC)endswithr   r   r   r   rK     r   zCDatabaseIntrospection._get_index_columns_orders.<locals>.<listcomp>)r   r   
isinstancer   Parenthesisstrr7   r6   )r9   r   r   r   r   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   r   r   r   r   "COLLATE)rL   rd   r   r   r   r7   r6   rf   )r9   rN   ri   rJ   r   r   rX   rl   r   ry   r[   r   	collationr   r   r   r`     s,   "
z,DatabaseIntrospection._get_column_collations)r   )r<   r=   r>   r   data_types_reverserC   rO   rp   ru   r~   r   r   r   r   r   r`   __classcell__r   r   rG   r   r?   ;   s    
>d'ar?   )collectionsr   r   	django.dbr   %django.db.backends.base.introspectionr   r   BaseFieldInfor   django.db.modelsr   django.utils.regex_helperr	   _fieldsr   r   r   r?   r   r   r   r   <module>   s    
	