
    Ѷ'iz                         d dl Z d dlZd dlmZ d dlmZmZ ddlmZ ddl	m
Z
mZmZmZmZmZ ddlmZmZmZmZmZmZ  G d d	e          ZdS )
    N)MongoClient)ConnectionFailureOperationFailure   )BaseDBHandler)PATTERNSCOLUMN_NAMESCONNECTION_TEMPLATESDEFAULT_DATABASESRESULT_LIMITSSPECIAL_METHODS)DB_METHOD_MAPPINGSHOW_MAPPINGRS_METHOD_MAPPINGSH_METHOD_MAPPINGCOLLECTION_METHOD_MAPPINGCOMMAND_PROCESSORSc                   v    e Zd Zd Zd ZddZddZd Zd ZddZ	dd	Z
d
 Zd Zd Zd Zd Zd Zd Zd ZdS )MongoDBHandlerc                 X   |r|                                 sd S |                                 }	 t          j        |          S # t          j        $ rX 	 |                    dd          }t          j        |          cY S # t          j        $ r}t          d|           |d }~ww xY ww xY w)N'"zInvalid JSON parameter: )stripjsonloadsJSONDecodeErrorreplace
ValueError)self	param_strparam_cleanfixed_parames        D/Users/user/workspace/sujinbaek/cqa-test-app/products/dbs/mongodb.py_safe_json_parsezMongoDBHandler._safe_json_parse   s     		 1 1 	4oo''	P:k***# 	P 	P 	PP)11#s;;z+.....' P P P !GI!G!GHHaOP		Ps/   A B))A>;B)>B%B  B%%B)c                     |t           v r"|                     t           |         |          S |                     dd|           S )Ncolumns_namesresults  zUnknown result format: )r	   make_success_responsemake_error_response)r   
column_keyresult_datas      r$   _format_simple_resultz$MongoDBHandler._format_simple_result   sV    %%--*:6# .    ''-Sz-S-STTT    Nc                     |                      |||          }|rB|t          v r9t          |         }|                     |d          |d         |                    S |S )Nresult_keys	processorr'   )_execute_db_commandr   r+   )r   dbcommand_namecommand_paramsprocessor_keyresultr3   s          r$   _process_command_resultz&MongoDBHandler._process_command_result&   st    ))"lNKK 	].@@@*=9I--'6.	+.v66 .    r0   c                 L    |r |j         |fi |S |                     |          S N)command)r   r5   r6   r7   s       r$   r4   z"MongoDBHandler._execute_db_command1   s6     	,2:l==n===::l+++r0   c                 :   |                                 sg S |                     |          }g }|D ]}|                                                     dd          }|dk    s|dk    r|                    i            L	 |                    |                     |                     v# t
          $ rh 	 t          j        dd|          }|                    |                     |                     n%# t
          $ r}t          d|           |d }~ww xY wY w xY w|S )Nr   r   z{} (\$\w+):"\1":zInvalid parameter: )r   _split_function_parametersr   appendr%   r   resub)r   
params_strparamsparsed_paramsparamr"   r#   s          r$   _parse_method_parametersz'MongoDBHandler._parse_method_parameters7   s^   !! 	I00<< 	O 	OEKKMM))#s33E}}$$R((((O!(()>)>u)E)EFFFF! O O OO&(f[(E&J&J%,,T-B-B;-O-OPPPP% O O O()Fu)F)FGGQNO QPO s6   =(B&&
D1>C0/D0
D:DDDDc                 D    |t           v rt          |         ||          S d S r<   )r   )r   collection_namemethod_namerG   s       r$   _build_collection_commandz(MongoDBHandler._build_collection_commandM   s(    333,[9/6RRRtr0   c                 d   	 |                     d          s|                     d          r|}d|v rHd|v rD|r|s|                     dd          S |                    d|                              d|          }|rt          j        t
          d         |          }|r@|                    |                    d          |                    d	          |z             }nd
