
    h                        d Z ddlmZ ddlZddlZddlZddlT 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 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 n# e$ r dZY nw xY w G d de          Zd Zd Z G d de          Z G d de          Z G d de          Z G d d edd                    Z G d d e          Z G d! d"e          Zd# ZdS )$ah  
Lightweight schema migrations.

Example Usage
-------------

Instantiate a migrator:

    # Postgres example:
    my_db = PostgresqlDatabase(...)
    migrator = PostgresqlMigrator(my_db)

    # SQLite example:
    my_db = SqliteDatabase('my_database.db')
    migrator = SqliteMigrator(my_db)

Then you will use the `migrate` function to run various `Operation`s which
are generated by the migrator:

    migrate(
        migrator.add_column('some_table', 'column_name', CharField(default=''))
    )

Migrations are not run inside a transaction, so if you wish the migration to
run in a transaction you will need to wrap the call to `migrate` in a
transaction block, e.g.:

    with my_db.transaction():
        migrate(...)

Supported Operations
--------------------

Add new field(s) to an existing model:

    # Create your field instances. For non-null fields you must specify a
    # default value.
    pubdate_field = DateTimeField(null=True)
    comment_field = TextField(default='')

    # Run the migration, specifying the database table, field name and field.
    migrate(
        migrator.add_column('comment_tbl', 'pub_date', pubdate_field),
        migrator.add_column('comment_tbl', 'comment', comment_field),
    )

Renaming a field:

    # Specify the table, original name of the column, and its new name.
    migrate(
        migrator.rename_column('story', 'pub_date', 'publish_date'),
        migrator.rename_column('story', 'mod_date', 'modified_date'),
    )

Dropping a field:

    migrate(
        migrator.drop_column('story', 'some_old_field'),
    )

Making a field nullable or not nullable:

    # Note that when making a field not null that field must not have any
    # NULL values present.
    migrate(
        # Make `pub_date` allow NULL values.
        migrator.drop_not_null('story', 'pub_date'),

        # Prevent `modified_date` from containing NULL values.
        migrator.add_not_null('story', 'modified_date'),
    )

Renaming a table:

    migrate(
        migrator.rename_table('story', 'stories_tbl'),
    )

Adding an index:

    # Specify the table, column names, and whether the index should be
    # UNIQUE or not.
    migrate(
        # Create an index on the `pub_date` column.
        migrator.add_index('story', ('pub_date',), False),

        # Create a multi-column index on the `pub_date` and `status` fields.
        migrator.add_index('story', ('pub_date', 'status'), False),

        # Create a unique index on the category and title fields.
        migrator.add_index('story', ('category_id', 'title'), True),
    )

Dropping an index:

    # Specify the index name.
    migrate(migrator.drop_index('story', 'story_pub_date_status'))

Adding or dropping table constraints:

.. code-block:: python

    # Add a CHECK() constraint to enforce the price cannot be negative.
    migrate(migrator.add_constraint(
        'products',
        'price_check',
        Check('price >= 0')))

    # Remove the price check constraint.
    migrate(migrator.drop_constraint('products', 'price_check'))

    # Add a UNIQUE constraint on the first and last names.
    migrate(migrator.add_unique('person', 'first_name', 'last_name'))
    )
namedtupleN)*)CommaNodeList)EnclosedNodeListEntity)
Expression)Node)NodeList)OP)	callable_)sort_models)sqlite3)_truncate_constraint_name)CockroachDatabasec                   *    e Zd ZdZd Zd Zd Zd ZdS )	Operationz/Encapsulate a single schema altering operation.c                 >    || _         || _        || _        || _        d S N)migratormethodargskwargs)selfr   r   r   r   s        O/var/www/html/marketdash/venv/lib/python3.11/site-packages/playhouse/migrate.py__init__zOperation.__init__   s"     	    c                 D    | j         j                            |           d S r   )r   databaseexecute)r   nodes     r   r    zOperation.execute   s!    &&t,,,,,r   c                 2   t          |t          t          f          r|                     |           d S t          |t                    r|                                 d S t          |t          t          f          r|D ]}|                     |           d S d S r   )	
isinstancer
   Contextr    r   runlisttuple_handle_result)r   resultitems      r   r(   zOperation._handle_result   s    ftWo.. 	*LL     	** 	*JJLLLLLu.. 	* * *##D))))	* 	** *r   c                     | j                                         }d|d<   t          | j        | j                  }|                      || j        i |           d S )NTwith_context)r   copygetattrr   r   r(   r   )r   r   r   s      r   r%   zOperation.run   s]    !!##!%~44FFDI88899999r   N)__name__
__module____qualname____doc__r   r    r(   r%    r   r   r   r      sV        99  - - -* * *: : : : :r   r   c                 F     t          j                    fd            }|S )Nc                 x    |                     dd          }|r | g|R i |S t          | j        g|R i |S )Nr,   F)popr   r/   )r   r   r   r,   fns       r   innerzoperation.<locals>.inner   s`    zz.%88 	-2d,T,,,V,,,r{<T<<<V<<<r   )	functoolswraps)r7   r8   s   ` r   	operationr;      s8    _R= = = = =
 Lr   c                    d                     | ft          |          z             }t          |          dk    rPt          j        |                    d                                                    }|d d         d|d d         }|S )N_@   zutf-88      )joinr'   lenhashlibmd5encode	hexdigest)
