1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
113c5fc84109e806cd97be2ce6cd720e1cc949f26dphoglund@webrtc.org// This file contains the helper classes for the DataLog APIs. See data_log.h
123c5fc84109e806cd97be2ce6cd720e1cc949f26dphoglund@webrtc.org// for the APIs.
133c5fc84109e806cd97be2ce6cd720e1cc949f26dphoglund@webrtc.org//
143c5fc84109e806cd97be2ce6cd720e1cc949f26dphoglund@webrtc.org// These classes are helper classes used for logging data for offline
153c5fc84109e806cd97be2ce6cd720e1cc949f26dphoglund@webrtc.org// processing. Data logged with these classes can conveniently be parsed and
163c5fc84109e806cd97be2ce6cd720e1cc949f26dphoglund@webrtc.org// processed with e.g. Matlab.
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_DATA_LOG_IMPL_H_
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_DATA_LOG_IMPL_H_
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <map>
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <sstream>
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <string>
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <vector>
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
253c5fc84109e806cd97be2ce6cd720e1cc949f26dphoglund@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h"
263c5fc84109e806cd97be2ce6cd720e1cc949f26dphoglund@webrtc.org#include "webrtc/typedefs.h"
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass CriticalSectionWrapper;
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass EventWrapper;
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass LogTable;
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass RWLockWrapper;
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ThreadWrapper;
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// All container classes need to implement a ToString-function to be
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// writable to file. Enforce this via the Container interface.
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass Container {
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual ~Container() {}
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual void ToString(std::string* container_string) const = 0;
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtemplate<class T>
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ValueContainer : public Container {
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  explicit ValueContainer(T data) : data_(data) {}
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual void ToString(std::string* container_string) const {
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    *container_string = "";
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::stringstream ss;
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ss << data_ << ",";
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ss >> *container_string;
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private:
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  T   data_;
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtemplate<class T>
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass MultiValueContainer : public Container {
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  MultiValueContainer(const T* data, int length)
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    : data_(data, data + length) {
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual void ToString(std::string* container_string) const {
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    *container_string = "";
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::stringstream ss;
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (size_t i = 0; i < data_.size(); ++i)
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      ss << data_[i] << ",";
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    *container_string += ss.str();
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private:
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::vector<T>  data_;
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass DataLogImpl {
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ~DataLogImpl();
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // The implementation of the CreateLog() method declared in data_log.h.
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // See data_log.h for a description.
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static int CreateLog();
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // The implementation of the StaticInstance() method declared in data_log.h.
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // See data_log.h for a description.
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static DataLogImpl* StaticInstance();
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // The implementation of the ReturnLog() method declared in data_log.h. See
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // data_log.h for a description.
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static void ReturnLog();
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // The implementation of the AddTable() method declared in data_log.h. See
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // data_log.h for a description.
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int AddTable(const std::string& table_name);
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // The implementation of the AddColumn() method declared in data_log.h. See
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // data_log.h for a description.
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int AddColumn(const std::string& table_name,
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                const std::string& column_name,
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                int multi_value_length);
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Inserts a Container into a table with name table_name at the column
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // with name column_name.
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // column_name is treated in a case sensitive way.
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int InsertCell(const std::string& table_name,
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 const std::string& column_name,
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 const Container* value_container);
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // The implementation of the NextRow() method declared in data_log.h. See
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // data_log.h for a description.
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int NextRow(const std::string& table_name);
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private:
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  DataLogImpl();
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Initializes the DataLogImpl object, allocates and starts the
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // thread file_writer_thread_.
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int Init();
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Write all complete rows in every table to file.
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // This function should only be called by the file_writer_thread_ if that
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // thread is running to avoid race conditions.
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void Flush();
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Run() is called by the thread file_writer_thread_.
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static bool Run(void* obj);
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // This function writes data to file. Note, it blocks if there is no data
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // that should be written to file availble. Flush is the non-blocking
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // version of this function.
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void Process();
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Stops the continuous calling of Process().
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void StopThread();
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Collection of tables indexed by the table name as std::string.
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  typedef std::map<std::string, LogTable*> TableMap;
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  typedef webrtc::scoped_ptr<CriticalSectionWrapper> CritSectScopedPtr;
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static CritSectScopedPtr  crit_sect_;
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static DataLogImpl*       instance_;
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int                       counter_;
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  TableMap                  tables_;
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EventWrapper*             flush_event_;
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ThreadWrapper*            file_writer_thread_;
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  RWLockWrapper*            tables_lock_;
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace webrtc
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_DATA_LOG_IMPL_H_
156