ljr/livejournal/bin/upgrading/update-db-general.pl

2579 lines
76 KiB
Perl
Executable File

#
# database schema & data info
#
mark_clustered(@LJ::USER_TABLES);
register_tablecreate("adopt", <<'EOC');
CREATE TABLE adopt (
adoptid int(10) unsigned NOT NULL auto_increment,
helperid int(10) unsigned NOT NULL default '0',
newbieid int(10) unsigned NOT NULL default '0',
changetime datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (adoptid),
KEY (helperid),
KEY (newbieid)
)
EOC
register_tablecreate("adoptlast", <<'EOC');
CREATE TABLE adoptlast (
userid int(10) unsigned NOT NULL default '0',
lastassigned datetime NOT NULL default '0000-00-00 00:00:00',
lastadopted datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (userid)
)
EOC
register_tablecreate("authactions", <<'EOC');
CREATE TABLE authactions (
aaid int(10) unsigned NOT NULL auto_increment,
userid int(10) unsigned NOT NULL default '0',
datecreate datetime NOT NULL default '0000-00-00 00:00:00',
authcode varchar(20) default NULL,
action varchar(50) default NULL,
arg1 varchar(255) default NULL,
PRIMARY KEY (aaid)
)
EOC
register_tablecreate("clients", <<'EOC');
CREATE TABLE clients (
clientid smallint(5) unsigned NOT NULL auto_increment,
client varchar(40) default NULL,
PRIMARY KEY (clientid),
KEY (client)
)
EOC
post_create("clients",
"sqltry" => "INSERT INTO clients (client) SELECT DISTINCT client FROM logins",
);
register_tablecreate("clientusage", <<'EOC');
CREATE TABLE clientusage (
userid int(10) unsigned NOT NULL default '0',
clientid smallint(5) unsigned NOT NULL default '0',
lastlogin datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (clientid,userid),
UNIQUE KEY userid (userid,clientid)
)
EOC
post_create("clientusage",
"sqltry" => "INSERT INTO clientusage SELECT u.userid, c.clientid, l.lastlogin FROM user u, clients c, logins l WHERE u.user=l.user AND l.client=c.client",
);
register_tablecreate("codes", <<'EOC');
CREATE TABLE codes (
type varchar(10) NOT NULL default '',
code varchar(7) NOT NULL default '',
item varchar(80) default NULL,
sortorder smallint(6) NOT NULL default '0',
PRIMARY KEY (type,code)
) PACK_KEYS=1
EOC
register_tablecreate("community", <<'EOC');
CREATE TABLE community (
userid int(10) unsigned NOT NULL default '0',
ownerid int(10) unsigned NOT NULL default '0',
membership enum('open','closed') NOT NULL default 'open',
postlevel enum('members','select','screened') default NULL,
PRIMARY KEY (userid)
)
EOC
register_tablecreate("dirsearchres2", <<'EOC');
CREATE TABLE dirsearchres2 (
qdigest varchar(32) NOT NULL default '',
dateins datetime NOT NULL default '0000-00-00 00:00:00',
userids blob,
PRIMARY KEY (qdigest),
KEY (dateins)
)
EOC
register_tablecreate("duplock", <<'EOC');
CREATE TABLE duplock (
realm enum('support','log','comment') NOT NULL default 'support',
reid int(10) unsigned NOT NULL default '0',
userid int(10) unsigned NOT NULL default '0',
digest char(32) NOT NULL default '',
dupid int(10) unsigned NOT NULL default '0',
instime datetime NOT NULL default '0000-00-00 00:00:00',
KEY (realm,reid,userid)
)
EOC
register_tablecreate("faq", <<'EOC');
CREATE TABLE faq (
faqid mediumint(8) unsigned NOT NULL auto_increment,
question text,
answer text,
sortorder int(11) default NULL,
faqcat varchar(20) default NULL,
lastmodtime datetime default NULL,
lastmoduserid int(10) unsigned NOT NULL default '0',
PRIMARY KEY (faqid)
)
EOC
register_tablecreate("faqcat", <<'EOC');
CREATE TABLE faqcat (
faqcat varchar(20) NOT NULL default '',
faqcatname varchar(100) default NULL,
catorder int(11) default '50',
PRIMARY KEY (faqcat)
)
EOC
register_tablecreate("faquses", <<'EOC');
CREATE TABLE faquses (
faqid MEDIUMINT UNSIGNED NOT NULL,
userid INT UNSIGNED NOT NULL,
dateview DATETIME NOT NULL,
PRIMARY KEY (userid, faqid),
KEY (faqid),
KEY (dateview)
)
EOC
register_tablecreate("friendgroup", <<'EOC');
CREATE TABLE friendgroup (
userid int(10) unsigned NOT NULL default '0',
groupnum tinyint(3) unsigned NOT NULL default '0',
groupname varchar(30) NOT NULL default '',
sortorder tinyint(3) unsigned NOT NULL default '50',
is_public enum('0','1') NOT NULL default '0',
PRIMARY KEY (userid,groupnum)
)
EOC
register_tablecreate("friends", <<'EOC');
CREATE TABLE friends (
userid int(10) unsigned NOT NULL default '0',
friendid int(10) unsigned NOT NULL default '0',
fgcolor char(7) default NULL,
bgcolor char(7) default NULL,
groupmask int(10) unsigned NOT NULL default '1',
showbydefault enum('1','0') NOT NULL default '1',
PRIMARY KEY (userid,friendid),
KEY (friendid)
)
EOC
register_tablecreate("interests", <<'EOC');
CREATE TABLE interests (
intid int(10) unsigned NOT NULL auto_increment,
interest varchar(255) NOT NULL default '',
intcount mediumint(8) unsigned default NULL,
PRIMARY KEY (intid),
UNIQUE interest (interest)
)
EOC
register_tablecreate("keywords", <<'EOC');
CREATE TABLE keywords (
kwid int(10) unsigned NOT NULL auto_increment,
keyword varchar(80) binary NOT NULL default '',
PRIMARY KEY (kwid),
UNIQUE KEY kwidx (keyword)
)
EOC
register_tablecreate("logproplist", <<'EOC');
CREATE TABLE logproplist (
propid tinyint(3) unsigned NOT NULL auto_increment,
name varchar(50) default NULL,
prettyname varchar(60) default NULL,
sortorder mediumint(8) unsigned default NULL,
datatype enum('char','num','bool') NOT NULL default 'char',
des varchar(255) default NULL,
PRIMARY KEY (propid),
UNIQUE KEY name (name)
)
EOC
register_tablecreate("memkeyword", <<'EOC');
CREATE TABLE memkeyword (
memid int(10) unsigned NOT NULL default '0',
kwid int(10) unsigned NOT NULL default '0',
PRIMARY KEY (memid,kwid)
)
EOC
register_tablecreate("memorable", <<'EOC');
CREATE TABLE memorable (
memid int(10) unsigned NOT NULL auto_increment,
userid int(10) unsigned NOT NULL default '0',
itemid int(10) unsigned NOT NULL default '0',
des varchar(60) default NULL,
security enum('public','friends','private') NOT NULL default 'public',
PRIMARY KEY (memid),
UNIQUE KEY userid (userid,itemid),
KEY (itemid)
)
EOC
register_tablecreate("moods", <<'EOC');
CREATE TABLE moods (
moodid int(10) unsigned NOT NULL auto_increment,
mood varchar(40) default NULL,
parentmood int(10) unsigned NOT NULL default '0',
PRIMARY KEY (moodid),
UNIQUE KEY mood (mood)
)
EOC
register_tablecreate("moodthemedata", <<'EOC');
CREATE TABLE moodthemedata (
moodthemeid int(10) unsigned NOT NULL default '0',
moodid int(10) unsigned NOT NULL default '0',
picurl varchar(100) default NULL,
width tinyint(3) unsigned NOT NULL default '0',
height tinyint(3) unsigned NOT NULL default '0',
KEY (moodthemeid),
PRIMARY KEY (moodthemeid,moodid)
)
EOC
register_tablecreate("moodthemes", <<'EOC');
CREATE TABLE moodthemes (
moodthemeid int(10) unsigned NOT NULL auto_increment,
ownerid int(10) unsigned NOT NULL default '0',
name varchar(50) default NULL,
des varchar(100) default NULL,
is_public enum('Y','N') NOT NULL default 'N',
PRIMARY KEY (moodthemeid),
KEY (is_public),
KEY (ownerid)
)
EOC
register_tablecreate("news_sent", <<'EOC');
CREATE TABLE news_sent (
newsid int(10) unsigned NOT NULL auto_increment,
newsnum mediumint(8) unsigned NOT NULL default '0',
user varchar(15) NOT NULL default '',
datesent datetime default NULL,
email varchar(100) NOT NULL default '',
PRIMARY KEY (newsid),
KEY (newsnum),
KEY (user),
KEY (email)
)
EOC
register_tablecreate("noderefs", <<'EOC');
CREATE TABLE noderefs (
nodetype char(1) NOT NULL default '',
nodeid int(10) unsigned NOT NULL default '0',
urlmd5 varchar(32) NOT NULL default '',
url varchar(120) NOT NULL default '',
PRIMARY KEY (nodetype,nodeid,urlmd5)
)
EOC
register_tablecreate("overrides", <<'EOC'); # global, old
CREATE TABLE overrides (
user varchar(15) NOT NULL default '',
override text,
PRIMARY KEY (user)
)
EOC
register_tablecreate("pendcomments", <<'EOC');
CREATE TABLE pendcomments (
jid int(10) unsigned NOT NULL,
pendcid int(10) unsigned NOT NULL,
data blob NOT NULL,
datesubmit int(10) unsigned NOT NULL,
PRIMARY KEY (pendcid, jid),
KEY (datesubmit)
)
EOC
register_tablecreate("poll", <<'EOC');
CREATE TABLE poll (
pollid int(10) unsigned NOT NULL auto_increment,
itemid int(10) unsigned NOT NULL default '0',
journalid int(10) unsigned NOT NULL default '0',
posterid int(10) unsigned NOT NULL default '0',
whovote enum('all','friends') NOT NULL default 'all',
whoview enum('all','friends','none') NOT NULL default 'all',
name varchar(255) default NULL,
PRIMARY KEY (pollid),
KEY (itemid),
KEY (journalid),
KEY (posterid)
)
EOC
register_tablecreate("pollitem", <<'EOC');
CREATE TABLE pollitem (
pollid int(10) unsigned NOT NULL default '0',
pollqid tinyint(3) unsigned NOT NULL default '0',
pollitid tinyint(3) unsigned NOT NULL default '0',
sortorder tinyint(3) unsigned NOT NULL default '0',
item varchar(255) default NULL,
PRIMARY KEY (pollid,pollqid,pollitid)
)
EOC
register_tablecreate("pollquestion", <<'EOC');
CREATE TABLE pollquestion (
pollid int(10) unsigned NOT NULL default '0',
pollqid tinyint(3) unsigned NOT NULL default '0',
sortorder tinyint(3) unsigned NOT NULL default '0',
type enum('check','radio','drop','text','scale') default NULL,
opts varchar(20) default NULL,
qtext text,
PRIMARY KEY (pollid,pollqid)
)
EOC
register_tablecreate("pollresult", <<'EOC');
CREATE TABLE pollresult (
pollid int(10) unsigned NOT NULL default '0',
pollqid tinyint(3) unsigned NOT NULL default '0',
userid int(10) unsigned NOT NULL default '0',
value varchar(255) default NULL,
PRIMARY KEY (pollid,pollqid,userid),
KEY (pollid,userid)
)
EOC
register_tablecreate("pollsubmission", <<'EOC');
CREATE TABLE pollsubmission (
pollid int(10) unsigned NOT NULL default '0',
userid int(10) unsigned NOT NULL default '0',
datesubmit datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (pollid,userid),
KEY (userid)
)
EOC
register_tablecreate("priv_list", <<'EOC');
CREATE TABLE priv_list (
prlid smallint(5) unsigned NOT NULL auto_increment,
privcode varchar(20) NOT NULL default '',
privname varchar(40) default NULL,
des varchar(255) default NULL,
is_public ENUM('1', '0') DEFAULT '1' NOT NULL,
PRIMARY KEY (prlid),
UNIQUE KEY privcode (privcode)
)
EOC
register_tablecreate("priv_map", <<'EOC');
CREATE TABLE priv_map (
prmid mediumint(8) unsigned NOT NULL auto_increment,
userid int(10) unsigned NOT NULL default '0',
prlid smallint(5) unsigned NOT NULL default '0',
arg varchar(40) default NULL,
PRIMARY KEY (prmid),
KEY (userid),
KEY (prlid)
)
EOC
register_tablecreate("cmdbuffer", <<'EOC');
CREATE TABLE cmdbuffer (
cbid INT UNSIGNED NOT NULL AUTO_INCREMENT,
journalid INT UNSIGNED NOT NULL,
cmd VARCHAR(30) NOT NULL default '',
instime datetime NOT NULL default '0000-00-00 00:00:00',
args TEXT NOT NULL,
PRIMARY KEY (cbid),
KEY (cmd),
KEY (journalid)
)
EOC
register_tablecreate("randomuserset", <<'EOC');
CREATE TABLE randomuserset (
rid INT UNSIGNED NOT NULL AUTO_INCREMENT,
userid INT UNSIGNED NOT NULL,
PRIMARY KEY (rid)
)
EOC
register_tablecreate("schemacols", <<'EOC');
CREATE TABLE schemacols (
tablename varchar(40) NOT NULL default '',
colname varchar(40) NOT NULL default '',
des varchar(255) default NULL,
PRIMARY KEY (tablename,colname)
)
EOC
register_tablecreate("schematables", <<'EOC');
CREATE TABLE schematables (
tablename varchar(40) NOT NULL default '',
public_browsable enum('0','1') NOT NULL default '0',
redist_mode enum('off','insert','replace') NOT NULL default 'off',
des text,
PRIMARY KEY (tablename)
)
EOC
register_tablecreate("stats", <<'EOC');
CREATE TABLE stats (
statcat varchar(30) NOT NULL,
statkey varchar(150) NOT NULL,
statval int(10) unsigned NOT NULL,
UNIQUE KEY statcat_2 (statcat,statkey)
)
EOC
register_tablecreate("blobcache", <<'EOC');
CREATE TABLE blobcache (
bckey VARCHAR(40) NOT NULL,
PRIMARY KEY (bckey),
dateupdate DATETIME,
value MEDIUMBLOB
)
EOC
register_tablecreate("style", <<'EOC');
CREATE TABLE style (
styleid int(11) NOT NULL auto_increment,
user varchar(15) NOT NULL default '',
styledes varchar(50) default NULL,
type varchar(10) NOT NULL default '',
formatdata text,
is_public enum('Y','N') NOT NULL default 'N',
is_embedded enum('Y','N') NOT NULL default 'N',
is_colorfree enum('Y','N') NOT NULL default 'N',
opt_cache enum('Y','N') NOT NULL default 'N',
has_ads enum('Y','N') NOT NULL default 'N',
lastupdate datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (styleid),
KEY (user),
KEY (type)
) PACK_KEYS=1
EOC
# cache Storable-frozen pre-cleaned style variables
register_tablecreate("s1stylecache", <<'EOC'); # clustered
CREATE TABLE s1stylecache (
styleid INT UNSIGNED NOT NULL PRIMARY KEY,
cleandate DATETIME,
type VARCHAR(10) NOT NULL DEFAULT '',
opt_cache ENUM('Y','N') NOT NULL DEFAULT 'N',
vars_stor BLOB,
vars_cleanver SMALLINT UNSIGNED NOT NULL
)
EOC
# caches Storable-frozen pre-cleaned overrides & colors
register_tablecreate("s1usercache", <<'EOC'); # clustered
CREATE TABLE s1usercache (
userid INT UNSIGNED NOT NULL PRIMARY KEY,
override_stor BLOB,
override_cleanver SMALLINT UNSIGNED NOT NULL,
color_stor BLOB
)
EOC
register_tablecreate("support", <<'EOC');
CREATE TABLE support (
spid int(10) unsigned NOT NULL auto_increment,
reqtype enum('user','email') default NULL,
requserid int(10) unsigned NOT NULL default '0',
reqname varchar(50) default NULL,
reqemail varchar(70) default NULL,
state enum('open','closed') default NULL,
authcode varchar(15) NOT NULL default '',
spcatid int(10) unsigned NOT NULL default '0',
subject varchar(80) default NULL,
timecreate int(10) unsigned default NULL,
timetouched int(10) unsigned default NULL,
timeclosed int(10) unsigned default NULL,
PRIMARY KEY (spid),
INDEX (state),
INDEX (requserid),
INDEX (reqemail)
)
EOC
register_tablecreate("supportcat", <<'EOC');
CREATE TABLE supportcat (
spcatid int(10) unsigned NOT NULL auto_increment,
catname varchar(80) default NULL,
sortorder mediumint(8) unsigned NOT NULL default '0',
basepoints tinyint(3) unsigned NOT NULL default '1',
PRIMARY KEY (spcatid)
)
EOC
register_tablecreate("supportlog", <<'EOC');
CREATE TABLE supportlog (
splid int(10) unsigned NOT NULL auto_increment,
spid int(10) unsigned NOT NULL default '0',
timelogged int(10) unsigned NOT NULL default '0',
type enum('req','custom','faqref') default NULL,
faqid mediumint(8) unsigned NOT NULL default '0',
userid int(10) unsigned NOT NULL default '0',
message text,
PRIMARY KEY (splid),
KEY (spid)
)
EOC
register_tablecreate("supportnotify", <<'EOC');
CREATE TABLE supportnotify (
spcatid int(10) unsigned NOT NULL default '0',
userid int(10) unsigned NOT NULL default '0',
level enum('all','new') default NULL,
KEY (spcatid),
KEY (userid),
PRIMARY KEY (spcatid,userid)
)
EOC
register_tablecreate("supportpoints", <<'EOC');
CREATE TABLE supportpoints (
spid int(10) unsigned NOT NULL default '0',
userid int(10) unsigned NOT NULL default '0',
points tinyint(3) unsigned default NULL,
KEY (spid),
KEY (userid)
)
EOC
register_tablecreate("supportpointsum", <<'EOC');
CREATE TABLE supportpointsum (
userid INT UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (userid),
totpoints MEDIUMINT UNSIGNED DEFAULT 0,
lastupdate INT UNSIGNED NOT NULL,
INDEX (totpoints, lastupdate),
INDEX (lastupdate)
)
EOC
post_create("supportpointsum",
"sqltry" => "INSERT IGNORE INTO supportpointsum (userid, totpoints, lastupdate) " .
"SELECT userid, SUM(points), 0 FROM supportpoints GROUP BY userid",
);
register_tablecreate("talkproplist", <<'EOC');
CREATE TABLE talkproplist (
tpropid smallint(5) unsigned NOT NULL auto_increment,
name varchar(50) default NULL,
prettyname varchar(60) default NULL,
datatype enum('char','num','bool') NOT NULL default 'char',
des varchar(255) default NULL,
PRIMARY KEY (tpropid),
UNIQUE KEY name (name)
)
EOC
register_tablecreate("themedata", <<'EOC');
CREATE TABLE themedata (
themeid mediumint(8) unsigned NOT NULL default '0',
coltype varchar(30) default NULL,
color varchar(30) default NULL,
KEY (themeid)
) PACK_KEYS=1
EOC
register_tablecreate("themelist", <<'EOC');
CREATE TABLE themelist (
themeid mediumint(8) unsigned NOT NULL auto_increment,
name varchar(50) NOT NULL default '',
PRIMARY KEY (themeid)
)
EOC
register_tablecreate("todo", <<'EOC');
CREATE TABLE todo (
todoid int(10) unsigned NOT NULL auto_increment,
journalid int(10) unsigned NOT NULL default '0',
posterid int(10) unsigned NOT NULL default '0',
ownerid int(10) unsigned NOT NULL default '0',
statusline varchar(40) default NULL,
security enum('public','private','friends') NOT NULL default 'public',
subject varchar(100) default NULL,
des varchar(255) default NULL,
priority enum('1','2','3','4','5') NOT NULL default '3',
datecreate datetime NOT NULL default '0000-00-00 00:00:00',
dateupdate datetime default NULL,
datedue datetime default NULL,
dateclosed datetime default NULL,
progress tinyint(3) unsigned NOT NULL default '0',
PRIMARY KEY (todoid),
KEY (journalid),
KEY (posterid),
KEY (ownerid)
)
EOC
register_tablecreate("tododep", <<'EOC');
CREATE TABLE tododep (
todoid int(10) unsigned NOT NULL default '0',
depid int(10) unsigned NOT NULL default '0',
PRIMARY KEY (todoid,depid),
KEY (depid)
)
EOC
register_tablecreate("todokeyword", <<'EOC');
CREATE TABLE todokeyword (
todoid int(10) unsigned NOT NULL default '0',
kwid int(10) unsigned NOT NULL default '0',
PRIMARY KEY (todoid,kwid)
)
EOC
register_tablecreate("txtmsg", <<'EOC');
CREATE TABLE txtmsg (
userid int(10) unsigned NOT NULL default '0',
provider varchar(25) default NULL,
number varchar(60) default NULL,
security enum('all','reg','friends') NOT NULL default 'all',
PRIMARY KEY (userid)
)
EOC
register_tablecreate("user", <<'EOC');
CREATE TABLE user (
userid int(10) unsigned NOT NULL auto_increment,
user char(15) default NULL,
caps SMALLINT UNSIGNED NOT NULL DEFAULT 0,
email char(50) default NULL,
password char(30) default NULL,
status char(1) NOT NULL default 'N',
statusvis char(1) NOT NULL default 'V',
statusvisdate datetime default NULL,
name char(50) default NULL,
bdate date default NULL,
themeid int(11) NOT NULL default '1',
moodthemeid int(10) unsigned NOT NULL default '1',
opt_forcemoodtheme enum('Y','N') NOT NULL default 'N',
allow_infoshow char(1) NOT NULL default 'Y',
allow_contactshow char(1) NOT NULL default 'Y',
allow_getljnews char(1) NOT NULL default 'N',
opt_showtalklinks char(1) NOT NULL default 'Y',
opt_whocanreply enum('all','reg','friends') NOT NULL default 'all',
opt_gettalkemail char(1) NOT NULL default 'Y',
opt_htmlemail enum('Y','N') NOT NULL default 'Y',
opt_mangleemail char(1) NOT NULL default 'N',
useoverrides char(1) NOT NULL default 'N',
defaultpicid int(10) unsigned default NULL,
has_bio enum('Y','N') NOT NULL default 'N',
txtmsg_status enum('none','on','off') NOT NULL default 'none',
is_system enum('Y','N') NOT NULL default 'N',
journaltype char(1) NOT NULL default 'P',
lang char(2) NOT NULL default 'EN',
PRIMARY KEY (userid),
UNIQUE KEY user (user),
KEY (email),
KEY (status),
KEY (statusvis)
) PACK_KEYS=1
EOC
register_tablecreate("userbio", <<'EOC');
CREATE TABLE userbio (
userid int(10) unsigned NOT NULL default '0',
bio text,
PRIMARY KEY (userid)
)
EOC
register_tablecreate("userinterests", <<'EOC');
CREATE TABLE userinterests (
userid int(10) unsigned NOT NULL default '0',
intid int(10) unsigned NOT NULL default '0',
PRIMARY KEY (userid,intid),
KEY (intid)
)
EOC
register_tablecreate("userpic", <<'EOC');
CREATE TABLE userpic (
picid int(10) unsigned NOT NULL auto_increment,
userid int(10) unsigned NOT NULL default '0',
contenttype char(25) default NULL,
width smallint(6) NOT NULL default '0',
height smallint(6) NOT NULL default '0',
state char(1) NOT NULL default 'N',
picdate datetime default NULL,
md5base64 char(22) NOT NULL default '',
PRIMARY KEY (picid),
KEY (userid),
KEY (state)
)
EOC
register_tablecreate("userpicblob2", <<'EOC');
CREATE TABLE userpicblob2 (
userid int unsigned not null,
picid int unsigned not null,
imagedata blob,
PRIMARY KEY (userid, picid)
) max_rows=10000000
EOC
register_tablecreate("userpicmap", <<'EOC');
CREATE TABLE userpicmap (
userid int(10) unsigned NOT NULL default '0',
kwid int(10) unsigned NOT NULL default '0',
picid int(10) unsigned NOT NULL default '0',
PRIMARY KEY (userid,kwid)
)
EOC
register_tablecreate("userpicmap2", <<'EOC');
CREATE TABLE userpicmap2 (
userid int(10) unsigned NOT NULL default '0',
kwid int(10) unsigned NOT NULL default '0',
picid int(10) unsigned NOT NULL default '0',
PRIMARY KEY (userid, kwid)
)
EOC
register_tablecreate("userpic2", <<'EOC');
CREATE TABLE userpic2 (
picid int(10) unsigned NOT NULL,
userid int(10) unsigned NOT NULL default '0',
fmt char(1) default NULL,
width smallint(6) NOT NULL default '0',
height smallint(6) NOT NULL default '0',
state char(1) NOT NULL default 'N',
picdate datetime default NULL,
md5base64 char(22) NOT NULL default '',
comment varchar(255) BINARY NOT NULL default '',
flags tinyint(1) unsigned NOT NULL default 0,
location enum('blob','disk','mogile') default NULL,
PRIMARY KEY (userid, picid)
)
EOC
# - blobids aren't necessarily unique between domains;
# global userpicids may collide with the counter used for the rest.
# so type must be in the key.
# - domain ids are set up in ljconfig.pl.
# - NULL length indicates the data is external-- we need another
# table for more data for that.
register_tablecreate("userblob", <<'EOC'); # clustered
CREATE TABLE userblob (
journalid INT UNSIGNED NOT NULL,
domain TINYINT UNSIGNED NOT NULL,
blobid MEDIUMINT UNSIGNED NOT NULL,
length MEDIUMINT UNSIGNED,
PRIMARY KEY (journalid, domain, blobid),
KEY (domain)
)
EOC
register_tablecreate("userproplist", <<'EOC');
CREATE TABLE userproplist (
upropid smallint(5) unsigned NOT NULL auto_increment,
name varchar(50) default NULL,
indexed enum('1','0') NOT NULL default '1',
prettyname varchar(60) default NULL,
datatype enum('char','num','bool') NOT NULL default 'char',
des varchar(255) default NULL,
PRIMARY KEY (upropid),
UNIQUE KEY name (name)
)
EOC
# global, indexed
register_tablecreate("userprop", <<'EOC');
CREATE TABLE userprop (
userid int(10) unsigned NOT NULL default '0',
upropid smallint(5) unsigned NOT NULL default '0',
value varchar(60) default NULL,
PRIMARY KEY (userid,upropid),
KEY (upropid,value)
)
EOC
# global, not indexed
register_tablecreate("userproplite", <<'EOC');
CREATE TABLE userproplite (
userid int(10) unsigned NOT NULL default '0',
upropid smallint(5) unsigned NOT NULL default '0',
value varchar(255) default NULL,
PRIMARY KEY (userid,upropid),
KEY (upropid)
)
EOC
# clustered, not indexed
register_tablecreate("userproplite2", <<'EOC');
CREATE TABLE userproplite2 (
userid int(10) unsigned NOT NULL default '0',
upropid smallint(5) unsigned NOT NULL default '0',
value varchar(255) default NULL,
PRIMARY KEY (userid,upropid),
KEY (upropid)
)
EOC
# clustered
register_tablecreate("userpropblob", <<'EOC');
CREATE TABLE userpropblob (
userid INT(10) unsigned NOT NULL default '0',
upropid SMALLINT(5) unsigned NOT NULL default '0',
value blob,
PRIMARY KEY (userid,upropid)
)
EOC
register_tablecreate("backupdirty", <<'EOC');
CREATE TABLE backupdirty (
userid INT(10) unsigned NOT NULL default '0',
marktime INT(10) unsigned NOT NULL default '0',
PRIMARY KEY (userid)
)
EOC
register_tablecreate("zip", <<'EOC');
CREATE TABLE zip (
zip varchar(5) NOT NULL default '',
state char(2) NOT NULL default '',
city varchar(100) NOT NULL default '',
PRIMARY KEY (zip),
KEY (state)
) PACK_KEYS=1
EOC
register_tablecreate("zips", <<'EOC');
CREATE TABLE zips (
FIPS char(2) default NULL,
zip varchar(5) NOT NULL default '',
State char(2) NOT NULL default '',
Name varchar(30) NOT NULL default '',
alloc float(9,7) NOT NULL default '0.0000000',
pop1990 int(11) NOT NULL default '0',
lon float(10,7) NOT NULL default '0.0000000',
lat float(10,7) NOT NULL default '0.0000000',
PRIMARY KEY (zip)
)
EOC
################# above was a snapshot. now, changes:
register_tablecreate("log2", <<'EOC');
CREATE TABLE log2 (
journalid INT UNSIGNED NOT NULL default '0',
jitemid MEDIUMINT UNSIGNED NOT NULL,
PRIMARY KEY (journalid, jitemid),
posterid int(10) unsigned NOT NULL default '0',
eventtime datetime default NULL,
logtime datetime default NULL,
compressed char(1) NOT NULL default 'N',
anum TINYINT UNSIGNED NOT NULL,
security enum('public','private','usemask') NOT NULL default 'public',
allowmask int(10) unsigned NOT NULL default '0',
replycount smallint(5) unsigned default NULL,
year smallint(6) NOT NULL default '0',
month tinyint(4) NOT NULL default '0',
day tinyint(4) NOT NULL default '0',
rlogtime int(10) unsigned NOT NULL default '0',
revttime int(10) unsigned NOT NULL default '0',
KEY (journalid,year,month,day),
KEY `rlogtime` (`journalid`,`rlogtime`),
KEY `revttime` (`journalid`,`revttime`),
KEY `posterid` (`posterid`,`journalid`)
)
EOC
register_tablecreate("logtext2", <<'EOC');
CREATE TABLE logtext2 (
journalid INT UNSIGNED NOT NULL,
jitemid MEDIUMINT UNSIGNED NOT NULL,
subject VARCHAR(255) DEFAULT NULL,
event TEXT,
PRIMARY KEY (journalid, jitemid)
) max_rows=100000000
EOC
register_tablecreate("logprop2", <<'EOC');
CREATE TABLE logprop2 (
journalid INT UNSIGNED NOT NULL,
jitemid MEDIUMINT UNSIGNED NOT NULL,
propid TINYINT unsigned NOT NULL,
value VARCHAR(255) default NULL,
PRIMARY KEY (journalid,jitemid,propid)
)
EOC
register_tablecreate("logsec2", <<'EOC');
CREATE TABLE logsec2 (
journalid INT UNSIGNED NOT NULL,
jitemid MEDIUMINT UNSIGNED NOT NULL,
allowmask INT UNSIGNED NOT NULL,
PRIMARY KEY (journalid,jitemid)
)
EOC
register_tablecreate("talk2", <<'EOC');
CREATE TABLE talk2 (
journalid INT UNSIGNED NOT NULL,
jtalkid MEDIUMINT UNSIGNED NOT NULL,
nodetype CHAR(1) NOT NULL DEFAULT '',
nodeid INT UNSIGNED NOT NULL default '0',
parenttalkid MEDIUMINT UNSIGNED NOT NULL,
posterid INT UNSIGNED NOT NULL default '0',
datepost DATETIME NOT NULL default '0000-00-00 00:00:00',
state CHAR(1) default 'A',
PRIMARY KEY (journalid,jtalkid),
KEY (nodetype,journalid,nodeid),
KEY (journalid,state,nodetype),
KEY (posterid)
)
EOC
register_tablecreate("talkprop2", <<'EOC');
CREATE TABLE talkprop2 (
journalid INT UNSIGNED NOT NULL,
jtalkid MEDIUMINT UNSIGNED NOT NULL,
tpropid TINYINT UNSIGNED NOT NULL,
value VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (journalid,jtalkid,tpropid)
)
EOC
register_tablecreate("talktext2", <<'EOC');
CREATE TABLE talktext2 (
journalid INT UNSIGNED NOT NULL,
jtalkid MEDIUMINT UNSIGNED NOT NULL,
subject VARCHAR(100) DEFAULT NULL,
body TEXT,
PRIMARY KEY (journalid, jtalkid)
) max_rows=100000000
EOC
register_tablecreate("talkleft", <<'EOC');
CREATE TABLE talkleft (
userid INT UNSIGNED NOT NULL,
posttime INT UNSIGNED NOT NULL,
INDEX (userid, posttime),
journalid INT UNSIGNED NOT NULL,
nodetype CHAR(1) NOT NULL,
nodeid INT UNSIGNED NOT NULL,
INDEX (journalid, nodetype, nodeid),
jtalkid MEDIUMINT UNSIGNED NOT NULL,
publicitem ENUM('1','0') NOT NULL DEFAULT '1'
)
EOC
register_tablecreate("talkleft_xfp", <<'EOC');
CREATE TABLE talkleft_xfp (
userid INT UNSIGNED NOT NULL,
posttime INT UNSIGNED NOT NULL,
INDEX (userid, posttime),
journalid INT UNSIGNED NOT NULL,
nodetype CHAR(1) NOT NULL,
nodeid INT UNSIGNED NOT NULL,
INDEX (journalid, nodetype, nodeid),
jtalkid MEDIUMINT UNSIGNED NOT NULL,
publicitem ENUM('1','0') NOT NULL DEFAULT '1'
)
EOC
register_tabledrop("ibill_codes");
register_tabledrop("paycredit");
register_tabledrop("payments");
register_tabledrop("tmp_contributed");
register_tabledrop("transferinfo");
register_tabledrop("contest1");
register_tabledrop("contest1data");
register_tabledrop("logins");
register_tabledrop("hintfriendsview");
register_tabledrop("hintlastnview");
register_tabledrop("batchdelete");
register_tabledrop("ftpusers");
register_tabledrop("ipban");
register_tabledrop("ban");
register_tabledrop("logaccess");
register_tabledrop("fvcache");
register_tabledrop("userpic_comment");
register_tablecreate("portal", <<'EOC');
CREATE TABLE portal (
userid int(10) unsigned NOT NULL default '0',
loc enum('left','main','right','moz') NOT NULL default 'left',
pos tinyint(3) unsigned NOT NULL default '0',
boxname varchar(30) default NULL,
boxargs varchar(255) default NULL,
PRIMARY KEY (userid,loc,pos),
KEY boxname (boxname)
)
EOC
register_tablecreate("infohistory", <<'EOC');
CREATE TABLE infohistory (
userid int(10) unsigned NOT NULL default '0',
what varchar(15) NOT NULL default '',
timechange datetime NOT NULL default '0000-00-00 00:00:00',
oldvalue varchar(255) default NULL,
other varchar(30) default NULL,
KEY userid (userid)
)
EOC
register_tablecreate("useridmap", <<'EOC');
CREATE TABLE useridmap (
userid int(10) unsigned NOT NULL,
user char(15) NOT NULL,
PRIMARY KEY (userid),
UNIQUE KEY user (user)
)
EOC
post_create("useridmap",
"sqltry" => "REPLACE INTO useridmap (userid, user) SELECT userid, user FROM user",
);
register_tablecreate("userusage", <<'EOC');
CREATE TABLE userusage
(
userid INT UNSIGNED NOT NULL,
PRIMARY KEY (userid),
timecreate DATETIME NOT NULL,
timeupdate DATETIME,
timecheck DATETIME,
lastitemid INT UNSIGNED NOT NULL DEFAULT '0',
INDEX (timeupdate)
)
EOC
# wknum - number of weeks past unix epoch time
# ubefore - units before next week (unit = 10 seconds)
# uafter - units after this week (unit = 10 seconds)
register_tablecreate("weekuserusage", <<'EOC');
CREATE TABLE weekuserusage
(
wknum SMALLINT UNSIGNED NOT NULL,
userid INT UNSIGNED NOT NULL,
PRIMARY KEY (wknum, userid),
ubefore SMALLINT UNSIGNED NOT NULL,
uafter SMALLINT UNSIGNED NOT NULL
)
EOC
register_tablecreate("userupdate", <<'EOC');
CREATE TABLE userupdate
(
userid INT UNSIGNED NOT NULL,
groupbit TINYINT UNSIGNED NOT NULL,
PRIMARY KEY (userid, groupbit),
timeupdate DATETIME NOT NULL
)
EOC
post_create("userusage",
"sqltry" => "INSERT IGNORE INTO userusage (userid, timecreate, timeupdate, timecheck, lastitemid) SELECT userid, timecreate, timeupdate, timecheck, lastitemid FROM user",
"sqltry" => "ALTER TABLE user DROP timecreate, DROP timeupdate, DROP timecheck, DROP lastitemid",
);
register_tablecreate("acctcode", <<'EOC');
CREATE TABLE acctcode
(
acid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
userid INT UNSIGNED NOT NULL,
rcptid INT UNSIGNED NOT NULL DEFAULT 0,
auth CHAR(5) NOT NULL,
INDEX (userid),
INDEX (rcptid)
)
EOC
register_tablecreate("meme", <<'EOC');
CREATE TABLE meme (
url VARCHAR(150) NOT NULL,
posterid INT UNSIGNED NOT NULL,
UNIQUE (url, posterid),
ts TIMESTAMP,
itemid INT UNSIGNED NOT NULL,
INDEX (ts)
)
EOC
register_tablecreate("statushistory", <<'EOC');
CREATE TABLE statushistory (
userid INT UNSIGNED NOT NULL,
adminid INT UNSIGNED NOT NULL,
shtype VARCHAR(20) NOT NULL,
shdate TIMESTAMP NOT NULL,
notes TEXT,
INDEX (userid, shdate),
INDEX (adminid, shdate),
INDEX (adminid, shtype, shdate),
INDEX (shtype, shdate)
)
EOC
register_tablecreate("includetext", <<'EOC');
CREATE TABLE includetext (
incname VARCHAR(80) NOT NULL PRIMARY KEY,
inctext TEXT,
updatetime INT UNSIGNED NOT NULL,
INDEX (updatetime)
)
EOC
register_tablecreate("oldids", <<'EOC');
CREATE TABLE oldids (
area CHAR(1) NOT NULL,
oldid INT UNSIGNED NOT NULL,
UNIQUE (area, oldid),
userid INT UNSIGNED NOT NULL,
newid INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (area,userid, newid),
INDEX (userid)
) TYPE=MYISAM
EOC
register_tablecreate("dudata", <<'EOC');
CREATE TABLE dudata (
userid INT UNSIGNED NOT NULL,
area CHAR(1) NOT NULL,
areaid INT UNSIGNED NOT NULL,
bytes MEDIUMINT UNSIGNED NOT NULL,
PRIMARY KEY (userid, area, areaid)
)
EOC
register_tablecreate("dbinfo", <<'EOC');
CREATE TABLE dbinfo (
dbid TINYINT UNSIGNED NOT NULL,
name VARCHAR(25),
fdsn VARCHAR(255),
rootfdsn VARCHAR(255),
masterid TINYINT UNSIGNED NOT NULL,
PRIMARY KEY (dbid),
UNIQUE (name)
)
EOC
register_tablecreate("dbweights", <<'EOC');
CREATE TABLE dbweights (
dbid TINYINT UNSIGNED NOT NULL,
role VARCHAR(25) NOT NULL,
PRIMARY KEY (dbid, role),
norm TINYINT UNSIGNED NOT NULL,
curr TINYINT UNSIGNED NOT NULL
)
EOC
# notification/subscription stuff:
register_tablecreate("subs", <<'EOC'); # global
CREATE TABLE subs (
userid INT UNSIGNED NOT NULL,
etype CHAR(1) NOT NULL,
ejournalid INT UNSIGNED NOT NULL,
eiarg INT UNSIGNED NOT NULL,
UNIQUE (userid, etype, ejournalid, eiarg),
INDEX (etype, ejournalid, eiarg),
subtime DATETIME NOT NULL,
exptime DATETIME NOT NULL,
INDEX (exptime),
ntype CHAR(1) NOT NULL
)
EOC
register_tablecreate("events", <<'EOC'); # clustered
CREATE TABLE events (
evtime DATETIME NOT NULL,
INDEX (evtime),
etype CHAR(1) NOT NULL,
ejournalid INT UNSIGNED NOT NULL,
eiarg INT UNSIGNED NOT NULL,
duserid INT UNSIGNED NOT NULL,
diarg INT UNSIGNED NOT NULL
)
EOC
# Begin S2 Stuff
register_tablecreate("s2layers", <<'EOC'); # global
CREATE TABLE s2layers
(
s2lid INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (s2lid),
b2lid INT UNSIGNED NOT NULL,
userid INT UNSIGNED NOT NULL,
type ENUM('core','i18nc','layout','theme','i18n','user') NOT NULL,
INDEX (userid),
INDEX (b2lid, type)
)
EOC
register_tablecreate("s2info", <<'EOC'); # global
CREATE TABLE s2info
(
s2lid INT UNSIGNED NOT NULL,
infokey VARCHAR(80) NOT NULL,
value VARCHAR(255) NOT NULL,
PRIMARY KEY (s2lid, infokey)
)
EOC
register_tablecreate("s2source", <<'EOC'); # global
CREATE TABLE s2source
(
s2lid INT UNSIGNED NOT NULL,
PRIMARY KEY (s2lid),
s2code MEDIUMBLOB
)
EOC
register_tablecreate("s2checker", <<'EOC'); # global
CREATE TABLE s2checker
(
s2lid INT UNSIGNED NOT NULL,
PRIMARY KEY (s2lid),
checker MEDIUMBLOB
)
EOC
# the original global s2compiled table. see comment below for new version.
register_tablecreate("s2compiled", <<'EOC'); # global (compdata is not gzipped)
CREATE TABLE s2compiled
(
s2lid INT UNSIGNED NOT NULL,
PRIMARY KEY (s2lid),
comptime INT UNSIGNED NOT NULL,
compdata MEDIUMBLOB
)
EOC
# s2compiled2 is only for user S2 layers (not system) and is lazily
# migrated. new saves go here. loads try this table first (unless
# system) and if miss, then try the s2compiled table on the global.
register_tablecreate("s2compiled2", <<'EOC'); # clustered (compdata is gzipped)
CREATE TABLE s2compiled2
(
userid INT UNSIGNED NOT NULL,
s2lid INT UNSIGNED NOT NULL,
PRIMARY KEY (userid, s2lid),
comptime INT UNSIGNED NOT NULL,
compdata MEDIUMBLOB
)
EOC
register_tablecreate("s2styles", <<'EOC'); # global
CREATE TABLE s2styles
(
styleid INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (styleid),
userid INT UNSIGNED NOT NULL,
name VARCHAR(255),
modtime INT UNSIGNED NOT NULL,
INDEX (userid)
)
EOC
register_tablecreate("s2stylelayers", <<'EOC'); # global
CREATE TABLE s2stylelayers
(
styleid INT UNSIGNED NOT NULL,
type ENUM('core','i18nc','layout','theme','i18n','user') NOT NULL,
UNIQUE (styleid, type),
s2lid INT UNSIGNED NOT NULL
)
EOC
register_tablecreate("s2stylelayers2", <<'EOC'); # clustered
CREATE TABLE s2stylelayers2
(
userid INT UNSIGNED NOT NULL,
styleid INT UNSIGNED NOT NULL,
type ENUM('core','i18nc','layout','theme','i18n','user') NOT NULL,
PRIMARY KEY (userid, styleid, type),
s2lid INT UNSIGNED NOT NULL
)
EOC
register_tablecreate("ml_domains", <<'EOC');
CREATE TABLE ml_domains
(
dmid TINYINT UNSIGNED NOT NULL,
PRIMARY KEY (dmid),
type VARCHAR(30) NOT NULL,
args VARCHAR(255) NOT NULL DEFAULT '',
UNIQUE (type,args)
)
EOC
register_tablecreate("ml_items", <<'EOC');
CREATE TABLE ml_items
(
dmid TINYINT UNSIGNED NOT NULL,
itid MEDIUMINT UNSIGNED AUTO_INCREMENT NOT NULL,
PRIMARY KEY (dmid, itid),
itcode VARCHAR(80) NOT NULL,
UNIQUE (dmid, itcode),
notes MEDIUMTEXT
) TYPE=MYISAM
EOC
register_tablecreate("ml_langs", <<'EOC');
CREATE TABLE ml_langs
(
lnid SMALLINT UNSIGNED NOT NULL,
UNIQUE (lnid),
lncode VARCHAR(16) NOT NULL, # en_US en_LJ en ch_HK ch_B5 etc... de_DE
UNIQUE (lncode),
lnname VARCHAR(60) NOT NULL, # "Deutsch"
parenttype ENUM('diff','sim') NOT NULL,
parentlnid SMALLINT UNSIGNED NOT NULL,
lastupdate DATETIME NOT NULL
)
EOC
register_tablecreate("ml_langdomains", <<'EOC');
CREATE TABLE ml_langdomains
(
lnid SMALLINT UNSIGNED NOT NULL,
dmid TINYINT UNSIGNED NOT NULL,
PRIMARY KEY (lnid, dmid),
dmmaster ENUM('0','1') NOT NULL,
lastgetnew DATETIME,
lastpublish DATETIME,
countokay SMALLINT UNSIGNED NOT NULL,
counttotal SMALLINT UNSIGNED NOT NULL
)
EOC
register_tablecreate("ml_latest", <<'EOC');
CREATE TABLE ml_latest
(
lnid SMALLINT UNSIGNED NOT NULL,
dmid TINYINT UNSIGNED NOT NULL,
itid SMALLINT UNSIGNED NOT NULL,
PRIMARY KEY (lnid, dmid, itid),
txtid INT UNSIGNED NOT NULL,
chgtime DATETIME NOT NULL,
staleness TINYINT UNSIGNED DEFAULT 0 NOT NULL, # better than ENUM('0','1','2');
INDEX (lnid, staleness),
INDEX (dmid, itid),
INDEX (lnid, dmid, chgtime),
INDEX (chgtime)
)
EOC
register_tablecreate("ml_text", <<'EOC');
CREATE TABLE ml_text
(
dmid TINYINT UNSIGNED NOT NULL,
txtid INT UNSIGNED AUTO_INCREMENT NOT NULL,
PRIMARY KEY (dmid, txtid),
lnid SMALLINT UNSIGNED NOT NULL,
itid SMALLINT UNSIGNED NOT NULL,
INDEX (lnid, dmid, itid),
text TEXT NOT NULL,
userid INT UNSIGNED NOT NULL
) TYPE=MYISAM
EOC
register_tablecreate("domains", <<'EOC');
CREATE TABLE domains
(
domain VARCHAR(80) NOT NULL,
PRIMARY KEY (domain),
userid INT UNSIGNED NOT NULL,
INDEX (userid)
)
EOC
register_tablecreate("procnotify", <<'EOC');
CREATE TABLE procnotify
(
nid INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (nid),
cmd VARCHAR(50),
args VARCHAR(255)
)
EOC
register_tablecreate("syndicated", <<'EOC');
CREATE TABLE syndicated
(
userid INT UNSIGNED NOT NULL,
synurl VARCHAR(255),
checknext DATETIME NOT NULL,
lastcheck DATETIME,
lastmod INT UNSIGNED, # unix time
etag VARCHAR(80),
PRIMARY KEY (userid),
UNIQUE (synurl),
INDEX (checknext)
)
EOC
register_tablecreate("synitem", <<'EOC');
CREATE TABLE synitem
(
userid INT UNSIGNED NOT NULL,
item CHAR(22), # base64digest of rss $item
dateadd DATETIME NOT NULL,
INDEX (userid, item(3)),
INDEX (userid, dateadd)
)
EOC
register_tablecreate("ratelist", <<'EOC');
CREATE TABLE ratelist
(
rlid TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
name varchar(50) not null,
des varchar(255) not null,
PRIMARY KEY (rlid),
UNIQUE KEY (name)
)
EOC
register_tablecreate("ratelog", <<'EOC');
CREATE TABLE ratelog
(
userid INT UNSIGNED NOT NULL,
rlid TINYINT UNSIGNED NOT NULL,
evttime INT UNSIGNED NOT NULL,
ip INT UNSIGNED NOT NULL,
index (userid, rlid, evttime),
quantity SMALLINT UNSIGNED NOT NULL
)
EOC
register_tablecreate("rateabuse", <<'EOC');
CREATE TABLE rateabuse
(
rlid TINYINT UNSIGNED NOT NULL,
userid INT UNSIGNED NOT NULL,
evttime INT UNSIGNED NOT NULL,
ip INT UNSIGNED NOT NULL,
enum ENUM('soft','hard') NOT NULL,
index (rlid, evttime),
index (userid),
index (ip)
)
EOC
register_tablecreate("loginstall", <<'EOC');
CREATE TABLE loginstall
(
userid INT UNSIGNED NOT NULL,
ip INT UNSIGNED NOT NULL,
time INT UNSIGNED NOT NULL,
UNIQUE (userid, ip)
)
EOC
# web sessions. optionally tied to ips and with expiration times.
# whenever a session is okayed, expired ones are deleted, or ones
# created over 30 days ago. a live session can't change email address
# or password. digest authentication will be required for that,
# or javascript md5 challenge/response.
register_tablecreate("sessions", <<'EOC'); # user cluster
CREATE TABLE sessions (
userid MEDIUMINT UNSIGNED NOT NULL,
sessid MEDIUMINT UNSIGNED NOT NULL,
PRIMARY KEY (userid, sessid),
auth CHAR(10) NOT NULL,
exptype ENUM('short','long') NOT NULL, # browser closed or "infinite"
timecreate INT UNSIGNED NOT NULL,
timeexpire INT UNSIGNED NOT NULL,
ipfixed CHAR(15) # if null, not fixed at IP.
)
EOC
register_tablecreate("sessions_data", <<'EOC'); # user cluster
CREATE TABLE sessions_data (
userid MEDIUMINT UNSIGNED NOT NULL,
sessid MEDIUMINT UNSIGNED NOT NULL,
skey VARCHAR(30) NOT NULL,
PRIMARY KEY (userid, sessid, skey),
sval VARCHAR(255)
)
EOC
# what: ip, email, ljuser, ua, emailnopay
# emailnopay means don't allow payments from that email
register_tablecreate("sysban", <<'EOC');
CREATE TABLE sysban (
banid MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (banid),
status ENUM('active','expired') NOT NULL DEFAULT 'active',
INDEX (status),
bandate DATETIME,
banuntil DATETIME,
what VARCHAR(20) NOT NULL,
value VARCHAR(80),
note VARCHAR(255)
)
EOC
# clustered relationship types are defined in ljlib.pl and ljlib-local.pl in
# the LJ::get_reluser_id function
register_tablecreate("reluser2", <<'EOC');
CREATE TABLE reluser2 (
userid INT UNSIGNED NOT NULL,
type SMALLINT UNSIGNED NOT NULL,
targetid INT UNSIGNED NOT NULL,
PRIMARY KEY (userid,type,targetid),
INDEX (userid,targetid)
)
EOC
# relationship types:
# 'A' means targetid can administrate userid as a community maintainer
# 'B' means targetid is banned in userid
# 'P' means targetid can post to userid
# 'M' means targetid can moderate the community userid
# 'N' means targetid is preapproved to post to community userid w/o moderation
# new types to be added here
register_tablecreate("reluser", <<'EOC');
CREATE TABLE reluser (
userid INT UNSIGNED NOT NULL,
targetid INT UNSIGNED NOT NULL,
type char(1) NOT NULL,
PRIMARY KEY (userid,type,targetid),
KEY (targetid,type)
)
EOC
post_create("reluser",
"sqltry" => "INSERT IGNORE INTO reluser (userid, targetid, type) SELECT userid, banneduserid, 'B' FROM ban",
"sqltry" => "INSERT IGNORE INTO reluser (userid, targetid, type) SELECT u.userid, p.userid, 'A' FROM priv_map p, priv_list l, user u WHERE l.privcode='sharedjournal' AND l.prlid=p.prlid AND p.arg=u.user AND p.arg<>'all'",
"code" => sub {
my $dbh = shift;
print "# Converting logaccess rows to reluser...\n";
my $sth = $dbh->prepare("SELECT MAX(userid) FROM user");
$sth->execute;
my ($maxid) = $sth->fetchrow_array;
return unless $maxid;
my $from = 1; my $to = $from + 10000 - 1;
while ($from <= $maxid) {
printf "# logaccess status: (%0.1f%%)\n", ($from * 100 / $maxid);
do_sql("INSERT IGNORE INTO reluser (userid, targetid, type) ".
"SELECT ownerid, posterid, 'P' ".
"FROM logaccess ".
"WHERE ownerid BETWEEN $from AND $to");
$from += 10000;
$to += 10000;
}
print "# Finished converting logaccess.\n";
},
);
register_tablecreate("clustermove", <<'EOC');
CREATE TABLE clustermove (
cmid INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (cmid),
userid INT UNSIGNED NOT NULL,
KEY (userid),
sclust TINYINT UNSIGNED NOT NULL,
dclust TINYINT UNSIGNED NOT NULL,
timestart INT UNSIGNED,
timedone INT UNSIGNED,
sdeleted ENUM('1','0')
)
EOC
# moderated community post summary info
register_tablecreate("modlog", <<'EOC');
CREATE TABLE modlog (
journalid INT UNSIGNED NOT NULL,
modid MEDIUMINT UNSIGNED NOT NULL,
PRIMARY KEY (journalid, modid),
posterid INT UNSIGNED NOT NULL,
subject CHAR(30),
logtime DATETIME,
KEY (journalid, logtime)
)
EOC
# moderated community post Storable object (all props/options)
register_tablecreate("modblob", <<'EOC');
CREATE TABLE modblob (
journalid INT UNSIGNED NOT NULL,
modid INT UNSIGNED NOT NULL,
PRIMARY KEY (journalid, modid),
request_stor MEDIUMBLOB
)
EOC
# user counters
register_tablecreate("counter", <<'EOC');
CREATE TABLE counter (
journalid INT UNSIGNED NOT NULL,
area CHAR(1) NOT NULL,
PRIMARY KEY (journalid, area),
max MEDIUMINT UNSIGNED NOT NULL
)
EOC
# user counters on the global (contrary to the name)
register_tablecreate("usercounter", <<'EOC');
CREATE TABLE usercounter (
journalid INT UNSIGNED NOT NULL,
area CHAR(1) NOT NULL,
PRIMARY KEY (journalid, area),
max INT UNSIGNED NOT NULL
)
EOC
# community interests
register_tablecreate("comminterests", <<'EOC');
CREATE TABLE comminterests (
userid int(10) unsigned NOT NULL default '0',
intid int(10) unsigned NOT NULL default '0',
PRIMARY KEY (userid,intid),
KEY (intid)
)
EOC
# links
register_tablecreate("links", <<'EOC'); # clustered
CREATE TABLE links (
journalid int(10) unsigned NOT NULL default '0',
ordernum tinyint(4) unsigned NOT NULL default '0',
parentnum tinyint(4) unsigned NOT NULL default '0',
url varchar(255) default NULL,
title varchar(255) NOT NULL default '',
KEY (journalid)
)
EOC
# supportprop
register_tablecreate("supportprop", <<'EOC');
CREATE TABLE supportprop (
spid int(10) unsigned NOT NULL default '0',
prop varchar(30) NOT NULL,
value varchar(255) NOT NULL,
PRIMARY KEY (spid, prop)
)
EOC
# s1overrides
register_tablecreate("s1overrides", <<'EOC'); # clustered
CREATE TABLE s1overrides (
userid int unsigned NOT NULL default '',
override text NOT NULL,
PRIMARY KEY (userid)
)
EOC
# s1style
register_tablecreate("s1style", <<'EOC'); # clustered
CREATE TABLE s1style (
styleid int(11) NOT NULL auto_increment,
userid int(11) unsigned NOT NULL,
styledes varchar(50) default NULL,
type varchar(10) NOT NULL default '',
formatdata text,
is_public enum('Y','N') NOT NULL default 'N',
is_embedded enum('Y','N') NOT NULL default 'N',
is_colorfree enum('Y','N') NOT NULL default 'N',
opt_cache enum('Y','N') NOT NULL default 'N',
has_ads enum('Y','N') NOT NULL default 'N',
lastupdate datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (styleid),
KEY (userid)
)
EOC
# s1stylemap
register_tablecreate("s1stylemap", <<'EOC'); # global
CREATE TABLE s1stylemap (
styleid int unsigned NOT NULL,
userid int unsigned NOT NULL,
PRIMARY KEY (styleid)
)
EOC
# comment urls
register_tablecreate("commenturls", <<'EOC'); # global
CREATE TABLE commenturls (
posterid int unsigned NOT NULL,
journalid int unsigned NOT NULL,
jtalkid mediumint unsigned NOT NULL,
timecreate int unsigned NOT NULL,
url varchar(255) NOT NULL,
INDEX (timecreate)
)
EOC
post_create("comminterests",
"code" => sub {
my $dbh = shift;
print "# Populating community interests...\n";
my $BLOCK = 1_000;
my @ids = @{ $dbh->selectcol_arrayref("SELECT userid FROM community") || [] };
my $total = @ids;
while (@ids) {
my @set = grep { $_ } splice(@ids, 0, $BLOCK);
printf ("# community interests status: (%0.1f%%)\n",
((($total - @ids) / $total) * 100)) if $total > $BLOCK;
local $" = ",";
do_sql("INSERT IGNORE INTO comminterests (userid, intid) ".
"SELECT userid, intid FROM userinterests " .
"WHERE userid IN (@set)");
}
print "# Finished converting community interests.\n";
},
);
# tracking where users are active
register_tablecreate("clustertrack2", <<'EOC'); # clustered
CREATE TABLE clustertrack2 (
userid INT UNSIGNED NOT NULL,
PRIMARY KEY (userid),
timeactive INT UNSIGNED NOT NULL,
clusterid SMALLINT UNSIGNED,
INDEX (timeactive, clusterid)
)
EOC
# rotating site secret values
register_tablecreate("secrets", <<'EOC'); # global
CREATE TABLE secrets (
stime INT UNSIGNED NOT NULL,
secret CHAR(32) NOT NULL,
PRIMARY KEY (stime)
)
EOC
# Captcha table
register_tablecreate("captchas", <<'EOC');
CREATE TABLE captchas (
capid INT UNSIGNED NOT NULL auto_increment,
type enum('image','audio'),
issuetime INT UNSIGNED NOT NULL DEFAULT 0,
answer CHAR(10),
userid INT UNSIGNED NOT NULL DEFAULT 0,
anum SMALLINT UNSIGNED NOT NULL,
INDEX(type,issuetime),
INDEX(userid),
PRIMARY KEY(capid)
)
EOC
# Challenges table (for non-memcache support)
register_tablecreate("challenges", <<'EOC');
CREATE TABLE challenges (
ctime int(10) unsigned NOT NULL DEFAULT 0,
challenge char(80) NOT NULL DEFAULT '',
PRIMARY KEY (challenge)
)
EOC
register_tablecreate("clustermove_inprogress", <<'EOC');
CREATE TABLE clustermove_inprogress (
userid INT UNSIGNED NOT NULL,
locktime INT UNSIGNED NOT NULL,
dstclust SMALLINT UNSIGNED NOT NULL,
moverhost INT UNSIGNED NOT NULL,
moverport SMALLINT UNSIGNED NOT NULL,
moverinstance CHAR(22) NOT NULL, # base64ed MD5 hash
PRIMARY KEY (userid)
)
EOC
# track open HTTP proxies
register_tablecreate("openproxy", <<'EOC');
CREATE TABLE openproxy (
addr VARCHAR(15) NOT NULL,
status ENUM('proxy', 'clear'),
asof INT UNSIGNED NOT NULL,
src VARCHAR(80),
PRIMARY KEY (addr)
)
EOC
register_tablecreate("captcha_session", <<'EOC'); # clustered
CREATE TABLE captcha_session (
sess char(20) NOT NULL default '',
sesstime int(10) unsigned NOT NULL default '0',
lastcapid int(11) default NULL,
trynum smallint(6) default '0',
PRIMARY KEY (`sess`),
KEY sesstime (`sesstime`)
)
EOC
register_tablecreate("spamreports", <<'EOC'); # global
CREATE TABLE spamreports (
reporttime INT(10) UNSIGNED NOT NULL,
ip VARCHAR(15),
journalid INT(10) UNSIGNED NOT NULL,
posterid INT(10) UNSIGNED NOT NULL DEFAULT 0,
subject VARCHAR(255) BINARY,
body BLOB NOT NULL,
PRIMARY KEY (reporttime, journalid),
INDEX (ip),
INDEX (posterid)
)
EOC
register_tablecreate("tempanonips", <<'EOC'); # clustered
CREATE TABLE tempanonips (
reporttime INT(10) UNSIGNED NOT NULL,
ip VARCHAR(15) NOT NULL,
journalid INT(10) UNSIGNED NOT NULL,
jtalkid MEDIUMINT(8) UNSIGNED NOT NULL,
PRIMARY KEY (journalid, jtalkid),
INDEX (reporttime)
)
EOC
# partialstats - stores calculation times:
# jobname = 'calc_country'
# clusterid = '1'
# calctime = time()
register_tablecreate("partialstats", <<'EOC');
CREATE TABLE partialstats (
jobname VARCHAR(50) NOT NULL,
clusterid MEDIUMINT NOT NULL DEFAULT 0,
calctime INT(10) UNSIGNED,
PRIMARY KEY (jobname, clusterid)
)
EOC
# partialstatsdata - stores data per cluster:
# statname = 'country'
# arg = 'US'
# clusterid = '1'
# value = '500'
register_tablecreate("partialstatsdata", <<'EOC');
CREATE TABLE partialstatsdata (
statname VARCHAR(50) NOT NULL,
arg VARCHAR(50) NOT NULL,
clusterid INT(10) UNSIGNED NOT NULL DEFAULT 0,
value INT(11),
PRIMARY KEY (statname, arg, clusterid)
)
EOC
# inviterecv -- stores community invitations received
register_tablecreate("inviterecv", <<'EOC');
CREATE TABLE inviterecv (
userid INT(10) UNSIGNED NOT NULL,
commid INT(10) UNSIGNED NOT NULL,
maintid INT(10) UNSIGNED NOT NULL,
recvtime INT(10) UNSIGNED NOT NULL,
args VARCHAR(255),
PRIMARY KEY (userid, commid)
)
EOC
# invitesent -- stores community invitations sent
register_tablecreate("invitesent", <<'EOC');
CREATE TABLE invitesent (
commid INT(10) UNSIGNED NOT NULL,
userid INT(10) UNSIGNED NOT NULL,
maintid INT(10) UNSIGNED NOT NULL,
recvtime INT(10) UNSIGNED NOT NULL,
status ENUM('accepted', 'rejected', 'outstanding') NOT NULL,
args VARCHAR(255),
PRIMARY KEY (commid, userid)
)
EOC
# memorable2 -- clustered memories
register_tablecreate("memorable2", <<'EOC');
CREATE TABLE memorable2 (
userid INT(10) UNSIGNED NOT NULL DEFAULT '0',
memid INT(10) UNSIGNED NOT NULL DEFAULT '0',
journalid INT(10) UNSIGNED NOT NULL DEFAULT '0',
ditemid INT(10) UNSIGNED NOT NULL DEFAULT '0',
des VARCHAR(150) DEFAULT NULL,
security ENUM('public','friends','private') NOT NULL DEFAULT 'public',
PRIMARY KEY (userid, journalid, ditemid),
UNIQUE KEY (userid, memid)
)
EOC
# memkeyword2 -- clustered memory keyword map
register_tablecreate("memkeyword2", <<'EOC');
CREATE TABLE memkeyword2 (
userid INT(10) UNSIGNED NOT NULL DEFAULT '0',
memid INT(10) UNSIGNED NOT NULL DEFAULT '0',
kwid INT(10) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (userid, memid, kwid),
KEY (userid, kwid)
)
EOC
# userkeywords -- clustered keywords
register_tablecreate("userkeywords", <<'EOC');
CREATE TABLE userkeywords (
userid INT(10) UNSIGNED NOT NULL DEFAULT '0',
kwid INT(10) UNSIGNED NOT NULL DEFAULT '0',
keyword VARCHAR(80) BINARY NOT NULL,
PRIMARY KEY (userid, kwid),
UNIQUE KEY (userid, keyword)
)
EOC
# friendgroup2 -- clustered friend groups
register_tablecreate("friendgroup2", <<'EOC');
CREATE TABLE friendgroup2 (
userid INT(10) UNSIGNED NOT NULL DEFAULT '0',
groupnum TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
groupname VARCHAR(90) NOT NULL DEFAULT '',
sortorder TINYINT(3) UNSIGNED NOT NULL DEFAULT '50',
is_public ENUM('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (userid, groupnum)
)
EOC
register_tablecreate("readonly_user", <<'EOC');
CREATE TABLE readonly_user (
userid INT(10) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (userid)
)
EOC
register_tablecreate("underage", <<'EOC');
CREATE TABLE underage (
uniq CHAR(15) NOT NULL,
timeof INT(10) NOT NULL,
PRIMARY KEY (uniq),
KEY (timeof)
)
EOC
register_tablecreate("support_youreplied", <<'EOC');
CREATE TABLE support_youreplied (
userid INT UNSIGNED NOT NULL,
spid INT UNSIGNED NOT NULL,
PRIMARY KEY (userid, spid)
)
EOC
register_tablecreate("support_answers", <<'EOC');
CREATE TABLE support_answers (
ansid INT UNSIGNED NOT NULL,
spcatid INT UNSIGNED NOT NULL,
lastmodtime INT UNSIGNED NOT NULL,
lastmoduserid INT UNSIGNED NOT NULL,
subject VARCHAR(255),
body TEXT,
PRIMARY KEY (ansid),
KEY (spcatid)
)
EOC
register_tablecreate("userlog", <<'EOC');
CREATE TABLE userlog (
userid INT UNSIGNED NOT NULL,
logtime INT UNSIGNED NOT NULL,
action VARCHAR(30) NOT NULL,
actiontarget INT UNSIGNED,
remoteid INT UNSIGNED,
ip VARCHAR(15),
uniq VARCHAR(15),
extra VARCHAR(255),
INDEX (userid)
)
EOC
# external user mappings
# note: extuser/extuserid are expected to sometimes be NULL, even
# though they are keyed. (Null values are not taken into account when
# using indexes)
register_tablecreate("extuser", <<'EOC');
CREATE TABLE extuser (
userid INT UNSIGNED NOT NULL PRIMARY KEY,
siteid INT UNSIGNED NOT NULL,
extuser VARCHAR(50),
extuserid INT UNSIGNED,
UNIQUE KEY `extuser` (siteid, extuser),
UNIQUE KEY `extuserid` (siteid, extuserid)
)
EOC
# table showing what tags a user has; parentkwid can be null
register_tablecreate("usertags", <<'EOC');
CREATE TABLE usertags (
journalid INT UNSIGNED NOT NULL,
kwid INT UNSIGNED NOT NULL,
parentkwid INT UNSIGNED,
display ENUM('0','1') DEFAULT '1' NOT NULL,
PRIMARY KEY (journalid, kwid)
)
EOC
# mapping of tags applied to an entry
register_tablecreate("logtags", <<'EOC');
CREATE TABLE logtags (
journalid INT UNSIGNED NOT NULL,
jitemid MEDIUMINT UNSIGNED NOT NULL,
kwid INT UNSIGNED NOT NULL,
PRIMARY KEY (journalid, jitemid, kwid),
KEY (journalid, kwid)
)
EOC
# logtags but only for the most recent 100 tags-to-entry
register_tablecreate("logtagsrecent", <<'EOC');
CREATE TABLE logtagsrecent (
journalid INT UNSIGNED NOT NULL,
jitemid MEDIUMINT UNSIGNED NOT NULL,
kwid INT UNSIGNED NOT NULL,
PRIMARY KEY (journalid, kwid, jitemid)
)
EOC
# summary counts for security on entry keywords
register_tablecreate("logkwsum", <<'EOC');
CREATE TABLE logkwsum (
journalid INT UNSIGNED NOT NULL,
kwid INT UNSIGNED NOT NULL,
security INT UNSIGNED NOT NULL,
entryct INT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (journalid, kwid, security),
KEY (journalid, security)
)
EOC
# action history tables
register_tablecreate("actionhistory", <<'EOC');
CREATE TABLE actionhistory (
time INT UNSIGNED NOT NULL,
clusterid TINYINT UNSIGNED NOT NULL,
what CHAR(2) NOT NULL,
count INT UNSIGNED NOT NULL DEFAULT 0,
INDEX(time)
)
EOC
register_tablecreate("recentactions", <<'EOC');
CREATE TABLE recentactions (
what CHAR(2) NOT NULL
) TYPE=MYISAM
EOC
# external identities
#
# idtype ::=
# "O" - OpenID
# "L" - LID (netmesh)
# "T" - TypeKey
# ? - etc
register_tablecreate("identitymap", <<'EOC');
CREATE TABLE identitymap (
idtype CHAR(1) NOT NULL,
identity VARCHAR(255) BINARY NOT NULL,
userid INT unsigned NOT NULL,
PRIMARY KEY (idtype, identity),
KEY userid (userid)
)
EOC
register_tablecreate("openid_trust", <<'EOC');
CREATE TABLE openid_trust (
userid int(10) unsigned NOT NULL default '0',
endpoint_id int(10) unsigned NOT NULL default '0',
trust_time int(10) unsigned NOT NULL default '0',
duration enum('always','once') NOT NULL default 'always',
last_assert_time int(10) unsigned default NULL,
flags tinyint(3) unsigned default NULL,
PRIMARY KEY (userid,endpoint_id),
KEY endpoint_id (endpoint_id)
)
EOC
register_tablecreate("openid_endpoint", <<'EOC');
CREATE TABLE openid_endpoint (
endpoint_id int(10) unsigned NOT NULL auto_increment,
url varchar(255) BINARY NOT NULL default '',
last_assert_time int(10) unsigned default NULL,
PRIMARY KEY (endpoint_id),
UNIQUE KEY url (url),
KEY last_assert_time (last_assert_time)
)
EOC
register_tablecreate("openid_external", <<'EOC');
CREATE TABLE openid_external (
userid int(10) unsigned NOT NULL default '0',
url varchar(255) binary default NULL,
KEY userid (userid)
)
EOC
# NOTE: new table declarations go here
### changes
register_alter(sub {
my $dbh = shift;
my $runsql = shift;
if (column_type("supportcat", "is_selectable") eq "")
{
do_alter("supportcat",
"ALTER TABLE supportcat ADD is_selectable ENUM('1','0') ".
"NOT NULL DEFAULT '1', ADD public_read ENUM('1','0') NOT ".
"NULL DEFAULT '1', ADD public_help ENUM('1','0') NOT NULL ".
"DEFAULT '1', ADD allow_screened ENUM('1','0') NOT NULL ".
"DEFAULT '0', ADD replyaddress VARCHAR(50), ADD hide_helpers ".
"ENUM('1','0') NOT NULL DEFAULT '0' AFTER allow_screened");
}
if (column_type("supportlog", "type") =~ /faqref/)
{
do_alter("supportlog",
"ALTER TABLE supportlog MODIFY type ENUM('req', 'answer', ".
"'custom', 'faqref', 'comment', 'internal', 'screened') ".
"NOT NULL");
do_sql("UPDATE supportlog SET type='answer' WHERE type='custom'");
do_sql("UPDATE supportlog SET type='answer' WHERE type='faqref'");
do_alter("supportlog",
"ALTER TABLE supportlog MODIFY type ENUM('req', 'answer', ".
"'comment', 'internal', 'screened') NOT NULL");
}
if (table_relevant("supportcat") && column_type("supportcat", "catkey") eq "")
{
do_alter("supportcat",
"ALTER TABLE supportcat ADD catkey VARCHAR(25) AFTER spcatid");
do_sql("UPDATE supportcat SET catkey=spcatid WHERE catkey IS NULL");
do_alter("supportcat",
"ALTER TABLE supportcat MODIFY catkey VARCHAR(25) NOT NULL");
}
if (column_type("supportcat", "no_autoreply") eq "")
{
do_alter("supportcat",
"ALTER TABLE supportcat ADD no_autoreply ENUM('1', '0') ".
"NOT NULL DEFAULT '0'");
}
if (column_type("support", "timelasthelp") eq "")
{
do_alter("supportlog",
"ALTER TABLE supportlog ADD INDEX (userid)");
do_alter("support",
"ALTER TABLE support ADD timelasthelp INT UNSIGNED");
}
if (column_type("duplock", "realm") !~ /payments/)
{
do_alter("duplock",
"ALTER TABLE duplock MODIFY realm ENUM('support','log',".
"'comment','payments') NOT NULL default 'support'");
}
if (column_type("schematables", "redist_where") eq "")
{
do_alter("schematables",
"ALTER TABLE schematables ADD ".
"redist_where varchar(255) AFTER redist_mode");
}
# upgrade people to the new capabilities system. if they're
# using the the paidfeatures column already, we'll assign them
# the same capability bits that ljcom will be using.
if (table_relevant("user") && column_type("user", "caps") eq "")
{
do_alter("user",
"ALTER TABLE user ADD ".
"caps SMALLINT UNSIGNED NOT NULL DEFAULT 0 AFTER user");
try_sql("UPDATE user SET caps=16|8|2 WHERE paidfeatures='on'");
try_sql("UPDATE user SET caps=8|2 WHERE paidfeatures='paid'");
try_sql("UPDATE user SET caps=4|2 WHERE paidfeatures='early'");
try_sql("UPDATE user SET caps=2 WHERE paidfeatures='off'");
}
# axe this column (and its two related ones) if it exists.
if (column_type("user", "paidfeatures"))
{
try_sql("REPLACE INTO paiduser (userid, paiduntil, paidreminder) ".
"SELECT userid, paiduntil, paidreminder FROM user WHERE paidfeatures='paid'");
try_sql("REPLACE INTO paiduser (userid, paiduntil, paidreminder) ".
"SELECT userid, COALESCE(paiduntil,'0000-00-00'), NULL FROM user WHERE paidfeatures='on'");
do_alter("user",
"ALTER TABLE user DROP paidfeatures, DROP paiduntil, DROP paidreminder");
}
# move S1 _style ids to userprop table!
if (column_type("user", "lastn_style")) {
# be paranoid and insert these in case they don't exist:
try_sql("INSERT INTO userproplist VALUES (null, 's1_lastn_style', 0, 'Recent View StyleID', 'num', 'The style ID# of the S1 style for the recent entries view.')");
try_sql("INSERT INTO userproplist VALUES (null, 's1_calendar_style', 0, 'Calendar View StyleID', 'num', 'The style ID# of the S1 style for the calendar view.')");
try_sql("INSERT INTO userproplist VALUES (null, 's1_day_style', 0, 'Day View StyleID', 'num', 'The style ID# of the S1 style for the day view.')");
try_sql("INSERT INTO userproplist VALUES (null, 's1_friends_style', 0, 'Friends View StyleID', 'num', 'The style ID# of the S1 style for the friends view.')");
foreach my $v (qw(lastn day calendar friends)) {
do_sql("INSERT INTO userproplite SELECT u.userid, upl.upropid, u.${v}_style FROM user u, userproplist upl WHERE upl.name='s1_${v}_style'");
}
do_alter("user",
"ALTER TABLE user DROP lastn_style, DROP calendar_style, DROP search_style, DROP searchres_style, DROP day_style, DROP friends_style");
}
# add scope columns to proplist tables
if (column_type("userproplist", "scope") eq "") {
do_alter("userproplist",
"ALTER TABLE userproplist ADD scope ENUM('general', 'local') ".
"DEFAULT 'general' NOT NULL");
}
if (column_type("logproplist", "scope") eq "") {
do_alter("logproplist",
"ALTER TABLE logproplist ADD scope ENUM('general', 'local') ".
"DEFAULT 'general' NOT NULL");
}
if (column_type("talkproplist", "scope") eq "") {
do_alter("talkproplist",
"ALTER TABLE talkproplist ADD scope ENUM('general', 'local') ".
"DEFAULT 'general' NOT NULL");
}
if (column_type("priv_list", "scope") eq "") {
do_alter("priv_list",
"ALTER TABLE priv_list ADD scope ENUM('general', 'local') ".
"DEFAULT 'general' NOT NULL");
}
# change size of stats table to accomodate meme data, and shrink statcat,
# since it's way too big
if (column_type("stats", "statcat") eq "varchar(100)") {
do_alter("stats",
"ALTER TABLE stats ".
"MODIFY statcat VARCHAR(30) NOT NULL, ".
"MODIFY statkey VARCHAR(150) NOT NULL, ".
"MODIFY statval INT UNSIGNED NOT NULL, ".
"DROP INDEX statcat");
}
if (column_type("priv_list", "is_public") eq "") {
do_alter("priv_list",
"ALTER TABLE priv_list ".
"ADD is_public ENUM('1', '0') DEFAULT '1' NOT NULL");
}
if (column_type("randomuserset", "rid") eq "") {
do_alter("randomuserset",
"ALTER TABLE randomuserset DROP PRIMARY KEY, DROP timeupdate, ".
"ADD rid INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (rid)");
}
# cluster stuff!
if (column_type("meme", "journalid") eq "") {
do_alter("meme",
"ALTER TABLE meme ADD journalid INT UNSIGNED NOT NULL AFTER ts");
}
if (column_type("memorable", "jitemid") eq "") {
do_alter("memorable", "ALTER TABLE memorable ".
"DROP INDEX userid, DROP INDEX itemid, ".
"CHANGE itemid jitemid INT UNSIGNED NOT NULL, ".
"ADD journalid INT UNSIGNED NOT NULL AFTER userid, ".
"ADD UNIQUE uniq (userid, journalid, jitemid), ".
"ADD KEY item (journalid, jitemid)");
}
if (column_type("user", "clusterid") eq "") {
do_alter("user", "ALTER TABLE user ".
"ADD clusterid TINYINT UNSIGNED NOT NULL AFTER caps, ".
"ADD dversion TINYINT UNSIGNED NOT NULL AFTER clusterid, ".
"ADD INDEX idxcluster (clusterid), ".
"ADD INDEX idxversion (dversion)");
}
if (column_type("friends", "bgcolor") eq "char(7)") {
do_alter("friends", "ALTER TABLE friends ".
"MODIFY bgcolor CHAR(8) NOT NULL DEFAULT '16777215', ".
"MODIFY fgcolor CHAR(8) NOT NULL DEFAULT '0'");
do_sql("UPDATE friends SET ".
"bgcolor=CONV(RIGHT(bgcolor,6),16,10), ".
"fgcolor=CONV(RIGHT(fgcolor,6),16,10)")
unless skip_opt() eq "colorconv";
}
return if skip_opt() eq "colorconv";
if (column_type("friends", "bgcolor") eq "char(8)") {
do_alter("friends", "ALTER TABLE friends ".
"MODIFY bgcolor MEDIUMINT UNSIGNED NOT NULL DEFAULT 16777215, ".
"MODIFY fgcolor MEDIUMINT UNSIGNED NOT NULL DEFAULT 0");
}
# add the default encoding field, for recoding older pre-Unicode stuff
if (column_type("user", "oldenc") eq "") {
do_alter("user", "ALTER TABLE user ".
"ADD oldenc TINYINT DEFAULT 0 NOT NULL, ".
"MODIFY name CHAR(80) NOT NULL");
}
if (column_type("user", "allow_getpromos") ne "") {
do_alter("user", "ALTER TABLE user DROP allow_getpromos");
}
# widen columns to accomodate larger Unicode names
if (column_type("friendgroup", "groupname") eq "varchar(30)") {
do_alter("friendgroup",
"ALTER TABLE friendgroup ".
"MODIFY groupname VARCHAR(60) NOT NULL");
}
if (column_type("todo", "statusline") eq "varchar(15)") {
do_alter("todo",
"ALTER TABLE todo ".
"MODIFY statusline VARCHAR(40) NOT NULL, " .
"MODIFY subject VARCHAR(100) NOT NULL, " .
"MODIFY des VARCHAR(255) NOT NULL");
}
if (column_type("memorable", "des") eq "varchar(60)") {
do_alter("memorable",
"ALTER TABLE memorable ".
"MODIFY des VARCHAR(150) NOT NULL");
}
if (column_type("keywords", "keyword") eq "varchar(40) binary") {
do_alter("keywords",
"ALTER TABLE keywords ".
"MODIFY keyword VARCHAR(80) BINARY NOT NULL");
}
# change interest.interest key to being unique, if it's not already
{
my $sth = $dbh->prepare("SHOW INDEX FROM interests");
$sth->execute;
while (my $i = $sth->fetchrow_hashref) {
if ($i->{'Key_name'} eq "interest" && $i->{'Non_unique'}) {
do_alter("interests", "ALTER IGNORE TABLE interests ".
"DROP INDEX interest, ADD UNIQUE interest (interest)");
last;
}
}
}
if (column_type("supportcat", "scope") eq "")
{
do_alter("supportcat",
"ALTER IGNORE TABLE supportcat ADD scope ENUM('general', 'local') ".
"NOT NULL DEFAULT 'general', ADD UNIQUE (catkey)");
}
# convert 'all' arguments to '*'
if (table_relevant("priv_map") && !check_dbnote("privcode_all_to_*")) {
# arg isn't keyed, but this table is only a couple thousand rows
do_sql("UPDATE priv_map SET arg='*' WHERE arg='all'");
set_dbnote("privcode_all_to_*", 1);
}
# convert 'wizard' s2 styles to 'wizard-uniq'
if (table_relevant("s2styles") && !check_dbnote("s2style-wizard-update")) {
# set_dbnote will return true if $opt_sql is set and it sets
# the note successfully. only then do we run the wizard updater
set_dbnote("s2style-wizard-update", 1) &&
system("$ENV{'LJHOME'}/bin/upgrading/s2style-wizard-update.pl");
}
# this never ended up being useful, and just freaked people out unnecessarily.
if (column_type("user", "track")) {
do_alter("user", "ALTER TABLE user DROP track");
}
# need more choices (like "Y" for sYndicated journals)
if (column_type("user", "journaltype") =~ /enum/i) {
do_alter("user", "ALTER TABLE user MODIFY journaltype CHAR(1) NOT NULL DEFAULT 'P'");
}
unless (column_type("syndicated", "laststatus")) {
do_alter("syndicated",
"ALTER TABLE syndicated ADD laststatus VARCHAR(80), ADD lastnew DATETIME");
}
# change themedata. key to being unique, if it's not already
unless (index_name("themedata", "UNIQUE:themeid-coltype")) {
do_alter("themedata", "ALTER IGNORE TABLE themedata ".
"DROP KEY themeid, MODIFY coltype VARCHAR(30) NOT NULL, ".
"ADD UNIQUE `thuniq` (themeid, coltype)");
}
unless (column_type("syndicated", "numreaders")) {
do_alter("syndicated",
"ALTER TABLE syndicated ".
"ADD numreaders MEDIUMINT, ADD INDEX (numreaders)");
}
if (column_type("community", "ownerid"))
{
do_alter("community",
"ALTER TABLE community DROP ownerid");
}
# if it exists, but it's the old way, just kill it.
if (column_type("weekuserusage", "ubefore") && ! column_type("weekuserusage", "uafter")) {
do_sql("DROP TABLE weekuserusage");
create_table("weekuserusage");
}
unless (column_type("userproplist", "cldversion")) {
do_alter("userproplist",
"ALTER TABLE userproplist ADD cldversion TINYINT UNSIGNED NOT NULL AFTER indexed");
}
unless (column_type("authactions", "used") &&
index_name("authactions", "INDEX:userid") &&
index_name("authactions", "INDEX:datecreate")) {
do_alter("authactions",
"ALTER TABLE authactions " .
"ADD used enum('Y', 'N') DEFAULT 'N' AFTER arg1, " .
"ADD INDEX(userid), ADD INDEX(datecreate)");
}
unless (column_type("s2styles", "modtime")) {
do_alter("s2styles",
"ALTER TABLE s2styles ADD modtime INT UNSIGNED NOT NULL AFTER name");
}
if (column_type("acctinvite", "reason") eq "varchar(20)") {
do_alter("acctinvite",
"ALTER TABLE acctinvite MODIFY reason VARCHAR(40)");
}
# Add BLOB flag to proplist
unless (column_type("userproplist", "datatype") =~ /blobchar/) {
if (column_type("userproplist", "is_blob")) {
do_alter("userproplist",
"ALTER TABLE userproplist DROP is_blob");
}
do_alter("userproplist",
"ALTER TABLE userproplist MODIFY datatype ENUM('char','num','bool','blobchar') NOT NULL DEFAULT 'char'");
}
if (column_type("challenges", "count") eq "")
{
do_alter("challenges",
"ALTER TABLE challenges ADD ".
"count int(5) UNSIGNED NOT NULL DEFAULT 0 AFTER challenge");
}
if (column_type("userblob", "length") =~ /mediumint/)
{
do_alter("userblob", "ALTER TABLE userblob MODIFY length INT UNSIGNED");
}
unless (index_name("support", "INDEX:requserid")) {
do_alter("support", "ALTER IGNORE TABLE support ADD INDEX (requserid), ADD INDEX (reqemail)");
}
unless (column_type("community", "membership") =~ /moderated/i) {
do_alter("community", "ALTER TABLE community MODIFY COLUMN " .
"membership ENUM('open','closed','moderated') DEFAULT 'open' NOT NULL");
}
if (column_type("userproplist", "multihomed") eq '') {
do_alter("userproplist", "ALTER TABLE userproplist " .
"ADD multihomed ENUM('1', '0') NOT NULL DEFAULT '0' AFTER cldversion");
}
if (index_name("moodthemedata", "INDEX:moodthemeid")) {
do_alter("moodthemedata", "ALTER IGNORE TABLE moodthemedata DROP KEY moodthemeid");
}
if (column_type("userpic2", "flags") eq '') {
do_alter("userpic2", "ALTER TABLE userpic2 " .
"ADD flags tinyint(1) unsigned NOT NULL default 0 AFTER comment, " .
"ADD location enum('blob','disk','mogile') default NULL AFTER flags");
}
if (column_type("userblob", "blobid") =~ /mediumint/) {
do_alter("userblob", "ALTER TABLE userblob MODIFY blobid INT UNSIGNED NOT NULL");
}
if (column_type("counter", "max") =~ /mediumint/) {
do_alter("counter", "ALTER TABLE counter MODIFY max INT UNSIGNED NOT NULL DEFAULT 0");
}
if (column_type("userpic2", "url") eq '') {
do_alter("userpic2", "ALTER TABLE userpic2 " .
"ADD url VARCHAR(255) default NULL AFTER location");
}
unless (column_type("spamreports", "posttime") ne '') {
do_alter("spamreports", "ALTER TABLE spamreports ADD COLUMN posttime INT(10) UNSIGNED " .
"NOT NULL AFTER reporttime, ADD COLUMN state ENUM('open', 'closed') DEFAULT 'open' " .
"NOT NULL AFTER posttime");
}
if (column_type("captchas", "location") eq '') {
do_alter("captchas", "ALTER TABLE captchas " .
"ADD location ENUM('blob','mogile') DEFAULT NULL AFTER type");
}
if (column_type("spamreports", "report_type") eq '') {
do_alter("spamreports", "ALTER TABLE spamreports " .
"ADD report_type ENUM('entry','comment') NOT NULL DEFAULT 'comment' " .
"AFTER posterid");
}
if (column_type("commenturls", "ip") eq '') {
do_alter("commenturls",
"ALTER TABLE commenturls " .
"ADD ip VARCHAR(15) DEFAULT NULL " .
"AFTER journalid");
}
if (column_type("sessions", "exptype") !~ /once/) {
do_alter("sessions",
"ALTER TABLE sessions CHANGE COLUMN exptype ".
"exptype ENUM('short', 'long', 'once') NOT NULL");
}
if (column_type("ml_items", "itid") =~ /auto_increment/) {
do_alter("ml_items",
"ALTER TABLE ml_items MODIFY COLUMN " .
"itid MEDIUMINT UNSIGNED NOT NULL DEFAULT 0");
}
if (column_type("ml_text", "txtid") =~ /auto_increment/) {
do_alter("ml_text",
"ALTER TABLE ml_text MODIFY COLUMN " .
"txtid MEDIUMINT UNSIGNED NOT NULL DEFAULT 0");
}
unless (column_type("syndicated", "oldest_ourdate")) {
do_alter("syndicated",
"ALTER TABLE syndicated ADD oldest_ourdate DATETIME AFTER lastnew");
}
if (column_type("sessions", "userid") =~ /mediumint/) {
do_alter("sessions",
"ALTER TABLE sessions MODIFY COLUMN userid INT UNSIGNED NOT NULL");
}
});
1; # return true