a
    0‰h¢  ã                   @   s®  d Z ddlZddlZddlZddlZej d¡Zej 	e¡ ddl
mZ ddl
mZ ddl
mZ dZdZeeeƒZg Zi Zi Zi Zi ZeeeƒZd	ZG d
d„ dƒZdd„ Zdd„ Zdd„ ZG dd„ dƒZdd„ ZG dd„ dƒZdd„ ZG dd„ dƒZ dd„ Z!G dd„ dƒZ"G d d!„ d!ƒZ#G d"d#„ d#ƒZ$d$d%„ Z%G d&d'„ d'ƒZ&G d(d)„ d)ƒZ'd*d+„ Z(d,d-„ Z)d.d/„ Z*d0d1„ Z+d2d3„ Z,d4d5„ Z-e.d6krªe /¡ sªd7ej0v rœne-ƒ  e 1¡  dS )8aú  
   ace2sql.py - Read the BIRCH documentation database from ACeDB and write
   equivalent SQL statements to birchdocdb.sql

   This program is derived from htmldoc.py, replacing code that generated
   HTML with code to generate SQL.

   Synopsis: ace2sql.py  # reads both BIRCH and local ACeDB databases
             ace2sql.py BIRCH  # reads ONLY BIRCH database
             ace2sql.py local  # reads ONLY local database

@modified: July 29, 2025
@author: Brian Fristensky
@contact: frist@cc.umanitoba.ca
é    NZBIRCHLIB)ÚBirchmod)Ú	Htmlutils)Ú
HTMLWriterzace2sql.py: z"
	 USAGE: ace2sql.py [local|BIRCH]Ú
c                   @   s   e Zd ZdZdd„ ZdS )Ú
Parametersz#Wrapper class for global parametersc                 C   s–  d}t j |¡r€tdƒ d| _d| _t|dƒ}|D ]B}| d¡}|d dkrZ|d  ¡ | _|d d	kr2|d  ¡ | _q2| 	¡  ntd
ƒ t j
d | _ttjƒ}|dkrútjd dkr¾dg| _n:tjd dkrÖdg| _n"tdtjd  ƒ ttƒ t ¡  n
ddg| _tdt| jƒ ƒ d}zt j
d }W n   Y n0 |dkrF|| _td| j ƒ td| j ƒ | jd | _| jd | _| jd | _| jd | _dS )a.  
          Get the location of the BIRCH home directory, BIRCHPATH
          Preferrably, we get it from the BIRCH.properties file,
          but if that isn't found, we get it from the BIRCH
          environment variable. The one catch is that since
          we don't already know the location of BIRCHPATH,
          the former will only work if the current working
          directory is install-scripts. Normally, this would
          only be used when installing or updating BIRCH
          Otherwise, the environment variable will be read.
          z../local/admin/BIRCH.propertiesz0ace2sql.py: Reading $BIRCH from BIRCH.propertiesÚ Úrú=r   zBirchProps.homediré   zBirchProps.platformzEace2sql.py: Reading $BIRCH and $BIRCH_PLATFORM environment variables.ÚBIRCHÚlocalzace2sql.py: Invalid argument zace2sql.py: ACESOURCES set to: ÚBIRCH_PLATFORMzace2sql.py: BIRCHPATH set to: z#ace2sql.py: BIRCH_PLATFORM set to: z/public_htmlz/public_html/birchdbú/public_html/birchdocdbz/local/public_html/birchdbN)ÚosÚpathÚexistsÚprintÚ	BIRCHPATHr   ÚopenÚsplitÚstripÚcloseÚenvironÚlenÚsysÚargvÚ
ACESOURCESÚUSAGEÚexitÚstrZBIRCHWEBPATHÚBIRCHDBPATHZBIRCHDOCDBPATHÚBIRCHLOCALDBPATH)ÚselfÚFNÚFILEÚLINEÚTOKENSZNumArgsZplat© r'   ú1/home/psgendb/BIRCHDEV/install-scripts/ace2sql.pyÚ__init__/   sN    








zParameters.__init__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r)   r'   r'   r'   r(   r   ,   s   r   c                 C   sš   ddl }| jd | j }d| jv rNt | j¡ | d| j| j|dg¡}| ¡  d| jv r–tj	 
| jd ¡r–t | j¡ | d| j| j|dg¡}| ¡  dS )	zƒ
    Dump the core BIRCH and local databases to .ace files
    @param P: Instasnce of Paramters object
    @type P: Parameters
    r   Nz/bin-r   z./tbirchdb.shz