table_namecolumns
index_name
index_hashs       r   make_index_namerK      s    :-%..899J
:[!2!27!;!;<<FFHH
 *3B3BQB@
r   c                      e Zd ZdZdZd Zd Zed             Ze	d             Z
d Zd Ze	d             Ze	d	             Ze	d
             Ze	d             Zd Ze		 	 dd            Ze	d             Ze	d             Ze	dd            Ze	d             Ze	d             Ze	d             Ze	d             Ze	d             Ze	dd            Ze	d             Ze	dd            Ze	d             ZdS ) SchemaMigratorFc                     || _         d S r   )r   )r   r   s     r   r   zSchemaMigrator.__init__   s     r   c                 4    | j                                         S r   )r   get_sql_contextr   s    r   make_contextzSchemaMigrator.make_context   s    },,...r   c                 T   t           r$t          |t                     rt          |          S t          |t                    rt	          |          S t          |t
                    rt          |          S t          |t                    rt          |          S t          d|z            )NzUnsupported database: %s)
r   r#   CockroachDBMigratorPostgresqlDatabasePostgresqlMigratorMySQLDatabaseMySQLMigratorSqliteDatabaseSqliteMigrator
ValueError)clsr   s     r   from_databasezSchemaMigrator.from_database   s     	,H6G!H!H 	,&x000"455 	,%h///-00 	, ***.11 	,!(+++3h>???r   c           	         |j         }t          |          r
 |            }|                                                     d                              t          |                                        d                              t          t          |          t          j        |	                    |          d                    S )NzUPDATE z SET T)flat)
