885ef70c58
This system tracks an abstract "api version" from nodes based on their usage, allowing us to have latching behavior where if a node ever uses a new api, it can be blocked from using the old api. This is better than using self-reported semver version information because the node cannot lie, there's no confusion about what semver version implies which features, no questions about dev and ci environments, and no dependencies between reporting the version and using the new api. Change-Id: Ifeced5c9ae8e0a16102d79635e176a7d3bdd8ed4
1347 lines
33 KiB
Plaintext
1347 lines
33 KiB
Plaintext
// dbx.v1 golang satellitedb.dbx .
|
|
|
|
//--- Value Attribution ---//
|
|
model value_attribution (
|
|
key project_id bucket_name
|
|
|
|
field project_id blob
|
|
field bucket_name blob
|
|
field partner_id blob
|
|
field last_updated timestamp ( autoinsert, autoupdate )
|
|
)
|
|
|
|
create value_attribution ()
|
|
delete value_attribution (
|
|
where value_attribution.project_id = ?
|
|
where value_attribution.bucket_name = ?
|
|
)
|
|
|
|
read one (
|
|
select value_attribution
|
|
where value_attribution.project_id = ?
|
|
where value_attribution.bucket_name = ?
|
|
)
|
|
|
|
//--- containment ---//
|
|
model pending_audits (
|
|
key node_id
|
|
|
|
field node_id blob
|
|
field piece_id blob
|
|
field stripe_index int64
|
|
field share_size int64
|
|
field expected_share_hash blob
|
|
field reverify_count int64 ( updatable )
|
|
field path blob
|
|
)
|
|
|
|
create pending_audits ( )
|
|
update pending_audits ( where pending_audits.node_id = ? )
|
|
delete pending_audits ( where pending_audits.node_id = ? )
|
|
read one (
|
|
select pending_audits
|
|
where pending_audits.node_id = ?
|
|
)
|
|
|
|
//--- irreparableDB ---//
|
|
|
|
model irreparabledb (
|
|
key segmentpath
|
|
|
|
field segmentpath blob
|
|
field segmentdetail blob ( updatable )
|
|
field pieces_lost_count int64 ( updatable )
|
|
field seg_damaged_unix_sec int64 ( updatable )
|
|
field repair_attempt_count int64 ( updatable )
|
|
)
|
|
|
|
create irreparabledb ( noreturn )
|
|
update irreparabledb (
|
|
where irreparabledb.segmentpath = ?
|
|
noreturn
|
|
)
|
|
delete irreparabledb ( where irreparabledb.segmentpath = ? )
|
|
|
|
read one (
|
|
select irreparabledb
|
|
where irreparabledb.segmentpath = ?
|
|
)
|
|
|
|
read limitoffset (
|
|
select irreparabledb
|
|
where irreparabledb.segmentpath > ?
|
|
orderby asc irreparabledb.segmentpath
|
|
)
|
|
|
|
//--- accounting ---//
|
|
|
|
// accounting_timestamps just allows us to save the last time/thing that happened
|
|
model accounting_timestamps (
|
|
key name
|
|
|
|
field name text
|
|
field value timestamp ( updatable )
|
|
)
|
|
|
|
create accounting_timestamps ( noreturn )
|
|
update accounting_timestamps (
|
|
where accounting_timestamps.name = ?
|
|
noreturn
|
|
)
|
|
|
|
read scalar (
|
|
select accounting_timestamps.value
|
|
where accounting_timestamps.name = ?
|
|
)
|
|
|
|
model accounting_rollup (
|
|
key id
|
|
|
|
index ( fields start_time )
|
|
|
|
field id serial64
|
|
field node_id blob
|
|
field start_time timestamp
|
|
field put_total int64
|
|
field get_total int64
|
|
field get_audit_total int64
|
|
field get_repair_total int64
|
|
field put_repair_total int64
|
|
field at_rest_total float64
|
|
)
|
|
|
|
create accounting_rollup ( noreturn )
|
|
delete accounting_rollup ( where accounting_rollup.id = ? )
|
|
|
|
read one (
|
|
select accounting_rollup
|
|
where accounting_rollup.id = ?
|
|
)
|
|
|
|
read all (
|
|
select accounting_rollup
|
|
where accounting_rollup.start_time >= ?
|
|
)
|
|
|
|
//--- overlay cache ---//
|
|
|
|
model node (
|
|
key id
|
|
|
|
index (
|
|
name node_last_ip
|
|
fields last_net
|
|
)
|
|
|
|
field id blob
|
|
// address is how to contact the node, this can be a hostname or IP and it contains the port
|
|
field address text ( updatable, default "" ) // TODO: use compressed format
|
|
// last_net is the /24 subnet of the IP
|
|
field last_net text ( updatable )
|
|
field last_ip_port text ( updatable, nullable )
|
|
field protocol int ( updatable, default 0 )
|
|
field type int ( updatable, default 0 )
|
|
field email text ( updatable )
|
|
field wallet text ( updatable ) // TODO: use compressed format
|
|
field free_disk int64 ( updatable, default -1 )
|
|
field piece_count int64 ( autoinsert, updatable, default 0 )
|
|
|
|
field major int64 ( updatable, default 0 )
|
|
field minor int64 ( updatable, default 0 )
|
|
field patch int64 ( updatable, default 0 )
|
|
field hash text ( updatable, default "" )
|
|
field timestamp timestamp ( updatable, default "0001-01-01 00:00:00+00" )
|
|
field release bool ( updatable, default false )
|
|
|
|
field latency_90 int64 ( updatable, default 0 )
|
|
field audit_success_count int64 ( updatable, default 0 )
|
|
field total_audit_count int64 ( updatable, default 0 )
|
|
field vetted_at timestamp ( updatable, nullable )
|
|
field uptime_success_count int64 ( updatable )
|
|
field total_uptime_count int64 ( updatable )
|
|
|
|
field created_at timestamp ( autoinsert, default current_timestamp )
|
|
field updated_at timestamp ( autoinsert, autoupdate, default current_timestamp )
|
|
field last_contact_success timestamp ( updatable, default "epoch" )
|
|
field last_contact_failure timestamp ( updatable, default "epoch" )
|
|
|
|
field contained bool ( updatable, default false )
|
|
// node is disqualified when it fails too many audits or is offline for too long
|
|
field disqualified timestamp ( updatable, nullable )
|
|
// node is placed under inspection when it has too many unknown-error audits
|
|
field suspended timestamp ( updatable, nullable )
|
|
// renamed column from suspended
|
|
field unknown_audit_suspended timestamp ( updatable, nullable )
|
|
// node is considered unhealthy if it is offline for too many audits
|
|
field offline_suspended timestamp ( updatable, nullable )
|
|
// once a node becomes offline_suspended, mark it as under review so we check it again later
|
|
field under_review timestamp ( updatable, nullable )
|
|
|
|
// audit_reputation_fields track information related to successful vs. failed error audits
|
|
field audit_reputation_alpha float64 ( updatable, default 1 )
|
|
field audit_reputation_beta float64 ( updatable, default 0 )
|
|
// unknown_audit_reputation fields track information related to successful vs. unknown error audits
|
|
field unknown_audit_reputation_alpha float64 ( updatable, default 1 )
|
|
field unknown_audit_reputation_beta float64 ( updatable, default 0 )
|
|
// TODO remove uptime alpha/beta once old uptime dq code is removed
|
|
field uptime_reputation_alpha float64 ( updatable, default 1 )
|
|
field uptime_reputation_beta float64 ( updatable, default 0 )
|
|
|
|
field exit_initiated_at timestamp ( updatable, nullable )
|
|
field exit_loop_completed_at timestamp ( updatable, nullable )
|
|
field exit_finished_at timestamp ( updatable, nullable )
|
|
field exit_success bool ( updatable, default false )
|
|
)
|
|
|
|
create node ( noreturn )
|
|
update node ( where node.id = ? )
|
|
update node (
|
|
where node.id = ?
|
|
noreturn
|
|
)
|
|
delete node ( where node.id = ? )
|
|
|
|
// "Get" query; fails if node not found
|
|
read one (
|
|
select node
|
|
where node.id = ?
|
|
)
|
|
|
|
read all (
|
|
select node.id
|
|
)
|
|
|
|
read limitoffset (
|
|
select node
|
|
where node.id >= ?
|
|
orderby asc node.id
|
|
)
|
|
|
|
read all (
|
|
select node.id node.piece_count
|
|
where node.piece_count != 0
|
|
)
|
|
|
|
read limitoffset (
|
|
select node.id node.address node.last_ip_port node.last_contact_success node.last_contact_failure
|
|
where node.last_contact_success < node.last_contact_failure
|
|
where node.disqualified = null
|
|
orderby asc node.last_contact_failure
|
|
)
|
|
|
|
read all (
|
|
select node.id node.address node.last_ip_port node.last_contact_success node.last_contact_failure
|
|
where node.last_contact_success < ?
|
|
where node.last_contact_success > node.last_contact_failure
|
|
where node.disqualified = null
|
|
orderby asc node.last_contact_success
|
|
)
|
|
|
|
//--- audit history ---//
|
|
model audit_history (
|
|
key node_id
|
|
field node_id blob
|
|
field history blob ( updatable )
|
|
)
|
|
create audit_history ()
|
|
update audit_history ( where audit_history.node_id = ? )
|
|
read one (
|
|
select audit_history
|
|
where audit_history.node_id = ?
|
|
)
|
|
|
|
//--- repairqueue ---//
|
|
|
|
model injuredsegment (
|
|
key path
|
|
|
|
field path blob
|
|
field data blob
|
|
field attempted timestamp (updatable, nullable)
|
|
field num_healthy_pieces int (default 52)
|
|
|
|
index (
|
|
fields attempted
|
|
)
|
|
|
|
index (
|
|
fields num_healthy_pieces
|
|
)
|
|
)
|
|
|
|
//--- satellite console ---//
|
|
|
|
model user (
|
|
key id
|
|
|
|
field id blob
|
|
field email text ( updatable )
|
|
field normalized_email text ( updatable )
|
|
field full_name text ( updatable )
|
|
field short_name text ( updatable, nullable )
|
|
field password_hash blob ( updatable )
|
|
|
|
field status int ( updatable, autoinsert )
|
|
field partner_id blob ( nullable )
|
|
field created_at timestamp ( autoinsert )
|
|
)
|
|
|
|
create user ( )
|
|
update user ( where user.id = ? )
|
|
delete user ( where user.id = ? )
|
|
|
|
read one (
|
|
select user
|
|
where user.normalized_email = ?
|
|
where user.status != 0
|
|
)
|
|
read one (
|
|
select user
|
|
where user.id = ?
|
|
)
|
|
|
|
model project (
|
|
key id
|
|
|
|
field id blob
|
|
|
|
field name text
|
|
field description text ( updatable )
|
|
field usage_limit int64 ( updatable, default 0 )
|
|
field bandwidth_limit int64 ( updatable, default 0 )
|
|
field rate_limit int ( nullable, updatable )
|
|
field partner_id blob ( nullable )
|
|
field owner_id blob
|
|
|
|
field created_at timestamp ( autoinsert )
|
|
)
|
|
|
|
create project ( )
|
|
update project ( where project.id = ? )
|
|
delete project ( where project.id = ? )
|
|
|
|
read one (
|
|
select project
|
|
where project.id = ?
|
|
)
|
|
read one (
|
|
select project.usage_limit
|
|
where project.id = ?
|
|
)
|
|
read one (
|
|
select project.bandwidth_limit
|
|
where project.id = ?
|
|
)
|
|
read all (
|
|
select project
|
|
)
|
|
read all (
|
|
select project
|
|
where project.created_at < ?
|
|
orderby asc project.created_at
|
|
)
|
|
read all (
|
|
select project
|
|
where project.owner_id = ?
|
|
orderby asc project.created_at
|
|
)
|
|
read all (
|
|
select project
|
|
join project.id = project_member.project_id
|
|
where project_member.member_id = ?
|
|
orderby asc project.name
|
|
)
|
|
|
|
read limitoffset (
|
|
select project
|
|
where project.created_at < ?
|
|
orderby asc project.created_at
|
|
)
|
|
|
|
model project_invoice_stamp (
|
|
key project_id start_date end_date
|
|
unique invoice_id
|
|
|
|
field project_id project.id cascade
|
|
field invoice_id blob
|
|
|
|
field start_date timestamp
|
|
field end_date timestamp
|
|
|
|
field created_at timestamp
|
|
)
|
|
|
|
create project_invoice_stamp ( )
|
|
|
|
read one (
|
|
select project_invoice_stamp
|
|
where project_invoice_stamp.project_id = ?
|
|
where project_invoice_stamp.start_date = ?
|
|
)
|
|
// pagination ?
|
|
read all (
|
|
select project_invoice_stamp
|
|
where project_invoice_stamp.project_id = ?
|
|
orderby desc project_invoice_stamp.start_date
|
|
)
|
|
|
|
model project_member (
|
|
key member_id project_id
|
|
|
|
field member_id user.id cascade
|
|
field project_id project.id cascade
|
|
|
|
field created_at timestamp ( autoinsert )
|
|
)
|
|
|
|
create project_member ( )
|
|
delete project_member (
|
|
where project_member.member_id = ?
|
|
where project_member.project_id = ?
|
|
)
|
|
|
|
read all (
|
|
select project_member
|
|
where project_member.member_id = ?
|
|
)
|
|
read limitoffset (
|
|
select project_member
|
|
where project_member.project_id = ?
|
|
)
|
|
|
|
model api_key (
|
|
key id
|
|
unique head
|
|
unique name project_id
|
|
|
|
field id blob
|
|
field project_id project.id cascade
|
|
field head blob
|
|
field name text (updatable)
|
|
field secret blob
|
|
field partner_id blob (nullable)
|
|
field created_at timestamp (autoinsert)
|
|
)
|
|
|
|
create api_key ( )
|
|
update api_key (
|
|
where api_key.id = ?
|
|
noreturn
|
|
)
|
|
delete api_key ( where api_key.id = ? )
|
|
|
|
read one (
|
|
select api_key
|
|
where api_key.id = ?
|
|
)
|
|
read one (
|
|
select api_key
|
|
where api_key.head = ?
|
|
)
|
|
read one (
|
|
select api_key
|
|
where api_key.name = ?
|
|
where api_key.project_id = ?
|
|
)
|
|
read all (
|
|
select api_key
|
|
where api_key.project_id = ?
|
|
orderby asc api_key.name
|
|
)
|
|
|
|
//--- tracking serial numbers ---//
|
|
|
|
model serial_number (
|
|
key id
|
|
index (
|
|
name serial_number_index
|
|
fields serial_number
|
|
unique
|
|
)
|
|
|
|
field id serial
|
|
field serial_number blob
|
|
|
|
field bucket_id blob
|
|
field expires_at timestamp
|
|
|
|
index (
|
|
fields expires_at
|
|
)
|
|
)
|
|
|
|
model used_serial (
|
|
key serial_number_id storage_node_id
|
|
|
|
field serial_number_id serial_number.id cascade
|
|
field storage_node_id blob
|
|
)
|
|
|
|
// inserting a new serial number
|
|
create serial_number ( noreturn )
|
|
|
|
// finding out information about the serial number
|
|
read scalar (
|
|
select serial_number
|
|
where serial_number.serial_number = ?
|
|
)
|
|
|
|
// deleting expired serial numbers
|
|
delete serial_number (
|
|
where serial_number.expires_at <= ?
|
|
)
|
|
|
|
// for preventing duplicate serial numbers
|
|
create used_serial ( noreturn )
|
|
|
|
//
|
|
// DEPRECATED! vvvvvvvvvvvvvvvvvvvvvvvvvvv
|
|
//
|
|
|
|
model reported_serial (
|
|
key expires_at storage_node_id bucket_id action serial_number
|
|
|
|
field expires_at timestamp // ceil'd to the next day
|
|
field storage_node_id blob // involved node id
|
|
field bucket_id blob // involved project id and bucket name
|
|
field action uint // action (get, put, audit, etc. see protobuf)
|
|
field serial_number blob // identifies order (required for uniqueness)
|
|
|
|
field settled uint64
|
|
field observed_at timestamp
|
|
)
|
|
|
|
//
|
|
// DEPRECATED! ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
//
|
|
|
|
model pending_serial_queue (
|
|
table pending_serial_queue
|
|
|
|
key storage_node_id bucket_id serial_number
|
|
field storage_node_id blob
|
|
field bucket_id blob
|
|
field serial_number blob
|
|
|
|
field action uint
|
|
field settled uint64
|
|
field expires_at timestamp
|
|
)
|
|
|
|
create pending_serial_queue ( noreturn, replace )
|
|
read paged ( select pending_serial_queue )
|
|
|
|
model consumed_serial (
|
|
key storage_node_id serial_number
|
|
index ( fields expires_at )
|
|
|
|
field storage_node_id blob
|
|
field serial_number blob
|
|
field expires_at timestamp
|
|
)
|
|
|
|
create consumed_serial ( noreturn )
|
|
delete consumed_serial ( where consumed_serial.expires_at <= ? )
|
|
|
|
read has (
|
|
select consumed_serial
|
|
where consumed_serial.storage_node_id = ?
|
|
where consumed_serial.serial_number = ?
|
|
)
|
|
|
|
// --- bucket accounting tables --- //
|
|
|
|
model bucket_bandwidth_rollup (
|
|
key bucket_name project_id interval_start action
|
|
index (
|
|
name bucket_bandwidth_rollups_project_id_action_interval_index
|
|
fields project_id action interval_start
|
|
)
|
|
index (
|
|
name bucket_bandwidth_rollups_action_interval_project_id_index
|
|
fields action interval_start project_id
|
|
)
|
|
|
|
field bucket_name blob
|
|
field project_id blob
|
|
|
|
field interval_start timestamp
|
|
field interval_seconds uint
|
|
field action uint
|
|
|
|
field inline uint64 ( updatable )
|
|
field allocated uint64 ( updatable )
|
|
field settled uint64 ( updatable )
|
|
)
|
|
|
|
read scalar (
|
|
select bucket_bandwidth_rollup
|
|
where bucket_bandwidth_rollup.bucket_name = ?
|
|
where bucket_bandwidth_rollup.project_id = ?
|
|
where bucket_bandwidth_rollup.interval_start = ?
|
|
where bucket_bandwidth_rollup.action = ?
|
|
)
|
|
|
|
model revocation (
|
|
key revoked
|
|
field revoked blob
|
|
field api_key_id blob
|
|
)
|
|
|
|
create revocation ( noreturn )
|
|
|
|
model project_bandwidth_rollup (
|
|
key project_id interval_month
|
|
|
|
field project_id blob
|
|
field interval_month date
|
|
field egress_allocated uint64 ( updatable )
|
|
)
|
|
|
|
read scalar (
|
|
select project_bandwidth_rollup
|
|
where project_bandwidth_rollup.project_id = ?
|
|
where project_bandwidth_rollup.interval_month = ?
|
|
)
|
|
|
|
model bucket_storage_tally (
|
|
key bucket_name project_id interval_start
|
|
|
|
field bucket_name blob
|
|
field project_id blob
|
|
|
|
field interval_start timestamp
|
|
|
|
field inline uint64
|
|
field remote uint64
|
|
|
|
field remote_segments_count uint
|
|
field inline_segments_count uint
|
|
field object_count uint
|
|
|
|
field metadata_size uint64
|
|
)
|
|
|
|
create bucket_storage_tally ( noreturn )
|
|
|
|
read first (
|
|
select bucket_storage_tally
|
|
where bucket_storage_tally.project_id = ?
|
|
orderby desc bucket_storage_tally.interval_start
|
|
)
|
|
|
|
read all (
|
|
select bucket_storage_tally
|
|
)
|
|
|
|
read all (
|
|
select bucket_storage_tally
|
|
where bucket_storage_tally.project_id = ?
|
|
where bucket_storage_tally.bucket_name = ?
|
|
where bucket_storage_tally.interval_start >= ?
|
|
where bucket_storage_tally.interval_start <= ?
|
|
orderby desc bucket_storage_tally.interval_start
|
|
)
|
|
|
|
// --- storage node accounting tables --- //
|
|
|
|
model storagenode_bandwidth_rollup (
|
|
key storagenode_id interval_start action
|
|
|
|
field storagenode_id blob
|
|
field interval_start timestamp
|
|
field interval_seconds uint
|
|
field action uint
|
|
|
|
field allocated uint64 ( updatable, nullable, default 0 )
|
|
field settled uint64 ( updatable )
|
|
)
|
|
|
|
read scalar (
|
|
select storagenode_bandwidth_rollup
|
|
where storagenode_bandwidth_rollup.storagenode_id = ?
|
|
where storagenode_bandwidth_rollup.interval_start = ?
|
|
where storagenode_bandwidth_rollup.action = ?
|
|
)
|
|
|
|
read all (
|
|
select storagenode_bandwidth_rollup
|
|
where storagenode_bandwidth_rollup.interval_start >= ?
|
|
)
|
|
|
|
model storagenode_storage_tally (
|
|
// this primary key will enforce uniqueness on interval_end_time,node_id
|
|
// and also creates an index on interval_end_time implicitly.
|
|
// the interval_end_time will be the same value for many rows so
|
|
// we put that first so we can use cockroachdb prefix compression.
|
|
// node_id is also used many times but interval_end_time is more
|
|
// repetative and will benefit greater.
|
|
key interval_end_time node_id
|
|
|
|
index ( fields node_id )
|
|
|
|
field node_id blob
|
|
field interval_end_time timestamp
|
|
field data_total float64
|
|
)
|
|
|
|
read all (
|
|
select storagenode_storage_tally
|
|
)
|
|
|
|
read all (
|
|
select storagenode_storage_tally
|
|
where storagenode_storage_tally.interval_end_time >= ?
|
|
)
|
|
|
|
// --- storage node payment tables --- //
|
|
|
|
model storagenode_paystub (
|
|
// The (period, node_id) tuple is the primary key. The primary key index
|
|
// should serve for quick queries for all paystubs in a given period since
|
|
// it comes first but efficient queries for all paystubs with a given
|
|
// node_id will require a distinct index.
|
|
|
|
key period node_id
|
|
|
|
index ( fields node_id )
|
|
|
|
field period text // YYYY-MM, e.g. 2020-02
|
|
field node_id blob //
|
|
field created_at timestamp ( autoinsert ) //
|
|
field codes text // colon separated list
|
|
|
|
field usage_at_rest float64 // byte-hours of data at rest
|
|
field usage_get int64 // bytes of bandwidth
|
|
field usage_put int64 // bytes of bandwidth
|
|
field usage_get_repair int64 // bytes of bandwidth
|
|
field usage_put_repair int64 // bytes of bandwidth
|
|
field usage_get_audit int64 // bytes of bandwidth
|
|
|
|
field comp_at_rest int64 // in micro-units of currency
|
|
field comp_get int64 // in micro-units of currency
|
|
field comp_put int64 // in micro-units of currency
|
|
field comp_get_repair int64 // in micro-units of currency
|
|
field comp_put_repair int64 // in micro-units of currency
|
|
field comp_get_audit int64 // in micro-units of currency
|
|
|
|
field surge_percent int64 // percentage
|
|
|
|
field held int64 // in micro-units of currency
|
|
field owed int64 // in micro-units of currency
|
|
field disposed int64 // in micro-units of currency
|
|
field paid int64 // in micro-units of currency
|
|
)
|
|
|
|
create storagenode_paystub ( noreturn )
|
|
|
|
model storagenode_payment (
|
|
key id
|
|
|
|
index ( fields node_id period )
|
|
|
|
field id serial64 //
|
|
field created_at timestamp ( autoinsert ) //
|
|
field node_id blob //
|
|
field period text // YYYY-MM, e.g. 2020-02
|
|
field amount int64 // in micro-units of currency
|
|
field receipt text ( nullable ) //
|
|
field notes text ( nullable ) //
|
|
)
|
|
|
|
create storagenode_payment ( noreturn )
|
|
|
|
//--- peer_identity ---//
|
|
|
|
model peer_identity (
|
|
key node_id
|
|
|
|
field node_id blob
|
|
field leaf_serial_number blob (updatable)
|
|
field chain blob (updatable) // x509 ASN.1 DER content
|
|
field updated_at timestamp ( autoinsert, autoupdate )
|
|
)
|
|
|
|
create peer_identity ( noreturn )
|
|
update peer_identity (
|
|
where peer_identity.node_id = ?
|
|
noreturn
|
|
)
|
|
|
|
read one (
|
|
select peer_identity
|
|
where peer_identity.node_id = ?
|
|
)
|
|
read one (
|
|
select peer_identity.leaf_serial_number
|
|
where peer_identity.node_id = ?
|
|
)
|
|
|
|
//--- satellite registration token for Vanguard release (temporary table) ---//
|
|
|
|
model registration_token (
|
|
key secret
|
|
unique owner_id
|
|
|
|
field secret blob
|
|
field owner_id blob ( updatable, nullable )
|
|
|
|
field project_limit int
|
|
|
|
field created_at timestamp ( autoinsert )
|
|
)
|
|
|
|
create registration_token ( )
|
|
read one (
|
|
select registration_token
|
|
where registration_token.secret = ?
|
|
)
|
|
read one (
|
|
select registration_token
|
|
where registration_token.owner_id = ?
|
|
)
|
|
update registration_token ( where registration_token.secret = ? )
|
|
|
|
//--- satellite reset password token ---//
|
|
|
|
model reset_password_token (
|
|
key secret
|
|
unique owner_id
|
|
|
|
field secret blob
|
|
field owner_id blob ( updatable )
|
|
|
|
field created_at timestamp ( autoinsert )
|
|
)
|
|
|
|
create reset_password_token ( )
|
|
read one (
|
|
select reset_password_token
|
|
where reset_password_token.secret = ?
|
|
)
|
|
read one (
|
|
select reset_password_token
|
|
where reset_password_token.owner_id = ?
|
|
)
|
|
delete reset_password_token ( where reset_password_token.secret = ? )
|
|
|
|
|
|
//--- offer table ---//
|
|
|
|
model offer (
|
|
key id
|
|
|
|
field id serial
|
|
field name text ( updatable )
|
|
field description text ( updatable )
|
|
|
|
field award_credit_in_cents int ( updatable, default 0 )
|
|
field invitee_credit_in_cents int ( updatable, default 0 )
|
|
|
|
field award_credit_duration_days int ( updatable, nullable )
|
|
field invitee_credit_duration_days int ( updatable, nullable )
|
|
|
|
field redeemable_cap int ( updatable, nullable )
|
|
|
|
field expires_at timestamp ( updatable )
|
|
field created_at timestamp ( autoinsert )
|
|
|
|
// status corresponds to the values of rewards.OfferStatus
|
|
field status int ( updatable )
|
|
// type corresponds to the values of rewards.OfferType
|
|
field type int ( updatable )
|
|
)
|
|
|
|
read one (
|
|
select offer
|
|
where offer.id = ?
|
|
)
|
|
|
|
read all (
|
|
select offer
|
|
orderby asc offer.id
|
|
)
|
|
|
|
update offer (
|
|
where offer.id = ?
|
|
noreturn
|
|
)
|
|
|
|
create offer ( )
|
|
|
|
|
|
//--- user credit table ---//
|
|
|
|
model user_credit (
|
|
key id
|
|
unique id offer_id
|
|
index (
|
|
name credits_earned_user_id_offer_id
|
|
fields id offer_id
|
|
unique
|
|
)
|
|
|
|
field id serial
|
|
|
|
field user_id user.id cascade
|
|
field offer_id offer.id restrict
|
|
field referred_by user.id setnull ( nullable )
|
|
field type text
|
|
|
|
field credits_earned_in_cents int
|
|
field credits_used_in_cents int ( updatable, autoinsert )
|
|
|
|
field expires_at timestamp ( updatable )
|
|
field created_at timestamp ( autoinsert )
|
|
)
|
|
|
|
read all (
|
|
select user_credit
|
|
where user_credit.user_id = ?
|
|
where user_credit.expires_at > ?
|
|
where user_credit.credits_used_in_cents < user_credit.credits_earned_in_cents
|
|
orderby asc user_credit.expires_at
|
|
)
|
|
|
|
read count (
|
|
select user_credit
|
|
where user_credit.referred_by = ?
|
|
)
|
|
|
|
create user_credit ()
|
|
|
|
//--- metainfo buckets ---//
|
|
|
|
model bucket_metainfo (
|
|
key id
|
|
unique name project_id
|
|
|
|
field id blob
|
|
field project_id project.id restrict
|
|
field name blob
|
|
field partner_id blob (nullable, updatable)
|
|
|
|
field path_cipher int
|
|
|
|
field created_at timestamp ( autoinsert )
|
|
|
|
field default_segment_size int (updatable)
|
|
|
|
field default_encryption_cipher_suite int (updatable)
|
|
field default_encryption_block_size int (updatable)
|
|
|
|
field default_redundancy_algorithm int (updatable)
|
|
field default_redundancy_share_size int (updatable)
|
|
field default_redundancy_required_shares int (updatable)
|
|
field default_redundancy_repair_shares int (updatable)
|
|
field default_redundancy_optimal_shares int (updatable)
|
|
field default_redundancy_total_shares int (updatable)
|
|
)
|
|
|
|
create bucket_metainfo ()
|
|
update bucket_metainfo (
|
|
where bucket_metainfo.project_id = ?
|
|
where bucket_metainfo.name = ?
|
|
)
|
|
|
|
read one (
|
|
select bucket_metainfo
|
|
where bucket_metainfo.project_id = ?
|
|
where bucket_metainfo.name = ?
|
|
)
|
|
|
|
delete bucket_metainfo (
|
|
where bucket_metainfo.project_id = ?
|
|
where bucket_metainfo.name = ?
|
|
)
|
|
|
|
read limitoffset ( // Forward
|
|
select bucket_metainfo
|
|
where bucket_metainfo.project_id = ?
|
|
where bucket_metainfo.name >= ?
|
|
orderby asc bucket_metainfo.name
|
|
)
|
|
|
|
read limitoffset ( // After
|
|
select bucket_metainfo
|
|
where bucket_metainfo.project_id = ?
|
|
where bucket_metainfo.name > ?
|
|
orderby asc bucket_metainfo.name
|
|
)
|
|
|
|
//--- graceful exit progress ---//
|
|
|
|
model graceful_exit_progress (
|
|
table graceful_exit_progress
|
|
key node_id
|
|
|
|
field node_id blob
|
|
field bytes_transferred int64 ( updatable )
|
|
field pieces_transferred int64 ( autoinsert, updatable, default 0 )
|
|
field pieces_failed int64 ( autoinsert, updatable, default 0 )
|
|
field updated_at timestamp ( autoinsert, autoupdate )
|
|
)
|
|
|
|
create graceful_exit_progress ( noreturn )
|
|
update graceful_exit_progress (
|
|
where graceful_exit_progress.node_id = ?
|
|
noreturn
|
|
)
|
|
delete graceful_exit_progress ( where graceful_exit_progress.node_id = ? )
|
|
read one (
|
|
select graceful_exit_progress
|
|
where graceful_exit_progress.node_id = ?
|
|
)
|
|
|
|
//--- graceful exit transfer queue ---//
|
|
|
|
model graceful_exit_transfer_queue (
|
|
table graceful_exit_transfer_queue
|
|
key node_id path piece_num
|
|
|
|
field node_id blob
|
|
field path blob
|
|
field piece_num int
|
|
field root_piece_id blob ( nullable )
|
|
field durability_ratio float64 ( updatable )
|
|
field queued_at timestamp ( autoinsert )
|
|
field requested_at timestamp ( updatable, nullable )
|
|
field last_failed_at timestamp ( updatable, nullable )
|
|
field last_failed_code int ( updatable, nullable )
|
|
field failed_count int ( updatable, nullable )
|
|
field finished_at timestamp ( updatable, nullable )
|
|
field order_limit_send_count int ( updatable, default 0 )
|
|
)
|
|
|
|
create graceful_exit_transfer_queue ( noreturn )
|
|
update graceful_exit_transfer_queue (
|
|
where graceful_exit_transfer_queue.node_id = ?
|
|
where graceful_exit_transfer_queue.path = ?
|
|
where graceful_exit_transfer_queue.piece_num = ?
|
|
noreturn
|
|
)
|
|
delete graceful_exit_transfer_queue (
|
|
where graceful_exit_transfer_queue.node_id = ?
|
|
)
|
|
|
|
delete graceful_exit_transfer_queue (
|
|
where graceful_exit_transfer_queue.node_id = ?
|
|
where graceful_exit_transfer_queue.path = ?
|
|
where graceful_exit_transfer_queue.piece_num = ?
|
|
)
|
|
|
|
delete graceful_exit_transfer_queue (
|
|
where graceful_exit_transfer_queue.node_id = ?
|
|
where graceful_exit_transfer_queue.finished_at != null
|
|
)
|
|
|
|
read one (
|
|
select graceful_exit_transfer_queue
|
|
where graceful_exit_transfer_queue.node_id = ?
|
|
where graceful_exit_transfer_queue.path = ?
|
|
where graceful_exit_transfer_queue.piece_num = ?
|
|
)
|
|
|
|
//--- downtime tracking ---//
|
|
|
|
model nodes_offline_time (
|
|
key node_id tracked_at
|
|
|
|
index (
|
|
fields node_id
|
|
)
|
|
|
|
field node_id blob
|
|
field tracked_at timestamp
|
|
field seconds int
|
|
)
|
|
|
|
create nodes_offline_time ()
|
|
|
|
read all (
|
|
select nodes_offline_time
|
|
where nodes_offline_time.node_id = ?
|
|
where nodes_offline_time.tracked_at > ?
|
|
where nodes_offline_time.tracked_at <= ?
|
|
)
|
|
|
|
//--- satellite payments ---//
|
|
|
|
model stripe_customer (
|
|
key user_id
|
|
unique customer_id
|
|
|
|
field user_id blob
|
|
field customer_id text
|
|
field created_at timestamp ( autoinsert )
|
|
)
|
|
|
|
create stripe_customer ( )
|
|
|
|
read one (
|
|
select stripe_customer.customer_id
|
|
where stripe_customer.user_id = ?
|
|
)
|
|
read limitoffset (
|
|
select stripe_customer
|
|
where stripe_customer.created_at <= ?
|
|
orderby desc stripe_customer.created_at
|
|
)
|
|
|
|
model coinpayments_transaction (
|
|
key id
|
|
|
|
field id text
|
|
field user_id blob
|
|
field address text
|
|
field amount blob
|
|
field received blob ( updatable )
|
|
field status int ( updatable )
|
|
field key text
|
|
field timeout int
|
|
|
|
field created_at timestamp ( autoinsert )
|
|
)
|
|
|
|
create coinpayments_transaction ()
|
|
update coinpayments_transaction ( where coinpayments_transaction.id = ? )
|
|
|
|
read all (
|
|
select coinpayments_transaction
|
|
where coinpayments_transaction.user_id = ?
|
|
orderby desc coinpayments_transaction.created_at
|
|
)
|
|
read limitoffset (
|
|
select coinpayments_transaction
|
|
where coinpayments_transaction.created_at <= ?
|
|
where coinpayments_transaction.status = ?
|
|
orderby desc coinpayments_transaction.created_at
|
|
)
|
|
|
|
model stripecoinpayments_apply_balance_intent (
|
|
key tx_id
|
|
|
|
field tx_id coinpayments_transaction.id cascade
|
|
field state int ( updatable )
|
|
|
|
field created_at timestamp ( autoinsert )
|
|
)
|
|
|
|
create stripecoinpayments_apply_balance_intent ()
|
|
update stripecoinpayments_apply_balance_intent (
|
|
where stripecoinpayments_apply_balance_intent.tx_id = ?
|
|
)
|
|
delete stripecoinpayments_apply_balance_intent (
|
|
where stripecoinpayments_apply_balance_intent.tx_id = ?
|
|
)
|
|
|
|
model stripecoinpayments_invoice_project_record (
|
|
key id
|
|
|
|
unique project_id period_start period_end
|
|
|
|
field id blob
|
|
field project_id blob
|
|
field storage float64
|
|
field egress int64
|
|
field objects int64
|
|
field period_start timestamp
|
|
field period_end timestamp
|
|
field state int ( updatable )
|
|
|
|
field created_at timestamp ( autoinsert )
|
|
)
|
|
|
|
create stripecoinpayments_invoice_project_record ()
|
|
update stripecoinpayments_invoice_project_record (
|
|
where stripecoinpayments_invoice_project_record.id = ?
|
|
)
|
|
delete stripecoinpayments_invoice_project_record (
|
|
where stripecoinpayments_invoice_project_record.id = ?
|
|
)
|
|
|
|
read one (
|
|
select stripecoinpayments_invoice_project_record
|
|
where stripecoinpayments_invoice_project_record.project_id = ?
|
|
where stripecoinpayments_invoice_project_record.period_start = ?
|
|
where stripecoinpayments_invoice_project_record.period_end = ?
|
|
)
|
|
read limitoffset (
|
|
select stripecoinpayments_invoice_project_record
|
|
where stripecoinpayments_invoice_project_record.period_start = ?
|
|
where stripecoinpayments_invoice_project_record.period_end = ?
|
|
where stripecoinpayments_invoice_project_record.state = ?
|
|
)
|
|
|
|
model stripecoinpayments_tx_conversion_rate (
|
|
key tx_id
|
|
|
|
field tx_id text
|
|
field rate blob
|
|
|
|
field created_at timestamp ( autoinsert )
|
|
)
|
|
|
|
create stripecoinpayments_tx_conversion_rate ()
|
|
|
|
read one (
|
|
select stripecoinpayments_tx_conversion_rate
|
|
where stripecoinpayments_tx_conversion_rate.tx_id = ?
|
|
)
|
|
|
|
model coupon (
|
|
key id
|
|
|
|
field id blob
|
|
field user_id blob
|
|
field amount int64
|
|
field description text
|
|
field type int
|
|
field status int ( updatable )
|
|
field duration int64
|
|
|
|
field created_at timestamp ( autoinsert )
|
|
)
|
|
|
|
create coupon ()
|
|
update coupon (
|
|
where coupon.id = ?
|
|
)
|
|
delete coupon (
|
|
where coupon.id = ?
|
|
)
|
|
read one (
|
|
select coupon
|
|
where coupon.id = ?
|
|
)
|
|
read all (
|
|
select coupon
|
|
where coupon.user_id = ?
|
|
orderby desc coupon.created_at
|
|
)
|
|
read all (
|
|
select coupon
|
|
where coupon.user_id = ?
|
|
where coupon.status = ?
|
|
orderby desc coupon.created_at
|
|
)
|
|
read all (
|
|
select coupon
|
|
where coupon.status = ?
|
|
orderby desc coupon.created_at
|
|
)
|
|
read limitoffset (
|
|
select coupon
|
|
where coupon.created_at <= ?
|
|
where coupon.status = ?
|
|
orderby desc coupon.created_at
|
|
)
|
|
model coupon_usage (
|
|
key coupon_id period
|
|
|
|
field coupon_id blob
|
|
field amount int64
|
|
field status int ( updatable )
|
|
field period timestamp
|
|
)
|
|
create coupon_usage ()
|
|
read limitoffset (
|
|
select coupon_usage
|
|
where coupon_usage.period = ?
|
|
where coupon_usage.status = 0
|
|
)
|
|
update coupon_usage (
|
|
where coupon_usage.coupon_id = ?
|
|
where coupon_usage.period = ?
|
|
)
|
|
|
|
model credit (
|
|
key transaction_id
|
|
|
|
field user_id blob
|
|
field transaction_id text
|
|
field amount int64
|
|
|
|
field created_at timestamp ( autoinsert )
|
|
)
|
|
|
|
create credit ( )
|
|
|
|
read one (
|
|
select credit
|
|
where credit.transaction_id = ?
|
|
)
|
|
|
|
read all (
|
|
select credit
|
|
where credit.user_id = ?
|
|
orderby desc credit.created_at
|
|
)
|
|
|
|
read limitoffset (
|
|
select credit
|
|
where credit.user_id = ?
|
|
where credit.created_at <= ?
|
|
orderby desc credit.created_at
|
|
)
|
|
|
|
model credits_spending (
|
|
key id
|
|
|
|
field id blob
|
|
field user_id blob
|
|
field project_id blob
|
|
field amount int64
|
|
field status int ( updatable )
|
|
field period timestamp
|
|
|
|
field created_at timestamp ( autoinsert )
|
|
)
|
|
|
|
create credits_spending ( )
|
|
|
|
update credits_spending (
|
|
where credits_spending.id = ?
|
|
)
|
|
|
|
read all (
|
|
select credits_spending
|
|
where credits_spending.user_id = ?
|
|
orderby desc credits_spending.created_at
|
|
)
|
|
|
|
read limitoffset (
|
|
select credits_spending
|
|
where credits_spending.period = ?
|
|
where credits_spending.status = ?
|
|
)
|
|
|
|
// -- node api version -- //
|
|
|
|
model node_api_version (
|
|
key id
|
|
|
|
field id blob
|
|
field api_version int ( updatable )
|
|
|
|
field created_at timestamp ( autoinsert )
|
|
field updated_at timestamp ( autoinsert, autoupdate )
|
|
)
|
|
|
|
create node_api_version (
|
|
noreturn
|
|
replace
|
|
)
|
|
|
|
read has (
|
|
select node_api_version
|
|
where node_api_version.id = ?
|
|
where node_api_version.api_version >= ?
|
|
)
|
|
|
|
update node_api_version (
|
|
where node_api_version.id = ?
|
|
where node_api_version.api_version < ?
|
|
noreturn
|
|
)
|