Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.os.vms    |    DEC's VAX* line of computers & VMS.    |    264,096 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 263,813 of 264,096    |
|    =?UTF-8?Q?Arne_Vajh=C3=B8j?= to All    |
|    Re: And so? (VMS/XDE)    |
|    21 Nov 25 19:09:48    |
   
   From: arne@vajhoej.dk   
      
   On 11/20/2025 7:55 PM, Arne Vajhøj wrote:   
   > Let me demo SQLPY "Embedded SQL for Python".   
   >   
   > :-) :-) :-)   
   >   
   > Mostly based on SQLJ.   
   >   
   > $ type test.sqlpy   
      
   > $ python sqlpy.py TEST.sqlpy TEST.py   
   > $ python TEST.py   
      
   And for the curious here is sqlpy.py (it is just a   
   bunch of regex):   
      
   import sys   
   import re   
      
   PAT_CONTEXT = r"^\*sql context (\w+)$"   
   PAT_ITERATOR = r"^\*sql iterator (\w+)$"   
   PAT_QUERY = r"^(\W*)\*sql \[(\w+)\] (\w+) = {(.*)}$"   
   PAT_UPDATE = r"^(\W*)\*sql \[(\w+)\] {(.*)}$"   
   PAT_PARAM = r":(\w+)"   
   PAT_FETCH = r"^(\W*)\*sql { fetch :(\w+) INTO (.*) }$"   
      
   def params(sqlstr):   
    return re.findall(PAT_PARAM, sqlstr)   
      
   sqlpy = open(sys.argv[1], "r")   
   py = open(sys.argv[2], "w")   
   for line in sqlpy:   
    pureline = line.rstrip()   
    pat_context = re.match(PAT_CONTEXT, pureline)   
    pat_iterator = re.match(PAT_ITERATOR, pureline)   
    pat_query = re.match(PAT_QUERY, pureline)   
    pat_fetch = re.match(PAT_FETCH, pureline)   
    pat_update = re.match(PAT_UPDATE, pureline)   
    if pat_context:   
    py.write("class %s:\n" % (pat_context.group(1)))   
    py.write(" def __init__(self, con):\n")   
    py.write(" self.con = con\n")   
    elif pat_iterator:   
    py.write("class %s:\n" % (pat_iterator.group(1)))   
    py.write(" def prepare(self, cur):\n")   
    py.write(" self.cur = cur\n")   
    py.write(" def execute(self, sql, p = ()):\n")   
    py.write(" self.cur.execute(sql, p)\n")   
    py.write(" self.row = self.cur.fetchone()\n")   
    py.write(" def fetchone(self):\n")   
    py.write(" res = self.row\n")   
    py.write(" self.row = self.cur.fetchone()\n")   
    py.write(" if self.row == None:\n")   
    py.write(" self.cur.close()\n")   
    py.write(" return res\n")   
    py.write(" def endfetch(self):\n")   
    py.write(" return self.row == None\n")   
    elif pat_query:   
    py.write("%s%s.prepare(%s.con.cursor())\n" %   
   (pat_query.group(1), pat_query.group(3), pat_query.group(2)))   
    sql = pat_query.group(4).lstrip().rstrip()   
    p = params(sql)   
    if len(p) == 0:   
    py.write("%s%s.execute('%s')\n" % (pat_query.group(1),   
   pat_query.group(3), sql))   
    elif len(p) == 1:   
    sql = re.sub(PAT_PARAM, "%s", sql)   
    py.write("%s%s.execute('%s', (%s,))\n" %   
   (pat_query.group(1), pat_query.group(3), sql, p[0]))   
    else:   
    sql = re.sub(PAT_PARAM, "%s", sql)   
    py.write("%s%s.execute('%s', (%s))\n" %   
   (pat_query.group(1), pat_query.group(3), sql, ",".join(p)))   
    elif pat_fetch:   
    p = params( pat_fetch.group(3))   
    if len(p) == 1:   
    py.write("%s%s = %s.fetchone()\n" % (pat_fetch.group(1),   
   p[0] + ",", pat_fetch.group(2)))   
    else:   
    py.write("%s%s = %s.fetchone()\n" % (pat_fetch.group(1),   
   ",".join(p), pat_fetch.group(2)))   
    elif pat_update:   
    py.write("%sc = %s.con.cursor()\n" % (pat_update.group(1),   
   pat_update.group(2)))   
    sql = pat_update.group(3).lstrip().rstrip()   
    p = params(sql)   
    if len(p) == 0:   
    py.write("%sc.execute('%s')\n" % (pat_update.group(1), sql))   
    elif len(p) == 1:   
    sql = re.sub(PAT_PARAM, "%s", sql)   
    py.write("%sc.execute('%s', (%s,))\n" %   
   (pat_update.group(1), sql, p[0]))   
    else:   
    sql = re.sub(PAT_PARAM, "%s", sql)   
    py.write("%sc.execute('%s', (%s))\n" %   
   (pat_update.group(1), sql, ",".join(p)))   
    py.write("%sc.close()\n" % (pat_update.group(1)))   
    else:   
    py.write(line)   
   py.close()   
   sqlpy.close()   
      
   Arne   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca