#!/usr/bin/python

__version__ = "$Revision: 1.3 $"[11:-2]

# This version mangled by Andy Dustman <adustman@comstar.net>.
# Original credits follow. This is a nice introduction in general,
# but I felt there were a few bits and pieces that needs to be cleaned up.

# TITLE:        dbtrainer4
# WRITTEN BY:	Bradley Stec, July 1999
# 		RuleSpace, Inc.
# SUPPORTS:     WebOps Database Interface Trainer Script
# PURPOSE:      This script is a code and output example of how to use the
#		MySQLdb API to communicate to a database and perform basic
#		SQL command language requests.
# FUNCTION:     Both by executing the script and by reading the source code,
#		a programmer should be able to get a grasp on how the interface
#		works and may borrow code for their own script projects.
# REQUIREMENTS: This script requires the access to the webops module, and that a
#		database named "test" be installed in the webops specified 
#		database server.  
#
# CHANGES:	7/99	Initial Version

import sys
#import webops
import traceback
sys.stderr = sys.stdout

# Set Up Page Layout
print "content-type: text/html"
print
print "<HTML>\n"
print "<BODY BGCOLOR=\"#FFFFFF\">\n"
print "<FONT FACE=\"arial\" SIZE=\"3\"><B>RuleSpace, Inc. WebOps Database Interface Trainer -- Part 4</B><BR><HR>"
print "The purpose of this page is to present sample code for interfacing with the databases within the Web Operations server farm.  The display below illustrates real database queries as well as how the information is handled and presented.<P>"
print "By viewing the CGI script which presents the information below you'll be able to see how the database interface and API works within the WebOps scripting environment.<P>"
print "<HR>"

# Loading The API Support
# The API MySQLdb is a thin wrapper around a C program which is also in the site-packages directory called _mysqlmodule.so
# The API follows the Python Database API Spec version 2.0 which basically sets standards for what kind of methods will be
# used to access databases within the Python environment.  The _mysqlmodule.so and MySQLdb.py programs allow a programmer
# to pass SQL commands/queries through to a database.  The database server may be remote or local.  The MySQL database server
# software doesn't provide an interactive cursor, so the API programs create a "cursor" in local memory.  Read the Python
# Database API Spec version 2.0 for details.

# This command loads the support files
import MySQLdb

# PREPARE TO CONNECT TO DATABASE 
# This command forms a connection through the support files to the target database server and database name.
try:
	#WebOpsDB = MySQLdb.Connection(host=webops.dbserver,user=webops.dbuser,passwd=webops.dbpass,db='test',port=3306,unix_socket="")
	WebOpsDB = MySQLdb.Connect(db='test')
except:
        print "\n\n<PRE>"
        traceback.print_exc()
        sys.exit()

# A LITTLE BONUS INFORMATION FROM THE API
# The API can provide some information about the connection and server.
# These methods are not portable to other databases.
print "<B>CONNECTED TO</B><BR>"
print "&nbsp;&nbsp;&nbsp;&nbsp;server <B> ", WebOpsDB.get_host_info(), "</B><BR>"
print "&nbsp;&nbsp;&nbsp;&nbsp;running <B>mySQL server v", WebOpsDB.get_server_info(), "</B><BR>"
print "&nbsp;&nbsp;&nbsp;&nbsp;current status: ",WebOpsDB.stat(), "<P>"
print "<HR>"

# CREATE YOUR PERSONAL CONNECTION TO THE "RESULTS" WITHIN THE CONNECTION OBJECT
# We haven't actually queried anything yet, so don't get confused, we're just preparing for it.
try:
	cursor = WebOpsDB.cursor()
except:
        print "\n\n<PRE>"
        traceback.print_exc()
        sys.exit()

# REQUERY TO SEE RESULTS
try:
        cursor.execute("SELECT * FROM TEAM")
        resultSet = cursor.fetchall()
except:
        print "\n\n<PRE>"
        traceback.print_exc()
        sys.exit()

# CONVERT THE LIST OF LISTS INTO A DICTIONARY
# Note: You don't need to do this anymore. Keep reading. -- Andy
resultDict = {}
numColumns = len(cursor.description)-1
numRows = len(resultSet)-1
cursorColumn = 0
cursorRow = 0
# Put Field Names In As Keys
for cursorFieldname in cursor.description:
	tempValues = []
	tempDict = {}
	tempKey = cursorFieldname[0]
	while cursorRow <= numRows:
		# print resultSet[cursorRow][cursorColumn]
		tempValues.append(str(resultSet[cursorRow][cursorColumn]))
		cursorRow = cursorRow + 1
		tempDict = {tempKey:tempValues}
	cursorRow = 0
	cursorColumn = cursorColumn + 1
	resultDict.update(tempDict)

# The easy way, new in 0.1.3:
# instead of:
#     resultDict = cursor.fetchall()
# just use:
#     resultDict = cursor.fetchallDict()
# and then you don't need to do all the above stuff.
# This does the dictionary conversion in C, so it's a lot faster.

print "<P>"

print "<B>EXAMPLE OF CONVERTING THE CURSOR DATA INTO A PYTHON DICTIONARY.</B><BR>"
# NOTE- This column set is different, we're producing the rows by dictionary keys and placing values in the cells.
print "<FONT SIZE=\"2\">A different way to slice the data</FONT><P>"
print "<FONT SIZE=\"1\">"
print "<TABLE BORDER=\"1\">"
for cursorFieldname in cursor.description:
        print "<TR><TD><FONT FACE=\"arial\" SIZE=\"2\">" +cursorFieldname[0]+ "</FONT></TD>"
	print "<TD><FONT FACE=\"arial\" SIZE=\"2\">"
	for x in resultDict[cursorFieldname[0]]:
		print x
		print ","
	print "</FONT></TD></TR>"
print "</TABLE>"
print "</CENTER>"
print "&nbsp;<P></FONT><P><HR><P>"

# CLOSING THE DATABASE OBJECT
try:
	WebOpsDB.close()
except:
        print "\n\n<PRE>"
        traceback.print_exc()
        sys.exit()

# CONTINUED IN DBTRAINER4
# To learn more about converting result sets into Python dictionary data types, see dbtrainer4.

print "</FONT></BODY>\n"
print "</HTML>\n"
