H:j%7ddlZddlZddlZddlZddlmZmZmZddlm Z ddl m Z ddl m Z ddlmZmZddlmZddlmZdd lmZmZdd lmZdd lmZd Zd Zd\ZZZeeegZ edediZ!dZ"dZ#dZ$GddeZ%GddeZ&d*dZ'd+dZ(dZ)d,dZ*defdZ+dZ,d Z-d-d!Z.d"Z/d,d#Z0d$Z1d.d%Z2d/d&Z3d/d'Z4d(Z5d)Z6dS)0N)deleteeventfunc) Inspector)make_url) _ModuleMarker)RelationshipProperty sessionmaker) mysql_lib)FormattedException)BasehistoryLVE_STATS_2_TABLENAME_PREFIX)alembic_migratez/var/lve/lvestats2.dbi)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 /builddir/build/BUILDROOT/lve-stats-5.0.4-1.el8.x86_64/opt/cloudlinux/venv/lib/python3.11/site-packages/lvestats/lib/dbengine.py z4find_not_existing_tables_or_views..1sDDD014DDDc3LK|]}|tdV dS)N)replacer)rxs r z4find_not_existing_tables_or_views..2s1ZZ7<<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..As& L L L!/K!K!KA!K!K!Kr) dictr metadatatablesvaluespathlibPathexistsappendr)r9burstable_limits_feature_flagr5s @r get_list_of_tables_without_viewsr@5s $-& ' ' . . 0 0F#% $a! <5 6 6 = = ? ?^$++,HK\,\]]] L L L Lv L L LLrceZdZdS)MakeDbExceptionN__name__ __module__ __qualname__rrrrBrBDDrrBceZdZdS)DatabaseConfigErrorNrCrrrrIrIHrGrrITc|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://)getrISUPPORTED_DATABASESjoinSQLITEDEFAULT_DB_PATHget_db_client_library_name get_fixed_uri)cfg check_supportrKrRuriclient_librarys r cfg_get_urir`LsAggi  G!=K\^gJh i i    (;;;!=-4 TgHhHhii     WW-..N&^3!=K\^nJo p p   &JJcgg&6HHJJ3G<<>>>>>n>>GS)) JrFcVtjd} t||}nN#t$rA}d}dt |i} ||| t || d|d}~wwxYw|d|d|d ur d |vr|d }|r&d } tj |d | } n_tj |||} | j tkrtj| dt | 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)serrorrMNzConnecting to database: %srKFdebugc$t|dSN)print)sql multiparamsparamss rdumpzmake_db_engine..dumps #JJJJJrmock)strategyexecutor)echo poolclassconnect)logging getLoggerr`rIstrrcrBinfo sqlalchemyr) create_engineurlget_backend_namerXrlisten_set_sqlite_busy_timeout) r\ just_printrd pool_classr]logrRemsgrOrkr)s rmake_db_enginerusS  , - -CK$S FFF KKKBCFF# #w#'BBCCJ K HH )3y>::: ~~'S..G  F   "00&[_0``"00eWa0bb : & & ( (F 2 2 L,D E E E Ms( A3>EEGGL#|'9'9';';u'D'D K K K K K K K K||$@AAHHJJH  K K K K K K K K K K K K K K K > *     %       0 0H < < ]^^^^^  Y      sHCAC C 'C CCCCCD3DDc tjd}|r-d|_|tjddggd}t j|}|}t|j D]\}}t|tr|j } |d| | |vrd|| D} t!j|} | jD]M} t| t&r| jD]-} | j| vr"|d|| j|d|d<.N|d || |d|d <|d | |d r|d |dr|d |S)Nvalidate_databaseF) table_error column_errormissing_tables orm_tablesrcg|] }|d Sr2r)rcs rr6z%validate_database..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 %srrzWYou 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.)rrrs propagate addHandler NullHandlerrr%get_table_nameslist_decl_class_registryitems isinstancer __tablename__r> get_columnsrvinspectattrsr columnskeycritical)r) hide_loggingbaser~resultdatabase_inspection real_tables__classtable real_columnsmapper column_propcolumns rrrs  / 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)r9T)stamp)r r8 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_dbr sG3 4V < <3&c222222rcDtj|dSrf)r r8drop_allrs r drop_tablesrsM6"""""rc.|}|} ttjjD]\}}|t|}nWt|ttfrt||j j |v}nt||j j |k}| || dS#t$r|wxYwrf)rqbeginrr r8r9rrrr(r server_idrcommit 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|dSrf)rrrs r recreate_dbr's$ frc4|tjtj|ktjtjtj dktj tj dk}|#|tj|k}|#|tj|k}d|DS)Nrcg|] }|d Srr)rrecord_s rr6z(find_lost_keep_alive..;s 5 5 57GAJ 5 5 5r) queryrcreatedfilterrgroup_byhavingrmaxidmin)sessionr from_timestmp to_timestamplost_keepalives rfind_lost_keep_aliver,s  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..CsQQQ3QQQQrz*Was fixed %s losted keep alive records: %sr) rrr __table__rkeysrrraddrrulen) rrrrlog_lost_keep_alivev2_keepalive_row timestamphistory_keepalives rfix_lost_keep_aliver>s*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 rr)r)r\rrrrs rfix_dbrOsK'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 detectedrPrM)DB_CLIENT_LIBRARY_MAPrUrI)rKr_s rrZrZVsN +..w77N!q#W      rc||tkr|St|}ttj|S)zo Get fixed URI for the specified database :param str db_type: :param str uri: :return str: )MYSQLrrtr get_rfc1738_db_uri)rKr^us rr[r[is8%  A y+A.. / //r)T)FFNTrf)FN)NN)NNN)7rrr;sqlalchemy.enginervsqlalchemy.excrrrsqlalchemy.engine.reflectionrsqlalchemy.engine.urlr&sqlalchemy.ext.declarative.clsregistryrsqlalchemy.ormr r clcommonr clcommon.clexceptionr lvestats.ormr rrlvestats.utils.dbmigratorrrYrr POSTGRESQLrXrVr __author__r.r@rBrIr`rr{rrrrrrrrrrrrZr[rrrrs**********222222******@@@@@@========333333&&&&&&&&555555555555) ;z6j&1 9    [ [ [ M M M     (        ,   &&&&R$$$$N. . . . b,1t&&&&RLLL ((( 3333###$ 6666$gggg"& 0 0 0 0 0r