db.py
author Eugen Sawin <sawine@me73.com>
Fri, 01 Oct 2010 17:09:30 +0200
changeset 5 9d0e6ae739cf
parent 4 5e41c4b578da
child 6 6f89b07e12cc
permissions -rw-r--r--
Added basic end command.
sawine@3
     1
"""
sawine@3
     2
Database lib for cronrec.
sawine@3
     3
Author: Eugen Sawin (sawine@me73.com)
sawine@3
     4
Dependencies: libsqlite3-dev
sawine@3
     5
"""
sawine@3
     6
sawine@3
     7
import sqlite3
sawine@3
     8
sawine@3
     9
ACTIVITIES_TABLE = """activities(
sawine@3
    10
name text not null,
sawine@3
    11
description text)"""
sawine@3
    12
sawine@3
    13
COMPANIES_TABLE = """companies(
sawine@3
    14
name text not null,
sawine@3
    15
street text,
sawine@3
    16
area text,
sawine@3
    17
town text,
sawine@3
    18
country text,
sawine@3
    19
postal text)"""
sawine@3
    20
sawine@3
    21
PROJECTS_TABLE = """projects(
sawine@3
    22
name text not null,
sawine@3
    23
number int,
sawine@3
    24
customer int,
sawine@3
    25
constraint customer_fk foreign key(customer) references companies(rowid) on delete
sawine@3
    26
cascade)"""
sawine@3
    27
sawine@3
    28
RATES_TABLE = """rates(
sawine@3
    29
rate smallmoney
sawine@3
    30
flatrate smallmoney,
sawine@3
    31
project int,
sawine@3
    32
activity int,
sawine@3
    33
constraint project_fk foreign key(project) references projects(rowid) on delete
sawine@3
    34
cascade,
sawine@3
    35
constraint activity_fk foreign key(activity) references activities(rowid) on delete
sawine@3
    36
cascade)"""
sawine@3
    37
sawine@3
    38
TASKS_TABLE = """tasks(
sawine@3
    39
begin datetime,
sawine@3
    40
end datetime,
sawine@3
    41
project int,
sawine@3
    42
activity int,
sawine@3
    43
log text,
sawine@3
    44
constraint project_fk foreign key(project) references projects(rowid) on delete
sawine@3
    45
cascade,
sawine@3
    46
constraint activity_fk foreign key(activity) references activities(rowid) on delete
sawine@3
    47
cascade)"""
sawine@3
    48
sawine@3
    49
TABLES = (ACTIVITIES_TABLE, COMPANIES_TABLE, PROJECTS_TABLE, RATES_TABLE,
sawine@3
    50
TASKS_TABLE)
sawine@3
    51
sawine@4
    52
DEF_PROJECT = "default"
sawine@4
    53
DEF_ACTIVITY = "default"
sawine@4
    54
sawine@3
    55
def session(db_file):
sawine@3
    56
	con = sqlite3.connect(db_file)
sawine@3
    57
	return con, con.cursor()
sawine@3
    58
sawine@3
    59
def test_tables(db_file):
sawine@3
    60
	con, cur = session(db_file)
sawine@3
    61
	sql = "select * from sqlite_master where type='table'"
sawine@3
    62
	cur.execute(sql)
sawine@3
    63
	for c in cur:
sawine@3
    64
		print c
sawine@3
    65
sawine@3
    66
def init(db_file):
sawine@3
    67
	con, cur = session(db_file)
sawine@3
    68
	for table in TABLES:
sawine@3
    69
		sql = "create table " + table
sawine@3
    70
		cur.execute(sql)
sawine@3
    71
	con.commit()
sawine@3
    72
	cur.close()
sawine@3
    73
sawine@5
    74
def find_last_project(db_file, time):
sawine@4
    75
	con, cur = session(db_file)
sawine@4
    76
	values = (time,)
sawine@5
    77
	sql = "select project from tasks where begin < ? and end is null order by \
sawine@5
    78
begin desc"
sawine@4
    79
	cur.execute(sql, values)
sawine@4
    80
	id = cur.fetchone()
sawine@4
    81
	if id:
sawine@4
    82
		values = (id[0],)
sawine@4
    83
		sql = "select name from projects where rowid=?"