tace.inputr   z/database/ACEDB.wrm)Ú
subprocessr   r   r   r   Úchdirr    ÚPopenÚwaitr   r   r!   )ÚPr.   ZTACEDIRÚpr'   r'   r(   Ú	DUMPTOACEq   s    

r4   c                 C   sX   |   d¡}|  d¡}| |d |… } |  dd¡} |  dd¡} |  dd¡} |  d	d
¡} | S )al  
    Read the first string delimited by double quotes
    @param LINE: The line to be cleaned up
    @type LINE: str

    Each quoted line is modified as follows:
         escape characters \ added by ACEDB are deleted
         '>' and '<' characters are changed to '&gt;' and '&lt;' so
         they are not accidentally recognized by HTML as tag delimiters.
    ú"r
   ú\r   ú>z&gt;ú<z&lt;ú'z&apos;)ÚfindÚrfindÚreplace)r%   ÚIÚJr'   r'   r(   ÚGetStr‰   s    

r?   c                 C   s   || v r
n
|   |¡ dS )zØ
    If a list contains NAME, do nothing
    If it does not exist, append it to the list
    @param L: The list to check for name
    @type L: list
    @param NAME: The name to be checked for
    @type NAME: str
    N)Úappend)ÚLÚNAMEr'   r'   r(   Ú	AddToList¢   s    
rC   c                   @   s   e Zd Zdd„ ZdS )ÚCategoryc                 C   s   d| _ g | _g | _dS )zv
          Initializes arguments:
                name=""
                program=[]
                pkg=[]
          r   N)ÚnameÚprogramÚpkg©r"   r'   r'   r(   r)   ´   s    zCategory.__init__N©r*   r+   r,   r)   r'   r'   r'   r(   rD   ²   s   rD   c                    s    ‡ fdd„}t j | ¡rœt| dƒ}|D ]l}t d|¡rD|t|ƒƒ}q&t d|¡rlt |¡}t	|j
|d ƒ q&t d|¡r&t |¡}t	|j|d ƒ q&| ¡  dS )	zÈ
    Read category.ace into a list of category objects
    @param FN: THe name of the file to be read
    @type FN: str
    @param CATS: The categories object to be read into
    @type CATS: list
    c                    s,   | t v rt |  }ntƒ }ˆ  |¡ | |_|S )zó
        "If a category called NAME already exists, return a pointer"
        "If it does not exist, create a new category object and return a pointer"
        @param NAME: The name of the category to check for
        @type NAME: str
        )ÚCATDICTrD   r@   rE   )rB   ÚC©ÚCATSr'   r(   ÚAssignCategoryÌ   s    

z$ReadCategory.<locals>.AssignCategoryr   zCategory\s:\s".+"úProgram\s+".+"r
   úPackage\s+".+"N)r   r   r   r   ÚreÚmatchr?   ÚHTÚtokenizerC   rF   rG   r   )r#   rM   rN   r$   r%   rK   r&   r'   rL   r(   ÚReadCategoryÁ   s    


rU   c                   @   s   e Zd Zdd„ ZdS )ÚPackagec                 C   s4   d| _ d| _g | _g | _g | _g | _g | _g | _dS )a  
          Initializes arguments:
                name=""
                description=""
                category=[]
                doc=[]
                program=[]
                data=[]
                platform=[]
                installation=[]
          r   N)rE   ÚdescriptionÚcategoryÚdocrF   ÚdataÚplatformÚinstallationrH   r'   r'   r(   r)   ô   s    zPackage.__init__NrI   r'   r'   r'   r(   rV   ò   s   rV   c                    sb  ‡ fdd„}t j | ¡r^t| dƒ}|D ]*}t d|¡rH|t|ƒƒ}q(t d|¡r`t|ƒ|_q(t d|¡r~t|j	t|ƒƒ q(t d|¡r¦t
 |¡}t|j|d ƒ q(t d	|¡rÎt
 |¡}t|j|d ƒ q(t d
|¡röt
 |¡}t|j|d ƒ q(t d|¡r t
 |¡}t|j|d ƒ q(t d|¡r<t|jdƒ q(t d|¡r(t|jdƒ q(| ¡  dS )zÎ
    Read package.ace into a list of Package objects
    @param FN: The name of the file to be read in
    @type FN: str
    @param PKGS: The list of package objects to be read into
    @type PKGS:list
    c                    s,   | t v rt |  }ntƒ }ˆ  |¡ | |_|S )zã
        If a package called NAME already exists, return a pointer
        If it does not exist, create a new package object and return a pointer
        @param NAME:The name to attempt to assign
        @type NAME:str
        )ÚPKGDICTrV   r@   rE   )rB   ÚPK©ÚPKGSr'   r(   ÚAssignPackage  s    

