o aO@sddlZddlmZddlZddlmZmZmZddl m Z ddl m Z edej dZe dZd d ZGd d d ZGd ddeZdS)N) namedtuple)BaseDatabaseIntrospection FieldInfo TableInfo)Index)_lazy_re_compiler)pkhas_json_constraintz&^\s*(?:var)?char\s*\(\s*(\d+)\s*\)\s*$cCst|}|r t|dSdS)z8 Extract the size number from a "varchar(11)" type name N) field_size_researchint)namemrJ/usr/lib/python3/dist-packages/django/db/backends/sqlite3/introspection.pyget_field_sizes rc@seZdZiddddddddddd d d d d d dddddddddddddddddddd d!Zd"d#Zd$S)%FlexibleFieldLookupDictbool BooleanFieldbooleansmallintSmallIntegerFieldzsmallint unsignedPositiveSmallIntegerField smallintegerr IntegerFieldintegerbigintBigIntegerFieldzinteger unsignedPositiveIntegerFieldzbigint unsignedPositiveBigIntegerFielddecimal DecimalFieldreal FloatFieldtext TextFieldchar CharFieldvarcharblob BinaryFielddate DateField DateTimeField TimeField)datetimetimecCs"|ddd}|j|S)N(r r)lowersplitstripbase_data_types_reverse)selfkeyrrr __getitem__4s z#FlexibleFieldLookupDict.__getitem__N)__name__ __module__ __qualname__r6r9rrrrrsP      rcseZdZeZfddZddZddZddd Zd d Z d d Z ddZ ddZ ddZ ddZddZddZddZZS)DatabaseIntrospectioncs.t||}|jr|dvrdS|jrdS|S)N>rrr AutoField JSONField)superget_field_typerr )r7 data_type description field_type __class__rrrA<s z$DatabaseIntrospection.get_field_typecCs|ddd|DS)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 namecSs"g|] }t|d|ddqS)rr )r).0rowrrr Ns"z8DatabaseIntrospection.get_table_list..)executefetchall)r7cursorrrrget_table_listFs z$DatabaseIntrospection.get_table_listcs|d|jj||}|||t|jjjr<|D]}|d}d|}|d||g }|r; |q fdd|DS)zi Return a description of the table with the DB-API cursor.description interface. zPRAGMA table_info(%s)r z%%json_valid("%s")%%z SELECT sql FROM sqlite_master WHERE type = 'table' AND name = %s AND sql LIKE %s csHg|] \}}}}}}t||dt|dd| |||dk|v qS)Nr )rrget)rGcidrrBnotnulldefaultr collations json_columnsrrrIgsz?DatabaseIntrospection.get_table_description..) rJ connectionops quote_namerK_get_column_collationssetfeaturescan_introspect_json_fieldfetchoneadd)r7rL table_name table_infolinecolumnjson_constraint_sqlr rrRrget_table_descriptionPs&    z+DatabaseIntrospection.get_table_descriptionrcCs|||}||dgS)N)tablera)get_primary_key_column)r7rLr^ table_fieldspk_colrrr get_sequencesos  z#DatabaseIntrospection.get_sequencescCsti}|d|g|\}}|dkr|S||dd|d}|dD]}|}|dr4q(td|tj }|s?q(d d | D\} } |d r_t d |tj }|dd } n |dd } |d| g| d} | d} | d| d}}| |d|} | dD]#}|}|drq|dddd }|| kr|| f|| <nqq(|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')viewr2r ),UNIQUEz$references (\S*) ?\(["|]?(.*)["|]?\)cSsg|]}|dqS)"r5rGsrrrrIsz7DatabaseIntrospection.get_relations..z FOREIGN KEYzFOREIGN KEY\s*\(([^\)]*)\).*rnrz1SELECT sql FROM sqlite_master WHERE tbl_name = %s ) rJr\indexrindexr4r5 startswithrer IgroupsmatchrK)r7rLr^ relations create_sql table_typeresults field_descrrdra field_nameresultother_table_resultsliri other_desc other_namerrr get_relationsssJ       z#DatabaseIntrospection.get_relationscCsg}|d|dg|d}||dd|d}t|dD]'\}}|}|dr5q't d |tj }|s@q'| t d d | Dq'|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 = %srdrr2r rkrlrmz("(.*)".*references (.*) \(["|](.*)["|]\)css|]}|dVqdS)rnNrorprrr z8DatabaseIntrospection.get_key_columns..)rJr\r5rsrt enumerater4rurvr rwappendtuplerx)r7rLr^ key_columnsr} field_indexr~rrrrget_key_columnss z%DatabaseIntrospection.get_key_columnsc Cs|d|g|}|durtd||\}}|dkrdS||dd|d}|dD]}|}td |}|rP|drJ|dS|d Sq2dS) z>Return the column name of the primary key for the given table.riNzTable %s does not existrjr2r rkrlz1(?:(?:["`\[])(.*)(?:["`\]])|(\w+)).*PRIMARY KEY.*) rJr\ ValueErrorrsrtr4r5rvry) r7rLr^rHr{r| fields_sqlr~rrrrres$   z,DatabaseIntrospection.get_primary_key_columnc Csdi}|d|jj||D]}|dd\}}}}} |gdd|| fddd|d|<q|S)NzPRAGMA foreign_key_list(%s)Fcolumns primary_keyunique foreign_keycheckrszfk_%d)rJrUrVrWrK) r7rLr^ constraintsrHid__rdfrom_torrr_get_foreign_key_constraintss z2DatabaseIntrospection._get_foreign_key_constraintscCsd}d}d}d}d}g}d} g} d} |D]!}|tjjdr$| d7} n"|tjjdr8| d8} | dkr7nn| dkrF|tjjdrFn|durU|tjjd}|rUq|r|durz|jtjjtjjfvrj|j}n|jtjjj j krz|jdd}|tjjd rd }| } n_|r| | kr|rd}q|jtjjtjjfvr| |jnB|jtjjj j kr| |jddn.|dur|jtjjtjjfvr|j}n|jtjjj j kr|jdd}|tjjd r|g}|tjjd rd } | } q| r6| | kr| rd} q|jtjjtjjfvr|j|vr| |jq|jtjjj j kr6|jdd|vr6| |jddq|rCd |ddddd nd}| rQd | ddddd nd}||||fS)NFrr2r rkrl CONSTRAINTrmTCHECK)rrrrrrs)rrrrrrs) rysqlparsetokens PunctuationKeywordttypeNamevalueLiteralStringSymbolr)r7rrtokenis_constraint_definitionrconstraint_namerunique_columnsr check_columns braces_deepunique_braces_deepcheck_braces_deepunique_constraintcheck_constraintrrr&_parse_column_or_constraint_definitions     z.r2Tr z__unnamed_constraint_%s__rk)rparseflattenryrrr) r7sqlr statementrunnamed_constrains_indexrrrrr end_tokenrrr_parse_table_constraintsKs0    z.DatabaseIntrospection._parse_table_constraintsc Csi}z|d|jj|fd}Wn tyYnwdd|||D}|||||d|jj|| D]m}|dd\}}} |d|jj||p_d \} | sdqC|d |jj|| D]\} } } ||vrgd t | dd d d ||<||d | qt||drt j ||d<|| }|dur|||d<qC|||}|r|gd d dd d d |d<|||||S)zu Retrieve any constraints or keys (unique, pk, fk, check, index) across one or more columns. z.)rr isinstancer Parenthesisstrr5r4)r7rrrrrrrrsz/DatabaseIntrospection._get_index_columns_ordersc Cs|d|g}|s iS|d}tt|dddd}i}|D],}|dd}|dd} t|D]\} } | dkrK|| d} nq;d} | || <q&|S) Nzn SELECT sql FROM sqlite_master WHERE type = 'table' AND name = %s rrrrr rnCOLLATE)rJr\rrrr5r4r) r7rLr^rHrrrSrar column_namersr collationrrrrXs*"  z,DatabaseIntrospection._get_column_collations)r)r:r;r<rdata_types_reverserArMrcrhrrrerrrrrrX __classcell__rrrErr=9s   :ZOr=)rv collectionsrr%django.db.backends.base.introspectionrr BaseFieldInfordjango.db.modelsrdjango.utils.regex_helperr_fieldsr rrr=rrrrs