/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 * vim: sw=2 ts=2 et lcs=trail\:.,tab\:>~ :
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef __nsPlacesTables_h__
#define __nsPlacesTables_h__

#define CREATE_MOZ_PLACES NS_LITERAL_CSTRING( \
    "CREATE TABLE moz_places ( " \
    "  id INTEGER PRIMARY KEY" \
    ", url LONGVARCHAR" \
    ", title LONGVARCHAR" \
    ", rev_host LONGVARCHAR" \
    ", visit_count INTEGER DEFAULT 0" \
    ", hidden INTEGER DEFAULT 0 NOT NULL" \
    ", typed INTEGER DEFAULT 0 NOT NULL" \
    ", frecency INTEGER DEFAULT -1 NOT NULL" \
    ", last_visit_date INTEGER " \
    ", guid TEXT" \
    ", foreign_count INTEGER DEFAULT 0 NOT NULL" \
    ", url_hash INTEGER DEFAULT 0 NOT NULL " \
    ", description TEXT" \
    ", preview_image_url TEXT" \
    ", origin_id INTEGER REFERENCES moz_origins(id)" \
  ")" \
)

#define CREATE_MOZ_HISTORYVISITS NS_LITERAL_CSTRING( \
  "CREATE TABLE moz_historyvisits (" \
    "  id INTEGER PRIMARY KEY" \
    ", from_visit INTEGER" \
    ", place_id INTEGER" \
    ", visit_date INTEGER" \
    ", visit_type INTEGER" \
    ", session INTEGER" \
  ")" \
)

#define CREATE_MOZ_INPUTHISTORY NS_LITERAL_CSTRING( \
  "CREATE TABLE moz_inputhistory (" \
    "  place_id INTEGER NOT NULL" \
    ", input LONGVARCHAR NOT NULL" \
    ", use_count INTEGER" \
    ", PRIMARY KEY (place_id, input)" \
  ")" \
)

#define CREATE_MOZ_ANNOS NS_LITERAL_CSTRING( \
  "CREATE TABLE moz_annos (" \
    "  id INTEGER PRIMARY KEY" \
    ", place_id INTEGER NOT NULL" \
    ", anno_attribute_id INTEGER" \
    ", content LONGVARCHAR" \
    ", flags INTEGER DEFAULT 0" \
    ", expiration INTEGER DEFAULT 0" \
    ", type INTEGER DEFAULT 0" \
    ", dateAdded INTEGER DEFAULT 0" \
    ", lastModified INTEGER DEFAULT 0" \
  ")" \
)

#define CREATE_MOZ_ANNO_ATTRIBUTES NS_LITERAL_CSTRING( \
  "CREATE TABLE moz_anno_attributes (" \
    "  id INTEGER PRIMARY KEY" \
    ", name VARCHAR(32) UNIQUE NOT NULL" \
  ")" \
)

#define CREATE_MOZ_ITEMS_ANNOS NS_LITERAL_CSTRING( \
  "CREATE TABLE moz_items_annos (" \
    "  id INTEGER PRIMARY KEY" \
    ", item_id INTEGER NOT NULL" \
    ", anno_attribute_id INTEGER" \
    ", content LONGVARCHAR" \
    ", flags INTEGER DEFAULT 0" \
    ", expiration INTEGER DEFAULT 0" \
    ", type INTEGER DEFAULT 0" \
    ", dateAdded INTEGER DEFAULT 0" \
    ", lastModified INTEGER DEFAULT 0" \
  ")" \
)

