(* Implement subcommands for adding new tasks. *) open CalendarLib open Todo_types open Todo_utils open Printf let parse_tags tags = nsplit "," tags let insert_tags dbh taskid tags = List.iter ( fun tag -> let rows = PGSQL(dbh) "select id from tags where name = $tag" in let id = match rows with | [] -> error "unknown tag: %s" tag | [id] -> id | _ -> assert false in PGSQL(dbh) "insert into tags_tasks (tagid, taskid) values ($id, $taskid)" ) tags let cmd_todo dbh anon_params estimate = let deadline, description, tags = match anon_params with | [deadline; description] -> Printer.Date.from_string deadline, description, [] | [deadline; description; tags] -> Printer.Date.from_string deadline, description, parse_tags tags | _ -> error "incorrect number of parameters to 'todo' subcommand" in PGOCaml.begin_work dbh; PGSQL(dbh) "insert into tasks (description) values ($description)"; let taskid = PGOCaml.serial4 dbh "tasks_id_seq" in PGSQL(dbh) "insert into todo (taskid, deadline, estimate) values ($taskid, $deadline :: date, $?estimate)"; insert_tags dbh taskid tags; PGOCaml.commit dbh let cmd_today dbh anon_params = let description, tags = match anon_params with | [description] -> description, [] | [description; tags] -> description, parse_tags tags | _ -> error "incorrect number of parameters to 'today' subcommand" in PGOCaml.begin_work dbh; PGSQL(dbh) "insert into tasks (description) values ($description)"; let taskid = PGOCaml.serial4 dbh "tasks_id_seq" in PGSQL(dbh) "insert into imminent (taskid) values ($taskid)"; insert_tags dbh taskid tags; PGOCaml.commit dbh let cmd_idea dbh anon_params = let description, tags = match anon_params with | [description] -> description, [] | [description; tags] -> description, parse_tags tags | _ -> error "incorrect number of parameters to 'idea' subcommand" in PGOCaml.begin_work dbh; PGSQL(dbh) "insert into tasks (description) values ($description)"; let taskid = PGOCaml.serial4 dbh "tasks_id_seq" in PGSQL(dbh) "insert into ideas (taskid) values ($taskid)"; insert_tags dbh taskid tags; PGOCaml.commit dbh