z"ReadPackage.<locals>.AssignPackager   zPackage\s:\s".+"úDescription\s+".+"úCategory\s+".+"úDocumentation\s+".+"r
   rO   úData\s+".+"úPlatform\s+".+"r   r   N)r   r   r   r   rQ   rR   r?   rW   rC   rX   rS   rT   rY   rF   rZ   r[   r\   r   )r#   r`   ra   r$   r%   r^   r&   r'   r_   r(   ÚReadPackage
  s6    





rg   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚIndenterzMethods indenting output filec                 C   s   d| _ d| _d| _dS )zx
          Initializes arguments:
                indentwidth=4
                col=0
                lpad=""
          é   r   r   N)ÚindentwidthÚcolÚlpadrH   r'   r'   r(   r)   J  s    zIndenter.__init__c                 C   s    | j | j | _ d | j ¡| _dS )zC
          increase indent using identwidth blank spaces
          ú N)rk   rj   Úrjustrl   rH   r'   r'   r(   ÚindentV  s    zIndenter.indentc                 C   s8   | j | j | _ | j dk r&d| _ d| _nd | j ¡| _dS )zC
          decrease indent using identwidth blank spaces
          r   r   rm   N)rk   rj   rl   rn   rH   r'   r'   r(   Úundent]  s
    
zIndenter.undentN)r*   r+   r,   r-   r)   ro   rp   r'   r'   r'   r(   rh   G  s   rh   c                 C   sN   |   |jd |d  d ¡ |dd… D ]}|   d| d ¡ q(|   d¡ dS )z6
    Write one or more rows of values to SQLFILE.
    z("r   r5   r
   Nz, "ú))Úwriterl   )ÚSQLFILEÚIndÚValuesÚvalr'   r'   r(   Ú	InsertRowi  s    rw   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚChoiceTablec                 C   s   d| _ d| _g | _dS )zv
          Class for single-column tables used to limit possible choices
          in an SQL field (column)
          r   N)Ú	TableNameÚ
ColHeadingru   rH   r'   r'   r(   r)   x  s    zChoiceTable.__init__c           
      C   s  |  t¡ tƒ }|  d| d t ¡ |  d| d t ¡ |  d| d t ¡ |  dt ¡ |  t¡ |  d| d	 ¡ |  |¡ |  d
t ¡ | ¡  |  |jd t ¡ | ¡  t|ƒd }d}|D ]4}|g}	t|||	ƒ ||krø|  dt ¡ |d7 }qÌ|  dt ¡ dS )zv
        Write Category table to SQLFILE
            FIXME
            @param catfn:
            @type catfn:
        ú-- ú -------------------------úCREATE TABLE IF NOT EXISTS ú (ú    z TEXT PRIMARY KEYú);úINSERT INTO ú ( ú )ÚVALUESr
   r   ú,ú;N)rr   ÚNLrh   ro   rl   r   rw   )
r"   rs   ry   ZColNameZkeylistrt   ÚlastlineÚ	linecountÚkeyru   r'   r'   r(   ÚWriteChoiceTable  s,    



zChoiceTable.WriteChoiceTableN)r*   r+   r,   r)   r‹   r'   r'   r'   r(   rx   v  s   	rx   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú	LinkTablec                 C   s(   d| _ d| _d| _d| _d| _g | _dS )a8  
          Class for creating 2-way links in SQL. SQL has no direct
          way to specify one-to-many or many-to-many fields. The hack is
          that you have to create a table that references two tables.
          Initializes arguments:
                leftname=""
                rightname=""

          r   N)Ú	tablenameÚleftnameÚ	rightnameÚleftkeyÚrightkeyÚ
linktuplesrH   r'   r'   r(   r)   ¥  s    
zLinkTable.__init__c                 C   s   | j  |¡ d S ©N)r’   r@   )r"   Útupler'   r'   r(   Úaddtuple¶  s    zLinkTable.addtuplec                 C   sf  |  t¡ tƒ }|  d| j d t ¡ |  d| j d t ¡ |  d| j d | j d t ¡ |  d| j d | j d t ¡ |  d	t ¡ |  t¡ |  d
| j d ¡ |  | jd | j ¡ |  dt ¡ | ¡  |  |j	d t ¡ | ¡  t
| jƒd }d}| jD ]B}|d |d g}t|||ƒ ||krH|  dt ¡ |d7 }q|  dt ¡ dS )z-
        Write link table to SQLFILE
        r{   r|   r}   r~   r   ú TEXT REFERENCES ú NOT NULL, z	 NOT NULLr€   r   r‚   ú, rƒ   r„   r
   r   r…   r†   N)rr   r‡   rh   r   rŽ   r   r   r‘   ro   rl   r   r’   rw   )r"   rs   rt   rˆ   r‰   Útru   r'   r'   r(   ÚWriteLinkTable¹  s.    
