
)sEOc           @   s_   d  d l  Z  d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d d d     YZ d S(   iNt   CTDBHandlerc           B   s  e  Z d  Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 d d	  Z
 d
   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d d  Z d d  Z d   Z d   Z d   Z d d  Z d   Z d   Z d   Z d d  Z RS(   s"   Handler of the CherryTree DataBasec         C   s7   | |  _  i  |  _ t   |  _ t |  _ t   |  _ d S(   s   CherryTree DataBase bootN(   t   dadt   nodes_to_write_dictt   sett   nodes_to_rm_sett   Falset   bookmarks_to_writet   remove_at_quit_set(   t   selfR   (    (    s   modules/ctdb.pyt   __init__   s
    			c         C   s0   i  |  _  |  j j   t |  _ |  j j   d S(   s   Reset VariablesN(   R   R   t   clearR   R   R   (   R   (    (    s   modules/ctdb.pyt   reset&   s    		c         C   s<  t  } |  j r% |  j |  t } n  t  |  _ x' |  j D] } |  j | |  t } q8 W|  j j   x |  j D] } |  j | } |  j j	 |  } |  j j
 j |  } |  j j
 | d } |  j j
 j |  }	 |	 s d n |  j j
 |	 d }
 |  j | | | | |
 |  t } qo W|  j j   | r8| j   n  d S(   s   Write pending datai   i    i   N(   R   R   t   write_db_bookmarkst   TrueR   t   remove_db_node_n_childrenR
   R   R   t   get_tree_iter_from_node_idt	   treestoret
   iter_deptht   iter_parentt   write_db_nodet   commit(   R   t   dbt   need_to_committ
   node_to_rmt   node_id_to_writet
   write_dictt	   tree_itert   levelt   node_sequencet   father_itert   node_father_id(    (    s   modules/ctdb.pyt   pending_data_write-   s*    			
 
 c         C   ss   | d } | d } | d } d t  |  k rH d } t j |  } n | j j d  } d } | | | | | f S(   s   From image element to db tuplei    i   i   t   anchort    s   utf-8N(   t   dirt   machinest   get_blob_buffer_from_pixbufR    t   decodet   None(   R   t   image_elementt   node_idt   offsett   pixbuft   justificationR    t   png_blob(    (    s   modules/ctdb.pyt   get_image_db_tupleE   s    


c         C   s  | d } | d } | d } | d } | d } t  j j j   } | j d  }	 | j |	  xw | d D]k }
 | j d  } |	 j |  xF |
 D]> } | j d	  } | j |  | j |  } | j |  q Wqk W| j   j d
  } | | | | | | f S(   s   From table element to db tuplei    i   i   t   col_mint   col_maxt   tablet   matrixt   rowt   cells   utf-8(	   t   xmlt   domt   minidomt   Documentt   createElementt   appendChildt   createTextNodet   toxmlR%   (   R   t   table_elementR(   R)   t
   table_dictR+   R.   R/   t	   table_domt   dom_iterR2   t   dom_rowR3   t   dom_cellt	   text_itert   txt(    (    s   modules/ctdb.pyt   get_table_db_tupleR   s$    




c      
   C   s   | d } | d } | d } | d j  d  } | d } | d } | d }	 | d	 }
 | d
 } | d } | | | | | | |	 |
 | | f
 S(   s    From codebox element to db tuplei    i   i   t	   fill_texts   utf-8t   syntax_highlightingt   frame_widtht   frame_heightt   width_in_pixelst   highlight_bracketst   show_line_numbers(   R%   (   R   t   codebox_elementR(   R)   t   codebox_dictR+   RC   t   syntaxt   widtht   heightt   is_width_pixt   do_highl_brat   do_show_linenum(    (    s   modules/ctdb.pyt   get_codebox_db_tupleg   s    








c         C   s   t  j |  } t  j | _ | S(   s1   Returns DB connection descriptor given the dbpath(   t   sqlite3t   connectt   Rowt   row_factory(   R   t   dbpathR   (    (    s   modules/ctdb.pyt   get_connected_db_from_dbpathv   s    R!   c         C   s   t  j j |  r" t  j |  n  |  j |  } | j t j  | j t j  | j t j	  | j t j
  | j t j  | j t j  |  j | |  | j   | S(   s   Create a new DataBase(   t   ost   patht   isfilet   removeRZ   t   executet   const   TABLE_NODE_CREATEt   TABLE_CODEBOX_CREATEt   TABLE_TABLE_CREATEt   TABLE_IMAGE_CREATEt   TABLE_CHILDREN_CREATEt   TABLE_BOOKMARK_CREATEt   write_db_fullR   (   R   RY   t	   exportingR   (    (    s   modules/ctdb.pyt   new_db|   s     
c         C   sZ   | j  d  d } x@ |  j j D]2 } | d 7} t |  | f } | j  d |  q  Wd S(   s   Write all the bookmarks in DBs   DELETE FROM bookmarki    i   s    INSERT INTO bookmark VALUES(?,?)N(   R_   R   t	   bookmarkst   int(   R   R   t   sequencet   bookmark_strt   bookmark_tuple(    (    s   modules/ctdb.pyR      s    
c         C   s8   |  j  j d k r d S|  j  j s& d Sd GHt |  _ d S(   s   Pending Bookmarks Updatet   bt   xNt   pending_edit_db_bookmarks(   Ro   Rp   (   R   t   filetypet   user_activeR   R   (   R   (    (    s   modules/ctdb.pyRq      s      c         C   s   |  j  j d
 k r d S|  j  j s& d Sd G| GH| |  j k rR t |  j | d <n6 i t d 6t d 6t d 6t d 6t d	 6} | |  j | <d S(   s    Pending Node Needs 'prop' UpdateRo   Rp   Nt   pending_edit_db_node_propt   propt   updt   bufft   hiert   child(   Ro   Rp   (   R   Rr   Rs   R   R   R   (   R   R(   R   (    (    s   modules/ctdb.pyRt      s      	)c         C   s   |  j  j d
 k r d S|  j  j s& d Sd G| GH| |  j k rR t |  j | d <n6 i t d 6t d 6t d 6t d 6t d	 6} | |  j | <d S(   s    Pending Node Needs 'buff' UpdateRo   Rp   Nt   pending_edit_db_node_buffRw   Rv   Ru   Rx   Ry   (   Ro   Rp   (   R   Rr   Rs   R   R   R   (   R   R(   R   (    (    s   modules/ctdb.pyRz      s      	)c         C   s   |  j  j d
 k r d S|  j  j s& d Sd G| GH| |  j k rR t |  j | d <n6 i t d 6t d 6t d 6t d 6t d	 6} | |  j | <d S(   s    Pending Node Needs 'hier' UpdateRo   Rp   Nt   pending_edit_db_node_hierRx   Rv   Ru   Rw   Ry   (   Ro   Rp   (   R   Rr   Rs   R   R   R   (   R   R(   R   (    (    s   modules/ctdb.pyR{      s      	)c         C   sY   |  j  j d
 k r d Sd G| GHi t d 6t d 6t d 6t d 6t d	 6} | |  j | <d S(   s   Pending Add a Node to DBRo   Rp   Nt   pending_new_db_nodeRv   Ru   Rw   Rx   Ry   (   Ro   Rp   (   R   Rr   R   R   R   (   R   R(   R   (    (    s   modules/ctdb.pyR|      s
     	)c         C   s{   |  j  j d k r d S|  j  j s& d Sd G| GH| |  j k rg |  j | d } |  j | =| rg d Sn  |  j j |  d S(   s   Pending RM a Node from DBRo   Rp   Nt   pending_rm_db_nodeRv   (   Ro   Rp   (   R   Rr   Rs   R   R   t   add(   R   R(   t   node_just_inserted(    (    s   modules/ctdb.pyR}      s      	
c         C   s   | j  d | f  | j  d | f  | j  d | f  | j  d | f  | j  d | f  |  j | |  } x" | D] } |  j | | d  qx Wd S(   s&   Remove a Node and his children from DBs#   DELETE FROM codebox WHERE node_id=?s    DELETE FROM grid WHERE node_id=?s!   DELETE FROM image WHERE node_id=?s    DELETE FROM node WHERE node_id=?s$   DELETE FROM children WHERE node_id=?R(   N(   R_   t    get_children_rows_from_father_idR   (   R   R   R(   t   children_rowst	   child_row(    (    s   modules/ctdb.pyR      s    c   "      C   sA  |  j  j | d } d G| Gd G| GH|  j  j | d j d  }	 |  j  j | d }
 |  j  j | d j d  } |  j  j | d r d n d	 } |
 t j k r d n d	 } | d
 rx|  j  j | d s| r |  j | |  j  j  q|  j | |  j  j  n  |  j  j | d } | j   } | j	   } | rKd t
 |   k rQ|  ` n  t j j j   |  _ |  j j d  } |  j j |  i  |  _ x t j D] } d |  j | <qW| j   } |  j  j j | |  j  | j d#  } x | r|  j  j j | | | |  j d |  j | j |  d	 k r0Pq|  j  j j | |  j  | j   } | j |  | j d#  } | j   | k rPqqW|  j  j j | | | |  j d |  j | d r| j d | f  | j d | f  | j d | f  n  |  j  j j |  } g  } g  } g  } x | D] } | d	 d k r]| j |  j  | d |   q'| d	 d k r| j |  j! | d |   q'| d	 d k r'| j |  j" | d |   q'q'W| rd } | j# d |  n d	 } | rd } | j# d |  n d	 } | r*d } | j# d |  n d	 } |  j j$   j d  } qxd	 } d	 } d	 } | j% |  j d  } n  | d r| d
 r| d r| j d | f  n  | |	 | |
 | | | | | | | f } | j d |  nd | d
 r| j d | |
 | | | | | | f  n/ | d rJ| j d |	 |
 | | | | f  n  | d r| d rt| j d | f  n  | j d  | | | f  | d
 r| d r| j d! | | f  qn  | d" sd# S|  j  j j& |  }  d	 }! xR |  d# k r<|! d 7}! |  j' | |  | d |! | | |  |  j  j j( |   }  qWd# S($   s   Write a node in DBi   s   write node content, node_ids   , write_dicti   s   utf-8i   i   i   i    Rw   i   R5   t   nodeR!   Rv   s#   DELETE FROM codebox WHERE node_id=?s    DELETE FROM grid WHERE node_id=?s!   DELETE FROM image WHERE node_id=?R*   R0   t   codeboxs/   INSERT INTO codebox VALUES(?,?,?,?,?,?,?,?,?,?)s$   INSERT INTO grid VALUES(?,?,?,?,?,?)s#   INSERT INTO image VALUES(?,?,?,?,?)Ru   s    DELETE FROM node WHERE node_id=?s.   INSERT INTO node VALUES(?,?,?,?,?,?,?,?,?,?,?)so   UPDATE node SET txt=?, syntax=?, is_richtxt=?, has_codebox=?, has_table=?, has_image=?, level=? WHERE node_id=?sJ   UPDATE node SET name=?, syntax=?, tags=?, is_ro=?, level=? WHERE node_id=?Rx   s$   DELETE FROM children WHERE node_id=?s"   INSERT INTO children VALUES(?,?,?)s'   UPDATE node SET level=? WHERE node_id=?Ry   N()   R   R   R%   R`   t   CUSTOM_COLORS_IDt   read_db_node_contentR   t   db_oldt   get_start_itert   get_end_iterR"   R5   R4   R6   R7   R8   R9   t   curr_attributest   TAG_PROPERTIESt   copyt   xml_handlert   rich_text_attributes_updatet   forward_to_tag_toggleR&   t   rich_txt_serializet   comparet
   get_offsett
   set_offsetR_   t   state_machinet%   get_embedded_pixbufs_tables_codeboxest   appendR-   RD   RT   t   executemanyR;   t   get_textt   iter_childrenR   t	   iter_next("   R   R   R   R   Rl   R   R   Rh   R(   t   nameRN   t   tagst   is_rot
   is_richtxtt   curr_buffert
   start_itert   end_iterR?   t   tag_propertyt	   curr_itert	   tag_foundt
   offset_oldt   pixbuf_table_codebox_vectort   codeboxes_tuplest   tables_tuplest   images_tuplest   elementt   has_codeboxt	   has_tablet	   has_imageRC   t
   node_tuplet   child_tree_itert   child_sequence(    (    s   modules/ctdb.pyR      s     
  		 	(  (
     $
	
+
%


 
#c      	   C   sC  | s | d k r( |  j  j j   } n |  j  j } d } d } d } | d k r~ i t d 6t d 6t d 6t d 6t d 6} n) i t d 6t d 6t d 6t d 6t d 6} xe | d
 k r| d	 7} |  j | | | | | | |  | s | d k r
|  j  j j |  } q Pq W| s"| d k r2|  j	 |  n  |  j  j
   d
 S(   s   Write the whole DBt   ai    t   nRv   Ru   Rw   Rx   Ry   i   N(   R   R   t   get_iter_firstt   curr_tree_iterR   R   R&   R   R   R   t   objects_buffer_refresh(   R   R   Rh   R   R   Rl   R   R   (    (    s   modules/ctdb.pyRg   @  s$     ,)
  c         C   s   | j  | d  } i | d d 6| d d 6t | d  d 6| d d	 6t | d
  d 6t | d  d 6| d d 6} |  j j j | | d | d d | d S(   s   Add Codebox to Text BufferR)   RO   RG   RP   RH   RQ   RI   RN   RF   RR   RJ   RS   RK   RC   RE   t   codebox_justificationR+   t   text_bufferN(   t   get_iter_at_offsett   boolR   t   codeboxes_handlert   codebox_insert(   R   t   codebox_rowR   t   iter_insertRM   (    (    s   modules/ctdb.pyt   add_node_codeboxR  s    
c   	      C   s  | j  | d  } i g  d 6| d d 6| d d 6} y t j j j | d  } Wn d GH| d GHd SX| j } | s | j d k r d	 GH| d GHd S| j } x | d k r]| j d
 k rQ| d j g   | j } xp | d k rM| j d k rA| j d k r)| d d j | j j	  qA| d d j d  n  | j
 } q Wn  | j
 } q W|  j j j | | d | d d | d S(   s   Add Table to Text BufferR)   R1   R.   R/   RC   s   ** failed to parse **NR0   s   ** table name != 'table' **R2   R3   iR!   t   table_justificationR+   R   (   R   R4   R5   R6   t   parseStringt
   firstChildt   nodeNameR&   R   t   datat   nextSiblingR   t   tables_handlert   table_insert(	   R   t	   table_rowR   R   R=   R5   t   dom_nodet   child_dom_itert   nephew_dom_iter(    (    s   modules/ctdb.pyt   add_node_tablec  s@     					
c         C   s   | j  | d  } | d rB t j j t j  } | d | _ n t j | d  } | r |  j	 j
 | | d | d d | n  d S(   s   Add Image to Text BufferR)   R    t   pngt   image_justificationR+   R   N(   R   t   gtkt   gdkt   pixbuf_new_from_fileR`   t   ANCHOR_CHARR    R#   t   get_pixbuf_from_png_blob_bufferR   t   image_insert(   R   t	   image_rowR   R   R*   (    (    s   modules/ctdb.pyt   add_node_image  s    

c         C   s7  |  j  j r! t |  j  _ t } n t } |  j  j | d } | rJ | } n |  j  j | d } d G| GH|  j  j |  |  j  j | d <|  j  j | d } | j d | f  j   } | t j	 k r | j
   | j | d  | j   n$y t j j j | d  }	 Wn d GH| d GH  d SX|	 j }
 |
 sE|
 j d	 k rWd
 GH| d GHd S|
 j } xA | d k r| j d k r|  j  j j | |  n  | j } qcWg  } | d r	| j d | f  j   } x7 t |  D]& \ } } | j d | | d g  qWn  | d r| j d | f  j   } x t |  D]q \ } } d | | d g } xO t |  D]4 \ } } | d | d k  rg| j | |  PqgqgW| j |  q;Wn  | d r]| j d | f  j   } x t |  D]q \ } } d | | d g } xO t |  D]4 \ } } | d | d k  r| j | |  PqqW| j |  qWn  | r|  j  j j |  x| | D]t } | d d k r|  j | | d |  q}| d d k r|  j | | d |  q}|  j | | d |  q}W|  j  j j |  j  j   n  | j! t  | r3t |  j  _ n  d S(   s   Read a node content from DBi   i   s   read node content, node_idi   sG   SELECT txt, has_codebox, has_table, has_image FROM node WHERE node_id=?RC   s   ** failed to parse **NR   s   ** node name != 'node' **t	   rich_textR   s9   SELECT * FROM codebox WHERE node_id=? ORDER BY offset ASCt   cR)   R   s6   SELECT * FROM grid WHERE node_id=? ORDER BY offset ASCt   tR   s7   SELECT * FROM image WHERE node_id=? ORDER BY offset ASCt   ii    i   ("   R   Rs   R   R   R   t   buffer_createR_   t   fetchoneR`   R   t   begin_not_undoable_actiont   set_textt   end_not_undoable_actionR4   R5   R6   R   R   R   R&   R   t   rich_text_deserializeR   t   fetchallt	   enumerateR   t   insertt
   sourceviewt
   set_bufferR   R   R   R   t   set_modified(   R   R   R   t   original_idt   user_active_restoreRF   R(   R   t   node_rowR5   R   R   t   objects_index_listt   codeboxes_rowsR   t   c_rowt   tables_rowst   t_rowt   new_obj_idx_elemt   jt   obj_idxt   images_rowst   i_row(    (    s   modules/ctdb.pyR     s    	 		 
 				
!

   c         C   s   | j  d | f  j   } | S(   s-   Returns the children rows given the father_ids>   SELECT * FROM children WHERE father_id=? ORDER BY sequence ASC(   R_   R   (   R   R   t	   father_idR   (    (    s   modules/ctdb.pyR     s    c         C   s   | j  d | f  j   } | S(   s0   Returns the (partial) node row given the node_idsJ   SELECT node_id, name, syntax, tags, is_ro, level FROM node WHERE node_id=?(   R_   R   (   R   R   R(   R   (    (    s   modules/ctdb.pyt   get_node_row_partial_from_id  s    c         C   s  | s# | d } |  j  j |  n |  j  j   } | d } | d } | d }	 |	 t j k r |	 |  j  j k r |	 j   j d d  }	 |	 |  j  j k r t j }	 q n  | r |  j  j j	 |  d n d }
 |  j  j
 |
 |	  } |  j  j j | | | d	 d | |	 | | | g  } |  j  j | d |  j  j |  j  j | d
 <| rt|  j |  |  j | | d | d n  d } |  j | | d  } xP | D]H } |  j | | d  } | r| d 7} |  j | | | | |  qqWd S(   s$   Read a node and his children from DBR(   R   R   RN   s   C++t   cppi   i    R   i   R   N(   R   t   node_id_addt   node_id_getR`   R   t   available_languagest   lowert   replaceR   R   t   get_node_iconR   R&   t   nodes_names_dictR|   R   R   R   t   read_db_node_n_children(   R   R   R   t   tree_fathert   discard_idsR   t	   unique_idt	   node_tagst   readonlyRF   t
   node_levelt   cherryR   R   R   R   t   child_node_row(    (    s   modules/ctdb.pyR     sH    



!%,
	c   
      C   s   | s% |  j  j j   g  |  j  _ n  d } |  j | d  } xP | D]H } |  j | | d  } | rD | d 7} |  j | | | | |  qD qD W| j d  j   } x+ | D]# }	 |  j  j j	 t
 |	 d   q Wd S(   s   Read the whole DBi    R(   i   s,   SELECT * FROM bookmark ORDER BY sequence ASCN(   R   R   t   reset_nodes_namesRj   R   R   R   R_   R   R   t   str(
   R   R   R   R   R   R   R   R  t   bookmarks_rowst   bookmark_row(    (    s   modules/ctdb.pyt   read_db_full  s"    
	 N(   t   __name__t
   __module__t   __doc__R	   R   R   R-   RD   RT   RZ   Ri   R   Rq   Rt   Rz   R{   R|   R}   R   R   Rg   R   R   R   R&   R   R   R   R   R
  (    (    (    s   modules/ctdb.pyR       s6   																e		#	E			+(    (   R   R[   RU   t   xml.dom.minidomR4   R`   R#   R    (    (    (    s   modules/ctdb.pyt   <module>   s   $