Build trace processor lib on windows

Exposes trace_processor target for building from chrome checkout.
Also introduces several fixes to be able to build it on windows.

Bug: 133746356
Change-Id: Ic2e7cd20e2933393da3629986e6c80398a5395c0
diff --git a/BUILD.gn b/BUILD.gn
index 846d132..f42252e 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -47,6 +47,7 @@
   deps = [
     ":perfetto_unittests",
     "src/protozero/protoc_plugin($host_toolchain)",
+    "src/trace_processor:trace_processor",
   ]
   if (perfetto_build_standalone || perfetto_build_with_android) {
     deps += [
diff --git a/gn/BUILD.gn b/gn/BUILD.gn
index 7aa6d02..1fce079 100644
--- a/gn/BUILD.gn
+++ b/gn/BUILD.gn
@@ -88,6 +88,18 @@
   }
 }
 
+group("sqlite") {
+  if (perfetto_build_standalone || perfetto_build_with_android) {
+    public_deps = [
+      "//buildtools:sqlite",
+    ]
+  } else {
+    public_deps = [
+      "//third_party/sqlite:sqlite",
+    ]
+  }
+}
+
 # protoc compiler library, for building protoc plugins on the host.
 if (current_toolchain == host_toolchain) {
   group("protoc_lib_deps") {
diff --git a/include/perfetto/base/string_utils.h b/include/perfetto/base/string_utils.h
index d2f9a36..bec695b 100644
--- a/include/perfetto/base/string_utils.h
+++ b/include/perfetto/base/string_utils.h
@@ -26,6 +26,7 @@
 bool StartsWith(const std::string& str, const std::string& prefix);
 bool EndsWith(const std::string& str, const std::string& suffix);
 bool Contains(const std::string& haystack, const std::string& needle);
+bool CaseInsensitiveEqual(const std::string& first, const std::string& second);
 std::string Join(const std::vector<std::string>& parts,
                  const std::string& delim);
 std::vector<std::string> SplitString(const std::string& text,
diff --git a/src/base/string_utils.cc b/src/base/string_utils.cc
index 41df6b6..6616364 100644
--- a/src/base/string_utils.cc
+++ b/src/base/string_utils.cc
@@ -37,6 +37,12 @@
   return haystack.find(needle) != std::string::npos;
 }
 
+bool CaseInsensitiveEqual(const std::string& first, const std::string& second) {
+  return first.size() == second.size() &&
+         std::equal(first.begin(), first.end(), second.begin(),
+                    [](char a, char b) { return tolower(a) == tolower(b); });
+}
+
 std::string Join(const std::vector<std::string>& parts,
                  const std::string& delim) {
   std::string acc;
diff --git a/src/base/string_utils_unittest.cc b/src/base/string_utils_unittest.cc
index bed511f..ddaa5ce 100644
--- a/src/base/string_utils_unittest.cc
+++ b/src/base/string_utils_unittest.cc
@@ -47,6 +47,15 @@
   EXPECT_FALSE(EndsWith("", "c"));
 }
 
+TEST(StringUtilsTest, CaseInsensitiveEqual) {
+  EXPECT_TRUE(CaseInsensitiveEqual("", ""));
+  EXPECT_TRUE(CaseInsensitiveEqual("abc", "abc"));
+  EXPECT_TRUE(CaseInsensitiveEqual("ABC", "abc"));
+  EXPECT_TRUE(CaseInsensitiveEqual("abc", "ABC"));
+  EXPECT_FALSE(CaseInsensitiveEqual("abc", "AB"));
+  EXPECT_FALSE(CaseInsensitiveEqual("ab", "ABC"));
+}
+
 TEST(StringUtilsTest, SplitString) {
   EXPECT_THAT(SplitString("", ":"), ElementsAre(""));
   EXPECT_THAT(SplitString("a:b:c", ":"), ElementsAre("a", "b", "c"));
diff --git a/src/trace_processor/BUILD.gn b/src/trace_processor/BUILD.gn
index 6ef7285..e4fda49 100644
--- a/src/trace_processor/BUILD.gn
+++ b/src/trace_processor/BUILD.gn
@@ -16,21 +16,23 @@
 import("../../gn/perfetto.gni")
 import("../../gn/wasm.gni")
 
-wasm_lib("trace_processor_wasm") {
-  name = "trace_processor"
-  sources = [
-    "wasm_bridge.cc",
-  ]
+if (perfetto_build_standalone) {
+  wasm_lib("trace_processor_wasm") {
+    name = "trace_processor"
+    sources = [
+      "wasm_bridge.cc",
+    ]
 
-  # All the deps below are implicitly xxx($wasm_toolchain) because of the
-  # outer "is_wasm" block.
-  deps = [
-    ":lib",
-    "../../buildtools:sqlite",
-    "../../gn:default_deps",
-    "../../include/perfetto/base",
-    "../../protos/perfetto/trace_processor:lite",
-  ]
+    # All the deps below are implicitly xxx($wasm_toolchain) because of the
+    # outer "is_wasm" block.
+    deps = [
+      ":lib",
+      "../../buildtools:sqlite",
+      "../../gn:default_deps",
+      "../../include/perfetto/base",
+      "../../protos/perfetto/trace_processor:lite",
+    ]
+  }
 }
 
 # The library which eases processing of Perfetto traces by exposing reading
@@ -158,8 +160,8 @@
   ]
 
   deps = [
-    "../../buildtools:sqlite",
     "../../gn:default_deps",
+    "../../gn:sqlite",
     "../../include/perfetto/traced:sys_stats_counters",
     "../../protos/perfetto/common:zero",
     "../../protos/perfetto/config:zero",
@@ -268,9 +270,9 @@
   ]
   deps = [
     ":lib",
-    "../../buildtools:sqlite",
     "../../gn:default_deps",
     "../../gn:gtest_deps",
+    "../../gn:sqlite",
     "../../protos/perfetto/common:zero",
     "../../protos/perfetto/trace:zero",
     "../../protos/perfetto/trace/chrome:zero",
@@ -299,9 +301,9 @@
   ]
   deps = [
     ":lib",
-    "../../buildtools:sqlite",
     "../../gn:default_deps",
     "../../gn:gtest_deps",
+    "../../gn:sqlite",
     "../../protos/perfetto/trace:lite",
     "../../protos/perfetto/trace_processor:lite",
     "../base",
diff --git a/src/trace_processor/metrics/BUILD.gn b/src/trace_processor/metrics/BUILD.gn
index f0a7a2b..0b602a7 100644
--- a/src/trace_processor/metrics/BUILD.gn
+++ b/src/trace_processor/metrics/BUILD.gn
@@ -51,8 +51,8 @@
     "metrics.h",
   ]
   deps = [
-    "../../../buildtools:sqlite",
     "../../../gn:default_deps",
+    "../../../gn:sqlite",
     "../../../include/perfetto/trace_processor",
     "../../../protos/perfetto/common:zero",
     "../../../protos/perfetto/metrics:zero",
@@ -72,9 +72,9 @@
   ]
   deps = [
     ":lib",
-    "../../../buildtools:sqlite",
     "../../../gn:default_deps",
     "../../../gn:gtest_deps",
+    "../../../gn:sqlite",
     "../../../protos/perfetto/common:zero",
   ]
 }
diff --git a/src/trace_processor/metrics/metrics.h b/src/trace_processor/metrics/metrics.h
index cf41db9..e82820a 100644
--- a/src/trace_processor/metrics/metrics.h
+++ b/src/trace_processor/metrics/metrics.h
@@ -17,7 +17,6 @@
 #ifndef SRC_TRACE_PROCESSOR_METRICS_METRICS_H_
 #define SRC_TRACE_PROCESSOR_METRICS_METRICS_H_
 
-#include <sqlite3.h>
 #include <unordered_map>
 #include <vector>
 
@@ -28,6 +27,7 @@
 #include "perfetto/trace_processor/trace_processor.h"
 
 #include "src/trace_processor/metrics/descriptors.h"
+#include "src/trace_processor/sqlite.h"
 
 #include "perfetto/trace_processor/metrics_impl.pbzero.h"
 
diff --git a/src/trace_processor/query_constraints.cc b/src/trace_processor/query_constraints.cc
index 9092cb7..5d005e4 100644
--- a/src/trace_processor/query_constraints.cc
+++ b/src/trace_processor/query_constraints.cc
@@ -16,10 +16,10 @@
 
 #include "src/trace_processor/query_constraints.h"
 
-#include <sqlite3.h>
 #include <string>
 
 #include "perfetto/base/string_splitter.h"
+#include "src/trace_processor/sqlite.h"
 
 namespace perfetto {
 namespace trace_processor {
diff --git a/src/trace_processor/query_constraints.h b/src/trace_processor/query_constraints.h
index e9dc48b..2a708dd 100644
--- a/src/trace_processor/query_constraints.h
+++ b/src/trace_processor/query_constraints.h
@@ -17,11 +17,10 @@
 #ifndef SRC_TRACE_PROCESSOR_QUERY_CONSTRAINTS_H_
 #define SRC_TRACE_PROCESSOR_QUERY_CONSTRAINTS_H_
 
-#include <sqlite3.h>
-
 #include <vector>
 
 #include "perfetto/base/scoped_file.h"
+#include "src/trace_processor/sqlite.h"
 
 namespace perfetto {
 namespace trace_processor {
diff --git a/src/trace_processor/scoped_db.h b/src/trace_processor/scoped_db.h
index 7c1e44f..af7b61e 100644
--- a/src/trace_processor/scoped_db.h
+++ b/src/trace_processor/scoped_db.h
@@ -18,12 +18,13 @@
 #define SRC_TRACE_PROCESSOR_SCOPED_DB_H_
 
 #include "perfetto/base/scoped_file.h"
+#include "src/trace_processor/sqlite.h"
 
 extern "C" {
 struct sqlite3;
 struct sqlite3_stmt;
-extern int sqlite3_close(sqlite3*);
-extern int sqlite3_finalize(sqlite3_stmt* pStmt);
+SQLITE_API extern int sqlite3_close(sqlite3*);
+SQLITE_API extern int sqlite3_finalize(sqlite3_stmt* pStmt);
 }
 
 namespace perfetto {
diff --git a/src/trace_processor/slice_tracker.cc b/src/trace_processor/slice_tracker.cc
index caf8b24..b5c6558 100644
--- a/src/trace_processor/slice_tracker.cc
+++ b/src/trace_processor/slice_tracker.cc
@@ -29,7 +29,7 @@
 // Slices which have been opened but haven't been closed yet will be marked
 // with this duration placeholder.
 constexpr int64_t kPendingDuration = -1;
-};  // namespace
+}  // namespace
 
 SliceTracker::SliceTracker(TraceProcessorContext* context)
     : context_(context) {}
diff --git a/src/trace_processor/span_join_operator_table.cc b/src/trace_processor/span_join_operator_table.cc
index c5a7973..8b907f3 100644
--- a/src/trace_processor/span_join_operator_table.cc
+++ b/src/trace_processor/span_join_operator_table.cc
@@ -16,7 +16,6 @@
 
 #include "src/trace_processor/span_join_operator_table.h"
 
-#include <sqlite3.h>
 #include <string.h>
 #include <algorithm>
 #include <set>
@@ -26,6 +25,7 @@
 #include "perfetto/base/string_splitter.h"
 #include "perfetto/base/string_utils.h"
 #include "perfetto/base/string_view.h"
+#include "src/trace_processor/sqlite.h"
 #include "src/trace_processor/sqlite_utils.h"
 
 namespace perfetto {
@@ -710,7 +710,7 @@
   if (!splitter.Next())
     return util::OkStatus();
 
-  if (strcasecmp(splitter.cur_token(), "PARTITIONED") != 0)
+  if (!base::CaseInsensitiveEqual(splitter.cur_token(), "PARTITIONED"))
     return util::ErrStatus("SPAN_JOIN: Invalid token");
 
   if (!splitter.Next())
diff --git a/src/trace_processor/span_join_operator_table.h b/src/trace_processor/span_join_operator_table.h
index 27cc5db..d56043c 100644
--- a/src/trace_processor/span_join_operator_table.h
+++ b/src/trace_processor/span_join_operator_table.h
@@ -17,7 +17,6 @@
 #ifndef SRC_TRACE_PROCESSOR_SPAN_JOIN_OPERATOR_TABLE_H_
 #define SRC_TRACE_PROCESSOR_SPAN_JOIN_OPERATOR_TABLE_H_
 
-#include <sqlite3.h>
 #include <array>
 #include <deque>
 #include <limits>
@@ -29,6 +28,7 @@
 
 #include "perfetto/trace_processor/basic_types.h"
 #include "src/trace_processor/scoped_db.h"
+#include "src/trace_processor/sqlite.h"
 #include "src/trace_processor/table.h"
 
 namespace perfetto {
diff --git a/src/trace_processor/sql_stats_table.cc b/src/trace_processor/sql_stats_table.cc
index f81ac66..fdd2467 100644
--- a/src/trace_processor/sql_stats_table.cc
+++ b/src/trace_processor/sql_stats_table.cc
@@ -16,12 +16,11 @@
 
 #include "src/trace_processor/sql_stats_table.h"
 
-#include <sqlite3.h>
-
 #include <algorithm>
 #include <bitset>
 #include <numeric>
 
+#include "src/trace_processor/sqlite.h"
 #include "src/trace_processor/sqlite_utils.h"
 #include "src/trace_processor/trace_storage.h"
 
diff --git a/src/trace_processor/sqlite.h b/src/trace_processor/sqlite.h
new file mode 100644
index 0000000..09c66a9
--- /dev/null
+++ b/src/trace_processor/sqlite.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef SRC_TRACE_PROCESSOR_SQLITE_H_
+#define SRC_TRACE_PROCESSOR_SQLITE_H_
+
+#if PERFETTO_BUILDFLAG(PERFETTO_STANDALONE_BUILD) || \
+    PERFETTO_BUILDFLAG(PERFETTO_ANDROID_BUILD)
+#include <sqlite3.h>
+#else
+#include "third_party/sqlite/sqlite3.h"
+#endif
+
+#endif  // SRC_TRACE_PROCESSOR_SQLITE_H_
diff --git a/src/trace_processor/sqlite3_str_split_unittest.cc b/src/trace_processor/sqlite3_str_split_unittest.cc
index 4896f27..46f0f36 100644
--- a/src/trace_processor/sqlite3_str_split_unittest.cc
+++ b/src/trace_processor/sqlite3_str_split_unittest.cc
@@ -16,10 +16,10 @@
 
 #include "src/trace_processor/sqlite3_str_split.h"
 
-#include <sqlite3.h>
 #include <string>
 #include "perfetto/base/logging.h"
 #include "src/trace_processor/scoped_db.h"
+#include "src/trace_processor/sqlite.h"
 
 #include "gtest/gtest.h"
 
diff --git a/src/trace_processor/sqlite_utils.h b/src/trace_processor/sqlite_utils.h
index 5bd1e5f..0be5af1 100644
--- a/src/trace_processor/sqlite_utils.h
+++ b/src/trace_processor/sqlite_utils.h
@@ -18,7 +18,6 @@
 #define SRC_TRACE_PROCESSOR_SQLITE_UTILS_H_
 
 #include <math.h>
-#include <sqlite3.h>
 
 #include <functional>
 #include <limits>
@@ -27,6 +26,7 @@
 #include "perfetto/base/logging.h"
 #include "perfetto/base/optional.h"
 #include "src/trace_processor/scoped_db.h"
+#include "src/trace_processor/sqlite.h"
 #include "src/trace_processor/table.h"
 
 namespace perfetto {
diff --git a/src/trace_processor/string_table.cc b/src/trace_processor/string_table.cc
index 0007296..407b838 100644
--- a/src/trace_processor/string_table.cc
+++ b/src/trace_processor/string_table.cc
@@ -16,13 +16,13 @@
 
 #include "src/trace_processor/string_table.h"
 
-#include <sqlite3.h>
 #include <string.h>
 
 #include <algorithm>
 #include <bitset>
 #include <numeric>
 
+#include "src/trace_processor/sqlite.h"
 #include "src/trace_processor/sqlite_utils.h"
 #include "src/trace_processor/trace_storage.h"
 
diff --git a/src/trace_processor/table.h b/src/trace_processor/table.h
index 0405eb9..aea0a94 100644
--- a/src/trace_processor/table.h
+++ b/src/trace_processor/table.h
@@ -17,8 +17,6 @@
 #ifndef SRC_TRACE_PROCESSOR_TABLE_H_
 #define SRC_TRACE_PROCESSOR_TABLE_H_
 
-#include <sqlite3.h>
-
 #include <functional>
 #include <memory>
 #include <string>
@@ -27,6 +25,7 @@
 #include "perfetto/base/optional.h"
 #include "perfetto/trace_processor/basic_types.h"
 #include "src/trace_processor/query_constraints.h"
+#include "src/trace_processor/sqlite.h"
 
 namespace perfetto {
 namespace trace_processor {
diff --git a/src/trace_processor/trace_processor_impl.h b/src/trace_processor/trace_processor_impl.h
index ee2c055..6f20688 100644
--- a/src/trace_processor/trace_processor_impl.h
+++ b/src/trace_processor/trace_processor_impl.h
@@ -17,7 +17,6 @@
 #ifndef SRC_TRACE_PROCESSOR_TRACE_PROCESSOR_IMPL_H_
 #define SRC_TRACE_PROCESSOR_TRACE_PROCESSOR_IMPL_H_
 
-#include <sqlite3.h>
 #include <atomic>
 #include <functional>
 #include <memory>
@@ -29,6 +28,7 @@
 #include "src/trace_processor/metrics/descriptors.h"
 #include "src/trace_processor/metrics/metrics.h"
 #include "src/trace_processor/scoped_db.h"
+#include "src/trace_processor/sqlite.h"
 #include "src/trace_processor/trace_processor_context.h"
 
 namespace perfetto {