
    W#j.9                         d dl Z d dlZd dlmZ  ee      j                         j                  Zedz  dz  Zd Z	dddZ
d Zd	 Zd
 Zd Zd Zedk(  r! e e j$                   e       dd             yy)    N)PathDATABASEzGRAFO_D_DATABASE.sqlitec                      t        j                  t              } t         j                  | _        | j                  d       | S )NzPRAGMA foreign_keys = ON)sqlite3connect	SQLITE_DBRowrow_factoryexecute)cons    grafo_d_sqlite_adapter.py_connectr   	   s-    
//)
$CkkCOKK*+J    defaultc                n    | |S t        | j                               }|D ]  }||v s| |   }||c S  |S )uw   
    Lector tolerante para sqlite3.Row.
    Permite soportar nombres canónicos y alias sin romper bases antiguas.
    )setkeys)rowr   namesr   namevalues         r   
_row_valuer      sN    
 {sxxz?D 4<IE 	 Nr   c                     | yt        |       S N )str)r   s    r   _clean_textr   #   s    }u:r   c                    g }	 | j                  d      j                         D cg c]  }|d   	 }}|s|S | j                  ddj                  |      z   dz         j                         }|D ]B  }i }d}d|v r	|d   xs d}|r7	 t        j                  |      }t        |t              r|j                  |       |D ]  }	||	   }
|
|
||	<    |j                  d|j                  d      xs |j                  d	      xs d
       |j                  d|j                  d             |j                  dd       |j                  dd       |j                  d	d       |j                  dd       |j                  dd       t        |j                  d            |d<   |j                  |       E 	 |S c c}w # t        $ r Y w xY w# t        j                  $ r g cY S w xY w)u   
    Carga tolerante de api_registry.

    Prioridad:
    1. Si existe raw_json válido, se usa como base.
    2. Se mezclan columnas reales de la tabla para que el frontend/backend
       pueda leer id, endpoint, enabled, status, target_graph, etc.
    zPRAGMA table_info(api_registry)r   zSELECT z, z FROM api_registry ORDER BY idr   raw_jsonidendpointapienabledTmethodGETtarget_graphstatusunknown)r   fetchalljoinjsonloads
isinstancedictupdate	Exception
setdefaultgetboolappendr   OperationalError)curapi_registryrcolsrowsr   itemr    parsedcolr   s              r   _load_api_registryr?   )   s    L. [[!BCLLN
 fI
 

 {{		$'*JJ

(* 	  	&CDHT!z?0b!ZZ1F!&$/F+  &C$ %DI&
 OOD$((6"2"Sdhhz6J"SeTOOFDHHTN3OOIt,OOHe,OOJ+OONB/OOHi0"488I#67DO%=	&F _
0 ! ( ## 	sR   !G F6G AG 6F;;G C+G 6G ;	GG GG G#"G#c                    t        | t              si } t        |t              s| S t        |       }|j                         D ]  \  }}t        |t              s|||<   |j                  |      }t        |t              si }t        |      }|j                         D ]!  \  }}|dvr|||<   |j	                  ||       # |||<    |S )u1  
    Mezcla metadata persistida desde ui_state sin perder datos canónicos de SQLite.

    Regla:
    - Si SQLite trae PLACE / WHO / BRIEF, esos valores son fuente principal.
    - Si ui_state trae campos adicionales, se conservan.
    - Si ui_state trae valores vacíos, no borra valores canónicos.
    r   )r.   r/   itemsr3   r2   )		canonical	persistedmergedkeypersisted_valuecanonical_valuer<   fieldr   s	            r   _merge_dict_preserve_canonicalrI   g   s     i&	i&)_F ) 1 _/40)F3K **S//40 OO$+113 	.LE5J&#Uu-		. s%( Mr   c                  6  67 t               } | j                         }|j                  d      j                         }g }i }|D ]  }t	        |dd       }|t	        |dd      }t	        |dd       }||}t	        |dd       }|d}t        t	        |dd	d
            6t        t	        |ddd            }	t        t	        |dd
            xs
 6 d|d    }
t        t	        |ddd
            }t	        |ddd       }t	        |ddd       }t	        |ddd       }t        t	        |ddd
            }t        t	        |dddd
            }t        t	        |ddd d!d
            }t        t	        |d"d#d$d
            }t        t	        |d%d&d
            }t        t	        |d'd(            }t	        |d|      }i d|
