# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.    
#
#  $Id$
#

import os 
import sys
try:
	import MySQLdb
	import optparse
	import getpass
except ImportError, e:
	print "Module not installed : %s" % e
	exit()


a = os.path.join("../")
sys.path.append(a)
a = os.path.join("../../")
sys.path.append(a)
a = os.path.join("../../..")
sys.path.append(a)

from zoni.version import version, revision
from zoni.extra.util import getConfig


def main():
	''' This file sets up the database for Zoni '''

	ver = version.split(" ")[0]
	rev = revision


	parser = optparse.OptionParser(usage="%prog -u username ", version="%prog " + ver + " " + rev)
	parser.add_option("-u", "--userName", "--username", dest="userName", help="Mysql username")
	parser.add_option("-p", "--password", dest="password", help="Admin mysql password")
	#parser.add_option("-v", "--verbose", dest="verbosity", help="Be verbose", action="store_true", default=False)
	(options, __args) = parser.parse_args()

	if not options.userName:
		parser.print_help()
		exit(1)

	password = options.password
	if not options.password:
		password = getpass.getpass()

	(configs, __configFiles) = getConfig()

	CreateZoniDb(configs, options.userName, password)


def CreateZoniDb(config, adminUser, adminPassword):
	config = config
	host = config['dbHost']
	user = config['dbUser']
	adminUser = adminUser
	adminPassword = adminPassword
	passwd = config['dbPassword']
	#db = "`" + config['dbInst'] + "`"
	db = config['dbInst']

	if config['dbPort'] == "":
		config['dbPort'] = 3306

	port = config['dbPort']

	try:
		conn = connectDb(host, port, adminUser, adminPassword)
	except Exception, e:
		print "error here ", e
		exit()
	createDatabase(conn, adminUser, adminPassword, db)
	setPriviledges(conn, user, passwd, db)
	conn.close()
	#conn = connectDb(host, port, adminUser, adminPassword, db)
	conn = connectDb(host, port, user, passwd, db)
	createTables(conn)
	createRegistration(conn, config)
	addInitialConfig(conn, config)
	conn.commit()
	conn.close()
	sys.stdout.write("Finished\n")

def connectDb (host, port, user, passwd, db=None):
	#  Connect to DB
	try:
		if db:
			conn = MySQLdb.connect(host = host, port = port, user = user , passwd = passwd, db = db)
		else:
			conn = MySQLdb.connect(host = host, port = port, user = user , passwd = passwd)

	except MySQLdb.OperationalError, e:
		if e[0] == 2005:
			print "ERROR :" + str(e[1])
			exit(1)
		else:
			print "Connection Error : ", e
			exit(1)
	return conn


def createDatabase (conn, user, passwd, db):
	sys.stdout.write("Creating database...")
	cmd = "create database if not exists " + db + ";"
	execQuery(conn, cmd)
	sys.stdout.write("Success\n")


def setPriviledges(conn, user, passwd, db):
	sys.stdout.write("Setting user priviledges...")
	cmd = "grant create, select, insert, update, delete on " + db + ".* to " + user + "@\'%\' identified by \'" + passwd + "\';"
	execQuery(conn, cmd)
	sys.stdout.write("Success\n")



