Commit e9c5fa18 authored by Bruce Dawson's avatar Bruce Dawson Committed by Commit Bot

Move g_metas_columns[] definition to .cc file

g_metas_columns was defined in a header file. This means that every
translation unit that uses the array gets its own copy - in Windows
official builds this means that chrome.dll got two copies. Not a huge
deal (the actual string constants were probably shared), but worth
fixing. This change moves the array definition to a .cc file.

The reason these duplicate arrays don't cause linker errors is because
they are static, both from explicitly being tagged as such and because
const globals are implicitly static.

Change-Id: Id25f2a7fd27a4ffa3e292437892468346c2dc053
Reviewed-on: https://chromium-review.googlesource.com/571214
Commit-Queue: Bruce Dawson <brucedawson@chromium.org>
Reviewed-by: default avatarStanislav Chiknavaryan <stanisc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#486899}
parent a854d34e
......@@ -39,6 +39,61 @@ using std::string;
namespace syncer {
namespace syncable {
// Must be in exact same order as fields in entry_kernel.h.
const ColumnSpec g_metas_columns[] = {
//////////////////////////////////////
// int64s
{"metahandle", "bigint primary key ON CONFLICT FAIL"},
{"base_version", "bigint default " CHANGES_VERSION_STRING},
{"server_version", "bigint default 0"},
// This is the item ID that we store for the embedding application.
{"local_external_id", "bigint default 0"},
{"transaction_version", "bigint default 0"},
// These timestamps are kept in the same format as that of the
// protocol (ms since Unix epoch).
{"mtime", "bigint default 0"},
{"server_mtime", "bigint default 0"},
{"ctime", "bigint default 0"},
{"server_ctime", "bigint default 0"},
//////////////////////////////////////
// Ids
{"id", "varchar(255) default \"r\""},
{"parent_id", "varchar(255) default \"r\""},
{"server_parent_id", "varchar(255) default \"r\""},
//////////////////////////////////////
// bits
{"is_unsynced", "bit default 0"},
{"is_unapplied_update", "bit default 0"},
{"is_del", "bit default 0"},
{"is_dir", "bit default 0"},
{"server_is_dir", "bit default 0"},
{"server_is_del", "bit default 0"},
//////////////////////////////////////
// Strings
{"non_unique_name", "varchar"},
{"server_non_unique_name", "varchar(255)"},
{"unique_server_tag", "varchar"},
{"unique_client_tag", "varchar"},
{"unique_bookmark_tag", "varchar"},
//////////////////////////////////////
// Blobs (serialized protos).
{"specifics", "blob"},
{"server_specifics", "blob"},
{"base_server_specifics", "blob"},
//////////////////////////////////////
// Blobs (positions).
{"server_unique_position", "blob"},
{"unique_position", "blob"},
//////////////////////////////////////
// AttachmentMetadata is a proto that contains all the metadata associated
// with an entry's attachments. Each entry has only one AttachmentMetadata
// proto. We store a single proto per entry (as opposed to one for each
// attachment) because it simplifies the database schema and implementation
// of
// DirectoryBackingStore.
{"attachment_metadata", "blob"},
{"server_attachment_metadata", "blob"}};
// Increment this version whenever updating DB tables.
const int32_t kCurrentDBVersion = 91;
......@@ -205,6 +260,8 @@ void OnSqliteError(const base::Closure& catastrophic_error_handler,
string ComposeCreateTableColumnSpecs() {
const ColumnSpec* begin = g_metas_columns;
const ColumnSpec* end = g_metas_columns + arraysize(g_metas_columns);
// Verify that the array was fully initialized.
DCHECK(g_metas_columns[arraysize(g_metas_columns) - 1].name != nullptr);
string query;
query.reserve(kUpdateStatementBufferSize);
char separator = '(';
......
......@@ -174,6 +174,7 @@ enum AttachmentMetadataField {
enum {
ATTACHMENT_METADATA_FIELDS_COUNT =
ATTACHMENT_METADATA_FIELDS_END - ATTACHMENT_METADATA_FIELDS_BEGIN,
// If FIELD_COUNT is changed then g_metas_columns must be updated.
FIELD_COUNT = ATTACHMENT_METADATA_FIELDS_END - BEGIN_FIELDS,
// Past this point we have temporaries, stored in memory only.
BEGIN_TEMPS = ATTACHMENT_METADATA_FIELDS_END,
......
......@@ -17,67 +17,10 @@ struct ColumnSpec {
const char* spec;
};
// Must be in exact same order as fields in entry_kernel.h.
static const ColumnSpec g_metas_columns[] = {
//////////////////////////////////////
// int64s
{"metahandle", "bigint primary key ON CONFLICT FAIL"},
{"base_version", "bigint default " CHANGES_VERSION_STRING},
{"server_version", "bigint default 0"},
// This is the item ID that we store for the embedding application.
{"local_external_id", "bigint default 0"},
{"transaction_version", "bigint default 0"},
// These timestamps are kept in the same format as that of the
// protocol (ms since Unix epoch).
{"mtime", "bigint default 0"},
{"server_mtime", "bigint default 0"},
{"ctime", "bigint default 0"},
{"server_ctime", "bigint default 0"},
//////////////////////////////////////
// Ids
{"id", "varchar(255) default \"r\""},
{"parent_id", "varchar(255) default \"r\""},
{"server_parent_id", "varchar(255) default \"r\""},
//////////////////////////////////////
// bits
{"is_unsynced", "bit default 0"},
{"is_unapplied_update", "bit default 0"},
{"is_del", "bit default 0"},
{"is_dir", "bit default 0"},
{"server_is_dir", "bit default 0"},
{"server_is_del", "bit default 0"},
//////////////////////////////////////
// Strings
{"non_unique_name", "varchar"},
{"server_non_unique_name", "varchar(255)"},
{"unique_server_tag", "varchar"},
{"unique_client_tag", "varchar"},
{"unique_bookmark_tag", "varchar"},
//////////////////////////////////////
// Blobs (serialized protos).
{"specifics", "blob"},
{"server_specifics", "blob"},
{"base_server_specifics", "blob"},
//////////////////////////////////////
// Blobs (positions).
{"server_unique_position", "blob"},
{"unique_position", "blob"},
//////////////////////////////////////
// AttachmentMetadata is a proto that contains all the metadata associated
// with an entry's attachments. Each entry has only one AttachmentMetadata
// proto. We store a single proto per entry (as opposed to one for each
// attachment) because it simplifies the database schema and implementation
// of
// DirectoryBackingStore.
{"attachment_metadata", "blob"},
{"server_attachment_metadata", "blob"}};
// At least enforce that there are equal number of column names and fields.
static_assert(arraysize(g_metas_columns) >= FIELD_COUNT, "missing column name");
static_assert(arraysize(g_metas_columns) <= FIELD_COUNT, "extra column names");
extern const ColumnSpec g_metas_columns[FIELD_COUNT];
static inline const char* ColumnName(int field) {
DCHECK(field < BEGIN_TEMPS);
DCHECK(field >= 0 && field < BEGIN_TEMPS);
return g_metas_columns[field].name;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment