1225 cat_lines(input_dirs.map(dir => " " + dir.expand.implode))) |
1227 cat_lines(input_dirs.map(dir => " " + dir.expand.implode))) |
1226 |
1228 |
1227 |
1229 |
1228 /* database */ |
1230 /* database */ |
1229 |
1231 |
1230 private def database_server: Boolean = options.bool("build_database_server") |
1232 def database_server: Boolean = options.bool("build_database_server") |
1231 |
1233 |
1232 def access_database(name: String, output: Boolean = false): Option[SQL.Database] = |
1234 def open_database_server(): SQL.Database = |
1233 { |
1235 PostgreSQL.open_database( |
1234 if (database_server) { |
1236 user = options.string("build_database_user"), |
1235 val db = |
1237 password = options.string("build_database_password"), |
1236 PostgreSQL.open_database( |
1238 database = options.string("build_database_name"), |
1237 user = options.string("build_database_user"), |
1239 host = options.string("build_database_host"), |
1238 password = options.string("build_database_password"), |
1240 port = options.int("build_database_port"), |
1239 database = options.string("build_database_name"), |
1241 ssh = |
1240 host = options.string("build_database_host"), |
1242 options.proper_string("build_database_ssh_host").map(ssh_host => |
1241 port = options.int("build_database_port"), |
1243 SSH.open_session(options, |
1242 ssh = |
1244 host = ssh_host, |
1243 options.proper_string("build_database_ssh_host").map(ssh_host => |
1245 user = options.string("build_database_ssh_user"), |
1244 SSH.open_session(options, |
1246 port = options.int("build_database_ssh_port"))), |
1245 host = ssh_host, |
1247 ssh_close = true) |
1246 user = options.string("build_database_ssh_user"), |
1248 |
1247 port = options.int("build_database_ssh_port"))), |
1249 def try_open_database(name: String, output: Boolean = false): Option[SQL.Database] = |
1248 ssh_close = true) |
1250 { |
1249 if (output || has_session_info(db, name)) Some(db) else { db.close; None } |
1251 def check(db: SQL.Database): Option[SQL.Database] = |
1250 } |
1252 if (output || session_info_exists(db)) Some(db) else { db.close; None } |
|
1253 |
|
1254 if (database_server) check(open_database_server()) |
1251 else if (output) Some(SQLite.open_database(output_database(name))) |
1255 else if (output) Some(SQLite.open_database(output_database(name))) |
1252 else input_dirs.map(_ + database(name)).find(_.is_file).map(SQLite.open_database) |
1256 else { |
|
1257 (for { |
|
1258 dir <- input_dirs.view |
|
1259 path = dir + database(name) if path.is_file |
|
1260 db <- check(SQLite.open_database(path)) |
|
1261 } yield db).headOption |
|
1262 } |
1253 } |
1263 } |
1254 |
1264 |
1255 def open_database(name: String, output: Boolean = false): SQL.Database = |
1265 def open_database(name: String, output: Boolean = false): SQL.Database = |
1256 access_database(name, output = output) getOrElse |
1266 try_open_database(name, output = output) getOrElse |
1257 error("Missing build database for session " + quote(name)) |
1267 error("Missing build database for session " + quote(name)) |
1258 |
1268 |
1259 def clean_output(name: String): (Boolean, Boolean) = |
1269 def clean_output(name: String): (Boolean, Boolean) = |
1260 { |
1270 { |
1261 val relevant_db = |
1271 val relevant_db = |
1262 database_server && |
1272 database_server && |
1263 { |
1273 { |
1264 access_database(name) match { |
1274 try_open_database(name) match { |
1265 case Some(db) => |
1275 case Some(db) => |
1266 try { |
1276 try { |
1267 db.transaction { |
1277 db.transaction { |
1268 val relevant_db = has_session_info(db, name) |
1278 val relevant_db = session_info_defined(db, name) |
1269 init_session_info(db, name) |
1279 init_session_info(db, name) |
1270 relevant_db |
1280 relevant_db |
1271 } |
1281 } |
1272 } finally { db.close } |
1282 } finally { db.close } |
1273 case None => false |
1283 case None => false |
1316 db.using_statement( |
1326 db.using_statement( |
1317 Export.Data.table.delete(Export.Data.session_name.where_equal(name)))(_.execute) |
1327 Export.Data.table.delete(Export.Data.session_name.where_equal(name)))(_.execute) |
1318 } |
1328 } |
1319 } |
1329 } |
1320 |
1330 |
1321 def has_session_info(db: SQL.Database, name: String): Boolean = |
1331 def session_info_exists(db: SQL.Database): Boolean = |
1322 { |
1332 { |
|
1333 val tables = db.tables |
|
1334 tables.contains(Session_Info.table.name) && |
|
1335 tables.contains(Export.Data.table.name) |
|
1336 } |
|
1337 |
|
1338 def session_info_defined(db: SQL.Database, name: String): Boolean = |
1323 db.transaction { |
1339 db.transaction { |
1324 db.tables.contains(Session_Info.table.name) && |
1340 session_info_exists(db) && |
1325 { |
1341 { |
1326 db.using_statement( |
1342 db.using_statement( |
1327 Session_Info.table.select(List(Session_Info.session_name), |
1343 Session_Info.table.select(List(Session_Info.session_name), |
1328 Session_Info.session_name.where_equal(name)))(stmt => stmt.execute_query().next()) |
1344 Session_Info.session_name.where_equal(name)))(stmt => stmt.execute_query().next()) |
1329 } |
1345 } |
1330 } |
1346 } |
1331 } |
|
1332 |
1347 |
1333 def write_session_info( |
1348 def write_session_info( |
1334 db: SQL.Database, |
1349 db: SQL.Database, |
1335 name: String, |
1350 name: String, |
1336 build_log: Build_Log.Session_Info, |
1351 build_log: Build_Log.Session_Info, |