# -*- coding: UTF-8 -*-
import sqlite3
import os
import sys

# tietokanta on samassa kansiossa mutta yleensä sqlite3.connect kaipaa absoluuttisen polun
# luodaan connection-objekti
# https://docs.python.org/2/library/sqlite3.html#connection-objects
con = sqlite3.connect( os.path.abspath('mallidb'))

# luodaan kursori
# https://docs.python.org/2/library/sqlite3.html#cursor-objects
cur = con.cursor()

try:
    # kenttien järjestystä ei määrätä jos käytetään SELECT *
    cur.execute("""
    SELECT * 
    FROM resepti
    """)
except:
    print("nyt tuli virhe: %s" % sys.exc_info()[0])

# kursori palauttaa python-listan, jonka sisällä on tupleja. Yksi tuple vastaa aina yhtä tietuetta
reseptit = cur.fetchall()
# tulostetaan kaikki. Suora dumppaus stringiksi
print "Reseptit objektidumppina"
print( str(reseptit)+"\n")
# Listan ja tuplejen läpikäynti silmukassa

print "Reseptit:"
for rivi in reseptit: # ajatellaan, että yksi tietue on rivi
   for sarake in rivi: # ajatellaan, että yksi rivi sisältää sarakkeita
        try:
            print str(sarake.encode("UTF-8")) + "\t", # muistettava encode jos printataan.  Kaatuu jos kyseessä onkin int tms.
        except: # tullaan tänne jos edellä ei ollutkaan string
            print str(sarake) + "\t",  # jos print-lauseen lopussa on , niin rivinvaihtoa ei tulosteta
        
   print  # rivin lopuksi rivinvaihto

# kenttien järjestys on nyt tiedossa! muuten sama kysely kuin edellä
sql = """
    SELECT nimi, henkilomaara, kuvaus, ruokalajiid
    FROM resepti
    """

try:
    # Jos sql-lauseessa on virhe niin tuloksena on operational error
    cur.execute(sql)
except:
    print("nyt tuli virhe: %s" % sys.exc_info()[0])

# suoritetaan seuraava kyse
reseptit = cur.fetchall()

# luodaan helpommin käsiteltävä tietorakenne eli lista, jonka sisällä on dictejä
# http://www.tutorialspoint.com/python/python_dictionary.htm
# dict on erittäin kätevä tietorakenne!

rese = []

for rivi in reseptit:
    rese.append( {"nimi":rivi[0], "henkilomaara": rivi[1], "kuvaus": rivi[2], "ruokalajiid": rivi[3] } )
# seuraava ei toimi koska ei ole asetettu  con.row_factory = sqlite3.Row
#    rese.append( {"nimi":rivi['nimi'], "henkilomaara": rivi['henkilomaara'], "kuvaus": rivi['kuvaus'], "ruokalajiid": rivi['ruokalajiid'] } )

# vertaa tätä tulostetta aiempaan dumppaukseen. Rakenne on nyt erilainen, koska yhtä tietuetta vastaakin
# dict eikä tuple
print "Reseptit dicteinä:"
print str(rese)

rese = []
# sama kuin edellä mutta asetetaan nyt:
con.row_factory = sqlite3.Row
cur = con.cursor() #kursori pitää luoda uudelleen jotta edellä tehty asetus toimii
try:
    cur.execute(sql)
except:
    print("nyt tuli virhe: %s" % sys.exc_info()[0])

# ei haeta turhaan koko listaa erilliseen muuttajaan vaan käydään suoraan kursori läpi rivi kerrallaan:
for rivi in cur:
#for rivi in cur.fetchall():
    rese.append( {"nimi":rivi['nimi'], "henkilomaara": rivi['henkilomaara'], "kuvaus": rivi['kuvaus'], "ruokalajiid": rivi['ruokalajiid'] } )
print "Reseptit dicteinä v2:"
print str(rese)
print "--------------------------------------------------------------------------"

# palautetaan ennalleen
con.row_factory = None
cur = con.cursor() #kursori pitää luoda uudelleen jotta edellä tehty asetus toimii
   
cur.execute("""
SELECT * 
FROM resepti
WHERE nimi = 'Ananas Con Carne'
""")


# seuraava rivi ei toimi kunnolla jos row_factory = sqlite3.row on päällä
print( str(cur.fetchall()).encode("UTF-8")+"\n")

#annettavien arvojen on oltava tuple siksi ylim ,
resepti1 = u"Ananas Con Carne" # merkkijonojen eteen on laitettava u-merkki jotta python ymmärtää niiden olevan unicodea eikä asciita

