MobileBlur

Hex Artifact Content
Login

Artifact 1d181823ece9496269d0d4e2cd8d6780e59da083:


0000: 23 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 75 74  # -*- coding: ut
0010: 66 2d 38 20 2d 2a 2d 0a 69 6d 70 6f 72 74 20 73  f-8 -*-.import s
0020: 74 72 75 63 74 0a 69 6d 70 6f 72 74 20 72 65 0a  truct.import re.
0030: 0a 74 72 79 3a 0a 20 20 20 20 69 6d 70 6f 72 74  .try:.    import
0040: 20 63 53 74 72 69 6e 67 49 4f 20 61 73 20 53 74   cStringIO as St
0050: 72 69 6e 67 49 4f 0a 65 78 63 65 70 74 20 49 6d  ringIO.except Im
0060: 70 6f 72 74 45 72 72 6f 72 3a 0a 20 20 20 20 69  portError:.    i
0070: 6d 70 6f 72 74 20 53 74 72 69 6e 67 49 4f 0a 0a  mport StringIO..
0080: 66 72 6f 6d 20 65 72 72 20 69 6d 70 6f 72 74 20  from err import 
0090: 57 61 72 6e 69 6e 67 2c 20 45 72 72 6f 72 2c 20  Warning, Error, 
00a0: 49 6e 74 65 72 66 61 63 65 45 72 72 6f 72 2c 20  InterfaceError, 
00b0: 44 61 74 61 45 72 72 6f 72 2c 20 5c 0a 20 20 20  DataError, \.   
00c0: 20 20 20 20 20 20 20 20 20 20 44 61 74 61 62 61            Databa
00d0: 73 65 45 72 72 6f 72 2c 20 4f 70 65 72 61 74 69  seError, Operati
00e0: 6f 6e 61 6c 45 72 72 6f 72 2c 20 49 6e 74 65 67  onalError, Integ
00f0: 72 69 74 79 45 72 72 6f 72 2c 20 49 6e 74 65 72  rityError, Inter
0100: 6e 61 6c 45 72 72 6f 72 2c 20 5c 0a 20 20 20 20  nalError, \.    
0110: 20 20 20 20 20 20 20 20 4e 6f 74 53 75 70 70 6f          NotSuppo
0120: 72 74 65 64 45 72 72 6f 72 2c 20 50 72 6f 67 72  rtedError, Progr
0130: 61 6d 6d 69 6e 67 45 72 72 6f 72 0a 0a 69 6e 73  ammingError..ins
0140: 65 72 74 5f 76 61 6c 75 65 73 20 3d 20 72 65 2e  ert_values = re.
0150: 63 6f 6d 70 69 6c 65 28 72 27 5c 73 76 61 6c 75  compile(r'\svalu
0160: 65 73 5c 73 2a 28 5c 28 2e 2b 5c 29 29 27 2c 20  es\s*(\(.+\))', 
0170: 72 65 2e 49 47 4e 4f 52 45 43 41 53 45 29 0a 0a  re.IGNORECASE)..
0180: 63 6c 61 73 73 20 43 75 72 73 6f 72 28 6f 62 6a  class Cursor(obj
0190: 65 63 74 29 3a 0a 20 20 20 20 27 27 27 0a 20 20  ect):.    '''.  
01a0: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 62    This is the ob
01b0: 6a 65 63 74 20 79 6f 75 20 75 73 65 20 74 6f 20  ject you use to 
01c0: 69 6e 74 65 72 61 63 74 20 77 69 74 68 20 74 68  interact with th
01d0: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
01e0: 27 27 27 0a 20 20 20 20 64 65 66 20 5f 5f 69 6e  '''.    def __in
01f0: 69 74 5f 5f 28 73 65 6c 66 2c 20 63 6f 6e 6e 65  it__(self, conne
0200: 63 74 69 6f 6e 29 3a 0a 20 20 20 20 20 20 20 20  ction):.        
0210: 27 27 27 0a 20 20 20 20 20 20 20 20 44 6f 20 6e  '''.        Do n
0220: 6f 74 20 63 72 65 61 74 65 20 61 6e 20 69 6e 73  ot create an ins
0230: 74 61 6e 63 65 20 6f 66 20 61 20 43 75 72 73 6f  tance of a Curso
0240: 72 20 79 6f 75 72 73 65 6c 66 2e 20 43 61 6c 6c  r yourself. Call
0250: 0a 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74  .        connect
0260: 69 6f 6e 73 2e 43 6f 6e 6e 65 63 74 69 6f 6e 2e  ions.Connection.
0270: 63 75 72 73 6f 72 28 29 2e 0a 20 20 20 20 20 20  cursor()..      
0280: 20 20 27 27 27 0a 20 20 20 20 20 20 20 20 66 72    '''.        fr
0290: 6f 6d 20 77 65 61 6b 72 65 66 20 69 6d 70 6f 72  om weakref impor
02a0: 74 20 70 72 6f 78 79 0a 20 20 20 20 20 20 20 20  t proxy.        
02b0: 73 65 6c 66 2e 63 6f 6e 6e 65 63 74 69 6f 6e 20  self.connection 
02c0: 3d 20 70 72 6f 78 79 28 63 6f 6e 6e 65 63 74 69  = proxy(connecti
02d0: 6f 6e 29 0a 20 20 20 20 20 20 20 20 73 65 6c 66  on).        self
02e0: 2e 64 65 73 63 72 69 70 74 69 6f 6e 20 3d 20 4e  .description = N
02f0: 6f 6e 65 0a 20 20 20 20 20 20 20 20 73 65 6c 66  one.        self
0300: 2e 72 6f 77 6e 75 6d 62 65 72 20 3d 20 30 0a 20  .rownumber = 0. 
0310: 20 20 20 20 20 20 20 73 65 6c 66 2e 72 6f 77 63         self.rowc
0320: 6f 75 6e 74 20 3d 20 2d 31 0a 20 20 20 20 20 20  ount = -1.      
0330: 20 20 73 65 6c 66 2e 61 72 72 61 79 73 69 7a 65    self.arraysize
0340: 20 3d 20 31 0a 20 20 20 20 20 20 20 20 73 65 6c   = 1.        sel
0350: 66 2e 5f 65 78 65 63 75 74 65 64 20 3d 20 4e 6f  f._executed = No
0360: 6e 65 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e  ne.        self.
0370: 6d 65 73 73 61 67 65 73 20 3d 20 5b 5d 0a 20 20  messages = [].  
0380: 20 20 20 20 20 20 73 65 6c 66 2e 65 72 72 6f 72        self.error
0390: 68 61 6e 64 6c 65 72 20 3d 20 63 6f 6e 6e 65 63  handler = connec
03a0: 74 69 6f 6e 2e 65 72 72 6f 72 68 61 6e 64 6c 65  tion.errorhandle
03b0: 72 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 5f  r.        self._
03c0: 68 61 73 5f 6e 65 78 74 20 3d 20 4e 6f 6e 65 0a  has_next = None.
03d0: 20 20 20 20 20 20 20 20 73 65 6c 66 2e 5f 72 6f          self._ro
03e0: 77 73 20 3d 20 28 29 0a 0a 20 20 20 20 64 65 66  ws = ()..    def
03f0: 20 5f 5f 64 65 6c 5f 5f 28 73 65 6c 66 29 3a 0a   __del__(self):.
0400: 20 20 20 20 20 20 20 20 27 27 27 0a 20 20 20 20          '''.    
0410: 20 20 20 20 57 68 65 6e 20 74 68 69 73 20 67 65      When this ge
0420: 74 73 20 47 43 27 64 20 63 6c 6f 73 65 20 69 74  ts GC'd close it
0430: 2e 0a 20 20 20 20 20 20 20 20 27 27 27 0a 20 20  ..        '''.  
0440: 20 20 20 20 20 20 73 65 6c 66 2e 63 6c 6f 73 65        self.close
0450: 28 29 0a 0a 20 20 20 20 64 65 66 20 63 6c 6f 73  ()..    def clos
0460: 65 28 73 65 6c 66 29 3a 0a 20 20 20 20 20 20 20  e(self):.       
0470: 20 27 27 27 0a 20 20 20 20 20 20 20 20 43 6c 6f   '''.        Clo
0480: 73 69 6e 67 20 61 20 63 75 72 73 6f 72 20 6a 75  sing a cursor ju
0490: 73 74 20 65 78 68 61 75 73 74 73 20 61 6c 6c 20  st exhausts all 
04a0: 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 2e 0a  remaining data..
04b0: 20 20 20 20 20 20 20 20 27 27 27 0a 20 20 20 20          '''.    
04c0: 20 20 20 20 69 66 20 6e 6f 74 20 73 65 6c 66 2e      if not self.
04d0: 63 6f 6e 6e 65 63 74 69 6f 6e 3a 0a 20 20 20 20  connection:.    
04e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0a 20          return. 
04f0: 20 20 20 20 20 20 20 74 72 79 3a 0a 20 20 20 20         try:.    
0500: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 73 65          while se
0510: 6c 66 2e 6e 65 78 74 73 65 74 28 29 3a 0a 20 20  lf.nextset():.  
0520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
0530: 73 73 0a 20 20 20 20 20 20 20 20 65 78 63 65 70  ss.        excep
0540: 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  t:.            p
0550: 61 73 73 0a 0a 20 20 20 20 20 20 20 20 73 65 6c  ass..        sel
0560: 66 2e 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 4e  f.connection = N
0570: 6f 6e 65 0a 0a 20 20 20 20 64 65 66 20 5f 67 65  one..    def _ge
0580: 74 5f 64 62 28 73 65 6c 66 29 3a 0a 20 20 20 20  t_db(self):.    
0590: 20 20 20 20 69 66 20 6e 6f 74 20 73 65 6c 66 2e      if not self.
05a0: 63 6f 6e 6e 65 63 74 69 6f 6e 3a 0a 20 20 20 20  connection:.    
05b0: 20 20 20 20 20 20 20 20 73 65 6c 66 2e 65 72 72          self.err
05c0: 6f 72 68 61 6e 64 6c 65 72 28 73 65 6c 66 2c 20  orhandler(self, 
05d0: 50 72 6f 67 72 61 6d 6d 69 6e 67 45 72 72 6f 72  ProgrammingError
05e0: 2c 20 22 63 75 72 73 6f 72 20 63 6c 6f 73 65 64  , "cursor closed
05f0: 22 29 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ").        retur
0600: 6e 20 73 65 6c 66 2e 63 6f 6e 6e 65 63 74 69 6f  n self.connectio
0610: 6e 0a 0a 20 20 20 20 64 65 66 20 5f 63 68 65 63  n..    def _chec
0620: 6b 5f 65 78 65 63 75 74 65 64 28 73 65 6c 66 29  k_executed(self)
0630: 3a 0a 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74  :.        if not
0640: 20 73 65 6c 66 2e 5f 65 78 65 63 75 74 65 64 3a   self._executed:
0650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c  .            sel
0660: 66 2e 65 72 72 6f 72 68 61 6e 64 6c 65 72 28 73  f.errorhandler(s
0670: 65 6c 66 2c 20 50 72 6f 67 72 61 6d 6d 69 6e 67  elf, Programming
0680: 45 72 72 6f 72 2c 20 22 65 78 65 63 75 74 65 28  Error, "execute(
0690: 29 20 66 69 72 73 74 22 29 0a 0a 20 20 20 20 64  ) first")..    d
06a0: 65 66 20 73 65 74 69 6e 70 75 74 73 69 7a 65 73  ef setinputsizes
06b0: 28 73 65 6c 66 2c 20 2a 61 72 67 73 29 3a 0a 20  (self, *args):. 
06c0: 20 20 20 20 20 20 20 22 22 22 44 6f 65 73 20 6e         """Does n
06d0: 6f 74 68 69 6e 67 2c 20 72 65 71 75 69 72 65 64  othing, required
06e0: 20 62 79 20 44 42 20 41 50 49 2e 22 22 22 0a 0a   by DB API."""..
06f0: 20 20 20 20 64 65 66 20 73 65 74 6f 75 74 70 75      def setoutpu
0700: 74 73 69 7a 65 73 28 73 65 6c 66 2c 20 2a 61 72  tsizes(self, *ar
0710: 67 73 29 3a 0a 20 20 20 20 20 20 20 20 22 22 22  gs):.        """
0720: 44 6f 65 73 20 6e 6f 74 68 69 6e 67 2c 20 72 65  Does nothing, re
0730: 71 75 69 72 65 64 20 62 79 20 44 42 20 41 50 49  quired by DB API
0740: 2e 22 22 22 0a 0a 20 20 20 20 64 65 66 20 6e 65  ."""..    def ne
0750: 78 74 73 65 74 28 73 65 6c 66 29 3a 0a 20 20 20  xtset(self):.   
0760: 20 20 20 20 20 27 27 27 20 47 65 74 20 74 68 65       ''' Get the
0770: 20 6e 65 78 74 20 71 75 65 72 79 20 73 65 74 20   next query set 
0780: 27 27 27 0a 20 20 20 20 20 20 20 20 69 66 20 73  '''.        if s
0790: 65 6c 66 2e 5f 65 78 65 63 75 74 65 64 3a 0a 20  elf._executed:. 
07a0: 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e             self.
07b0: 66 65 74 63 68 61 6c 6c 28 29 0a 20 20 20 20 20  fetchall().     
07c0: 20 20 20 64 65 6c 20 73 65 6c 66 2e 6d 65 73 73     del self.mess
07d0: 61 67 65 73 5b 3a 5d 0a 0a 20 20 20 20 20 20 20  ages[:]..       
07e0: 20 69 66 20 6e 6f 74 20 73 65 6c 66 2e 5f 68 61   if not self._ha
07f0: 73 5f 6e 65 78 74 3a 0a 20 20 20 20 20 20 20 20  s_next:.        
0800: 20 20 20 20 72 65 74 75 72 6e 20 4e 6f 6e 65 0a      return None.
0810: 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
0820: 6f 6e 20 3d 20 73 65 6c 66 2e 5f 67 65 74 5f 64  on = self._get_d
0830: 62 28 29 0a 20 20 20 20 20 20 20 20 63 6f 6e 6e  b().        conn
0840: 65 63 74 69 6f 6e 2e 6e 65 78 74 5f 72 65 73 75  ection.next_resu
0850: 6c 74 28 29 0a 20 20 20 20 20 20 20 20 73 65 6c  lt().        sel
0860: 66 2e 5f 64 6f 5f 67 65 74 5f 72 65 73 75 6c 74  f._do_get_result
0870: 28 29 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ().        retur
0880: 6e 20 54 72 75 65 0a 0a 20 20 20 20 64 65 66 20  n True..    def 
0890: 65 78 65 63 75 74 65 28 73 65 6c 66 2c 20 71 75  execute(self, qu
08a0: 65 72 79 2c 20 61 72 67 73 3d 4e 6f 6e 65 29 3a  ery, args=None):
08b0: 0a 20 20 20 20 20 20 20 20 27 27 27 20 45 78 65  .        ''' Exe
08c0: 63 75 74 65 20 61 20 71 75 65 72 79 20 27 27 27  cute a query '''
08d0: 0a 20 20 20 20 20 20 20 20 66 72 6f 6d 20 73 79  .        from sy
08e0: 73 20 69 6d 70 6f 72 74 20 65 78 63 5f 69 6e 66  s import exc_inf
08f0: 6f 0a 0a 20 20 20 20 20 20 20 20 63 6f 6e 6e 20  o..        conn 
0900: 3d 20 73 65 6c 66 2e 5f 67 65 74 5f 64 62 28 29  = self._get_db()
0910: 0a 20 20 20 20 20 20 20 20 63 68 61 72 73 65 74  .        charset
0920: 20 3d 20 63 6f 6e 6e 2e 63 68 61 72 73 65 74 0a   = conn.charset.
0930: 20 20 20 20 20 20 20 20 64 65 6c 20 73 65 6c 66          del self
0940: 2e 6d 65 73 73 61 67 65 73 5b 3a 5d 0a 0a 20 20  .messages[:]..  
0950: 20 20 20 20 20 20 23 20 54 4f 44 4f 3a 20 6d 61        # TODO: ma
0960: 6b 65 20 73 75 72 65 20 74 68 61 74 20 63 6f 6e  ke sure that con
0970: 6e 2e 65 73 63 61 70 65 20 69 73 20 63 6f 72 72  n.escape is corr
0980: 65 63 74 0a 0a 20 20 20 20 20 20 20 20 69 66 20  ect..        if 
0990: 61 72 67 73 20 69 73 20 6e 6f 74 20 4e 6f 6e 65  args is not None
09a0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 71 75  :.            qu
09b0: 65 72 79 20 3d 20 71 75 65 72 79 20 25 20 63 6f  ery = query % co
09c0: 6e 6e 2e 65 73 63 61 70 65 28 61 72 67 73 29 0a  nn.escape(args).
09d0: 0a 20 20 20 20 20 20 20 20 69 66 20 69 73 69 6e  .        if isin
09e0: 73 74 61 6e 63 65 28 71 75 65 72 79 2c 20 75 6e  stance(query, un
09f0: 69 63 6f 64 65 29 3a 0a 20 20 20 20 20 20 20 20  icode):.        
0a00: 20 20 20 20 71 75 65 72 79 20 3d 20 71 75 65 72      query = quer
0a10: 79 2e 65 6e 63 6f 64 65 28 63 68 61 72 73 65 74  y.encode(charset
0a20: 29 0a 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c  )..        resul
0a30: 74 20 3d 20 30 0a 20 20 20 20 20 20 20 20 74 72  t = 0.        tr
0a40: 79 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  y:.            r
0a50: 65 73 75 6c 74 20 3d 20 73 65 6c 66 2e 5f 71 75  esult = self._qu
0a60: 65 72 79 28 71 75 65 72 79 29 0a 20 20 20 20 20  ery(query).     
0a70: 20 20 20 65 78 63 65 70 74 3a 0a 20 20 20 20 20     except:.     
0a80: 20 20 20 20 20 20 20 65 78 63 2c 20 76 61 6c 75         exc, valu
0a90: 65 2c 20 74 62 20 3d 20 65 78 63 5f 69 6e 66 6f  e, tb = exc_info
0aa0: 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ().            d
0ab0: 65 6c 20 74 62 0a 20 20 20 20 20 20 20 20 20 20  el tb.          
0ac0: 20 20 73 65 6c 66 2e 6d 65 73 73 61 67 65 73 2e    self.messages.
0ad0: 61 70 70 65 6e 64 28 28 65 78 63 2c 76 61 6c 75  append((exc,valu
0ae0: 65 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  e)).            
0af0: 73 65 6c 66 2e 65 72 72 6f 72 68 61 6e 64 6c 65  self.errorhandle
0b00: 72 28 73 65 6c 66 2c 20 65 78 63 2c 20 76 61 6c  r(self, exc, val
0b10: 75 65 29 0a 0a 20 20 20 20 20 20 20 20 73 65 6c  ue)..        sel
0b20: 66 2e 5f 65 78 65 63 75 74 65 64 20 3d 20 71 75  f._executed = qu
0b30: 65 72 79 0a 20 20 20 20 20 20 20 20 72 65 74 75  ery.        retu
0b40: 72 6e 20 72 65 73 75 6c 74 0a 0a 20 20 20 20 64  rn result..    d
0b50: 65 66 20 65 78 65 63 75 74 65 6d 61 6e 79 28 73  ef executemany(s
0b60: 65 6c 66 2c 20 71 75 65 72 79 2c 20 61 72 67 73  elf, query, args
0b70: 29 3a 0a 20 20 20 20 20 20 20 20 27 27 27 20 52  ):.        ''' R
0b80: 75 6e 20 73 65 76 65 72 61 6c 20 64 61 74 61 20  un several data 
0b90: 61 67 61 69 6e 73 74 20 6f 6e 65 20 71 75 65 72  against one quer
0ba0: 79 20 27 27 27 0a 20 20 20 20 20 20 20 20 64 65  y '''.        de
0bb0: 6c 20 73 65 6c 66 2e 6d 65 73 73 61 67 65 73 5b  l self.messages[
0bc0: 3a 5d 0a 20 20 20 20 20 20 20 20 63 6f 6e 6e 20  :].        conn 
0bd0: 3d 20 73 65 6c 66 2e 5f 67 65 74 5f 64 62 28 29  = self._get_db()
0be0: 0a 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20  .        if not 
0bf0: 61 72 67 73 3a 0a 20 20 20 20 20 20 20 20 20 20  args:.          
0c00: 20 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 20    return.       
0c10: 20 63 68 61 72 73 65 74 20 3d 20 63 6f 6e 6e 2e   charset = conn.
0c20: 63 68 61 72 73 65 74 0a 20 20 20 20 20 20 20 20  charset.        
0c30: 69 66 20 69 73 69 6e 73 74 61 6e 63 65 28 71 75  if isinstance(qu
0c40: 65 72 79 2c 20 75 6e 69 63 6f 64 65 29 3a 0a 20  ery, unicode):. 
0c50: 20 20 20 20 20 20 20 20 20 20 20 71 75 65 72 79             query
0c60: 20 3d 20 71 75 65 72 79 2e 65 6e 63 6f 64 65 28   = query.encode(
0c70: 63 68 61 72 73 65 74 29 0a 0a 20 20 20 20 20 20  charset)..      
0c80: 20 20 73 65 6c 66 2e 72 6f 77 63 6f 75 6e 74 20    self.rowcount 
0c90: 3d 20 73 75 6d 28 5b 20 73 65 6c 66 2e 65 78 65  = sum([ self.exe
0ca0: 63 75 74 65 28 71 75 65 72 79 2c 20 61 72 67 29  cute(query, arg)
0cb0: 20 66 6f 72 20 61 72 67 20 69 6e 20 61 72 67 73   for arg in args
0cc0: 20 5d 29 0a 20 20 20 20 20 20 20 20 72 65 74 75   ]).        retu
0cd0: 72 6e 20 73 65 6c 66 2e 72 6f 77 63 6f 75 6e 74  rn self.rowcount
0ce0: 0a 0a 0a 20 20 20 20 64 65 66 20 63 61 6c 6c 70  ...    def callp
0cf0: 72 6f 63 28 73 65 6c 66 2c 20 70 72 6f 63 6e 61  roc(self, procna
0d00: 6d 65 2c 20 61 72 67 73 3d 28 29 29 3a 0a 20 20  me, args=()):.  
0d10: 20 20 20 20 20 20 22 22 22 45 78 65 63 75 74 65        """Execute
0d20: 20 73 74 6f 72 65 64 20 70 72 6f 63 65 64 75 72   stored procedur
0d30: 65 20 70 72 6f 63 6e 61 6d 65 20 77 69 74 68 20  e procname with 
0d40: 61 72 67 73 0a 0a 20 20 20 20 20 20 20 20 70 72  args..        pr
0d50: 6f 63 6e 61 6d 65 20 2d 2d 20 73 74 72 69 6e 67  ocname -- string
0d60: 2c 20 6e 61 6d 65 20 6f 66 20 70 72 6f 63 65 64  , name of proced
0d70: 75 72 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f  ure to execute o
0d80: 6e 20 73 65 72 76 65 72 0a 0a 20 20 20 20 20 20  n server..      
0d90: 20 20 61 72 67 73 20 2d 2d 20 53 65 71 75 65 6e    args -- Sequen
0da0: 63 65 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73  ce of parameters
0db0: 20 74 6f 20 75 73 65 20 77 69 74 68 20 70 72 6f   to use with pro
0dc0: 63 65 64 75 72 65 0a 0a 20 20 20 20 20 20 20 20  cedure..        
0dd0: 52 65 74 75 72 6e 73 20 74 68 65 20 6f 72 69 67  Returns the orig
0de0: 69 6e 61 6c 20 61 72 67 73 2e 0a 0a 20 20 20 20  inal args...    
0df0: 20 20 20 20 43 6f 6d 70 61 74 69 62 69 6c 69 74      Compatibilit
0e00: 79 20 77 61 72 6e 69 6e 67 3a 20 50 45 50 2d 32  y warning: PEP-2
0e10: 34 39 20 73 70 65 63 69 66 69 65 73 20 74 68 61  49 specifies tha
0e20: 74 20 61 6e 79 20 6d 6f 64 69 66 69 65 64 0a 20  t any modified. 
0e30: 20 20 20 20 20 20 20 70 61 72 61 6d 65 74 65 72         parameter
0e40: 73 20 6d 75 73 74 20 62 65 20 72 65 74 75 72 6e  s must be return
0e50: 65 64 2e 20 54 68 69 73 20 69 73 20 63 75 72 72  ed. This is curr
0e60: 65 6e 74 6c 79 20 69 6d 70 6f 73 73 69 62 6c 65  ently impossible
0e70: 0a 20 20 20 20 20 20 20 20 61 73 20 74 68 65 79  .        as they
0e80: 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61   are only availa
0e90: 62 6c 65 20 62 79 20 73 74 6f 72 69 6e 67 20 74  ble by storing t
0ea0: 68 65 6d 20 69 6e 20 61 20 73 65 72 76 65 72 0a  hem in a server.
0eb0: 20 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65          variable
0ec0: 20 61 6e 64 20 74 68 65 6e 20 72 65 74 72 69 65   and then retrie
0ed0: 76 65 64 20 62 79 20 61 20 71 75 65 72 79 2e 20  ved by a query. 
0ee0: 53 69 6e 63 65 20 73 74 6f 72 65 64 0a 20 20 20  Since stored.   
0ef0: 20 20 20 20 20 70 72 6f 63 65 64 75 72 65 73 20       procedures 
0f00: 72 65 74 75 72 6e 20 7a 65 72 6f 20 6f 72 20 6d  return zero or m
0f10: 6f 72 65 20 72 65 73 75 6c 74 20 73 65 74 73 2c  ore result sets,
0f20: 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 20 20 20   there is no.   
0f30: 20 20 20 20 20 72 65 6c 69 61 62 6c 65 20 77 61       reliable wa
0f40: 79 20 74 6f 20 67 65 74 20 61 74 20 4f 55 54 20  y to get at OUT 
0f50: 6f 72 20 49 4e 4f 55 54 20 70 61 72 61 6d 65 74  or INOUT paramet
0f60: 65 72 73 20 76 69 61 20 63 61 6c 6c 70 72 6f 63  ers via callproc
0f70: 2e 0a 20 20 20 20 20 20 20 20 54 68 65 20 73 65  ..        The se
0f80: 72 76 65 72 20 76 61 72 69 61 62 6c 65 73 20 61  rver variables a
0f90: 72 65 20 6e 61 6d 65 64 20 40 5f 70 72 6f 63 6e  re named @_procn
0fa0: 61 6d 65 5f 6e 2c 20 77 68 65 72 65 20 70 72 6f  ame_n, where pro
0fb0: 63 6e 61 6d 65 0a 20 20 20 20 20 20 20 20 69 73  cname.        is
0fc0: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 61   the parameter a
0fd0: 62 6f 76 65 20 61 6e 64 20 6e 20 69 73 20 74 68  bove and n is th
0fe0: 65 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  e position of th
0ff0: 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  e parameter.    
1000: 20 20 20 20 28 66 72 6f 6d 20 7a 65 72 6f 29 2e      (from zero).
1010: 20 4f 6e 63 65 20 61 6c 6c 20 72 65 73 75 6c 74   Once all result
1020: 20 73 65 74 73 20 67 65 6e 65 72 61 74 65 64 20   sets generated 
1030: 62 79 20 74 68 65 20 70 72 6f 63 65 64 75 72 65  by the procedure
1040: 0a 20 20 20 20 20 20 20 20 68 61 76 65 20 62 65  .        have be
1050: 65 6e 20 66 65 74 63 68 65 64 2c 20 79 6f 75 20  en fetched, you 
1060: 63 61 6e 20 69 73 73 75 65 20 61 20 53 45 4c 45  can issue a SELE
1070: 43 54 20 40 5f 70 72 6f 63 6e 61 6d 65 5f 30 2c  CT @_procname_0,
1080: 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 71 75 65   ....        que
1090: 72 79 20 75 73 69 6e 67 20 2e 65 78 65 63 75 74  ry using .execut
10a0: 65 28 29 20 74 6f 20 67 65 74 20 61 6e 79 20 4f  e() to get any O
10b0: 55 54 20 6f 72 20 49 4e 4f 55 54 20 76 61 6c 75  UT or INOUT valu
10c0: 65 73 2e 0a 0a 20 20 20 20 20 20 20 20 43 6f 6d  es...        Com
10d0: 70 61 74 69 62 69 6c 69 74 79 20 77 61 72 6e 69  patibility warni
10e0: 6e 67 3a 20 54 68 65 20 61 63 74 20 6f 66 20 63  ng: The act of c
10f0: 61 6c 6c 69 6e 67 20 61 20 73 74 6f 72 65 64 20  alling a stored 
1100: 70 72 6f 63 65 64 75 72 65 0a 20 20 20 20 20 20  procedure.      
1110: 20 20 69 74 73 65 6c 66 20 63 72 65 61 74 65 73    itself creates
1120: 20 61 6e 20 65 6d 70 74 79 20 72 65 73 75 6c 74   an empty result
1130: 20 73 65 74 2e 20 54 68 69 73 20 61 70 70 65 61   set. This appea
1140: 72 73 20 61 66 74 65 72 20 61 6e 79 0a 20 20 20  rs after any.   
1150: 20 20 20 20 20 72 65 73 75 6c 74 20 73 65 74 73       result sets
1160: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
1170: 65 20 70 72 6f 63 65 64 75 72 65 2e 20 54 68 69  e procedure. Thi
1180: 73 20 69 73 20 6e 6f 6e 2d 73 74 61 6e 64 61 72  s is non-standar
1190: 64 0a 20 20 20 20 20 20 20 20 62 65 68 61 76 69  d.        behavi
11a0: 6f 72 20 77 69 74 68 20 72 65 73 70 65 63 74 20  or with respect 
11b0: 74 6f 20 74 68 65 20 44 42 2d 41 50 49 2e 20 42  to the DB-API. B
11c0: 65 20 73 75 72 65 20 74 6f 20 75 73 65 20 6e 65  e sure to use ne
11d0: 78 74 73 65 74 28 29 0a 20 20 20 20 20 20 20 20  xtset().        
11e0: 74 6f 20 61 64 76 61 6e 63 65 20 74 68 72 6f 75  to advance throu
11f0: 67 68 20 61 6c 6c 20 72 65 73 75 6c 74 20 73 65  gh all result se
1200: 74 73 3b 20 6f 74 68 65 72 77 69 73 65 20 79 6f  ts; otherwise yo
1210: 75 20 6d 61 79 20 67 65 74 0a 20 20 20 20 20 20  u may get.      
1220: 20 20 64 69 73 63 6f 6e 6e 65 63 74 65 64 2e 0a    disconnected..
1230: 20 20 20 20 20 20 20 20 22 22 22 0a 20 20 20 20          """.    
1240: 20 20 20 20 63 6f 6e 6e 20 3d 20 73 65 6c 66 2e      conn = self.
1250: 5f 67 65 74 5f 64 62 28 29 0a 20 20 20 20 20 20  _get_db().      
1260: 20 20 66 6f 72 20 69 6e 64 65 78 2c 20 61 72 67    for index, arg
1270: 20 69 6e 20 65 6e 75 6d 65 72 61 74 65 28 61 72   in enumerate(ar
1280: 67 73 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  gs):.           
1290: 20 71 20 3d 20 22 53 45 54 20 40 5f 25 73 5f 25   q = "SET @_%s_%
12a0: 64 3d 25 73 22 20 25 20 28 70 72 6f 63 6e 61 6d  d=%s" % (procnam
12b0: 65 2c 20 69 6e 64 65 78 2c 20 63 6f 6e 6e 2e 65  e, index, conn.e
12c0: 73 63 61 70 65 28 61 72 67 29 29 0a 20 20 20 20  scape(arg)).    
12d0: 20 20 20 20 20 20 20 20 69 66 20 69 73 69 6e 73          if isins
12e0: 74 61 6e 63 65 28 71 2c 20 75 6e 69 63 6f 64 65  tance(q, unicode
12f0: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ):.             
1300: 20 20 20 71 20 3d 20 71 2e 65 6e 63 6f 64 65 28     q = q.encode(
1310: 63 6f 6e 6e 2e 63 68 61 72 73 65 74 29 0a 20 20  conn.charset).  
1320: 20 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e 5f            self._
1330: 71 75 65 72 79 28 71 29 0a 20 20 20 20 20 20 20  query(q).       
1340: 20 20 20 20 20 73 65 6c 66 2e 6e 65 78 74 73 65       self.nextse
1350: 74 28 29 0a 0a 20 20 20 20 20 20 20 20 71 20 3d  t()..        q =
1360: 20 22 43 41 4c 4c 20 25 73 28 25 73 29 22 20 25   "CALL %s(%s)" %
1370: 20 28 70 72 6f 63 6e 61 6d 65 2c 0a 20 20 20 20   (procname,.    
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 20 20 20 20 20 20 20 20 20 27 2c 27 2e 6a 6f 69           ','.joi
13a0: 6e 28 5b 27 40 5f 25 73 5f 25 64 27 20 25 20 28  n(['@_%s_%d' % (
13b0: 70 72 6f 63 6e 61 6d 65 2c 20 69 29 0a 20 20 20  procname, i).   
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 66 6f 72 20 69 20 69 6e 20 72 61 6e      for i in ran
13f0: 67 65 28 6c 65 6e 28 61 72 67 73 29 29 5d 29 29  ge(len(args))]))
1400: 0a 20 20 20 20 20 20 20 20 69 66 20 69 73 69 6e  .        if isin
1410: 73 74 61 6e 63 65 28 71 2c 20 75 6e 69 63 6f 64  stance(q, unicod
1420: 65 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  e):.            
1430: 71 20 3d 20 71 2e 65 6e 63 6f 64 65 28 63 6f 6e  q = q.encode(con
1440: 6e 2e 63 68 61 72 73 65 74 29 0a 20 20 20 20 20  n.charset).     
1450: 20 20 20 73 65 6c 66 2e 5f 71 75 65 72 79 28 71     self._query(q
1460: 29 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 5f  ).        self._
1470: 65 78 65 63 75 74 65 64 20 3d 20 71 0a 0a 20 20  executed = q..  
1480: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 67        return arg
1490: 73 0a 0a 20 20 20 20 64 65 66 20 66 65 74 63 68  s..    def fetch
14a0: 6f 6e 65 28 73 65 6c 66 29 3a 0a 20 20 20 20 20  one(self):.     
14b0: 20 20 20 27 27 27 20 46 65 74 63 68 20 74 68 65     ''' Fetch the
14c0: 20 6e 65 78 74 20 72 6f 77 20 27 27 27 0a 20 20   next row '''.  
14d0: 20 20 20 20 20 20 73 65 6c 66 2e 5f 63 68 65 63        self._chec
14e0: 6b 5f 65 78 65 63 75 74 65 64 28 29 0a 20 20 20  k_executed().   
14f0: 20 20 20 20 20 69 66 20 73 65 6c 66 2e 5f 72 6f       if self._ro
1500: 77 73 20 69 73 20 4e 6f 6e 65 20 6f 72 20 73 65  ws is None or se
1510: 6c 66 2e 72 6f 77 6e 75 6d 62 65 72 20 3e 3d 20  lf.rownumber >= 
1520: 6c 65 6e 28 73 65 6c 66 2e 5f 72 6f 77 73 29 3a  len(self._rows):
1530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1540: 75 72 6e 20 4e 6f 6e 65 0a 20 20 20 20 20 20 20  urn None.       
1550: 20 72 65 73 75 6c 74 20 3d 20 73 65 6c 66 2e 5f   result = self._
1560: 72 6f 77 73 5b 73 65 6c 66 2e 72 6f 77 6e 75 6d  rows[self.rownum
1570: 62 65 72 5d 0a 20 20 20 20 20 20 20 20 73 65 6c  ber].        sel
1580: 66 2e 72 6f 77 6e 75 6d 62 65 72 20 2b 3d 20 31  f.rownumber += 1
1590: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15a0: 72 65 73 75 6c 74 0a 0a 20 20 20 20 64 65 66 20  result..    def 
15b0: 66 65 74 63 68 6d 61 6e 79 28 73 65 6c 66 2c 20  fetchmany(self, 
15c0: 73 69 7a 65 3d 4e 6f 6e 65 29 3a 0a 20 20 20 20  size=None):.    
15d0: 20 20 20 20 27 27 27 20 46 65 74 63 68 20 73 65      ''' Fetch se
15e0: 76 65 72 61 6c 20 72 6f 77 73 20 27 27 27 0a 20  veral rows '''. 
15f0: 20 20 20 20 20 20 20 73 65 6c 66 2e 5f 63 68 65         self._che
1600: 63 6b 5f 65 78 65 63 75 74 65 64 28 29 0a 20 20  ck_executed().  
1610: 20 20 20 20 20 20 65 6e 64 20 3d 20 73 65 6c 66        end = self
1620: 2e 72 6f 77 6e 75 6d 62 65 72 20 2b 20 28 73 69  .rownumber + (si
1630: 7a 65 20 6f 72 20 73 65 6c 66 2e 61 72 72 61 79  ze or self.array
1640: 73 69 7a 65 29 0a 20 20 20 20 20 20 20 20 72 65  size).        re
1650: 73 75 6c 74 20 3d 20 73 65 6c 66 2e 5f 72 6f 77  sult = self._row
1660: 73 5b 73 65 6c 66 2e 72 6f 77 6e 75 6d 62 65 72  s[self.rownumber
1670: 3a 65 6e 64 5d 0a 20 20 20 20 20 20 20 20 69 66  :end].        if
1680: 20 73 65 6c 66 2e 5f 72 6f 77 73 20 69 73 20 4e   self._rows is N
1690: 6f 6e 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  one:.           
16a0: 20 72 65 74 75 72 6e 20 4e 6f 6e 65 0a 20 20 20   return None.   
16b0: 20 20 20 20 20 73 65 6c 66 2e 72 6f 77 6e 75 6d       self.rownum
16c0: 62 65 72 20 3d 20 6d 69 6e 28 65 6e 64 2c 20 6c  ber = min(end, l
16d0: 65 6e 28 73 65 6c 66 2e 5f 72 6f 77 73 29 29 0a  en(self._rows)).
16e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
16f0: 65 73 75 6c 74 0a 0a 20 20 20 20 64 65 66 20 66  esult..    def f
1700: 65 74 63 68 61 6c 6c 28 73 65 6c 66 29 3a 0a 20  etchall(self):. 
1710: 20 20 20 20 20 20 20 27 27 27 20 46 65 74 63 68         ''' Fetch
1720: 20 61 6c 6c 20 74 68 65 20 72 6f 77 73 20 27 27   all the rows ''
1730: 27 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 5f  '.        self._
1740: 63 68 65 63 6b 5f 65 78 65 63 75 74 65 64 28 29  check_executed()
1750: 0a 20 20 20 20 20 20 20 20 69 66 20 73 65 6c 66  .        if self
1760: 2e 5f 72 6f 77 73 20 69 73 20 4e 6f 6e 65 3a 0a  ._rows is None:.
1770: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1780: 72 6e 20 4e 6f 6e 65 0a 20 20 20 20 20 20 20 20  rn None.        
1790: 69 66 20 73 65 6c 66 2e 72 6f 77 6e 75 6d 62 65  if self.rownumbe
17a0: 72 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  r:.            r
17b0: 65 73 75 6c 74 20 3d 20 73 65 6c 66 2e 5f 72 6f  esult = self._ro
17c0: 77 73 5b 73 65 6c 66 2e 72 6f 77 6e 75 6d 62 65  ws[self.rownumbe
17d0: 72 3a 5d 0a 20 20 20 20 20 20 20 20 65 6c 73 65  r:].        else
17e0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  :.            re
17f0: 73 75 6c 74 20 3d 20 73 65 6c 66 2e 5f 72 6f 77  sult = self._row
1800: 73 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 72  s.        self.r
1810: 6f 77 6e 75 6d 62 65 72 20 3d 20 6c 65 6e 28 73  ownumber = len(s
1820: 65 6c 66 2e 5f 72 6f 77 73 29 0a 20 20 20 20 20  elf._rows).     
1830: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74     return result
1840: 0a 0a 20 20 20 20 64 65 66 20 73 63 72 6f 6c 6c  ..    def scroll
1850: 28 73 65 6c 66 2c 20 76 61 6c 75 65 2c 20 6d 6f  (self, value, mo
1860: 64 65 3d 27 72 65 6c 61 74 69 76 65 27 29 3a 0a  de='relative'):.
1870: 20 20 20 20 20 20 20 20 73 65 6c 66 2e 5f 63 68          self._ch
1880: 65 63 6b 5f 65 78 65 63 75 74 65 64 28 29 0a 20  eck_executed(). 
1890: 20 20 20 20 20 20 20 69 66 20 6d 6f 64 65 20 3d         if mode =
18a0: 3d 20 27 72 65 6c 61 74 69 76 65 27 3a 0a 20 20  = 'relative':.  
18b0: 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73 65            r = se
18c0: 6c 66 2e 72 6f 77 6e 75 6d 62 65 72 20 2b 20 76  lf.rownumber + v
18d0: 61 6c 75 65 0a 20 20 20 20 20 20 20 20 65 6c 69  alue.        eli
18e0: 66 20 6d 6f 64 65 20 3d 3d 20 27 61 62 73 6f 6c  f mode == 'absol
18f0: 75 74 65 27 3a 0a 20 20 20 20 20 20 20 20 20 20  ute':.          
1900: 20 20 72 20 3d 20 76 61 6c 75 65 0a 20 20 20 20    r = value.    
1910: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
1920: 20 20 20 20 20 20 73 65 6c 66 2e 65 72 72 6f 72        self.error
1930: 68 61 6e 64 6c 65 72 28 73 65 6c 66 2c 20 50 72  handler(self, Pr
1940: 6f 67 72 61 6d 6d 69 6e 67 45 72 72 6f 72 2c 0a  ogrammingError,.
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 73 63 72      "unknown scr
1970: 6f 6c 6c 20 6d 6f 64 65 20 25 73 22 20 25 20 6d  oll mode %s" % m
1980: 6f 64 65 29 0a 0a 20 20 20 20 20 20 20 20 69 66  ode)..        if
1990: 20 72 20 3c 20 30 20 6f 72 20 72 20 3e 3d 20 6c   r < 0 or r >= l
19a0: 65 6e 28 73 65 6c 66 2e 5f 72 6f 77 73 29 3a 0a  en(self._rows):.
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66              self
19c0: 2e 65 72 72 6f 72 68 61 6e 64 6c 65 72 28 73 65  .errorhandler(se
19d0: 6c 66 2c 20 49 6e 64 65 78 45 72 72 6f 72 2c 20  lf, IndexError, 
19e0: 22 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 29 0a  "out of range").
19f0: 20 20 20 20 20 20 20 20 73 65 6c 66 2e 72 6f 77          self.row
1a00: 6e 75 6d 62 65 72 20 3d 20 72 0a 0a 20 20 20 20  number = r..    
1a10: 64 65 66 20 5f 71 75 65 72 79 28 73 65 6c 66 2c  def _query(self,
1a20: 20 71 29 3a 0a 20 20 20 20 20 20 20 20 63 6f 6e   q):.        con
1a30: 6e 20 3d 20 73 65 6c 66 2e 5f 67 65 74 5f 64 62  n = self._get_db
1a40: 28 29 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e  ().        self.
1a50: 5f 6c 61 73 74 5f 65 78 65 63 75 74 65 64 20 3d  _last_executed =
1a60: 20 71 0a 20 20 20 20 20 20 20 20 63 6f 6e 6e 2e   q.        conn.
1a70: 71 75 65 72 79 28 71 29 0a 20 20 20 20 20 20 20  query(q).       
1a80: 20 73 65 6c 66 2e 5f 64 6f 5f 67 65 74 5f 72 65   self._do_get_re
1a90: 73 75 6c 74 28 29 0a 20 20 20 20 20 20 20 20 72  sult().        r
1aa0: 65 74 75 72 6e 20 73 65 6c 66 2e 72 6f 77 63 6f  eturn self.rowco
1ab0: 75 6e 74 0a 0a 20 20 20 20 64 65 66 20 5f 64 6f  unt..    def _do
1ac0: 5f 67 65 74 5f 72 65 73 75 6c 74 28 73 65 6c 66  _get_result(self
1ad0: 29 3a 0a 20 20 20 20 20 20 20 20 63 6f 6e 6e 20  ):.        conn 
1ae0: 3d 20 73 65 6c 66 2e 5f 67 65 74 5f 64 62 28 29  = self._get_db()
1af0: 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 72 6f  .        self.ro
1b00: 77 63 6f 75 6e 74 20 3d 20 63 6f 6e 6e 2e 5f 72  wcount = conn._r
1b10: 65 73 75 6c 74 2e 61 66 66 65 63 74 65 64 5f 72  esult.affected_r
1b20: 6f 77 73 0a 0a 20 20 20 20 20 20 20 20 73 65 6c  ows..        sel
1b30: 66 2e 72 6f 77 6e 75 6d 62 65 72 20 3d 20 30 0a  f.rownumber = 0.
1b40: 20 20 20 20 20 20 20 20 73 65 6c 66 2e 64 65 73          self.des
1b50: 63 72 69 70 74 69 6f 6e 20 3d 20 63 6f 6e 6e 2e  cription = conn.
1b60: 5f 72 65 73 75 6c 74 2e 64 65 73 63 72 69 70 74  _result.descript
1b70: 69 6f 6e 0a 20 20 20 20 20 20 20 20 73 65 6c 66  ion.        self
1b80: 2e 6c 61 73 74 72 6f 77 69 64 20 3d 20 63 6f 6e  .lastrowid = con
1b90: 6e 2e 5f 72 65 73 75 6c 74 2e 69 6e 73 65 72 74  n._result.insert
1ba0: 5f 69 64 0a 20 20 20 20 20 20 20 20 73 65 6c 66  _id.        self
1bb0: 2e 5f 72 6f 77 73 20 3d 20 63 6f 6e 6e 2e 5f 72  ._rows = conn._r
1bc0: 65 73 75 6c 74 2e 72 6f 77 73 0a 20 20 20 20 20  esult.rows.     
1bd0: 20 20 20 73 65 6c 66 2e 5f 68 61 73 5f 6e 65 78     self._has_nex
1be0: 74 20 3d 20 63 6f 6e 6e 2e 5f 72 65 73 75 6c 74  t = conn._result
1bf0: 2e 68 61 73 5f 6e 65 78 74 0a 20 20 20 20 20 20  .has_next.      
1c00: 20 20 63 6f 6e 6e 2e 5f 72 65 73 75 6c 74 20 3d    conn._result =
1c10: 20 4e 6f 6e 65 0a 0a 20 20 20 20 64 65 66 20 5f   None..    def _
1c20: 5f 69 74 65 72 5f 5f 28 73 65 6c 66 29 3a 0a 20  _iter__(self):. 
1c30: 20 20 20 20 20 20 20 73 65 6c 66 2e 5f 63 68 65         self._che
1c40: 63 6b 5f 65 78 65 63 75 74 65 64 28 29 0a 20 20  ck_executed().  
1c50: 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 73        result = s
1c60: 65 6c 66 2e 72 6f 77 6e 75 6d 62 65 72 20 61 6e  elf.rownumber an
1c70: 64 20 73 65 6c 66 2e 5f 72 6f 77 73 5b 73 65 6c  d self._rows[sel
1c80: 66 2e 72 6f 77 6e 75 6d 62 65 72 3a 5d 20 6f 72  f.rownumber:] or
1c90: 20 73 65 6c 66 2e 5f 72 6f 77 73 0a 20 20 20 20   self._rows.    
1ca0: 20 20 20 20 72 65 74 75 72 6e 20 69 74 65 72 28      return iter(
1cb0: 72 65 73 75 6c 74 29 0a 0a 20 20 20 20 57 61 72  result)..    War
1cc0: 6e 69 6e 67 20 3d 20 57 61 72 6e 69 6e 67 0a 20  ning = Warning. 
1cd0: 20 20 20 45 72 72 6f 72 20 3d 20 45 72 72 6f 72     Error = Error
1ce0: 0a 20 20 20 20 49 6e 74 65 72 66 61 63 65 45 72  .    InterfaceEr
1cf0: 72 6f 72 20 3d 20 49 6e 74 65 72 66 61 63 65 45  ror = InterfaceE
1d00: 72 72 6f 72 0a 20 20 20 20 44 61 74 61 62 61 73  rror.    Databas
1d10: 65 45 72 72 6f 72 20 3d 20 44 61 74 61 62 61 73  eError = Databas
1d20: 65 45 72 72 6f 72 0a 20 20 20 20 44 61 74 61 45  eError.    DataE
1d30: 72 72 6f 72 20 3d 20 44 61 74 61 45 72 72 6f 72  rror = DataError
1d40: 0a 20 20 20 20 4f 70 65 72 61 74 69 6f 6e 61 6c  .    Operational
1d50: 45 72 72 6f 72 20 3d 20 4f 70 65 72 61 74 69 6f  Error = Operatio
1d60: 6e 61 6c 45 72 72 6f 72 0a 20 20 20 20 49 6e 74  nalError.    Int
1d70: 65 67 72 69 74 79 45 72 72 6f 72 20 3d 20 49 6e  egrityError = In
1d80: 74 65 67 72 69 74 79 45 72 72 6f 72 0a 20 20 20  tegrityError.   
1d90: 20 49 6e 74 65 72 6e 61 6c 45 72 72 6f 72 20 3d   InternalError =
1da0: 20 49 6e 74 65 72 6e 61 6c 45 72 72 6f 72 0a 20   InternalError. 
1db0: 20 20 20 50 72 6f 67 72 61 6d 6d 69 6e 67 45 72     ProgrammingEr
1dc0: 72 6f 72 20 3d 20 50 72 6f 67 72 61 6d 6d 69 6e  ror = Programmin
1dd0: 67 45 72 72 6f 72 0a 20 20 20 20 4e 6f 74 53 75  gError.    NotSu
1de0: 70 70 6f 72 74 65 64 45 72 72 6f 72 20 3d 20 4e  pportedError = N
1df0: 6f 74 53 75 70 70 6f 72 74 65 64 45 72 72 6f 72  otSupportedError
1e00: 0a 0a                                            ..