defaultr   rR   literalsqlr   r	   r   EQdb_value)r   tablecolumn_namefieldr`   s        r   apply_defaultzSchemaMigrator.apply_default   s    -W 	 giiG!!####VE]]##!!Z;''ENN7++	      		!r   c                 l    |                     d                              t          |                    S )NALTER TABLE )ra   rb   r   )r   ctxre   s      r   _alter_tablezSchemaMigrator._alter_table   s(    {{>**..ve}}===r   c                     |                      ||                              d                              t          |                    S )N ALTER COLUMN rl   ra   rb   r   r   rk   re   columns       r   _alter_columnzSchemaMigrator._alter_column   s:    c5)))**VF^^$$	&r   c                    |                                  }|j        dc}|_        |j        |k    r|x|_        |_        |                     ||                              d                              |                    |                     ||_        t          |t                    r| 
                    ||           |S )NTz ADD COLUMN )rR   nullrf   namerl   ra   rb   ddlr#   ForeignKeyFieldadd_inline_fk_sql)r   re   rf   rg   rk   
field_nulls         r   alter_add_columnzSchemaMigrator.alter_add_column   s     !!!&T
EJ ++-88EJ*	
,sE
"
"
'.
!
!
#eiinn



e_-- 	/""3...
r   c                    |                      |                                 |                              d                              t	          |                                        d                              |          S )N ADD CONSTRAINT  rl   rR   ra   rb   r   r   re   ru   
constraints       r   add_constraintzSchemaMigrator.add_constraint   s\    d//11599+,,VD\\""Z	"r   c                     dd                     |          z  }t          t          d          t          d |D                       f          }|                     |||          S )Nzuniq_%sr=   UNIQUEc                 ,    g | ]}t          |          S r3   r   .0rq   s     r   
<listcomp>z-SchemaMigrator.add_unique.<locals>.<listcomp>	  s    HHHfVnnHHHr   )rA   r   SQLr   r   )r   re   column_namesconstraint_namer   s        r   
add_uniquezSchemaMigrator.add_unique  sl    #chh|&<&<<MMHH<HHHIIK L L
 ""5/:FFFr   c                     |                      |                                 |                              d                              t	          |                    S )Nz DROP CONSTRAINT r~   r   re   ru   s      r   drop_constraintzSchemaMigrator.drop_constraint  sF    d//11599,--VD\\""	$r   c                    |                     d                              t          |j        j        j                                                 d                              t          t          |j        j                  f                    }|j	        |                     d|j	        z            }|j
        |                     d|j
        z            }|S )N REFERENCES r}    ON DELETE %s ON UPDATE %s)ra   rb   r   	rel_model_metarG   r   	rel_fieldrf   	on_delete	on_updater   rk   rg   s      r   rx   z SchemaMigrator.add_inline_fk_sql  s    ''F5?0;<<==$fU_-H&I&I%KLLMM	 	
 ?&++o?@@C?&++o?@@C
r   Nc                 
   |p
d|d|d|}|                                                      d                              t          |                                        d                              t          t	          |                                                  d                              t          t          |          f                                        d                              t          |                                        d                              t          |                                        d	          }	||	                    d
|z            }	||	                    d|z            }	|	S )Nfk_r=   _refs_rj   r|   z FOREIGN KEY r    ()r   r   )rR   ra   rb   r   r   r   )
r   re   rf   rel
rel_columnr   r   r   r   rk   s
             r   add_foreign_key_constraintz)SchemaMigrator.add_foreign_key_constraint  sD    % C Ceee>Ikk>Ac)C
 ''F5MM""*++F4Z@@AABB(($f[&9&9%;<<==''F3KK  F:&&'' 	  ++o	9::C ++o	9::C
r   c           
         |j         s|j        t          d|z            t          |t                    }|r|j        st          d          |                     |||          g}|j         s@|                    |                     |||          | 	                    ||          g           |rW| j
        rP|                    |                     |||j        j        j        |j        j        |j        |j                             |j        s|j        rBt+          |dd           }|                    |                     ||f|j        |                     |S )Nz!%s is not null but has no defaultz$Foreign keys must specify a `field`.
index_type)rt   r`   r[   r#   rw   r   rz   extendrh   add_not_nullexplicit_create_foreign_keyappendr   r   r   rG   rf   r   r   indexuniquer.   	add_index)r   re   rf   rg   is_foreign_key
operationsusings          r   
add_columnzSchemaMigrator.add_column9  s    z 	Pem3@;NOOO#E?;; 	E%/ 	ECDDD++E;FFG
 z 	8""5+u==!!%557 8 8 8  	&d> 	&//O)4O/OO% %& & & ; 	C%, 	CE<66EdnnU[N-2\5B B C C C r   c                     t           r   NotImplementedError)r   re   rf   s      r   drop_foreign_key_constraintz*SchemaMigrator.drop_foreign_key_constraint`      !!r   Tc                 |   |                                  }|                     ||                              d                              t	          |                     |r|                    d           d | j                            |          D             }||v r| j        r|                     ||          |gS |S )N DROP COLUMN  CASCADEc                     g | ]	}|j         
S r3   rq   )r   foreign_keys     r   r   z.SchemaMigrator.drop_column.<locals>.<listcomp>n  s1     F F F F F Fr   )	rR   rl   ra   rb   r   r   get_foreign_keysexplicit_delete_foreign_keyr   )r   re   rf   cascaderk   
fk_columnss         r   drop_columnzSchemaMigrator.drop_columnd  s    !!			3	&	&
'/
"
"
#f[!!
"
"
" 	$KK
###F F#}==eDDF F F
 *$$)I$44UKHH#NN