""


zLinkTable.WriteLinkTableN)r*   r+   r,   r)   r•   rš   r'   r'   r'   r(   rŒ   £  s   rŒ   c                   @   s   e Zd Zdd„ ZdS )ÚProgramc                 C   sF   d| _ d| _g | _g | _d| _g | _g | _g | _g | _g | _	d| _
dS )aA  
          Initializes arguments:
                name=""
                description=""
                category=[]
                interface=[]
                package=""
                doc=[]
                data=[]
                sampleinput=[]
                sampleoutput=[]
                platform=[]
          r   N)rE   rW   rX   Ú	interfaceÚpackagerY   rZ   ÚsampleinputÚsampleoutputr[   r\   rH   r'   r'   r(   r)   Ø  s    zProgram.__init__NrI   r'   r'   r'   r(   r›   Ö  s   r›   c                    s  ‡ fdd„}t j | ¡rt| dƒ}|D ]Î}t d|¡rH|t|ƒƒ}q(t d|¡r`t|ƒ|_q(t d|¡r~t|j	t|ƒƒ q(t d|¡r |j
 dt|ƒg¡ q(t d	|¡rÂ|j
 d
t|ƒg¡ q(t d|¡rä|j
 dt|ƒg¡ q(t d|¡r| dd¡ |j
 dt|ƒg¡ q(t d|¡r8|j
 dt|ƒg¡ q(t d|¡r\|j
 dt|ƒg¡ q(t d|¡r€|j
 dt|ƒg¡ q(t d|¡r¤|j
 dt|ƒg¡ q(t d|¡rÈ|j
 dt|ƒg¡ q(t d|¡rì|j
 dt|ƒg¡ q(t d|¡r|j
 dt|ƒg¡ q(t d|¡r4|j
 dt|ƒg¡ q(t d |¡rX|j
 d!t|ƒg¡ q(t d"|¡r||j
 d#t|ƒg¡ q(t d$|¡r |j
 d%t|ƒg¡ q(t d&|¡rÄ|j
 d't|ƒg¡ q(t d(|¡rè|j
 d)t|ƒg¡ q(t d*|¡rt|ƒ|_q(t d+|¡r,t |¡}t|j|d, ƒ q(t d-|¡rVt |¡}t|j|d, ƒ q(t d.|¡r€t |¡}t|j|d, ƒ q(t d/|¡rªt |¡}t|j|d, ƒ q(t d0|¡rÔt |¡}t|j|d, ƒ q(| d1¡rèd1|_q(| d2¡r(d2|_q(| ¡  d3S )4z×
    Read program.ace into a list of Program objects
    @param FN: The name of the file to be read in
    @type FN: str
    @param PROGS: The list of Program objects to read the file into
    @type PROGS: list
    c                    s,   | t v rt |  }ntƒ }ˆ  |¡ | |_|S )zå
        If a program called NAME already exists, return a pointer
        If it does not exist, create a new program object and return a pointer
        @param NAME: The name to attempt to assign
        @type NAME: str
        )ÚPROGDICTr›   r@   rE   )rB   ÚPR©ÚPROGSr'   r(   ÚAssignProgramþ  s    

z"ReadProgram.<locals>.AssignProgramr   zProgram\s:\s".+"rb   rc   zcommand\s+".+"Úcommandzinteractive\s+".+"Úinteractivez
gui\s+".+"Úguiz_birch_\s+".+"Ú_birch_Zbirchzbirchadmin\s+".+"Ú
birchadminzbldna\s+".+"Úbldnazblnalign\s+".+"Úblnalignzblprotein\s+".+"Ú	blproteinzblpalign\s+".+"Úblpalignzbldata\s+".+"Úbldatazblmarker\s+".+"Úblmarkerzblnfetch\s+".+"Úblnfetchzblpfetch\s+".+"Úblpfetchzblreads\s+".+"Úblreadszblncbi\s+".+"Úblncbizbltable\s+".+"Úbltablezbltree\s+".+"ÚbltreerP   rd   r
   re   zSample_input\s+".+"zSample_output\s+".+"rf   r   r   N)r   r   r   r   rQ   rR   r?   rW   rC   rX   rœ   r@   r<   r   rS   rT   rY   rZ   rž   rŸ   r[   Ú
startswithr\   r   )r#   r£   r¤   r$   r%   r¡   r&   r'   r¢   r(   ÚReadProgramó  s†    







r·   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚProgLaunchTablec                 C   s   d| _ g d¢| _g | _dS )z
          Initializes arguments:
                program =""
                comtype = ""
                command =""
          Ú
ProgLaunch)r›   ÚComTypeZCommandN)r   ÚheadersÚvaluesrH   r'   r'   r(   r)   ]  s    
zProgLaunchTable.__init__c                 C   s   | j  |¡ d S r“   )r¼   r@   )r"   r¼   r'   r'   r(   Ú	addvaluesh  s    zProgLaunchTable.addvaluesc                 C   sj  |  t¡ tƒ }|  d| j d t ¡ |  d| j d t ¡ |  d| jd  d d d	 t ¡ |  d| jd
  d d d t ¡ |  d| jd  d t ¡ |  dt ¡ |  t¡ |  d| j d ¡ |  d¡ |  dt ¡ | ¡  |  |jd t ¡ | ¡  t| jƒd
 }d}| jD ]2}t	|||ƒ ||krL|  dt ¡ |d
7 }q$|  dt ¡ dS )z3
        Write ProgLaunch table to SQLFILE
        r{   r|   r}   r~   r   r   r–   rF   r—   r
   rº   z
 NOT NULL,é   z TEXTr€   r   r‚   zprogram, Comtype, Commandrƒ   r„   r…   r†   N)
