1 /*
2 * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved.
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 #include "wasm_func.h"
17 #include <deque>
18 #include "version.h"
19 #include "sdk_data_parser.h"
20 #include "sdk_plugin_data_parser.h"
21 #include "demo_table_base.h"
22 #include "trace_stdtype.h"
23 #include "ts_sdk_api.h"
24
25 namespace SysTuning {
26 namespace TraceStreamer {
27 DemoRpcServer g_demoWasmTraceStreamer;
28
29 extern "C" {
30 using QueryResultCallbackFunction = void (*)(const char *data, uint32_t len, int32_t finish, int32_t isConfig);
31 using TraceRangeCallbackFunction = void (*)(const char *data, uint32_t len);
32 QueryResultCallbackFunction g_reply;
33 TraceRangeCallbackFunction g_traceRange;
34 uint8_t *g_reqBuf;
35 uint32_t g_reqBufferSize;
36 uint8_t *g_traceRangeBuf;
37 uint32_t g_traceRangeSize;
38 uint8_t *g_pluginNameBuf;
39 uint32_t g_pluginNameSize;
40
QueryResultCallback(const std::string & jsonResult,int32_t finish,int32_t isConfig)41 void QueryResultCallback(const std::string &jsonResult, int32_t finish, int32_t isConfig)
42 {
43 g_reply(jsonResult.data(), jsonResult.size(), finish, isConfig);
44 }
TraceRangeCallback(const std::string & jsonResult)45 void TraceRangeCallback(const std::string &jsonResult)
46 {
47 g_traceRange(jsonResult.data(), jsonResult.size());
48 }
Init(QueryResultCallbackFunction queryResultCallbackFunction,uint32_t reqBufferSize)49 EMSCRIPTEN_KEEPALIVE uint8_t *Init(QueryResultCallbackFunction queryResultCallbackFunction, uint32_t reqBufferSize)
50 {
51 SetRpcServer(&g_demoWasmTraceStreamer);
52 SDKPluginIinitTableName();
53 g_demoWasmTraceStreamer.demoTs_->sdkDataParser_->CreateTableByJson();
54 g_reply = queryResultCallbackFunction;
55 g_reqBuf = new uint8_t[reqBufferSize];
56 g_reqBufferSize = reqBufferSize;
57 return g_reqBuf;
58 }
59
60 // Get PluginName
InitPluginName(uint32_t reqBufferSize)61 EMSCRIPTEN_KEEPALIVE uint8_t *InitPluginName(uint32_t reqBufferSize)
62 {
63 g_pluginNameBuf = new uint8_t[reqBufferSize];
64 g_pluginNameSize = reqBufferSize;
65 return g_pluginNameBuf;
66 }
67
68 // @deprecated recommand to use TraceStreamerGetPluginNameEx api
TraceStreamerInPluginName(const uint8_t * pluginName,int32_t len)69 EMSCRIPTEN_KEEPALIVE int32_t TraceStreamerInPluginName(const uint8_t *pluginName, int32_t len)
70 {
71 std::string pluginNameStr(reinterpret_cast<const char *>(pluginName), len);
72 g_demoWasmTraceStreamer.demoTs_->sdkDataParser_->GetPluginName(pluginNameStr);
73 return 0;
74 }
75
TraceStreamerGetPluginNameEx(int32_t pluginLen)76 EMSCRIPTEN_KEEPALIVE int32_t TraceStreamerGetPluginNameEx(int32_t pluginLen)
77 {
78 return g_demoWasmTraceStreamer.DemoWasmGetPluginNameWithCallback(g_pluginNameBuf, pluginLen);
79 }
80
InitTraceRange(TraceRangeCallbackFunction traceRangeCallbackFunction,uint32_t reqBufferSize)81 EMSCRIPTEN_KEEPALIVE uint8_t *InitTraceRange(TraceRangeCallbackFunction traceRangeCallbackFunction,
82 uint32_t reqBufferSize)
83 {
84 g_traceRange = traceRangeCallbackFunction;
85 g_traceRangeBuf = new uint8_t[reqBufferSize];
86 g_traceRangeSize = reqBufferSize;
87 return g_traceRangeBuf;
88 }
89
90 // The whole file is parsed, and the third party is notified by JS
TraceStreamer_In_ParseDataOver()91 EMSCRIPTEN_KEEPALIVE int32_t TraceStreamer_In_ParseDataOver()
92 {
93 MetaData *metaData = g_demoWasmTraceStreamer.demoTs_->GetMetaData();
94 metaData->InitMetaData();
95 metaData->SetParserToolVersion(SDK_VERSION);
96 metaData->SetParserToolPublishDateTime(SDK_PUBLISH_VERSION);
97 g_demoWasmTraceStreamer.demoTs_->sdkDataParser_->ParseDataOver(&TraceRangeCallback);
98 return 0;
99 }
100
101 // Get Json configuration interface
TraceStreamer_In_JsonConfig()102 EMSCRIPTEN_KEEPALIVE int32_t TraceStreamer_In_JsonConfig()
103 {
104 g_demoWasmTraceStreamer.demoTs_->sdkDataParser_->GetJsonConfig(&QueryResultCallback);
105 return 0;
106 }
107
TraceStreamerSqlOperate(const uint8_t * sql,int32_t sqlLen)108 EMSCRIPTEN_KEEPALIVE int32_t TraceStreamerSqlOperate(const uint8_t *sql, int32_t sqlLen)
109 {
110 if (g_demoWasmTraceStreamer.DemoSqlOperate(sql, sqlLen, nullptr)) {
111 return 0;
112 }
113 return -1;
114 }
TraceStreamerSqlOperateEx(int32_t sqlLen)115 EMSCRIPTEN_KEEPALIVE int32_t TraceStreamerSqlOperateEx(int32_t sqlLen)
116 {
117 if (g_demoWasmTraceStreamer.DemoSqlOperate(g_reqBuf, sqlLen, nullptr)) {
118 return 0;
119 }
120 return -1;
121 }
122
123 // JS calls third-party parsing interface
ParserData(int32_t len,int32_t componentId)124 EMSCRIPTEN_KEEPALIVE int32_t ParserData(int32_t len, int32_t componentId)
125 {
126 g_demoWasmTraceStreamer.demoTs_->sdkDataParser_->ParserData(g_reqBuf, len, componentId);
127 return 0;
128 }
129
130 // return the length of result, -1 while failed
TraceStreamerSqlQuery(const uint8_t * sql,int32_t sqlLen,uint8_t * out,int32_t outLen)131 EMSCRIPTEN_KEEPALIVE int32_t TraceStreamerSqlQuery(const uint8_t *sql, int32_t sqlLen, uint8_t *out, int32_t outLen)
132 {
133 return g_demoWasmTraceStreamer.DemoWasmSqlQuery(sql, sqlLen, out, outLen);
134 }
135 // return the length of result, -1 while failed
TraceStreamerSqlQueryEx(int32_t sqlLen)136 EMSCRIPTEN_KEEPALIVE int32_t TraceStreamerSqlQueryEx(int32_t sqlLen)
137 {
138 return g_demoWasmTraceStreamer.DemoWasmSqlQueryWithCallback(g_reqBuf, sqlLen, &QueryResultCallback);
139 }
140
141 } // extern "C"
142 } // namespace TraceStreamer
143 } // namespace SysTuning
144