mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			121 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python
 | |
| 
 | |
| import sqlite
 | |
| import urllib2
 | |
| import csv
 | |
| import cgi
 | |
| import simplejson
 | |
| import jsontemplate
 | |
| import time
 | |
| 
 | |
| log = open('log.txt', 'a')
 | |
| 
 | |
| def urldecode(query):
 | |
|    d = {}
 | |
|    a = query.split('&')
 | |
|    for s in a:
 | |
|       if s.find('='):
 | |
|          k,v = map(urllib2.unquote, s.split('='))
 | |
|          try:
 | |
|             d[k].append(v)
 | |
|          except KeyError:
 | |
|             d[k] = [v]
 | |
|  
 | |
|    return d
 | |
| 
 | |
| def load_table(uri, cur):
 | |
|     table = uri.split('/')[-1]
 | |
|     table = table.split('.')[0]
 | |
| 
 | |
|     contents = urllib2.urlopen(uri)
 | |
|     fields = ""
 | |
|     for field in contents.readline().strip().split(','):
 | |
|       fields += field
 | |
|       fields += ","
 | |
|     fields = fields.rstrip(',')
 | |
|     
 | |
|     cur.execute("SELECT name FROM sqlite_master WHERE type='table' \
 | |
|       AND name='%s';" % (table))
 | |
|     if cur.fetchone() == None:
 | |
| #      cur.execute("DROP TABLE %s;" % (table))
 | |
|       cur.execute("CREATE TABLE %s (%s);" % (table, fields))
 | |
|       for line in contents:
 | |
|         values = line.strip()
 | |
|         values = "','".join([val.strip() for val in values.split(",")])
 | |
|         values = "'" + values + "'"
 | |
|         sql = "INSERT INTO %s (%s) VALUES (%s);" % (table, fields, values)
 | |
|         cur.execute(sql)
 | |
|     return table
 | |
| 
 | |
| def build_structure(headings, allresults):
 | |
|   results = []
 | |
|   for result in allresults:
 | |
|     results.append(dict(zip(headings, result)))
 | |
|   results = { "query" : results }
 | |
|   return results
 | |
| 
 | |
| def build_json(headings, allresults, callback):
 | |
|   results = build_structure(headings, allresults)
 | |
|   return_str = simplejson.dumps(results)
 | |
|   if callback != None:
 | |
|     return_str = callback + "(" + return_str + ");";
 | |
|   return return_str
 | |
| 
 | |
| def load_template(templatefile):
 | |
|   return "".join(urllib2.urlopen(templatefile).readlines())
 | |
| 
 | |
| def build_template(headings, allresults, template_str):
 | |
|   results = build_structure(headings, allresults)
 | |
|   return jsontemplate.expand(template_str, results)
 | |
|   return ""
 | |
| 
 | |
| def myapp(environ, start_response):
 | |
|     args = cgi.parse_qs(environ['QUERY_STRING'])
 | |
|     
 | |
|     query = args['query'][0]
 | |
|     uri = args['uri'][0]
 | |
|     callback = None
 | |
|     if 'callback' in args:
 | |
|       callback = args['callback'][0]
 | |
|     label = "no label"
 | |
|     if 'label' in args:
 | |
|       label = args['label'][0]
 | |
|     templatefile = None
 | |
|     if 'templatefile' in args:
 | |
|       templatefile = args['templatefile'][0]
 | |
| 
 | |
|     con = sqlite.connect('mydatabase.db')
 | |
|     cur = con.cursor()
 | |
|     table_uris = uri.split(',')
 | |
|     tables = [load_table(uri, cur) for uri in table_uris]
 | |
|     con.commit() 
 | |
|     before = time.time()
 | |
|     cur.execute(query)
 | |
|     allresults = cur.fetchall()
 | |
|     after = time.time()
 | |
|     log.write("%s: query time %f\n" % (label, after - before))
 | |
| 
 | |
|     headings = [name[0] for name in cur.description]
 | |
|     return_str = ""
 | |
|     if templatefile != None:
 | |
|       start_response('200 OK', [('Content-Type', 'text/html')])
 | |
|       before = time.time()
 | |
|       template_str = load_template(templatefile)
 | |
|       after = time.time()
 | |
|       log.write("%s: template loading time %f\n" % (label, after - before))
 | |
|       before = time.time()
 | |
|       return_str = build_template(headings, allresults, template_str)
 | |
|       after = time.time()
 | |
|       log.write("%s: template rendering time %f\n" % (label, after - before))
 | |
|     else:
 | |
|       start_response('200 OK', [('Content-Type', 'text/plain')])
 | |
|       before = time.time()
 | |
|       return_str = build_json(headings, allresults, callback)
 | |
|       after = time.time()
 | |
|       log.write("%s: json-making time %f\n" % (label, after - before))
 | |
|     return return_str
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     from fcgi import WSGIServer
 | |
|     WSGIServer(myapp).run()
 |