ó
a#nSc           @   sð   d  Z  d d l m Z d d l m Z d d l m Z d „  Z d d „ Z d d	 „ Z	 d
 d „ Z
 d
 d d „ Z d d d
 d d „ Z d d
 d d „ Z d Z i e d 6Z d „  Z e d k rì d d l Z e ƒ  \ Z Z e j e ƒ n  d S(   s:    Various storage (molecular and otherwise) functionality

iÿÿÿÿ(   t   RDConfig(   t   DbModule(   t	   DbConnectc         C   s©   |  j  d d ƒ }  |  j d ƒ } t | ƒ d k  r7 d Sd } xK | d d !D]< } x3 | D]+ } y t | ƒ } Wn d SX| | 7} qX WqK Wt | d ƒ } | d | k S(   sÖ    returns whether or not an RDId is valid

  >>> ValidateRDId('RDCmpd-000-009-9')
  1
  >>> ValidateRDId('RDCmpd-009-000-009-8')
  1
  >>> ValidateRDId('RDCmpd-009-000-109-8')
  0
  >>> ValidateRDId('bogus')
  0

  t   _t   -i   i    i   iÿÿÿÿi
   (   t   replacet   splitt   lent   int(   t   idt   splitIdt   accumt   entryt   chart   vt   crc(    (    sZ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/Dbase/StorageUtils.pyt   ValidateRDId   s    i   c         C   s�   | r t  |  ƒ r t d ‚ n  |  j d d ƒ }  |  j d ƒ d d !} d } d } | j ƒ  x, | D]$ } | | t | ƒ 7} | d 9} qd W| S(   sÔ   Returns the integer index for a given RDId
  Throws a ValueError on error

  >>> RDIdToInt('RDCmpd-000-009-9')
  9
  >>> RDIdToInt('RDCmpd-009-000-009-8')
  9000009
  >>> RDIdToInt('RDData_000_009_9')
  9
  >>> try:
  ...   RDIdToInt('RDCmpd-009-000-109-8')
  ... except ValueError:
  ...   print 'ok'
  ... else:
  ...   print 'failed'
  ok
  >>> try:
  ...   RDIdToInt('bogus')
  ... except ValueError:
  ...   print 'ok'
  ... else:
  ...   print 'failed'
  ok

  s	   Bad RD IdR   R   i   iÿÿÿÿi    iè  (   R   t
   ValueErrorR   R   t   reverseR   (   R	   t   validatet   termst   rest   factort   term(    (    sZ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/Dbase/StorageUtils.pyt	   RDIdToInt.   s    
t   RDCmpdc         C   sç   |  d k  r t  d ‚ n  | d } |  } |  d k rY | d |  d 7} |  t d ƒ } n  | d k  rr | d 7} n | d | d 7} | d } | d | 7} d } t |  ƒ } x | D] } | t | ƒ 7} qµ W| t | d ƒ 7} | S(	   s�   Converts an integer index into an RDId

  The format of the ID is:
    leadText-xxx-xxx-xxx-y
  The number blocks are zero padded and the the final digit (y)
  is a checksum:
  >>> str(IndexToRDId(9))
  'RDCmpd-000-009-9'
  >>> str(IndexToRDId(9009))
  'RDCmpd-009-009-8'

  A millions block is included if it's nonzero:
  >>> str(IndexToRDId(9000009))
  'RDCmpd-009-000-009-8'

  The text at the beginning can be altered:
  >>> str(IndexToRDId(9,leadText='RDAlt'))
  'RDAlt-000-009-9'

  Negative indices are errors:
  >>> try:
  ...   IndexToRDId(-1)
  ... except ValueError:
  ...   print 'ok'
  ... else:
  ...   print 'failed'
  ok

  i    s   indices must be >= zeroR   g    €„.As   %03d-iè  s   000-i
   (   R   R   t   str(   t   idxt   leadTextR   t   tmpIdxR   t   txtR   (    (    sZ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/Dbase/StorageUtils.pyt   IndexToRDIdU   s$    

t   Idc         C   sh   |  j  d | d | ƒ } d } x9 | D]1 } t | d d d ƒ} | | k r% | } q% q% W| d 7} | S(   s`    returns the next available Id in the database

  see RegisterItem for testing/documentation

  t   tablet   fieldsi    R   i   (   t   GetDataR   (   t   connR!   t	   idColNamet   valst   maxt   val(    (    sZ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/Dbase/StorageUtils.pyt	   GetNextIdŠ   s     
t    c         C   ss   | sN |  j  d | d | ƒ d d } | j d d ƒ } | j d ƒ d } n  t |  | d | ƒ} t | d | ƒS(   sb    returns the next available RDId in the database

  see RegisterItem for testing/documentation

  R!   R"   i    R   R   R%   R   (   R#   R   R   R)   R   (   R$   R!   R%   R   R(   R	   (    (    sZ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/Dbase/StorageUtils.pyt   GetNextRDId˜   s     c         C   s¿   |  j  ƒ  } d | | | t j f }	 | j |	 | f ƒ | j ƒ  }
 |
 rX d |
 d f S| s| t |  | d | d | ƒ} n  | rµ | g } | j | ƒ |  j | | ƒ |  j ƒ  n  d | f S(   sS  

  >>> dbName =  RDConfig.RDTestDatabase
  >>> conn = DbConnect(dbName)
  >>> tblName = 'StorageTest'
  >>> conn.AddTable(tblName,'id varchar(32) not null primary key,label varchar(40),val int')
  >>> RegisterItem(conn,tblName,'label1','label',['label1',1])==(1, 'RDCmpd-000-001-1')
  True
  >>> RegisterItem(conn,tblName,'label2','label',['label2',1])==(1, 'RDCmpd-000-002-2')
  True
  >>> RegisterItem(conn,tblName,'label1','label',['label1',1])==(0, 'RDCmpd-000-001-1')
  True
  >>> str(GetNextRDId(conn,tblName))
  'RDCmpd-000-003-3'
  >>> tuple(conn.GetData(table=tblName)[0])==('RDCmpd-000-001-1', 'label1', 1)
  True

  It's also possible to provide ids by hand:
  >>> RegisterItem(conn,tblName,'label10','label',['label10',1],id='RDCmpd-000-010-1')==(1, 'RDCmpd-000-010-1')
  True
  >>> str(GetNextRDId(conn,tblName))
  'RDCmpd-000-011-2'

  s   select %s from %s where %s=%si    R%   R   i   (	   t	   GetCursorR   t   placeHoldert   executet   fetchoneR+   t   extendt
   InsertDatat   Commit(   R$   R!   t   valuet
   columnNamet   dataR	   R%   R   t   curst   queryt   tmpt   row(    (    sZ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/Dbase/StorageUtils.pyt   RegisterItem¦   s    	c         C   sv  | r* t  | ƒ t  | ƒ k r* t d ‚ n  t  | ƒ } i  }	 x$ t | ƒ D] \ }
 } |
 |	 | <qI W|  j ƒ  } d j t j | ƒ } | j d t ƒ  ƒ | j	 d g  | D] } | f ^ q© ƒ d t ƒ  } | j | ƒ | j
 ƒ  } | rt  | ƒ | k rd g  | D] } | d ^ qf S| sNt |  | d | d	 | ƒ} t | ƒ } n  d g | } x" | D] \ } } | | |	 | <qbWg  } xƒ t | ƒ D]u }
 | |
 d k r“| } | d 7} t | d	 | ƒ} | | |
 <| r| g } | j | |
 ƒ | j | ƒ qq“q“W| r\t  | d ƒ } d j t j | ƒ } | j	 d
 t ƒ  | ƒ |  j ƒ  n  t  | ƒ t  | ƒ | f S(   s   
  s'   length mismatch between rows and valuest   ,s4   create temporary table regitemstemp (%(columnName)s)s#   insert into regitemstemp values (?)sg   select %(columnName)s,%(idColName)s from %(table)s where %(columnName)s in (select * from regitemstemp)i    i   R%   R   s%   insert into %(table)s values (%(qs)s)N(   R   R   t	   enumerateR,   t   joinR   R-   R.   t   localst   executemanyt   fetchallR+   R   t   Nonet   rangeR   R0   t   appendR2   (   R$   R!   t   valuesR4   t   rowst   startIdR%   R   t   nValst	   origOrdert   iR   R6   t   qst   xR7   t   dbDatat   idsR(   R	   t   rowsToInsertR9   t   nCols(    (    sZ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/Dbase/StorageUtils.pyt   RegisterItemsÏ   sL    &!

	së   
>>> ValidateRDId(IndexToRDId(100))
1
>>> ValidateRDId(IndexToRDId(10000,leadText='foo'))
1
>>> indices = [1,100,1000,1000000]
>>> vals = []
>>> for idx in indices:
...   vals.append(RDIdToInt(IndexToRDId(idx)))
>>> vals == indices
1

t	   roundtripc          C   s,   d d  l  }  d d  l } |  j | j d ƒ S(   Niÿÿÿÿt   __main__(   t   doctestt   syst   testmodt   modules(   RS   RT   (    (    sZ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/Dbase/StorageUtils.pyt   _test  s    RR   N(   t   __doc__t   rdkitR    t   rdkit.DbaseR   t   rdkit.Dbase.DbConnectionR   R   R   R   R)   R+   RA   R:   RP   t   _roundtripTestst   __test__RW   t   __name__RT   t   failedt   triedt   exit(    (    (    sZ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/python2.7/site-packages/rdkit/Dbase/StorageUtils.pyt   <module>   s$   	'5)B	