
    W#j.9                         S SK r S SKrS SKJr  \" \5      R                  5       R                  r\S-  S-  rS r	SS.S jr
S rS	 rS
 rS rS r\S:X  a  \" \ R$                  " \" 5       SSS95        gg)    N)PathDATABASEzGRAFO_D_DATABASE.sqlitec                      [         R                  " [        5      n [         R                  U l        U R                  S5        U $ )NzPRAGMA foreign_keys = ON)sqlite3connect	SQLITE_DBRowrow_factoryexecute)cons    Z/home/nexor/Desktop/NARNIA/REPOSITORY/GRAF MOTOR/GRAFO_D_V54_RUN/grafo_d_sqlite_adapter.py_connectr   	   s-    
//)
$CkkCOKK*+J    defaultc                x    U c  U$ [        U R                  5       5      nU H  nXC;   d  M
  X   nUc  M  Us  $    U$ )uk   
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      sE    
 {sxxz?D<IE 	  Nr   c                      U c  g[        U 5      $ N )str)r   s    r   _clean_textr   #   s    }u:r   c                    / n U R                  S5      R                  5        Vs/ s H  nUS   PM
     nnU(       d  U$ U R                  SSR                  U5      -   S-   5      R                  5       nU GHa  n0 nSnSU;   a  US   =(       d    SnU(       a=   [        R                  " U5      n[        U[        5      (       a  UR                  U5        U H  n	XY   n
U
c  M  XU	'   M     UR                  SUR                  S5      =(       d    UR                  S	5      =(       d    S
5        UR                  SUR                  S5      5        UR                  SS5        UR                  SS5        UR                  S	S5        UR                  SS5        UR                  SS5        [        UR                  S5      5      US'   UR                  U5        GMd     U$ s  snf ! [         a     GNf = f! [        R                   a    / s $ f = f)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
N fIN 	 

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

(* 	 CDHT!z?0b!ZZ1F!&$//F+ $ %I 
 OOD$((6"2"Sdhhz6J"SeTOOFDHHTN3OOIt,OOHe,OOJ+OONB/OOHi0"488I#67DO%= F _
0 ! ( ## 	sR   !G3 G
G3 AG3 <G"
G3 #C8G3 G3 "
G0,G3 /G00G3 3HHc                    [        U [        5      (       d  0 n [        U[        5      (       d  U $ [        U 5      nUR                  5        H  u  p4[        U[        5      (       d  XBU'   M   UR                  U5      n[        U[        5      (       d  0 n[        U5      nUR                  5        H"  u  pxUS;  a  XU'   M  UR	                  Xx5        M$     XbU'   M     U$ )u  
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0)3K **S//400 OO$+113LEJ&#U-	 4 s% !2( Mr   c                    ^6^7 [        5       n U R                  5       nUR                  S5      R                  5       n/ n0 nU GHx  n[	        USS S9nUc  [	        USSS9n[	        USS S9nUc  Un[	        USS S9nUc  Sn[        [	        USS	S
S95      m6[        [	        USSSS95      n	[        [	        USS
S95      =(       d
    T6 SUS    3n
[        [	        USSS
S95      n[	        USSS S9n[	        USSS S9n[	        USSS S9n[        [	        USSS
S95      n[        [	        USSSS
S95      n[        [	        USSS S!S
S95      n[        [	        US"S#S$S
S95      n[        [	        US%S&S
S95      n[        [	        US'S(S95      n[	        USUS9n0 SU
_S)US   _S*T6_ST6_SU	_SU	_S[        U=(       d    S5      _S[        U=(       d    U=(       d    S5      _S[        U=(       d    S5      _S[        U=(       d    U=(       d    S5      _SU_SU_SU_SU_SU_SU_SU_UUUUUUUUUUUS+.EnUb  UUS'   Ub  UUS'   Ub  UUS'   UR                  U5        T6 SUS    SUS    SU	 3n0 SU
_S)US   _S,U_S*T6_ST6_SU	_SU	_SU_SU_SU_SU_SU_SU_SU_SU_SU_S!U_UUUUUUS-.EnUUU'   UUS.'   GM{     UR                  S/5      R                  5       nUR                  S05      R                  5       n[        U5      nS1S2S3.nU Vs0 s H  nUS   US'   _M     nnU Vs0 s H  nUS   [        US4   5      _M     n n[        U V!s1 s H!  n!SU!;   d  M  U!S   c  M  [        U!S   5      iM#     sn!5      n"0 n#U" H  m7Sn$[        U V!s1 s H4  n!U!R                  S5      T7:X  d  M  [        U!R                  S*5      5      iM6     sn!5      n%U% H%  m6[        U6U74S5 jU 5       5      n&[        U$U&5      n$M'     U$U#T7'   M     0 n'S6n(U" H  m7U(U'T7'   U(U#T7   -  n(M     U" H  m70 n)U V!s/ s H  n!U!R                  S5      T7:X  d  M  U!PM     n*n!U*R                  S7 S89  U* HN  n![        U!R                  S*5      5      m6U)R                  T6S95      n+U'T7   U+-   n,U,U!S'   U,U!S'   SU!S'   U+S-   U)T6'   MP     M     / n-U" H  m7U'T7   n.U.U#T7   -   S-
  n/U-R                  0 SS:T7 3_S*S;_SS;_S[        T75      _S[        T75      _SU._SU/_SU#T7   _ST7_S[        T75      _S[        T75      _SS
_SS
_S!S
_SS
_SS
_S"S
_S
S
S<.E5        M     0 n0U H  n!U!R!                  S.S 5      nU(       d  M  U!R                  S5      nU!R                  SU5      nU!R                  SS
5      n1U!R                  S*S
5      m6UUS'   UUS'   UU0T6 SU SU SU1 3'   M     U0nS=S>S?U-U-   / S@S SASBSCSD.S@SESFSG./U Vs0 s H  nUS   UR                  US   USH   5      _M!     snU Vs/ s H  nUS   PM
     snUU / SI.U0 0 SJ.USK.	n2 UR                  SL5      R                  5       n3U3 GH  n4U4SM   n ["        R$                  " U4SN   5      n5USO:X  a'  [)        U2SP   R                  SO0 5      U55      U2SP   SO'   MP  USQ:X  a  [+        U5[,        5      (       a  U5R/                  SQU2SP   SQ   R                  SQ/ 5      5        U5R/                  SRU2SP   SQ   R                  SR0 5      5        U5R/                  SSU2SP   SQ   R                  SS0 5      5        U5R/                  ST/ 5        U5U2SP   SQ'   GM   GM  U5U2R/                  SP0 5      U'   GM     U R5                  5         U2$ s  snf s  snf s  sn!f s  sn!f s  sn!f s  snf s  snf ! [&         a     GM`  f = f! [0        R2                   a     N]f = f)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      >#    U  H>  nUR                  S 5      T:X  d  M  [        UR                  S5      5      T:X  d  M:  Sv   M@     g7f)rX   r   rM   N)r3   r   ).0erP   rX   s     r   	<genexpr> load_database.<locals>.<genexpr>H  sC      !a55=D( -0u->'-I 6s   A	A	 	A	   c           
         [        U R                  SS5      5      [        U R                  S5      =(       d    U R                  S5      =(       d    S5      [        U R                  S5      =(       d    U R                  S5      =(       d    S5      [        U R                  S5      =(       d    U R                  S	5      =(       d    S
5      [        U R                  SS5      5      4$ )Nr   r   rY   rZ   c   r[   r\   rL   rK   r   r   )r   r3   int)ru   s    r   <lambda>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   r{   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      sB   
*C
**,C;;  	  
! 	$ FJ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] ` kk  	 
	  [[  	
 
  &c*L ' A 	
)a&&   A 	
&	4)%%  
 AQ; 	V9 	AfI E M	
uuV}$ Ce
   G ! E Iu-I   (d! $ M
C!d}T""   
!uuV}$ v 	 

 	 
 	 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 uuWd#EE+&	%%	9-uuVR %%r"%[!YHLgYa	{!G9AdVDE   $J +.5&( W-X
 )* 
  A )4889qGXYY
 077w!AfIw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/ + 8=
B/4+ 4 IIKKG


2
~
 86  $ ## sy   ^*^
^^'^^
/^
-^
^*&^^$6*^; !^):C:^; )
^83^; 7^88^; ;__c                     [        S5      e)Nz:Direct JSON save is disabled. Use SQLite write operations.)RuntimeError)r   s    r   save_databaser     s    
S
TTr   __main__rx   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   