sawine@4
    84
		cur.execute(sql, values)
sawine@5
    85
		project = cur.fetchone()[0]
sawine@4
    86
	else:
sawine@4
    87
		project = DEF_PROJECT
sawine@4
    88
	con.commit()
sawine@4
    89
	cur.close()
sawine@4
    90
	return project
sawine@4
    91
sawine@5
    92
def find_last_activity(db_file, time):
sawine@5
    93
	con, cur = session(db_file)
sawine@5
    94
	values = (time,)
sawine@5
    95
	sql = "select activity from tasks where begin < ? and end is null order by \
sawine@5
    96
begin desc"
sawine@5
    97
	cur.execute(sql, values)
sawine@5
    98
	id = cur.fetchone()
sawine@5
    99
	if id:
sawine@5
   100
		values = (id[0],)
sawine@5
   101
		sql = "select name from activities where rowid=?"
sawine@5
   102
		cur.execute(sql, values)
sawine@5
   103
		activity = cur.fetchone()[0]
sawine@5
   104
	else:
sawine@5
   105
		activity = DEF_ACTIVITY
sawine@5
   106
	con.commit()
sawine@5
   107
	cur.close()
sawine@5
   108
	return activity
sawine@5
   109
sawine@4
   110
def row_id(db_file, table, name):
sawine@4
   111
	con, cur = session(db_file)
sawine@4
   112
	values = (name,)
sawine@4
   113
	sql = "select rowid from %s where name=?" % table
sawine@4
   114
	cur.execute(sql, values)
sawine@4
   115
	id = cur.fetchone()
sawine@4
   116
	if not id:
sawine@4
   117
		sql = "insert into %s(name) values(?)" % table
sawine@4
   118
		cur.execute(sql, values)
sawine@4
   119
		con.commit()
sawine@4
   120
		cur.close()
sawine@4
   121
		return row_id(db_file, table, name)
sawine@4
   122
	con.commit()
sawine@4
   123
	cur.close()
sawine@4
   124
	return id[0]
sawine@4
   125
sawine@4
   126
def project_id(db_file, name):
sawine@4
   127
	return row_id(db_file, "projects", name)
sawine@4
   128
sawine@4
   129
def activity_id(db_file, name):
sawine@4
   130
	return row_id(db_file, "activities", name)
sawine@4
   131
sawine@5
   132
def end(db_file, project, activity, time):
sawine@5
   133
	if not activity:
sawine@5
   134
		activity = find_last_activity(db_file, time)
sawine@5
   135
	if not project:
sawine@5
   136
		project = find_last_project(db_file, time) 
sawine@5
   137
	con, cur = session(db_file)
sawine@5
   138
	values = (time, project_id(db_file, project), activity_id(db_file, activity))
sawine@5
   139
	sql = "update tasks set end=? where project=? and activity=?"
sawine@5
   140
	cur.execute(sql, values)
sawine@5
   141
	con.commit()
sawine@5
   142
	cur.execute("select * from tasks")
sawine@5
   143
	for c in cur:
sawine@5
   144
		print c
sawine@5
   145
	cur.close()
sawine@5
   146
sawine@3
   147
def begin(db_file, project, activity, time):
sawine@5
   148
	last_project = find_last_project(db_file, time) 
sawine@5
   149
	last_activity = find_last_activity(db_file, time)
sawine@4
   150
	if not activity:
sawine@4
   151
		activity = DEF_ACTIVITY
sawine@4
   152
	if not project:
sawine@5
   153
		project = last_project
sawine@5
   154
	if activity != last_activity or project != last_project:
sawine@5
   155
		end(db_file, project, last_activity, time)
sawine@3
   156
	con, cur = session(db_file)
sawine@4
   157
	values = (time, None, project_id(db_file, project), 
sawine@4
   158
				activity_id(db_file, activity), None)
sawine@3
   159
	sql = "insert into tasks values(?, ?, ?, ?, ?)"
sawine@3
   160
	cur.execute(sql, values)
sawine@3
   161
	con.commit()
sawine@3
   162
	cur.execute("select * from tasks")
sawine@3
   163
	for c in cur:
sawine@3
   164
		print c
sawine@3
   165
	con.commit()
sawine@3
   166
	cur.close()