r   c                    |                      |                                 |                              d                              t	          |                                        d                              t	          |                    S )N RENAME COLUMN  TO r~   )r   re   old_namenew_names       r   rename_columnzSchemaMigrator.rename_columnv  sh    d//11599*++VH%%&&VH%%&&	(r   c                 z    |                      |                                 ||                              d          S )Nz SET NOT NULLrr   rR   ra   r   re   rq   s      r   r   zSchemaMigrator.add_not_null  s4    t0022E6BB))	+r   c                 z    |                      |                                 ||                              d          S )Nz DROP NOT NULLr   r   s      r   drop_not_nullzSchemaMigrator.drop_not_null  s5    t0022E6BB)**	,r   c                    |t          d          t          |          r
 |            }t          |t                    r$|                    d          rt          |          }|                     |                                 |                              d          	                    t          |                                        d          	                    |          S )N `default` must be not None/NULL.r   'rn   z SET DEFAULT )r[   r   r#   strendswithr   rl   rR   ra   rb   r   )r   re   rq   r`   s       r   add_column_defaultz!SchemaMigrator.add_column_default  s    ??@@@W 	 giiG gs## 	#(8(8(D(D 	#'llGd//11599)**VF^^$$))W	r   c                     |                      |                                 |                              d                              t	          |                                        d          S )Nrn   z DROP DEFAULTr~   r   s      r   drop_column_defaultz"SchemaMigrator.drop_column_default  sS    d//11599)**VF^^$$))		+r   c                 j   |                                  }|                     |||                              d                              |                    |                    }|Lt          |t                    st          |          }|                    d                              |          }|S )Nz TYPE z USING )rR   rr   ra   rb   ddl_datatyper#   r
   r   r   re   rq   rg   castrk   s         r   alter_column_typez SchemaMigrator.alter_column_type  s     !!c5&11!!E&&s++,, 	 dD)) !4yy++i((,,T22C
r   c                     |                      |                                 |                              d                              t	          |                    S )Nz RENAME TO r~   r   r   r   s      r   rename_tablezSchemaMigrator.rename_table  sG    d//118<<''VH%%&&	(r   c                    	 |                                  }t          ||          }t          |          		fd|D             }t          |	|||          }|                    |          S )Nc                 :    g | ]}t          j        |          S r3   )r.   c)r   rq   	table_objs     r   r   z,SchemaMigrator.add_index.<locals>.<listcomp>  s%    CCC	V,,CCCr   )r   r   )rR   rK   TableIndexrb   )
r   re   rH   r   r   rk   rI   colsr   r   s
            @r   r   zSchemaMigrator.add_index  so    !!$UG44
%LL	CCCC7CCCj)T&NNNwwu~~r   c                     |                                                      d                              t          |                    S )NDROP INDEX rR   ra   rb   r   r   re   rI   s      r   
drop_indexzSchemaMigrator.drop_index  s5    ''VJ''((	*r   )NNN)Tr   )FN)r/   r0   r1   r   r   r   rR   classmethodr]   r;   rh   rl   rr   rz   r   r   r   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r3   r   r   rM   rM      s       "'"'! ! !/ / / 	@ 	@ [	@ ! ! Y!> > >& & &   Y( " " Y" G G YG $ $ Y$
 
 
 =A37   Y2 $ $ Y$L " " Y"    Y" ( ( Y( + + Y+
 , , Y,
   Y" + + Y+    Y ( ( Y(    Y * * Y* * *r   rM   c                   J     e Zd Zd Zed             Ze fd            Z xZS )rV   c                 |    d}| j                             ||z            }d |                                D             S )Nai  
            SELECT pg_attribute.attname
            FROM pg_index, pg_class, pg_attribute
            WHERE
                pg_class.oid = '%s'::regclass AND
                indrelid = pg_class.oid AND
                pg_attribute.attrelid = pg_class.oid AND
                pg_attribute.attnum = any(pg_index.indkey) AND
                indisprimary;
        c                     g | ]
}|d          S r   r3   )r   rows     r   r   z;PostgresqlMigrator._primary_key_columns.<locals>.<listcomp>  s    4443A444r   )r   execute_sqlfetchall)r   tblquerycursors       r   _primary_key_columnsz'PostgresqlMigrator._primary_key_columns  sB    	 **53;7744&//"3"34444r   c                 V    |                                                      d|z            S )NzSET search_path TO %s)rR   ra   )r   schema_names     r   set_search_pathz"PostgresqlMigrator.set_search_path  s'    0;>??	Ar   c                    |                      |          }t          t          |           }|                    ||d          g}t	          |          dk    r|d|d         d}d}| j                            ||f          }t          |                                          r7|d|d         d}	|	                    |                    ||	                     |S )NT)r,      r=   r   _seqz
                SELECT 1
                FROM information_schema.sequences
                WHERE LOWER(sequence_name) = LOWER(%s)
            )
r   superrV   r   rB   r   r   boolfetchoner   )r   r   r   pk_namesParentClassr   seq_namer   r   new_seq_name	__class__s             r   r   zPostgresqlMigrator.rename_table  s    ,,X66.55 $$Xxd$KKM
 x==A&.hh<HE
 ]..uxkBBFFOO%%&& -.6hhD!!+":":l#, #, - - - r   )r/   r0   r1   r   r;   r   r   __classcell__)r   s   @r   rV   rV     sq        5 5 5 A A YA
     Y    r   rV   c                   .    e Zd ZdZd Zed             ZdS )rT   Tc                     d S r   r3   r   s      r   rx   z%CockroachDBMigrator.add_inline_fk_sql      r   c                     |                                                      d                              t          |                                        d          S )Nr   r   r   r   s      r   r   zCockroachDBMigrator.drop_index  sB    ''VJ''(($$		&r   N)r/   r0   r1   r   rx   r;   r   r3   r   r   rT   rT     sD        "&   & & Y& & &r   rT   c                   X    e Zd Zed             Zed             Zed             ZddZdS )MySQLColumnc                     | j         dk    S )NPRIpkrQ   s    r   is_pkzMySQLColumn.is_pk
      w%r   c                     | j         dk    S )NUNIr	  rQ   s    r   	is_uniquezMySQLColumn.is_unique  r  r   c                     | j         dk    S )NYES)rt   rQ   s    r   is_nullzMySQLColumn.is_null  s    yE!!r   Nc                    || j         }|| j        }t          |          t          | j                  g}| j        r"|                    t          d                     |r#|                    t          d                     n"|                    t          d                     | j        r"|                    t          d                     | j        r'|                    t          | j                             t          |          S )Nr   NULLNOT NULLzPRIMARY KEY)
