U SW@s\dZddlZddlTddlmZddlmZddlmZddlmZddlmZ dd lm Z dd lm Z dd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZGdddeZGdddeZddZGdddeZGddde ZGdd d eZGd!d"d"e Z Gd#d$d$e Z dS)%an Peewee integration with APSW, "another python sqlite wrapper". Project page: https://rogerbinns.github.io/apsw/ APSW is a really neat library that provides a thin wrapper on top of SQLite's C interface. Here are just a few reasons to use APSW, taken from the documentation: * APSW gives all functionality of SQLite, including virtual tables, virtual file system, blob i/o, backups and file control. * Connections can be shared across threads without any additional locking. * Transactions are managed explicitly by your code. * APSW can handle nested transactions. * Unicode is handled correctly. * APSW is faster. N)*)_sqlite_date_part)_sqlite_date_trunc)_sqlite_regexp) BooleanField) DateField) DateTimeField) DecimalField)logger savepoint) TimeField transaction)SqliteExtDatabase)VirtualCharField) VirtualField)VirtualFloatField)VirtualIntegerField) VirtualModelc@seZdZdddZddZdS)rdeferredcCs||_||_dSN)db lock_type)selfrrr /apsw_ext.py__init__)sztransaction.__init__cCs|j|jdSr)rbeginrrrrr_begin-sztransaction._beginN)r)__name__ __module__ __qualname__rr rrrrr(s rcseZdZd,fdd ZddZddZdd Zfd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZd-ddZddZdd Zd.d"d#Zd$d%Zd&d'Zd/d(d)Zd0d*d+ZZS)1 APSWDatabaseNc s$||_i|_tt|j|f|dSr)timeout_modulessuperr$r)rdatabaser%kwargs __class__rrr2szAPSWDatabase.__init__cCs||j|<dSrr&)rmod_namemod_instrrrregister_module7szAPSWDatabase.register_modulecCs |j|=dSrr,)rr-rrrunregister_module:szAPSWDatabase.unregister_modulecKsNtj|f|}|jdk r$||jz||Wn|YnX|Sr)apswZ Connectionr%Zsetbusytimeout_add_conn_hooksclose)rr(r)connrrr_connect=s  zAPSWDatabase._connectcstt||||dSr)r'r$r2 _load_modules)rr4r*rrr2HszAPSWDatabase._add_conn_hookscCs$|jD]\}}|||q |Sr)r&itemsZ createmodule)rr4r-r.rrrr6LszAPSWDatabase._load_modulescs4|jD]$\}\}fdd}|||q dS)Ncs}||j|jfSr)stepZfinalize)instanceklassrrmake_aggregateSsz5APSWDatabase._load_aggregates..make_aggregate)Z _aggregatesr7Zcreateaggregatefunction)rr4name num_paramsr<rr:r_load_aggregatesQs zAPSWDatabase._load_aggregatescCs$|jD]\}}|||q dSr)Z _collationsr7Zcreatecollation)rr4r=fnrrr_load_collationsXszAPSWDatabase._load_collationscCs*|jD]\}\}}||||q dSr)Z _functionsr7Zcreatescalarfunction)rr4r=r@r>rrr_load_functions\szAPSWDatabase._load_functionscCs$|d|jD]}||qdSNT)enableloadextension _extensions loadextension)rr4 extensionrrr_load_extensions`s  zAPSWDatabase._load_extensionscCs4|j||s0|}|d||dSrC)rEaddZ is_closedZget_connrDrF)rrGr4rrrload_extensiones   zAPSWDatabase.load_extensioncCs|||p d|S)Nr)execute)rcursorsqlparamsrrr _execute_sqllszAPSWDatabase._execute_sqlTc Cs<t||f||}||||W5QRX|Sr)r debugZexception_wrapper get_cursorrO)rrMrNZrequire_commitrLrrr execute_sqlps  zAPSWDatabase.execute_sqlcCs|jjr|SdSr)Z_metaZauto_increment getconnectionZlast_insert_rowid)rrLZmodelrrrlast_insert_idwszAPSWDatabase.last_insert_idcCs |Sr)rSZchanges)rrLrrr rows_affected{szAPSWDatabase.rows_affectedrcCs|d|dS)Nz begin %s;rQrKrrrrrr~szAPSWDatabase.begincCs|ddS)Nzcommit;rVrrrrcommitszAPSWDatabase.commitcCs|ddS)Nz rollback;rVrrrrrollbackszAPSWDatabase.rollbackcCs t||SrrrWrrrrszAPSWDatabase.transactioncCs t||Srr )rZsidrrrr szAPSWDatabase.savepoint)N)NT)r)r)N)r!r"r#rr/r0r5r2r6r?rArBrHrJrOrRrTrUrrXrYrr __classcell__rrr*rr$1s(    r$cCs|dk rt|SdSr)str)svrrrnhsr^cseZdZfddZZS)rcs(tt||}|dk r$|r dp"dSdS)Nr)r'rdb_value)rr]r*rrr`szBooleanField.db_value)r!r"r#r`rZrrr*rrsrc@seZdZeZdS)rNr!r"r#r^r`rrrrrsrc@seZdZeZdS)r Nrarrrrr sr c@seZdZeZdS)rNrarrrrrsrc@seZdZeZdS)r Nrarrrrr sr )__doc__r1ZpeeweerrrrZ _BooleanFieldrZ _DateFieldrZ_DateTimeFieldr Z _DecimalFieldr r r Z _TimeFieldrZ _transactionZplayhouse.sqlite_extrrrrrrr$r^rrrrs6                  ]