def createTables(conn):
	sys.stdout.write("Create Zoni Database Schema...\n")
	'''  Create Tables  '''
	#  Create sysinfo 
	sys.stdout.write("    Creating sysinfo...")
	execQuery(conn, "CREATE TABLE IF NOT EXISTS `sysinfo` (`sys_id` int(11) unsigned NOT NULL auto_increment, `mac_addr` char(64) NOT NULL, `num_procs` int(10) unsigned default NULL, `num_cores` int(10) unsigned default NULL, `mem_sticks` int(10) unsigned default NULL, `mem_slots` int(10) unsigned default NULL, `mem_total` int(10) unsigned default NULL, `mem_limit` int(10) unsigned default NULL, `clock_speed` int(10) unsigned default NULL, `sys_vendor` text, `sys_model` text, `proc_vendor` char(64) default NULL, `proc_model` char(128) default NULL, `proc_cache` char(32) default NULL, `system_serial_number` char(128) default NULL, `chassis_serial_number` char(128) default NULL, `system_uuid` char(254) default NULL, `cpu_flags` text, `location` text, `bios_rev` char(32) default NULL, `ip_addr` varchar(64) NOT NULL, `init_checkin` timestamp NOT NULL default 0, `last_update` timestamp not null default 0 on update CURRENT_TIMESTAMP, state_id int(11) DEFAULT 1,max_reservation int(10) default -1, PRIMARY KEY  (`sys_id`))")
	sys.stdout.write("Success\n")

	#  Create hardwareinfo
	sys.stdout.write("    Creating hardwareinfo...")
	execQuery(conn, "CREATE TABLE IF NOT EXISTS `hardwareinfo` ( `hw_id` int(11) unsigned NOT NULL auto_increment, `hw_type` varchar(64) NOT NULL, `hw_mac` varchar(64) default NULL, `hw_name` varchar(256) NOT NULL, `hw_make` varchar(64), `hw_model` varchar(64), `hw_version_sw` varchar(64), `hw_version_fw` varchar(64), `hw_ipaddr` varchar(64) NOT NULL, `hw_userid` varchar(64) default NULL, `hw_password` varchar(64) default NULL, `hw_notes` longtext, PRIMARY KEY  (`hw_id`))") 
	sys.stdout.write("Success\n")
	#  Create imageinfo
	sys.stdout.write("    Creating imageinfo...")
	execQuery(conn, "CREATE TABLE IF NOT EXISTS `imageinfo` ( `image_id` int(11) unsigned NOT NULL auto_increment, `image_name` varchar(256) NOT NULL, `dist` varchar(128), `dist_ver` varchar(128), `kernel_id` int(11), `initrd_id` int(11), PRIMARY KEY  (`image_id`))")
	sys.stdout.write("Success\n")
	#  Create reservationinfo
	sys.stdout.write("    Creating reservationinfo...")
	execQuery(conn, "CREATE TABLE IF NOT EXISTS `reservationinfo` ( `reservation_id` int(11) unsigned NOT NULL auto_increment, `user_id` int(11) NOT NULL, `reservation_date` timestamp NOT NULL default CURRENT_TIMESTAMP, `reservation_expiration` datetime NOT NULL, `notes` tinytext, PRIMARY KEY  (`reservation_id`)) ENGINE=INNODB")
	sys.stdout.write("Success\n")
	#  Create portmap 
	sys.stdout.write("    Creating portmap...")
	execQuery(conn, "CREATE TABLE IF NOT EXISTS `portmap` (`hw_id` int(11) unsigned NOT NULL, `sys_id` int(11) unsigned NOT NULL, `port_num` int(11))")
	sys.stdout.write("Success\n")
	#  Create vlan
	sys.stdout.write("    Creating vlaninfo...")
	execQuery(conn, "CREATE TABLE IF NOT EXISTS `vlaninfo` ( `vlan_id` int(11) unsigned NOT NULL auto_increment, `vlan_num` int(11) NOT NULL, `vlan_desc` varchar(256) NOT NULL, PRIMARY KEY  (`vlan_id`))")
	sys.stdout.write("Success\n")
	#  Create domaininfo
	sys.stdout.write("    Creating domaininfo...")
	#execQuery(conn, "CREATE TABLE IF NOT EXISTS `domaininfo` ( `domain_id` int(11) unsigned NOT NULL auto_increment, `domain_name` varchar(64) NOT NULL, `domain_key` varchar(1024) NULL, `domain_desc` varchar(256) NOT NULL, `reservation_id` int(11) unsigned NOT NULL,  PRIMARY KEY  (`domain_id`), INDEX (reservation_id), FOREIGN KEY (reservation_id) REFERENCES reservationinfo(reservation_id) on DELETE CASCADE) ENGINE=INNODB")
	execQuery(conn, "CREATE TABLE IF NOT EXISTS `domaininfo` ( `domain_id` int(11) unsigned NOT NULL auto_increment, `domain_name` varchar(64) NOT NULL, `domain_key` varchar(1024) NULL, `domain_desc` varchar(256) NOT NULL, PRIMARY KEY (`domain_id`)) ENGINE=INNODB")
	sys.stdout.write("Success\n")
	#  Create domainmap
	sys.stdout.write("    Creating domainmembermap...")
	execQuery(conn, "CREATE TABLE IF NOT EXISTS `domainmembermap` (`domain_id` int(11) unsigned NOT NULL, `vlan_id` int(11) unsigned NOT NULL, `vlan_type` varchar(20) NULL, INDEX (domain_id), FOREIGN KEY (domain_id) REFERENCES domaininfo(domain_id) on DELETE CASCADE) ENGINE=INNODB")
	sys.stdout.write("Success\n")
	#  Create system, domain member map
	sys.stdout.write("    Creating sysdomainmembermap...")
	execQuery(conn, "CREATE TABLE IF NOT EXISTS `sysdomainmembermap` (`sys_id` int(11) unsigned NOT NULL, `domain_id` int(11) NOT NULL)")
	sys.stdout.write("Success\n")
	#  Create allocationinfo
	sys.stdout.write("    Creating allocationinfo...")
	execQuery(conn, "CREATE TABLE IF NOT EXISTS `allocationinfo` ( `allocation_id` int(11) unsigned NOT NULL auto_increment, `sys_id` int(11) unsigned NOT NULL, `reservation_id` int(11) unsigned NOT NULL, `pool_id` int(11) unsigned NULL, `hostname` varchar(64) default NULL, `domain_id` int(11) unsigned NOT NULL, `notes` tinytext, `expire_time` timestamp default 0 NOT NULL, PRIMARY KEY  (`allocation_id`)) ENGINE=INNODB")
	sys.stdout.write("Success\n")
	#  Create imagemap
	sys.stdout.write("    Creating imagemap...")
	execQuery(conn, "CREATE TABLE IF NOT EXISTS `imagemap` ( `allocation_id` int(11) unsigned NOT NULL, `image_id` int(11) unsigned NOT NULL, INDEX(allocation_id), FOREIGN KEY (allocation_id) REFERENCES allocationinfo(allocation_id) on DELETE CASCADE)ENGINE=INNODB")
	sys.stdout.write("Success\n")
	#  Create poolinfo
	sys.stdout.write("    Creating poolinfo...")
	execQuery(conn, "CREATE TABLE IF NOT EXISTS `poolinfo` (`pool_id` int(11) unsigned NOT NULL auto_increment, `pool_name` varchar(64) NOT NULL, `pool_ip_network` varchar(64) NOT NULL, PRIMARY KEY (`pool_id`))")
	sys.stdout.write("Success\n")
	#  Create poolmap
	sys.stdout.write("    Creating poolmap...")
	execQuery(conn, "CREATE TABLE IF NOT EXISTS `poolmap` (`pool_id` int(11) NOT NULL, `vlan_id` int(11) unsigned NOT NULL)")
	sys.stdout.write("Success\n")
	##  Create allocationarchive
	#sys.stdout.write("    Creating allocationarchive...")
	#execQuery(conn, "CREATE TABLE IF NOT EXISTS `allocationarchive` ( `ar_id` int(11) unsigned NOT NULL auto_increment, `sys_id` int(11) NOT NULL, `ip_addr` varchar(64) NOT NULL, `hostname` varchar(64) NOT NULL, `domain_id` int(11) NOT NULL, `user_id` int(11) NOT NULL, `cur_time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `reservation_type` varchar(64) NOT NULL, `notes` tinytext, PRIMARY KEY  (`ar_id`))")
	#sys.stdout.write("Success\n")
	#  Create kernelinfo 
	sys.stdout.write("    Creating kernelinfo...")
	execQuery(conn, "CREATE TABLE IF NOT EXISTS `kernelinfo` ( `kernel_id` int(11) unsigned NOT NULL auto_increment, `kernel_name` varchar(256) NOT NULL, `kernel_release` varchar(128) NOT NULL, `kernel_arch` varchar(128) NOT NULL, PRIMARY KEY  (`kernel_id`))")
	sys.stdout.write("Success\n")
	#  Create initrdinfo
	sys.stdout.write("    Creating initrdinfo...")
	execQuery(conn, "CREATE TABLE IF NOT EXISTS `initrdinfo` ( `initrd_id` int(11) unsigned NOT NULL auto_increment, `initrd_name` varchar(256) NOT NULL, `initrd_arch` varchar(128) NOT NULL, `initrd_options` varchar(1024) NOT NULL, PRIMARY KEY  (`initrd_id`))")
	sys.stdout.write("Success\n")
	#  Create diskinfo
	sys.stdout.write("    Creating diskmap...")
	execQuery(conn, "CREATE TABLE IF NOT EXISTS `diskmap` ( `disk_id` int(11) unsigned NOT NULL auto_increment, `sys_id` int(11) NOT NULL, `disk_name` varchar(128), `disk_size` varchar(256), PRIMARY KEY  (`disk_id`))")
	sys.stdout.write("Success\n")
	#  Create stateinfo
	sys.stdout.write("    Creating stateinfo...")
	execQuery(conn, "CREATE TABLE IF NOT EXISTS `stateinfo` ( `state_id` int(11) unsigned NOT NULL auto_increment, `state_name` varchar(256) NOT NULL, `state_extra` varchar(256), PRIMARY KEY  (`state_id`))")
	sys.stdout.write("Success\n")
	#  Create vlanmembermap
	sys.stdout.write("    Creating vlanmembermap...")
	execQuery(conn, "CREATE TABLE IF NOT EXISTS `vlanmembermap` (`vlanmember_id` int(11) unsigned NOT NULL auto_increment, `allocation_id` int(11) unsigned NOT NULL, `vlan_id` int(11) unsigned NOT NULL, vlan_type varchar(128) NOT NULL, PRIMARY KEY (`vlanmember_id`), INDEX(allocation_id), FOREIGN KEY (allocation_id) REFERENCES allocationinfo(allocation_id) on DELETE CASCADE) ENGINE=INNODB")
	sys.stdout.write("Success\n")

