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
captchafix
Floens 11 years ago
parent fc540645aa
commit 4deb9d4616
  1. 75
      Clover/app/src/main/java/org/floens/chan/core/manager/BoardManager.java
  2. 58
      Clover/app/src/main/java/org/floens/chan/core/model/Board.java
  3. 84
      Clover/app/src/main/java/org/floens/chan/core/net/BoardsRequest.java
  4. 48
      Clover/app/src/main/java/org/floens/chan/database/DatabaseHelper.java
  5. 45
      Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java
  6. 91
      docs/boardsjson.txt
  7. 30
      docs/database.txt

@ -42,8 +42,7 @@ public class BoardManager {
private List<Board> allBoards;
private final List<String> savedKeys = new ArrayList<>();
private final List<String> savedValues = new ArrayList<>();
private List<BoardChangeListener> listeners = new ArrayList<>();
public BoardManager() {
loadBoards();
@ -67,14 +66,6 @@ public class BoardManager {
return saved;
}
public List<String> getSavedKeys() {
return savedKeys;
}
public List<String> 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<Board> 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<Board> list) {
boolean changed = false;
for (Board serverBoard : list) {
boolean has = false;
for (Board b : allBoards) {
if (b.valueEquals(serverBoard)) {
private void setBoardsFromServer(List<Board> 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();
}
}

@ -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);
}
}

@ -44,7 +44,10 @@ public class BoardsRequest extends JsonReaderRequest<List<Board>> {
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<List<Board>> {
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<List<Board>> {
reader.endObject();
if (!board.finish()) {
throw new IOException("Invalid data received about boards.");
// Invalid data, ignore
return null;
}
return board;

@ -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<Pin, Integer> pinDao;
public Dao<Loadable, Integer> 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<String, Object> fieldValues = new HashMap<>();
fieldValues.put("value", "f");
List<Board> 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() {

@ -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<String> savedValues = ChanApplication.getBoardManager().getSavedValues();
List<Board> 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<String> keys;
private List<String> values;
private List<Board> 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:

@ -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 │
└───────────────────┴────────────────────────┴─────────────────────────────┴─────────────────────────────────────────────────┘

@ -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;
Loading…
Cancel
Save