[w'xddlZddlZddlZddlmZmZddlmZddlm Z ddl m Z ddl m Z mZddlmZddlmZdd lmZmZdd lmZdd lmZd Zd \ZZZeeegZedediZdZdZ dZ!GddeZ"GddeZ#d'dZ$d(dZ%defdZ&dZ'dZ(d)dZ)dZ*d*d Z+d!Z,d+d"Z-d,d#Z.d,d$Z/d%Z0d&Z1dS)-N)deletefunc) Inspector)make_url) _ModuleMarker)RelationshipProperty sessionmaker) mysql_lib)FormattedException)BasehistoryLVE_STATS_2_TABLENAME_PREFIX)alembic_migratez/var/lve/lvestats2.db)mysql postgresqlsqlitepymysqlpsycopg2shamanctj|}t|}d|D|z }t dt |DS)z^ Checks if views exist. :param sqlalchemy.engine.base.Engine engine: :return: c"h|] }t|z Sr).0ns lvestats/lib/dbengine.py z4find_not_existing_tables_or_views..+sDDD014DDDc3LK|]}|tdV dS)N)replacer)rxs r z4find_not_existing_tables_or_views..,s1ZZ7<<ZZZZZZr)r from_enginesetget_view_namestuple)enginenames inspectorexisting not_existings r!find_not_existing_tables_or_viewsr-#sj %f--I9++--..HDDeDDDxOL ZZeLFYFYZZZ Z ZZrcttjj}gd}t j|stdzfd|DS)zc Used to call engine.create_all() without views that are described as Table() :return: z;/opt/cloudlinux/flags/enabled-flags.d/burstable-limits.flagbursting_eventsc&g|] }|jv |Srname)rttables_for_disabled_featuress r z4get_list_of_tables_without_views..;s& L L L!/K!K!KA!K!K!Kr) dictr metadatatablesvaluespathlibPathexistsappendr)r8burstable_limits_feature_flagr4s @r get_list_of_tables_without_viewsr?/s $-& ' ' . . 0 0F#% $a! <5 6 6 = = ? ?^$++,HK\,\]]] L L L Lv L L LLrceZdZdS)MakeDbExceptionN__name__ __module__ __qualname__rrrrArA>DrrAceZdZdS)DatabaseConfigErrorNrBrrrrHrHBrFrrHTc|d}|tdddid|r6|tvr-td|dtdd|d }|tkr|tddd id|tkr!|d |d t }n)t |}|d |d |}t||}|S)z Extract and validate database connection uri from config :param dict cfg: :param bool check_support: :return str: db_typeNz#"%(config_variable)s" not in configconfig_variablemessagecontextz}Incorrect database type %(database_type)s. You should only use %(database_types)s. The correct db_type for mariadb is "mysql"z", ") database_typedatabase_typesconnect_stringz:///sqlite_db_path+z://)getrHSUPPORTED_DATABASESjoinSQLITEDEFAULT_DB_PATHget_db_client_library_name get_fixed_uri)cfg check_supportrJrQuriclient_librarys r cfg_get_urir_FsAggi  G!=K\^gJh i i    (;;;!=-4 TgHhHhii     WW-..N&^3!=K\^nJo p p   &JJcgg&6HHJJ3G<<>>>>>n>>GS)) JrFctjd} t||}nN#t$rA}d}dt |i} ||| t || d|d}~wwxYw|d|d|d ur d |vr|d }|r&d } tj |d | } n"tj |||} | S)z Create sqlalchemy database engine :param dict cfg: :param bool just_print: :param bool debug: :param pool_class: :param bool check_support: :return: init_db_engine)r\z2Unable to configure database connection. %(error)serrorrLNzConnecting to database: %srJFdebugc$t|dSN)print)sql multiparamsparamss rdumpzmake_db_engine..dumps #JJJJJrmock)strategyexecutor)echo poolclass) logging getLoggerr_rHstrrbrAinfo sqlalchemyr( create_engine) r[ just_printrc pool_classr\logrQemsgrNrjr(s rmake_db_enginer{os%  , - -CK$S FFF KKKBCFF# #w#'BBCCJ K HH )3y>::: ~~'S..G c   "00&[_0``"00eWa0bb Ms( A3.sVVV!AfIVVVrz?Model %s declares column %s which does not exist in database %sTrz>Model %s declares table %s which does not exist in database %sr~rzWYou can run 'lve-create-db --create-missing-tables' command to recreate missing tables.zLYou can try to recreate malformed table, or ask CloudLinux support for help.)rprq propagate addHandler NullHandlerrr$get_table_nameslist_decl_class_registryitems isinstancer __tablename__r= get_columnsrtinspectattrsrcolumnskeycritical)r( hide_loggingbaserxresultdatabase_inspection real_tables__classtable real_columnsmapper column_propcolumns rr}r}s  / 0 0C.  w*,,---"ER_a b bF#/77%5577K$399;;<<33 6 fm , ,  $|##E*** K  VV/B/N/Nu/U/UVVVL'//F%| : : k+?@@ :"-"5::!:\99LL a & & &  6:F>2: : LLY[achjp q q q$(F= ! # $ + +E 2 2 2 2 mp nooo ne cddd MrcHt|d}|d|dkS)NT)rrr)r})r(inspect_results rcheck_need_create_dbrs*&vDAAAN * +~l/K KKrctj|tt |ddS)N)r8T)stamp)r r7 create_allr?rr(s r create_dbrs=MV,L,N,NOOOF$''''''rcl|st|rt|dSt||dS)N) lve_stats_cfg)rrr)r(create_missing_tablesr[s rsetup_dbrsG3 4V < <3&c222222rcDtj|dSre)r r7drop_allrs r drop_tablesrsM6"""""rc.|}|} ttjjD]\}}|t|}nWt|ttfrt||j j |v}nt||j j |k}| || dS#t$r|wxYwre)connectbeginrr r7r8rrrr'r server_idexecutecommit Exceptionrollback)r(rconn_transr table_object delete_querys r clear_rowsrs NN  E KKMME #DM$8$>$>$@$@AA ( (OA| %l33 Ie}55 [%lLN4LPY4YZZ %lLN4LPY4YZZ MM, ' ' ' '    s CC44 DcBt|t|dSre)rrrs r recreate_dbrs$ frc4|tjtj|ktjtjtj dktj tj dk}|#|tj|k}|#|tj|k}d|DS)Nrcg|] }|d Srr)rrecord_s rr5z(find_lost_keep_alive..s 5 5 57GAJ 5 5 5r) queryr createdfilterrgroup_byhavingrmaxidmin)sessionr from_timestmp to_timestamplost_keepalives rfind_lost_keep_alivers  go&& !Y. / / '/ " " $$q( ) ) $$q( ) ) '..w,/NOO '..w-/OPP 5 5n 5 5 55rct||||}|sdSdttjjD}||tjj<|D]*}tdi|}||_| |+| |r&| dt||dSdS)Nci|]}|dSrr)rcols r z'fix_lost_keep_alive..sQQQ3QQQQrz*Was fixed %s losted keep alive records: %sr) rrr __table__rkeysrrraddrrslen) rrrrlog_lost_keep_alivev2_keepalive_row timestamphistory_keepalives rfix_lost_keep_alivers*7I}l[[O QQ$w/@/H/M/M/O/O*P*PQQQ.7W&*+$'' #77&677$-! %&&&& NN g >O@T@TVefffffggrct|}t||d||||dS)N)bindr)rrr)r rclose)r(r[rrrrs rfix_dbr sK'l'''))G[!1]iptuuuu MMOOOOOrcft|}|tdd|id|S)zZ Get database Python client library name :param str db_type: :return str: NzTThe client library to connect to the "%(database_type)s" database cannot be detectedrOrL)DB_CLIENT_LIBRARY_MAPrTrH)rJr^s rrYrYsN +..w77N!t#W      rc||tkr|St|}ttj|S)zo Get fixed URI for the specified database :param str db_type: :param str uri: :return str: )MYSQLrrrr get_rfc1738_db_uri)rJr]us rrZrZ&s8%  A y+A.. / //r)T)FFNT)FNre)NN)NNN)2rpr:sqlalchemy.enginertrrsqlalchemy.engine.reflectionrsqlalchemy.engine.urlr&sqlalchemy.ext.declarative.clsregistryrsqlalchemy.ormrr clcommonr clcommon.clexceptionr lvestats.ormr r rlvestats.utils.dbmigratorrrXr POSTGRESQLrWrUr __author__r-r?rArHr_r{r}rrrrrrrrrrYrZrrrrs########222222******@@@@@@========333333&&&&&&&&555555555555);z6j&1 9    [ [ [ M M M     (        ,   &&&&R!!!!H,1t&&&&RLLL ((( 3333###$ 6666$gggg"& 0 0 0 0 0r