work in progress

This commit is contained in:
Brion Vibber 2010-08-13 17:32:25 -07:00
parent 14414d5f00
commit 6dbeea566d
1 changed files with 78 additions and 26 deletions

View File

@ -1,8 +1,27 @@
<?php <?php
/* local and remote users have profiles */ /**
Some notes...
drupal docs don't list a bool type, but it might be nice to use rather than 'tinyint'
note however that we use bitfields and things as well in tinyints
decimal <-> numeric
timestamps... how to specify?
fulltext indexes?
got one or two things wanting a custom charset setting on a field?
foreign keys are kinda funky...
those specified in inline syntax (as all in the original .sql) are NEVER ENFORCED on mysql
those made with an explicit 'foreign key' WITHIN INNODB and IF there's a proper index, do get enforced
double-check what we've been doing on postgres?
*/
$schema['profile'] = array( $schema['profile'] = array(
'description' => 'local and remote users have profiles',
'fields' => array( 'fields' => array(
'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'),
'nickname' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'nickname or username'), 'nickname' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'nickname or username'),
@ -11,8 +30,8 @@ $schema['profile'] = array(
'homepage' => array('type' => 'varchar', 'length' => 255, 'description' => 'identifying URL'), 'homepage' => array('type' => 'varchar', 'length' => 255, 'description' => 'identifying URL'),
'bio' => array('type' => 'text', 'description' => 'descriptive biography'), 'bio' => array('type' => 'text', 'description' => 'descriptive biography'),
'location' => array('type' => 'varchar', 'length' => 255, 'description' => 'physical location'), 'location' => array('type' => 'varchar', 'length' => 255, 'description' => 'physical location'),
'lat' => array('type' => 'decimal', 'length' => '10,7', 'description' => 'latitude'), 'lat' => array('type' => 'numeric', 'precision' => 10, 'scale' => 7, 'description' => 'latitude'),
'lon' => array('type' => 'decimal', 'length => '10,7', 'description' => 'longitude'), 'lon' => array('type' => 'numeric', 'precision' => 10, 'scale' => 7, 'description' => 'longitude'),
'location_id' => array('type' => 'int', 'description' => 'location id if possible'), 'location_id' => array('type' => 'int', 'description' => 'location id if possible'),
'location_ns' => array('type' => 'int', 'description' => 'namespace for location'), 'location_ns' => array('type' => 'int', 'description' => 'namespace for location'),
@ -89,7 +108,7 @@ $schema['user'] = array(
'smsemail' => array('type' => 'varchar', 'length' => 255, 'description' => 'built from sms and carrier'), 'smsemail' => array('type' => 'varchar', 'length' => 255, 'description' => 'built from sms and carrier'),
'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'), 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'),
'autosubscribe' => array('type' => 'bool', 'default' => 0, 'description' => 'automatically subscribe to users who subscribe to us'), 'autosubscribe' => array('type' => 'bool', 'default' => 0, 'description' => 'automatically subscribe to users who subscribe to us'),
'urlshorteningservice' => array('type' => 'varchar', 'length' => 50, default 'ur1.ca' 'description' => 'service to use for auto-shortening URLs'), 'urlshorteningservice' => array('type' => 'varchar', 'length' => 50, 'default' => 'ur1.ca', 'description' => 'service to use for auto-shortening URLs'),
'inboxed' => array('type' => 'bool', 'default' => 0, 'description' => 'has an inbox been created for this user?'), 'inboxed' => array('type' => 'bool', 'default' => 0, 'description' => 'has an inbox been created for this user?'),
'design_id' => array('type' => 'int', 'description' => 'id of a design'), 'design_id' => array('type' => 'int', 'description' => 'id of a design'),
'viewdesigns' => array('type' => 'bool', 'default' => 1, 'description' => 'whether to view user-provided designs'), 'viewdesigns' => array('type' => 'bool', 'default' => 1, 'description' => 'whether to view user-provided designs'),
@ -339,7 +358,7 @@ $schema['oauth_application_user'] = array(
$schema['oid_associations'] = array( $schema['oid_associations'] = array(
'fields' => array( 'fields' => array(
'server_url' => array('type' => 'blob'), 'server_url' => array('type' => 'blob'),
'handle' => array('type' => 'varchar', 'length' => 255, character set latin1, 'handle' => array('type' => 'varchar', 'length' => 255), // character set latin1,
'secret' => array('type' => 'blob'), 'secret' => array('type' => 'blob'),
'issued' => array('type' => 'int'), 'issued' => array('type' => 'int'),
'lifetime' => array('type' => 'int'), 'lifetime' => array('type' => 'int'),
@ -362,7 +381,7 @@ $schema['oid_nonces'] = array(
$schema['confirm_address'] = array( $schema['confirm_address'] = array(
'fields' => array( 'fields' => array(
'code' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'good random code'), 'code' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'good random code'),
'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who requested confirmation' references user (id), 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who requested confirmation'),
'address' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'address (email, xmpp, SMS, etc.)'), 'address' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'address (email, xmpp, SMS, etc.)'),
'address_extra' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'carrier ID, for SMS'), 'address_extra' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'carrier ID, for SMS'),
'address_type' => array('type' => 'varchar', 'length' => 8, 'not null' => true, 'description' => 'address type ("email", "xmpp", "sms")'), 'address_type' => array('type' => 'varchar', 'length' => 8, 'not null' => true, 'description' => 'address type ("email", "xmpp", "sms")'),
@ -371,22 +390,28 @@ $schema['confirm_address'] = array(
'modified' => array('type' => 'timestamp', 'description' => 'date this record was modified'), 'modified' => array('type' => 'timestamp', 'description' => 'date this record was modified'),
), ),
'primary key' => array('code'), 'primary key' => array('code'),
'foreign keys' => array(
'user_id' => array('user' => 'id'),
),
); );
$schema['remember_me'] = array( $schema['remember_me'] = array(
'fields' => array( 'fields' => array(
'code' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'good random code'), 'code' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'good random code'),
'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who is logged in' references user (id), 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who is logged in'),
'modified' => array('type' => 'timestamp', 'description' => 'date this record was modified', 'modified' => array('type' => 'timestamp', 'description' => 'date this record was modified'),
), ),
'primary key' => array('code'), 'primary key' => array('code'),
'foreign keys' => array(
'user_id' => array('user' => 'id'),
),
); );
$schema['queue_item'] = array( $schema['queue_item'] = array(
'fields' => array( 'fields' => array(
'id' => array('type' => 'serial', 'description' => 'unique identifier'), 'id' => array('type' => 'serial', 'description' => 'unique identifier'),
'frame' => array('type' => 'blob', 'not null' => true, 'description' => 'data: object reference or opaque string'), 'frame' => array('type' => 'blob', 'not null' => true, 'description' => 'data: object reference or opaque string'),
'transport' => array('type' => 'varchar', 'length' => 8, 'not null' => true, 'description' => 'queue for what? "email", "xmpp", "sms", "irc", ...'), 'transport' => array('type' => 'varchar', 'length' => 8, 'not null' => true, 'description' => 'queue for what? "email", "xmpp", "sms", "irc", ...'), // @fixme 8 chars is too short; bump up.
'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
'claimed' => array('type' => 'datetime', 'description' => 'date this item was claimed'), 'claimed' => array('type' => 'datetime', 'description' => 'date this item was claimed'),
), ),
@ -396,14 +421,17 @@ $schema['queue_item'] = array(
), ),
); );
/* Hash tags */
$schema['notice_tag'] = array( $schema['notice_tag'] = array(
'description' => 'Hash tags',
'fields' => array( 'fields' => array(
'tag' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'hash tag associated with this notice'), 'tag' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'hash tag associated with this notice'),
'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice tagged' references notice (id), 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice tagged'),
'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
), ),
'primary key' => array('tag', 'notice_id'), 'primary key' => array('tag', 'notice_id'),
'foreign keys' => array(
'notice_id' => array('notice' => 'id'),
),
'indexes' => array( 'indexes' => array(
'notice_tag_created_idx' => array('created'), 'notice_tag_created_idx' => array('created'),
'notice_tag_notice_id_idx' => array('notice_id'), 'notice_tag_notice_id_idx' => array('notice_id'),
@ -429,13 +457,16 @@ $schema['foreign_service'] = array(
$schema['foreign_user'] = array( $schema['foreign_user'] = array(
'fields' => array( 'fields' => array(
'id' => array('type' => 'bigint', 'not null' => true, 'description' => 'unique numeric key on foreign service'), 'id' => array('type' => 'bigint', 'not null' => true, 'description' => 'unique numeric key on foreign service'),
'service' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to service' references foreign_service(id), 'service' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to service'),
'uri' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'identifying URI'), 'uri' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'identifying URI'),
'nickname' => array('type' => 'varchar', 'length' => 255, 'description' => 'nickname on foreign service'), 'nickname' => array('type' => 'varchar', 'length' => 255, 'description' => 'nickname on foreign service'),
'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
'modified' => array('type' => 'timestamp', 'description' => 'date this record was modified'), 'modified' => array('type' => 'timestamp', 'description' => 'date this record was modified'),
), ),
'primary key' => array('id', 'service'), 'primary key' => array('id', 'service'),
'foreign keys' => array(
'service' => array('foreign_service' => 'id'),
),
'unique keys' => array( 'unique keys' => array(
'foreign_user_uri_idx' => 'uri', 'foreign_user_uri_idx' => 'uri',
), ),
@ -443,9 +474,9 @@ $schema['foreign_user'] = array(
$schema['foreign_link'] = array( $schema['foreign_link'] = array(
'fields' => array( 'fields' => array(
'user_id' => array('type' => 'int', 'description' => 'link to user on this system, if exists' references user (id), 'user_id' => array('type' => 'int', 'description' => 'link to user on this system, if exists'),
'foreign_id' => array('type' => 'int', 'size' => 'big', 'unsigned' => true, 'description' => 'link to user on foreign service, if exists' references foreign_user(id), 'foreign_id' => array('type' => 'int', 'size' => 'big', 'unsigned' => true, 'description' => 'link to user on foreign service, if exists' references foreign_user(id),
'service' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to service' references foreign_service(id), 'service' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to service'),
'credentials' => array('type' => 'varchar', 'length' => 255, 'description' => 'authc credentials, typically a password'), 'credentials' => array('type' => 'varchar', 'length' => 255, 'description' => 'authc credentials, typically a password'),
'noticesync' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 1, 'description' => 'notice synchronization, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies'), 'noticesync' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 1, 'description' => 'notice synchronization, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies'),
'friendsync' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 2 'description' => 'friend synchronization, bit 1 = sync outgoing, bit 2 = sync incoming'), 'friendsync' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 2 'description' => 'friend synchronization, bit 1 = sync outgoing, bit 2 = sync incoming'),
@ -456,6 +487,10 @@ $schema['foreign_link'] = array(
'modified' => array('type' => 'timestamp', 'description' => 'date this record was modified'), 'modified' => array('type' => 'timestamp', 'description' => 'date this record was modified'),
), ),
'primary key' => array('user_id', 'foreign_id', 'service'), 'primary key' => array('user_id', 'foreign_id', 'service'),
'foreign keys' => array(
'user_id' => array('user' => 'id'),
'service' => array('foreign_service' => 'id'),
),
'indexes' => array( 'indexes' => array(
'foreign_user_user_id_idx' => array('user_id'), 'foreign_user_user_id_idx' => array('user_id'),
), ),
@ -463,12 +498,17 @@ $schema['foreign_link'] = array(
$schema['foreign_subscription'] = array( $schema['foreign_subscription'] = array(
'fields' => array( 'fields' => array(
'service', 'type' => 'int', 'not null' => true, 'description' => 'service where relationship happens' references foreign_service(id), 'service', 'type' => 'int', 'not null' => true, 'description' => 'service where relationship happens'),
'subscriber', 'type' => 'int', 'not null' => true, 'description' => 'subscriber on foreign service' references foreign_user (id), 'subscriber', 'type' => 'int', 'not null' => true, 'description' => 'subscriber on foreign service'),
'subscribed', 'type' => 'int', 'not null' => true, 'description' => 'subscribed user' references foreign_user (id), 'subscribed', 'type' => 'int', 'not null' => true, 'description' => 'subscribed user'),
'created', 'type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'created', 'type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
), ),
'primary key' => array('service', 'subscriber', 'subscribed'), 'primary key' => array('service', 'subscriber', 'subscribed'),
'foreign keys' => array(
'service' => array('foreign_service' => 'id'),
'subscriber' => array('foreign_user' => 'id'),
'subscribed' => array('foreign_user' => 'id'),
),
'indexes' => array( 'indexes' => array(
'foreign_subscription_subscriber_idx' => array('subscriber'), 'foreign_subscription_subscriber_idx' => array('subscriber'),
'foreign_subscription_subscribed_idx' => array('subscribed'), 'foreign_subscription_subscribed_idx' => array('subscribed'),
@ -478,15 +518,18 @@ $schema['foreign_subscription'] = array(
$schema['invitation'] = array( $schema['invitation'] = array(
'fields' => array( 'fields' => array(
'code', 'type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'random code for an invitation'), 'code', 'type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'random code for an invitation'),
'user_id', 'type' => 'int', 'not null' => true, 'description' => 'who sent the invitation' references user (id), 'user_id', 'type' => 'int', 'not null' => true, 'description' => 'who sent the invitation',
'address', 'type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'invitation sent to'), 'address', 'type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'invitation sent to'),
'address_type', 'type' => 'varchar', 'length' => 8, 'not null' => true, 'description' => 'address type ("email", "xmpp", "sms")'), 'address_type', 'type' => 'varchar', 'length' => 8, 'not null' => true, 'description' => 'address type ("email", "xmpp", "sms")'),
'created', 'type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'created', 'type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
), ),
'primary key' => array('code'), 'primary key' => array('code'),
'foreign keys' => array(
'user_id' => array('user' => 'id'),
),
'indexes' => array( 'indexes' => array(
'invitation_address_idx' => ('address', 'address_type'), 'invitation_address_idx' => array('address', 'address_type'),
'invitation_user_id_idx' => ('user_id'), 'invitation_user_id_idx' => array('user_id'),
), ),
); );
@ -494,19 +537,23 @@ $schema['message'] = array(
'fields' => array( 'fields' => array(
'id' => array('type' => 'serial', 'description' => 'unique identifier'), 'id' => array('type' => 'serial', 'description' => 'unique identifier'),
'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier'), 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier'),
'from_profile' => array('type' => 'int', 'not null' => true, 'description' => 'who the message is from' references profile (id), 'from_profile' => array('type' => 'int', 'not null' => true, 'description' => 'who the message is from'),
'to_profile' => array('type' => 'int', 'not null' => true, 'description' => 'who the message is to' references profile (id), 'to_profile' => array('type' => 'int', 'not null' => true, 'description' => 'who the message is to'),
'content' => array('type' => 'text', 'description' => 'message content'), 'content' => array('type' => 'text', 'description' => 'message content'),
'rendered' => array('type' => 'text', 'description' => 'HTML version of the content'), 'rendered' => array('type' => 'text', 'description' => 'HTML version of the content'),
'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL of any attachment (image, video, bookmark, whatever)'), 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL of any attachment (image, video, bookmark, whatever)'),
'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
'modified' => array('type' => 'timestamp', 'description' => 'date this record was modified'), 'modified' => array('type' => 'timestamp', 'description' => 'date this record was modified'),
'source' => array('type' => 'varchar', 'length' => 32, 'description' => 'source of comment, like "web", "im", or "clientname"'), 'source' => array('type' => 'varchar', 'length' => 32, 'description' => 'source of comment, like "web", "im", or "clientname"'),
),
'primary key' => array('id'), 'primary key' => array('id'),
'unique key' => array( 'unique key' => array(
'message_uri_idx' => array('uri'), 'message_uri_idx' => array('uri'),
), ),
'foreign keys' => array(
'from_profile' => array('profile' => 'id'),
'to_profile' => array('profile' => 'id'),
),
'indexes' => array( 'indexes' => array(
// @fixme these are really terrible indexes, since you can only sort on one of them at a time. // @fixme these are really terrible indexes, since you can only sort on one of them at a time.
// looks like we really need a (to_profile, created) for inbox and a (from_profile, created) for outbox // looks like we really need a (to_profile, created) for inbox and a (from_profile, created) for outbox
@ -517,15 +564,20 @@ $schema['message'] = array(
); );
$schema['notice_inbox'] = array( $schema['notice_inbox'] = array(
'description' => 'Obsolete; old entries here are converted to packed entries in the inbox table since 0.9',
'fields' => array( 'fields' => array(
'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user receiving the message' references user (id), 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user receiving the message'),
'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice received' references notice (id), 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice received'),
'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date the notice was created'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date the notice was created'),
'source' => array('type' => 'bool', 'default' => 1, 'description' => 'reason it is in the inbox, 1=subscription'), 'source' => array('type' => 'bool', 'default' => 1, 'description' => 'reason it is in the inbox, 1=subscription'),
), ),
'primary key' => array('user_id', 'notice_id'), 'primary key' => array('user_id', 'notice_id'),
'foreign keys' => array(
'user_id' => array('user' => 'id'),
'notice_id' => array('notice' => 'id'),
),
'indexes' => array( 'indexes' => array(
'notice_inbox_notice_id_idx' => ('notice_id'), 'notice_inbox_notice_id_idx' => array('notice_id'),
), ),
); );