d)|d   d*6d6d|	d|	dt        |xs d      dt        |xs |xs d      dt        |xs d      dt        |xs |xs d      d|d|d|d|d|d|d||||||||||||d+}|||d<   |||d<   |||d<   |j                  |       6 d|d    d|d    d|	 }i d|
d)|d   d,|d*6d6d|	d|	d|d|d|d|d|d|d|d|d|d!|||||||d-}|||<   ||d.<    |j                  d/      j                         }|j                  d0      j                         }t        |      }d1d2d3}|D ci c]  }|d   |d'    }}|D ci c]  }|d   t        |d4          } }t        |D !ch c]  }!d|!v r|!d   t        |!d          c}!      }"i }#|"D ]v  7d}$t        |D !ch c]0  }!|!j                  d      7k(  rt        |!j                  d*            2 c}!      }%|%D ]#  6t        67fd5|D              }&t        |$|&      }$% |$|#7<   x i }'d6}(|"D ]  7|(|'7<   |(|#7   z  }( |"D ]  7i })|D !cg c]  }!|!j                  d      7k(  r|! }*}!|*j                  d7 8       |*D ]M  }!t        |!j                  d*            6|)j                  6d9      }+|'7   |+z   },|,|!d<   |,|!d<   d|!d<   |+dz   |)6<   O  g }-|"D ]  7|'7   }.|.|#7   z   dz
  }/|-j                  i dd:7 d*d;dd;dt        7      dt        7      d|.d|/d|#7   d7dt        7      dt        7      dd
dd
d!d
dd
dd
d"d
d
d
d<        i }0|D ]x  }!|!j!                  d.d       }|s|!j                  d      }|!j                  d|      }|!j                  dd
      }1|!j                  d*d
      6||d<   ||d<   ||06 d| d| d|1 <   z |0}d=d>d?|-|z   g d@d dAdBdCdDd@dEdFdGg|D ci c]  }|d   |j                  |d   |dH           c}|D cg c]  }|d   	 c}|| g dI|i i dJ|dK	}2	 |j                  dL      j                         }3|3D ]
  }4|4dM   }	 t#        j$                  |4dN         }5|dOk(  r&t)        |2dP   j                  dOi       |5      |2dP   dO<   M|dQk(  rt+        |5t,              sc|5j/                  dQ|2dP   dQ   j                  dQg              |5j/                  dR|2dP   dQ   j                  dRi              |5j/                  dS|2dP   dQ   j                  dSi              |5j/                  dTg        |5|2dP   dQ<   |5|2j/                  dPi       |<    	 | j5                          |2S c c}w c c}w c c}!w c c}!w c c}!w c c}w c c}w # t&        $ r Y Pw xY w# t0        j2                  $ r Y Zw xY w)UNa  
        SELECT
            e.*,
            g.visible_name AS graph_visible_name,
            g.row_key AS graph_row_key,
            f.name AS folder_name
        FROM events e
        JOIN graphs g ON g.id = e.graph_id
        JOIN folders f ON f.id = g.folder_id
        ORDER BY
            g.id,
            COALESCE(e.date_year, 999999),
            COALESCE(e.date_month, 99),
            COALESCE(e.date_day, 99),
            e.sort_index,
            e.id
    	start_colr   
sort_index   end_coldurationrow_keygraph_row_keyr   
event_namer   zUntitled event	legacy_id:r!   	date_textdate	date_yearyear
date_monthmonthdate_daydayplacePLACEwhoWHOactorbrief_descriptionbriefBRIEFdescriptionsource_linkurlsourceapi_textr#   folder_nameUncategorizeddb_idr   )r_   r`   re   rc   rd   rb   rf   r#   ri   foldergrouprn   )rc   rd   rb   rf   r#   ri   _metazK
        SELECT name, is_open
        FROM folders
        ORDER BY id
    z
        SELECT g.row_key, g.visible_name, f.name AS folder_name
        FROM graphs g
        JOIN folders f ON f.id = g.folder_id
        ORDER BY g.id
    PAYLOAD HISTISS)rp   rq   is_openc              3      K   | ]7  }|j                  d       k(  r!t        |j                  d            k(  rd 9 yw)rX   r   rM   N)r3   r   ).0erP   rX   s     r   	<genexpr>z load_database.<locals>.<genexpr>H  s=      55=D(Su->'-I s   =A    c           
         t        | j                  dd            t        | j                  d      xs | j                  d      xs d      t        | j                  d      xs | j                  d      xs d      t        | j                  d      xs | j                  d	      xs d
      t        | j                  dd            fS )Nr   r   rY   rZ   c   r[   r\   rL   rK   r   r   )r   r3   int)ru   s    r   <lambda>zload_database.<locals>.<lambda>_  s    eR !l#;quuW~;<j!7QUU5\7R8l#>quu['9>Q?fb!"(
 r   )rE   r   AXIS___AXIS__)r#   ri   grafo_d_sqlite_adapterz55-front-fields-api-readyzexisting-engine-unchangedsqlite_canonicalz:Runtime data loaded from canonical SQLite through adapter.engine_ownedz>Events now expose place/who/brief fields directly to frontend.)r(   active_graphschema_notetimeline_layoutv55_notezSQLite Canonicalsqlite)r!   r   typevisible_name)foldersgraphFolderopendeletedRows)graph_labelsr   