cur.execute("""
SELECT * 
FROM resepti
WHERE nimi = ?
""", (resepti1,))

print( str(cur.fetchall()).encode("UTF-8")+"\n")

resepti2 = "Tiramisu"
#annettavien arvojen on oltava tuple
reseptit = (resepti1, resepti2) #Kelpuutetaan tiramisu tai ananas con carne

cur.execute("""
SELECT * 
FROM resepti
WHERE nimi = ?
OR nimi = ?
""", reseptit) 

print( str(cur.fetchall()).encode("UTF-8")+"\n")

reseptit = {"rese1":resepti1, "rese2":resepti2}

cur.execute("""
SELECT * 
FROM resepti
WHERE nimi = :rese1
OR nimi = :rese2
""", reseptit)

# Taas yksi erilainen versio käydä kursori silmukassa läpi:
for (nimi, kuvaus, hlomaara, id, tyyppi) in cur:
    print('nimi:\t%s\n' % (nimi) )
    print('kuvaus:\t%s\n' % (kuvaus) )
    print('hlomaara:\t%s\n' % (hlomaara) )
    print('id:\t%s\n' % (id) )
    print('tyyppi:\t%s\n\n' % (tyyppi) )

print( "------\n" )

for rivi in cur:
    print('nimi:\t%s\n' % (rivi[0]) )
    print('kuvaus:\t%s\n' % (rivi[1]) )
    print('hlomaara:\t%s\n' % (rivi[2]) )
    print('id:\t%s\n' % (rivi[3]) )
    print('tyyppi:\t%s\n\n' % (rivi[4]) )

print( "------\n" )

con.row_factory = sqlite3.Row
cur = con.cursor()

cur.execute("""
SELECT * 
FROM resepti
""")

for rivi in cur:
    for i in rivi.keys():
        try:
            print('%s:\t%s\n' % (i, rivi[i].encode("UTF-8")) )
        except:
            print('%s:\t%s\n' % (i, rivi[i]) )
        
print("-----------------\n");
cur.execute("""
SELECT * 
FROM resepti
""")

for rivi in cur:
        print('Nimi:\t%s\n' % (rivi['Nimi'].encode("UTF-8")) )
        print('Kuvaus:\t%s\n' % (rivi['Kuvaus'].encode("UTF-8")) )
        print('Henkilomaara:\t%s\n' % (rivi['Henkilomaara']) )
        print('ReseptiID:\t%s\n' % (rivi['ReseptiID']) )
        print('RuokalajiID:\t%s\n' % (rivi['RuokalajiID']) )



#transaktiot
#
print("Transaktiot\n")

try:
    cur.execute("""
    INSERT INTO Resepti (Nimi, Kuvaus, Henkilomaara, RuokalajiID)
    VALUES (:nimi, :kuvaus, :henkilomaara, :ruokalajiID )
    """, {"nimi":"Talkkunahyve", "kuvaus":"perinteinen jälkkäri",
         "henkilomaara":4,"ruokalajiID":7})
except:
    print("nyt tuli virhe: %s" % sys.exc_info()[0] + "\n")
    print("Lisääminen epäonnistui\n")

# palauttaa viimeisimmän lisäyksen id:n
reseptiID = cur.lastrowid
#	reseptiID = "9"
print( str(reseptiID) + "\n" )

try:
    cur.execute("""
    UPDATE Resepti
    SET Nimi = 'Puolukkahyve'
    WHERE ReseptiID = ?
    """, (reseptiID,))
except:
    print("nyt tuli virhe: %s" % sys.exc_info()[0] + "\n")
    print("Päivittäminen epäonnistui\n")

try:
    cur.execute("""
    DELETE From Resepti
    WHERE ReseptiID = :id
    """, {"id":reseptiID} )
except:
    print("nyt tuli virhe: %s" % sys.exc_info()[0] + "\n")
    print("Poistaminen epäonnistui\n")

#ilman tätä muutokset eivät jää voimaan!
con.commit()
print("Transaktio loppuu\n")	

try:
    cur.execute("""
    SELECT last_insert_rowid()
    """)
except:
    print( "epäonnistui" )

avain = cur.fetchone()
print( str(avain[0]) + "\n" )

cur.execute("""
SELECT Nimi
FROM resepti
""")

for rivi in cur:
        print('%s\n' % (rivi["Nimi"]) )

#yhteys pitää lopuksi sulkea
#poikkeuksena tilanteet joissa samaa yhteyttä jaetaan
con.close()