r  ru   r   r   
definitionr  r   r  extrar   )r   rf   r  partss       r   rb   zMySQLColumn.sql  s    ?lG)K;  " > 	(LLX''' 	*LLV%%%%LLZ))): 	-LL]++,,,: 	*LLTZ)))r   NN)r/   r0   r1   propertyr  r  r  rb   r3   r   r   r  r    sw            X      X  " " X"     r   r  _Column)ru   r  rt   r
  r`   r  c                       e Zd ZdZdZd Zed             Zd Zd Z	ed             Z
d Zed             Zed	             Zed
             Zedd            Zed             ZdS )rX   Tc                     |                      ||                              d                              t          |                    S )N MODIFY ro   rp   s       r   rr   zMySQLMigrator._alter_column/  s9    c5))$$VF^^$$	&r   c                     |                                                      d                              t          |                                        d                              t          |                    S )NzRENAME TABLE r   r   r   s      r   r   zMySQLMigrator.rename_table5  sU    ))VH%%&&VH%%&&	(r   c                     | j                             d|z            }|                                }|D ]}t          | }|j        |k    r|c S dS )NzDESCRIBE `%s`;F)r   r   r   r  ru   )r   re   rf   r   rowsr   rq   s          r   _get_column_definitionz$MySQLMigrator._get_column_definition>  se    **+;e+CDD   	 	C #&F{k)) *ur   c                     | j                             d||f          }|                                }|st          d|d|d          |d         S )NzSELECT constraint_name FROM information_schema.key_column_usage WHERE table_schema = DATABASE() AND table_name = %s AND column_name = %s AND referenced_table_name IS NOT NULL AND referenced_column_name IS NOT NULL;z+Unable to find foreign key constraint for "z" on table "z".r   )r   r   r   AttributeError)r   re   rf   r   r)   s        r   get_foreign_key_constraintz(MySQLMigrator.get_foreign_key_constraintG  ss    **3 K " " "" 	> .).=> > > ayr   c                     |                      ||          }|                     |                                 |                              d                              t          |                    S )Nz DROP FOREIGN KEY )r%  rl   rR   ra   rb   r   )r   re   rf   fk_constraints       r   r   z)MySQLMigrator.drop_foreign_key_constraintX  s]    77{KKd//11599-..VM**++	-r   c                     d S r   r3   r   s      r   rx   zMySQLMigrator.add_inline_fk_sql`  r  r   c                    |                      ||          }|                     |                                 |                              d                              |                    d                    }t          d | j                            |          D                       }||vr|S ||         }|                     ||          || 	                    |||j
        |j                  fS )Nr  Fr  c              3   (   K   | ]}|j         |fV  d S r   r   r   fks     r   	<genexpr>z-MySQLMigrator.add_not_null.<locals>.<genexpr>k  <       = = YO= = = = = =r   )r"  rl   rR   ra   rb   dictr   r   r   r   
dest_tabledest_column)r   re   rq   
column_defr   
fk_objectsfk_metadatas          r   r   zMySQLMigrator.add_not_nullc  s   00??
%d&7&7&9&95AA ,,Z^^E^::;; 	
  = =m44U;;= = = = =
 ## (00??//*+	- -. 	.r   c                    |                      ||          }|j        rt          d          |                     |                                 |                              d                              |                    d                    S )NzPrimary keys can not be nullr  Tr*  )r"  r  r[   rl   rR   ra   rb   r   s      r   r   zMySQLMigrator.drop_not_nullz  s{    ,,UF;;< 	=;<<<d//11599$$VZZZ--..	0r   c                 L   t          d | j                            |          D                       }||v }|                     ||          }|                     |                                 |                              d                              t          |                                        d                              |                    |                    }|rA||         }| 	                    ||          || 
                    |||j        |j                  gS |S )Nc              3   (   K   | ]}|j         |fV  d S r   r   r,  s     r   r.  z.MySQLMigrator.rename_column.<locals>.<genexpr>  r/  r   z CHANGE r}   )rf   )r0  r   r   r"  rl   rR   ra   rb   r   r   r   r1  r2  )	r   re   r   r   r4  r   rq   
