1 // Copyright 2011 The Kyua Authors. 2 // All rights reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions are 6 // met: 7 // 8 // * Redistributions of source code must retain the above copyright 9 // notice, this list of conditions and the following disclaimer. 10 // * Redistributions in binary form must reproduce the above copyright 11 // notice, this list of conditions and the following disclaimer in the 12 // documentation and/or other materials provided with the distribution. 13 // * Neither the name of Google Inc. nor the names of its contributors 14 // may be used to endorse or promote products derived from this software 15 // without specific prior written permission. 16 // 17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 29 /// \file store/read_transaction.hpp 30 /// Implementation of read-only transactions on the backend. 31 32 #if !defined(STORE_READ_TRANSACTION_HPP) 33 #define STORE_READ_TRANSACTION_HPP 34 35 #include "store/read_transaction_fwd.hpp" 36 37 extern "C" { 38 #include <stdint.h> 39 } 40 41 #include <memory> 42 #include <string> 43 44 #include "model/context_fwd.hpp" 45 #include "model/test_program_fwd.hpp" 46 #include "model/test_result_fwd.hpp" 47 #include "store/read_backend_fwd.hpp" 48 #include "store/read_transaction_fwd.hpp" 49 #include "utils/datetime_fwd.hpp" 50 51 namespace store { 52 53 54 namespace detail { 55 56 57 model::test_program_ptr get_test_program(read_backend&, const int64_t); 58 59 60 } // namespace detail 61 62 63 /// Iterator for the set of test case results that are part of an action. 64 /// 65 /// \todo Note that this is not a "standard" C++ iterator. I have chosen to 66 /// implement a different interface because it makes things easier to represent 67 /// an SQL statement state. Rewrite as a proper C++ iterator, inheriting from 68 /// std::iterator. 69 class results_iterator { 70 struct impl; 71 72 /// Pointer to the shared internal implementation. 73 std::shared_ptr< impl > _pimpl; 74 75 friend class read_transaction; 76 results_iterator(std::shared_ptr< impl >); 77 78 public: 79 ~results_iterator(void); 80 81 results_iterator& operator++(void); 82 operator bool(void) const; 83 84 const model::test_program_ptr test_program(void) const; 85 std::string test_case_name(void) const; 86 model::test_result result(void) const; 87 utils::datetime::timestamp start_time(void) const; 88 utils::datetime::timestamp end_time(void) const; 89 90 std::string stdout_contents(void) const; 91 std::string stderr_contents(void) const; 92 }; 93 94 95 /// Representation of a read-only transaction. 96 /// 97 /// Transactions are the entry place for high-level calls that access the 98 /// database. 99 class read_transaction { 100 struct impl; 101 102 /// Pointer to the shared internal implementation. 103 std::shared_ptr< impl > _pimpl; 104 105 friend class read_backend; 106 read_transaction(read_backend&); 107 108 public: 109 ~read_transaction(void); 110 111 void finish(void); 112 113 model::context get_context(void); 114 results_iterator get_results(void); 115 }; 116 117 118 } // namespace store 119 120 #endif // !defined(STORE_READ_TRANSACTION_HPP) 121