event_metafolder_metagraph_set_cards)	schemaversionengine_versionevents
categoriesmetadatagraphsui_stater8   z_
            SELECT key, value_json
            FROM ui_state
            ORDER BY key
        rE   
value_jsonr   r   r   r   r   r   )r   cursorr   r*   r   r   rz   r5   r?   r4   sortedr3   r   summaxsortpopr,   r-   r1   rI   r.   r/   r2   r   r6   close)8r   r7   r;   r   r   r9   rK   rN   rO   rR   rS   rU   rW   rY   r[   r]   r_   rb   rf   ri   rj   rL   eventrE   metar   r   r8   canonical_graph_labelsggraph_folderf
open_stateru   yearswidth_by_year	max_countrow_keyscountstart_by_yearr>   per_rowyear_eventsidx
target_colaxis_eventsstartendrebuilt_event_metar   dataui_rowsuir   rP   rX   s8                                                         @@r   load_databaser      sG   
*C
**,C;;  	  
! 	$ FJ nq+t<	"1lA>IQ	48?GaT:HjIPRST A|VM]!^_

1k2 FGagYVWXYZ^X_W`Ka	
1k62 NO	q+vtD	<$G
aUDAJq'7BGH*QugrJK'#	
 "*QuhXZ"[\z!ZKL!*Q"WX<C

)
QtW
 7
 w	

 J
 *
 Y^!,
 s74i415
 HM*
 #j:I:;
 I
 
 
  *!
" #
$ U%
& U'
( ,&&!2& ! =
B  %E&M!'E'N#E%Le	5-.ai0@/A:,O
)
QtW
 [
 7	

 w
 J
 *
 I
 
 I
 Z
 8
 U
 U
 3
  3!
" ,#
$ '&!2& /
4 
3g]n` kk  	 
	  [[  	
 
  &c*L '  	
)a&&L   	
&	4)%%J 
 Q;1V90 	AfI E M (	
uuV}$ e
    	.G ! E Iu-I	. (d!($ M
C #!d}T""#  ' 
uuV}$ 
 

 	 
 	  		'A!%%,'G++gq)C&t,s2J'AkN%AiLAjM"QwGG		'!'6 K d#mD))A- 
E$.
:
 z
 CI	

 #d)
 
 s
 d+
 D
 CI
 T
 R
 2
 2
 R
   !
" 2#
$ '
 		8  MuuWd#EE+&	%%	9-uuVR %%r"%[!YHLgYa	{!G9AdVDEM  $J +.5&( W-X
 )* 
   )4889qGXYY
 077!AfI7+"!	 %!
 %G$DR++   XZ	 	  	=BU)C

2l#34 l"1O$((r:2Z . 	!eT*$$YZ0@0K0O0OPY[]0^_$$]D4DY4O4S4STace4fg$$VT*-=i-H-L-LVUW-XY$$]B727D$Y/7<
B/4+	=4 IIKKG


2
~
 86  $ ## sh   ]2]]5]
]##](0]-*^ 8]2A ^ B+^ 2	]?;^ >]??^ ^^c                     t        d      )Nz:Direct JSON save is disabled. Use SQLite write operations.)RuntimeError)r   s    r   save_databaser     s    
S
TTr   __main__rw   F)indentensure_ascii)r,   r   pathlibr   __file__resolveparentROOTr   r   r   r   r?   rI   r   r   __name__printdumps r   r   <module>r      s      H~&&: 99	 %) &;|%P`FU z	*$**]_QU
CD r   