rename_ctxr5  s	            r   r   zMySQLMigrator.rename_column  s*    = =m44U;;= = = = =
 "Z/,,UH==#|D$5$5$7$7??wz**s6(++,,ws||s6::(:;;<< 	  	$X.K00AA//*+	- -  r   Nc                 P   |t          d          |                                 }|                     ||                              d                              t          |                                        d                              |                    |                    S )Nz5alter_column_type() does not support cast with MySQL.r  r}   )r[   rR   rl   ra   rb   r   rv   r   s         r   r   zMySQLMigrator.alter_column_type  s     & ' ' '!!c5))$$VF^^$$UYYs^^$$	&r   c                     |                                                      d                              t          |                                        d                              t          |                    S )Nr   z ON r   r   s      r   r   zMySQLMigrator.drop_index  sS    ''VJ''((VE]]##	%r   r   )r/   r0   r1   r   r   rr   r;   r   r"  r%  r   rx   r   r   r   r   r   r3   r   r   rX   rX   +  s       "&"&& & & ( ( Y(    " - - Y-   . . Y., 0 0 Y0   Y6 
& 
& 
& Y
& % % Y% % %r   rX   c                      e Zd ZdZ ej        d          Z ej        d          Z ej        d          Z ej        dej	                  Z
d Zd Zed             Zd	 Zedd            Zedd            Zed             Zed             Zed             Zed             Zedd            Zed             Zed             Ze	 dd            ZdS )rZ   z
    SQLite supports a subset of ALTER TABLE queries, view the docs for the
    full details http://sqlite.org/lang_altertable.html
    z(.+?)\((.+)\)z(?:[^,(]|\([^)]*\))+z["`']?([\w]+)z FOREIGN KEY\s+\("?([\w]+)"?\)\s+c                 ^    | j                             d|z            }d |j        D             S )Nzselect * from "%s" limit 1c                     g | ]
}|d          S r   r3   )r   r*   s     r   r   z4SqliteMigrator._get_column_names.<locals>.<listcomp>  s    444DQ444r   )r   r   descriptionr   re   ress      r   _get_column_namesz SqliteMigrator._get_column_names  s3    m''(Du(LMM44CO4444r   c                     | j                             dd|                                g          }|                                S )NzBselect name, sql from sqlite_master where type=? and LOWER(name)=?re   )r   r   lowerr   r@  s      r   _get_create_tablez SqliteMigrator._get_create_table  s>    m''.ekkmm$& & ||~~r   c                 	    t          d  j                            |          D                       }|                                |vrt	          d|d|d                               |          \  }} j                            |          } j                            |           t          j	        dd|          } j
                            |                                          \  }} j                            |          }	d |	D             }
g }g }g }d}|
D ]} j                            |                                          \  }||k    r| |||          }|rm|                    |           |                    |            j                            |                                          \  }|                    |           |                    |           |                                                    |          s*|                    |           |                    |           t'          t)          ||                    }|                    |          d	 }sd
 }n|k    r fd}g }|D ]^} j                            |          }|)|                                d         |k    r ||          }|r|                    |           _|dz   }t          j        d|z  t          j                  }|	                    d|z  |          }d                    |          }t5          t7          d          t9          |          g          t7          |                                d|d          g}t5          t7          d          t9          |          t=          d |D                       t7          d          t?          d |D                       t7          d          t9          |          f          }t5          t7          d          t9          |          g          }|||                      ||          gz  }tC          d |          D ]u}||j"        vr(|                    t7          |j#                             3r@ $                    |j#        |          }|"|                    t7          |                     v|S )Nc              3   H   K   | ]}|j                                         V  d S r   )ru   rD  r   s     r   r.  z0SqliteMigrator._update_column.<locals>.<genexpr>  sL       F F  k'')) F F F F F Fr   zColumn "z" does not exist on ""z\s+r}   c                 6    g | ]}|                                 S r3   stripr   cols     r   r   z1SqliteMigrator._update_column.<locals>.<listcomp>  s     <<<ssyy{{<<<r   )zforeign zprimary zconstraint zcheck c                     | S r   r3   r3  s    r   <lambda>z/SqliteMigrator._update_column.<locals>.<lambda>  s    * r   c                     d S r   r3   rO  s    r   rP  z/SqliteMigrator._update_column.<locals>.<lambda>  s    d r   c                 @    j                             dz  |           S )NzFOREIGN KEY ("%s") )fk_resub)r3  
