diff --git a/db_migrate.nim b/db_migrate.nim index 509de49..0cfe76a 100644 --- a/db_migrate.nim +++ b/db_migrate.nim @@ -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[""]) - echo "Created new migration files:" - for filename in filesCreated: echo "\t" & filename + try: + let filesCreated = createMigration(config, $args[""]) + echo "Created new migration files:" + for filename in filesCreated: echo "\t" & filename + except IOError: + exitErr "Unable to create migration scripts: " & getCurrentExceptionMsg() +