rr   r‡   rh   r   r»   ro   rl   r   r¼   rw   )r"   rs   rt   rˆ   r‰   ÚVr'   r'   r(   ÚWriteProgLaunchTablek  s.    
$$



z$ProgLaunchTable.WriteProgLaunchTableN)r*   r+   r,   r)   r½   rÀ   r'   r'   r'   r(   r¸   [  s   r¸   c                   @   s   e Zd Zdd„ ZdS )ÚFilec                 C   s   d| _ d| _d| _d| _dS )z«
          Initializes arguments:
                name=""
                description=""
                command='"$ACE_FILE_LAUNCHER" '
                path=""
          r   z$ACE_FILE_LAUNCHERN)rE   rW   r¥   r   rH   r'   r'   r(   r)   ‹  s    zFile.__init__NrI   r'   r'   r'   r(   rÁ   ‰  s   rÁ   c                    sŠ   ‡ fdd„}t j | ¡r†t| dƒ}|D ]V}t d|¡rD|t|ƒƒ}q&t d|¡r\t|ƒ|_q&t d|¡r&t 	|¡}|d |_q&| 
¡  dS )	zÎ
    Read file.ace into a list of file objects
    @param FN: The name of the file to be read in
    @type FN: str
    @param DOCFILES: the list of file objects to be read into
    @type DOCFILES: list
    c                    s,   | t v rt |  }ntƒ }ˆ  |¡ | |_|S )zß
        If a file called NAME already exists, return a pointer
        If it does not exist, create a new file object and return a pointer
        @param NAME: The name to attempt to assign
        @type NAME: str
        )ÚDOCDICTrÁ   r@   rE   )rB   ÚFL©ÚDOCFILESr'   r(   Ú
AssignFile¥  s    

z ReadDocFiles.<locals>.AssignFiler   zFile\s:\s".+"rb   zPick_me_to_call\s+".+"r¾   N)r   r   r   r   rQ   rR   r?   rW   rS   rT   r   )r#   rÅ   rÆ   r$   r%   rÃ   r&   r'   rÄ   r(   ÚReadDocFilesš  s    

