
    i                        d Z ddlZddlZddlZddlZej
                  j                  ej
                  j                  e            Z	ej
                  j                  e	d      Z ej                         Zda ej                         Zg dZd Zd Zd Zd	 Zd
 Zd Zedk(  r e         ede        ed e              yy)u  
SQLite storage backend — drop-in replacement for JSON file I/O.

Exposes load_json_file / save_json_file with identical signatures to the
previous file-based helpers, so request handlers need no change.

- WAL mode: concurrent reads while a writer is active
- timeout=30s: writers queue instead of failing under contention
- ACID: no partial writes; crash-safe
- Auto-migrate: first run imports existing *.json files from BASE_DIR
    Nzdatabase.dbF)
zproducts.jsonzcustomers.jsonzcert_history.jsonzdictionary.jsonzvisual_template_configs.jsonzcert_config.jsonztemplate_fields.jsonzfastener_specs.jsonzpacking.jsonzfield_mapping.jsonc                      t        j                  t        dd       } | j                  d       | j                  d       | j                  d       | S )N   )timeoutisolation_levelzPRAGMA journal_mode=WALzPRAGMA synchronous=NORMALzPRAGMA foreign_keys=ON)sqlite3connectDB_PATHexecute)conns    /app/cer_product_mecsu/db.py	_get_connr   '   s@    ??7BEDLL*+LL,-LL)*K    c                  R   t         ry t        5  t         r
	 d d d        y t               } 	 | j                  d       | j                  d      j	                         }|d   dk(  rt        |        | j                          da d d d        y # | j                          w xY w# 1 sw Y   y xY w)Nz
                CREATE TABLE IF NOT EXISTS kv_store (
                    key TEXT PRIMARY KEY,
                    value TEXT NOT NULL,
                    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
                )
            zSELECT COUNT(*) FROM kv_storer   T)
_init_done
_init_lockr   r
   fetchone_auto_migrateclose)r   rows     r   _ensure_initr   /   s    	   {	LL   ,,>?HHJC1v{d#JJL
#   JJL! s(   B
BAB-BBBB&c                 D   g }t         D ]  }t        j                  j                  t        |      }t        j                  j                  |      sG	 t        |dd      5 }t        j                  |      }ddd       |dd }t        j                  dd      }| j                  d	||f       |j                  |        |r*t        dt        |       ddj                  |              yy# 1 sw Y   zxY w# t        $ r}t        d
| d|        Y d}~d}~ww xY w)z8Import existing *.json files into kv_store on first run.rzutf-8)encodingNF   ensure_asciiindentz:INSERT OR REPLACE INTO kv_store (key, value) VALUES (?, ?)z  [migrate] skip z: z  [migrate] imported z files into SQLite: z, )MIGRATABLE_FILESospathjoinBASE_DIRexistsopenjsonloaddumpsr
   append	Exceptionprintlen)	r   importedfnr!   fdatakeyvaluees	            r   r   r   G   s   H 1ww||Hb)ww~~d#	1dC'2 $ayy|$Sb'CJJt%BELLLe OOB1  %c(m_4HS[I\H]^_ $ $  	1%bTA3/00	1s1   C:C.5A
C:.C7	3C::	DDDc                     t                | j                  d      r| dd n| }t               }	 |j                  d|f      j	                         }|j                          |rt        j                  |d         S g S # |j                          w xY w)zHDrop-in replacement. Returns [] if key not found (matches old behavior)..jsonNr   z(SELECT value FROM kv_store WHERE key = ?r   )r   endswithr   r
   r   r   r&   loads)filenamer1   r   r   s       r   load_json_filer9   ^   sz    N#,,W5(3B-8C;DllEvNWWY


zz#a&!!I 	

s   !A; ;Bc                 8   t                | j                  d      r| dd n| }t        j                  |dd      }t        5  t               }	 |j                  d||f       |j                          	 ddd       y# |j                          w xY w# 1 sw Y   yxY w)z4Drop-in replacement. Atomic write via SQLite UPSERT.r5   Nr   Fr   r   zINSERT INTO kv_store (key, value, updated_at) VALUES (?, ?, CURRENT_TIMESTAMP) ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = CURRENT_TIMESTAMP)r   r6   r&   r(   _write_lockr   r
   r   )r8   r0   r1   r2   r   s        r   save_json_filer<   l   s    N#,,W5(3B-8CJJt%:E	 	{	LLhe JJL	 	 JJL	 	s$   BA;!B;BBBc                      t                t               } 	 | j                  d      D cg c]  }|d   	 c}| j                          S c c}w # | j                          w xY w)u.   Debug helper — returns all keys in kv_store.z%SELECT key FROM kv_store ORDER BY keyr   )r   r   r
   r   )r   r   s     r   	list_keysr>   }   sI    N;D"ll+RST!T

 U

s   A AA A A__main__zDB:zKeys:)__doc__r&   r    r   	threadingr!   dirnameabspath__file__r#   r"   r	   Lockr;   r   r   r   r   r   r   r9   r<   r>   __name__r+    r   r   <module>rH      s   
  	  77??277??845
'',,x
/inn
Y^^
 0`." zN	%	'9; r   