#define CREATE_MOZ_BOOKMARKS NS_LITERAL_CSTRING( \
  "CREATE TABLE moz_bookmarks (" \
    "  id INTEGER PRIMARY KEY" \
    ", type INTEGER" \
    ", fk INTEGER DEFAULT NULL" /* place_id */ \
    ", parent INTEGER" \
    ", position INTEGER" \
    ", title LONGVARCHAR" \
    ", keyword_id INTEGER" \
    ", folder_type TEXT" \
    ", dateAdded INTEGER" \
    ", lastModified INTEGER" \
    ", guid TEXT" \
    /* The sync status is determined from the change source. We set this to
       SYNC_STATUS_NEW = 1 for new local bookmarks, and SYNC_STATUS_NORMAL = 2
       for bookmarks from other devices. Uploading a local bookmark for the
       first time changes its status to SYNC_STATUS_NORMAL. For bookmarks
       restored from a backup, we set SYNC_STATUS_UNKNOWN = 0, indicating that
       Sync should reconcile them with bookmarks on the server. If Sync is
       disconnected or never set up, all bookmarks will stay in SYNC_STATUS_NEW.
    */ \
    ", syncStatus INTEGER NOT NULL DEFAULT 0" \
    /* This field is incremented for every bookmark change that should trigger
       a sync. It's a counter instead of a Boolean so that we can track changes
       made during a sync, and queue them for the next sync. Changes made by
       Sync don't bump the counter, to avoid sync loops. If Sync is
       disconnected, we'll reset the counter to 1 for all bookmarks.
    */ \
    ", syncChangeCounter INTEGER NOT NULL DEFAULT 1" \
  ")" \
)

// This table stores tombstones for bookmarks with SYNC_STATUS_NORMAL. We
// upload tombstones during a sync, and delete them from this table on success.
// If Sync is disconnected, we'll delete all stored tombstones. If Sync is
// never set up, we'll never write new tombstones, since all bookmarks will stay
// in SYNC_STATUS_NEW.
#define CREATE_MOZ_BOOKMARKS_DELETED NS_LITERAL_CSTRING( \
  "CREATE TABLE moz_bookmarks_deleted (" \
    "  guid TEXT PRIMARY KEY" \
    ", dateRemoved INTEGER NOT NULL DEFAULT 0" \
  ")" \
)

#define CREATE_MOZ_KEYWORDS NS_LITERAL_CSTRING( \
  "CREATE TABLE moz_keywords (" \
    "  id INTEGER PRIMARY KEY AUTOINCREMENT" \
    ", keyword TEXT UNIQUE" \
    ", place_id INTEGER" \
    ", post_data TEXT" \
  ")" \
)

#define CREATE_MOZ_ORIGINS NS_LITERAL_CSTRING( \
  "CREATE TABLE moz_origins ( " \
    "id INTEGER PRIMARY KEY, " \
    "prefix TEXT NOT NULL, " \
    "host TEXT NOT NULL, " \
    "frecency INTEGER NOT NULL, " \
    "UNIQUE (prefix, host) " \
  ")" \
)

// Note: this should be kept up-to-date with the definition in
//       nsPlacesAutoComplete.js.
#define CREATE_MOZ_OPENPAGES_TEMP NS_LITERAL_CSTRING( \
  "CREATE TEMP TABLE moz_openpages_temp (" \
    "  url TEXT" \
    ", userContextId INTEGER" \
    ", open_count INTEGER" \
    ", PRIMARY KEY (url, userContextId)" \
  ")" \
)

// This table is used, along with moz_places_afterinsert_trigger, to update
// origins after places removals. During an INSERT into moz_places, origins are
// accumulated in this table, then a DELETE FROM moz_updateoriginsinsert_temp
// will take care of updating the moz_origins table for every new origin. See
// CREATE_PLACES_AFTERINSERT_TRIGGER in nsPlacestriggers.h for details.
#define CREATE_UPDATEORIGINSINSERT_TEMP NS_LITERAL_CSTRING( \
  "CREATE TEMP TABLE moz_updateoriginsinsert_temp ( " \
    "place_id INTEGER PRIMARY KEY, " \
    "prefix TEXT NOT NULL, " \
    "host TEXT NOT NULL, " \
    "frecency INTEGER NOT NULL " \
  ") " \
)

// This table is used in a similar way to moz_updateoriginsinsert_temp, but for
// deletes, and triggered via moz_places_afterdelete_trigger.
//
// When rows are added to this table, moz_places.origin_id may be null.  That's
// why this table uses prefix + host as its primary key, not origin_id.
#define CREATE_UPDATEORIGINSDELETE_TEMP NS_LITERAL_CSTRING( \
  "CREATE TEMP TABLE moz_updateoriginsdelete_temp ( " \
    "prefix TEXT NOT NULL, " \
    "host TEXT NOT NULL, " \
    "frecency_delta INTEGER NOT NULL, " \
    "PRIMARY KEY (prefix, host) " \
  ") WITHOUT ROWID " \
)

