Add error handling.

This commit is contained in:
Jonathan Bernard 2016-01-31 11:54:37 -06:00
parent 66bb8d9d39
commit bccd0439f7

View File

@ -8,22 +8,16 @@ import json, times, os, docopt
type DbMigrateConfig* = tuple[ driver, sqlDir, connectionString: string ]
proc loadConfig*(filename: string): DbMigrateConfig =
## Load DbMigrateConfig from a file.
let cfg = json.parseFile(filename)
let config = (
return (
driver: if cfg.hasKey("driver"): cfg["driver"].getStr else: "postres",
sqlDir: if cfg.hasKey("sqlDir"): cfg["sqlDir"].getStr else: "migrations",
connectionString: cfg["connectionString"].getStr)
# Check for migrations directory
# TODO: try/except
if not existsDir config.sqlDir:
echo "SQL directory '" & config.sqlDir &
"' does not exist and will be created."
createDir config.sqlDir
return config
proc createMigration*(config: DBMigrateConfig, migrationName: string): seq[string] =
## Create a new set of database migration files.
let timestamp = getTime().getLocalTime().format("yyyyMMddHHmmss")
let filenamePrefix = timestamp & "-" & migrationName
@ -32,7 +26,6 @@ proc createMigration*(config: DBMigrateConfig, migrationName: string): seq[strin
let scriptDesc = migrationName & " (" & timestamp & ")"
# TODO: try/except and catch errors creating files.
let upFile = open(upFilename, fmWrite)
let downFile = open(downFilename, fmWrite)
@ -57,17 +50,39 @@ Options:
# Parse arguments
let args = docopt(doc, version = "db-migrate 0.1.0")
echo $args
let exitErr = proc(msg: string): void =
stderr.writeLine("db_migrate: " & msg)
quit(QuitFailure)
# Load configuration file
let configFilename =
if args["--config"]: $args["--config"]
else: "database.json"
let config = loadConfig(configFilename)
var config: DbMigrateConfig
try:
config = loadConfig(configFilename)
except IOError:
exitErr "Cannot open config file: " & configFilename
except:
exitErr "Error parsing config file: " & configFilename & "\L\t" & getCurrentExceptionMsg()
# Check for migrations directory
if not existsDir config.sqlDir:
try:
echo "SQL directory '" & config.sqlDir &
"' does not exist and will be created."
createDir config.sqlDir
except IOError:
exitErr "Unable to create directory: " & config.sqlDir & ":\L\T" & getCurrentExceptionMsg()
# Execute commands
if args["create"]:
let filesCreated = createMigration(config, $args["<migration-name>"])
echo "Created new migration files:"
for filename in filesCreated: echo "\t" & filename
try:
let filesCreated = createMigration(config, $args["<migration-name>"])
echo "Created new migration files:"
for filename in filesCreated: echo "\t" & filename
except IOError:
exitErr "Unable to create migration scripts: " & getCurrentExceptionMsg()