• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef TABLE_H
17 #define TABLE_H
18 
19 #include <log.h>
20 #include <memory>
21 #include <string>
22 #include <vector>
23 
24 #include "filter_constraints.h"
25 #include "index_map.h"
26 #include "sqlite3.h"
27 #include "trace_data_cache.h"
28 
29 namespace SysTuning {
30 namespace TraceStreamer {
31 class DemoTableBase;
32 using TabTemplate = std::unique_ptr<DemoTableBase> (*)(const TraceDataCache* dataCache);
33 class DemoTableBase : public sqlite3_vtab {
34 public:
35     virtual ~DemoTableBase();
36     DemoTableBase(const DemoTableBase&) = delete;
37     DemoTableBase& operator=(const DemoTableBase&) = delete;
38 
39     template <typename T>
TableDeclare(sqlite3 & db,TraceDataCache * dataCache,const std::string & name)40     static void TableDeclare(sqlite3& db, TraceDataCache* dataCache, const std::string& name)
41     {
42         DemoTableRegister(db, dataCache, name, [](const TraceDataCache* cache) {
43             return std::unique_ptr<DemoTableBase>(std::make_unique<T>(cache));
44         });
45         dataCache->DemoAppendNewTable(name);
46     }
47     static void SetModuleCallbacks(sqlite3_module& demoModule, const std::string& demoTableName);
48     std::string DemoCreateTableSql() const;
49 
50     class Cursor : public sqlite3_vtab_cursor {
51     public:
52         Cursor(const TraceDataCache* dataCache, DemoTableBase* table, uint32_t rowCount);
53         virtual ~Cursor();
Reset()54         virtual void Reset()
55         {
56             demoIndexMap_ = std::make_unique<IndexMap>(0, demoRowCount_);
57         }
58 
Next()59         virtual int32_t Next()
60         {
61             demoIndexMap_->Next();
62             return SQLITE_OK;
63         }
64 
Eof()65         virtual int32_t Eof()
66         {
67             return demoDataCache_->DemoCancel() || demoIndexMap_->Eof();
68         }
69 
CurrentRow()70         virtual uint32_t CurrentRow() const
71         {
72             return demoIndexMap_->CurrentRow();
73         }
74         virtual void DemoFilterTS(unsigned char op, sqlite3_value* argv, const std::deque<InternalTime>& times);
75 
76         virtual int32_t DemoRowId(sqlite3_int64* id);
DemoFilter(const FilterConstraints & fc,sqlite3_value ** argv)77         virtual int32_t DemoFilter(const FilterConstraints& fc, sqlite3_value** argv)
78         {
79             Unused(fc);
80             Unused(argv);
81             return 0;
82         }
83         virtual int32_t Column(int32_t n) const = 0;
84         virtual void DemoFilterId(unsigned char op, sqlite3_value* argv);
85 
86     public:
87         sqlite3_context* demoContext_;
88         DemoTableBase* demoTable_ = nullptr;
89 
90     protected:
91         const TraceDataCache* demoDataCache_;
92         std::unique_ptr<IndexMap> demoIndexMap_;
93         uint32_t demoRowCount_;
94     };
95 
96     struct ColumnInfo {
ColumnInfoColumnInfo97         ColumnInfo(const std::string& name, const std::string& type) : name_(name), type_(type) {}
98         std::string name_;
99         std::string type_;
100     };
101 
102 protected:
DemoTableBase(const TraceDataCache * dataCache)103     explicit DemoTableBase(const TraceDataCache* dataCache) : demoTraceDataCache_(dataCache), demoCursor_(nullptr) {}
104 
105     struct EstimatedIndexInfo {
106         int64_t estimatedRows = 0;
107         double estimatedCost = 0.0;
108         bool isOrdered = false;
109     };
110 
111     static void DemoTableRegister(sqlite3& db,
112                                   TraceDataCache* cache,
113                                   const std::string& tableName,
114                                   TabTemplate tmplate);
DemoUpdate(int32_t argc,sqlite3_value ** argv,sqlite3_int64 * pRowid)115     virtual int32_t DemoUpdate(int32_t argc, sqlite3_value** argv, sqlite3_int64* pRowid)
116     {
117         return SQLITE_READONLY;
118     }
119     int32_t DemoBestIndex(sqlite3_index_info* idxInfo);
120     // needs to correspond to Cursor::DemoFilter()
DemoEstimateFilterCost(FilterConstraints & fc,EstimatedIndexInfo & ei)121     virtual void DemoEstimateFilterCost(FilterConstraints& fc, EstimatedIndexInfo& ei)
122     {
123         Unused(fc);
124         Unused(ei);
125     }
126     virtual std::unique_ptr<Cursor> CreateCursor() = 0;
127     int32_t DemoOpen(sqlite3_vtab_cursor** ppCursor);
DemoInit(int32_t,const char * const *)128     virtual void DemoInit(int32_t, const char* const*)
129     {
130         return;
131     };
132 
133 protected:
134     std::vector<ColumnInfo> demoTableColumn_ = {};
135     std::vector<std::string> demoTablePriKey_ = {};
136     const TraceDataCache* demoTraceDataCache_;
137     TraceDataCache* demoWdataCache_ = nullptr;
138     std::unique_ptr<Cursor> demoCursor_;
139 
140 private:
141     uint16_t demoBestIndexNum_ = 0;
142     int32_t demoCacheIdxNum_ = 0;
143     FilterConstraints demoCacheConstraint_;
144     std::string name_;
145 };
146 } // namespace TraceStreamer
147 } // namespace SysTuning
148 
149 #endif // TABLE_H
150