new_columnr   s    r   rP  z/SqliteMigrator._update_column.<locals>.<lambda>
  s"    djnn%
2/ / r   r   __tmp__z
("?)%s("?)z\1%s\2, zDROP TABLE IF EXISTSr   r   zINSERT INTOc                 ,    g | ]}t          |          S r3   r   rL  s     r   r   z1SqliteMigrator._update_column.<locals>.<listcomp>'  s    FFFcfSkkFFFr   SELECTc                 ,    g | ]}t          |          S r3   r   rL  s     r   r   z1SqliteMigrator._update_column.<locals>.<listcomp>)  s    HHH36#;;HHHr   FROMz
DROP TABLEc                     | j         S r   )rb   )idxs    r   rP  z/SqliteMigrator._update_column.<locals>.<lambda>6  s     r   )%setr   get_columnsrD  r[   rE  get_indexesr   rerT  	column_researchgroupscolumn_split_refindallcolumn_name_rematchr   
startswithr0  zipgetrS  compileIrA   r   r   r   rK  r   r   r   filterrH   rb   
_fix_index)r   re   column_to_updater7   rH   create_tableindexes
raw_createraw_columnssplit_columnscolumn_defsnew_column_defsnew_column_namesoriginal_column_namesconstraint_termsr3  rf   new_column_deforiginal_to_newfk_filter_fncleaned_columnsrh  
temp_tablergxcreatequeriespopulate_tabledrop_originalr   rb   rU  s   `                             @r   _update_columnzSqliteMigrator._update_column  sD    F F$(M$=$=e$D$DF F F F F!!##722*...7 8 8 8 #44U;;| -++E22 	&&u--- vfc<88 #'."7"7"E"E"L"L"N"N
K ,44[AA<<m<<< "L% 	> 	>J.44Z@@GGIILK...!#K!<!<! 9#**>:::)00===#'#6#<#<&$( $((. !K$++K888&&z222 "''))445EFF >$++K888)00=== s#8:JKKLL$(()9::
44 	22LL+++    L ) 	3 	3JJ$$Z00E U\\^^A%6:J%J%J)\*55
 3&&z222 Y&
j-rt44# 
 ))O,,c0116*3E3EFGGV\\^^^^WWW5668
 ":FF5EFFFGGMMHH2GHHHIIKK5MM#   !#l"3"3VE]]!CDD 	j%002 	2 //99 	- 	-Eu}44s59~~.... -ooei1A:NN?NN3s88,,,r   c                    |                     |          }t          |          dk    r|                    ||          S |                    dd          \  }}t          |                     |                    dk    r|d|                    ||          S |                    dd          d                              d          }d |D             }g }|D ]I}	t	          j        d|z  |	          r||	t          |          d          z   }	|                    |	           J|dd	                    d
 |D                       dS )N   (r   r   r   ,c                 8    g | ]}|                     d           S )z"`[]' rJ  )r   parts     r   r   z-SqliteMigrator._fix_index.<locals>.<listcomp>R  s$    ;;;T4::i((;;;r   z%s(?:[\'"`\]]?\s|$)rW  c              3       K   | ]	}d |z  V  
dS )z"%s"Nr3   )r   r   s     r   r.  z,SqliteMigrator._fix_index.<locals>.<genexpr>]  s&      )D)D&1*)D)D)D)D)D)Dr   )splitrB   replacersplitra  rh  r   rA   )
r   rb   rp  rU  r  lhsrhsrH   cleanrq   s
             r   ro  zSqliteMigrator._fix_index@  sf    		*++u::??;;/<<< ::c1%%S syy)**++q00!cc3;;/?#L#L#LMM 

