veg6ddlZddlZddlZddlmZmZddlmZmZmZm Z m Z m Z m Z m Z mZddlmZddlmZddlmZddlmZddlmZd Zed zZd ZeZGd d eZdZdZdZ dZ!dZ"ddZ#dZ$dZ%dZ&ej'defdZ(dS)N)datetime timedelta) ColumnBooleanDateTimeIntegerString create_engineeventfunctext)declarative_base) Inspector)Session)close_all_sessions) DatabaseErrorz/var/lve/ssa.dbz.oldceZdZdZdZeedZeeddZ eeddZ eedZ eedZ ee dZee dZeedZeedZee dZeedej Zeedejej Zd S) RequestResultay Describes processed request stored in database file. E.g. { "timestamp": "1650008727", "url": "http://mydomain.com/index.php", "duration": 162077, "hitting_limits": false, "throttled_time": 0, "io_throttled_time": 0, "wordpress": true } Note: created_at, updated_at is saved in local TZ format scrape_resultT) primary_keyF)indexnullable)r)timezone)server_default)onupdaterN)__name__ __module__ __qualname____doc__ __tablename__rridr domainpath timestampdurationris_slow_requesthitting_limitsthrottled_timeio_throttled_time wordpressrr now created_at updated_at=/opt/cloudlinux/venv/lib64/python3.11/site-packages/ssa/db.pyrr%sM $M T * * *B VF$ 7 7 7F 6&u 5 5 5Dw///Ivg...HfWu555OVGe444NVGe444Nw777w///I$/// KKKJ$///($(**U]UYU]U_U_```JJJr0rcBtjttz }t |5}|t t j|k ddddS#1swxYwYdS)zD Removes outdated records from database, saving disk space. )daysN) rtodayrRETENTION_TIME_DAYS session_scopequeryrfilterr-delete)engine n_days_agosessions r1cleanup_old_datar=Js!!I3F$G$G$GGJ v  ' m$$ VM,z9 : : VXXXsABBBcft|s!tj|dSdSN) is_db_presentBasemetadata create_all)r:s r1create_db_if_not_existrDUs8  )   ((((())r0ctjtsdSt j|}d|D}t|dkS)NFcg|]}|Sr/r/).0tables r1 z!is_db_present..^s G G Ge G G Gr0r)osr$isfileSSA_DBr from_engineget_table_nameslen)r:database_inspectiontabless r1r@r@Zs^ 7>>& ! !u#/77 G G!4!D!D!F!F G G GF v;;?r0c0|ddS)NzPRAGMA journal_mode = WAL)execute) dbapi_con con_records r1setup_wal_moderVbs 122222r0cdt|rdfd}td|d}tj|dtt ||S)Nzfile:z?mode=roc0tjdS)NT)uri)sqlite3connect)connection_stringsr1z!_setup_database..jsgo&7TBBBr0 sqlite:////F)creatorechor[)rLr r listenrVrD)readonlyr_r:r\s @r1_setup_databasercfsz(((;0:::BBBBG wUF LN3336""" Mr0Fc t|Sr?)rc)rbs r1setup_databaseress 8 $ $$r0ctjtr-t tjtt t}|tdt } t|5}t|5}| t t||dddn #1swxYwYdddn #1swxYwYn#t$rYnwxYwt tdztdzfD]5}tj|rtj|6dS)z Restore database by establish connections to old and new databases, merge data to new one if possible and delete old one. r^Nz-walz-shm)rJr$existsrLrreplace OLD_SSA_DBredisposer r6r7rfirst!merge_unharmed_data_from_databaserremove)r: new_engine old_engine session_old session_newr$s r1restore_databaserrws  w~~f' 6:&&&!!J NN9Z99::J : & & H+}Z7P7P HT_   m , , 2 2 4 4 4 -k; G G G H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H      Vf_fvo> 7>>$    IdOOOsZ DD +=C4( D 4C8 8D ;C8 <D ? D DDDD D$#D$cd}d} |t||} |}|sdS|D]}||nv#t $rit|D]V} |||z}|sn&||G#t $rYSwxYwYnwxYw| ||z })z_ Scrape all unharmed records from malformed database and merge them into new database. r TN) r7roffsetlimitallmergerrangerkcommit) rprqru batch_sizer7records_to_saverecord pos_in_batchrecord_to_saves r1rlrlsNFJ!!-0077??EEjQQ #iikkO" ) * *!!&)))) *    %j 1 1   %*\\&<2G%H%H%N%N%P%PN)%%n5555$D  *%sHA:A::C-,CC-CC- C'$C-&C''C-,C-ctjtr=tjtrtjt t |5}|td}| }|dddkcdddS#1swxYwYdS#t$rYdSwxYw)z Try integrity check of database file to see if it is malformed. If database unable to execute it, will also count as malformed. zPRAGMA integrity_checkrokNT) rJr$rgrirLrmr6rSr fetchallr)r:dbresulterrorss r1is_malformed_databasers  w~~j!!bgnnV&<&< * 6 " " (bZZ%= > >??F__&&F!9Q<4' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( tts7#C2AC: CC  CC C C"!C"returnc#Kt|} |V|n#|xYw |dS#|wxYw)zF Provide a transactional scope around a series of operations. )bindN)rrzrollbackclose)r:r<s r1r6r6s 6"""G      s-AAAA4)F))rJ contextlibrZrr sqlalchemyrrrrr r r r r sqlalchemy.ext.declarativersqlalchemy.engine.reflectionrsqlalchemy.ormrsqlalchemy.orm.sessionrsqlalchemy.excrrLrir5rArr=rDr@rVrcrerrrlrcontextmanagerr6r/r0r1rs ((((((((877777222222""""""555555((((((  f_ "a"a"a"a"aD"a"a"aJ))) 333   %%%%86      W      r0