|v r|                    d
d| d
          }nn|d| z  }ne|r4|r2t          d                             ||||pt          d                   }n/t          d                             ||pt          d                   }t          |ddddd	          | _        | j        j                            d           d}d|v rd}nd|v rd}n
d|v rd|v rd}|                     d| d          S # t          $ r#}|                     dd |           cY d }~S d }~wt           $ r#}|                     dd!|           cY d }~S d }~ww xY w)"Nzmongodb+srv://z
mongodb://z
{USERNAME}z
{PASSWORD}  z=Username and password are required for this connection stringconnection_dbr   r   ?/	with_authgeneral)userpasswordservicedatabasewithout_auth)rX   rY   i0u  F)serverSelectionTimeoutMSconnectTimeoutMSsocketTimeoutMSretryWriteswpingunknownzreadPreference=primaryPreferredprimaryz!readPreference=secondaryPreferred	secondaryzreadPreference=secondaryznodeType:analytics	analyticsz#Successfully connected to MongoDB ()r*   zIInternal Server Error, Failed to connect to MongoDB: Connection failed - z5Internal Server Error, Failed to connect to MongoDB: )
startswithr,   r   rD   searchr   groupr
   formatr   r   mongodb_clientadminr=   make_connection_responser   	Exception)	r   rX   rV   rW   rY   connection_stringmatchconnection_typer#   s	            r$   connectzMongoDBHandler.connectR   s,   0	n!!"233 w7I7I,7W7W $+!#444IZ9Z9Z ~x ~#77=|}}}(9(A(A,PT(U(U(](]^jlt(u(u% @Ih&?ARSSE @,=,E,EekkRSnnV[VaVabcVdVdgoVo,p,p))"3330A0I0I#S[0_0_---X?- H (<[(I(P(P!Hg!)!I->y-I )Q ) )%%
 )=^(L(S(S '(2Z>OPY>Z )T ) )% #.!).!& %!# # #D %--f555'O04EEE"+48III"-+/@@@EY]nEnEn"-001iWf1i1i1ijjj  	B 	B 	B++C  2A}~  2A  2A  B  B  B  B  B  B  B  B 	n 	n 	n++C1lij1l1lmmmmmmmm	ns7   AG FG 
H/!G?9H/?H/H*$H/*H/c                    	 | j         |pd         }|                                }|                    d          s|                    d          s?|                    d          s*|                    d          s|                    d          r/|                     |          }t	          |t
                    r|}n-|S |                     dd          S |                     |          }|                     ||          S # t          j
        t          f$ r#}|                     dd	|           cY d }~S d }~wt          $ r#}|                     d
d|           cY d }~S d }~ww xY w)Ntest{zdb.rs.sh.zshow rP   zInvalid query format. Use JSON format or MongoDB shell syntax (e.g., db.collection.find({}), show dbs, rs.status(), sh.status())zInvalid JSON format: r*   z=Internal Server Error, Please check the query and try again: )rj   r   rf   _parse_mongo_shell_syntax
isinstancedictr,   r%   _execute_mongodb_commandr   r   r   rm   )r   queryrY   r5   query_stripped	query_objr#   s          r$   execute_queryzMongoDBHandler.execute_query   s   	v$X%78B"[[]]N!,,S11 9"--e44 }"--e44}"--e44} #--g66}
 !::>JJE!%.. %$)		$33C  :|  }  }  } 11%88	00Y???$j1 	N 	N 	N++C1L1L1LMMMMMMMM 	v 	v 	v++C1tqr1t1tuuuuuuuu	vs<   B:C> =C> *C> >E"D2,E"2E"?EE"E"c                   ) dv r|d                  }                     di           }t          |                    |                    }|D ]}d|v rt          |d                   |d<   |r't          |d                                                   ng )|                     ))fd|D                       S dv rV|d                  }d         }|                    |          }|                     t          |j                   d	
          S dv rb|d                  }d         }	d}
|	D ].}|	                    |d         |d                   }|
|j
        z  }
/|                     |
 d
          S dv r[|d                  }d         }d}|D ]'}|                    |d                   }||j        z  }(|                     | d
          S                      d          r|                     |dd          S                      d          r|                     |dd          S                      d          r|                     |dd          S                      d          rU|                    dd                   }|                     dg           }|                     g dd |D                       S                      d          r|                     |dd          S dv rt                    dk    r&d         dk    r|                     dgdgg          S dv r?t                    dk    r,d                                  D             } |j        di |}n|                    dd                   }g }|                                D ]-\  }}|d!vr$|                    |t          |          g           .|                     d"d#g|d d$                   S d%v rQ|d%                  }                     d&i           }|                    |          }|                     d%|gg          S                      d'          r7|                     d(d) | j                                        D                       S                      d*          r2|                     d+d, |                                D                       S                      d-          rU|                    d-d-                   }|                     d.g           }|                     g d/d0 |D                       S                      d1          rZ|                    d1d1                   }|                     d2gd3 |                     d4g           d5d          D                       S d6v r\|                              }|                     dd7g|                     d7          rd8nd9|                     d7d          gg          S d:v rNd:         }d;                                 D             } |j        |fi |}|                     d<gd=gg          S d>v r7d>         }|                    |           |                     d<gd?gg          S d@v r9| j                            |j                   |                     d<gdAgg          S dBv rqdB         }||         }dC         }|D ]<}|                    t          |dD                                                              =|                     d<gdEgg          S dFv rdF         }||         }dG         }t7          |t8                    r7t          |                                          }|                    |           n@t7          |t                    r|                    |           n|                    |           |                     d<gdHgg          S dIv rTdI         }||         }t          |                                          }|                     g dJdK |D                       S dLv rBdL         }||         }                     dMg           }|r4dNt          |d                   v r|                     dOgdP|z   gg          S 	 |                    |          }t          |          }|ru|d         r't          |d                                                   ng )|D ]}d|v rt          |d                   |d<   |                     ))fdQ|D                       S |                     d<gdRgg          S # t@          $ r#}| !                    dSdT|           cY d }~S d }~ww xY w                     dU          r|                    dU          }|                     dVi           }|                     g dW|                     ddX          |                     dYd          t          |                     dZg                     gg          S                      d[          rL|                    d[          }|                     g d\d] |                     dZg           D                       S tE          fd^d_D                       r|                    d`v rn          }dav r|                     d<gdbgg          S dcv rD|                     dddeg|                     dddf          |                     ded          gg          S dgv rY|                     g dh|                     didX          |                     d%d          |                     djd          gg          S d`v rY|                     g dk|                     dldX          |                     dmd          |                     dnd          gg          S dov rZ|                     dpi           } |                     dqdrg|                      dqdX          |                      drd          gg          S d S dsv r`|                    ds          }|                     dti           }!|                     g dudv |!                                D                       S dwv r|                    dw          }|                     dxi           }"g }#t          |"                                          d dy         D ]\  }$}%t7          |%t8                    radz|%v r]|%                     dzi           }&t7          |&t8                    r-|&                     d{d          }'|&                     d%d          }(n	d}'d}(nd}'d}(|#                    |$|'|(g           |                     g d||#          S | !                    d}d~          S )Nfindfilter_idr   c                 .    g | ]fd D             S )c                 V    g | ]%}t                              |d                     &S r?   strget.0coldocs     r$   
<listcomp>zFMongoDBHandler._execute_mongodb_command.<locals>.<listcomp>.<listcomp>   s/    IIIC#cggc2..//IIIr0    r   r   r(   s    @r$   r   z;MongoDBHandler._execute_mongodb_command.<locals>.<listcomp>   s/    ]]]cIIII=III]]]r0   r'   insert	documentsz documents inserted)r)   updateupdatesquz documents updateddeletedeletesz documents deleted	buildInfo)r8   serverStatus	currentOp	usersInfousers)rV   rY   rolesc           
          g | ]P}|                     d d          |                     dd          t          |                     dg                     gQS )rV   r?   r5   r   r   r   )r   rV   s     r$   r   z;MongoDBHandler._execute_mongodb_command.<locals>.<listcomp>   sT    rrrdh$((62..r0B0BCQXZ\H]H]D^D^_rrrr0   connectionStatusgetParameterr   infozNgetParameter requires specific parameter name or use getParameter: '*' for allc                 &    i | ]\  }}|d k    ||S r   r   r   kvs      r$   
<dictcomp>z;MongoDBHandler._execute_mongodb_command.<locals>.<dictcomp>   s(    XXXtq!ADWDWaDWDWDWr0   )okz$clusterTimeoperationTime	parametervalue   countr{   listDatabasesdatabase_listc                     g | ]}|gS r   r   )r   db_names     r$   r   z;MongoDBHandler._execute_mongodb_command.<locals>.<listcomp>   s    TTTw'TTTr0   listCollectionscollection_listc                     g | ]}|gS r   r   )r   r   s     r$   r   z;MongoDBHandler._execute_mongodb_command.<locals>.<listcomp>   s    ===3#===r0   	rolesInfor   )rolerY   
privilegesc           
          g | ]P}|                     d d          |                     dd          t          |                     dg                     gQS )r   r?   r5   r   r   )r   r   s     r$   r   z;MongoDBHandler._execute_mongodb_command.<locals>.<listcomp>   sT    wwwim$((62..r0B0BCQ]_aHbHbDcDcdwwwr0   getLoglog_entriesc                     g | ]}|gS r   r   )r   logs     r$   r   z;MongoDBHandler._execute_mongodb_command.<locals>.<listcomp>  s    FFF3#FFFr0   r   ikillOpr   zOperation terminatedzFailed to terminate operationcreatec                 &    i | ]\  }}|d k    ||S )r   r   r   s      r$   r   z;MongoDBHandler._execute_mongodb_command.<locals>.<dictcomp>  s#    KKK1Q(]]q!]]]r0   r9   zCollection created successfullydropzCollection dropped successfullydropDatabasezDatabase dropped successfullycreateIndexesindexeskeyzIndex created successfullydropIndexesindexzIndex dropped successfullylistIndexes)namer   uniquec           	          g | ]P}|                     d d          t          |                     di                     |                     dd          gQS )r   r?   r   r   Fr   )r   idxs     r$   r   z;MongoDBHandler._execute_mongodb_command.<locals>.<listcomp>D  sT    uuufi#''&"--s3775"3E3E/F/FPXZ_H`H`auuur0   	aggregatepipeline$changeStreamstatusz*Change stream initialized for collection: c                 .    g | ]fd D             S )c                 V    g | ]%}t                              |d                     &S r   r   r   s     r$   r   zFMongoDBHandler._execute_mongodb_command.<locals>.<listcomp>.<listcomp>\  s/    !Q!Q!QC#cggc2&6&6"7"7!Q!Q!Qr0   r   r   s    @r$   r   z;MongoDBHandler._execute_mongodb_command.<locals>.<listcomp>\  s0     e e eVY!Q!Q!Q!Q=!Q!Q!Q e e er0   zNo results from aggregationr*   zAggregation error: replSetGetConfigconfig)r   versionmembers_countr?   r   membersreplSetGetStatus)r   statestateStrhealthc           	          g | ]X}|                     d d          |                     dd          |                     dd          |                     dd          gYS )r   r?   r   r   r   r   r   )r   ms     r$   r   z;MongoDBHandler._execute_mongodb_command.<locals>.<listcomp>p  sr      O  O  Oop!%%++QUU7A->->jRT@U@UWXW\W\]eghWiWij  O  O  Or0   c              3       K   | ]}|v V  	d S r<   r   )r   cmdr}   s     r$   	<genexpr>z:MongoDBHandler._execute_mongodb_command.<locals>.<genexpr>r  s(      iic	!iiiiiir0   )collModvalidate	collStatsdbStatshostInfor   r   z Collection modified successfullyr   validnrecordsFr   )nsr   sizer   r   )r5   collectionsobjectsr5   r   r   r   systemhostnamenumCoresconnPoolStatspools)hostinUse	availablecreatedc           	          g | ]G\  }}||                     d d          |                     dd          |                     dd          gHS )r   r   r   r   r   )r   r   pools      r$   r   z;MongoDBHandler._execute_mongodb_command.<locals>.<listcomp>  si      I  I  Ilvlprv$! 4 4dhh{A6N6NPTPXPXYbdePfPfg  I  I  Ir0   toptotals
   totaltime)
collection
total_timer   rP   zUnsupported MongoDB query format. Use JSON format with operations like find, insert, update, delete or MongoDB shell syntax (e.g., db.collection.find({}), show dbs, rs.status(), sh.status())r   )#r   listr   r   keysr+   insert_manyleninserted_idsupdate_manymodified_countdelete_manydeleted_countr:   r=   itemsrC   count_documentsr/   rj   list_database_nameslist_collection_namescreate_collectiondrop_collectiondrop_databaser   create_indexrx   ry   
drop_indexlist_indexesr   rm   r,   any)*r   r5   r}   r   filter_queryr)   r   r   r9   r   total_modifiedr   r   total_deletedr   r   
param_dictrG   r   r   query_filterr   r   rL   optionsr   
index_spec
index_listr   cursorr#   r   r   r   r   processed_resultscollstats
total_infotime_val	count_valr(   s*     `                                      @r$   rz   z'MongoDBHandler._execute_mongodb_command   s    YIf-.J$==266L:??<8899G 1 1C<<!$SZCJ7>FD!2!2333BM--+]]]]U\]]] .    ""Ih/0J!+.I++I66F--v233HHH .    ""Ih/0J	*GN! 8 8#//sVC[II&"77--)=== .    ""Ih/0J	*GM! 6 6#//s<<!55--(<<< .   
 ]];'' T	s//K{/[[[]]>** R	s//NR`/aaa]];'' P	s//K{/[[[]];'' N	sZZY{-CDDFJJw++E--;;;rrlqrrr .    ]]-.. G	s//4FVh/iiiy((9~~""y'@A'E'E11#)(nop 2     9,,Y!1C1CXXy/@/@XXX
#AAjAANIn4MNNF$llnn 5 5
UEEEMM3E

"3444--*G4ss .    	!!Ig./J$=="55L..|<<E--gyAAA]]?++ k	s--oTT$*=*Q*Q*S*STTTV V V]],-- h	s--.?=="":":"<"<===? ? ?]];'' e	sZZY{-CDDFJJw++E--@@@wwqvwww .    ]]8$$ ^	sZZ)H*=>>F--,oFF&**UB*?*?*EFFF .    ""ZZ	**F--%tn4:JJt4D4Di00Jikqkukuvz|}k~k~  A .    ""'1OKK	(9(9KKKG)R)/EEWEEF--'j;<= .    y  '/O///--'j;<= .    y((--bg666--'j9:; .    	))'8OO,J	*G% I I
''Z->-D-D-F-F(G(GHHHH--'j678 .    i'''6OO,J"7+J*d++ 2!*"2"2"4"455
%%j1111J,, 2%%j1111%%j111--'j678 .    i'''6OO,J:224455G--777uumtuuu .    I%%'4OO,J }}Z44H Os8A;/?/???11#+*J_\]^ 2   P#--h77v,, ?Fqz$QD):):$;$;$;rM& 9 9 C<<),SZCJ55&3 e e e e]d e e e 6   
  55'/j"?!@ A 6     P P P//5N15N5NOOOOOOOOP]]-.. ;	sZZ 233FZZ"--F--AAA **UB//Iq1I1I3vzzZcegOhOhKiKijk .    ]]-.. 4	sZZ 233F--EEE O  Otzt~t~  @I  KM  uN  uN  O  O  O .    iiii-hiiiii .	sZZY)-C-C		SSFI%%11
VxUyTz1{{{y((11*@Uagakaklsuza{a{  ~D  ~H  ~H  IS  UV  ~W  ~W  aX  `Y1  Z  Z  Z	))11@W@W@Wcicmcmnrtvcwcwy  zD  zD  EL  NO  zP  zP  RX  R\  R\  ]c  ef  Rg  Rg  ch  bi1  j  j  ji''11@`@`@`lrlvlvw{}  mA  mA  CI  CM  CM  N[  ]^  C_  C_  ag  ak  ak  lu  wx  ay  ay  lz  k{1  |  |  |y((Hb1111Z@Xdjdndnoy{}d~d~  AG  AK  AK  LV  XY  AZ  AZ  d[  c\1  ]  ]  ] )( 	))ZZ00FJJw++E--GGG I  Iz  {F  {F  {H  {H  I  I  I .    iZZ&&FZZ"--F "#FLLNN33CRC8 F FeeT** 
"w%/?/?!&7B!7!7J!*d33 &#->>&!#<#<$.NN7A$>$>		#$$%		 H !I!(($))DEEEE--CCC) .    ++C  2r  s  s  ss%   Bf 1f 
f8f3-f83f8c                 6   	 |                                 }t          j        t          d         |          }t          j        t          d         |          }t          j        t          d         |          }t          j        t          d         |          }t          j        t          d         |          }|rh|                    d          }|                    d          }|                    d                                           }	|                     |||	          S |rR|                    d          }|                    d                                           }	|                     ||	          S |rR|                    d          }|                    d                                           }	|                     ||	          S |rR|                    d          }|                    d                                           }	|                     ||	          S |r*|                    d          }
| 	                    |
          S | 
                    d	d
          S # t          $ r0}| 
                    ddt          |                     cY d }~S d }~ww xY w)Nr   r5   rsshshowr         rP   zInvalid shell syntax. Expected format: db.collection.method(params), db.method(params), rs.method(params), sh.method(params), or show <command>r*   zError parsing shell syntax: )r   rD   ro   r   rh   _parse_collection_method_parse_db_method_parse_rs_method_parse_sh_method_parse_show_commandr,   rm   r   )r   r{   collection_matchdb_matchrs_matchsh_match
show_matchrL   rM   rF   r=   r#   s               r$   rw   z(MongoDBHandler._parse_mongo_shell_syntax  s}   !	ZKKMME!x(>FFx66Hx66Hx66H(6"2E::J H"2"8"8";";.44Q77-33A66<<>>
44_kS]^^^ H&nnQ//%^^A..4466
,,[*EEE H&nnQ//%^^A..4466
,,[*EEE H&nnQ//%^^A..4466
,,[*EEE H$**1--//888//  6G  H  H  H 	Z 	Z 	Z++C1XPSTUPVPV1X1XYYYYYYYY	Zs?   DI  AI 4AI AI +I I 
J(%JJJc           
      X   |                      |          }|                     |||          }|r|S |dk    rd|iS |dk    rT|r|d         ni }t          |          dk    r|d         ni }||d| dt          t	          |                     d|gdS |d	k    r||r|d         ni d
S |dk    rd|iS |dk    r	|di igi dS |dk    rJ|r|d         ng }t          |          dk    r#t          |d         t                    r|d         ni }	|||	dS |                     dd|           S )Nr   createIndexr   r   idx__)r   r   )r   r   	dropIndex)r   r   
getIndexesr   watchr   )r   r   r  r   rP   zUnsupported collection method: )rJ   rN   r  hashr   rx   ry   r,   )
r   rL   rM   rF   rG   r=   r  r  r   cursor_optionss
             r$   r(  z'MongoDBHandler._parse_collection_method  s   ..z::00+vVV %	bNF""  M))&,4"J#&v;;??fQiiG!0$.8h8h8hQUVYZdVeVeQfQf8h8httlstu   K''.&,4"   L((  G##,-r23  
 K''$*2vayyH*-f++//jPQTX>Y>Y/VAYY_aN,$(   ++C1`S^1`1`aaar0   c           
      
   |t           v r1|dk    s|dk    rJ|r.	 |                                }|                    d          rk|                    d          rV|                    dd          }t          j        dd|          }t          j        d	d|          }t          j        |          S | 	                    d
| d          S # t          j
        $ r3}| 	                    d
d| dt          |                     cY d }~S d }~wt          $ r3}| 	                    d
d| dt          |                     cY d }~S d }~ww xY w| 	                    d
| d          S |dk    r@	 |                                }|                    d          r|                    d          r	 t          j        |                    dd                    }d|v rt          |d                   }n| 	                    d
d          S nd# t          j
        t          f$ r#}| 	                    d
d|           cY d }~S d }~ww xY w|                    d          rb|                    d          rM	 t          |                    d                    }n# t          $ r | 	                    d
d|           cY S w xY w|                    d          rb|                    d          rM	 t          |                    d                    }nc# t          $ r | 	                    d
d|           cY S w xY w	 t          |          }n)# t          $ r | 	                    d
d|           cY S w xY wd|dS # t          $ r0}| 	                    d
dt          |                     cY d }~S d }~ww xY w|dk    r	 |                     |          }|d                                         }	|	                    d          r+|	                    d          r|	                    d          }	n?|	                    d          r*|	                    d          r|	                    d          }	i }
t!          |          dk    rx	 |d                                                             dd          }t          j        |          }
n4# t          j
        $ r" | 	                    d
d|d                    cY S w xY wd|	i|
S # t          $ r0}| 	                    d
dt          |                     cY d }~S d }~ww xY wt           |         S | 	                    d
d|           S )NadminCommand
runCommandrt   }r   r   z(\w+):rA   r@   rP   z  parameter must be a JSON objectzInvalid JSON in z: zError parsing z$ requires a command object parameterr   opz*killOp JSON parameter must have 'op' fieldz#Invalid JSON parameter for killOp: zOperation ID must be numeric: zInvalid operation ID format: r   )r   r?  z Error parsing killOp parameter: createCollectionr   z0Invalid options parameter for createCollection: r   z*Error parsing createCollection parameter: zUnsupported database method: )r   r   rf   endswithr   rD   rE   r   r   r,   r   r   rm   intr   rB   r  )r   rM   rF   r!   r"   r#   parsed_paramopidrG   rL   r  options_strs               r$   r)  zMongoDBHandler._parse_db_method  s   +++n,,|0K0K gg&0&6&6&8&8&11#66 s;;O;OPS;T;T s*5*=*=c3*G*GK*,&Hk*R*RK*,&h*T*TK#':k#:#::#'#;#;CKAqAqAq#r#rr/ i i i#77=gP[=g=g_bcd_e_e=g=ghhhhhhhh$ g g g#77=ek=e=e]`ab]c]c=e=effffffffg//5i5i5ijjj(( f","2"2"4"4K"--c22 p{7K7KC7P7P pv+/:k6I6I#s6S6S+T+TL#|33'*<+='>'>'+'?'?Eq'r'r r !% !% 4jA v v v#'#;#;CAtgrAtAt#u#uuuuuuuv$//44 p9M9Mc9R9R pq#&{'8'8'='=#>#>DD) q q q#'#;#;CAobmAoAo#p#ppppq$//44 	p9M9Mc9R9R 	pq#&{'8'8'='=#>#>DD) q q q#'#;#;CAobmAoAo#p#ppppqp#&{#3#3DD) p p p#'#;#;CAnalAnAn#o#oooop #$"   ! f f f33C9d\_`a\b\b9d9deeeeeeeef 222p!<<ZHHF&,Qioo&7&7O&11#66 E?;S;STW;X;X E*9*?*?*D*D(33C88 E_=U=UVY=Z=Z E*9*?*?*D*D G6{{QA*0)//*;*;*C*CC*M*MK&*j&=&=GG#3 A A A#'#;#;CAtz{|t}AA  $A  $A  A  A  AA !/!  ! p p p33C9nfijkflfl9n9noooooooop )55++C1^Q\1^1^___s5  BC	 0C	 	E(D EE(E;EE*>M, )AH M, H<H71H<2M, 7H<<-M, *"J M, #J30M, 2J33-M, !"L M, #L*'M, )L**M, .L> =M, >#M$!M, #M$$M, ,
N&6%N!N&!N&1CS2 5AR8 7S2 8.S)&S2 (S))S2 2
T,<%T'!T,'T,c           
          |t           v rt           |         S |                     dd| dd                    t          j                                         S )NrP   zUnsupported show command: z. Supported: z, )r   r,   joinr   )r   r=   s     r$   r,  z"MongoDBHandler._parse_show_commandB  s    l""((++C  2Eg  2E  2Edhdmdmnzn  oB  oB  eC  eC  2E  2E  F  F  Fr0   c                     |t           v r+t           |         }||                     dd| d          S |S |                     dd|           S )NrP   ru   . requires parameters - use JSON format insteadz Unsupported replica set method: )r   r,   )r   rM   rF   r=   s       r$   r*  zMongoDBHandler._parse_rs_methodH  sd    +++'4G//5v;5v5v5vwwwN++C1aT_1a1abbbr0   c                 T   |t           v rt           |         }||dk    r	 |                                }|                    d          r+|                    d          r|                    d          }n?|                    d          r*|                    d          r|                    d          }d|iS # t          $ r0}|                     ddt          |                     cY d }~S d }~ww xY w|                     dd| d          S |S |                     dd|           S )	NenableShardingr   r   rP   z(Error parsing enableSharding parameter: rv   rI  zUnsupported sharding method: )r   r   rf   rA  rm   r,   r   )r   rM   rF   r=   r   r#   s         r$   r+  zMongoDBHandler._parse_sh_methodQ  so   +++'4G"222
r","2"2"4"4"--c22 9w7G7G7L7L 9&-mmC&8&8GG$//44 99I9I#9N9N 9&-mmC&8&8G,g   % r r r#77=phklmhnhn=p=pqqqqqqqqr  33C9z{9z9z9z{{{N++C1^Q\1^1^___s   BB8 8
C2%C-'C2-C2c                    |                                 sg S g }d}d}d}d}d }|D ]}|dv r|sd}|}n{||k    r|rd}d }nn|sl|dk    r|dz  }n`|dk    r|dz  }nT|d	k    r|dz  }nH|d
k    r|dz  }n<|dk    r6|dk    r0|dk    r*|                    |                                            d}||z  }|                                 r'|                    |                                            |S )Nr?   r   F)r   r   Trt   r   r>  [],)r   rC   )	r   rF   rG   current_parambrace_countbracket_count	in_quotes
quote_charchars	            r$   rB   z)MongoDBHandler._split_function_parametersg  sb   !! 	I	
 	" 	"Dz!!)! 	!

##	#!	!

 3;;1$KKS[[1$KKS[[!Q&MMS[[!Q&MMS[[[A%5%5-1:L:LMM-"5"5"7"7888$&MT!MM   	1MM---//000r0   )NNr<   )__name__
__module____qualname__r%   r/   r:   r4   rJ   rN   rq   r~   rz   rw   r(  r)  r,  r*  r+  rB   r   r0   r$   r   r      sF       P P PU U U	 	 	 	, , , ,  ,  
1n 1n 1n 1nfv v v v6@s @s @sD"Z "Z "ZH)b )b )bVO` O` O`bF F Fc c c` ` `," " " " "r0   r   )r   rD   pymongor   pymongo.errorsr   r   base_dbr   mongo_constantsr   r	   r
   r   r   r   mongo_mappingsr   r   r   r   r   r   r   r   r0   r$   <module>r^     s1    				       > > > > > > > > " " " " " "                              
z	 z	 z	 z	 z	] z	 z	 z	 z	 z	r0   