1 /* 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 // This singleton can be used for logging data for offline processing. Data 12 // logged with it can conveniently be parsed and processed with e.g. Matlab. 13 // 14 // Following is an example of the log file format, starting with the header 15 // row at line 1, and the data rows following. 16 // col1,col2,col3,multi-value-col4[3],,,col5 17 // 123,10.2,-243,1,2,3,100 18 // 241,12.3,233,1,2,3,200 19 // 13,16.4,-13,1,2,3,300 20 // 21 // As can be seen in the example, a multi-value-column is specified with the 22 // name followed the number of elements it contains. This followed by 23 // number of elements - 1 empty columns. 24 // 25 // Without multi-value-columns this format can be natively by Matlab. With 26 // multi-value-columns a small Matlab script is needed, available at 27 // trunk/tools/matlab/parseLog.m. 28 // 29 // Table names and column names are case sensitive. 30 31 #ifndef WEBRTC_SYSTEM_WRAPPERS_INCLUDE_DATA_LOG_H_ 32 #define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_DATA_LOG_H_ 33 34 #include <string> 35 36 #include "webrtc/system_wrappers/include/data_log_impl.h" 37 38 namespace webrtc { 39 40 class DataLog { 41 public: 42 // Creates a log which uses a separate thread (referred to as the file 43 // writer thread) for writing log rows to file. 44 // 45 // Calls to this function after the log object has been created will only 46 // increment the reference counter. 47 static int CreateLog(); 48 49 // Decrements the reference counter and deletes the log when the counter 50 // reaches 0. Should be called equal number of times as successful calls to 51 // CreateLog or memory leak will occur. 52 static void ReturnLog(); 53 54 // Combines the string table_name and the integer table_id into a new string 55 // table_name + _ + table_id. The new string will be lower-case. 56 static std::string Combine(const std::string& table_name, int table_id); 57 58 // Adds a new table, with the name table_name, and creates the file, with the 59 // name table_name + ".txt", to which the table will be written. 60 // table_name is treated in a case sensitive way. 61 static int AddTable(const std::string& table_name); 62 63 // Adds a new column to a table. The column will be a multi-value-column 64 // if multi_value_length is greater than 1. 65 // table_name and column_name are treated in a case sensitive way. 66 static int AddColumn(const std::string& table_name, 67 const std::string& column_name, 68 int multi_value_length); 69 70 // Inserts a single value into a table with name table_name at the column with 71 // name column_name. 72 // Note that the ValueContainer makes use of the copy constructor, 73 // operator= and operator<< of the type T, and that the template type must 74 // implement a deep copy copy constructor and operator=. 75 // Copy constructor and operator= must not be disabled for the type T. 76 // table_name and column_name are treated in a case sensitive way. 77 template<class T> 78 static int InsertCell(const std::string& table_name, 79 const std::string& column_name, 80 T value) { 81 DataLogImpl* data_log = DataLogImpl::StaticInstance(); 82 if (data_log == NULL) 83 return -1; 84 return data_log->InsertCell( 85 table_name, 86 column_name, 87 new ValueContainer<T>(value)); 88 } 89 90 // Inserts an array of values into a table with name table_name at the 91 // column specified by column_name, which must be a multi-value-column. 92 // Note that the MultiValueContainer makes use of the copy constructor, 93 // operator= and operator<< of the type T, and that the template type 94 // must implement a deep copy copy constructor and operator=. 95 // Copy constructor and operator= must not be disabled for the type T. 96 // table_name and column_name are treated in a case sensitive way. 97 template<class T> 98 static int InsertCell(const std::string& table_name, 99 const std::string& column_name, 100 const T* array, 101 int length) { 102 DataLogImpl* data_log = DataLogImpl::StaticInstance(); 103 if (data_log == NULL) 104 return -1; 105 return data_log->InsertCell( 106 table_name, 107 column_name, 108 new MultiValueContainer<T>(array, length)); 109 } 110 111 // For the table with name table_name: Writes the current row to file. 112 // Starts a new empty row. 113 // table_name is treated in a case-sensitive way. 114 static int NextRow(const std::string& table_name); 115 }; 116 117 } // namespace webrtc 118 119 #endif // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_DATA_LOG_H_ 120