| | |
| | | ofs.flush(); |
| | | return rows; |
| | | } |
| | | |
| | | std::optional<GlassLogDb::Row> GlassLogDb::queryById(long long id) { |
| | | std::lock_guard<std::mutex> lk(mtx_); |
| | | |
| | | const char* sql = |
| | | "SELECT id, cassette_seq_no, job_seq_no, class_id, material_type, state," |
| | | " IFNULL(strftime('%Y-%m-%d %H:%M:%S', t_start, 'localtime'), '')," |
| | | " IFNULL(strftime('%Y-%m-%d %H:%M:%S', t_end, 'localtime'), '')," |
| | | " buddy_id, aoi_result, path, params, pretty" |
| | | " FROM " GLASS_LOG_TABLE |
| | | " WHERE id = ?"; |
| | | |
| | | sqlite3_stmt* stmt = nullptr; |
| | | try { |
| | | throwIf(sqlite3_prepare_v2(db_, sql, -1, &stmt, nullptr), db_, "prepare queryById"); |
| | | throwIf(sqlite3_bind_int64(stmt, 1, id), db_, "bind id"); |
| | | |
| | | std::optional<Row> result; |
| | | |
| | | int rc = sqlite3_step(stmt); |
| | | if (rc == SQLITE_ROW) { |
| | | Row row; |
| | | row.id = sqlite3_column_int64(stmt, 0); |
| | | row.cassetteSeqNo = sqlite3_column_int(stmt, 1); |
| | | row.jobSeqNo = sqlite3_column_int(stmt, 2); |
| | | row.classId = safe_text(stmt, 3); |
| | | row.materialType = sqlite3_column_int(stmt, 4); |
| | | row.state = sqlite3_column_int(stmt, 5); |
| | | row.tStart = safe_text(stmt, 6); |
| | | row.tEnd = safe_text(stmt, 7); |
| | | row.buddyId = safe_text(stmt, 8); |
| | | row.aoiResult = sqlite3_column_int(stmt, 9); |
| | | row.path = safe_text(stmt, 10); |
| | | row.params = safe_text(stmt, 11); |
| | | row.pretty = safe_text(stmt, 12); |
| | | |
| | | result = std::move(row); |
| | | } |
| | | else if (rc != SQLITE_DONE) { |
| | | throwIf(rc, db_, "queryById step"); |
| | | } |
| | | |
| | | sqlite3_finalize(stmt); |
| | | return result; |
| | | } |
| | | catch (const std::exception& e) { |
| | | if (stmt) sqlite3_finalize(stmt); |
| | | TRACE("GlassLogDb::queryById exception: %s\n", e.what()); |
| | | return std::nullopt; |
| | | } |
| | | } |
| | | |