rÇ   c           	      C   s   t ƒ }|  t¡ |  dt ¡ |  dt ¡ |  dt ¡ |  dt ¡ |  dt ¡ |  dt ¡ |  dt ¡ |  t¡ |  d¡ g d	¢}|  |d
 ¡ |dd… D ]}|  d| ¡ q¨|  dt ¡ | ¡  |  |jd t ¡ tt ¡ ƒ}|jdd„ d | ¡  t	|ƒd }d
}|D ]^}t| j
t| jt| jt| jg}t|ƒ t| ||ƒ ||krr|  dt ¡ |d7 }q|  dt ¡ | ¡  | ¡  dS )zR
            FIXME
            @param catfn:
            @type catfn:
            z!-- File -------------------------z!CREATE TABLE IF NOT EXISTS File (ú    Name TEXT PRIMARY KEY,ú    Description TEXT,z    PathOrURL TEXT,z    Action TEXTr€   zINSERT INTO File ( )ÚNameÚDescriptionZActionZ	PathOrURLr   r
   Nr˜   rƒ   r„   c                 S   s   |   ¡ S r“   ©Úlower)Z	PathToURLr'   r'   r(   Ú<lambda>Ý  ó    z"write_file_table.<locals>.<lambda>©rŠ   r…   r†   )rh   rr   r‡   ro   rl   ÚlistrÂ   ÚkeysÚsortr   rE   rW   r¥   r   r   rw   rp   )	rs   rt   ÚColNamesrE   Zfilelistrˆ   r‰   Zfilekeyru   r'   r'   r(   Úwrite_file_tableÃ  sB    


$
rÕ   c                 C   s0   t j | ¡rt | ¡ t  | ¡ t  | d¡ dS )z±
    Delete an existing directory and create an empty directory
    with the same name.
    @param DIRNAME: The name of the directory to be refreshed
    @type DIRNAME: str
    iý  N)r   r   ÚisdirÚshutilZrmtreeÚmkdirÚchmod)ZDIRNAMEr'   r'   r(   ÚFreshDirî  s    

rÚ   c           	      C   sº  t ƒ }|  t¡ |  dt ¡ |  dt ¡ |  dt ¡ |  dt ¡ |  dt ¡ |  dt ¡ |  t¡ |  d¡ g d¢}|  |d	 ¡ |d
d… D ]}|  d| ¡ qš|  dt ¡ | ¡  |  |jd t ¡ tt ¡ ƒ}|jdd„ d | ¡  t	|ƒd
 }d	}|D ]†}t	t| j
ƒd	kr@t| jt| jdg}n t| jt| jt| j
d	 g}t|ƒ t| ||ƒ ||krŒ|  dt ¡ |d
7 }q|  dt ¡ | ¡  | ¡  dS )z1
    Write Package data to the Package table
    z$-- Package -------------------------z$CREATE TABLE IF NOT EXISTS Package (rÈ   rÉ   z    Installation TEXTr€   zINSERT INTO Package ( )rÊ   rË   ÚInstallationr   r
   Nr˜   rƒ   r„   c                 S   s   |   ¡ S r“   rÌ   ©rE   r'   r'   r(   rÎ     rÏ   z#WritePackageTable.<locals>.<lambda>rÐ   r   r…   r†   )rh   rr   r‡   ro   rl   rÑ   r]   rÒ   rÓ   r   r\   rE   rW   r   rw   rp   )	rs   rt   rÔ   rE   Úpkglistrˆ   r‰   Zpkgkeyru   r'   r'   r(   ÚWritePackageTableü  sD    


 
rÞ   c           	      C   s   t ƒ }|  t¡ |  dt ¡ |  dt ¡ |  dt ¡ |  dt ¡ |  dt ¡ |  dt ¡ |  dt ¡ |  t¡ |  d¡ g d	¢}|  |d
 ¡ |dd… D ]}|  d| ¡ q¨|  dt ¡ | ¡  |  |jd t ¡ tt ¡ ƒ}|jdd„ d | ¡  t	|ƒd }d
}|D ]^}t| j
t| jt| jt| jg}t|ƒ t| ||ƒ ||krr|  dt ¡ |d7 }q|  dt ¡ | ¡  | ¡  dS )z1
    Write Program data to the Program table
    z$-- Program -------------------------z$CREATE TABLE IF NOT EXISTS program (z    name TEXT PRIMARY KEY,z    description TEXT,z-    package TEXT REFERENCES package NOT NULL,z    installation TEXTr€   zINSERT INTO program ( )rÊ   rË   rV   rÛ   r   r
   Nr˜   rƒ   r„   c                 S   s   |   ¡ S r“   rÌ   rÜ   r'   r'   r(   rÎ   >  rÏ   z#WriteProgramTable.<locals>.<lambda>rÐ   r…   r†   )rh   rr   r‡   ro   rl   rÑ   r    rÒ   rÓ   r   rE   rW   r   r\   r   rw   rp   )	rs   rt   rÔ   rE   Úproglistrˆ   r‰   Zprogkeyru   r'   r'   r(   ÚWriteProgramTable&  sB    


$
rà   c                   C   s
  t dƒ tƒ } t dƒ t | jd¡| _| j dd¡| _t d| j ƒ | jdkrTd}nd}t d	ƒ t| ƒ g }t d
