XML-сервлет, исполняющий SQL-запросы для XMLP.

Сервлет исполняет запросы к MySQL.

Выполнен на Jython - реализации языка программирования Python в среде Java.

Возвращает результат в формате XML


Загрузить sql2xml.py


Тесты для sql2xml.py

Исполнить sql2xml.py?

Автономный тест - простейший

Автономный тест - унифицированный

Унифицированный тест для 'sql2xm.py'


Тест в составе XMLP

Журнал недостоверных значений


ВЕБ-интерфейс к этому журналу


#!/usr/bin/env jython
# -*- coding: utf-8 -*-
 
import java
from javax.servlet import http
from java.net import URLDecoder
from com.ziclix.python.sql import zxJDBC
import re
#
class sql2xml(http.HttpServlet):
  def dbQuery(self, out, server, db, query):
    if query==None:
      print "<ROWSET></ROWSET>"
      return
    #}if
    driver = "com.mysql.jdbc.Driver"
    java.lang.Class.forName(driver).newInstance( )
    usr, passwd = "airs", "airs"
    url = "jdbc:mysql://%s/%s" % (server, db)
    conn = zxJDBC.connect(url, usr, passwd, driver,CHARSET="UTF-8")
    cursor= conn.cursor()
    try:
      cursor.execute(query)
    except Exception, e:
      print>>out, "<__execute-error__>%s</__execute-error__>" % `e`
      return
    for rs in cursor:
      print>>out, "<ROW>"
      for cl in range(len(rs)):
        val= rs[cl]
        nam= cursor.description[cl][0]
        typ= cursor.description[cl][1]
        if val==None:
          print>>out, "<%s/>" % nam
        elif type(val).__name__=='unicode':
          v1= "<%s>%s</%s>" % (nam, val.replace("'","\\'"),nam)
          print>>out, v1.encode('utf-8')
        else:
          print>>out, "<%s>%r</%s>" % (nam, val, nam)
      print>>out, "</ROW>"
    #}for
    cursor.close()
    conn.close()
  def doGet(self, req, res):
    res.setContentType("text/xml;charset=UTF-8")
    res.setCharacterEncoding("UTF-8")
    out = res.getOutputStream()
    print>>out, "<ROWSET>"
    names= req.getParameterNames()
    qd= {}
    for n1 in names:
      qd[n1]= tuple(req.getParameterValues(n1))[0].decode('utf-8').encode('utf-8')
    #
    print>>out, "<__params__>"
    kk= qd.keys(); kk.sort()
    for n1 in kk:
      try:
        print>>out, "<%s>" % n1, qd[n1], "</%s>" % n1
      except Exception, e:
        print>>out, "<%s>?!{%r}{%r}{%r}!?</%s>" % (n1,qd[n1],type(qd[n1]).__name__,e,n1)
    print>>out, "</__params__>"
    #
    if qd.has_key("__hostname"):
      hostname= qd["__hostname"]; del qd["__hostname"]
    else:
      hostname= "localhost"
    if qd.has_key("__query") and qd.has_key("__dbname"):
      pass
    else:
      print>>out, "</ROWSET>"
      return
    #
    try:
      qry= qd['__query']; del qd['__query']
      dbname= qd["__dbname"]; del qd['__dbname']
      query= re.sub(r":([\w,\d]*)", r"%(\1)s", qry) % qd
    except Exception, e:
      print>>out, "<__parsing-error__>%s %s</__parsing-error__>" % (`e`,qd)
      print>>out, "</ROWSET>"
      return
    print>>out, "<__query__>%s</__query__>" % query
    self.dbQuery(out, hostname, dbname, query)
    print>>out, "</ROWSET>"
  def doPost(self, req, res):
    self.doGet(req, res)