From 4deb9d4616e6c907f6d516bfd5b874a3ea60f040 Mon Sep 17 00:00:00 2001 From: Floens Date: Mon, 25 Aug 2014 13:54:09 +0200 Subject: [PATCH] Add logic for new boards.json Add logic to update table with ALTER TABLE New doc to keep track of database changes New doc with boards.json documentation Add BoardChangeListener --- .../chan/core/manager/BoardManager.java | 75 +++++++-------- .../org/floens/chan/core/model/Board.java | 58 ++++++++++-- .../floens/chan/core/net/BoardsRequest.java | 84 ++++++++++++++++- .../floens/chan/database/DatabaseHelper.java | 48 ++++++++-- .../chan/ui/activity/BoardActivity.java | 45 ++++++--- docs/boardsjson.txt | 91 +++++++++++++++++++ docs/database.txt | 30 ++++++ 7 files changed, 354 insertions(+), 77 deletions(-) create mode 100644 docs/boardsjson.txt create mode 100644 docs/database.txt diff --git a/Clover/app/src/main/java/org/floens/chan/core/manager/BoardManager.java b/Clover/app/src/main/java/org/floens/chan/core/manager/BoardManager.java index 10f2e7a7..e3b8e457 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/manager/BoardManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/manager/BoardManager.java @@ -42,8 +42,7 @@ public class BoardManager { private List allBoards; - private final List savedKeys = new ArrayList<>(); - private final List savedValues = new ArrayList<>(); + private List listeners = new ArrayList<>(); public BoardManager() { loadBoards(); @@ -67,14 +66,6 @@ public class BoardManager { return saved; } - public List getSavedKeys() { - return savedKeys; - } - - public List getSavedValues() { - return savedValues; - } - public boolean getBoardExists(String board) { for (Board e : getAllBoards()) { if (e.value.equals(board)) { @@ -85,32 +76,23 @@ public class BoardManager { return false; } - public String getBoardKey(String value) { - for (Board e : allBoards) { - if (e.value.equals(value)) { - return e.key; - } - } - - return null; - } - public void updateSavedBoards() { ChanApplication.getDatabaseManager().updateBoards(allBoards); - reloadSavedKeysValues(); + + notifyChanged(); } - private void reloadSavedKeysValues() { - List saved = getSavedBoards(); + public void addListener(BoardChangeListener listener) { + listeners.add(listener); + } - savedKeys.clear(); - for (Board board : saved) { - savedKeys.add(board.key); - } + public void removeListener(BoardChangeListener listener) { + listeners.remove(listener); + } - savedValues.clear(); - for (Board board : saved) { - savedValues.add(board.value); + private void notifyChanged() { + for (BoardChangeListener l : listeners) { + l.onBoardsChanged(); } } @@ -124,6 +106,7 @@ public class BoardManager { } ChanApplication.getDatabaseManager().setBoards(allBoards); + notifyChanged(); } private void loadBoards() { @@ -133,16 +116,22 @@ public class BoardManager { allBoards = getDefaultBoards(); storeBoards(); } - - reloadSavedKeysValues(); } - private void setBoardsFromServer(List list) { - boolean changed = false; - for (Board serverBoard : list) { - boolean has = false; - for (Board b : allBoards) { - if (b.valueEquals(serverBoard)) { + private void setBoardsFromServer(List serverList) { + boolean has; + for (Board serverBoard : serverList) { + has = false; + for (int i = 0; i < allBoards.size(); i++) { + if (allBoards.get(i).value.equals(serverBoard.value)) { + Logger.d(TAG, "Replaced board " + serverBoard.value + " with the server one"); + + Board old = allBoards.get(i); + serverBoard.id = old.id; + serverBoard.saved = old.saved; + serverBoard.order = old.order; + allBoards.set(i, serverBoard); + has = true; break; } @@ -156,14 +145,10 @@ public class BoardManager { } allBoards.add(serverBoard); - changed = true; } } - if (changed) { - storeBoards(); - reloadSavedKeysValues(); - } + storeBoards(); } private void loadFromServer() { @@ -192,4 +177,8 @@ public class BoardManager { list.add(new Board("International", "int", true, true)); return list; } + + public interface BoardChangeListener { + public void onBoardsChanged(); + } } diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/Board.java b/Clover/app/src/main/java/org/floens/chan/core/model/Board.java index 71558f11..2f9baa10 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/Board.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/Board.java @@ -40,23 +40,65 @@ public class Board { */ @DatabaseField public String key; + /** * Name of the url, e.g. lit */ @DatabaseField public String value; - - @DatabaseField - public boolean workSafe = false; - @DatabaseField public boolean saved = false; - @DatabaseField public int order; + @DatabaseField + public boolean workSafe = false; + @DatabaseField + public int perPage = -1; + @DatabaseField + public int pages = -1; + @DatabaseField + public int maxFileSize = -1; + @DatabaseField + public int maxWebmSize = -1; + @DatabaseField + public int maxCommentChars = -1; + @DatabaseField + public int bumpLimit = -1; + @DatabaseField + public int imageLimit = -1; + @DatabaseField + public int cooldownThreads = -1; + @DatabaseField + public int cooldownReplies = -1; + @DatabaseField + public int cooldownImages = -1; + @DatabaseField + public int cooldownRepliesIntra = -1; + @DatabaseField + public int cooldownImagesIntra = -1; + @DatabaseField + public boolean spoilers = false; + @DatabaseField + public int customSpoilers = -1; + @DatabaseField + public boolean userIds = false; + @DatabaseField + public boolean codeTags = false; + @DatabaseField + public boolean preuploadCaptcha = false; + @DatabaseField + public boolean countryFlags = false; + @DatabaseField + public boolean trollFlags = false; + @DatabaseField + public boolean mathTags = false; public boolean finish() { - if (key == null || value == null) + if (key == null || value == null || perPage < 0 || pages < 0) + return false; + + // Also filters out /f/, it can't be viewed anyway + if (cooldownThreads < 0 || cooldownReplies < 0 || cooldownImages < 0 || cooldownRepliesIntra < 0 || cooldownImagesIntra < 0) return false; return true; @@ -66,8 +108,4 @@ public class Board { public String toString() { return key; } - - public boolean valueEquals(Board other) { - return value.equals(other.value); - } } diff --git a/Clover/app/src/main/java/org/floens/chan/core/net/BoardsRequest.java b/Clover/app/src/main/java/org/floens/chan/core/net/BoardsRequest.java index f9ca9991..3da18890 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/net/BoardsRequest.java +++ b/Clover/app/src/main/java/org/floens/chan/core/net/BoardsRequest.java @@ -44,7 +44,10 @@ public class BoardsRequest extends JsonReaderRequest> { reader.beginArray(); while (reader.hasNext()) { - list.add(readBoardEntry(reader)); + Board board = readBoardEntry(reader); + if (board != null) { + list.add(board); + } } reader.endArray(); @@ -72,16 +75,86 @@ public class BoardsRequest extends JsonReaderRequest> { switch (key) { case "title": - // Post number board.key = reader.nextString(); break; case "board": board.value = reader.nextString(); break; case "ws_board": - if (reader.nextInt() == 1) { - board.workSafe = true; + board.workSafe = reader.nextInt() == 1; + break; + case "per_page": + board.perPage = reader.nextInt(); + break; + case "pages": + board.pages = reader.nextInt(); + break; + case "max_filesize": + board.maxFileSize = reader.nextInt(); + break; + case "max_webm_filesize": + board.maxWebmSize = reader.nextInt(); + break; + case "max_comment_chars": + board.maxCommentChars = reader.nextInt(); + break; + case "bump_limit": + board.bumpLimit = reader.nextInt(); + break; + case "image_limit": + board.imageLimit = reader.nextInt(); + break; + case "cooldowns": + reader.beginObject(); + + while (reader.hasNext()) { + switch (reader.nextName()) { + case "threads": + board.cooldownThreads = reader.nextInt(); + break; + case "replies": + board.cooldownReplies = reader.nextInt(); + break; + case "images": + board.cooldownImages = reader.nextInt(); + break; + case "replies_intra": + board.cooldownRepliesIntra = reader.nextInt(); + break; + case "images_intra": + board.cooldownImagesIntra = reader.nextInt(); + break; + default: + reader.skipValue(); + break; + } } + + reader.endObject(); + break; + case "spoilers": + board.spoilers = reader.nextInt() == 1; + break; + case "custom_spoilers": + board.customSpoilers = reader.nextInt(); + break; + case "user_ids": + board.userIds = reader.nextInt() == 1; + break; + case "code_tags": + board.codeTags = reader.nextInt() == 1; + break; + case "preupload_captcha": + board.preuploadCaptcha = reader.nextInt() == 1; + break; + case "country_flags": + board.countryFlags = reader.nextInt() == 1; + break; + case "troll_flags": + board.trollFlags = reader.nextInt() == 1; + break; + case "math_tags": + board.mathTags = reader.nextInt() == 1; break; default: reader.skipValue(); @@ -92,7 +165,8 @@ public class BoardsRequest extends JsonReaderRequest> { reader.endObject(); if (!board.finish()) { - throw new IOException("Invalid data received about boards."); + // Invalid data, ignore + return null; } return board; diff --git a/Clover/app/src/main/java/org/floens/chan/database/DatabaseHelper.java b/Clover/app/src/main/java/org/floens/chan/database/DatabaseHelper.java index f4b71183..fdac17ba 100644 --- a/Clover/app/src/main/java/org/floens/chan/database/DatabaseHelper.java +++ b/Clover/app/src/main/java/org/floens/chan/database/DatabaseHelper.java @@ -32,12 +32,15 @@ import org.floens.chan.core.model.SavedReply; import org.floens.chan.utils.Logger; import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public class DatabaseHelper extends OrmLiteSqliteOpenHelper { private static final String TAG = "DatabaseHelper"; private static final String DATABASE_NAME = "ChanDB"; - private static final int DATABASE_VERSION = 11; + private static final int DATABASE_VERSION = 12; public Dao pinDao; public Dao loadableDao; @@ -76,12 +79,45 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { @Override public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) { - switch (oldVersion) { - // Change tables if we make adjustments + Logger.i(TAG, "Upgrading database from " + oldVersion + " to " + newVersion); + if (oldVersion < 12) { + try { + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN perPage INTEGER;"); + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN pages INTEGER;"); + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN maxFileSize INTEGER;"); + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN maxWebmSize INTEGER;"); + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN maxCommentChars INTEGER;"); + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN bumpLimit INTEGER;"); + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN imageLimit INTEGER;"); + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN cooldownThreads INTEGER;"); + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN cooldownReplies INTEGER;"); + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN cooldownImages INTEGER;"); + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN cooldownRepliesIntra INTEGER;"); + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN cooldownImagesIntra INTEGER;"); + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN spoilers INTEGER;"); + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN customSpoilers INTEGER;"); + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN userIds INTEGER;"); + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN codeTags INTEGER;"); + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN preuploadCaptcha INTEGER;"); + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN countryFlags INTEGER;"); + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN trollFlags INTEGER;"); + boardsDao.executeRawNoArgs("ALTER TABLE board ADD COLUMN mathTags INTEGER;"); + } catch (SQLException e) { + e.printStackTrace(); + } + + try { + Map fieldValues = new HashMap<>(); + fieldValues.put("value", "f"); + List list = boardsDao.queryForFieldValues(fieldValues); + if (list != null) { + boardsDao.delete(list); + Logger.i(TAG, "Deleted f board"); + } + } catch (SQLException e) { + e.printStackTrace(); + } } - - // Drop the tables and recreate them for now - reset(database, connectionSource); } public void reset() { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java index 997d5ebe..2f40a09c 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java @@ -45,7 +45,9 @@ import org.floens.chan.R; import org.floens.chan.chan.ChanUrls; import org.floens.chan.core.ChanPreferences; import org.floens.chan.core.loader.Loader; +import org.floens.chan.core.manager.BoardManager; import org.floens.chan.core.manager.ThreadManager; +import org.floens.chan.core.model.Board; import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Pin; import org.floens.chan.core.model.Post; @@ -55,7 +57,7 @@ import org.floens.chan.utils.Utils; import java.util.List; -public class BoardActivity extends BaseActivity implements AdapterView.OnItemSelectedListener { +public class BoardActivity extends BaseActivity implements AdapterView.OnItemSelectedListener, BoardManager.BoardChangeListener { private static final String TAG = "BoardActivity"; private Loadable boardLoadable; @@ -71,6 +73,8 @@ public class BoardActivity extends BaseActivity implements AdapterView.OnItemSel protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + ChanApplication.getBoardManager().addListener(this); + boardLoadable = new Loadable(); threadLoadable = new Loadable(); @@ -113,9 +117,9 @@ public class BoardActivity extends BaseActivity implements AdapterView.OnItemSel } if (boardLoadable.mode == Loadable.Mode.INVALID) { - List savedValues = ChanApplication.getBoardManager().getSavedValues(); + List savedValues = ChanApplication.getBoardManager().getSavedBoards(); if (savedValues.size() > 0) { - startLoadingBoard(new Loadable(savedValues.get(0))); + startLoadingBoard(new Loadable(savedValues.get(0).value)); } } } @@ -165,6 +169,13 @@ public class BoardActivity extends BaseActivity implements AdapterView.OnItemSel ChanApplication.getWatchManager().updateDatabase(); } + @Override + protected void onDestroy() { + super.onDestroy(); + + ChanApplication.getBoardManager().removeListener(this); + } + @Override protected void initDrawer() { pinDrawerListener = new ActionBarDrawerToggle(this, pinDrawer, R.drawable.ic_drawer, R.string.drawer_open, @@ -242,6 +253,12 @@ public class BoardActivity extends BaseActivity implements AdapterView.OnItemSel updateActionBarState(); } + @Override + public void onBoardsChanged() { + spinnerAdapter.setBoards(); + spinnerAdapter.notifyDataSetChanged(); + } + private void handleExtraBundle(Bundle extras) { int pinId = extras.getInt("pin_id", -2); if (pinId != -2) { @@ -621,20 +638,22 @@ public class BoardActivity extends BaseActivity implements AdapterView.OnItemSel private Context context; private Spinner spinner; - private List keys; - private List values; + private List boards; private int lastSelectedPosition = 0; public BoardSpinnerAdapter(Context context, Spinner spinner) { this.context = context; this.spinner = spinner; - keys = ChanApplication.getBoardManager().getSavedKeys(); - values = ChanApplication.getBoardManager().getSavedValues(); + setBoards(); + } + + public void setBoards() { + boards = ChanApplication.getBoardManager().getSavedBoards(); } public void setBoard(String boardValue) { - for (int i = 0; i < values.size(); i++) { - if (values.get(i).equals(boardValue)) { + for (int i = 0; i < boards.size(); i++) { + if (boards.get(i).value.equals(boardValue)) { spinner.setSelection(i); return; } @@ -642,8 +661,8 @@ public class BoardActivity extends BaseActivity implements AdapterView.OnItemSel } public void onItemSelected(int position) { - if (position >= 0 && position < values.size()) { - Loadable board = new Loadable(values.get(position)); + if (position >= 0 && position < boards.size()) { + Loadable board = new Loadable(boards.get(position).value); // onItemSelected is called after the view initializes, // ignore if it's the same board @@ -661,7 +680,7 @@ public class BoardActivity extends BaseActivity implements AdapterView.OnItemSel @Override public int getCount() { - return keys.size() + 1; + return boards.size() + 1; } @Override @@ -683,7 +702,7 @@ public class BoardActivity extends BaseActivity implements AdapterView.OnItemSel public String getItem(final int position) { switch (getItemViewType(position)) { case VIEW_TYPE_ITEM: - return keys.get(position); + return boards.get(position).key; case VIEW_TYPE_ADD: return context.getString(R.string.board_select_add); default: diff --git a/docs/boardsjson.txt b/docs/boardsjson.txt new file mode 100644 index 00000000..6288101e --- /dev/null +++ b/docs/boardsjson.txt @@ -0,0 +1,91 @@ +┌───────────────────┬────────────────────────┬─────────────────────────────┬─────────────────────────────────────────────────┐ +│ Key │ Example │ Required? │ Used on │ +│ │ (min - max) │ (usage / total) │ │ +├───────────────────┼────────────────────────┼─────────────────────────────┼─────────────────────────────────────────────────┤ +│ board │ "y" │ Required 63/63 │ 3,a,adv,an,asp,b,biz,c,cgl,ck,cm,co,d,diy,e,f, │ +│ │ │ │ fa,fit,g,gd,gif,h,hc,hm,hr,i,ic,int,jp,k,lgbt, │ +│ │ │ │ lit,m,mlp,mu,n,o,out,p,po,pol,r,r9k,s,s4s,sci, │ +│ │ │ │ soc,sp,t,tg,toy,trv,tv,u,v,vg,vp,vr,w,wg,wsg, │ +│ │ │ │ x,y │ +├───────────────────┼────────────────────────┼─────────────────────────────┼─────────────────────────────────────────────────┤ +│ title │ "Yaoi" │ Required 63/63 │ 3,a,adv,an,asp,b,biz,c,cgl,ck,cm,co,d,diy,e,f, │ +│ │ │ │ fa,fit,g,gd,gif,h,hc,hm,hr,i,ic,int,jp,k,lgbt, │ +│ │ │ │ lit,m,mlp,mu,n,o,out,p,po,pol,r,r9k,s,s4s,sci, │ +│ │ │ │ soc,sp,t,tg,toy,trv,tv,u,v,vg,vp,vr,w,wg,wsg, │ +│ │ │ │ x,y │ +├───────────────────┼────────────────────────┼─────────────────────────────┼─────────────────────────────────────────────────┤ +│ ws_board │ 0 - 1 │ Required 63/63 │ 3,a,adv,an,asp,b,biz,c,cgl,ck,cm,co,d,diy,e,f, │ +│ │ │ │ fa,fit,g,gd,gif,h,hc,hm,hr,i,ic,int,jp,k,lgbt, │ +│ │ │ │ lit,m,mlp,mu,n,o,out,p,po,pol,r,r9k,s,s4s,sci, │ +│ │ │ │ soc,sp,t,tg,toy,trv,tv,u,v,vg,vp,vr,w,wg,wsg, │ +│ │ │ │ x,y │ +├───────────────────┼────────────────────────┼─────────────────────────────┼─────────────────────────────────────────────────┤ +│ per_page │ 15 - 30 │ Required 63/63 │ 3,a,adv,an,asp,b,biz,c,cgl,ck,cm,co,d,diy,e,f, │ +│ │ │ │ fa,fit,g,gd,gif,h,hc,hm,hr,i,ic,int,jp,k,lgbt, │ +│ │ │ │ lit,m,mlp,mu,n,o,out,p,po,pol,r,r9k,s,s4s,sci, │ +│ │ │ │ soc,sp,t,tg,toy,trv,tv,u,v,vg,vp,vr,w,wg,wsg, │ +│ │ │ │ x,y │ +├───────────────────┼────────────────────────┼─────────────────────────────┼─────────────────────────────────────────────────┤ +│ pages │ 1 - 10 │ Required 63/63 │ 3,a,adv,an,asp,b,biz,c,cgl,ck,cm,co,d,diy,e,f, │ +│ │ │ │ fa,fit,g,gd,gif,h,hc,hm,hr,i,ic,int,jp,k,lgbt, │ +│ │ │ │ lit,m,mlp,mu,n,o,out,p,po,pol,r,r9k,s,s4s,sci, │ +│ │ │ │ soc,sp,t,tg,toy,trv,tv,u,v,vg,vp,vr,w,wg,wsg, │ +│ │ │ │ x,y │ +├───────────────────┼────────────────────────┼─────────────────────────────┼─────────────────────────────────────────────────┤ +│ max_filesize │ 2097152 - 8388608 │ Semi-required (/f/ missing) │ 3,a,adv,an,asp,b,biz,c,cgl,ck,cm,co,d,diy,e,fa, │ +│ │ │ 62/63 │ fit,g,gd,gif,h,hc,hm,hr,i,ic,int,jp,k,lgbt,lit, │ +│ │ │ │ m,mlp,mu,n,o,out,p,po,pol,r,r9k,s,s4s,sci,soc, │ +│ │ │ │ sp,t,tg,toy,trv,tv,u,v,vg,vp,vr,w,wg,wsg,x, │ +│ │ │ │ y │ +├───────────────────┼────────────────────────┼─────────────────────────────┼─────────────────────────────────────────────────┤ +│ max_webm_filesize │ 3145728 │ Semi-required (/f/ missing) │ 3,a,adv,an,asp,b,biz,c,cgl,ck,cm,co,d,diy,e,fa, │ +│ │ │ 62/63 │ fit,g,gd,gif,h,hc,hm,hr,i,ic,int,jp,k,lgbt,lit, │ +│ │ │ │ m,mlp,mu,n,o,out,p,po,pol,r,r9k,s,s4s,sci,soc, │ +│ │ │ │ sp,t,tg,toy,trv,tv,u,v,vg,vp,vr,w,wg,wsg,x, │ +│ │ │ │ y │ +├───────────────────┼────────────────────────┼─────────────────────────────┼─────────────────────────────────────────────────┤ +│ max_comment_chars │ 2000 - 3000 │ Semi-required (/f/ missing) │ 3,a,adv,an,asp,b,biz,c,cgl,ck,cm,co,d,diy,e,fa, │ +│ │ │ 62/63 │ fit,g,gd,gif,h,hc,hm,hr,i,ic,int,jp,k,lgbt,lit, │ +│ │ │ │ m,mlp,mu,n,o,out,p,po,pol,r,r9k,s,s4s,sci,soc, │ +│ │ │ │ sp,t,tg,toy,trv,tv,u,v,vg,vp,vr,w,wg,wsg,x, │ +│ │ │ │ y │ +├───────────────────┼────────────────────────┼─────────────────────────────┼─────────────────────────────────────────────────┤ +│ bump_limit │ 300 - 750 │ Semi-required (/f/ missing) │ 3,a,adv,an,asp,b,biz,c,cgl,ck,cm,co,d,diy,e,fa, │ +│ │ │ 62/63 │ fit,g,gd,gif,h,hc,hm,hr,i,ic,int,jp,k,lgbt,lit, │ +│ │ │ │ m,mlp,mu,n,o,out,p,po,pol,r,r9k,s,s4s,sci,soc, │ +│ │ │ │ sp,t,tg,toy,trv,tv,u,v,vg,vp,vr,w,wg,wsg,x, │ +│ │ │ │ y │ +├───────────────────┼────────────────────────┼─────────────────────────────┼─────────────────────────────────────────────────┤ +│ image_limit │ 150 - 300 │ Semi-required (/f/ missing) │ 3,a,adv,an,asp,b,biz,c,cgl,ck,cm,co,d,diy,e,fa, │ +│ │ │ 62/63 │ fit,g,gd,gif,h,hc,hm,hr,i,ic,int,jp,k,lgbt,lit, │ +│ │ │ │ m,mlp,mu,n,o,out,p,po,pol,r,r9k,s,s4s,sci,soc, │ +│ │ │ │ sp,t,tg,toy,trv,tv,u,v,vg,vp,vr,w,wg,wsg,x, │ +│ │ │ │ y │ +├───────────────────┼────────────────────────┼─────────────────────────────┼─────────────────────────────────────────────────┤ +│ cooldowns │ { │ Semi-required (/f/ missing) │ 3,a,adv,an,asp,b,biz,c,cgl,ck,cm,co,d,diy,e,fa, │ +│ │ "threads": 600, │ 62/63 │ fit,g,gd,gif,h,hc,hm,hr,i,ic,int,jp,k,lgbt,lit, │ +│ │ "replies": 60, │ │ m,mlp,mu,n,o,out,p,po,pol,r,r9k,s,s4s,sci,soc, │ +│ │ "images": 60, │ │ sp,t,tg,toy,trv,tv,u,v,vg,vp,vr,w,wg,wsg,x, │ +│ │ "replies_intra": 60, │ │ y │ +│ │ "images_intra": 30 │ │ │ +│ │ } │ │ │ +├───────────────────┼────────────────────────┼─────────────────────────────┼─────────────────────────────────────────────────┤ +│ spoilers │ 1 │ Optional 14/63 │ a,co,jp,lit,m,mlp,r9k,tg,tv,u,v,vg,vp,vr │ +├───────────────────┼────────────────────────┼─────────────────────────────┼─────────────────────────────────────────────────┤ +│ custom_spoilers │ 1 - 5 │ Optional 12/63 │ a,co,jp,lit,m,mlp,tg,tv,v,vg,vp,vr │ +├───────────────────┼────────────────────────┼─────────────────────────────┼─────────────────────────────────────────────────┤ +│ user_ids │ 1 │ Optional 3/63 │ b,biz,soc │ +├───────────────────┼────────────────────────┼─────────────────────────────┼─────────────────────────────────────────────────┤ +│ code_tags │ 1 │ Optional 1/63 │ g │ +├───────────────────┼────────────────────────┼─────────────────────────────┼─────────────────────────────────────────────────┤ +│ preupload_captcha │ 1 │ Optional 1/63 │ hr │ +├───────────────────┼────────────────────────┼─────────────────────────────┼─────────────────────────────────────────────────┤ +│ country_flags │ 1 │ Optional 2/63 │ int,sp │ +├───────────────────┼────────────────────────┼─────────────────────────────┼─────────────────────────────────────────────────┤ +│ troll_flags │ 1 │ Optional 1/63 │ pol │ +├───────────────────┼────────────────────────┼─────────────────────────────┼─────────────────────────────────────────────────┤ +│ math_tags │ 1 │ Optional 1/63 │ sci │ +└───────────────────┴────────────────────────┴─────────────────────────────┴─────────────────────────────────────────────────┘ + + + diff --git a/docs/database.txt b/docs/database.txt new file mode 100644 index 00000000..c700052c --- /dev/null +++ b/docs/database.txt @@ -0,0 +1,30 @@ +Database version 11: +CREATE TABLE android_metadata (locale TEXT); +CREATE TABLE `board` (`key` VARCHAR , `value` VARCHAR , `id` INTEGER PRIMARY KEY AUTOINCREMENT , `order` INTEGER , `saved` SMALLINT , `workSafe` SMALLINT ); +CREATE TABLE `loadable` (`board` VARCHAR , `title` VARCHAR , `id` INTEGER PRIMARY KEY AUTOINCREMENT , `listViewIndex` INTEGER , `listViewTop` INTEGER , `mode` INTEGER , `no` INTEGER ); +CREATE TABLE `pin` (`loadable_id` INTEGER NOT NULL , `id` INTEGER PRIMARY KEY AUTOINCREMENT , `quoteLastCount` INTEGER , `quoteNewCount` INTEGER , `watchLastCount` INTEGER , `watchNewCount` INTEGER , `watching` SMALLINT ); +CREATE TABLE `savedreply` (`board` VARCHAR , `password` VARCHAR , `id` INTEGER PRIMARY KEY AUTOINCREMENT , `no` INTEGER ); + + +Changes in version 12: +ALTER TABLE board ADD COLUMN perPage INTEGER; +ALTER TABLE board ADD COLUMN pages INTEGER; +ALTER TABLE board ADD COLUMN maxFileSize INTEGER; +ALTER TABLE board ADD COLUMN maxWebmSize INTEGER; +ALTER TABLE board ADD COLUMN maxCommentChars INTEGER; +ALTER TABLE board ADD COLUMN bumpLimit INTEGER; +ALTER TABLE board ADD COLUMN imageLimit INTEGER; +ALTER TABLE board ADD COLUMN cooldownThreads INTEGER; +ALTER TABLE board ADD COLUMN cooldownReplies INTEGER; +ALTER TABLE board ADD COLUMN cooldownImages INTEGER; +ALTER TABLE board ADD COLUMN cooldownRepliesIntra INTEGER; +ALTER TABLE board ADD COLUMN cooldownImagesIntra INTEGER; +ALTER TABLE board ADD COLUMN spoilers INTEGER; +ALTER TABLE board ADD COLUMN customSpoilers INTEGER; +ALTER TABLE board ADD COLUMN userIds INTEGER; +ALTER TABLE board ADD COLUMN codeTags INTEGER; +ALTER TABLE board ADD COLUMN preuploadCaptcha INTEGER; +ALTER TABLE board ADD COLUMN countryFlags INTEGER; +ALTER TABLE board ADD COLUMN trollFlags INTEGER; +ALTER TABLE board ADD COLUMN mathTags INTEGER; +