blob: 6fc1d64495156d8cb9d3c3ed85b8107586824663 [file] [log] [blame]
stefan@webrtc.orgc9cff242011-08-29 07:39:02 +00001/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11/*
12 * This singleton can be used for logging data for offline processing. Data
13 * logged with it can conveniently be parsed and processed with e.g. Matlab.
14 *
15 * Following is an example of the log file format, starting with the header
16 * row at line 1, and the data rows following.
17 * col1,col2,col3,multi-value-col4[3],,,col5
18 * 123,10.2,-243,1,2,3,100
19 * 241,12.3,233,1,2,3,200
20 * 13,16.4,-13,1,2,3,300
21 *
22 * As can be seen in the example, a multi-value-column is specified with the
23 * name followed the number of elements it contains. This followed by
24 * number of elements - 1 empty columns.
25 *
26 * Without multi-value-columns this format can be natively by Matlab. With
27 * multi-value-columns a small Matlab script is needed, available at
28 * trunk/tools/matlab/parseLog.m.
29 *
30 * Table names and column names are case sensitive.
31 */
32
33#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_DATA_LOG_H_
34#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_DATA_LOG_H_
35
36#include <string>
37
38#include "data_log_impl.h"
39
40namespace webrtc {
41
42class DataLog {
43 public:
44 // Creates a log which uses a separate thread (referred to as the file
45 // writer thread) for writing log rows to file.
46 //
47 // Calls to this function after the log object has been created will only
48 // increment the reference counter.
49 static int CreateLog();
50
51 // Decrements the reference counter and deletes the log when the counter
52 // reaches 0. Should be called equal number of times as successful calls to
53 // CreateLog or memory leak will occur.
54 static void ReturnLog();
55
stefan@webrtc.org3bbe41a2011-09-07 15:31:03 +000056 // Combines the string table_name and the integer table_id into a new string
57 // table_name + _ + table_id. The new string will be lower-case.
58 static std::string Combine(const std::string& table_name, int table_id);
59
60 // Adds a new table, with the name table_name, and creates the file, with the
61 // name table_name + ".txt", to which the table will be written.
62 // table_name is treated in a case sensitive way.
63 static int AddTable(const std::string& table_name);
stefan@webrtc.orgc9cff242011-08-29 07:39:02 +000064
65 // Adds a new column to a table. The column will be a multi-value-column
66 // if multi_value_length is greater than 1.
stefan@webrtc.org3bbe41a2011-09-07 15:31:03 +000067 // table_name and column_name are treated in a case sensitive way.
stefan@webrtc.orgc9cff242011-08-29 07:39:02 +000068 static int AddColumn(const std::string& table_name,
69 const std::string& column_name,
70 int multi_value_length);
71
stefan@webrtc.org3bbe41a2011-09-07 15:31:03 +000072 // Inserts a single value into a table with name table_name at the column with
73 // name column_name.
stefan@webrtc.orgc9cff242011-08-29 07:39:02 +000074 // Note that the ValueContainer makes use of the copy constructor,
75 // operator= and operator<< of the type T, and that the template type must
76 // implement a deep copy copy constructor and operator=.
77 // Copy constructor and operator= must not be disabled for the type T.
stefan@webrtc.org3bbe41a2011-09-07 15:31:03 +000078 // table_name and column_name are treated in a case sensitive way.
stefan@webrtc.orgc9cff242011-08-29 07:39:02 +000079 template<class T>
80 static int InsertCell(const std::string& table_name,
81 const std::string& column_name,
82 T value) {
83 DataLogImpl* data_log = DataLogImpl::StaticInstance();
84 if (data_log == NULL)
85 return -1;
86 return data_log->InsertCell(
87 table_name,
88 column_name,
89 new ValueContainer<T>(value));
90 }
91
92 // Inserts an array of values into a table with name table_name at the
93 // column specified by column_name, which must be a multi-value-column.
94 // Note that the MultiValueContainer makes use of the copy constructor,
95 // operator= and operator<< of the type T, and that the template type
96 // must implement a deep copy copy constructor and operator=.
97 // Copy constructor and operator= must not be disabled for the type T.
stefan@webrtc.org3bbe41a2011-09-07 15:31:03 +000098 // table_name and column_name are treated in a case sensitive way.
stefan@webrtc.orgc9cff242011-08-29 07:39:02 +000099 template<class T>
100 static int InsertCell(const std::string& table_name,
101 const std::string& column_name,
102 const T* array,
103 int length) {
104 DataLogImpl* data_log = DataLogImpl::StaticInstance();
105 if (data_log == NULL)
106 return -1;
107 return data_log->InsertCell(
108 table_name,
109 column_name,
110 new MultiValueContainer<T>(array, length));
111 }
112
stefan@webrtc.org3bbe41a2011-09-07 15:31:03 +0000113 // For the table with name table_name: Writes the current row to file.
114 // Starts a new empty row.
115 // table_name is treated in a case-sensitive way.
stefan@webrtc.orgc9cff242011-08-29 07:39:02 +0000116 static int NextRow(const std::string& table_name);
117};
118
119} // namespace webrtc
120
121#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_DATA_LOG_H_