ƒ d| jv r¼t	 
| j¡ td|ƒ t dtt|ƒƒ ƒ |D ]}|t|j< q¬d| jv rþt	j | j¡rþt	 
| j¡ td|ƒ |D ]}|t|j< qît dtttƒƒ ƒ g }t dƒ d| jv rjt	 
| j¡ td|ƒ t dtt|ƒƒ ƒ |D ]}|t|j< qXd| jv r²t	j | j¡r²t	 
| j¡ td|ƒ |D ]}|t|j< q t dtttƒƒ ƒ t dƒ d| jv rt	 
| j¡ tdtƒ t dtttƒƒ ƒ tD ]}|t|j< qd| jv rbt	j | j¡rbt	 
| j¡ tdtƒ tD ]}|t|j< qPt dtttƒƒ ƒ g }t dƒ d| jv rºt	 
| j¡ td|ƒ |D ]}|t|j< q¨d| jv rt	j | j¡rt	 
| j¡ td|ƒ |D ]}|t|j< qðt	 
| jd ¡ |
rt dƒ | jdgkr:tddƒ}	n
tddƒ}	|	 dt ¡ |	 d t ¡ |	 d!t ¡ |	 d"t ¡ t d#ƒ tƒ }
d$|
_d%|
_ t!t "¡ ƒ|
_#|
j#j$d&d'„ d( |
 %|	|
j|
j |
j#¡ t d)ƒ tƒ }d*|_d+|_ g d,¢|_#| %|	|j|j |j#¡ t d-ƒ tƒ }d.|_d/|_ g d0¢|_#| %|	|j|j |j#¡ t&|	ƒ t'|	ƒ t(|	ƒ t)ƒ }d1|_*d2|_+d$|_,d3|_-d4|_.t!t "¡ ƒ}|j$d5d'„ d( |D ]&}t| j/D ]}| 0||g¡ qªqœ| 1|	¡ t)ƒ }d6|_*d2|_+d7|_,d3|_-d8|_.t!t "¡ ƒ}|j$d9d'„ d( |D ]&}t| j2D ]}| 0||g¡ q q| 1|	¡ t)ƒ }d:|_*d2|_+d;|_,d3|_-d<|_.t!t "¡ ƒ}|j$d=d'„ d( |D ]&}t| j3D ]}| 0||g¡ q–qˆ| 1|	¡ t)ƒ }d>|_*d2|_+d?|_,d3|_-d8|_.t!t "¡ ƒ}|j$d@d'„ d( |D ]&}t| j4D ]}| 0||g¡ qqþ| 1|	¡ t)ƒ }dA|_*d2|_+d*|_,d3|_-d*|_.t!t "¡ ƒ}|j$dBd'„ d( |D ]&}t| j5D ]}| 0||g¡ q‚qt| 1|	¡ t)ƒ }dC|_*d;|_+d$|_,d<|_-d4|_.t!t "¡ ƒ}|j$dDd'„ d( |D ]&}t| j/D ]}| 0||g¡ qøqê| 1|	¡ t6ƒ }dE|_*t!t "¡ ƒ}|j$dFd'„ d( |D ]0}t| j7D ]}| 8||dG |dH g¡ qVqH| 9|	¡ t)ƒ }dI|_*d;|_+d7|_,d<|_-d8|_.t!t "¡ ƒ}|j$dJd'„ d( |D ]&}t| j2D ]}| 0||g¡ qÖqÈ| 1|	¡ t)ƒ }dK|_*d;|_+d?|_,d<|_-d8|_.t!t "¡ ƒ}|j$dLd'„ d( |D ]&}t| j4D ]}| 0||g¡ qLq>| 1|	¡ t)ƒ }dM|_*d;|_+dN|_,d<|_-d8|_.t!t "¡ ƒ}|j$dOd'„ d( |D ]&}t| j:D ]}| 0||g¡ qÂq´| 1|	¡ t)ƒ }dP|_*d;|_+dQ|_,d<|_-d8|_.t!t "¡ ƒ}|j$dRd'„ d( |D ]&}t| j;D ]}| 0||g¡ 	q8	q*| 1|	¡ t)ƒ }dS|_*d;|_+d*|_,d<|_-dT|_.t!t "¡ ƒ}|j$dUd'„ d( |D ]&}t| j5D ]}| 0||g¡ 	q®	q | 1|	¡ |	 dVt ¡ |	 dWt ¡ |	 dXt ¡ |	 <¡  dYS )Zz0
    Called when not in documentation mode.
    z***** obtaining parametersz***** reading BIRCH.propertiesZbirchURLr6   r   zP.DOCPREFIX: TFz***** dumping to ACEz***** reading categoriesr   zcategory.acezCategories:r   zCATDICT size: z***** reading packageszpackage.acez	Packages:zPKGDICT size: z***** reading programszprogram.acezProgs:zPROGDICT size: z%***** reading documentation filenameszfile.acer   z***** read OK *****zbirchdocdb.local.sqlÚwzbirchdocdb.sqlz-- File written by ace2sql.pyr{   zPRAGMA foreign_keys = off;zBEGIN TRANSACTION;z***** writing category tablerD   ZCatNamec                 S   s   |   ¡ S r“   rÌ   )Úkr'   r'   r(   rÎ   Ý  rÏ   zmain.<locals>.<lambda>rÐ   z***** writing platform tableZPlatformZPlatName)zlinux-x86_64zlinux-arm64z
osx-x86_64zmacos-arm64z***** writing ComType tablerº   ÚType)r¥   r¦   r§   r¨   r©   rª   r«   r¬   r­   r®   r¯   r°   r±   r²   r³   r´   rµ   ÚPkgCatrV   r   rX   c                 S   s   |   ¡ S r“   rÌ   rÜ   r'   r'   r(   rÎ   ÿ  rÏ   ÚPkgDocZDocumentationrÁ   c                 S   s   |   ¡ S r“   rÌ   rÜ   r'   r'   r(   rÎ     rÏ   ÚPkgProgr›   rF   c                 S   s   |   ¡ S r“   rÌ   rÜ   r'   r'   r(   rÎ     rÏ   ÚPkgDatZDatac                 S   s   |   ¡ S r“   rÌ   rÜ   r'   r'   r(   rÎ   )  rÏ   ÚPkgPlatc                 S   s   |   ¡ S r“   rÌ   rÜ   r'   r'   r(   rÎ   7  rÏ   ÚProgCatc                 S   s   |   ¡ S r“   rÌ   rÜ   r'   r'   r(   rÎ   E  rÏ   r¹   c                 S   s   |   ¡ S r“   rÌ   rÜ   r'   r'   r(   rÎ   O  rÏ   r   r
   ÚProgDocc                 S   s   |   ¡ S r“   rÌ   rÜ   r'   r'   r(   rÎ   ]  rÏ   ÚProgDatc                 S   s   |   ¡ S r“   rÌ   rÜ   r'   r'   r(   rÎ   k  rÏ   ÚProgSampleInpZSampleInputc                 S   s   |   ¡ S r“   rÌ   rÜ   r'   r'   r(   rÎ   y  rÏ   ÚProgSampleOutZSampleOutputc                 S   s   |   ¡ S r“   rÌ   rÜ   r'   r'   r(   rÎ   ‡  rÏ   ÚProgPlatr[   c                 S   s   |   ¡ S r“   rÌ   rÜ   r'   r'   r(   rÎ   •  rÏ   zCOMMIT TRANSACTION;zPRAGMA foreign_keys = on;z.exitN)=r   r   ÚBMZGetBIRCHPropertiesr   Z	DOCPREFIXr<   r4   r   r   r/   r    rU   r   r   rJ   rE   r   r   r!   rg   r]   r·   r£   r    rÇ   rÂ   r   rr   r‡   rx   ry   rz   rÑ   rÒ   ru   rÓ   r‹   rÕ   rÞ   rà   rŒ   r   rŽ   r   r   r‘   rX   r•   rš   rY   rF   rZ   r[   r¸   rœ   r½   rÀ   rž   rŸ   r   ) r2   ZOKAYrM   rK   r`   r^   r¡   rÅ   rÃ   rs   ZCatTableZ	PlatTablerº   rä   rÝ   r3   Úcrå   Údræ   Zprrç   rè   ré   rß   r¹   Úirê   rë   rì   rí   rî   r'   r'   r(   ÚmainO  sè   










	








 





ró   Ú__main__z-test)2r-   r   rQ   r×   r   r   ÚgetZblibr   r@   Zbirchlibr   r   r   ZPROGRAMr   rï   r£   rJ   r    r]   rÂ   rS   r‡   r   r4   r?   rC   rD   rU   rV   rg   rh   rw   rx   rŒ   r›   r·   r¸   rÁ   rÇ   rÕ   rÚ   rÞ   rà   ró   r*   Z
documentorr   Zexit_successr'   r'   r'   r(   Ú<module>   s`   

E1="-3h.)+*)  S