3""1%++C00;;U;;;
  	! 	!Fx.1AA6JJ E#fS1A-B-B-C-C&DDLL    33		)D)De)D)D)D D D D DEEr   TFc                    t           j        dk    ra|s_|                                 }|                     ||                              d                              t          |                     |S |                     ||d           S )N)   #   r   r   c                     d S r   r3   )abs     r   rP  z,SqliteMigrator.drop_column.<locals>.<lambda>g  s    D r   )r   sqlite_version_inforR   rl   ra   rb   r   r  )r   re   rf   r   legacyrk   s         r   r   zSqliteMigrator.drop_column_  s    &*44V4##%%CsE**go&&c&%%&&&J""5+7H7HIIIr   c                 |   t           j        dk    r|s|                     |                                 |                              d                              t          |                                        d                              t                              S fd}|                     |||          S )N)r     r   r   r   c                 0    |                     |           S r   r  )rf   r3  r   s     r   _renamez-SqliteMigrator.rename_column.<locals>._renamer  s    %%k8<<<r   )r   r  rl   rR   ra   rb   r   r  )r   re   r   r   r  r  s      `  r   r   zSqliteMigrator.rename_columni  s    &*44V4!\$"3"3"5"5u==W.//S))**WV__S))**,	= 	= 	= 	= 	=""5(G<<<r   c                 6    d }|                      |||          S )Nc                     |dz   S )Nz	 NOT NULLr3   rf   r3  s     r   _add_not_nullz2SqliteMigrator.add_not_null.<locals>._add_not_nullx  s    ++r   r  )r   re   rq   r  s       r   r   zSqliteMigrator.add_not_nullv  s)    	, 	, 	,""5&-@@@r   c                 6    d }|                      |||          S )Nc                 .    |                     dd          S )Nr   r  r  s     r   _drop_not_nullz4SqliteMigrator.drop_not_null.<locals>._drop_not_null~  s    %%j"555r   r  )r   re   rq   r  s       r   r   zSqliteMigrator.drop_not_null|  s)    	6 	6 	6""5&.AAAr   c                    t          d          t                    r
             t          t                    r.                    d          s                                sdz  fd}|                     |||          S )Nr   r   z'%s'c                     |dz  z   S )Nz DEFAULT %sr3   )rf   r3  r`   s     r   _add_defaultz7SqliteMigrator.add_column_default.<locals>._add_default  s     777r   )r[   r   r#   r   r   isdigitr  )r   re   rq   r`   r  s      ` r   r   z!SqliteMigrator.add_column_default  s    ??@@@W 	 giiGw$$ 	'W-=-=j-I-I 	'OO%%	'w&G	8 	8 	8 	8 	8 ""5&,???r   c                 6    d }|                      |||          S )Nc                 n    t          j        dd|t           j                  }|                                S )NzDEFAULT\s+[\w"\'\(\)]+(\s|$)r  )flags)ra  rT  rm  rK  )rf   r3  rM  s      r   _drop_defaultz9SqliteMigrator.drop_column_default.<locals>._drop_default  s-    &8"jPRPTUUUC99;;r   r  )r   re   rq   r  s       r   r   z"SqliteMigrator.drop_column_default  s+    	 	 	 ""5&-@@@r   Nc                     |t          d          |                                 fd}|                     ||          S )Nz6alter_column_type() does not support cast with Sqlite.c                                                    }                    t                                                  |                                          \  }}|S r   )rv   rb   r   r   )rf   r3  	node_listrb   r=   rq   rk   rg   s        r   _alter_column_typez<SqliteMigrator.alter_column_type.<locals>._alter_column_type  sL    		#IWWVF^^,,00;;AACCFCJr   )r[   rR   r  )r   re   rq   rg   r   r  rk   s     ``  @r   r   z SqliteMigrator.alter_column_type  sq     ' ( ( (!!	 	 	 	 	 	 	 ""5&2DEEEr   c                     t           r   r   r   s       r   r   zSqliteMigrator.add_constraint  r   r   c                     t           r   r   r   s      r   r   zSqliteMigrator.drop_constraint  r   r   c                     t           r   r   )r   re   rf   rg   r   r   s         r   r   z)SqliteMigrator.add_foreign_key_constraint  s
     "!r   )TF)Fr   r  )r/   r0   r1   r2   ra  rl  rb  re  rg  rm  rS  rB  rE  r;   r  ro  r   r   r   r   r   r   r   r   r   r   r3   r   r   rZ   rZ     s         
+,,I bj!899ORZ 455NBJ:BDAAE5 5 5   q q YqfF F F> J J J YJ 
= 
= 
= Y
= A A YA
 B B YB
 @ @ Y@ A A YA 	F 	F 	F Y	F " " Y" " " Y" =A" " " Y" " "r   rZ   c                  8    | D ]}|                                  d S r   )r%   )r   r   r;   s      r   migrater    s*      	 r   ) r2   collectionsr   r9   rC   ra  peeweer   r   r   r	   r
   r   r   r   r   r   r   playhouse.cockroachdbr   ImportErrorobjectr   r;   rK   rM   rV   rT   r  rX   rZ   r  r3   r   r   <module>r     s  q qd # " " " " "      				                 # # # # # #                                                 , , , , , ,7777777   : : : : : : : :6    Q* Q* Q* Q* Q*V Q* Q* Q*h+ + + + + + + +\& & & & &, & & &         **Y )= > >      FI% I% I% I% I%N I% I% I%Xw" w" w" w" w"^ w" w" w"t    s   A# #A-,A-