ŞwddlZddlZddlZddlZddlZddlZddlmZmZm Z ddlm Z ddl m Z mZmZmZmZmZmZddlmZmZmZmZmZddlmZddlmZmZmZm Z m!Z!m"Z"ddl#m$Z$m%Z%dd l&m'Z'm(Z(m)Z)dd l*m+Z+m,Z,m-Z-dd l.m/Z/m0Z0m1Z1m2Z2d Z3d Z4dZ5dZ6dZ7dZ8Gdde9Z:dZ;d<d<d<d<d<d<d<d<d<d<d<d<d<d<d <d<d!<d"<d#<d"<d$<d%<d&<d%<d'<d(<d)<d(<iZ=id*d+dd,dd-dd.dd/d$d0d!d1d'd2dd3dd4dd5dd6d%d7d"d8d(d9d:d;dd?d@dAdBdCdDdEdFdGdHd,dId.dJd-dKd/dLd0dMd1dNd2dd,dd.dd-d d/d#d1d0d2dOZ>gdPZ?gdQZ@gdRZAgdSZBgdTZCdUdVdWdXZDeEe>FD]ZGeGeDeGH<dYZIdZZJd[ZKd\d]fd^d_fd`dafgZLdbZMGdcdde9ZNGdedfeNZOGdgdheOZPGdidjeNZQdldkZRdS)mN)FloatIntegertext)exc)and_ascdesclabelnot_or_select) ColumnElementaliascasecastfunc)LveStatsPluginTerminated)gm_datetime_to_unixtimestamp gm_to_local local_to_gmround_1mstr_to_timedeltaunixtimestamp_to_gm_datetime)get_current_max_lve_idskip_user_by_maxuid) convert_bytesconvert_powers_of_1000mempages_to_bytes)HIDE_MAX_UID_LVE_PARAMETER read_config str_to_bool)LVE_STATS_2_TABLENAME_PREFIXhistory history_x60servers) HistoryShowHistoryShowUnionOutputFormatterget_lve_versioncttjgtj|k}|5}||}|jrE|}| ddddSt|dcdddS ddddS#1swxYwYdS)N lve_version) r r%r,where server_idbeginexecute returns_rowsfetchoneint)dbenginer.sql_query_lve_version transaction_cursor_ress lvestats/lib/lveinfolib.pyr)r).s="G$7#899??@QU^@^__    \&&'<==   ""$$C{        3}-..                          s4CC2CCCcvttjtjg}||SN)r r%r.r,r0)r4r5s r9 servers_infor<<s0"G$5w7J#KLL   1 2 22c6t|Sr;)strlower)key_s r9convert_key_to_labelrBAs 99T??r=ci}t|D]D\}}t|jtrt t ||}n|}|||<E|S)z Add label (on SQL add ".. as ..") to aggregate_func_dict key of dict convert to lowercase and add as label :param dict func_dict: :return dict: )listitems issubclass __class__rr rB) func_dictfunc_dict_labeledrAsqlalchemy_func func_labeleds r9add_labes_to_columnrLEsx!%ioo&7&7!8!8//o o/ ? ? + !5d!;!;_MMLL*L".$ r=cDt|ttfr|gS|Sr;) isinstancer?r3)args r9convert_to_listrPVs$#Sz""u Jr=ceZdZddZdZdZdZdZdZdZ d Z d Z d Z e dd Ze dZe dZe dZe dZe dZdS)r(Nc|pg|_t||_d|D|_g|_t |_|r|D]\}}|||dSdS)Nc6g|]}|Sr@.0_s r9 z,OutputFormatter.__init__..`s :::a :::r=)rowsrDfields_fields_lowered_ordersset_hidden_fields add_order)selfr[rZordersfieldorders r9__init__zOutputFormatter.__init__]sJB 6ll ::6::: !ee  - & - - uue,,,, - - - -r=cFjrfdjDSjS)Nc&g|] }|jv |SrT)r_)rWf_ras r9rYz.OutputFormatter.get_fields..js&NNN2$:M0M0MB0M0M0Mr=)r_r[ras`r9 get_fieldszOutputFormatter.get_fieldshs2   NNNNNNN N; r=c||_dS)z{ Use this method if you used hide_fields number items in row must bee same as in fields after hide N)rZ)rarZs r9set_rowszOutputFormatter.set_rowsns  r=c^|jt||_dS)z> :param tuple|list h_fields: :return: N)r_unionr^)rah_fieldss r9 hide_fieldszOutputFormatter.hide_fieldsus) #177H FFr=c2t|tr[ t||}n&#t$r}t d|d|d}~wwxYwt |dst d|d|jd|D|fdS)zp :param list|tuples fields: :param order: field to use to order result :return: z Non such z orderN__call__z input object z must be callablec6h|]}|SrTrUrVs r9 z,OutputFormatter.add_order..s 888Aaggii888r=)rNr?getattrAttributeError ValueErrorhasattrr]append)rar[rdes r9r`zOutputFormatter.add_order|s eS ! ! K Ce,,! C C C !:U!:!:!:;;B C5*-- K !I!I!I!IJJJ 88888%@AAAAAs( A AA ct|}g}t|j|D]e\}}||jvr|jD]9\}}||vr0 ||}#t t ttf$rY5wxYw:| |f|S)z8 :param iterable row_: :return: ) rDzipr\r_r] TypeErrorrwKeyError IndexErrorry)rarow_row_outfield_r_ order_fieldsrds r9 _convert_linezOutputFormatter._convert_lines Dzzd2D99  JFB,,,'+|  # e\))"U2YY%z8ZH* NN2    s AA32A3c#LK|jD]}||VdSr;)rZr)rars r9__iter__zOutputFormatter.__iter__s>I + +D$$T** * * * * + +r=ct|tr9tt|j|j|j|jS||j|Sr;)rNslicerDmaprrZstartstop)raindexs r9 __getitem__zOutputFormatter.__getitem__s[ eU # # UD. %+uz:Q0RSSTT T!!$)E"2333r=c*t|jSr;)lenrZris r9__len__zOutputFormatter.__len__s49~~r=c t|Sr;)rDris r9get_corrected_listz"OutputFormatter.get_corrected_listsDzzr= %m-%d %H:%Mc,||Sr;)strftime)valueformat_s r9rzOutputFormatter.strftimes~~g&&&r=cz|dS t|n#t$r|cYSwxYwt|dzdzS)N-d%)floatrwr?rs r9 percentagezOutputFormatter.percentagesY =3  %LLLL   LLL 53;#%%s  %%c(|dSt|SNr)rrs r9byteszOutputFormatter.bytess =3U###r=c(|dSt|Sr)rrs r9powers_of_1000zOutputFormatter.powers_of_1000s =3%e,,,r=ct tjt|jS#t$r|cYSwxYwr;)pwdgetpwuidr3pw_namer~rs r9usernamezOutputFormatter.usernamesD <E ++3 3   LLL s %( 77c@tj|S)zE Convert unix timestamp to datetime (local timezone) )datetime fromtimestamprs r9rzOutputFormatter.datetimes  ..u555r=NN)r)__name__ __module__ __qualname__rerjrlrpr`rrrrr staticmethodrrrrrrrTr=r9r(r(\s\ - - - - GGG B B B(+++444 '''\'&&\&$$\$ --\- \ 66\666r=r(cNg}g}|D]}t|}||}|dkrGt|tr|}n|j}|dt|dzzz }t ||}|||||S)z Enumerate if columns name or functions are duplicated Use for force add duplicate columns to select operator :param list|tuple columns: :return list|tuple: enumerated columns rX)r?countrNnamer ry)columnsoutput output_strc_c_str dubl_countc_names r9enumerate_duplicate_columnsrsFJ!!B%%e,, ??"c"" ! cC Q/// /Fvr""B b%    Mr=aCPUlCPUmCPUaVMemlVMemmVMemaEPlEPmEPaPMemlPMemmPMemaNproclNprocmNprocaIOlIOmIOaIOPSlIOPSmIOPSIDidcpumemmepmemphyionprociops cpu_limit mep_limit mem_limitlmemphyio_limitlnprocliopsVMemF mem_faultPMemF memphy_faultEPf mep_faultNprocF nproc_faultCPUf cpu_faultIOfio_faultIOPSf iops_faultuCPUuEPuVMemuPMemuIOuNprocuIOPS)rr)rrrrrrr)rrrrrrr)rrrrrrr)rrrrrrr)rrrrrrrFromToanyF)FROMTOANYFc(|dSt|Sr;)normalize_column_names)namess r9normalize_optional_column_namesr7s }t !% ( ((r=cXg}|D]$}|t|%|Sr;)rynormalize_column_name)rresultrs r9rr=s9 F33 +D112222 Mr=cH|rt|SdSr;)KEYS_NORMALIZATION_LOOKUP_TABLEupper)rs r9rrDs" =.tzz||<< 4r=10mcH|tj|jdzdzz S)N minutes)r timedeltaminutedts r9rKs$rH.ry2~7JKKKKr=1hcl|jr|dn|tjdz S)Nr)rr)hours)rreplacerr rs r9rrLs4bi]bjjj***R(BT[\B]B]B]=]r=1dc0|ddS)Nr)hourr)rrs r9rrMsbjjaj22r=c Vt|t|tjdzg}dg}t}tD]_\}}||d}||dz t |kr-|}|d|||`||d|d<g}t|D]]\} }||| dz || dz tt | f^|S)Nrr 1mr) rrr time_unit_ordersrinsertry enumerater3 total_seconds) period_from period_to period_groupstime_unit_list_from_order_fun time_unit order_fun from_to_pointfrom_to_groupsrs r9dyn_time_unit_groupsr)QsQk**HYAS\]A^A^A^5^,_,_`MVNO 0-- 9! -"233 =+ +/? /J/J J J'O  M 2 2 2  ! !) , , ,&}Q'788M!N%n55  y E6A: & ufqj(A3GWXaGbGbGpGpGrGrCsCs t     r=ceZdZ d"dZdZd#d Zd Zd$d Zd ZdZ dZ dZ dZ dZ dZdZdZdZdZdZdZdZdZd%dZdZdZdZd Zd!ZdS)&r&N localhost?rrFc||_||_t|t |_|5t t ||}|ddt||_ ||_ ||_ t| |_ |rt||_nK|j r+td|j vrtd|_n|j o |j d|_t| |_| |_| |_| |_|pt)jd|_||n t.j|_t5|jd |_t|tt8fr|nt;||_t|tt8fr|nt;||_|p| |_!tE|j tFtHztJztLzd ggd d gg |_'tQtS*tVd|_,dS)a Show different statistics from history table :param sqlalchemy.engine.base.Engine dbengine: database engine to use :param datetime.datetime|float|int period_from: start time retrieve data :param datetime.datetime|float|int period_to: end time retrieve data :param int|None|list|tuple uid: filter the output information to the user uid :param tuple|list show_columns: display columns in the order specified. If not, show all supported valid column names: 'aCPU', 'lPMem', 'uIO', 'uEP', 'lEP', 'aVMem', 'PMemF', 'lVMem', 'NprocF', 'anyF', 'aNproc', 'VMemF', 'ID', 'lCPU', 'aIOPS', 'aEP', 'aPMem', 'uPMem', 'lIO', 'lIOPS', 'uCPU', 'lNproc', 'aIO', 'uIOPS', 'EPf', 'uVMem', 'uNproc' :param str server_id: filtering the output for "server id" :param int time_unit: grouping output over an interval of time (in seconds) :param str|None order_by: sorting output by column name (supported by columns) :param str|tuple|list by_usage: filtering are grouped data for the percentage of the use of resources :param float by_usage_percentage: percent for the parameter setting 'by_usage' :param tuple|list|None by_fault: filtering data are grouped for quantity faults (None if it is not filtered) valid names: 'aCPU', 'lPMem', 'uIO', 'uEP', 'lEP', 'aVMem', 'PMemF', 'lVMem', 'NprocF', 'anyF', 'aNproc', 'VMemF', 'ID', 'lCPU', 'aIOPS', 'aEP', 'aPMem', 'uPMem', 'lIO', 'lIOPS', 'uCPU', 'lNproc', 'aIO', 'uIOPS', 'EPf', 'uVMem', 'uNproc' :param threshold: number faults for filtering the data are grouped (used together with by_fault) :param int|None limit: limit on the number of output data (if 0 or None, then the limit is not set) :return generator: returns a list/generator of data with the order set out in the 'show_columns' N)r4r.)r,rrrrSQLalivec"t|dS)N)roundxs r9rz&HistoryShow.__init__..sRWXY[\R]R]r=)rrrcBtt|dz dS)NgY@)r2r)items r9rz&HistoryShow.__init__..seDkkE>QST8U8Ur=)r[rbtrue)-r4uidrNr3_is_multi_uidsget_supported_columnsr)rr show_columnsr.r%rby_faultrorder_byby_usageby_usage_percentage thresholdlimitlogging getLoggerlogr# __table__tabler _table_aliverrr r!get_time_count time_countr( FIELD_MAX FIELD_AVERAGE FIELD_LIMIT FIELD_USAGEresult_correctorr!r getrhide_maxuid_lve)rar4r r!r9r<r.r%r>r?r@r=rArBrGrErJ show_idles r9rezHistoryShow.__init__gs>`! ",S#"6"66  0_V^js=t=t=tuuuL   4 ( ( (2<@@""7AA  ?1(;;DMM ] ?4V<< MM1&99DMM M>dmA.>DM7AA #6 " 2'+E22#/UUW5F !$*g66%kC<@@ oKKFbcnFoFo '1S%L&I&IvOkluOvOv$=(;(;(=(=!0$]*[8;FH]H]^)))+U+UV! ! !  +;==+<+<=WY_+`+`aar=c@|jgdd|jjjdkrF|jgdt |jgdt |jgdtdS)N) rrrrrrrrrc:tt|Sr;)r3r2r3s r9rz3HistoryShow.set_normalised_output..sCaMMr=)r[rdsqlite)rrrrrrrrrrrrrrrr)rrrrrrr)rrrrrr)rOr`r4url drivernamerr3rris r9set_normalised_outputz!HistoryShow.set_normalised_outputs ''aaa)) (    =  '8 3 3  ! + +$' ,   *  ! + +RRRZ] ,    ''IIIQb (     r=ch||j}|jj|j|jS)zX Generate WHERE created BETWEEN xxxxxxxxx AND yyyyyyyy :return: )rGccreatedbetweenr r!)rarGs r9_where_time_periodzHistoryShow._where_time_periods/ =JEw&&t'7HHHr=c6|jjj|jkS)zK Generate WHERE server_id = 'server_name' :return: )rGrZr.ris r9_where_server_idzHistoryShow._where_server_ids z|%77r=c ||j}|dkr|j}||jrjt|jjdkt tt|jj|jjtkS|jjdkSt|ttfr|j jjdkrYt!|jjt|jddijS|jjt|S|jj|kS)zGenerate WHERE id = 'user_uid'Nr`rrU literal_bindsTcompile_kwargs)rGr9rQrrZrr r rrrNrDtupler4rVrWrin_ expressioncompilestring)rar9rGs r9 _where_uidzHistoryShow._where_uids( =JE "99(C ;# GJNC-@-L-L(M(Muwz\r\t\tOt$u$u7:> ! dE] + + %} +x77EGJNN49955@HHYhjnXoHppwxxxwz~~d3ii0007:$ $r=cttj|j|jtjdktj|jk}ttdg |}tj }t| ddidd}|j||j|}|jdtj |z |ddS) z SELECT count(*) FROM lve_stats2_history WHERE id = 0 AND created BETWEN xxxx AND yyyy server_id = 'localhost' rcount(*)rbTrc  query time: %s)rr#r[r\r r!rr.r rr-timer?rhrrEdebugr4r0fetchall)rar-query time_startqdatas r9rIzHistoryShow.get_time_counts  O # #D$4dn E E J!O   /   Z(()**0077Y[[  ot-D EE F F N NtUX Y Y q}$$U++ 'z)ABBB}}q!!$$r=cttj|t|tz tS)z Generate aggregate function for calculate average for example sum(lve_stats2_history.cpu) / 60 :param item: :return: )rrsum_fun_time_countrrar7s r9_fun_avgzHistoryShow._fun_avg"s7DHTNNT$*>*>*@*@%%H%HH%PPPr=czttj|dktj|fgdS)a Generate aggregate function for calculate limit if column_limit is zero its mean no limit for example CASE WHEN (min(lve_stats2_history.cpu_limit) > 0) THEN max(lve_stats2_history.cpu_limit) ELSE 0 END :param item: :return: relse_)rrminmaxrzs r9 _fun_limitzHistoryShow._fun_limit+s4dhtnnq($(4..9:!DDDDr=c*tj|S)z Generate aggregate function for calculate fault for example sum(lve_stats2_history.cpu_fault) :param item: :return: )rrxrzs r9 _fun_faultzHistoryShow._fun_fault5sx~~r=ct||dkdf||dk||||z fgdS)a Generate aggregate function for calculate resource usage equivalent average/limit for example CASE WHEN ( CASE WHEN min(lve_stats2_history.cpu_limit) > 0 THEN max(lve_stats2_history.cpu_limit) ELSE 0 END IS NULL ) THEN NULL WHEN ( CASE WHEN min(lve_stats2_history.cpu_limit) > 0 THEN max(lve_stats2_history.cpu_limit) ELSE 0 END > 0 ) THEN ( sum(lve_stats2_history.cpu) / 1422 ) / CASE WHEN min(lve_stats2_history.cpu_limit) > 0 THEN max(lve_stats2_history.cpu_limit) ELSE 0 END END :param item: :return: Nrr})rrr{)rar7 item_limits r9 _fun_usagezHistoryShow._fun_usage>sw6,,4d;,,q0$--2E2EXbHcHc2cd       r=cttj|dktj|fgtj|S)a Generate aggregate function for calculate maximum resource usage; for backward capability with lve-stats 0.x for example: CASE WHEN (sum(lve_stats2_history.cpu_fault) > 0) THEN max(lve_stats2_history.cpu_limit) ELSE max(lve_stats2_history.cpu) END :param item: :param item_limit: :param item_fault: :return: rr})rrrxr)rar7r item_faults r9_fun_maxzHistoryShow._fun_maxbsA dhz**Q.0D0DEFdhW[nn]]]]r=cV|rtdS|jS)Nrl)_check_need_joinrrJris r9ryzHistoryShow._fun_time_countts,  " " # ## #? "r=c|jr|jS|r|j}n|j}|jjjdkr?t|j j |jz |j z t|j z|jzStj|j j |jz |j z |j z|jzS)NrU)r:r rrHrGr4rVrWrrZr[r%rrfloor)ra_tables r9_fun_time_fromzHistoryShow._fun_time_fromzs   # #$$&& $*} +x77&(*T-==OQXYY\`\jj&' J 043C Ct~UVVY]Ygg&'r=cV|jr|jS||jzSr;)r:r!rr%ris r9 _fun_time_tozHistoryShow._fun_time_tos.   :> !&&((4>9 9r=c|jrtd|jjjStdt t |jSNr)r:r rGrZrrr?r9ris r9 _fun_user_idzHistoryShow._fun_user_idsC   4tz|// /tCMM2233 3r=c&|dkrtj|jjj|jjjz|jjjz|jjjz|jjjz|jjj z|jjj z}n|dkr| }n|dkr| }n|dkr| }nt|}t|jj|}|t vr||}n^|t$vr||}n>|t(vr||}n|t,vratt$t,|}t|jj|}|||}n|t2vrtt$t2|}tt(t2|}t|jj|}t|jj|}||||}|S)a Function for obtain aggregate function (or column name) by column name :param item: 'aCPU', 'aVMem', 'aPMem', 'aEP', 'aNproc', 'aIO', 'aIOPS', 'lCPU', 'lVMem', 'lPMem', 'lEP', 'lNproc', 'lIO', 'lIOPS', 'CPUf', 'VMemF', 'PMemF', 'EPf', 'NprocF', 'IOf', 'IOPSf', 'uCPU', 'uVMem', 'uPMem', 'uEP', 'uNproc', 'uIO', 'uIOPS', 'mCPU', 'mVMem', 'mPMem', 'mEP', 'mNproc', 'mIO', 'mIOPS', 'anyF', 'ID', 'From', 'To' :type item: str :return: rrrr)rrxrGrZrrrrrrrrrrFIELD_TO_TABLE_COLUMNrurLr{rMr FIELD_FAULTrrNrrrKr) rar7fun_ column_name table_columncolumn_name_limittable_column_limitcolumn_name_faulttable_column_faults r9_aggregate_fun_casezHistoryShow._aggregate_fun_cases9 6>>8 &*,+,*,()*,*+*,( ) *,' ( *,) *DDT\\$$&&DD V^^&&((DD T\\$$&&DD/5K"4:<==L}$$}}\22$$|44$$|44$$$9+kFWFWX\F]F]:^$_!%,TZ\;L%M%M"|5GHH""$9+iooVZF[F[:\$]!$9+iooVZF[F[:\$]!%,TZ\;L%M%M"%,TZ\;L%M%M"}}\3EGYZZ r=ctj}tj}jr%|jjj}nL| }j r= j }| t|n`jr2| tjjjn'| |rg}|D]}|tvrDt|}j t$|k} nYt&|}j t(|z |k} || |t/||r*fd|D} |t/| jdkr!j|j}|S)NcLg|] }j|k!SrT)rAr)rW funk_key_ras r9rYz/HistoryShow._group_by_query..s/tttYbt~1I1I)1T1TTtttr=r)rPr?r=r:group_byrGrZrrrr>rappend_order_byr rrLrr@rNrKrMry append_havingr rB) ra select_query by_usage_list by_fault_listrsorder_by_aggregate_funcfilter_fun_listr7r filter_funby_fault_filters ` r9_group_by_queryzHistoryShow._group_by_querysX' 66 ' 66   _ ))$*,/::EE !))$*=*=*?*?@@II$J[J[J]J]^^E = =&*&>&>t}&M&M #  ! !$'>"?"? @ @ @ @" =%%c$*,/&:&:;;;;%%d&9&9&;&;<<<  7 O% 3 3=(()//55E!%!9T=U=UVabgVh=i=i!iJJ%OOD11E!%!9D FROM ... :return: )rr)r<rrNrDextendr ry)racolumns_agregate_func column_key column_funs r9_columns_queryzHistoryShow._columns_querys !#+ 9 9J11*==J*d++ 9%,,Z8888^33!&z:!>!>J%,,Z8888$$r=chd}t|t|j|jhzt|jp tzzS)N>rrrrrrrrrrrrrr)boolr^r<r>r?)rars r9_check_need_time_countz"HistoryShow._check_need_time_countsW    Gs4#455G#dmNd_b_d_dJeJeefgggr=c:|o|j Sr;)rr:ris r9rzHistoryShow._check_need_joins**,,HT5H1HHr=c ||}|rDt||j|d|j}n4t||}|jr"t||}t||}|r~|j |j t|jj j |j j j k||j }||}|S)z' :type need_join: bool N)rGr)r9rG)r9)rrr]rHrjr.r_r r- outerjoinrGrZr[r9 select_from)racolumns_ need_join where_queryrs _table_joineds r9rzHistoryShow.select_querysA  **,,H  M''d.?'@@$//VW_c_p/BqBqKKt6688$//:K:KLLK > E{D,A,A,C,CDDKx  &&{33  5 -77 D!2!4!< @T!TVZVeVejnjrVeVsVsttM%%m44E r=c|}|||}||}|SN)rr)rrrr)rarrss r9 main_queryzHistoryShow.main_query1sO&&((!!8t?T?T?V?V!WW$$U++ r=ct|||}t t j|jjj t j |jjj g |}tj }t|ddidd}|j||j|}|jdtj |z |dS)a SELECT MIN(created) AS MinCreated, MAX(created) AS MaxCreated FROM lve_stats2_history WHERE id = AND created BETWEEN 'xxxx' AND 'yyyy' AND server_id = 'localhost'; rbTrcrmrnror)rr]rjr_r rrrGrZr[rr-rpr?rhrrErqr4r0rr)rarrsrtrurvs r9_min_max_createdzHistoryShow._min_max_created7s42244doo6G6GI^I^I`I`aa !566AU8V8VWXX^^_jkkY[[  ot-D EE F F N NtUX Y Y q}$$U++ 'z)ABBB}}q!!r=c"|\}}||jStt|}tt|}t ||}g}t |D]\}}} t j|} tt|| _ tt|dz | _ | | _ d| _ | | |S)Nrr)rrOrrr)reversedcopyrrr r!r%rBrproceed) ra min_created max_createdr r!time_unit_groupsrZ_from_to _time_unit self_copys r9proceed_dyn_time_unitz!HistoryShow.proceed_dyn_time_unitLs#'#8#8#:#: [  ( (!">{"K"KLL  <[ I IJJ / YGG&./?&@&@ - - "E3  $I$@UASAS$T$TI !">{3?O?O"P"PST"TI ",I IO KK ))++ , , , , r=c@|jtks |jgkrgS|j.t|jttfs |jdkrgS|}t j}t |ddi}|j | dd|j } | |}|j dt j|z ||j_||jS#t$$r(}|t%|d}~wwxYw)NrrbTrcrmrnro)r9rerNrDrrpr?rhrErqrr4connectr0rrrOrZcloser)rarsrtruconncursorrzs r9rzHistoryShow.proceed`sc 8uww  $(b..I 8  48dE](K(K PTPX\]P]P]I!!Y[[  ot-D EE F F qyys++,,,}$$&& )\\%((F HNN+TY[[:-E F F F)/):):D ! & JJLLL( ( ( 4 4 4 JJLLL*,,! 3 4s.A"E++ F5#FFcDfdDS)NcTg|]$}ttj|%SrT)dictr|r<)rW items_valras r9rYz,HistoryShow.proceed_dict..xs.XXXIS*I6677XXXr=)rris`r9 proceed_dictzHistoryShow.proceed_dictws%XXXXXXXXr=)NNr+NNNr,NrrNNNFr;)r`N)NF)rrrrerXr]r_rjrIr{rrrrryrrrrrrrrrrrrrrrTr=r9r&r&fs  %VbVbVbVbp$ $ $ LIIII888%%%%6%%%"QQQEEE" " " H^^^$### (:::444 ---^)))V%%% hhh&III, """*())).YYYYYr=r&c eZdZdZdZdZdS)_HistoryShowX1cptj|g|Ri|d|jvrdg|jz|_g|_dSr)r&rer<_labelsraargskwargss r9rez_HistoryShowX1.__init__|sNT3D333F333 t( ( (!%): :D  r=c|dkrt|jjj|jjj|jjj|jjj|jjj|jjj|jjjg}n|dkr!td|jjj }n|dkr |j }n|dkr |j }nt|}t|jj|}|tt zt"zvrt||}n8|t$vr]tt t$|}t|t|jj|}||g}n|t(vrtt t(|}tt"t(|}t|t|jj|}t|t|jj|}t|dz|} |||| g}|S)! :type item: str rrrrr_max)rGrZrrrrrrrr rr r!rrurLrMrrNrrK) rar7rrrrrrrtable_column_maxs r9rz"_HistoryShowX1._aggregate_fun_cases 6>> & ) & ( & % 'DDT\\tz|//DD V^^#DD T\\>DD/5K"4:<==L 3kABB[,77$$$9+kFWFWX\F]F]:^$_!%*+f>f%g%g"$&89""$9+iooVZF[F[:\$]!$9+iooVZF[F[:\$]!%*+f>f%g%g"%*+f>f%g%g"#(v)=|#L#L $&8:LN^_ r=c\g}|j|jpgz}|jrt|jD]}|tvr;t|}|t|Ft|}| t||g|j r||j |D]}| |}t|trX|D]T}t|drB|j|jvr4|||j|jUt|drB|j|jvr4|||j|j|S)Nr)r<r=r?rPrLrryrNrKrrr>rrNrDrxrr)rarr<r7rrrrs r9rz_HistoryShowX1._columns_querys "(DM,?R@ = D' 66 D D=(()//55E '' E(:;;;;%OOD11E ''U);T(BCCCC = /    . . .& 9 9J11*==J*d++ 9&77DtV,,7$,1N1N-44T::: ++DI6667 :v..9:?$,3V3V)00<<<L'' 888$$r=N)rrrrerrrTr=r9rr{sB $$$L%%%%%r=rc*eZdZdZdZdZdZdZdS)_HistoryShowX60ictj|g|Rdtji||\|_|_|dp||_ dS)NrGrJ) rrer$rFget_history_x60_from_tor r!rPrIrJrs r9rez_HistoryShowX60.__init__spStSSS;3HSFSSS,0+G+G+I+I($. **\22Kd6I6I6K6Kr=c^|j|jfdkrdSt|S)Nrr)r r!rrIris r9rIz_HistoryShowX60.get_time_counts0  dn - = =1,,T222r=cj|j|jz |jkrdS|jjj|j|jz|j}ttj |jjjtj |jjjg t|| }tj}|jt#|ddidd|j|d}|jdtj|z |\}}|||jz d z|fS|S) zG calculate present in aggregate table from and to time rrbTrcrmrnrroNr)r!r AGGREGATE_PERIODrGrZr[r\r rrrr-rr_rprErqr?rhrr4r0rr)ra between_queryrsrtr create_min create_maxs r9rz'_HistoryShowX60.get_history_x60_from_tosl >D, ,0E E E: ,44T5EH]5]_c_mnn !566AU8V8VWXX^^  5 5 7 7 8 8  Y[[  s5==$8O=PPQQYYZ^`cddeee&&u--6688; 'z)ABBB!' J  ! 559:E EMr=c|tvrIt|}t|jj|}t |||jjjzSt||S)r) rLrrurGrZr rprr)rar7rrs r9rz#_HistoryShowX60._aggregate_fun_cases^ = /5K"4:<==LlTZ\5F&FGG G!55dDAA Ar=N)rrrrrerIrrrTr=r9rrs^LLL333 * B B B B Br=rc,eZdZdZdZdZdZddZdS)r'z= Class for retrieve statistics data using two tables cBtj|g|Ri|tdz|_|d|jit |i||_t|i||_ |jj duo|j |_ |j r| |_dSdS)NrnrJ)r&rer"_aliasupdaterJrx60rx1r!r: _need_union_select_union_queryrGrs r9rezHistoryShowUnion.__init__sT3D333F3332W<  |T_5666"D3F33 $1&118-T9Qd>Q   41133DJJJ 4 4r=c|jr|tvrt|}ttt|}tt t|}t |jj|}t |jj|}t |jj|dz}| |||}|St ||S)rr) rrKrrMrrrurGrZrr&r) rar7rrr column_limit column_fault column_maxrs r9rz$HistoryShowUnion._aggregate_fun_cases   ? 1 1/5K 5k)//RVBWBW6X Y  5k)//RVBWBW6X Y "4:<1BCCL"4:<1BCCL {V/CDDJ==\<HHDK224>> >r=c tj5tjdtj|jt|jj j j |j j|j j}||j }t#||j}dddn #1swxYwY|S)z" union two tables ignore)categoryN)warningscatch_warnings simplefiltersa_exc SAWarningrrr-r rGrZr[r\rr r! union_allrr)ra union_querys r9rz$HistoryShowUnion._select_union_querys $ & & : :  !(V5E F F F F'..0066TW]_,44TX5I48K]^^__K&//0E0E0G0GHHK T[99K  : : : : : : : : : : : : : : :sCC77C;>C;Nch|jrt|St|||Sr)rr r&r)rarrs r9rzHistoryShowUnion.select_query#s7   Z(## #++D8y+YY Yr=r)rrr__doc__rerrrrTr=r9r'r'se444???   ZZZZZZr=r'cg}|dkr$gd}||dkr|gdnO|dkr$gd}||dkr|gdn%|#gd }||dkr|gd |S) z preparation list columns depending of the lve version :type mode: Union[None, str] :type lve_version: Union[None, int] v1)rrrrrrrrrrrrrrrrrrrrrrNr+)rrrv2)rrrrrrrrrrrrrrrrrr)rrr)rrrrrrrrrrrrrrrrrrrrrrrrrrrrrr)rrrrr)r)r,moders r9r;r;*s G t||   0  +// NN666 7 7 7    (  +// NN666 7 7 7    @  +// NNHHH I I I Nr=r)SrrrCrrpr sqlalchemyrrrrrsqlalchemy.sqlrrr r r r r sqlalchemy.sql.expressionrrrrrlvestats.core.pluginrlvestats.lib.commons.dateutilrrrrrrlvestats.lib.commons.funcrrlvestats.lib.commons.sizeutilrrrlvestats.lib.configrr r! lvestats.ormr"r#r$r%__all__r)r<rBrLrPobjectr(rr@usage_to_limit_dictrrLrMrrNrKrrDkeyskeyrrrrrr)r&rrr'r;rTr=r9rsI  ++++++++++$$$$$$DDDDDDDDDDDDDDDDDDLLLLLLLLLLLLLL999999cbbbbbbbbb UTTTTTTTTTTT S   333 " y6y6y6y6y6fy6y6y6x: LLNNFLLNN LLNNFLLNN MMOOW]]__ MMOOW]]__ KKMM5;;== KKMM5;;== MMOOW]]__ MMOOW]]__ NNhnn&& NNhnn&& KKMM5;;== KKMM5;;== MMOOW]]__ MMOOW]]__"%$% E% U% 5 %  X %  4 % g% V% K% ;% [% Y% :% h% W%  [!%" ^#%%$ ;%%& m'%( K)%* :+%, \-%. E/%0 51%2 U3%4 X5%6 47%8 g9%: V;%< E=%> 5?%@ UA%B XC%D gE%%F  I%%%NLKK III III III G G G +1v"N"N 4%**,, - -77C36#CIIKK00)))  K KL ] ]^ 2 23*RYRYRYRYRY&RYRYRYjH%H%H%H%H%[H%H%H%V-B-B-B-B-Bn-B-B-B`1Z1Z1Z1Z1Z{1Z1Z1Zh\\\\\\r=