sql: Add support for measuring per-database memory usage.

Change-Id: I836b9412f915cdebeff46883c535b83026ed6472
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2463873
Reviewed-by: Mark Pearson <[email protected]>
Commit-Queue: Victor Costan <[email protected]>
Cr-Commit-Position: refs/heads/master@{#817189}
diff --git a/sql/database.cc b/sql/database.cc
index 01dd2b1b..db46be6 100644
--- a/sql/database.cc
+++ b/sql/database.cc
@@ -1401,6 +1401,33 @@
   return sqlite3_changes(db_);
 }
 
+int Database::GetMemoryUsage() {
+  if (!db_) {
+    DCHECK(poisoned_) << "Illegal use of Database without a db";
+    return 0;
+  }
+
+  int highwater_should_always_be_zero;
+  int cache_memory = 0, schema_memory = 0, statement_memory = 0;
+
+  int error =
+      sqlite3_db_status(db_, SQLITE_DBSTATUS_CACHE_USED, &cache_memory,
+                        &highwater_should_always_be_zero, /*resetFlg=*/false);
+  DCHECK_EQ(error, SQLITE_OK);
+
+  error =
+      sqlite3_db_status(db_, SQLITE_DBSTATUS_SCHEMA_USED, &schema_memory,
+                        &highwater_should_always_be_zero, /*resetFlg=*/false);
+  DCHECK_EQ(error, SQLITE_OK);
+
+  error =
+      sqlite3_db_status(db_, SQLITE_DBSTATUS_STMT_USED, &statement_memory,
+                        &highwater_should_always_be_zero, /*resetFlg=*/false);
+  DCHECK_EQ(error, SQLITE_OK);
+
+  return cache_memory + schema_memory + statement_memory;
+}
+
 int Database::GetErrorCode() const {
   if (!db_)
     return SQLITE_ERROR;