def createRegistration(conn, config):

	sys.stdout.write("    Inserting initial Registration info into DB...\n")

	#  Check if already there...
	checkVal =  entryExists(conn, "kernelinfo", "kernel_name", "linux-2.6.24-19-server")
	if checkVal:
		sys.stdout.write("    Kernel already exists in DB...\n")
		#  Get the kernel_id
		#kernelId = str(checkVal[1][0][0])
	else:
		__r = execQuery(conn, "INSERT into `kernelinfo` (kernel_name, kernel_release, kernel_arch) values ('linux-2.6.24-19-server', '2.6.24-19-server', 'x86_64' )")
		#kernelId = str(r.lastrowid)
		sys.stdout.write("    Success\n")

	#  Initrd
	#checkVal =  entryExists(conn, "initrdinfo", "initrd_name", "zoni-register-64")
	#sys.stdout.write("    Checking existence of initrd...")
	#if not checkVal:
		#sys.stdout.write("No\n") 
#1,'initrd.img-2.6.38-10-server','x86_64','pxeserver=10.10.0.10 imageserver=10.10.0.10 defaultimage=x86_64-natty-hadoop-tashi_nm registerfile=register_node mode=register zoniroot=zoni configipmi=1 verbose=0'
		#optionList = "pxeserver=" + config['pxeServerIP'] + " imageserver=" + config['imageServerIP'] + " defaultimage=amd64-tashi_nm registerfile=register_node mode=register zoniroot="  + config['registrationBaseDir'] + "configipmi=1 verbose=0
		#sys.stdout.write("    Inserting default register image into DB...")
		#r = execQuery(conn, "INSERT into `initrdinfo` (initrd_name, initrd_arch, initrd_options) values ('zoni-register-64','x86_64', '" + optionList + "')")
		#initrdId = str(r.lastrowid)
		#sys.stdout.write("Success\n")
	#else:
		#sys.stdout.write("Yes\n")    
		#initrdId = str(checkVal[1][0][0])
		
	#  Interactive Registration
	#checkVal =  entryExists(conn, "initrdinfo", "initrd_name", "zoni-register-64-interactive")
	#sys.stdout.write("    Checking existence of interactive initrd...")
	#if not checkVal:
		#sys.stdout.write("No\n") 
		#sys.stdout.write("    Inserting default register-interactive image into DB...")
		#optionList = "initrd=" + config['initrdRoot'] + "/x86_64/zoni-register-64-interactive.gz pxeserver=" + config['pxeServerIP'] + " imageserver=" + config['imageServerIP'] + " defaultimage=amd64-tashi_nm registerfile=register_node mode=register verbose=1" 
		#r = execQuery(conn, "INSERT into `initrdinfo` (initrd_name, initrd_arch, initrd_options) values ('zoni-register-64-interactive','x86_64', '" + optionList + "')")
		#initrdIdInteractive = str(r.lastrowid)
		#sys.stdout.write("Success\n")
	#else:
		#sys.stdout.write("Yes\n")    
		#initrdIdInteractive = str(checkVal[1][0][0])
#
	#  Insert disk option
	sys.stdout.write("    Adding Disk to imageinfo...")
	query = "select * from imageinfo where image_name = 'disk'"
	r = execQuery(conn, query)
	if len(r.fetchall()) < 1:
		execQuery(conn, "INSERT into `imageinfo` (image_name) values ('disk')")
		sys.stdout.write("Success\n")

	#  Link initrd and kernel to image
	#sys.stdout.write("    Registering initrd and kernel to registration image...")
	#query = "select * from imageinfo where image_name = 'zoni-register-64' and kernel_id = " + kernelId + " and initrd_id = " + initrdId
	#r = execQuery(conn, query)
	#if len(r.fetchall()) < 1:
		#execQuery(conn, "INSERT into `imageinfo` (image_name, dist, dist_ver, kernel_id, initrd_id) values ('zoni-register-64', 'Ubuntu', 'Hardy', " + kernelId + ", " + initrdId + ")")
#
	#query = "select * from imageinfo where image_name = 'zoni-register-64-interactive' and kernel_id = " + kernelId + " and initrd_id = " + initrdId
	#r = execQuery(conn, query)
	#if len(r.fetchall()) < 1:
		#execQuery(conn, "INSERT into `imageinfo` (image_name, dist, dist_ver, kernel_id, initrd_id) values ('zoni-register-64-interactive', 'Ubuntu', 'Hardy', " + kernelId + ", " + initrdIdInteractive + ")")
	#sys.stdout.write("Success\n")
#

def addInitialConfig(conn, config):
	sys.stdout.write("    Adding initial configuration info into DB...\n")
	#  Create Initial reservation
	sys.stdout.write("        Adding zoni reservation...")
	checkVal =  entryExists(conn, "reservationinfo", "reservation_id", '1')
	if checkVal:
		sys.stdout.write("Reservation already exists in DB...\n")
		#  Get the domainId 
		vlanId = str(checkVal[1][0][0])
	else:
		r = execQuery(conn, "INSERT into `reservationinfo` (user_id, reservation_expiration, notes) values (0, '9999-12-31', 'Zoni Default')")
		vlanId = str(r.lastrowid)
		sys.stdout.write("Success\n")

	#  Add the home vlan
	sys.stdout.write("        Adding vlan info...")
	checkVal =  entryExists(conn, "vlaninfo", "vlan_num", config['zoniHomeDomain'])
	if checkVal:
		sys.stdout.write("Vlan already exists in DB...\n")
		#  Get the domainId 
		vlanId = str(checkVal[1][0][0])
	else:
		r = execQuery(conn, "INSERT into `vlaninfo` (vlan_num, vlan_desc) values (" + config['zoniHomeDomain'] + ", 'Zoni Home Vlan' )")
		vlanId = str(r.lastrowid)
		sys.stdout.write("Success\n")

	#  Create the Zoni Home domain
	sys.stdout.write("        Creating Zoni Home Domain...")
	checkVal =  entryExists(conn, "domaininfo", "domain_name", "Zoni")
	if checkVal:
		sys.stdout.write("Default Domain (ZoniHome) already exists in DB...\n")
		#  Get the domainId 
		domainId = str(checkVal[1][0][0])
	else:
		r = execQuery(conn, "INSERT into `domaininfo` (domain_name, domain_desc) values ('Zoni', 'Zoni Home Domain')")
		domainId = str(r.lastrowid)
		sys.stdout.write("Success\n")

	#  link the vlan and domain
	sys.stdout.write("        Linking Domain and vlan...")
	checkVal =  entryExists(conn, "domainmembermap", "domain_id", domainId)
	if checkVal:
		sys.stdout.write("Default Domain (ZoniHome) already linked to vlan " + config['zoniHomeDomain'] + "...\n")
		#  Get the domainId 
		#valId = str(checkVal[1][0][0])
	else:
		r = execQuery(conn, "INSERT into `domainmembermap` (domain_id, vlan_id) values (" + domainId + ", " + vlanId + ")")
		domainId = str(r.lastrowid)
		sys.stdout.write("Success\n")

	#  Add the pools
	sys.stdout.write("        Adding default pools (Zoni home) from config file...")
	checkVal =  entryExists(conn, "poolinfo", "pool_name", 'ZoniHome')
	if checkVal:
		sys.stdout.write("Default pool (ZoniHome) already exists...\n")
		zoniPoolId = str(checkVal[1][0][0])
	else:
		r = execQuery(conn, "INSERT into `poolinfo` (pool_name, pool_ip_network) values ('ZoniHome', '" + config['zoniHomeNetwork'] + "')")
		zoniPoolId = str(r.lastrowid)
		sys.stdout.write("Success\n")

	sys.stdout.write("        Adding default pools (IPMI home) from config file...")
	checkVal =  entryExists(conn, "poolinfo", "pool_name", 'IpmiHome')
	if checkVal:
		sys.stdout.write("Default pool (IpmiHome) already exists...\n")
		zoniIpmiId = str(checkVal[1][0][0])
	else:
		r = execQuery(conn, "INSERT into `poolinfo` (pool_name, pool_ip_network) values ('IpmiHome', '" + config['zoniIpmiNetwork'] + "')")
		zoniIpmiId = str(r.lastrowid)
		sys.stdout.write("Success\n")

	#  link the pools
	sys.stdout.write("        Linking default pools (Zoni home)...")
	checkVal =  entryExists(conn, "poolmap", "pool_id", zoniPoolId)
	if checkVal:
		sys.stdout.write("Default pool (ZoniHome) already exists...\n")
		#  Get the domainId 
		#poolId = str(checkVal[1][0][0])
	else:
		r = execQuery(conn, "INSERT into `poolmap` (pool_id, vlan_id) values (" + zoniPoolId + ", " + vlanId + ")")
		domainId = str(r.lastrowid)
		sys.stdout.write("Success\n")

	sys.stdout.write("        Linking default pools (IPMI home)...")
	checkVal =  entryExists(conn, "poolmap", "pool_id", zoniIpmiId)
	if checkVal:
		sys.stdout.write("Default pool (ZoniHome) already exists...\n")
		#  XXX probably should delete first then add, do it later
		#  Get the domainId 
		#poolId = str(checkVal[1][0][0])
	else:
		r = execQuery(conn, "INSERT into `poolmap` (pool_id, vlan_id) values (" + zoniIpmiId + ", " + vlanId + ")")
		domainId = str(r.lastrowid)
		sys.stdout.write("Success\n")
	
	#  Add default states
	sys.stdout.write("        Adding default states..")
	checkVal =  entryExists(conn, "stateinfo", "state_name", 'normal')
	if checkVal:
		sys.stdout.write("Default state (default) already exists...\n")
	else:
		r = execQuery(conn, "INSERT into `stateinfo` (state_name) values ('normal')")
		r = execQuery(conn, "INSERT into `stateinfo` (state_name) values ('off')")
		r = execQuery(conn, "INSERT into `stateinfo` (state_name) values ('drained')")
		r = execQuery(conn, "INSERT into `stateinfo` (state_name) values ('reserved')")
		r = execQuery(conn, "INSERT into `stateinfo` (state_name) values ('restricted')")
		sys.stdout.write("Success\n")

def execQuery(conn, query):
	cursor = conn.cursor()
	try:
		cursor.execute (query)
		conn.commit()
	#except Exception:
		#traceback.print_exc(sys.exc_info())
	except MySQLdb.OperationalError, e:
		sys.stdout.write("Fail\n")
		msg = "ERROR: " + e[1]
		sys.stderr.write(msg)
		#traceback.print_exc(sys.exc_info())
		exit()
	return cursor

def entryExists(conn, table, col, checkVal):
	query = "select * from " + table + " where " + col + " = '" + checkVal + "'"
	r = execQuery(conn, query)
	res = r.fetchall()
	if len(res) > 0:
		return (1, res)

	return 0


if __name__ == "__main__":
	main()