// This table is used in a similar way to moz_updateoriginsinsert_temp, but for
// updates to places' frecencies, and triggered via
// moz_places_afterupdate_frecency_trigger.
//
// When rows are added to this table, moz_places.origin_id may be null.  That's
// why this table uses prefix + host as its primary key, not origin_id.
#define CREATE_UPDATEORIGINSUPDATE_TEMP NS_LITERAL_CSTRING( \
  "CREATE TEMP TABLE moz_updateoriginsupdate_temp ( " \
    "prefix TEXT NOT NULL, " \
    "host TEXT NOT NULL, " \
    "frecency_delta INTEGER NOT NULL, " \
    "PRIMARY KEY (prefix, host) " \
  ") WITHOUT ROWID " \
)

// This table would not be strictly needed for functionality since it's just
// mimicking moz_places, though it's great for database portability.
// With this we don't have to take care into account a bunch of database
// mismatch cases, where places.sqlite could be mixed up with a favicons.sqlite
// created with a different places.sqlite (not just in case of a user messing
// up with the profile, but also in case of corruption).
#define CREATE_MOZ_PAGES_W_ICONS NS_LITERAL_CSTRING( \
  "CREATE TABLE moz_pages_w_icons ( " \
    "id INTEGER PRIMARY KEY, " \
    "page_url TEXT NOT NULL, " \
    "page_url_hash INTEGER NOT NULL " \
  ") " \
)

// This table retains the icons data. The hashes url is "fixed" (thus the scheme
// and www are trimmed in most cases) so we can quickly query for root icon urls
// like "domain/favicon.ico".
// We are considering squared icons for simplicity, so storing only one size.
// For svg payloads, width will be set to 65535 (UINT16_MAX).
#define CREATE_MOZ_ICONS NS_LITERAL_CSTRING( \
  "CREATE TABLE moz_icons ( " \
    "id INTEGER PRIMARY KEY, " \
    "icon_url TEXT NOT NULL, " \
    "fixed_icon_url_hash INTEGER NOT NULL, " \
    "width INTEGER NOT NULL DEFAULT 0, " \
    "root INTEGER NOT NULL DEFAULT 0, " \
    "color INTEGER, " \
    "expire_ms INTEGER NOT NULL DEFAULT 0, " \
    "data BLOB " \
  ") " \
)

// This table maintains relations between icons and pages.
// Each page can have multiple icons, and each icon can be used by multiple
// pages.
#define CREATE_MOZ_ICONS_TO_PAGES NS_LITERAL_CSTRING( \
  "CREATE TABLE moz_icons_to_pages ( " \
    "page_id INTEGER NOT NULL, " \
    "icon_id INTEGER NOT NULL, " \
    "PRIMARY KEY (page_id, icon_id), " \
    "FOREIGN KEY (page_id) REFERENCES moz_pages_w_icons ON DELETE CASCADE, " \
    "FOREIGN KEY (icon_id) REFERENCES moz_icons ON DELETE CASCADE " \
  ") WITHOUT ROWID " \
)

// This table holds key-value metadata for Places and its consumers. Sync stores
// the sync IDs for the bookmarks and history collections in this table, and the
// last sync time for history.
#define CREATE_MOZ_META NS_LITERAL_CSTRING( \
  "CREATE TABLE moz_meta (" \
    "key TEXT PRIMARY KEY, " \
    "value NOT NULL" \
  ") WITHOUT ROWID " \
)

// Keys in the moz_meta table.
#define MOZ_META_KEY_ORIGIN_FRECENCY_COUNT "origin_frecency_count"
#define MOZ_META_KEY_ORIGIN_FRECENCY_SUM "origin_frecency_sum"
#define MOZ_META_KEY_ORIGIN_FRECENCY_SUM_OF_SQUARES "origin_frecency_sum_of_squares"

#endif // __nsPlacesTables_h__
