From 0c0ea8897e64461b1cfa9cd86a939b48f0bdd640 Mon Sep 17 00:00:00 2001
From: Vitaly Takmazov
Date: Sat, 3 Dec 2022 15:28:06 +0300
Subject: Initial PostgreSQL schema and profile
---
pom.xml | 25 +
.../java/com/juick/service/MessagesService.java | 3 +-
.../com/juick/service/MessagesServiceImpl.java | 206 ++-
.../com/juick/service/PushQueriesServiceImpl.java | 3 +-
.../com/juick/service/SubscriptionServiceImpl.java | 30 +-
.../java/com/juick/service/TagServiceImpl.java | 67 +-
.../java/com/juick/service/UserServiceImpl.java | 2 +-
src/main/resources/application-postgres.properties | 1 +
src/main/resources/application.properties | 1 +
.../db/migration/V1.00__initial_schema.sql | 380 -----
.../db/migration/V1.10__favorites_user_uri.sql | 3 -
.../V1.11__increase pm timestamp precision.sql | 1 -
..._drop unused columns add ts for some tables.sql | 4 +-
.../resources/db/migration/V1.16__last seen.sql | 2 -
...se messages and replies timestamp precision.sql | 5 -
.../db/migration/V1.19__messages_properties.sql | 6 -
.../V1.20__reply id in messages_properties.sql | 1 -
...eate messages_properties with correct index.sql | 8 -
.../V1.22__increase updated_at precision.sql | 2 -
.../db/migration/V1.2__Drop telegram_chats.sql | 2 -
...V1.3__Nullable user_id column in auth table.sql | 1 -
.../db/migration/V1.4__ActivityPub followers.sql | 7 -
.../db/migration/V1.5__Drop acct index.sql | 6 -
src/main/resources/db/migration/V1.6__user_uri.sql | 1 -
.../resources/db/migration/V1.7__reply_uri.sql | 1 -
.../resources/db/migration/V1.8__html reply.sql | 1 -
.../db/specific/h2/V1.00__initial_schema.sql | 380 +++++
.../db/specific/h2/V1.10__favorites_user_uri.sql | 3 +
.../h2/V1.11__increase pm timestamp precision.sql | 1 +
.../resources/db/specific/h2/V1.16__last seen.sql | 2 +
...se messages and replies timestamp precision.sql | 5 +
.../db/specific/h2/V1.19__messages_properties.sql | 6 +
.../h2/V1.20__reply id in messages_properties.sql | 1 +
...eate messages_properties with correct index.sql | 8 +
.../h2/V1.22__increase updated_at precision.sql | 2 +
.../db/specific/h2/V1.2__Drop telegram_chats.sql | 2 +
...V1.3__Nullable user_id column in auth table.sql | 1 +
.../db/specific/h2/V1.4__ActivityPub followers.sql | 7 +
.../db/specific/h2/V1.5__Drop acct index.sql | 6 +
.../resources/db/specific/h2/V1.6__user_uri.sql | 1 +
.../resources/db/specific/h2/V1.7__reply_uri.sql | 1 +
.../resources/db/specific/h2/V1.8__html reply.sql | 1 +
.../specific/mariadb/V1.10__favorites_user_uri.sql | 3 +
.../V1.11__increase pm timestamp precision.sql | 1 +
.../db/specific/mariadb/V1.16__last seen.sql | 2 +
...se messages and replies timestamp precision.sql | 5 +
.../mariadb/V1.19__messages_properties.sql | 6 +
.../V1.20__reply id in messages_properties.sql | 1 +
...eate messages_properties with correct index.sql | 8 +
.../V1.22__increase updated_at precision.sql | 2 +
.../specific/mariadb/V1.2__Drop telegram_chats.sql | 2 +
...V1.3__Nullable user_id column in auth table.sql | 1 +
.../mariadb/V1.4__ActivityPub followers.sql | 7 +
.../db/specific/mariadb/V1.5__Drop acct index.sql | 6 +
.../db/specific/mariadb/V1.6__user_uri.sql | 1 +
.../db/specific/mariadb/V1.7__reply_uri.sql | 1 +
.../db/specific/mariadb/V1.8__html reply.sql | 1 +
.../postgresql/V1.10__favorites_user_uri.sql | 3 +
.../V1.11__increase pm timestamp precision.sql | 1 +
.../db/specific/postgresql/V1.16__last seen.sql | 2 +
...ssages and replies timestamp precision copy.sql | 3 +
.../postgresql/V1.19__messages_properties.sql | 6 +
.../V1.20__reply id in messages_properties.sql | 1 +
...eate messages_properties with correct index.sql | 8 +
.../V1.22__increase updated_at precision.sql | 1 +
.../postgresql/V1.2__Drop telegram_chats.sql | 3 +
...V1.3__Nullable user_id column in auth table.sql | 1 +
.../postgresql/V1.4__ActivityPub followers.sql | 5 +
.../specific/postgresql/V1.5__Drop acct index.sql | 6 +
.../db/specific/postgresql/V1.6__user_uri.sql | 1 +
.../db/specific/postgresql/V1.7__reply_uri.sql | 1 +
.../db/specific/postgresql/V1.8__html reply.sql | 1 +
src/main/resources/pg_schema_wip | 1539 --------------------
.../java/com/juick/server/tests/ServerTests.java | 21 +-
src/test/resources/schema-postgres.sql | 1516 +++++++++++++++++++
75 files changed, 2266 insertions(+), 2096 deletions(-)
create mode 100644 src/main/resources/application-postgres.properties
delete mode 100644 src/main/resources/db/migration/V1.00__initial_schema.sql
delete mode 100644 src/main/resources/db/migration/V1.10__favorites_user_uri.sql
delete mode 100644 src/main/resources/db/migration/V1.11__increase pm timestamp precision.sql
delete mode 100644 src/main/resources/db/migration/V1.16__last seen.sql
delete mode 100644 src/main/resources/db/migration/V1.18__increase messages and replies timestamp precision.sql
delete mode 100644 src/main/resources/db/migration/V1.19__messages_properties.sql
delete mode 100644 src/main/resources/db/migration/V1.20__reply id in messages_properties.sql
delete mode 100644 src/main/resources/db/migration/V1.21__recreate messages_properties with correct index.sql
delete mode 100644 src/main/resources/db/migration/V1.22__increase updated_at precision.sql
delete mode 100644 src/main/resources/db/migration/V1.2__Drop telegram_chats.sql
delete mode 100644 src/main/resources/db/migration/V1.3__Nullable user_id column in auth table.sql
delete mode 100644 src/main/resources/db/migration/V1.4__ActivityPub followers.sql
delete mode 100644 src/main/resources/db/migration/V1.5__Drop acct index.sql
delete mode 100644 src/main/resources/db/migration/V1.6__user_uri.sql
delete mode 100644 src/main/resources/db/migration/V1.7__reply_uri.sql
delete mode 100644 src/main/resources/db/migration/V1.8__html reply.sql
create mode 100644 src/main/resources/db/specific/h2/V1.00__initial_schema.sql
create mode 100644 src/main/resources/db/specific/h2/V1.10__favorites_user_uri.sql
create mode 100644 src/main/resources/db/specific/h2/V1.11__increase pm timestamp precision.sql
create mode 100644 src/main/resources/db/specific/h2/V1.16__last seen.sql
create mode 100644 src/main/resources/db/specific/h2/V1.18__increase messages and replies timestamp precision.sql
create mode 100644 src/main/resources/db/specific/h2/V1.19__messages_properties.sql
create mode 100644 src/main/resources/db/specific/h2/V1.20__reply id in messages_properties.sql
create mode 100644 src/main/resources/db/specific/h2/V1.21__recreate messages_properties with correct index.sql
create mode 100644 src/main/resources/db/specific/h2/V1.22__increase updated_at precision.sql
create mode 100644 src/main/resources/db/specific/h2/V1.2__Drop telegram_chats.sql
create mode 100644 src/main/resources/db/specific/h2/V1.3__Nullable user_id column in auth table.sql
create mode 100644 src/main/resources/db/specific/h2/V1.4__ActivityPub followers.sql
create mode 100644 src/main/resources/db/specific/h2/V1.5__Drop acct index.sql
create mode 100644 src/main/resources/db/specific/h2/V1.6__user_uri.sql
create mode 100644 src/main/resources/db/specific/h2/V1.7__reply_uri.sql
create mode 100644 src/main/resources/db/specific/h2/V1.8__html reply.sql
create mode 100644 src/main/resources/db/specific/mariadb/V1.10__favorites_user_uri.sql
create mode 100644 src/main/resources/db/specific/mariadb/V1.11__increase pm timestamp precision.sql
create mode 100644 src/main/resources/db/specific/mariadb/V1.16__last seen.sql
create mode 100644 src/main/resources/db/specific/mariadb/V1.18__increase messages and replies timestamp precision.sql
create mode 100644 src/main/resources/db/specific/mariadb/V1.19__messages_properties.sql
create mode 100644 src/main/resources/db/specific/mariadb/V1.20__reply id in messages_properties.sql
create mode 100644 src/main/resources/db/specific/mariadb/V1.21__recreate messages_properties with correct index.sql
create mode 100644 src/main/resources/db/specific/mariadb/V1.22__increase updated_at precision.sql
create mode 100644 src/main/resources/db/specific/mariadb/V1.2__Drop telegram_chats.sql
create mode 100644 src/main/resources/db/specific/mariadb/V1.3__Nullable user_id column in auth table.sql
create mode 100644 src/main/resources/db/specific/mariadb/V1.4__ActivityPub followers.sql
create mode 100644 src/main/resources/db/specific/mariadb/V1.5__Drop acct index.sql
create mode 100644 src/main/resources/db/specific/mariadb/V1.6__user_uri.sql
create mode 100644 src/main/resources/db/specific/mariadb/V1.7__reply_uri.sql
create mode 100644 src/main/resources/db/specific/mariadb/V1.8__html reply.sql
create mode 100644 src/main/resources/db/specific/postgresql/V1.10__favorites_user_uri.sql
create mode 100644 src/main/resources/db/specific/postgresql/V1.11__increase pm timestamp precision.sql
create mode 100644 src/main/resources/db/specific/postgresql/V1.16__last seen.sql
create mode 100644 src/main/resources/db/specific/postgresql/V1.18__increase messages and replies timestamp precision copy.sql
create mode 100644 src/main/resources/db/specific/postgresql/V1.19__messages_properties.sql
create mode 100644 src/main/resources/db/specific/postgresql/V1.20__reply id in messages_properties.sql
create mode 100644 src/main/resources/db/specific/postgresql/V1.21__recreate messages_properties with correct index.sql
create mode 100644 src/main/resources/db/specific/postgresql/V1.22__increase updated_at precision.sql
create mode 100644 src/main/resources/db/specific/postgresql/V1.2__Drop telegram_chats.sql
create mode 100644 src/main/resources/db/specific/postgresql/V1.3__Nullable user_id column in auth table.sql
create mode 100644 src/main/resources/db/specific/postgresql/V1.4__ActivityPub followers.sql
create mode 100644 src/main/resources/db/specific/postgresql/V1.5__Drop acct index.sql
create mode 100644 src/main/resources/db/specific/postgresql/V1.6__user_uri.sql
create mode 100644 src/main/resources/db/specific/postgresql/V1.7__reply_uri.sql
create mode 100644 src/main/resources/db/specific/postgresql/V1.8__html reply.sql
delete mode 100644 src/main/resources/pg_schema_wip
create mode 100644 src/test/resources/schema-postgres.sql
diff --git a/pom.xml b/pom.xml
index 54fa8d0e..0e0b6f66 100644
--- a/pom.xml
+++ b/pom.xml
@@ -372,6 +372,25 @@
mysql
+
+
+ org.flywaydb
+ flyway-mysql
+
+
+
+
+ postgres
+
+
+ org.postgresql
+ postgresql
+ runtime
+
+
+
+ postgres
+
production
@@ -390,5 +409,11 @@
+
+ local
+
+ local
+
+
diff --git a/src/main/java/com/juick/service/MessagesService.java b/src/main/java/com/juick/service/MessagesService.java
index 0a881924..274d4f30 100644
--- a/src/main/java/com/juick/service/MessagesService.java
+++ b/src/main/java/com/juick/service/MessagesService.java
@@ -25,6 +25,7 @@ import com.juick.model.Tag;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
+import org.springframework.lang.NonNull;
import java.net.URI;
import java.util.*;
@@ -34,7 +35,7 @@ import java.util.*;
*/
public interface MessagesService {
@CacheEvict(value = { "discover", "discussions", "messages", "replies" }, allEntries = true)
- int createMessage(int uid, String txt, String attachment, Set tags);
+ int createMessage(int uid, String txt, String attachment, @NonNull Set tags);
@CacheEvict(value = { "discover", "discussions", "messages", "replies" }, allEntries = true)
int createReply(int mid, int rid, User user, String txt, String attachment);
diff --git a/src/main/java/com/juick/service/MessagesServiceImpl.java b/src/main/java/com/juick/service/MessagesServiceImpl.java
index 8251217f..c5037c31 100644
--- a/src/main/java/com/juick/service/MessagesServiceImpl.java
+++ b/src/main/java/com/juick/service/MessagesServiceImpl.java
@@ -38,18 +38,18 @@ import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
+import org.springframework.lang.NonNull;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
-import javax.annotation.Nonnull;
import javax.inject.Inject;
import java.net.URI;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
-import java.sql.Types;
import java.time.Instant;
+import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
@@ -63,6 +63,8 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
@Inject
private UserService userService;
@Inject
+ private TagService tagService;
+ @Inject
private SearchService searchService;
@Inject
private StorageService storageService;
@@ -93,8 +95,8 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
msg.setReplies(rs.getInt(10));
msg.setAttachmentType(rs.getString(11));
msg.Hidden = rs.getBoolean(13);
- String tagsStr = StringUtils.defaultString(rs.getString(14));
- msg.setTags(MessageUtils.parseTags(tagsStr));
+ msg.setTags(tagService.getMessageTags(msg.getMid()).stream()
+ .map(tag -> tag.getTag()).collect(Collectors.toSet()));
msg.setRepliesBy(rs.getString(15));
msg.setText(rs.getString(16));
msg.setReplyQuote(MessageUtils.formatQuote(rs.getString(17)));
@@ -132,17 +134,17 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
*/
@Transactional
@Override
- public int createMessage(final int uid, final String txt, final String attachment, @Nonnull final Set tags) {
+ public int createMessage(final int uid, final String txt, final String attachment, @NonNull final Set tags) {
SimpleJdbcInsert simpleJdbcInsert = new SimpleJdbcInsert(getJdbcTemplate()).withTableName("messages")
.usingColumns("user_id", "attach", "ts", "readonly").usingGeneratedKeyColumns("message_id");
- Map insertMap = new HashMap<>();
- insertMap.put("user_id", uid);
- Instant now = Instant.now();
- insertMap.put("ts", Timestamp.from(now));
+ var insertMap = new MapSqlParameterSource();
+ insertMap.addValue("user_id", uid);
+ var now = Instant.now();
+ insertMap.addValue("ts", now.atOffset(ZoneOffset.UTC), java.sql.Types.TIMESTAMP_WITH_TIMEZONE);
if (StringUtils.isNotEmpty(attachment)) {
- insertMap.put("attach", attachment);
+ insertMap.addValue("attach", attachment);
}
- insertMap.put("readonly", TagUtils.hasTag(tags, "readonly"));
+ insertMap.addValue("readonly", TagUtils.hasTag(tags, "readonly"));
int mid = simpleJdbcInsert.executeAndReturnKey(insertMap).intValue();
if (mid > 0) {
if (CollectionUtils.isNotEmpty(tags)) {
@@ -150,7 +152,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
getJdbcTemplate().batchUpdate("INSERT INTO messages_tags(message_id, tag_id) VALUES (?, ?)",
new BatchPreparedStatementSetter() {
@Override
- public void setValues(@Nonnull PreparedStatement ps, int i) throws SQLException {
+ public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setInt(1, mid);
ps.setInt(2, newTags.get(i).TID);
}
@@ -161,13 +163,22 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
}
});
}
- getJdbcTemplate().update("INSERT INTO messages_txt(message_id, txt, updated_at) VALUES (?, ?, ?)",
- new Object[] { mid, txt, Timestamp.from(now) },
- new int[] { Types.INTEGER, Types.VARCHAR, Types.TIMESTAMP });
- getJdbcTemplate().update("UPDATE users SET lastmessage=?, last_seen=? where id=?", Timestamp.from(now),
- Timestamp.from(now), uid);
+ getNamedParameterJdbcTemplate()
+ .update("INSERT INTO messages_txt(message_id, txt, updated_at) VALUES (:mid, :txt, :now)",
+ new MapSqlParameterSource()
+ .addValue("mid", mid)
+ .addValue("txt", txt)
+ .addValue("now", now.atOffset(ZoneOffset.UTC),
+ java.sql.Types.TIMESTAMP_WITH_TIMEZONE));
+ getNamedParameterJdbcTemplate()
+ .update("UPDATE users SET lastmessage=:lastmessage, last_seen=:last_seen where id=:uid",
+ new MapSqlParameterSource()
+ .addValue("lastmessage", now.atOffset(ZoneOffset.UTC),
+ java.sql.Types.TIMESTAMP_WITH_TIMEZONE)
+ .addValue("last_seen", now.atOffset(ZoneOffset.UTC),
+ java.sql.Types.TIMESTAMP_WITH_TIMEZONE)
+ .addValue("uid", uid));
}
-
return mid;
}
@@ -187,16 +198,40 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
public int createReply(final int mid, final int rid, final User user, final String txt, final String attachment) {
int ridnew = getReplyIDIncrement(mid, user.getUid());
if (ridnew > 0) {
- Timestamp ts = Timestamp.from(Instant.now());
- getJdbcTemplate().update(
- "INSERT INTO replies(message_id, reply_id, user_id, replyto, attach, txt, ts, updated_at, user_uri) "
- + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
- mid, ridnew, user.getUid(), rid, attachment, txt, ts, ts, user.getUri().toASCIIString());
-
- getJdbcTemplate().update("UPDATE messages SET replies = replies + 1, updated=? WHERE message_id = ?", ts,
- mid);
+ var now = Instant.now();
+ getNamedParameterJdbcTemplate()
+ .update(
+ "INSERT INTO replies(message_id, reply_id, user_id, replyto, attach, txt, ts, updated_at, user_uri) "
+ + "VALUES (:mid, :rid, :uid, :replyto, :attach, :txt, :ts, :updated_at, :user_uri)",
+ new MapSqlParameterSource()
+ .addValue("mid", mid)
+ .addValue("rid", ridnew)
+ .addValue("uid", user.getUid())
+ .addValue("replyto", rid)
+ .addValue("attach", attachment)
+ .addValue("txt", txt)
+ .addValue("ts", now.atOffset(ZoneOffset.UTC),
+ java.sql.Types.TIMESTAMP_WITH_TIMEZONE)
+ .addValue("updated_at", now.atOffset(ZoneOffset.UTC),
+ java.sql.Types.TIMESTAMP_WITH_TIMEZONE)
+ .addValue("user_uri", user.getUri().toASCIIString()));
+
+ getNamedParameterJdbcTemplate()
+ .update(
+ "UPDATE messages SET replies = replies + 1, updated=:updated WHERE message_id = :message_id",
+ new MapSqlParameterSource()
+ .addValue("updated", now.atOffset(ZoneOffset.UTC),
+ java.sql.Types.TIMESTAMP_WITH_TIMEZONE)
+ .addValue("message_id", mid));
setLastReadComment(user, mid, ridnew);
- getJdbcTemplate().update("UPDATE users SET lastmessage=?, last_seen=? where id=?", ts, ts, user.getUid());
+ getNamedParameterJdbcTemplate()
+ .update("UPDATE users SET lastmessage=:lastmessage, last_seen=:last_seen where id=:uid",
+ new MapSqlParameterSource()
+ .addValue("lastmessage", now.atOffset(ZoneOffset.UTC),
+ java.sql.Types.TIMESTAMP_WITH_TIMEZONE)
+ .addValue("last_seen", now.atOffset(ZoneOffset.UTC),
+ java.sql.Types.TIMESTAMP_WITH_TIMEZONE)
+ .addValue("uid", user.getUid()));
}
return ridnew;
}
@@ -205,7 +240,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
return getJdbcTemplate().execute((ConnectionCallback) conn -> {
conn.setAutoCommit(false);
int replyNo;
- final int readOnly;
+ final boolean readOnly;
final int userId;
try (PreparedStatement ps = conn.prepareStatement(
"SELECT maxreplyid+1, readonly, user_id FROM messages WHERE message_id=? FOR UPDATE")) {
@@ -213,7 +248,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
try (ResultSet resultSet = ps.executeQuery()) {
if (resultSet.next()) {
replyNo = resultSet.getInt(1);
- readOnly = resultSet.getInt(2);
+ readOnly = resultSet.getBoolean(2);
userId = resultSet.getInt(3);
} else {
throw new IncorrectResultSizeDataAccessException(
@@ -222,7 +257,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
}
}
// author can reply to his readonly post
- if (readOnly == 0 || uid == userId) {
+ if (!readOnly || uid == userId) {
try (PreparedStatement ps = conn
.prepareStatement("UPDATE messages SET maxreplyid=? WHERE message_id=?")) {
ps.setInt(1, replyNo);
@@ -308,7 +343,8 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
}
}
boolean wasAdded = getJdbcTemplate().update(
- "INSERT INTO favorites(user_id, message_id, ts, like_id, user_uri) VALUES (?, ?, NOW(), ?, ?)", vuid,
+ "INSERT INTO favorites(user_id, message_id, ts, like_id, user_uri) VALUES (?, ?, NOW(), ?, ?)",
+ vuid,
mid, reaction, userUri) == 1;
if (wasAdded) {
return RecommendStatus.Added;
@@ -377,7 +413,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
+ "messages.user_id as uid, users.nick, users.banned as banned, " + "" + "messages.ts,"
+ "messages.readonly, messages.privacy, messages.replies,"
+ "messages.attach, COUNT(DISTINCT favorites.user_id) as likes, messages.hidden,"
- + "GROUP_CONCAT(tags.name SEPARATOR ' '), txt.repliesby, txt.txt, '' as q, messages.updated as updated, 0 as to_uid, "
+ + "'' as tags, txt.repliesby, txt.txt, '' as q, messages.updated as updated, 0 as to_uid, "
+ "NULL as to_name, txt.updated_at, '' as reply_user_uri, '' as to_uri, '' as reply_uri, 0 as html, 0 as unread FROM messages "
+ "INNER JOIN users ON messages.user_id = users.id " + "INNER JOIN messages_txt AS txt "
+ "ON messages.message_id = txt.message_id " + "LEFT JOIN favorites "
@@ -386,7 +422,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
+ "LEFT JOIN tags ON tags.tag_id=messages_tags.tag_id "
+ "WHERE messages.message_id = ? AND users.banned = 0 "
+ "GROUP BY mid, rid, replyto, uid, nick, banned, messages.ts, readonly, "
- + "privacy, replies, attach, repliesby, q, updated_at, reply_user_uri, to_uri, reply_uri, html, unread",
+ + "privacy, replies, attach, repliesby, q, txt.txt, updated_at, reply_user_uri, to_uri, reply_uri, html, unread",
new MessageMapper(), mid);
if (!list.isEmpty()) {
final Message message = list.get(0);
@@ -407,7 +443,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
@Override
public Message getReply(final int mid, final int rid) {
List list = getJdbcTemplate().query("SELECT replies.user_id, users.nick,"
- + "replies.replyto, replies.ts," + "replies.attach, replies.txt, IFNULL(q.txt,t.txt) as quote, "
+ + "replies.replyto, replies.ts," + "replies.attach, replies.txt, COALESCE(q.txt,t.txt) as quote, "
+ "COALESCE(q.user_id, m.user_id) AS to_uid, COALESCE(qu.nick, mu.nick) AS to_name, "
+ "replies.updated_at, replies.user_uri as uri, "
+ "q.user_uri AS to_uri, replies.reply_uri AS reply_uri, replies.html, q.reply_uri "
@@ -774,30 +810,30 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
if (CollectionUtils.isNotEmpty(mids)) {
var query = "WITH RECURSIVE banned(message_id, reply_id) "
- + "AS (SELECT message_id, reply_id FROM replies WHERE replies.message_id IN (:ids) "
- + "AND (EXISTS (SELECT 1 FROM bl_users b WHERE b.user_id = :uid AND b.bl_user_id = replies.user_id) "
- + "OR EXISTS (SELECT 1 from users u WHERE u.banned = 1 and u.id = replies.user_id and u.id <> :uid)) "
- + "UNION ALL SELECT replies.message_id, replies.reply_id FROM replies INNER JOIN banned "
- + "ON banned.reply_id = replies.replyto AND replies.reply_id != replies.replyto AND banned.message_id=replies.message_id "
- + "WHERE replies.message_id IN (:ids)) " + "SELECT messages.message_id, 0 as rid, 0 as replyto, "
- + "messages.user_id,users.nick, 0 as usr_banned, " + "messages.ts,"
- + "messages.readonly,messages.privacy, messages.replies-COUNT(DISTINCT banned.reply_id) as replies,"
- + "messages.attach,COUNT(DISTINCT favorites.user_id) AS likes,messages.hidden,"
- + "GROUP_CONCAT(DISTINCT tags.name SEPARATOR ' '), messages_txt.repliesby, messages_txt.txt, '' as q, "
- + "messages.updated, 0 as to_uid, NULL as to_name, messages_txt.updated_at, '' as m_user_uri, "
- + "'' as to_uri, '' as msg_reply_uri, 0 as html, cast(messages.replies as signed)-cast(subscr_messages.last_read_rid as signed) > 0 as unread "
- + "FROM (messages INNER JOIN messages_txt " + "ON messages.message_id=messages_txt.message_id) "
- + "INNER JOIN users ON messages.user_id=users.id " + "LEFT JOIN subscr_messages "
- + "ON messages.message_id=subscr_messages.message_id AND subscr_messages.suser_id=:uid "
- + "LEFT JOIN favorites " + "ON messages.message_id = favorites.message_id AND favorites.like_id=1 "
- + "LEFT JOIN banned " + "ON messages.message_id = banned.message_id "
- + "LEFT JOIN messages_tags ON messages_tags.message_id=messages_txt.message_id "
- + "LEFT JOIN tags ON tags.tag_id=messages_tags.tag_id "
- + "WHERE messages.message_id IN (:ids) GROUP BY "
- + "messages.message_id, rid, replyto, messages.user_id, users.nick, usr_banned, messages.ts, "
- + "messages.readonly, messages.privacy, messages.attach, messages.hidden, "
- + "messages_txt.repliesby, messages_txt.txt, q, messages.updated, to_uid, to_name, updated_at, "
- + "m_user_uri, msg_reply_uri, html";
+ + "AS (SELECT message_id, reply_id FROM replies WHERE replies.message_id IN (:ids) "
+ + "AND (EXISTS (SELECT 1 FROM bl_users b WHERE b.user_id = :uid AND b.bl_user_id = replies.user_id) "
+ + "OR EXISTS (SELECT 1 from users u WHERE u.banned = 1 and u.id = replies.user_id and u.id <> :uid)) "
+ + "UNION ALL SELECT replies.message_id, replies.reply_id FROM replies INNER JOIN banned "
+ + "ON banned.reply_id = replies.replyto AND replies.reply_id != replies.replyto AND banned.message_id=replies.message_id "
+ + "WHERE replies.message_id IN (:ids)) " + "SELECT messages.message_id, 0 as rid, 0 as replyto, "
+ + "messages.user_id,users.nick, 0 as usr_banned, " + "messages.ts,"
+ + "messages.readonly,messages.privacy, messages.replies-COUNT(DISTINCT banned.reply_id) as replies,"
+ + "messages.attach,COUNT(DISTINCT favorites.user_id) AS likes,messages.hidden,"
+ + "'' as tags, messages_txt.repliesby, messages_txt.txt, '' as q, "
+ + "messages.updated, 0 as to_uid, NULL as to_name, messages_txt.updated_at, '' as m_user_uri, "
+ + "'' as to_uri, '' as msg_reply_uri, 0 as html, (messages.replies - subscr_messages.last_read_rid) > 0 as unread "
+ + "FROM (messages INNER JOIN messages_txt " + "ON messages.message_id=messages_txt.message_id) "
+ + "INNER JOIN users ON messages.user_id=users.id " + "LEFT JOIN subscr_messages "
+ + "ON messages.message_id=subscr_messages.message_id AND subscr_messages.suser_id=:uid "
+ + "LEFT JOIN favorites " + "ON messages.message_id = favorites.message_id AND favorites.like_id=1 "
+ + "LEFT JOIN banned " + "ON messages.message_id = banned.message_id "
+ + "LEFT JOIN messages_tags ON messages_tags.message_id=messages_txt.message_id "
+ + "LEFT JOIN tags ON tags.tag_id=messages_tags.tag_id "
+ + "WHERE messages.message_id IN (:ids) GROUP BY "
+ + "messages.message_id, rid, replyto, messages.user_id, users.nick, usr_banned, messages.ts, "
+ + "messages.readonly, messages.privacy, messages.attach, messages.hidden, "
+ + "messages_txt.repliesby, messages_txt.txt, q, messages.updated, to_uid, to_name, updated_at, "
+ + "m_user_uri, msg_reply_uri, html, subscr_messages.last_read_rid";
List msgs = getNamedParameterJdbcTemplate().query(query,
new MapSqlParameterSource("ids", mids).addValue("uid", visitor.getUid()), new MessageMapper());
@@ -830,7 +866,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
return getNamedParameterJdbcTemplate().query(
"select f.message_id as mid, f.like_id as lid," + " r.description as descr, count(f.like_id) as cnt"
+ " from favorites f LEFT JOIN reactions r ON f.like_id = r.like_id "
- + " where f.message_id IN (:mids) " + " group by f.message_id, f.like_id",
+ + " where f.message_id IN (:mids) " + " group by f.message_id, f.like_id, r.description",
new MapSqlParameterSource("mids", mids), (ResultSet rs) -> {
Map> results = new HashMap<>();
@@ -862,7 +898,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
+ "SELECT replies.message_id as mid, replies.reply_id, replies.replyto, "
+ "replies.user_id, users.nick, users.banned, " + "replies.ts, "
+ "0 as readonly, 0 as privacy, 0 as replies, " + "replies.attach, 0 as likes, 0 as hidden, "
- + "NULL as tags, NULL as repliesby, replies.txt, " + "IFNULL(qw.txt, t.txt) as q, " + "NOW(), "
+ + "NULL as tags, NULL as repliesby, replies.txt, " + "COALESCE(qw.txt, t.txt) as q, " + "NOW(), "
+ "COALESCE(qw.user_id, m.user_id) as to_uid, COALESCE(qu.nick, mu.nick) as to_name, "
+ "replies.updated_at, replies.user_uri as uri, "
+ "qw.user_uri as to_uri, replies.reply_uri, replies.html, 0 as unread "
@@ -880,7 +916,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
if (replies.size() > 0 && !user.isAnonymous()) {
setRead(user, mid);
}
- replies.forEach(i -> {
+ replies.forEach(i -> {
i.setEntities(MessageUtils.getEntities(i));
i.getUser().setAvatar(webApp.getAvatarUrl(i.getUser()));
});
@@ -967,8 +1003,14 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
@Transactional(readOnly = true)
@Override
public List getLastMessages(int hours) {
- return getJdbcTemplate().queryForList(
- "SELECT message_id FROM messages WHERE messages.ts>TIMESTAMPADD(HOUR,?,NOW())", Integer.class, -hours);
+ return getNamedParameterJdbcTemplate()
+ .queryForList(
+ "SELECT message_id FROM messages WHERE messages.ts > :hours",
+ new MapSqlParameterSource()
+ .addValue("hours",
+ Instant.now().minus(hours, ChronoUnit.HOURS).atOffset(ZoneOffset.UTC),
+ java.sql.Types.TIMESTAMP_WITH_TIMEZONE),
+ Integer.class);
}
@@ -997,18 +1039,27 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
@Transactional(readOnly = true)
@Override
public List getPopularCandidates() {
- return getJdbcTemplate().queryForList("SELECT replies.message_id FROM replies "
- + "INNER JOIN messages ON replies.message_id = messages.message_id "
- + "LEFT JOIN favorites ON favorites.message_id = messages.message_id "
- + "LEFT JOIN messages_tags ON messages_tags.message_id = messages.message_id "
- + "WHERE COALESCE(messages_tags.tag_id, 0) != 2 "
- + "AND COALESCE(messages_tags.tag_id, 0) != 805 AND replies.ts > TIMESTAMPADD(HOUR, -2, CURRENT_TIMESTAMP) "
- + "AND NOT EXISTS (SELECT 1 FROM favorites WHERE message_id = messages.message_id AND user_id = 2) GROUP BY messages.message_id having COUNT(DISTINCT(replies.user_id)) > 5 "
- + "UNION ALL SELECT favorites.message_id FROM favorites "
- + "INNER JOIN messages ON messages.message_id = favorites.message_id "
- + "LEFT JOIN messages_tags ON messages_tags.message_id = messages.message_id "
- + "WHERE COALESCE(messages_tags.tag_id, 0) != 2 AND favorites.ts > TIMESTAMPADD(HOUR, -2, CURRENT_TIMESTAMP) "
- + "AND NOT EXISTS (SELECT 1 FROM favorites WHERE message_id = messages.message_id AND user_id = 2) GROUP BY messages.message_id HAVING COUNT(DISTINCT favorites.user_id) > 2;",
+ var beforeTime = Instant.now().minus(2, ChronoUnit.HOURS);
+ var sql = """
+ SELECT replies.message_id FROM replies
+ INNER JOIN messages ON replies.message_id = messages.message_id
+ LEFT JOIN favorites ON favorites.message_id = messages.message_id
+ LEFT JOIN messages_tags ON messages_tags.message_id = messages.message_id
+ WHERE COALESCE(messages_tags.tag_id, 0) != 2
+ AND COALESCE(messages_tags.tag_id, 0) != 805 AND replies.ts > :before
+ AND NOT EXISTS (SELECT 1 FROM favorites WHERE message_id = messages.message_id
+ AND user_id = 2) GROUP BY replies.message_id HAVING COUNT(DISTINCT(replies.user_id)) > 5
+ UNION ALL SELECT favorites.message_id FROM favorites
+ INNER JOIN messages ON messages.message_id = favorites.message_id
+ LEFT JOIN messages_tags ON messages_tags.message_id = messages.message_id
+ WHERE COALESCE(messages_tags.tag_id, 0) != 2
+ AND favorites.ts > :before
+ AND NOT EXISTS (SELECT 1 FROM favorites
+ WHERE message_id = messages.message_id AND user_id = 2)
+ GROUP BY favorites.message_id HAVING COUNT(DISTINCT favorites.user_id) > 2
+ """;
+ return getNamedParameterJdbcTemplate().queryForList(sql, new MapSqlParameterSource()
+ .addValue("before", beforeTime.atOffset(ZoneOffset.UTC), java.sql.Types.TIMESTAMP_WITH_TIMEZONE),
Integer.class);
}
@@ -1111,11 +1162,12 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
SqlParameterSource parameterSource = new MapSqlParameterSource().addValue("mid", mid).addValue("rid", rid)
.addValue("key", key).addValue("value", value);
if (StringUtils.isNotEmpty(value)) {
- try {
+ var exists = getMessageProperty(mid, rid, key);
+ if (StringUtils.isEmpty(exists)) {
getNamedParameterJdbcTemplate()
.update("INSERT INTO messages_properties(message_id, reply_id, property_key, property_value) "
+ "VALUES(:mid, :rid, :key, :value)", parameterSource);
- } catch (DataIntegrityViolationException ex) {
+ } else {
getNamedParameterJdbcTemplate().update("UPDATE messages_properties SET property_value=:value "
+ "WHERE message_id=:mid AND reply_id=:rid AND property_key=:key", parameterSource);
}
diff --git a/src/main/java/com/juick/service/PushQueriesServiceImpl.java b/src/main/java/com/juick/service/PushQueriesServiceImpl.java
index a542087b..7f066ad7 100644
--- a/src/main/java/com/juick/service/PushQueriesServiceImpl.java
+++ b/src/main/java/com/juick/service/PushQueriesServiceImpl.java
@@ -18,6 +18,7 @@
package com.juick.service;
import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.stereotype.Repository;
@@ -134,7 +135,7 @@ public class PushQueriesServiceImpl extends BaseJdbcService implements PushQueri
try {
return getJdbcTemplate().update("INSERT INTO ios(user_id,token) VALUES (?, ?)",
uid, token) > 0;
- } catch (DuplicateKeyException e) {
+ } catch (DataIntegrityViolationException e) {
return true;
}
}
diff --git a/src/main/java/com/juick/service/SubscriptionServiceImpl.java b/src/main/java/com/juick/service/SubscriptionServiceImpl.java
index 962f8460..ca813c67 100644
--- a/src/main/java/com/juick/service/SubscriptionServiceImpl.java
+++ b/src/main/java/com/juick/service/SubscriptionServiceImpl.java
@@ -25,6 +25,7 @@ import com.juick.util.MessageUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.IteratorUtils;
import org.apache.commons.collections4.ListUtils;
+import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.stereotype.Repository;
@@ -69,7 +70,8 @@ public class SubscriptionServiceImpl extends BaseJdbcService implements Subscrip
Set set = new HashSet<>(users.stream()
.filter(u -> !u.isBanned())
- .map(User::getUid).filter(u -> Collections.disjoint(tagService.getUserBLTags(u), tagsStr))
+ .map(User::getUid)
+ .filter(u -> Collections.disjoint(tagService.getUserBLTags(u), tagsStr))
.collect(Collectors.toList()));
if (!tags.isEmpty()) {
@@ -121,7 +123,8 @@ public class SubscriptionServiceImpl extends BaseJdbcService implements Subscrip
return userService.getUserReaders(uid).stream()
.filter(u -> !u.equals(msg.getUser()))
.filter(u -> !userService.isInBLAny(u.getUid(), msg.getUser().getUid()))
- .filter(u -> Collections.disjoint(tagService.getUserBLTags(u.getUid()), msgTags))
+ .filter(u -> Collections.disjoint(tagService.getUserBLTags(u.getUid()),
+ msgTags))
.collect(Collectors.toList());
}
return Collections.emptyList();
@@ -130,11 +133,15 @@ public class SubscriptionServiceImpl extends BaseJdbcService implements Subscrip
@Transactional
@Override
public boolean subscribeMessage(final Message message, final User user) {
- boolean result = getJdbcTemplate().update(
- "INSERT INTO subscr_messages(suser_id, message_id) VALUES (?, ?) ON DUPLICATE KEY UPDATE suser_id=?",
- user.getUid(), message.getMid(), user.getUid()) == 1;
- messagesService.setLastReadComment(user, message.getMid(), message.getReplies());
- return result;
+ try {
+ boolean result = getJdbcTemplate().update(
+ "INSERT INTO subscr_messages(suser_id, message_id) VALUES (?, ?)",
+ user.getUid(), message.getMid()) == 1;
+ messagesService.setLastReadComment(user, message.getMid(), message.getReplies());
+ return result;
+ } catch (DataIntegrityViolationException e) {
+ return false;
+ }
}
@Transactional
@@ -149,7 +156,8 @@ public class SubscriptionServiceImpl extends BaseJdbcService implements Subscrip
public boolean subscribeUser(final User user, final User toUser) {
try {
return getJdbcTemplate().update(
- "INSERT INTO subscr_users(user_id,suser_id) VALUES (?,?)", toUser.getUid(), user.getUid()) == 1;
+ "INSERT INTO subscr_users(user_id,suser_id) VALUES (?,?)", toUser.getUid(),
+ user.getUid()) == 1;
} catch (DuplicateKeyException e) {
return true;
}
@@ -159,7 +167,8 @@ public class SubscriptionServiceImpl extends BaseJdbcService implements Subscrip
@Override
public boolean unSubscribeUser(final User user, final User fromUser) {
return getJdbcTemplate().update(
- "DELETE FROM subscr_users WHERE suser_id=? AND user_id=?", user.getUid(), fromUser.getUid()) > 0;
+ "DELETE FROM subscr_users WHERE suser_id=? AND user_id=?", user.getUid(),
+ fromUser.getUid()) > 0;
}
@Transactional
@@ -168,7 +177,8 @@ public class SubscriptionServiceImpl extends BaseJdbcService implements Subscrip
try {
return getJdbcTemplate().update(
- "INSERT INTO subscr_tags(tag_id,suser_id) VALUES (?,?)", toTag.TID, user.getUid()) == 1;
+ "INSERT INTO subscr_tags(tag_id,suser_id) VALUES (?,?)", toTag.TID,
+ user.getUid()) == 1;
} catch (DuplicateKeyException e) {
return true;
}
diff --git a/src/main/java/com/juick/service/TagServiceImpl.java b/src/main/java/com/juick/service/TagServiceImpl.java
index 81c0c3ba..1ae98c0f 100644
--- a/src/main/java/com/juick/service/TagServiceImpl.java
+++ b/src/main/java/com/juick/service/TagServiceImpl.java
@@ -36,6 +36,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
+import java.time.Instant;
+import java.time.ZoneOffset;
+import java.time.temporal.ChronoUnit;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
@@ -64,8 +67,7 @@ public class TagServiceImpl extends BaseJdbcService implements TagService {
},
tid);
- return list.isEmpty() ?
- null : list.get(0);
+ return list.isEmpty() ? null : list.get(0);
}
@Transactional
@@ -84,8 +86,7 @@ public class TagServiceImpl extends BaseJdbcService implements TagService {
},
tag);
- Tag ret = list.isEmpty() ?
- null : list.get(0);
+ Tag ret = list.isEmpty() ? null : list.get(0);
if (ret == null && autoCreate) {
ret = new Tag(tag);
@@ -97,8 +98,9 @@ public class TagServiceImpl extends BaseJdbcService implements TagService {
@Override
public List getTags(Stream tags, final boolean autoCreate) {
- return tags.filter(StringUtils::isNotBlank).map(tag -> getTag(tag, autoCreate)).filter(Objects::nonNull).distinct()
- .collect(Collectors.toList());
+ return tags.filter(StringUtils::isNotBlank).map(tag -> getTag(tag, autoCreate)).filter(Objects::nonNull)
+ .distinct()
+ .collect(Collectors.toList());
}
@Transactional(readOnly = true)
@@ -124,7 +126,8 @@ public class TagServiceImpl extends BaseJdbcService implements TagService {
},
holder);
- return holder.getKey().intValue();
+ return holder.getKeys().size() > 1 ? ((Number) holder.getKeys().get("tag_id")).intValue()
+ : holder.getKey().intValue();
}
private class TagStatsMapper implements RowMapper {
@@ -164,19 +167,26 @@ public class TagServiceImpl extends BaseJdbcService implements TagService {
@Override
public List getPopularTags() {
return getJdbcTemplate().queryForList(
- "select name from tags where noindex=0 order by stat_messages desc limit 20", String.class);
+ "select name from tags where noindex=false order by stat_messages desc limit 20", String.class);
}
@Transactional(readOnly = true)
@Override
public List getTagStats() {
- return getJdbcTemplate().query(
- "SELECT tags.name,COUNT(DISTINCT messages.user_id) AS cnt " +
- "FROM (messages INNER JOIN messages_tags ON (messages.ts>TIMESTAMPADD(DAY,-14,NOW()) " +
- "AND messages.message_id=messages_tags.message_id)) " +
- "INNER JOIN tags ON messages_tags.tag_id=tags.tag_id " +
- "WHERE tags.tag_id NOT IN (SELECT tag_id FROM tags_ignore) " +
- "GROUP BY tags.tag_id HAVING cnt > 1 ORDER BY cnt DESC LIMIT 20", new TagStatsMapper());
+ var ts = Instant.now().minus(14, ChronoUnit.DAYS);
+ var sql = """
+ SELECT tags.name,COUNT(DISTINCT messages.user_id) AS cnt
+ FROM (messages INNER JOIN messages_tags ON (messages.ts > :ts
+ AND messages.message_id=messages_tags.message_id))
+ INNER JOIN tags ON messages_tags.tag_id=tags.tag_id
+ WHERE tags.tag_id NOT IN (SELECT tag_id FROM tags_ignore)
+ GROUP BY tags.tag_id HAVING COUNT(DISTINCT messages.user_id) > 1
+ ORDER BY cnt DESC LIMIT 20
+ """;
+ return getNamedParameterJdbcTemplate()
+ .query(sql, new MapSqlParameterSource()
+ .addValue("ts", ts.atOffset(ZoneOffset.UTC), java.sql.Types.TIMESTAMP_WITH_TIMEZONE),
+ new TagStatsMapper());
}
@Transactional
@@ -202,17 +212,19 @@ public class TagServiceImpl extends BaseJdbcService implements TagService {
new MapSqlParameterSource().addValue("ids", idsForDelete).addValue("mid", mid));
List addedTags = newTags.stream().filter(t -> !currentTags.contains(t)).collect(Collectors.toList());
- getJdbcTemplate().batchUpdate("INSERT INTO messages_tags(message_id,tag_id) VALUES (?,?)", new BatchPreparedStatementSetter() {
- @Override
- public void setValues(@Nonnull PreparedStatement ps, int i) throws SQLException {
- ps.setInt(1, mid);
- ps.setInt(2, addedTags.get(i).TID);
- }
- @Override
- public int getBatchSize() {
- return addedTags.size();
- }
- });
+ getJdbcTemplate().batchUpdate("INSERT INTO messages_tags(message_id,tag_id) VALUES (?,?)",
+ new BatchPreparedStatementSetter() {
+ @Override
+ public void setValues(@Nonnull PreparedStatement ps, int i) throws SQLException {
+ ps.setInt(1, mid);
+ ps.setInt(2, addedTags.get(i).TID);
+ }
+
+ @Override
+ public int getBatchSize() {
+ return addedTags.size();
+ }
+ });
return getMessageTags(mid).stream()
.map(TagStats::getTag).collect(Collectors.toSet());
@@ -257,7 +269,8 @@ public class TagServiceImpl extends BaseJdbcService implements TagService {
@Override
public boolean blacklistTag(User user, Tag tag) {
- int rowcount = getNamedParameterJdbcTemplate().update("DELETE FROM bl_tags WHERE tag_id = :tid AND user_id = :uid",
+ int rowcount = getNamedParameterJdbcTemplate().update(
+ "DELETE FROM bl_tags WHERE tag_id = :tid AND user_id = :uid",
new MapSqlParameterSource().addValue("tid", tag.TID).addValue("uid", user.getUid()));
return rowcount <= 0 && getNamedParameterJdbcTemplate()
.update("INSERT INTO bl_tags(user_id, tag_id) VALUES(:uid,:tid)",
diff --git a/src/main/java/com/juick/service/UserServiceImpl.java b/src/main/java/com/juick/service/UserServiceImpl.java
index 0e6f9606..b9e7721b 100644
--- a/src/main/java/com/juick/service/UserServiceImpl.java
+++ b/src/main/java/com/juick/service/UserServiceImpl.java
@@ -133,7 +133,7 @@ public class UserServiceImpl extends BaseJdbcService implements UserService {
throw new UsernameTakenException();
}
- int uid = holder.getKeys().size() > 1 ? (int)holder.getKeys().get("id") : holder.getKey().intValue();
+ int uid = holder.getKeys().size() > 1 ? ((Number)holder.getKeys().get("id")).intValue() : holder.getKey().intValue();
getJdbcTemplate().update("INSERT INTO useroptions(user_id) VALUES (?)", uid);
getJdbcTemplate().update("INSERT INTO subscr_users(user_id, suser_id) VALUES (2, ?)", uid);
diff --git a/src/main/resources/application-postgres.properties b/src/main/resources/application-postgres.properties
new file mode 100644
index 00000000..05dbc12d
--- /dev/null
+++ b/src/main/resources/application-postgres.properties
@@ -0,0 +1 @@
+spring.sql.init.platform=postgresql
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 3ef9bdfc..91117c31 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -5,6 +5,7 @@ spring.jackson.serialization.write-dates-as-timestamps=false
spring.jackson.serialization.write-empty-json-arrays=true
spring.h2.console.enabled=true
spring.datasource.generate-unique-name=false
+spring.flyway.locations=classpath:db/migration,classpath:db/specific/{vendor}
spring.sql.init.platform=h2
spring.cache.type=none
spring.cache.cache-names=help, usernames, users_by_name, discover, discussions, messages, replies, popular_tags
diff --git a/src/main/resources/db/migration/V1.00__initial_schema.sql b/src/main/resources/db/migration/V1.00__initial_schema.sql
deleted file mode 100644
index e25e3fed..00000000
--- a/src/main/resources/db/migration/V1.00__initial_schema.sql
+++ /dev/null
@@ -1,380 +0,0 @@
-SET DB_CLOSE_ON_EXIT TRUE;
-SET MODE=MYSQL;
-
-CREATE TABLE IF NOT EXISTS `android` (
- `user_id` int(10) unsigned NOT NULL,
- `regid` char(255) NOT NULL,
- `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
-);
-CREATE TABLE IF NOT EXISTS `auth` (
- `user_id` int(10) unsigned NOT NULL,
- `protocol` enum('xmpp','email','sms') NOT NULL,
- `account` char(64) NOT NULL,
- `authcode` char(8) NOT NULL
-);
-CREATE TABLE IF NOT EXISTS `bl_tags` (
- `user_id` int(10) unsigned NOT NULL,
- `tag_id` int(10) unsigned NOT NULL
-);
-CREATE TABLE IF NOT EXISTS `bl_users` (
- `user_id` int(10) unsigned NOT NULL,
- `bl_user_id` int(10) unsigned NOT NULL,
- `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- PRIMARY KEY (`user_id`,`bl_user_id`)
-);
-CREATE TABLE IF NOT EXISTS `facebook` (
- `user_id` int(10) unsigned DEFAULT NULL,
- `fb_id` bigint(20) unsigned NULL,
- `loginhash` char(36) DEFAULT NULL,
- `access_token` char(255) DEFAULT NULL,
- `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- `fb_name` char(64) NULL,
- `fb_link` char(255) NULL,
- `crosspost` tinyint(1) unsigned NOT NULL DEFAULT '1'
-);
-
-CREATE TABLE IF NOT EXISTS `reactions` (
- `like_id` int(10) unsigned NOT NULL,
- `description` varchar (100) NOT NULL
-);
-CREATE TABLE IF NOT EXISTS `favorites` (
- `user_id` int(10) unsigned NOT NULL,
- `message_id` int(10) unsigned NOT NULL,
- `ts` datetime NOT NULL,
- `like_id` int(10),
- foreign key (like_id) references reactions(like_id)
-);
-
-
-
-CREATE TABLE IF NOT EXISTS `friends_facebook` (
- `user_id` int(10) unsigned NOT NULL,
- `friend_id` bigint(20) unsigned NOT NULL,
- UNIQUE KEY `user_id` (`user_id`,`friend_id`)
-);
-CREATE TABLE IF NOT EXISTS `images` (
- `mid` int(10) unsigned NOT NULL,
- `rid` int(10) unsigned NOT NULL,
- `thumb` int(10) unsigned NOT NULL,
- `small` int(10) unsigned NOT NULL,
- `medium` int(10) unsigned NOT NULL,
- `height` int(10) unsigned NOT NULL,
- `width` int(10) unsigned NOT NULL,
- PRIMARY KEY (`mid`,`rid`)
-);
-
-CREATE TABLE IF NOT EXISTS `mail` (
- `user_id` int(10) unsigned NOT NULL,
- `hash` char(16) NOT NULL,
- PRIMARY KEY (`user_id`)
-);
-
-CREATE TABLE IF NOT EXISTS `meon` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `user_id` int(10) unsigned NOT NULL,
- `link` char(255) NOT NULL,
- `name` char(32) NOT NULL,
- `ico` smallint(5) unsigned DEFAULT NULL,
- PRIMARY KEY (`id`)
-);
-
-
-
-CREATE TABLE IF NOT EXISTS `messages_access` (
- `message_id` int(10) unsigned NOT NULL,
- `user_id` int(10) unsigned NOT NULL
-);
-
-CREATE TABLE IF NOT EXISTS `messages_tags` (
- `message_id` int(10) unsigned NOT NULL,
- `tag_id` int(10) unsigned NOT NULL,
- UNIQUE KEY `message_id_2` (`message_id`,`tag_id`)
-);
-
-CREATE TABLE IF NOT EXISTS `messages_txt` (
- `message_id` int(10) unsigned NOT NULL,
- `tags` varchar(255) DEFAULT NULL,
- `repliesby` varchar(96) DEFAULT NULL,
- `txt` mediumtext NOT NULL,
- PRIMARY KEY (`message_id`)
-);
-
-CREATE TABLE IF NOT EXISTS `messages_votes` (
- `message_id` int(10) unsigned NOT NULL,
- `user_id` int(10) unsigned NOT NULL,
- `vote` tinyint(4) NOT NULL DEFAULT '1',
- UNIQUE KEY `message_id` (`message_id`,`user_id`)
-);
-
-CREATE TABLE IF NOT EXISTS `messenger` (
- `user_id` int(10) unsigned DEFAULT NULL,
- `sender_id` bigint(20) NOT NULL,
- `display_name` char(64) NOT NULL,
- `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- `loginhash` char(36) DEFAULT NULL
-);
-
-CREATE TABLE IF NOT EXISTS `places` (
- `place_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `lat` decimal(10,7) NOT NULL,
- `lon` decimal(10,7) NOT NULL,
- `name` char(64) NOT NULL,
- `descr` char(255) DEFAULT NULL,
- `url` char(128) DEFAULT NULL,
- `user_id` int(10) unsigned NOT NULL,
- `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- PRIMARY KEY (`place_id`)
-);
-
-CREATE TABLE IF NOT EXISTS `places_tags` (
- `place_id` int(10) unsigned NOT NULL,
- `tag_id` int(10) unsigned NOT NULL
-);
-
-CREATE TABLE IF NOT EXISTS `pm` (
- `user_id` int(10) unsigned NOT NULL,
- `user_id_to` int(10) unsigned NOT NULL,
- `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- `txt` text NOT NULL
-);
-
-CREATE TABLE IF NOT EXISTS `pm_streams` (
- `user_id` int(10) unsigned NOT NULL,
- `user_id_to` int(10) unsigned NOT NULL,
- `lastmessage` datetime NOT NULL,
- `lastview` datetime DEFAULT NULL,
- `unread` smallint(5) unsigned NOT NULL DEFAULT '0',
- UNIQUE KEY (`user_id`,`user_id_to`)
-);
-
-CREATE TABLE IF NOT EXISTS `presence` (
- `user_id` int(10) unsigned NOT NULL,
- `jid` char(64) DEFAULT NULL,
- `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- UNIQUE KEY (`jid`)
-);
-
-CREATE TABLE IF NOT EXISTS `replies` (
- `message_id` int(10) unsigned NOT NULL,
- `reply_id` smallint(5) unsigned NOT NULL,
- `user_id` int(10) unsigned NOT NULL,
- `replyto` smallint(5) unsigned NOT NULL DEFAULT '0',
- `ts` timestamp(9) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- `attach` nchar(3) check (attach in ('jpg', 'mp4', 'png')),
- `txt` mediumtext NOT NULL
-);
-
-CREATE TABLE IF NOT EXISTS `subscr_messages` (
- `message_id` int(10) unsigned NOT NULL,
- `suser_id` int(10) unsigned NOT NULL,
- `last_read_rid` smallint(5) unsigned NOT NULL DEFAULT '0',
- UNIQUE KEY (`message_id`,`suser_id`)
-);
-
-CREATE TABLE IF NOT EXISTS `subscr_tags` (
- `tag_id` int(10) unsigned NOT NULL,
- `suser_id` int(10) unsigned NOT NULL,
- UNIQUE KEY (`tag_id`,`suser_id`)
-);
-
-CREATE TABLE IF NOT EXISTS `subscr_users` (
- `user_id` int(10) unsigned NOT NULL,
- `suser_id` int(10) unsigned NOT NULL,
- `jid` char(64) DEFAULT NULL,
- `active` bit(1) NOT NULL DEFAULT TRUE,
- `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- UNIQUE KEY (`user_id`,`suser_id`)
-);
-
-CREATE TABLE IF NOT EXISTS `tags` (
- `tag_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `synonym_id` int(10) unsigned DEFAULT NULL,
- `name` varchar_ignorecase(70) DEFAULT NULL,
- `top` tinyint(1) unsigned NOT NULL DEFAULT '0',
- `noindex` tinyint(1) unsigned NOT NULL DEFAULT '0',
- `stat_messages` int(10) unsigned NOT NULL DEFAULT '0',
- `stat_users` smallint(5) unsigned NOT NULL DEFAULT '0',
- PRIMARY KEY (`tag_id`)
-);
-
-CREATE TABLE IF NOT EXISTS `tags_ignore` (
- `tag_id` int(10) unsigned NOT NULL
-);
-
-CREATE TABLE IF NOT EXISTS `tags_synonyms` (
- `name` char(64) NOT NULL,
- `changeto` char(64) NOT NULL
-);
-
-CREATE TABLE IF NOT EXISTS `telegram` (
- `user_id` int(10) unsigned DEFAULT NULL,
- `tg_id` bigint(20) NOT NULL,
- `tg_name` char(64) DEFAULT NULL,
- `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- `loginhash` char(36) DEFAULT NULL
-);
-
-CREATE TABLE IF NOT EXISTS `telegram_chats` (
- `chat_id` bigint(20) DEFAULT NULL,
- UNIQUE KEY `chat_id` (`chat_id`)
-);
-
-CREATE TABLE IF NOT EXISTS `top_ignore_messages` (
- `message_id` int(10) unsigned NOT NULL
-);
-
-CREATE TABLE IF NOT EXISTS `top_ignore_tags` (
- `tag_id` int(10) unsigned NOT NULL,
- PRIMARY KEY (`tag_id`)
-);
-
-CREATE TABLE IF NOT EXISTS `top_ignore_users` (
- `user_id` int(10) unsigned NOT NULL,
- PRIMARY KEY (`user_id`)
-);
-
-CREATE TABLE IF NOT EXISTS `twitter` (
- `user_id` int(10) unsigned NOT NULL,
- `access_token` char(64) NOT NULL,
- `access_token_secret` char(64) NOT NULL,
- `uname` char(64) NOT NULL,
- `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- `crosspost` tinyint(1) unsigned NOT NULL DEFAULT '1',
- PRIMARY KEY (`user_id`)
-);
-
-CREATE TABLE IF NOT EXISTS `useroptions` (
- `user_id` int(10) unsigned NOT NULL,
- `jnotify` tinyint(1) NOT NULL DEFAULT '1',
- `subscr_active` tinyint(1) NOT NULL DEFAULT '1',
- `off_ts` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
- `xmppxhtml` tinyint(1) NOT NULL DEFAULT '0',
- `subscr_notify` tinyint(1) NOT NULL DEFAULT '1',
- `recommendations` tinyint(1) NOT NULL DEFAULT '1',
- `privacy_view` tinyint(1) NOT NULL DEFAULT '1',
- `privacy_reply` tinyint(1) NOT NULL DEFAULT '1',
- `privacy_pm` tinyint(1) NOT NULL DEFAULT '1',
- `repliesview` tinyint(1) NOT NULL DEFAULT '0',
- PRIMARY KEY (`user_id`)
-);
-
-CREATE TABLE IF NOT EXISTS `users` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT(0),
- `nick` char(64) NOT NULL,
- `passw` char(32) NOT NULL,
- `lang` enum('en','ru','fr','fa','__') NOT NULL DEFAULT '__',
- `banned` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `lastmessage` timestamp(9) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- `lastpm` int(11) NOT NULL DEFAULT '0',
- `lastphoto` int(11) NOT NULL DEFAULT '0',
- `karma` smallint(6) NOT NULL DEFAULT '0',
- PRIMARY KEY (`id`),
- UNIQUE KEY `nick` (`nick`)
-);
-
-CREATE TABLE IF NOT EXISTS `users_refs` (
- `user_id` int(10) unsigned NOT NULL,
- `ref` int(10) unsigned NOT NULL
-);
-
-CREATE TABLE IF NOT EXISTS `users_subscr` (
- `user_id` int(10) unsigned NOT NULL,
- `cnt` smallint(5) unsigned NOT NULL DEFAULT '0',
- PRIMARY KEY (`user_id`)
-);
-
-CREATE TABLE IF NOT EXISTS `usersinfo` (
- `user_id` int(10) unsigned NOT NULL,
- `jid` char(32) DEFAULT NULL,
- `fullname` char(32) DEFAULT NULL,
- `country` char(32) DEFAULT NULL,
- `url` char(64) DEFAULT NULL,
- `gender` char(32) DEFAULT NULL,
- `bday` char(10) DEFAULT NULL,
- `descr` varchar(255) DEFAULT NULL,
- PRIMARY KEY (`user_id`)
-);
-CREATE TABLE IF NOT EXISTS `emails` (
- `user_id` int(10) unsigned NOT NULL,
- `email` char(64) NOT NULL PRIMARY KEY,
- `subscr_hour` tinyint(4) DEFAULT NULL,
- foreign key (user_id) references users(id)
-);
-CREATE TABLE IF NOT EXISTS `ios` (
- `user_id` int(10) unsigned NOT NULL,
- `token` char(64) NOT NULL,
- `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- UNIQUE KEY `token` (`token`),
- foreign key (user_id) references users(id)
-);
-
-CREATE TABLE IF NOT EXISTS `jids` (
- `user_id` int(10) unsigned DEFAULT NULL,
- `jid` char(64) NOT NULL,
- `active` tinyint(1) NOT NULL DEFAULT '1',
- `loginhash` char(36) DEFAULT NULL,
- `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- UNIQUE KEY `jid` (`jid`),
- foreign key (user_id) references users(id)
-);
-
-CREATE TABLE IF NOT EXISTS `logins` (
- `user_id` int(10) unsigned NOT NULL,
- `hash` char(16) NOT NULL,
- UNIQUE KEY (`user_id`)
-);
-CREATE TABLE IF NOT EXISTS `messages` (
- `message_id` int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
- `user_id` int(10) unsigned NOT NULL,
- `lang` enum('en','ru','fr','fa','__') NOT NULL DEFAULT '__',
- `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- `replies` smallint(5) unsigned NOT NULL DEFAULT '0',
- `maxreplyid` smallint(5) unsigned NOT NULL DEFAULT '0',
- `privacy` tinyint(4) NOT NULL DEFAULT '1',
- `readonly` tinyint(1) NOT NULL DEFAULT '0',
- `attach` nchar(3) check (attach in ('jpg', 'mp4', 'png')),
- `place_id` int(10) unsigned DEFAULT NULL,
- `lat` decimal(10,7) DEFAULT NULL,
- `lon` decimal(10,7) DEFAULT NULL,
- `popular` tinyint(4) NOT NULL DEFAULT '0',
- `hidden` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `likes` smallint(6) NOT NULL DEFAULT '0',
- `updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- FOREIGN KEY (`user_id`) references users(id)
-);
-CREATE TABLE IF NOT EXISTS `pm_inroster` (
- `user_id` int(10) unsigned NOT NULL,
- `jid` char(64) NOT NULL,
- UNIQUE KEY (`user_id`,`jid`),
- FOREIGN KEY (`user_id`) references users(id)
-);
-
-CREATE TABLE IF NOT EXISTS `version` (
- `version` bigint(20) NOT NULL
-);
-
-CREATE TABLE IF NOT EXISTS `vk` (
- `user_id` int(10) unsigned DEFAULT NULL,
- `vk_id` bigint(20) NOT NULL,
- `loginhash` char(36) DEFAULT NULL,
- `access_token` char(128) NOT NULL,
- `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- `vk_name` char(64) NOT NULL,
- `vk_link` char(64) NOT NULL,
- `crosspost` bit(1) unsigned NOT NULL DEFAULT FALSE,
- FOREIGN KEY (`user_id`) references users(id)
-);
-
-CREATE TABLE IF NOT EXISTS `winphone` (
- `user_id` int(10) unsigned NOT NULL,
- `url` char(255) NOT NULL,
- `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- UNIQUE KEY (`url`),
- FOREIGN KEY (`user_id`) references users(id)
-);
-
-CREATE TABLE IF NOT EXISTS `wl_users` (
- `user_id` int(10) unsigned NOT NULL,
- `wl_user_id` int(10) unsigned NOT NULL,
- PRIMARY KEY (`user_id`,`wl_user_id`)
-);
diff --git a/src/main/resources/db/migration/V1.10__favorites_user_uri.sql b/src/main/resources/db/migration/V1.10__favorites_user_uri.sql
deleted file mode 100644
index 8f382398..00000000
--- a/src/main/resources/db/migration/V1.10__favorites_user_uri.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-ALTER TABLE favorites ADD COLUMN user_uri char(255) DEFAULT NULL;
-UPDATE favorites SET user_uri='' WHERE user_uri IS NULL;
-ALTER TABLE favorites MODIFY COLUMN user_uri char(255) NOT NULL DEFAULT '';
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V1.11__increase pm timestamp precision.sql b/src/main/resources/db/migration/V1.11__increase pm timestamp precision.sql
deleted file mode 100644
index e83eb621..00000000
--- a/src/main/resources/db/migration/V1.11__increase pm timestamp precision.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE pm MODIFY COLUMN ts timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V1.15__drop unused columns add ts for some tables.sql b/src/main/resources/db/migration/V1.15__drop unused columns add ts for some tables.sql
index 6b3ab388..2350bff2 100644
--- a/src/main/resources/db/migration/V1.15__drop unused columns add ts for some tables.sql
+++ b/src/main/resources/db/migration/V1.15__drop unused columns add ts for some tables.sql
@@ -1,4 +1,4 @@
-ALTER TABLE subscr_users DROP COLUMN `jid`;
-ALTER TABLE subscr_users DROP COLUMN `active`;
+ALTER TABLE subscr_users DROP COLUMN jid;
+ALTER TABLE subscr_users DROP COLUMN active;
ALTER TABLE auth ADD COLUMN ts timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE mail ADD COLUMN ts timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V1.16__last seen.sql b/src/main/resources/db/migration/V1.16__last seen.sql
deleted file mode 100644
index 52ca4e90..00000000
--- a/src/main/resources/db/migration/V1.16__last seen.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-ALTER TABLE users ADD COLUMN last_seen timestamp(6) NULL;
-UPDATE users SET last_seen=lastmessage;
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V1.18__increase messages and replies timestamp precision.sql b/src/main/resources/db/migration/V1.18__increase messages and replies timestamp precision.sql
deleted file mode 100644
index 5b298c46..00000000
--- a/src/main/resources/db/migration/V1.18__increase messages and replies timestamp precision.sql
+++ /dev/null
@@ -1,5 +0,0 @@
-ALTER TABLE replies MODIFY COLUMN ts timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE messages MODIFY COLUMN ts timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE messages MODIFY COLUMN updated timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE messages_txt MODIFY COLUMN updated_at timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE users MODIFY COLUMN lastmessage timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
diff --git a/src/main/resources/db/migration/V1.19__messages_properties.sql b/src/main/resources/db/migration/V1.19__messages_properties.sql
deleted file mode 100644
index 2bb3baf2..00000000
--- a/src/main/resources/db/migration/V1.19__messages_properties.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-CREATE TABLE messages_properties (
- message_id int(10) unsigned NOT NULL,
- property_key varchar(255) NOT NULL,
- property_value mediumtext NOT NULL,
- UNIQUE KEY message_key(message_id, property_key)
-)
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V1.20__reply id in messages_properties.sql b/src/main/resources/db/migration/V1.20__reply id in messages_properties.sql
deleted file mode 100644
index 2ca5e018..00000000
--- a/src/main/resources/db/migration/V1.20__reply id in messages_properties.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE messages_properties ADD COLUMN reply_id smallint(5) unsigned NOT NULL
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V1.21__recreate messages_properties with correct index.sql b/src/main/resources/db/migration/V1.21__recreate messages_properties with correct index.sql
deleted file mode 100644
index 685318af..00000000
--- a/src/main/resources/db/migration/V1.21__recreate messages_properties with correct index.sql
+++ /dev/null
@@ -1,8 +0,0 @@
-DROP TABLE messages_properties;
-CREATE TABLE messages_properties (
- message_id int(10) unsigned NOT NULL,
- reply_id smallint(5) unsigned NOT NULL,
- property_key varchar(255) NOT NULL,
- property_value mediumtext NOT NULL,
- UNIQUE KEY message_key(message_id, reply_id, property_key)
-)
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V1.22__increase updated_at precision.sql b/src/main/resources/db/migration/V1.22__increase updated_at precision.sql
deleted file mode 100644
index 22034ea2..00000000
--- a/src/main/resources/db/migration/V1.22__increase updated_at precision.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-ALTER TABLE replies MODIFY COLUMN updated_at timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE messages_txt MODIFY COLUMN updated_at timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V1.2__Drop telegram_chats.sql b/src/main/resources/db/migration/V1.2__Drop telegram_chats.sql
deleted file mode 100644
index c8faee0d..00000000
--- a/src/main/resources/db/migration/V1.2__Drop telegram_chats.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-INSERT INTO telegram(tg_id, tg_name, loginhash) SELECT chat_id AS tg_id, 'Anonymous', UUID() FROM telegram_chats;
-DROP TABLE telegram_chats;
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V1.3__Nullable user_id column in auth table.sql b/src/main/resources/db/migration/V1.3__Nullable user_id column in auth table.sql
deleted file mode 100644
index ced85ade..00000000
--- a/src/main/resources/db/migration/V1.3__Nullable user_id column in auth table.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE auth MODIFY COLUMN user_id int(10) unsigned NULL;
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V1.4__ActivityPub followers.sql b/src/main/resources/db/migration/V1.4__ActivityPub followers.sql
deleted file mode 100644
index 16b39f62..00000000
--- a/src/main/resources/db/migration/V1.4__ActivityPub followers.sql
+++ /dev/null
@@ -1,7 +0,0 @@
-CREATE TABLE IF NOT EXISTS `followers` (
- `user_id` int(10) unsigned DEFAULT NULL,
- `acct` char(64) NOT NULL,
- `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
- UNIQUE KEY `acct` (`acct`),
- foreign key (user_id) references users(id)
-);
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V1.5__Drop acct index.sql b/src/main/resources/db/migration/V1.5__Drop acct index.sql
deleted file mode 100644
index 58757d88..00000000
--- a/src/main/resources/db/migration/V1.5__Drop acct index.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-ALTER TABLE followers ADD COLUMN `acct_migr` char(64) NOT NULL;
-UPDATE followers SET `acct_migr` = `acct`;
-ALTER TABLE followers DROP COLUMN `acct`;
-ALTER TABLE followers ADD COLUMN `acct` char(64) NOT NULL;
-UPDATE followers SET `acct` = `acct_migr`;
-ALTER TABLE followers DROP COLUMN `acct_migr`;
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V1.6__user_uri.sql b/src/main/resources/db/migration/V1.6__user_uri.sql
deleted file mode 100644
index c302907c..00000000
--- a/src/main/resources/db/migration/V1.6__user_uri.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE replies ADD COLUMN user_uri char(255) DEFAULT NULL;
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V1.7__reply_uri.sql b/src/main/resources/db/migration/V1.7__reply_uri.sql
deleted file mode 100644
index 9ec35485..00000000
--- a/src/main/resources/db/migration/V1.7__reply_uri.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE replies ADD COLUMN reply_uri char(255) DEFAULT NULL;
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V1.8__html reply.sql b/src/main/resources/db/migration/V1.8__html reply.sql
deleted file mode 100644
index 9f939971..00000000
--- a/src/main/resources/db/migration/V1.8__html reply.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE replies ADD COLUMN html tinyint(4) NOT NULL DEFAULT '0';
\ No newline at end of file
diff --git a/src/main/resources/db/specific/h2/V1.00__initial_schema.sql b/src/main/resources/db/specific/h2/V1.00__initial_schema.sql
new file mode 100644
index 00000000..e25e3fed
--- /dev/null
+++ b/src/main/resources/db/specific/h2/V1.00__initial_schema.sql
@@ -0,0 +1,380 @@
+SET DB_CLOSE_ON_EXIT TRUE;
+SET MODE=MYSQL;
+
+CREATE TABLE IF NOT EXISTS `android` (
+ `user_id` int(10) unsigned NOT NULL,
+ `regid` char(255) NOT NULL,
+ `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+CREATE TABLE IF NOT EXISTS `auth` (
+ `user_id` int(10) unsigned NOT NULL,
+ `protocol` enum('xmpp','email','sms') NOT NULL,
+ `account` char(64) NOT NULL,
+ `authcode` char(8) NOT NULL
+);
+CREATE TABLE IF NOT EXISTS `bl_tags` (
+ `user_id` int(10) unsigned NOT NULL,
+ `tag_id` int(10) unsigned NOT NULL
+);
+CREATE TABLE IF NOT EXISTS `bl_users` (
+ `user_id` int(10) unsigned NOT NULL,
+ `bl_user_id` int(10) unsigned NOT NULL,
+ `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`user_id`,`bl_user_id`)
+);
+CREATE TABLE IF NOT EXISTS `facebook` (
+ `user_id` int(10) unsigned DEFAULT NULL,
+ `fb_id` bigint(20) unsigned NULL,
+ `loginhash` char(36) DEFAULT NULL,
+ `access_token` char(255) DEFAULT NULL,
+ `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `fb_name` char(64) NULL,
+ `fb_link` char(255) NULL,
+ `crosspost` tinyint(1) unsigned NOT NULL DEFAULT '1'
+);
+
+CREATE TABLE IF NOT EXISTS `reactions` (
+ `like_id` int(10) unsigned NOT NULL,
+ `description` varchar (100) NOT NULL
+);
+CREATE TABLE IF NOT EXISTS `favorites` (
+ `user_id` int(10) unsigned NOT NULL,
+ `message_id` int(10) unsigned NOT NULL,
+ `ts` datetime NOT NULL,
+ `like_id` int(10),
+ foreign key (like_id) references reactions(like_id)
+);
+
+
+
+CREATE TABLE IF NOT EXISTS `friends_facebook` (
+ `user_id` int(10) unsigned NOT NULL,
+ `friend_id` bigint(20) unsigned NOT NULL,
+ UNIQUE KEY `user_id` (`user_id`,`friend_id`)
+);
+CREATE TABLE IF NOT EXISTS `images` (
+ `mid` int(10) unsigned NOT NULL,
+ `rid` int(10) unsigned NOT NULL,
+ `thumb` int(10) unsigned NOT NULL,
+ `small` int(10) unsigned NOT NULL,
+ `medium` int(10) unsigned NOT NULL,
+ `height` int(10) unsigned NOT NULL,
+ `width` int(10) unsigned NOT NULL,
+ PRIMARY KEY (`mid`,`rid`)
+);
+
+CREATE TABLE IF NOT EXISTS `mail` (
+ `user_id` int(10) unsigned NOT NULL,
+ `hash` char(16) NOT NULL,
+ PRIMARY KEY (`user_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `meon` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `user_id` int(10) unsigned NOT NULL,
+ `link` char(255) NOT NULL,
+ `name` char(32) NOT NULL,
+ `ico` smallint(5) unsigned DEFAULT NULL,
+ PRIMARY KEY (`id`)
+);
+
+
+
+CREATE TABLE IF NOT EXISTS `messages_access` (
+ `message_id` int(10) unsigned NOT NULL,
+ `user_id` int(10) unsigned NOT NULL
+);
+
+CREATE TABLE IF NOT EXISTS `messages_tags` (
+ `message_id` int(10) unsigned NOT NULL,
+ `tag_id` int(10) unsigned NOT NULL,
+ UNIQUE KEY `message_id_2` (`message_id`,`tag_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `messages_txt` (
+ `message_id` int(10) unsigned NOT NULL,
+ `tags` varchar(255) DEFAULT NULL,
+ `repliesby` varchar(96) DEFAULT NULL,
+ `txt` mediumtext NOT NULL,
+ PRIMARY KEY (`message_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `messages_votes` (
+ `message_id` int(10) unsigned NOT NULL,
+ `user_id` int(10) unsigned NOT NULL,
+ `vote` tinyint(4) NOT NULL DEFAULT '1',
+ UNIQUE KEY `message_id` (`message_id`,`user_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `messenger` (
+ `user_id` int(10) unsigned DEFAULT NULL,
+ `sender_id` bigint(20) NOT NULL,
+ `display_name` char(64) NOT NULL,
+ `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `loginhash` char(36) DEFAULT NULL
+);
+
+CREATE TABLE IF NOT EXISTS `places` (
+ `place_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `lat` decimal(10,7) NOT NULL,
+ `lon` decimal(10,7) NOT NULL,
+ `name` char(64) NOT NULL,
+ `descr` char(255) DEFAULT NULL,
+ `url` char(128) DEFAULT NULL,
+ `user_id` int(10) unsigned NOT NULL,
+ `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`place_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `places_tags` (
+ `place_id` int(10) unsigned NOT NULL,
+ `tag_id` int(10) unsigned NOT NULL
+);
+
+CREATE TABLE IF NOT EXISTS `pm` (
+ `user_id` int(10) unsigned NOT NULL,
+ `user_id_to` int(10) unsigned NOT NULL,
+ `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `txt` text NOT NULL
+);
+
+CREATE TABLE IF NOT EXISTS `pm_streams` (
+ `user_id` int(10) unsigned NOT NULL,
+ `user_id_to` int(10) unsigned NOT NULL,
+ `lastmessage` datetime NOT NULL,
+ `lastview` datetime DEFAULT NULL,
+ `unread` smallint(5) unsigned NOT NULL DEFAULT '0',
+ UNIQUE KEY (`user_id`,`user_id_to`)
+);
+
+CREATE TABLE IF NOT EXISTS `presence` (
+ `user_id` int(10) unsigned NOT NULL,
+ `jid` char(64) DEFAULT NULL,
+ `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ UNIQUE KEY (`jid`)
+);
+
+CREATE TABLE IF NOT EXISTS `replies` (
+ `message_id` int(10) unsigned NOT NULL,
+ `reply_id` smallint(5) unsigned NOT NULL,
+ `user_id` int(10) unsigned NOT NULL,
+ `replyto` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `ts` timestamp(9) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `attach` nchar(3) check (attach in ('jpg', 'mp4', 'png')),
+ `txt` mediumtext NOT NULL
+);
+
+CREATE TABLE IF NOT EXISTS `subscr_messages` (
+ `message_id` int(10) unsigned NOT NULL,
+ `suser_id` int(10) unsigned NOT NULL,
+ `last_read_rid` smallint(5) unsigned NOT NULL DEFAULT '0',
+ UNIQUE KEY (`message_id`,`suser_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `subscr_tags` (
+ `tag_id` int(10) unsigned NOT NULL,
+ `suser_id` int(10) unsigned NOT NULL,
+ UNIQUE KEY (`tag_id`,`suser_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `subscr_users` (
+ `user_id` int(10) unsigned NOT NULL,
+ `suser_id` int(10) unsigned NOT NULL,
+ `jid` char(64) DEFAULT NULL,
+ `active` bit(1) NOT NULL DEFAULT TRUE,
+ `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ UNIQUE KEY (`user_id`,`suser_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `tags` (
+ `tag_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `synonym_id` int(10) unsigned DEFAULT NULL,
+ `name` varchar_ignorecase(70) DEFAULT NULL,
+ `top` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ `noindex` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ `stat_messages` int(10) unsigned NOT NULL DEFAULT '0',
+ `stat_users` smallint(5) unsigned NOT NULL DEFAULT '0',
+ PRIMARY KEY (`tag_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `tags_ignore` (
+ `tag_id` int(10) unsigned NOT NULL
+);
+
+CREATE TABLE IF NOT EXISTS `tags_synonyms` (
+ `name` char(64) NOT NULL,
+ `changeto` char(64) NOT NULL
+);
+
+CREATE TABLE IF NOT EXISTS `telegram` (
+ `user_id` int(10) unsigned DEFAULT NULL,
+ `tg_id` bigint(20) NOT NULL,
+ `tg_name` char(64) DEFAULT NULL,
+ `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `loginhash` char(36) DEFAULT NULL
+);
+
+CREATE TABLE IF NOT EXISTS `telegram_chats` (
+ `chat_id` bigint(20) DEFAULT NULL,
+ UNIQUE KEY `chat_id` (`chat_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `top_ignore_messages` (
+ `message_id` int(10) unsigned NOT NULL
+);
+
+CREATE TABLE IF NOT EXISTS `top_ignore_tags` (
+ `tag_id` int(10) unsigned NOT NULL,
+ PRIMARY KEY (`tag_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `top_ignore_users` (
+ `user_id` int(10) unsigned NOT NULL,
+ PRIMARY KEY (`user_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `twitter` (
+ `user_id` int(10) unsigned NOT NULL,
+ `access_token` char(64) NOT NULL,
+ `access_token_secret` char(64) NOT NULL,
+ `uname` char(64) NOT NULL,
+ `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `crosspost` tinyint(1) unsigned NOT NULL DEFAULT '1',
+ PRIMARY KEY (`user_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `useroptions` (
+ `user_id` int(10) unsigned NOT NULL,
+ `jnotify` tinyint(1) NOT NULL DEFAULT '1',
+ `subscr_active` tinyint(1) NOT NULL DEFAULT '1',
+ `off_ts` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `xmppxhtml` tinyint(1) NOT NULL DEFAULT '0',
+ `subscr_notify` tinyint(1) NOT NULL DEFAULT '1',
+ `recommendations` tinyint(1) NOT NULL DEFAULT '1',
+ `privacy_view` tinyint(1) NOT NULL DEFAULT '1',
+ `privacy_reply` tinyint(1) NOT NULL DEFAULT '1',
+ `privacy_pm` tinyint(1) NOT NULL DEFAULT '1',
+ `repliesview` tinyint(1) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`user_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `users` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT(0),
+ `nick` char(64) NOT NULL,
+ `passw` char(32) NOT NULL,
+ `lang` enum('en','ru','fr','fa','__') NOT NULL DEFAULT '__',
+ `banned` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `lastmessage` timestamp(9) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `lastpm` int(11) NOT NULL DEFAULT '0',
+ `lastphoto` int(11) NOT NULL DEFAULT '0',
+ `karma` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `nick` (`nick`)
+);
+
+CREATE TABLE IF NOT EXISTS `users_refs` (
+ `user_id` int(10) unsigned NOT NULL,
+ `ref` int(10) unsigned NOT NULL
+);
+
+CREATE TABLE IF NOT EXISTS `users_subscr` (
+ `user_id` int(10) unsigned NOT NULL,
+ `cnt` smallint(5) unsigned NOT NULL DEFAULT '0',
+ PRIMARY KEY (`user_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `usersinfo` (
+ `user_id` int(10) unsigned NOT NULL,
+ `jid` char(32) DEFAULT NULL,
+ `fullname` char(32) DEFAULT NULL,
+ `country` char(32) DEFAULT NULL,
+ `url` char(64) DEFAULT NULL,
+ `gender` char(32) DEFAULT NULL,
+ `bday` char(10) DEFAULT NULL,
+ `descr` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`user_id`)
+);
+CREATE TABLE IF NOT EXISTS `emails` (
+ `user_id` int(10) unsigned NOT NULL,
+ `email` char(64) NOT NULL PRIMARY KEY,
+ `subscr_hour` tinyint(4) DEFAULT NULL,
+ foreign key (user_id) references users(id)
+);
+CREATE TABLE IF NOT EXISTS `ios` (
+ `user_id` int(10) unsigned NOT NULL,
+ `token` char(64) NOT NULL,
+ `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ UNIQUE KEY `token` (`token`),
+ foreign key (user_id) references users(id)
+);
+
+CREATE TABLE IF NOT EXISTS `jids` (
+ `user_id` int(10) unsigned DEFAULT NULL,
+ `jid` char(64) NOT NULL,
+ `active` tinyint(1) NOT NULL DEFAULT '1',
+ `loginhash` char(36) DEFAULT NULL,
+ `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ UNIQUE KEY `jid` (`jid`),
+ foreign key (user_id) references users(id)
+);
+
+CREATE TABLE IF NOT EXISTS `logins` (
+ `user_id` int(10) unsigned NOT NULL,
+ `hash` char(16) NOT NULL,
+ UNIQUE KEY (`user_id`)
+);
+CREATE TABLE IF NOT EXISTS `messages` (
+ `message_id` int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ `user_id` int(10) unsigned NOT NULL,
+ `lang` enum('en','ru','fr','fa','__') NOT NULL DEFAULT '__',
+ `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `replies` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `maxreplyid` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `privacy` tinyint(4) NOT NULL DEFAULT '1',
+ `readonly` tinyint(1) NOT NULL DEFAULT '0',
+ `attach` nchar(3) check (attach in ('jpg', 'mp4', 'png')),
+ `place_id` int(10) unsigned DEFAULT NULL,
+ `lat` decimal(10,7) DEFAULT NULL,
+ `lon` decimal(10,7) DEFAULT NULL,
+ `popular` tinyint(4) NOT NULL DEFAULT '0',
+ `hidden` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `likes` smallint(6) NOT NULL DEFAULT '0',
+ `updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ FOREIGN KEY (`user_id`) references users(id)
+);
+CREATE TABLE IF NOT EXISTS `pm_inroster` (
+ `user_id` int(10) unsigned NOT NULL,
+ `jid` char(64) NOT NULL,
+ UNIQUE KEY (`user_id`,`jid`),
+ FOREIGN KEY (`user_id`) references users(id)
+);
+
+CREATE TABLE IF NOT EXISTS `version` (
+ `version` bigint(20) NOT NULL
+);
+
+CREATE TABLE IF NOT EXISTS `vk` (
+ `user_id` int(10) unsigned DEFAULT NULL,
+ `vk_id` bigint(20) NOT NULL,
+ `loginhash` char(36) DEFAULT NULL,
+ `access_token` char(128) NOT NULL,
+ `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `vk_name` char(64) NOT NULL,
+ `vk_link` char(64) NOT NULL,
+ `crosspost` bit(1) unsigned NOT NULL DEFAULT FALSE,
+ FOREIGN KEY (`user_id`) references users(id)
+);
+
+CREATE TABLE IF NOT EXISTS `winphone` (
+ `user_id` int(10) unsigned NOT NULL,
+ `url` char(255) NOT NULL,
+ `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ UNIQUE KEY (`url`),
+ FOREIGN KEY (`user_id`) references users(id)
+);
+
+CREATE TABLE IF NOT EXISTS `wl_users` (
+ `user_id` int(10) unsigned NOT NULL,
+ `wl_user_id` int(10) unsigned NOT NULL,
+ PRIMARY KEY (`user_id`,`wl_user_id`)
+);
diff --git a/src/main/resources/db/specific/h2/V1.10__favorites_user_uri.sql b/src/main/resources/db/specific/h2/V1.10__favorites_user_uri.sql
new file mode 100644
index 00000000..8f382398
--- /dev/null
+++ b/src/main/resources/db/specific/h2/V1.10__favorites_user_uri.sql
@@ -0,0 +1,3 @@
+ALTER TABLE favorites ADD COLUMN user_uri char(255) DEFAULT NULL;
+UPDATE favorites SET user_uri='' WHERE user_uri IS NULL;
+ALTER TABLE favorites MODIFY COLUMN user_uri char(255) NOT NULL DEFAULT '';
\ No newline at end of file
diff --git a/src/main/resources/db/specific/h2/V1.11__increase pm timestamp precision.sql b/src/main/resources/db/specific/h2/V1.11__increase pm timestamp precision.sql
new file mode 100644
index 00000000..e83eb621
--- /dev/null
+++ b/src/main/resources/db/specific/h2/V1.11__increase pm timestamp precision.sql
@@ -0,0 +1 @@
+ALTER TABLE pm MODIFY COLUMN ts timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
\ No newline at end of file
diff --git a/src/main/resources/db/specific/h2/V1.16__last seen.sql b/src/main/resources/db/specific/h2/V1.16__last seen.sql
new file mode 100644
index 00000000..52ca4e90
--- /dev/null
+++ b/src/main/resources/db/specific/h2/V1.16__last seen.sql
@@ -0,0 +1,2 @@
+ALTER TABLE users ADD COLUMN last_seen timestamp(6) NULL;
+UPDATE users SET last_seen=lastmessage;
\ No newline at end of file
diff --git a/src/main/resources/db/specific/h2/V1.18__increase messages and replies timestamp precision.sql b/src/main/resources/db/specific/h2/V1.18__increase messages and replies timestamp precision.sql
new file mode 100644
index 00000000..5b298c46
--- /dev/null
+++ b/src/main/resources/db/specific/h2/V1.18__increase messages and replies timestamp precision.sql
@@ -0,0 +1,5 @@
+ALTER TABLE replies MODIFY COLUMN ts timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE messages MODIFY COLUMN ts timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE messages MODIFY COLUMN updated timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE messages_txt MODIFY COLUMN updated_at timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE users MODIFY COLUMN lastmessage timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
diff --git a/src/main/resources/db/specific/h2/V1.19__messages_properties.sql b/src/main/resources/db/specific/h2/V1.19__messages_properties.sql
new file mode 100644
index 00000000..2bb3baf2
--- /dev/null
+++ b/src/main/resources/db/specific/h2/V1.19__messages_properties.sql
@@ -0,0 +1,6 @@
+CREATE TABLE messages_properties (
+ message_id int(10) unsigned NOT NULL,
+ property_key varchar(255) NOT NULL,
+ property_value mediumtext NOT NULL,
+ UNIQUE KEY message_key(message_id, property_key)
+)
\ No newline at end of file
diff --git a/src/main/resources/db/specific/h2/V1.20__reply id in messages_properties.sql b/src/main/resources/db/specific/h2/V1.20__reply id in messages_properties.sql
new file mode 100644
index 00000000..2ca5e018
--- /dev/null
+++ b/src/main/resources/db/specific/h2/V1.20__reply id in messages_properties.sql
@@ -0,0 +1 @@
+ALTER TABLE messages_properties ADD COLUMN reply_id smallint(5) unsigned NOT NULL
\ No newline at end of file
diff --git a/src/main/resources/db/specific/h2/V1.21__recreate messages_properties with correct index.sql b/src/main/resources/db/specific/h2/V1.21__recreate messages_properties with correct index.sql
new file mode 100644
index 00000000..685318af
--- /dev/null
+++ b/src/main/resources/db/specific/h2/V1.21__recreate messages_properties with correct index.sql
@@ -0,0 +1,8 @@
+DROP TABLE messages_properties;
+CREATE TABLE messages_properties (
+ message_id int(10) unsigned NOT NULL,
+ reply_id smallint(5) unsigned NOT NULL,
+ property_key varchar(255) NOT NULL,
+ property_value mediumtext NOT NULL,
+ UNIQUE KEY message_key(message_id, reply_id, property_key)
+)
\ No newline at end of file
diff --git a/src/main/resources/db/specific/h2/V1.22__increase updated_at precision.sql b/src/main/resources/db/specific/h2/V1.22__increase updated_at precision.sql
new file mode 100644
index 00000000..22034ea2
--- /dev/null
+++ b/src/main/resources/db/specific/h2/V1.22__increase updated_at precision.sql
@@ -0,0 +1,2 @@
+ALTER TABLE replies MODIFY COLUMN updated_at timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE messages_txt MODIFY COLUMN updated_at timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
\ No newline at end of file
diff --git a/src/main/resources/db/specific/h2/V1.2__Drop telegram_chats.sql b/src/main/resources/db/specific/h2/V1.2__Drop telegram_chats.sql
new file mode 100644
index 00000000..c8faee0d
--- /dev/null
+++ b/src/main/resources/db/specific/h2/V1.2__Drop telegram_chats.sql
@@ -0,0 +1,2 @@
+INSERT INTO telegram(tg_id, tg_name, loginhash) SELECT chat_id AS tg_id, 'Anonymous', UUID() FROM telegram_chats;
+DROP TABLE telegram_chats;
\ No newline at end of file
diff --git a/src/main/resources/db/specific/h2/V1.3__Nullable user_id column in auth table.sql b/src/main/resources/db/specific/h2/V1.3__Nullable user_id column in auth table.sql
new file mode 100644
index 00000000..ced85ade
--- /dev/null
+++ b/src/main/resources/db/specific/h2/V1.3__Nullable user_id column in auth table.sql
@@ -0,0 +1 @@
+ALTER TABLE auth MODIFY COLUMN user_id int(10) unsigned NULL;
\ No newline at end of file
diff --git a/src/main/resources/db/specific/h2/V1.4__ActivityPub followers.sql b/src/main/resources/db/specific/h2/V1.4__ActivityPub followers.sql
new file mode 100644
index 00000000..16b39f62
--- /dev/null
+++ b/src/main/resources/db/specific/h2/V1.4__ActivityPub followers.sql
@@ -0,0 +1,7 @@
+CREATE TABLE IF NOT EXISTS `followers` (
+ `user_id` int(10) unsigned DEFAULT NULL,
+ `acct` char(64) NOT NULL,
+ `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ UNIQUE KEY `acct` (`acct`),
+ foreign key (user_id) references users(id)
+);
\ No newline at end of file
diff --git a/src/main/resources/db/specific/h2/V1.5__Drop acct index.sql b/src/main/resources/db/specific/h2/V1.5__Drop acct index.sql
new file mode 100644
index 00000000..58757d88
--- /dev/null
+++ b/src/main/resources/db/specific/h2/V1.5__Drop acct index.sql
@@ -0,0 +1,6 @@
+ALTER TABLE followers ADD COLUMN `acct_migr` char(64) NOT NULL;
+UPDATE followers SET `acct_migr` = `acct`;
+ALTER TABLE followers DROP COLUMN `acct`;
+ALTER TABLE followers ADD COLUMN `acct` char(64) NOT NULL;
+UPDATE followers SET `acct` = `acct_migr`;
+ALTER TABLE followers DROP COLUMN `acct_migr`;
\ No newline at end of file
diff --git a/src/main/resources/db/specific/h2/V1.6__user_uri.sql b/src/main/resources/db/specific/h2/V1.6__user_uri.sql
new file mode 100644
index 00000000..c302907c
--- /dev/null
+++ b/src/main/resources/db/specific/h2/V1.6__user_uri.sql
@@ -0,0 +1 @@
+ALTER TABLE replies ADD COLUMN user_uri char(255) DEFAULT NULL;
\ No newline at end of file
diff --git a/src/main/resources/db/specific/h2/V1.7__reply_uri.sql b/src/main/resources/db/specific/h2/V1.7__reply_uri.sql
new file mode 100644
index 00000000..9ec35485
--- /dev/null
+++ b/src/main/resources/db/specific/h2/V1.7__reply_uri.sql
@@ -0,0 +1 @@
+ALTER TABLE replies ADD COLUMN reply_uri char(255) DEFAULT NULL;
\ No newline at end of file
diff --git a/src/main/resources/db/specific/h2/V1.8__html reply.sql b/src/main/resources/db/specific/h2/V1.8__html reply.sql
new file mode 100644
index 00000000..9f939971
--- /dev/null
+++ b/src/main/resources/db/specific/h2/V1.8__html reply.sql
@@ -0,0 +1 @@
+ALTER TABLE replies ADD COLUMN html tinyint(4) NOT NULL DEFAULT '0';
\ No newline at end of file
diff --git a/src/main/resources/db/specific/mariadb/V1.10__favorites_user_uri.sql b/src/main/resources/db/specific/mariadb/V1.10__favorites_user_uri.sql
new file mode 100644
index 00000000..8f382398
--- /dev/null
+++ b/src/main/resources/db/specific/mariadb/V1.10__favorites_user_uri.sql
@@ -0,0 +1,3 @@
+ALTER TABLE favorites ADD COLUMN user_uri char(255) DEFAULT NULL;
+UPDATE favorites SET user_uri='' WHERE user_uri IS NULL;
+ALTER TABLE favorites MODIFY COLUMN user_uri char(255) NOT NULL DEFAULT '';
\ No newline at end of file
diff --git a/src/main/resources/db/specific/mariadb/V1.11__increase pm timestamp precision.sql b/src/main/resources/db/specific/mariadb/V1.11__increase pm timestamp precision.sql
new file mode 100644
index 00000000..e83eb621
--- /dev/null
+++ b/src/main/resources/db/specific/mariadb/V1.11__increase pm timestamp precision.sql
@@ -0,0 +1 @@
+ALTER TABLE pm MODIFY COLUMN ts timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
\ No newline at end of file
diff --git a/src/main/resources/db/specific/mariadb/V1.16__last seen.sql b/src/main/resources/db/specific/mariadb/V1.16__last seen.sql
new file mode 100644
index 00000000..52ca4e90
--- /dev/null
+++ b/src/main/resources/db/specific/mariadb/V1.16__last seen.sql
@@ -0,0 +1,2 @@
+ALTER TABLE users ADD COLUMN last_seen timestamp(6) NULL;
+UPDATE users SET last_seen=lastmessage;
\ No newline at end of file
diff --git a/src/main/resources/db/specific/mariadb/V1.18__increase messages and replies timestamp precision.sql b/src/main/resources/db/specific/mariadb/V1.18__increase messages and replies timestamp precision.sql
new file mode 100644
index 00000000..5b298c46
--- /dev/null
+++ b/src/main/resources/db/specific/mariadb/V1.18__increase messages and replies timestamp precision.sql
@@ -0,0 +1,5 @@
+ALTER TABLE replies MODIFY COLUMN ts timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE messages MODIFY COLUMN ts timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE messages MODIFY COLUMN updated timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE messages_txt MODIFY COLUMN updated_at timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE users MODIFY COLUMN lastmessage timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
diff --git a/src/main/resources/db/specific/mariadb/V1.19__messages_properties.sql b/src/main/resources/db/specific/mariadb/V1.19__messages_properties.sql
new file mode 100644
index 00000000..2bb3baf2
--- /dev/null
+++ b/src/main/resources/db/specific/mariadb/V1.19__messages_properties.sql
@@ -0,0 +1,6 @@
+CREATE TABLE messages_properties (
+ message_id int(10) unsigned NOT NULL,
+ property_key varchar(255) NOT NULL,
+ property_value mediumtext NOT NULL,
+ UNIQUE KEY message_key(message_id, property_key)
+)
\ No newline at end of file
diff --git a/src/main/resources/db/specific/mariadb/V1.20__reply id in messages_properties.sql b/src/main/resources/db/specific/mariadb/V1.20__reply id in messages_properties.sql
new file mode 100644
index 00000000..2ca5e018
--- /dev/null
+++ b/src/main/resources/db/specific/mariadb/V1.20__reply id in messages_properties.sql
@@ -0,0 +1 @@
+ALTER TABLE messages_properties ADD COLUMN reply_id smallint(5) unsigned NOT NULL
\ No newline at end of file
diff --git a/src/main/resources/db/specific/mariadb/V1.21__recreate messages_properties with correct index.sql b/src/main/resources/db/specific/mariadb/V1.21__recreate messages_properties with correct index.sql
new file mode 100644
index 00000000..685318af
--- /dev/null
+++ b/src/main/resources/db/specific/mariadb/V1.21__recreate messages_properties with correct index.sql
@@ -0,0 +1,8 @@
+DROP TABLE messages_properties;
+CREATE TABLE messages_properties (
+ message_id int(10) unsigned NOT NULL,
+ reply_id smallint(5) unsigned NOT NULL,
+ property_key varchar(255) NOT NULL,
+ property_value mediumtext NOT NULL,
+ UNIQUE KEY message_key(message_id, reply_id, property_key)
+)
\ No newline at end of file
diff --git a/src/main/resources/db/specific/mariadb/V1.22__increase updated_at precision.sql b/src/main/resources/db/specific/mariadb/V1.22__increase updated_at precision.sql
new file mode 100644
index 00000000..22034ea2
--- /dev/null
+++ b/src/main/resources/db/specific/mariadb/V1.22__increase updated_at precision.sql
@@ -0,0 +1,2 @@
+ALTER TABLE replies MODIFY COLUMN updated_at timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE messages_txt MODIFY COLUMN updated_at timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP;
\ No newline at end of file
diff --git a/src/main/resources/db/specific/mariadb/V1.2__Drop telegram_chats.sql b/src/main/resources/db/specific/mariadb/V1.2__Drop telegram_chats.sql
new file mode 100644
index 00000000..c8faee0d
--- /dev/null
+++ b/src/main/resources/db/specific/mariadb/V1.2__Drop telegram_chats.sql
@@ -0,0 +1,2 @@
+INSERT INTO telegram(tg_id, tg_name, loginhash) SELECT chat_id AS tg_id, 'Anonymous', UUID() FROM telegram_chats;
+DROP TABLE telegram_chats;
\ No newline at end of file
diff --git a/src/main/resources/db/specific/mariadb/V1.3__Nullable user_id column in auth table.sql b/src/main/resources/db/specific/mariadb/V1.3__Nullable user_id column in auth table.sql
new file mode 100644
index 00000000..ced85ade
--- /dev/null
+++ b/src/main/resources/db/specific/mariadb/V1.3__Nullable user_id column in auth table.sql
@@ -0,0 +1 @@
+ALTER TABLE auth MODIFY COLUMN user_id int(10) unsigned NULL;
\ No newline at end of file
diff --git a/src/main/resources/db/specific/mariadb/V1.4__ActivityPub followers.sql b/src/main/resources/db/specific/mariadb/V1.4__ActivityPub followers.sql
new file mode 100644
index 00000000..16b39f62
--- /dev/null
+++ b/src/main/resources/db/specific/mariadb/V1.4__ActivityPub followers.sql
@@ -0,0 +1,7 @@
+CREATE TABLE IF NOT EXISTS `followers` (
+ `user_id` int(10) unsigned DEFAULT NULL,
+ `acct` char(64) NOT NULL,
+ `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ UNIQUE KEY `acct` (`acct`),
+ foreign key (user_id) references users(id)
+);
\ No newline at end of file
diff --git a/src/main/resources/db/specific/mariadb/V1.5__Drop acct index.sql b/src/main/resources/db/specific/mariadb/V1.5__Drop acct index.sql
new file mode 100644
index 00000000..58757d88
--- /dev/null
+++ b/src/main/resources/db/specific/mariadb/V1.5__Drop acct index.sql
@@ -0,0 +1,6 @@
+ALTER TABLE followers ADD COLUMN `acct_migr` char(64) NOT NULL;
+UPDATE followers SET `acct_migr` = `acct`;
+ALTER TABLE followers DROP COLUMN `acct`;
+ALTER TABLE followers ADD COLUMN `acct` char(64) NOT NULL;
+UPDATE followers SET `acct` = `acct_migr`;
+ALTER TABLE followers DROP COLUMN `acct_migr`;
\ No newline at end of file
diff --git a/src/main/resources/db/specific/mariadb/V1.6__user_uri.sql b/src/main/resources/db/specific/mariadb/V1.6__user_uri.sql
new file mode 100644
index 00000000..c302907c
--- /dev/null
+++ b/src/main/resources/db/specific/mariadb/V1.6__user_uri.sql
@@ -0,0 +1 @@
+ALTER TABLE replies ADD COLUMN user_uri char(255) DEFAULT NULL;
\ No newline at end of file
diff --git a/src/main/resources/db/specific/mariadb/V1.7__reply_uri.sql b/src/main/resources/db/specific/mariadb/V1.7__reply_uri.sql
new file mode 100644
index 00000000..9ec35485
--- /dev/null
+++ b/src/main/resources/db/specific/mariadb/V1.7__reply_uri.sql
@@ -0,0 +1 @@
+ALTER TABLE replies ADD COLUMN reply_uri char(255) DEFAULT NULL;
\ No newline at end of file
diff --git a/src/main/resources/db/specific/mariadb/V1.8__html reply.sql b/src/main/resources/db/specific/mariadb/V1.8__html reply.sql
new file mode 100644
index 00000000..9f939971
--- /dev/null
+++ b/src/main/resources/db/specific/mariadb/V1.8__html reply.sql
@@ -0,0 +1 @@
+ALTER TABLE replies ADD COLUMN html tinyint(4) NOT NULL DEFAULT '0';
\ No newline at end of file
diff --git a/src/main/resources/db/specific/postgresql/V1.10__favorites_user_uri.sql b/src/main/resources/db/specific/postgresql/V1.10__favorites_user_uri.sql
new file mode 100644
index 00000000..90e512bc
--- /dev/null
+++ b/src/main/resources/db/specific/postgresql/V1.10__favorites_user_uri.sql
@@ -0,0 +1,3 @@
+ALTER TABLE favorites ADD COLUMN user_uri character varying (255) DEFAULT NULL;
+UPDATE favorites SET user_uri='' WHERE user_uri IS NULL;
+ALTER TABLE favorites ALTER COLUMN user_uri SET DEFAULT '';
\ No newline at end of file
diff --git a/src/main/resources/db/specific/postgresql/V1.11__increase pm timestamp precision.sql b/src/main/resources/db/specific/postgresql/V1.11__increase pm timestamp precision.sql
new file mode 100644
index 00000000..c5a8e528
--- /dev/null
+++ b/src/main/resources/db/specific/postgresql/V1.11__increase pm timestamp precision.sql
@@ -0,0 +1 @@
+-- changes are not needed
\ No newline at end of file
diff --git a/src/main/resources/db/specific/postgresql/V1.16__last seen.sql b/src/main/resources/db/specific/postgresql/V1.16__last seen.sql
new file mode 100644
index 00000000..9543ca14
--- /dev/null
+++ b/src/main/resources/db/specific/postgresql/V1.16__last seen.sql
@@ -0,0 +1,2 @@
+ALTER TABLE users ADD COLUMN last_seen timestamp with time zone NULL;
+UPDATE users SET last_seen=TO_TIMESTAMP(lastmessage::double precision / 1000);
diff --git a/src/main/resources/db/specific/postgresql/V1.18__increase messages and replies timestamp precision copy.sql b/src/main/resources/db/specific/postgresql/V1.18__increase messages and replies timestamp precision copy.sql
new file mode 100644
index 00000000..99b7f5d5
--- /dev/null
+++ b/src/main/resources/db/specific/postgresql/V1.18__increase messages and replies timestamp precision copy.sql
@@ -0,0 +1,3 @@
+ALTER TABLE users DROP COLUMN lastmessage;
+ALTER TABLE users ADD COLUMN lastmessage timestamp with time zone;
+UPDATE users SET lastmessage=last_seen;
diff --git a/src/main/resources/db/specific/postgresql/V1.19__messages_properties.sql b/src/main/resources/db/specific/postgresql/V1.19__messages_properties.sql
new file mode 100644
index 00000000..f3b72f66
--- /dev/null
+++ b/src/main/resources/db/specific/postgresql/V1.19__messages_properties.sql
@@ -0,0 +1,6 @@
+CREATE TABLE messages_properties (
+ message_id bigint NOT NULL,
+ property_key character varying(255) NOT NULL,
+ property_value text NOT NULL,
+ CONSTRAINT message_key UNIQUE(message_id, property_key)
+)
diff --git a/src/main/resources/db/specific/postgresql/V1.20__reply id in messages_properties.sql b/src/main/resources/db/specific/postgresql/V1.20__reply id in messages_properties.sql
new file mode 100644
index 00000000..53d4f169
--- /dev/null
+++ b/src/main/resources/db/specific/postgresql/V1.20__reply id in messages_properties.sql
@@ -0,0 +1 @@
+ALTER TABLE messages_properties ADD COLUMN reply_id smallint NOT NULL
diff --git a/src/main/resources/db/specific/postgresql/V1.21__recreate messages_properties with correct index.sql b/src/main/resources/db/specific/postgresql/V1.21__recreate messages_properties with correct index.sql
new file mode 100644
index 00000000..eadc6f56
--- /dev/null
+++ b/src/main/resources/db/specific/postgresql/V1.21__recreate messages_properties with correct index.sql
@@ -0,0 +1,8 @@
+DROP TABLE messages_properties;
+CREATE TABLE messages_properties (
+ message_id bigint NOT NULL,
+ reply_id smallint NOT NULL,
+ property_key character varying(255) NOT NULL,
+ property_value text NOT NULL,
+ CONSTRAINT message_properties_key UNIQUE(message_id, reply_id, property_key)
+)
diff --git a/src/main/resources/db/specific/postgresql/V1.22__increase updated_at precision.sql b/src/main/resources/db/specific/postgresql/V1.22__increase updated_at precision.sql
new file mode 100644
index 00000000..dfb8628c
--- /dev/null
+++ b/src/main/resources/db/specific/postgresql/V1.22__increase updated_at precision.sql
@@ -0,0 +1 @@
+-- changes are not needed
diff --git a/src/main/resources/db/specific/postgresql/V1.2__Drop telegram_chats.sql b/src/main/resources/db/specific/postgresql/V1.2__Drop telegram_chats.sql
new file mode 100644
index 00000000..00e7fdbe
--- /dev/null
+++ b/src/main/resources/db/specific/postgresql/V1.2__Drop telegram_chats.sql
@@ -0,0 +1,3 @@
+CREATE EXTENSION IF NOT EXISTS "pgcrypto";
+INSERT INTO telegram(tg_id, tg_name, loginhash) SELECT chat_id AS tg_id, 'Anonymous', gen_random_uuid() FROM telegram_chats;
+DROP TABLE telegram_chats;
\ No newline at end of file
diff --git a/src/main/resources/db/specific/postgresql/V1.3__Nullable user_id column in auth table.sql b/src/main/resources/db/specific/postgresql/V1.3__Nullable user_id column in auth table.sql
new file mode 100644
index 00000000..eea8c2a6
--- /dev/null
+++ b/src/main/resources/db/specific/postgresql/V1.3__Nullable user_id column in auth table.sql
@@ -0,0 +1 @@
+ALTER TABLE auth ALTER COLUMN user_id DROP NOT NULL;
\ No newline at end of file
diff --git a/src/main/resources/db/specific/postgresql/V1.4__ActivityPub followers.sql b/src/main/resources/db/specific/postgresql/V1.4__ActivityPub followers.sql
new file mode 100644
index 00000000..fd75b87c
--- /dev/null
+++ b/src/main/resources/db/specific/postgresql/V1.4__ActivityPub followers.sql
@@ -0,0 +1,5 @@
+CREATE TABLE IF NOT EXISTS followers (
+ user_id bigint REFERENCES users(id),
+ acct character varying(64) NOT NULL UNIQUE,
+ ts timestamp with time zone DEFAULT now() NOT NULL
+);
\ No newline at end of file
diff --git a/src/main/resources/db/specific/postgresql/V1.5__Drop acct index.sql b/src/main/resources/db/specific/postgresql/V1.5__Drop acct index.sql
new file mode 100644
index 00000000..d4f1c6ef
--- /dev/null
+++ b/src/main/resources/db/specific/postgresql/V1.5__Drop acct index.sql
@@ -0,0 +1,6 @@
+ALTER TABLE followers ADD COLUMN acct_migr character varying(64) NOT NULL;
+UPDATE followers SET acct_migr = acct;
+ALTER TABLE followers DROP COLUMN acct;
+ALTER TABLE followers ADD COLUMN acct character varying(64) NOT NULL;
+UPDATE followers SET acct = acct_migr;
+ALTER TABLE followers DROP COLUMN acct_migr;
\ No newline at end of file
diff --git a/src/main/resources/db/specific/postgresql/V1.6__user_uri.sql b/src/main/resources/db/specific/postgresql/V1.6__user_uri.sql
new file mode 100644
index 00000000..c067810a
--- /dev/null
+++ b/src/main/resources/db/specific/postgresql/V1.6__user_uri.sql
@@ -0,0 +1 @@
+ALTER TABLE replies ADD COLUMN user_uri character varying(255) DEFAULT NULL;
diff --git a/src/main/resources/db/specific/postgresql/V1.7__reply_uri.sql b/src/main/resources/db/specific/postgresql/V1.7__reply_uri.sql
new file mode 100644
index 00000000..09dcfb56
--- /dev/null
+++ b/src/main/resources/db/specific/postgresql/V1.7__reply_uri.sql
@@ -0,0 +1 @@
+ALTER TABLE replies ADD COLUMN reply_uri character varying(255) DEFAULT NULL;
diff --git a/src/main/resources/db/specific/postgresql/V1.8__html reply.sql b/src/main/resources/db/specific/postgresql/V1.8__html reply.sql
new file mode 100644
index 00000000..88bcc04c
--- /dev/null
+++ b/src/main/resources/db/specific/postgresql/V1.8__html reply.sql
@@ -0,0 +1 @@
+ALTER TABLE replies ADD COLUMN html smallint NOT NULL DEFAULT '0';
\ No newline at end of file
diff --git a/src/main/resources/pg_schema_wip b/src/main/resources/pg_schema_wip
deleted file mode 100644
index 61178495..00000000
--- a/src/main/resources/pg_schema_wip
+++ /dev/null
@@ -1,1539 +0,0 @@
---
--- PostgreSQL database dump
---
-
-SET statement_timeout = 0;
-SET lock_timeout = 0;
-SET client_encoding = 'UTF8';
-SET standard_conforming_strings = off;
-SET check_function_bodies = false;
-SET client_min_messages = warning;
-SET escape_string_warning = off;
-
---
--- Name: juick; Type: SCHEMA; Schema: -; Owner: juick
---
-
-CREATE SCHEMA juick;
-
-
-ALTER SCHEMA juick OWNER TO juick;
-
---
--- Name: plpgsql; Type: EXTENSION; Schema: -; Owner:
---
-
-CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
-
-
---
--- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner:
---
-
-COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
-
-
-SET search_path = public, pg_catalog;
-
---
--- Name: auth_protocol; Type: TYPE; Schema: public; Owner: juick
---
-
-CREATE TYPE auth_protocol AS ENUM (
- 'xmpp',
- 'email',
- 'sms'
-);
-
-
-ALTER TYPE auth_protocol OWNER TO juick;
-
---
--- Name: messages_attach; Type: TYPE; Schema: public; Owner: juick
---
-
-CREATE TYPE messages_attach AS ENUM (
- 'jpg',
- 'mp4',
- 'png'
-);
-
-
-ALTER TYPE messages_attach OWNER TO juick;
-
---
--- Name: messages_lang; Type: TYPE; Schema: public; Owner: juick
---
-
-CREATE TYPE messages_lang AS ENUM (
- 'en',
- 'ru',
- 'fr',
- 'fa',
- '__'
-);
-
-
-ALTER TYPE messages_lang OWNER TO juick;
-
---
--- Name: replies_attach; Type: TYPE; Schema: public; Owner: juick
---
-
-CREATE TYPE replies_attach AS ENUM (
- 'jpg',
- 'mp4',
- 'png'
-);
-
-
-ALTER TYPE replies_attach OWNER TO juick;
-
---
--- Name: users_lang; Type: TYPE; Schema: public; Owner: juick
---
-
-CREATE TYPE users_lang AS ENUM (
- 'en',
- 'ru',
- 'fr',
- 'fa',
- '__'
-);
-
-
-ALTER TYPE users_lang OWNER TO juick;
-
-SET default_tablespace = '';
-
-SET default_with_oids = false;
-
---
--- Name: ads_messages; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE ads_messages (
- message_id bigint NOT NULL
-);
-
-
-ALTER TABLE ads_messages OWNER TO juick;
-
---
--- Name: ads_messages_log; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE ads_messages_log (
- user_id bigint NOT NULL,
- message_id bigint NOT NULL,
- ts bigint DEFAULT 0::bigint NOT NULL
-);
-
-
-ALTER TABLE ads_messages_log OWNER TO juick;
-
---
--- Name: android; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE android (
- user_id bigint NOT NULL,
- regid character varying(255) NOT NULL,
- ts timestamp with time zone DEFAULT now() NOT NULL
-);
-
-
-ALTER TABLE android OWNER TO juick;
-
---
--- Name: auth; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE auth (
- user_id bigint NOT NULL,
- protocol auth_protocol NOT NULL,
- account character varying(64) NOT NULL,
- authcode character varying(8) NOT NULL
-);
-
-
-ALTER TABLE auth OWNER TO juick;
-
---
--- Name: bl_tags; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE bl_tags (
- user_id bigint NOT NULL,
- tag_id bigint NOT NULL
-);
-
-
-ALTER TABLE bl_tags OWNER TO juick;
-
---
--- Name: bl_users; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE bl_users (
- user_id bigint NOT NULL,
- bl_user_id bigint NOT NULL,
- ts timestamp with time zone DEFAULT now() NOT NULL
-);
-
-
-ALTER TABLE bl_users OWNER TO juick;
-
---
--- Name: captcha; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE captcha (
- jid character varying(64) NOT NULL,
- hash character varying(16) NOT NULL,
- confirmed smallint NOT NULL
-);
-
-
-ALTER TABLE captcha OWNER TO juick;
-
---
--- Name: captchaimg; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE captchaimg (
- id character varying(16) NOT NULL,
- txt character varying(6) NOT NULL,
- ts timestamp with time zone DEFAULT now() NOT NULL,
- ip character varying(16) NOT NULL
-);
-
-
-ALTER TABLE captchaimg OWNER TO juick;
-
---
--- Name: emails; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE emails (
- user_id bigint NOT NULL,
- email character varying(64) NOT NULL,
- subscr_hour smallint
-);
-
-
-ALTER TABLE emails OWNER TO juick;
-
---
--- Name: facebook; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE facebook (
- user_id bigint,
- fb_id numeric NOT NULL,
- loginhash character varying(36),
- access_token character varying(255),
- ts timestamp with time zone DEFAULT now() NOT NULL,
- fb_name character varying(64) NOT NULL,
- fb_link character varying(255) NOT NULL,
- crosspost boolean DEFAULT true NOT NULL
-);
-
-
-ALTER TABLE facebook OWNER TO juick;
-
---
--- Name: favorites; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE favorites (
- user_id bigint NOT NULL,
- message_id bigint NOT NULL,
- ts timestamp with time zone
-);
-
-
-ALTER TABLE favorites OWNER TO juick;
-
---
--- Name: friends_facebook; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE friends_facebook (
- user_id bigint NOT NULL,
- friend_id numeric NOT NULL
-);
-
-
-ALTER TABLE friends_facebook OWNER TO juick;
-
---
--- Name: images; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE images (
- mid bigint NOT NULL,
- rid bigint NOT NULL,
- thumb bigint NOT NULL,
- small bigint NOT NULL,
- medium bigint NOT NULL,
- height bigint NOT NULL,
- width bigint NOT NULL
-);
-
-
-ALTER TABLE images OWNER TO juick;
-
---
--- Name: ios; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE ios (
- user_id bigint NOT NULL,
- token character varying(64) NOT NULL,
- ts timestamp with time zone DEFAULT now() NOT NULL
-);
-
-
-ALTER TABLE ios OWNER TO juick;
-
---
--- Name: jids; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE jids (
- user_id bigint,
- jid character varying(64) NOT NULL,
- active smallint DEFAULT 0 NOT NULL,
- loginhash character varying(36),
- ts timestamp with time zone DEFAULT now() NOT NULL
-);
-
-
-ALTER TABLE jids OWNER TO juick;
-
---
--- Name: logins; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE logins (
- user_id bigint NOT NULL,
- hash character varying(16) NOT NULL
-);
-
-
-ALTER TABLE logins OWNER TO juick;
-
---
--- Name: mail; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE mail (
- user_id bigint NOT NULL,
- hash character varying(16) NOT NULL
-);
-
-
-ALTER TABLE mail OWNER TO juick;
-
---
--- Name: meon; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE meon (
- id bigint NOT NULL,
- user_id bigint NOT NULL,
- link character varying(255) NOT NULL,
- name character varying(32) NOT NULL,
- ico smallint
-);
-
-
-ALTER TABLE meon OWNER TO juick;
-
---
--- Name: meon_id_seq; Type: SEQUENCE; Schema: public; Owner: juick
---
-
-CREATE SEQUENCE meon_id_seq
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-
-ALTER TABLE meon_id_seq OWNER TO juick;
-
---
--- Name: meon_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: juick
---
-
-ALTER SEQUENCE meon_id_seq OWNED BY meon.id;
-
-
---
--- Name: messages; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE messages (
- message_id bigint NOT NULL,
- user_id bigint NOT NULL,
- lang messages_lang DEFAULT '__'::messages_lang NOT NULL,
- ts timestamp with time zone DEFAULT now() NOT NULL,
- replies smallint DEFAULT 0::smallint NOT NULL,
- maxreplyid smallint DEFAULT 0::smallint NOT NULL,
- privacy smallint DEFAULT 1::smallint NOT NULL,
- readonly boolean DEFAULT false NOT NULL,
- attach messages_attach,
- place_id bigint,
- lat numeric(10,7),
- lon numeric(10,7),
- popular smallint DEFAULT 0::smallint NOT NULL,
- hidden smallint DEFAULT 0::smallint NOT NULL,
- likes smallint DEFAULT 0::smallint NOT NULL
-);
-
-
-ALTER TABLE messages OWNER TO juick;
-
---
--- Name: messages_access; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE messages_access (
- message_id bigint NOT NULL,
- user_id bigint NOT NULL
-);
-
-
-ALTER TABLE messages_access OWNER TO juick;
-
---
--- Name: messages_message_id_seq; Type: SEQUENCE; Schema: public; Owner: juick
---
-
-CREATE SEQUENCE messages_message_id_seq
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-
-ALTER TABLE messages_message_id_seq OWNER TO juick;
-
---
--- Name: messages_message_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: juick
---
-
-ALTER SEQUENCE messages_message_id_seq OWNED BY messages.message_id;
-
-
---
--- Name: messages_tags; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE messages_tags (
- message_id bigint NOT NULL,
- tag_id bigint NOT NULL
-);
-
-
-ALTER TABLE messages_tags OWNER TO juick;
-
---
--- Name: messages_txt; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE messages_txt (
- message_id bigint NOT NULL,
- tags text,
- repliesby text,
- txt text NOT NULL
-);
-
-
-ALTER TABLE messages_txt OWNER TO juick;
-
---
--- Name: messages_votes; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE messages_votes (
- message_id bigint NOT NULL,
- user_id bigint NOT NULL,
- vote smallint DEFAULT 1::smallint NOT NULL
-);
-
-
-ALTER TABLE messages_votes OWNER TO juick;
-
---
--- Name: places; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE places (
- place_id bigint NOT NULL,
- lat numeric(10,7) NOT NULL,
- lon numeric(10,7) NOT NULL,
- name character varying(64) NOT NULL,
- descr character varying(255),
- url character varying(128),
- user_id bigint NOT NULL,
- ts timestamp with time zone DEFAULT now() NOT NULL
-);
-
-
-ALTER TABLE places OWNER TO juick;
-
---
--- Name: places_place_id_seq; Type: SEQUENCE; Schema: public; Owner: juick
---
-
-CREATE SEQUENCE places_place_id_seq
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-
-ALTER TABLE places_place_id_seq OWNER TO juick;
-
---
--- Name: places_place_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: juick
---
-
-ALTER SEQUENCE places_place_id_seq OWNED BY places.place_id;
-
-
---
--- Name: places_tags; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE places_tags (
- place_id bigint NOT NULL,
- tag_id bigint NOT NULL
-);
-
-
-ALTER TABLE places_tags OWNER TO juick;
-
---
--- Name: pm; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE pm (
- user_id bigint NOT NULL,
- user_id_to bigint NOT NULL,
- ts timestamp with time zone DEFAULT now() NOT NULL,
- txt text NOT NULL
-);
-
-
-ALTER TABLE pm OWNER TO juick;
-
---
--- Name: pm_inroster; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE pm_inroster (
- user_id bigint NOT NULL,
- jid character varying(64) NOT NULL
-);
-
-
-ALTER TABLE pm_inroster OWNER TO juick;
-
---
--- Name: pm_streams; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE pm_streams (
- user_id bigint NOT NULL,
- user_id_to bigint NOT NULL,
- lastmessage timestamp with time zone NOT NULL,
- lastview timestamp with time zone,
- unread smallint DEFAULT 0::smallint NOT NULL
-);
-
-
-ALTER TABLE pm_streams OWNER TO juick;
-
---
--- Name: presence; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE presence (
- user_id bigint NOT NULL,
- jid character varying(64),
- ts timestamp with time zone DEFAULT now() NOT NULL
-);
-
-
-ALTER TABLE presence OWNER TO juick;
-
---
--- Name: reader_links; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE reader_links (
- link_id bigint NOT NULL,
- rss_id bigint NOT NULL,
- url character varying(255) NOT NULL,
- title character varying(255) NOT NULL,
- ts timestamp with time zone NOT NULL
-);
-
-
-ALTER TABLE reader_links OWNER TO juick;
-
---
--- Name: reader_links_link_id_seq; Type: SEQUENCE; Schema: public; Owner: juick
---
-
-CREATE SEQUENCE reader_links_link_id_seq
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-
-ALTER TABLE reader_links_link_id_seq OWNER TO juick;
-
---
--- Name: reader_links_link_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: juick
---
-
-ALTER SEQUENCE reader_links_link_id_seq OWNED BY reader_links.link_id;
-
-
---
--- Name: reader_rss; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE reader_rss (
- rss_id bigint NOT NULL,
- url character varying(255) NOT NULL,
- lastcheck timestamp with time zone NOT NULL
-);
-
-
-ALTER TABLE reader_rss OWNER TO juick;
-
---
--- Name: reader_rss_rss_id_seq; Type: SEQUENCE; Schema: public; Owner: juick
---
-
-CREATE SEQUENCE reader_rss_rss_id_seq
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-
-ALTER TABLE reader_rss_rss_id_seq OWNER TO juick;
-
---
--- Name: reader_rss_rss_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: juick
---
-
-ALTER SEQUENCE reader_rss_rss_id_seq OWNED BY reader_rss.rss_id;
-
-
---
--- Name: replies; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE replies (
- message_id bigint NOT NULL,
- reply_id smallint NOT NULL,
- user_id bigint NOT NULL,
- replyto smallint DEFAULT 0::smallint NOT NULL,
- ts timestamp with time zone DEFAULT now() NOT NULL,
- attach replies_attach,
- txt text NOT NULL
-);
-
-
-ALTER TABLE replies OWNER TO juick;
-
---
--- Name: sphinx; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE sphinx (
- counter_id smallint NOT NULL,
- max_id bigint NOT NULL
-);
-
-
-ALTER TABLE sphinx OWNER TO juick;
-
---
--- Name: subscr_messages; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE subscr_messages (
- message_id bigint NOT NULL,
- suser_id bigint NOT NULL
-);
-
-
-ALTER TABLE subscr_messages OWNER TO juick;
-
---
--- Name: subscr_tags; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE subscr_tags (
- tag_id bigint NOT NULL,
- suser_id bigint NOT NULL,
- jid character varying(64) NOT NULL,
- active boolean NOT NULL
-);
-
-
-ALTER TABLE subscr_tags OWNER TO juick;
-
---
--- Name: subscr_users; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE subscr_users (
- user_id bigint NOT NULL,
- suser_id bigint NOT NULL,
- jid character varying(64),
- active boolean NOT NULL,
- ts timestamp with time zone DEFAULT now() NOT NULL
-);
-
-
-ALTER TABLE subscr_users OWNER TO juick;
-
---
--- Name: tags; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE tags (
- tag_id bigint NOT NULL,
- synonym_id bigint,
- name character varying(70),
- top boolean DEFAULT false NOT NULL,
- noindex boolean DEFAULT false NOT NULL,
- stat_messages bigint DEFAULT 0::bigint NOT NULL,
- stat_users smallint DEFAULT 0::smallint NOT NULL
-);
-
-
-ALTER TABLE tags OWNER TO juick;
-
---
--- Name: tags_ignore; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE tags_ignore (
- tag_id bigint NOT NULL
-);
-
-
-ALTER TABLE tags_ignore OWNER TO juick;
-
---
--- Name: tags_synonyms; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE tags_synonyms (
- name character varying(64) NOT NULL,
- changeto character varying(64) NOT NULL
-);
-
-
-ALTER TABLE tags_synonyms OWNER TO juick;
-
---
--- Name: tags_tag_id_seq; Type: SEQUENCE; Schema: public; Owner: juick
---
-
-CREATE SEQUENCE tags_tag_id_seq
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-
-ALTER TABLE tags_tag_id_seq OWNER TO juick;
-
---
--- Name: tags_tag_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: juick
---
-
-ALTER SEQUENCE tags_tag_id_seq OWNED BY tags.tag_id;
-
-
---
--- Name: telegram; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE telegram (
- user_id bigint,
- tg_id numeric NOT NULL,
- tg_name character varying(64) NOT NULL,
- ts timestamp with time zone DEFAULT now() NOT NULL,
- loginhash character varying(36)
-);
-
-
-ALTER TABLE telegram OWNER TO juick;
-
---
--- Name: telegram_chats; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE telegram_chats (
- chat_id numeric
-);
-
-
-ALTER TABLE telegram_chats OWNER TO juick;
-
---
--- Name: top_ignore_messages; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE top_ignore_messages (
- message_id bigint NOT NULL
-);
-
-
-ALTER TABLE top_ignore_messages OWNER TO juick;
-
---
--- Name: top_ignore_tags; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE top_ignore_tags (
- tag_id bigint NOT NULL
-);
-
-
-ALTER TABLE top_ignore_tags OWNER TO juick;
-
---
--- Name: top_ignore_users; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE top_ignore_users (
- user_id bigint NOT NULL
-);
-
-
-ALTER TABLE top_ignore_users OWNER TO juick;
-
---
--- Name: twitter; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE twitter (
- user_id bigint NOT NULL,
- access_token character varying(64) NOT NULL,
- access_token_secret character varying(64) NOT NULL,
- uname character varying(64) NOT NULL,
- ts timestamp with time zone DEFAULT now() NOT NULL,
- crosspost boolean DEFAULT true NOT NULL
-);
-
-
-ALTER TABLE twitter OWNER TO juick;
-
---
--- Name: useroptions; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE useroptions (
- user_id bigint NOT NULL,
- jnotify boolean DEFAULT true NOT NULL,
- subscr_active boolean DEFAULT true NOT NULL,
- off_ts timestamp with time zone,
- xmppxhtml boolean DEFAULT false NOT NULL,
- subscr_notify boolean DEFAULT true NOT NULL,
- recommendations boolean DEFAULT true NOT NULL,
- privacy_view boolean DEFAULT true NOT NULL,
- privacy_reply boolean DEFAULT true NOT NULL,
- privacy_pm boolean DEFAULT true NOT NULL,
- repliesview boolean DEFAULT false NOT NULL
-);
-
-
-ALTER TABLE useroptions OWNER TO juick;
-
---
--- Name: users; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE users (
- id bigint NOT NULL,
- nick character varying(64) NOT NULL,
- passw character varying(32) NOT NULL,
- lang users_lang DEFAULT '__'::users_lang NOT NULL,
- banned smallint DEFAULT 0::smallint NOT NULL,
- lastmessage bigint DEFAULT 0::bigint NOT NULL,
- lastpm bigint DEFAULT 0::bigint NOT NULL,
- lastphoto bigint DEFAULT 0::bigint NOT NULL,
- karma smallint DEFAULT 0::smallint NOT NULL
-);
-
-
-ALTER TABLE users OWNER TO juick;
-
---
--- Name: users_id_seq; Type: SEQUENCE; Schema: public; Owner: juick
---
-
-CREATE SEQUENCE users_id_seq
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-
-ALTER TABLE users_id_seq OWNER TO juick;
-
---
--- Name: users_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: juick
---
-
-ALTER SEQUENCE users_id_seq OWNED BY users.id;
-
-
---
--- Name: users_refs; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE users_refs (
- user_id bigint NOT NULL,
- ref bigint NOT NULL
-);
-
-
-ALTER TABLE users_refs OWNER TO juick;
-
---
--- Name: users_subscr; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE users_subscr (
- user_id bigint NOT NULL,
- cnt smallint DEFAULT 0::smallint NOT NULL
-);
-
-
-ALTER TABLE users_subscr OWNER TO juick;
-
---
--- Name: usersinfo; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE usersinfo (
- user_id bigint NOT NULL,
- jid character varying(32),
- fullname character varying(32),
- country character varying(32),
- url character varying(64),
- gender character varying(32),
- bday character varying(10),
- descr text
-);
-
-
-ALTER TABLE usersinfo OWNER TO juick;
-
---
--- Name: version; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE version (
- version numeric NOT NULL
-);
-
-
-ALTER TABLE version OWNER TO juick;
-
---
--- Name: vk; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE vk (
- user_id bigint,
- vk_id numeric NOT NULL,
- loginhash character varying(36),
- access_token character varying(128) NOT NULL,
- ts timestamp with time zone DEFAULT now() NOT NULL,
- vk_name character varying(64) NOT NULL,
- vk_link character varying(64) NOT NULL,
- crosspost smallint DEFAULT 1::smallint NOT NULL
-);
-
-
-ALTER TABLE vk OWNER TO juick;
-
---
--- Name: winphone; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE winphone (
- user_id bigint NOT NULL,
- url character varying(255) NOT NULL,
- ts timestamp with time zone DEFAULT now() NOT NULL
-);
-
-
-ALTER TABLE winphone OWNER TO juick;
-
---
--- Name: wl_users; Type: TABLE; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE TABLE wl_users (
- user_id bigint NOT NULL,
- wl_user_id bigint NOT NULL
-);
-
-
-ALTER TABLE wl_users OWNER TO juick;
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: juick
---
-
-ALTER TABLE ONLY meon ALTER COLUMN id SET DEFAULT nextval('meon_id_seq'::regclass);
-
-
---
--- Name: message_id; Type: DEFAULT; Schema: public; Owner: juick
---
-
-ALTER TABLE ONLY messages ALTER COLUMN message_id SET DEFAULT nextval('messages_message_id_seq'::regclass);
-
-
---
--- Name: place_id; Type: DEFAULT; Schema: public; Owner: juick
---
-
-ALTER TABLE ONLY places ALTER COLUMN place_id SET DEFAULT nextval('places_place_id_seq'::regclass);
-
-
---
--- Name: link_id; Type: DEFAULT; Schema: public; Owner: juick
---
-
-ALTER TABLE ONLY reader_links ALTER COLUMN link_id SET DEFAULT nextval('reader_links_link_id_seq'::regclass);
-
-
---
--- Name: rss_id; Type: DEFAULT; Schema: public; Owner: juick
---
-
-ALTER TABLE ONLY reader_rss ALTER COLUMN rss_id SET DEFAULT nextval('reader_rss_rss_id_seq'::regclass);
-
-
---
--- Name: tag_id; Type: DEFAULT; Schema: public; Owner: juick
---
-
-ALTER TABLE ONLY tags ALTER COLUMN tag_id SET DEFAULT nextval('tags_tag_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: juick
---
-
-ALTER TABLE ONLY users ALTER COLUMN id SET DEFAULT nextval('users_id_seq'::regclass);
-
-
---
--- Name: idx_20438_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
---
-
-ALTER TABLE ONLY images
- ADD CONSTRAINT idx_20438_primary PRIMARY KEY (mid, rid);
-
-
---
--- Name: idx_20453_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
---
-
-ALTER TABLE ONLY mail
- ADD CONSTRAINT idx_20453_primary PRIMARY KEY (user_id);
-
-
---
--- Name: idx_20458_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
---
-
-ALTER TABLE ONLY meon
- ADD CONSTRAINT idx_20458_primary PRIMARY KEY (id);
-
-
---
--- Name: idx_20483_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
---
-
-ALTER TABLE ONLY messages
- ADD CONSTRAINT idx_20483_primary PRIMARY KEY (message_id);
-
-
---
--- Name: idx_20502_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
---
-
-ALTER TABLE ONLY messages_txt
- ADD CONSTRAINT idx_20502_primary PRIMARY KEY (message_id);
-
-
---
--- Name: idx_20514_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
---
-
-ALTER TABLE ONLY places
- ADD CONSTRAINT idx_20514_primary PRIMARY KEY (place_id);
-
-
---
--- Name: idx_20542_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
---
-
-ALTER TABLE ONLY reader_links
- ADD CONSTRAINT idx_20542_primary PRIMARY KEY (link_id);
-
-
---
--- Name: idx_20551_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
---
-
-ALTER TABLE ONLY reader_rss
- ADD CONSTRAINT idx_20551_primary PRIMARY KEY (rss_id);
-
-
---
--- Name: idx_20571_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
---
-
-ALTER TABLE ONLY sphinx
- ADD CONSTRAINT idx_20571_primary PRIMARY KEY (counter_id);
-
-
---
--- Name: idx_20586_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
---
-
-ALTER TABLE ONLY tags
- ADD CONSTRAINT idx_20586_primary PRIMARY KEY (tag_id);
-
-
---
--- Name: idx_20616_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
---
-
-ALTER TABLE ONLY top_ignore_tags
- ADD CONSTRAINT idx_20616_primary PRIMARY KEY (tag_id);
-
-
---
--- Name: idx_20619_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
---
-
-ALTER TABLE ONLY top_ignore_users
- ADD CONSTRAINT idx_20619_primary PRIMARY KEY (user_id);
-
-
---
--- Name: idx_20622_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
---
-
-ALTER TABLE ONLY twitter
- ADD CONSTRAINT idx_20622_primary PRIMARY KEY (user_id);
-
-
---
--- Name: idx_20627_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
---
-
-ALTER TABLE ONLY useroptions
- ADD CONSTRAINT idx_20627_primary PRIMARY KEY (user_id);
-
-
---
--- Name: idx_20653_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
---
-
-ALTER TABLE ONLY users
- ADD CONSTRAINT idx_20653_primary PRIMARY KEY (id);
-
-
---
--- Name: idx_20663_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
---
-
-ALTER TABLE ONLY usersinfo
- ADD CONSTRAINT idx_20663_primary PRIMARY KEY (user_id);
-
-
---
--- Name: idx_20672_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
---
-
-ALTER TABLE ONLY users_subscr
- ADD CONSTRAINT idx_20672_primary PRIMARY KEY (user_id);
-
-
---
--- Name: idx_20694_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
---
-
-ALTER TABLE ONLY wl_users
- ADD CONSTRAINT idx_20694_primary PRIMARY KEY (user_id, wl_user_id);
-
-
---
--- Name: idx_29418_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
---
-
-ALTER TABLE ONLY bl_users
- ADD CONSTRAINT idx_29418_primary PRIMARY KEY (user_id, bl_user_id);
-
-
---
--- Name: idx_20390_regid; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE UNIQUE INDEX idx_20390_regid ON android USING btree (regid);
-
-
---
--- Name: idx_20390_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20390_user_id ON android USING btree (user_id);
-
-
---
--- Name: idx_20404_tag_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20404_tag_id ON bl_tags USING btree (tag_id);
-
-
---
--- Name: idx_20404_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20404_user_id ON bl_tags USING btree (user_id);
-
-
---
--- Name: idx_20418_email; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20418_email ON emails USING btree (email);
-
-
---
--- Name: idx_20421_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20421_user_id ON facebook USING btree (user_id);
-
-
---
--- Name: idx_20432_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE UNIQUE INDEX idx_20432_user_id ON friends_facebook USING btree (user_id, friend_id);
-
-
---
--- Name: idx_20441_token; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE UNIQUE INDEX idx_20441_token ON ios USING btree (token);
-
-
---
--- Name: idx_20441_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20441_user_id ON ios USING btree (user_id);
-
-
---
--- Name: idx_20445_jid; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE UNIQUE INDEX idx_20445_jid ON jids USING btree (jid);
-
-
---
--- Name: idx_20445_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20445_user_id ON jids USING btree (user_id);
-
-
---
--- Name: idx_20450_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE UNIQUE INDEX idx_20450_user_id ON logins USING btree (user_id);
-
-
---
--- Name: idx_20483_attach; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20483_attach ON messages USING btree (attach);
-
-
---
--- Name: idx_20483_hidden; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20483_hidden ON messages USING btree (hidden);
-
-
---
--- Name: idx_20483_place_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20483_place_id ON messages USING btree (place_id);
-
-
---
--- Name: idx_20483_popular; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20483_popular ON messages USING btree (popular);
-
-
---
--- Name: idx_20483_ts; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20483_ts ON messages USING btree (ts);
-
-
---
--- Name: idx_20483_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20483_user_id ON messages USING btree (user_id);
-
-
---
--- Name: idx_20496_message_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20496_message_id ON messages_access USING btree (message_id);
-
-
---
--- Name: idx_20499_message_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20499_message_id ON messages_tags USING btree (message_id);
-
-
---
--- Name: idx_20499_message_id_2; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE UNIQUE INDEX idx_20499_message_id_2 ON messages_tags USING btree (message_id, tag_id);
-
-
---
--- Name: idx_20499_tag_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20499_tag_id ON messages_tags USING btree (tag_id);
-
-
---
--- Name: idx_20508_message_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE UNIQUE INDEX idx_20508_message_id ON messages_votes USING btree (message_id, user_id);
-
-
---
--- Name: idx_20529_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20529_user_id ON pm_inroster USING btree (user_id);
-
-
---
--- Name: idx_20529_user_id_2; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE UNIQUE INDEX idx_20529_user_id_2 ON pm_inroster USING btree (user_id, jid);
-
-
---
--- Name: idx_20532_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE UNIQUE INDEX idx_20532_user_id ON pm_streams USING btree (user_id, user_id_to);
-
-
---
--- Name: idx_20536_jid; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE UNIQUE INDEX idx_20536_jid ON presence USING btree (jid);
-
-
---
--- Name: idx_20563_message_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20563_message_id ON replies USING btree (message_id);
-
-
---
--- Name: idx_20563_ts; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20563_ts ON replies USING btree (ts);
-
-
---
--- Name: idx_20563_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20563_user_id ON replies USING btree (user_id);
-
-
---
--- Name: idx_20574_message_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE UNIQUE INDEX idx_20574_message_id ON subscr_messages USING btree (message_id, suser_id);
-
-
---
--- Name: idx_20577_tag_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE UNIQUE INDEX idx_20577_tag_id ON subscr_tags USING btree (tag_id, suser_id);
-
-
---
--- Name: idx_20580_suser_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20580_suser_id ON subscr_users USING btree (suser_id);
-
-
---
--- Name: idx_20580_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE UNIQUE INDEX idx_20580_user_id ON subscr_users USING btree (user_id, suser_id);
-
-
---
--- Name: idx_20586_synonym_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20586_synonym_id ON tags USING btree (synonym_id);
-
-
---
--- Name: idx_20607_chat_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE UNIQUE INDEX idx_20607_chat_id ON telegram_chats USING btree (chat_id);
-
-
---
--- Name: idx_20627_recommendations; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20627_recommendations ON useroptions USING btree (recommendations);
-
-
---
--- Name: idx_20653_nick; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE UNIQUE INDEX idx_20653_nick ON users USING btree (nick);
-
-
---
--- Name: idx_20669_ref; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20669_ref ON users_refs USING btree (ref);
-
-
---
--- Name: idx_20682_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20682_user_id ON vk USING btree (user_id);
-
-
---
--- Name: idx_20690_url; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE UNIQUE INDEX idx_20690_url ON winphone USING btree (url);
-
-
---
--- Name: idx_20690_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_20690_user_id ON winphone USING btree (user_id);
-
-
---
--- Name: idx_29422_message_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_29422_message_id ON favorites USING btree (message_id);
-
-
---
--- Name: idx_29422_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE INDEX idx_29422_user_id ON favorites USING btree (user_id);
-
-
---
--- Name: idx_29422_user_id_2; Type: INDEX; Schema: public; Owner: juick; Tablespace:
---
-
-CREATE UNIQUE INDEX idx_29422_user_id_2 ON favorites USING btree (user_id, message_id);
-
-
---
--- Name: public; Type: ACL; Schema: -; Owner: postgres
---
-
-REVOKE ALL ON SCHEMA public FROM PUBLIC;
-REVOKE ALL ON SCHEMA public FROM postgres;
-GRANT ALL ON SCHEMA public TO postgres;
-GRANT ALL ON SCHEMA public TO PUBLIC;
-
-
---
--- PostgreSQL database dump complete
---
-
diff --git a/src/test/java/com/juick/server/tests/ServerTests.java b/src/test/java/com/juick/server/tests/ServerTests.java
index d80c9251..3a7697e1 100644
--- a/src/test/java/com/juick/server/tests/ServerTests.java
+++ b/src/test/java/com/juick/server/tests/ServerTests.java
@@ -77,6 +77,7 @@ import java.security.NoSuchProviderException;
import java.security.spec.InvalidKeySpecException;
import java.sql.Timestamp;
import java.time.Instant;
+import java.time.OffsetDateTime;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
@@ -182,7 +183,6 @@ import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
-import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mockito;
@@ -204,7 +204,6 @@ import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.context.TestPropertySource;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.client.MockRestServiceServer;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
@@ -242,13 +241,11 @@ import ru.sape.SapePageLinks;
/**
* Created by vitalyster on 25.11.2016.
*/
-@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@TestPropertySource(properties = { "ios_app_id=12345678.com.juick.ExampleApp" })
@AutoConfigureMockMvc
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ServerTests {
-
@Inject
private MockMvc mockMvc;
@Inject
@@ -913,8 +910,8 @@ public class ServerTests {
assertThat(yoyoMsg.getNewMessage().get().getTags().stream().findFirst().get(), is(yo));
Message msg2 = yoyoMsg.getNewMessage().get();
int mid = msg2.getMid();
- Timestamp last = jdbcTemplate.queryForObject("SELECT lastmessage FROM users WHERE id=?",
- Timestamp.class,
+ var last = jdbcTemplate.queryForObject("SELECT lastmessage FROM users WHERE id=?",
+ OffsetDateTime.class,
user.getUid());
assertThat(last.toInstant(), equalTo(yoyoMsg.getNewMessage().get().getCreated()));
assertEquals(true,
@@ -960,8 +957,8 @@ public class ServerTests {
URI.create("https://static.juick.com/settings/facebook.png")).getText());
Message reply = messagesService.getReplies(user, mid).stream().filter(m -> m.getRid() == 3).findFirst()
.orElse(new Message());
- Timestamp lastreply = jdbcTemplate.queryForObject("SELECT lastmessage FROM users WHERE id=?",
- Timestamp.class,
+ var lastreply = jdbcTemplate.queryForObject("SELECT lastmessage FROM users WHERE id=?",
+ OffsetDateTime.class,
user.getUid());
assertThat(lastreply.toInstant(), equalTo(reply.getCreated()));
assertEquals(2, reply.getReplyto());
@@ -1536,7 +1533,8 @@ public class ServerTests {
original.getMid());
assertThat(messagesService.deleteMessage(ugnich.getUid(), original.getMid()), is(true));
assertThat(messagesService.getMessageAuthor(original.getMid()), is(archiveUser));
- jdbcTemplate.update("UPDATE messages_txt SET updated_at=? WHERE message_id=?", Instant.now(),
+ jdbcTemplate.update("UPDATE messages_txt SET updated_at=? WHERE message_id=?",
+ Timestamp.from(Instant.now()),
original.getMid());
assertThat(messagesService.deleteMessage(ugnich.getUid(), original.getMid()), is(false));
assertThat(messagesService.deleteMessage(archiveUser.getUid(), original.getMid()), is(true));
@@ -2306,6 +2304,7 @@ public class ServerTests {
@Test
public void XMPPSignupIsDisabled() throws Exception {
+ jdbcTemplate.execute("DELETE FROM jids");
jdbcTemplate.update("INSERT INTO jids(loginhash, jid) VALUES('1', 'test@jid.tld')");
MvcResult formLoginResult = mockMvc
.perform(post("/login").with(csrf()).param("username", ugnichName).param("password",
@@ -2333,8 +2332,8 @@ public class ServerTests {
@Test
public void verifiedUsersTest() {
assertThat(userService.getUserByName("ugnich").isVerified(), is(false));
- jdbcTemplate.update("INSERT INTO telegram(user_id, tg_id) VALUES(?, ?)", ugnich.getUid(),
- "100001866137681");
+ jdbcTemplate.update("INSERT INTO telegram(user_id, tg_id, tg_name) VALUES(?, ?, ?)", ugnich.getUid(),
+ "100001866137681", "tg_test");
assertThat(userService.canDeleteTelegramUser(userService.getUserByName("ugnich")), is(false));
userService.addFacebookState("12345", "http://localhost");
userService.createFacebookUser(12345, "12345", "5678", "ugnich");
diff --git a/src/test/resources/schema-postgres.sql b/src/test/resources/schema-postgres.sql
new file mode 100644
index 00000000..7c4406f0
--- /dev/null
+++ b/src/test/resources/schema-postgres.sql
@@ -0,0 +1,1516 @@
+--
+-- PostgreSQL database dump
+--
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = off;
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+SET escape_string_warning = off;
+
+SET search_path = public, pg_catalog;
+
+CREATE COLLATION case_insensitive (provider = icu, locale = 'und-u-ks-level2', deterministic = false);
+--
+-- Name: auth_protocol; Type: TYPE; Schema: public; Owner: juick
+--
+
+CREATE TYPE auth_protocol AS ENUM (
+ 'xmpp',
+ 'email',
+ 'sms'
+);
+
+
+ALTER TYPE auth_protocol OWNER TO juick;
+
+--
+-- Name: messages_attach; Type: TYPE; Schema: public; Owner: juick
+--
+
+CREATE TYPE messages_attach AS ENUM (
+ 'jpg',
+ 'mp4',
+ 'png'
+);
+
+
+ALTER TYPE messages_attach OWNER TO juick;
+
+--
+-- Name: messages_lang; Type: TYPE; Schema: public; Owner: juick
+--
+
+CREATE TYPE messages_lang AS ENUM (
+ 'en',
+ 'ru',
+ 'fr',
+ 'fa',
+ '__'
+);
+
+
+ALTER TYPE messages_lang OWNER TO juick;
+
+--
+-- Name: replies_attach; Type: TYPE; Schema: public; Owner: juick
+--
+
+CREATE TYPE replies_attach AS ENUM (
+ 'jpg',
+ 'mp4',
+ 'png'
+);
+
+
+ALTER TYPE replies_attach OWNER TO juick;
+
+--
+-- Name: users_lang; Type: TYPE; Schema: public; Owner: juick
+--
+
+CREATE TYPE users_lang AS ENUM (
+ 'en',
+ 'ru',
+ 'fr',
+ 'fa',
+ '__'
+);
+
+
+ALTER TYPE users_lang OWNER TO juick;
+
+SET default_tablespace = '';
+
+SET default_with_oids = false;
+
+--
+-- Name: ads_messages; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE ads_messages (
+ message_id bigint NOT NULL
+);
+
+
+ALTER TABLE ads_messages OWNER TO juick;
+
+--
+-- Name: ads_messages_log; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE ads_messages_log (
+ user_id bigint NOT NULL,
+ message_id bigint NOT NULL,
+ ts bigint DEFAULT 0::bigint NOT NULL
+);
+
+
+ALTER TABLE ads_messages_log OWNER TO juick;
+
+--
+-- Name: android; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE android (
+ user_id bigint NOT NULL,
+ regid character varying(255) NOT NULL,
+ ts timestamp with time zone DEFAULT now() NOT NULL
+);
+
+
+ALTER TABLE android OWNER TO juick;
+
+--
+-- Name: auth; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE auth (
+ user_id bigint NOT NULL,
+ protocol auth_protocol NOT NULL,
+ account character varying(64) NOT NULL,
+ authcode character varying(8) NOT NULL
+);
+
+
+ALTER TABLE auth OWNER TO juick;
+
+--
+-- Name: bl_tags; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE bl_tags (
+ user_id bigint NOT NULL,
+ tag_id bigint NOT NULL
+);
+
+
+ALTER TABLE bl_tags OWNER TO juick;
+
+--
+-- Name: bl_users; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE bl_users (
+ user_id bigint NOT NULL,
+ bl_user_id bigint NOT NULL,
+ ts timestamp with time zone DEFAULT now() NOT NULL
+);
+
+
+ALTER TABLE bl_users OWNER TO juick;
+
+--
+-- Name: captcha; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE captcha (
+ jid character varying(64) NOT NULL,
+ hash character varying(16) NOT NULL,
+ confirmed smallint NOT NULL
+);
+
+
+ALTER TABLE captcha OWNER TO juick;
+
+--
+-- Name: captchaimg; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE captchaimg (
+ id character varying(16) NOT NULL,
+ txt character varying(6) NOT NULL,
+ ts timestamp with time zone DEFAULT now() NOT NULL,
+ ip character varying(16) NOT NULL
+);
+
+
+ALTER TABLE captchaimg OWNER TO juick;
+
+--
+-- Name: emails; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE emails (
+ user_id bigint NOT NULL,
+ email character varying(64) NOT NULL,
+ subscr_hour smallint
+);
+
+
+ALTER TABLE emails OWNER TO juick;
+
+--
+-- Name: facebook; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE facebook (
+ user_id bigint,
+ fb_id numeric,
+ loginhash character varying(36),
+ access_token character varying(255),
+ ts timestamp with time zone DEFAULT now() NOT NULL,
+ fb_name character varying(64),
+ fb_link character varying(255) NOT NULL,
+ crosspost boolean DEFAULT true NOT NULL
+);
+
+
+ALTER TABLE facebook OWNER TO juick;
+
+CREATE TABLE reactions (
+ like_id smallint NOT NULL,
+ description character varying (100) NOT NULL,
+ PRIMARY KEY(like_id)
+);
+
+--
+-- Name: favorites; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE favorites (
+ user_id bigint NOT NULL,
+ message_id bigint NOT NULL,
+ ts timestamp with time zone,
+ like_id smallint references reactions(like_id) not null default 1
+);
+
+
+ALTER TABLE favorites OWNER TO juick;
+
+--
+-- Name: friends_facebook; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE friends_facebook (
+ user_id bigint NOT NULL,
+ friend_id numeric NOT NULL
+);
+
+
+ALTER TABLE friends_facebook OWNER TO juick;
+
+--
+-- Name: images; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE images (
+ mid bigint NOT NULL,
+ rid bigint NOT NULL,
+ thumb bigint NOT NULL,
+ small bigint NOT NULL,
+ medium bigint NOT NULL,
+ height bigint NOT NULL,
+ width bigint NOT NULL
+);
+
+
+ALTER TABLE images OWNER TO juick;
+
+--
+-- Name: ios; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE ios (
+ user_id bigint NOT NULL,
+ token character varying(64) NOT NULL,
+ ts timestamp with time zone DEFAULT now() NOT NULL
+);
+
+
+ALTER TABLE ios OWNER TO juick;
+
+--
+-- Name: jids; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE jids (
+ user_id bigint,
+ jid character varying(64) NOT NULL,
+ active smallint DEFAULT 0 NOT NULL,
+ loginhash character varying(36),
+ ts timestamp with time zone DEFAULT now() NOT NULL
+);
+
+
+ALTER TABLE jids OWNER TO juick;
+
+--
+-- Name: logins; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE logins (
+ user_id bigint NOT NULL,
+ hash character varying(16) NOT NULL
+);
+
+
+ALTER TABLE logins OWNER TO juick;
+
+--
+-- Name: mail; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE mail (
+ user_id bigint NOT NULL,
+ hash character varying(16) NOT NULL
+);
+
+
+ALTER TABLE mail OWNER TO juick;
+
+--
+-- Name: meon; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE meon (
+ id bigint NOT NULL,
+ user_id bigint NOT NULL,
+ link character varying(255) NOT NULL,
+ name character varying(32) NOT NULL,
+ ico smallint
+);
+
+
+ALTER TABLE meon OWNER TO juick;
+
+--
+-- Name: meon_id_seq; Type: SEQUENCE; Schema: public; Owner: juick
+--
+
+CREATE SEQUENCE meon_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE meon_id_seq OWNER TO juick;
+
+--
+-- Name: meon_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: juick
+--
+
+ALTER SEQUENCE meon_id_seq OWNED BY meon.id;
+
+
+--
+-- Name: messages; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE messages (
+ message_id bigint NOT NULL,
+ user_id bigint NOT NULL,
+ lang messages_lang DEFAULT '__'::messages_lang NOT NULL,
+ ts timestamp with time zone DEFAULT now() NOT NULL,
+ replies smallint DEFAULT 0::smallint NOT NULL,
+ maxreplyid smallint DEFAULT 0::smallint NOT NULL,
+ privacy smallint DEFAULT 1::smallint NOT NULL,
+ readonly boolean DEFAULT false NOT NULL,
+ attach messages_attach,
+ place_id bigint,
+ lat numeric(10,7),
+ lon numeric(10,7),
+ popular smallint DEFAULT 0::smallint NOT NULL,
+ hidden smallint DEFAULT 0::smallint NOT NULL,
+ likes smallint DEFAULT 0::smallint NOT NULL,
+ updated timestamp with time zone DEFAULT now() NOT NULL
+);
+
+
+ALTER TABLE messages OWNER TO juick;
+
+--
+-- Name: messages_access; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE messages_access (
+ message_id bigint NOT NULL,
+ user_id bigint NOT NULL
+);
+
+
+ALTER TABLE messages_access OWNER TO juick;
+
+--
+-- Name: messages_message_id_seq; Type: SEQUENCE; Schema: public; Owner: juick
+--
+
+CREATE SEQUENCE messages_message_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE messages_message_id_seq OWNER TO juick;
+
+--
+-- Name: messages_message_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: juick
+--
+
+ALTER SEQUENCE messages_message_id_seq OWNED BY messages.message_id;
+
+
+--
+-- Name: messages_tags; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE messages_tags (
+ message_id bigint NOT NULL,
+ tag_id bigint NOT NULL
+);
+
+
+ALTER TABLE messages_tags OWNER TO juick;
+
+--
+-- Name: messages_txt; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE messages_txt (
+ message_id bigint NOT NULL,
+ tags text,
+ repliesby text,
+ txt text NOT NULL
+);
+
+
+ALTER TABLE messages_txt OWNER TO juick;
+
+--
+-- Name: messages_votes; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE messages_votes (
+ message_id bigint NOT NULL,
+ user_id bigint NOT NULL,
+ vote smallint DEFAULT 1::smallint NOT NULL
+);
+
+
+ALTER TABLE messages_votes OWNER TO juick;
+
+--
+-- Name: places; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE places (
+ place_id bigint NOT NULL,
+ lat numeric(10,7) NOT NULL,
+ lon numeric(10,7) NOT NULL,
+ name character varying(64) NOT NULL,
+ descr character varying(255),
+ url character varying(128),
+ user_id bigint NOT NULL,
+ ts timestamp with time zone DEFAULT now() NOT NULL
+);
+
+
+ALTER TABLE places OWNER TO juick;
+
+--
+-- Name: places_place_id_seq; Type: SEQUENCE; Schema: public; Owner: juick
+--
+
+CREATE SEQUENCE places_place_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE places_place_id_seq OWNER TO juick;
+
+--
+-- Name: places_place_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: juick
+--
+
+ALTER SEQUENCE places_place_id_seq OWNED BY places.place_id;
+
+
+--
+-- Name: places_tags; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE places_tags (
+ place_id bigint NOT NULL,
+ tag_id bigint NOT NULL
+);
+
+
+ALTER TABLE places_tags OWNER TO juick;
+
+--
+-- Name: pm; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE pm (
+ user_id bigint NOT NULL,
+ user_id_to bigint NOT NULL,
+ ts timestamp with time zone DEFAULT now() NOT NULL,
+ txt text NOT NULL
+);
+
+
+ALTER TABLE pm OWNER TO juick;
+
+--
+-- Name: pm_inroster; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE pm_inroster (
+ user_id bigint NOT NULL,
+ jid character varying(64) NOT NULL
+);
+
+
+ALTER TABLE pm_inroster OWNER TO juick;
+
+--
+-- Name: pm_streams; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE pm_streams (
+ user_id bigint NOT NULL,
+ user_id_to bigint NOT NULL,
+ lastmessage timestamp with time zone NOT NULL,
+ lastview timestamp with time zone,
+ unread smallint DEFAULT 0::smallint NOT NULL
+);
+
+
+ALTER TABLE pm_streams OWNER TO juick;
+
+--
+-- Name: presence; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE presence (
+ user_id bigint NOT NULL,
+ jid character varying(64),
+ ts timestamp with time zone DEFAULT now() NOT NULL
+);
+
+
+ALTER TABLE presence OWNER TO juick;
+
+--
+-- Name: reader_links; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE reader_links (
+ link_id bigint NOT NULL,
+ rss_id bigint NOT NULL,
+ url character varying(255) NOT NULL,
+ title character varying(255) NOT NULL,
+ ts timestamp with time zone NOT NULL
+);
+
+
+ALTER TABLE reader_links OWNER TO juick;
+
+--
+-- Name: reader_links_link_id_seq; Type: SEQUENCE; Schema: public; Owner: juick
+--
+
+CREATE SEQUENCE reader_links_link_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE reader_links_link_id_seq OWNER TO juick;
+
+--
+-- Name: reader_links_link_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: juick
+--
+
+ALTER SEQUENCE reader_links_link_id_seq OWNED BY reader_links.link_id;
+
+
+--
+-- Name: reader_rss; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE reader_rss (
+ rss_id bigint NOT NULL,
+ url character varying(255) NOT NULL,
+ lastcheck timestamp with time zone NOT NULL
+);
+
+
+ALTER TABLE reader_rss OWNER TO juick;
+
+--
+-- Name: reader_rss_rss_id_seq; Type: SEQUENCE; Schema: public; Owner: juick
+--
+
+CREATE SEQUENCE reader_rss_rss_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE reader_rss_rss_id_seq OWNER TO juick;
+
+--
+-- Name: reader_rss_rss_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: juick
+--
+
+ALTER SEQUENCE reader_rss_rss_id_seq OWNED BY reader_rss.rss_id;
+
+
+--
+-- Name: replies; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE replies (
+ message_id bigint NOT NULL,
+ reply_id smallint NOT NULL,
+ user_id bigint NOT NULL,
+ replyto smallint DEFAULT 0::smallint NOT NULL,
+ ts timestamp with time zone DEFAULT now() NOT NULL,
+ attach replies_attach,
+ txt text NOT NULL
+);
+
+
+ALTER TABLE replies OWNER TO juick;
+
+--
+-- Name: sphinx; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE sphinx (
+ counter_id smallint NOT NULL,
+ max_id bigint NOT NULL
+);
+
+
+ALTER TABLE sphinx OWNER TO juick;
+
+--
+-- Name: subscr_messages; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE subscr_messages (
+ message_id bigint NOT NULL,
+ suser_id bigint NOT NULL,
+ last_read_rid smallint NOT NULL default 0
+);
+
+
+ALTER TABLE subscr_messages OWNER TO juick;
+
+--
+-- Name: subscr_tags; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE subscr_tags (
+ tag_id bigint NOT NULL,
+ suser_id bigint NOT NULL
+);
+
+
+ALTER TABLE subscr_tags OWNER TO juick;
+
+--
+-- Name: subscr_users; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE subscr_users (
+ user_id bigint NOT NULL,
+ suser_id bigint NOT NULL,
+ jid character varying(64),
+ active boolean NOT NULL,
+ ts timestamp with time zone DEFAULT now() NOT NULL
+);
+
+
+ALTER TABLE subscr_users OWNER TO juick;
+
+--
+-- Name: tags; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE tags (
+ tag_id bigint NOT NULL,
+ synonym_id bigint,
+ name character varying(70) collate case_insensitive,
+ top boolean DEFAULT false NOT NULL,
+ noindex boolean DEFAULT false NOT NULL,
+ stat_messages bigint DEFAULT 0::bigint NOT NULL,
+ stat_users smallint DEFAULT 0::smallint NOT NULL
+);
+
+
+ALTER TABLE tags OWNER TO juick;
+
+--
+-- Name: tags_ignore; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE tags_ignore (
+ tag_id bigint NOT NULL
+);
+
+
+ALTER TABLE tags_ignore OWNER TO juick;
+
+--
+-- Name: tags_synonyms; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE tags_synonyms (
+ name character varying(64) NOT NULL,
+ changeto character varying(64) NOT NULL
+);
+
+
+ALTER TABLE tags_synonyms OWNER TO juick;
+
+--
+-- Name: tags_tag_id_seq; Type: SEQUENCE; Schema: public; Owner: juick
+--
+
+CREATE SEQUENCE tags_tag_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE tags_tag_id_seq OWNER TO juick;
+
+--
+-- Name: tags_tag_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: juick
+--
+
+ALTER SEQUENCE tags_tag_id_seq OWNED BY tags.tag_id;
+
+
+--
+-- Name: telegram; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE telegram (
+ user_id bigint,
+ tg_id numeric NOT NULL,
+ tg_name character varying(64) NOT NULL,
+ ts timestamp with time zone DEFAULT now() NOT NULL,
+ loginhash character varying(36)
+);
+
+
+ALTER TABLE telegram OWNER TO juick;
+
+--
+-- Name: telegram_chats; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE telegram_chats (
+ chat_id numeric
+);
+
+
+ALTER TABLE telegram_chats OWNER TO juick;
+
+--
+-- Name: top_ignore_messages; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE top_ignore_messages (
+ message_id bigint NOT NULL
+);
+
+
+ALTER TABLE top_ignore_messages OWNER TO juick;
+
+--
+-- Name: top_ignore_tags; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE top_ignore_tags (
+ tag_id bigint NOT NULL
+);
+
+
+ALTER TABLE top_ignore_tags OWNER TO juick;
+
+--
+-- Name: top_ignore_users; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE top_ignore_users (
+ user_id bigint NOT NULL
+);
+
+
+ALTER TABLE top_ignore_users OWNER TO juick;
+
+--
+-- Name: twitter; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE twitter (
+ user_id bigint NOT NULL,
+ access_token character varying(64) NOT NULL,
+ access_token_secret character varying(64) NOT NULL,
+ uname character varying(64) NOT NULL,
+ ts timestamp with time zone DEFAULT now() NOT NULL,
+ crosspost boolean DEFAULT true NOT NULL
+);
+
+
+ALTER TABLE twitter OWNER TO juick;
+
+--
+-- Name: useroptions; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE useroptions (
+ user_id bigint NOT NULL,
+ jnotify boolean DEFAULT true NOT NULL,
+ subscr_active boolean DEFAULT true NOT NULL,
+ off_ts timestamp with time zone,
+ xmppxhtml boolean DEFAULT false NOT NULL,
+ subscr_notify boolean DEFAULT true NOT NULL,
+ recommendations boolean DEFAULT true NOT NULL,
+ privacy_view boolean DEFAULT true NOT NULL,
+ privacy_reply boolean DEFAULT true NOT NULL,
+ privacy_pm boolean DEFAULT true NOT NULL,
+ repliesview boolean DEFAULT false NOT NULL
+);
+
+
+ALTER TABLE useroptions OWNER TO juick;
+
+--
+-- Name: users; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE users (
+ id bigint NOT NULL,
+ nick character varying(64) NOT NULL,
+ passw character varying(32) NOT NULL,
+ lang users_lang DEFAULT '__'::users_lang NOT NULL,
+ banned smallint DEFAULT 0::smallint NOT NULL,
+ lastmessage bigint DEFAULT 0::bigint NOT NULL,
+ lastpm bigint DEFAULT 0::bigint NOT NULL,
+ lastphoto bigint DEFAULT 0::bigint NOT NULL,
+ karma smallint DEFAULT 0::smallint NOT NULL
+);
+
+
+ALTER TABLE users OWNER TO juick;
+
+--
+-- Name: users_id_seq; Type: SEQUENCE; Schema: public; Owner: juick
+--
+
+CREATE SEQUENCE users_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE users_id_seq OWNER TO juick;
+
+--
+-- Name: users_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: juick
+--
+
+ALTER SEQUENCE users_id_seq OWNED BY users.id;
+
+
+--
+-- Name: users_refs; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE users_refs (
+ user_id bigint NOT NULL,
+ ref bigint NOT NULL
+);
+
+
+ALTER TABLE users_refs OWNER TO juick;
+
+--
+-- Name: users_subscr; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE users_subscr (
+ user_id bigint NOT NULL,
+ cnt smallint DEFAULT 0::smallint NOT NULL
+);
+
+
+ALTER TABLE users_subscr OWNER TO juick;
+
+--
+-- Name: usersinfo; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE usersinfo (
+ user_id bigint NOT NULL,
+ jid character varying(32),
+ fullname character varying(32),
+ country character varying(32),
+ url character varying(64),
+ gender character varying(32),
+ bday character varying(10),
+ descr text
+);
+
+
+ALTER TABLE usersinfo OWNER TO juick;
+
+--
+-- Name: version; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE version (
+ version numeric NOT NULL
+);
+
+
+ALTER TABLE version OWNER TO juick;
+
+--
+-- Name: vk; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE vk (
+ user_id bigint,
+ vk_id numeric NOT NULL,
+ loginhash character varying(36),
+ access_token character varying(128) NOT NULL,
+ ts timestamp with time zone DEFAULT now() NOT NULL,
+ vk_name character varying(64) NOT NULL,
+ vk_link character varying(64) NOT NULL,
+ crosspost smallint DEFAULT 1::smallint NOT NULL
+);
+
+
+ALTER TABLE vk OWNER TO juick;
+
+--
+-- Name: winphone; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE winphone (
+ user_id bigint NOT NULL,
+ url character varying(255) NOT NULL,
+ ts timestamp with time zone DEFAULT now() NOT NULL
+);
+
+
+ALTER TABLE winphone OWNER TO juick;
+
+--
+-- Name: wl_users; Type: TABLE; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE TABLE wl_users (
+ user_id bigint NOT NULL,
+ wl_user_id bigint NOT NULL
+);
+
+
+ALTER TABLE wl_users OWNER TO juick;
+
+--
+-- Name: id; Type: DEFAULT; Schema: public; Owner: juick
+--
+
+ALTER TABLE ONLY meon ALTER COLUMN id SET DEFAULT nextval('meon_id_seq'::regclass);
+
+
+--
+-- Name: message_id; Type: DEFAULT; Schema: public; Owner: juick
+--
+
+ALTER TABLE ONLY messages ALTER COLUMN message_id SET DEFAULT nextval('messages_message_id_seq'::regclass);
+
+
+--
+-- Name: place_id; Type: DEFAULT; Schema: public; Owner: juick
+--
+
+ALTER TABLE ONLY places ALTER COLUMN place_id SET DEFAULT nextval('places_place_id_seq'::regclass);
+
+
+--
+-- Name: link_id; Type: DEFAULT; Schema: public; Owner: juick
+--
+
+ALTER TABLE ONLY reader_links ALTER COLUMN link_id SET DEFAULT nextval('reader_links_link_id_seq'::regclass);
+
+
+--
+-- Name: rss_id; Type: DEFAULT; Schema: public; Owner: juick
+--
+
+ALTER TABLE ONLY reader_rss ALTER COLUMN rss_id SET DEFAULT nextval('reader_rss_rss_id_seq'::regclass);
+
+
+--
+-- Name: tag_id; Type: DEFAULT; Schema: public; Owner: juick
+--
+
+ALTER TABLE ONLY tags ALTER COLUMN tag_id SET DEFAULT nextval('tags_tag_id_seq'::regclass);
+
+
+--
+-- Name: id; Type: DEFAULT; Schema: public; Owner: juick
+--
+
+ALTER TABLE ONLY users ALTER COLUMN id SET DEFAULT nextval('users_id_seq'::regclass);
+
+
+--
+-- Name: idx_20438_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
+--
+
+ALTER TABLE ONLY images
+ ADD CONSTRAINT idx_20438_primary PRIMARY KEY (mid, rid);
+
+
+--
+-- Name: idx_20453_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
+--
+
+ALTER TABLE ONLY mail
+ ADD CONSTRAINT idx_20453_primary PRIMARY KEY (user_id);
+
+
+--
+-- Name: idx_20458_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
+--
+
+ALTER TABLE ONLY meon
+ ADD CONSTRAINT idx_20458_primary PRIMARY KEY (id);
+
+
+--
+-- Name: idx_20483_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
+--
+
+ALTER TABLE ONLY messages
+ ADD CONSTRAINT idx_20483_primary PRIMARY KEY (message_id);
+
+
+--
+-- Name: idx_20502_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
+--
+
+ALTER TABLE ONLY messages_txt
+ ADD CONSTRAINT idx_20502_primary PRIMARY KEY (message_id);
+
+
+--
+-- Name: idx_20514_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
+--
+
+ALTER TABLE ONLY places
+ ADD CONSTRAINT idx_20514_primary PRIMARY KEY (place_id);
+
+
+--
+-- Name: idx_20542_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
+--
+
+ALTER TABLE ONLY reader_links
+ ADD CONSTRAINT idx_20542_primary PRIMARY KEY (link_id);
+
+
+--
+-- Name: idx_20551_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
+--
+
+ALTER TABLE ONLY reader_rss
+ ADD CONSTRAINT idx_20551_primary PRIMARY KEY (rss_id);
+
+
+--
+-- Name: idx_20571_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
+--
+
+ALTER TABLE ONLY sphinx
+ ADD CONSTRAINT idx_20571_primary PRIMARY KEY (counter_id);
+
+
+--
+-- Name: idx_20586_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
+--
+
+ALTER TABLE ONLY tags
+ ADD CONSTRAINT idx_20586_primary PRIMARY KEY (tag_id);
+
+
+--
+-- Name: idx_20616_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
+--
+
+ALTER TABLE ONLY top_ignore_tags
+ ADD CONSTRAINT idx_20616_primary PRIMARY KEY (tag_id);
+
+
+--
+-- Name: idx_20619_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
+--
+
+ALTER TABLE ONLY top_ignore_users
+ ADD CONSTRAINT idx_20619_primary PRIMARY KEY (user_id);
+
+
+--
+-- Name: idx_20622_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
+--
+
+ALTER TABLE ONLY twitter
+ ADD CONSTRAINT idx_20622_primary PRIMARY KEY (user_id);
+
+
+--
+-- Name: idx_20627_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
+--
+
+ALTER TABLE ONLY useroptions
+ ADD CONSTRAINT idx_20627_primary PRIMARY KEY (user_id);
+
+
+--
+-- Name: idx_20653_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
+--
+
+ALTER TABLE ONLY users
+ ADD CONSTRAINT idx_20653_primary PRIMARY KEY (id);
+
+
+--
+-- Name: idx_20663_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
+--
+
+ALTER TABLE ONLY usersinfo
+ ADD CONSTRAINT idx_20663_primary PRIMARY KEY (user_id);
+
+
+--
+-- Name: idx_20672_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
+--
+
+ALTER TABLE ONLY users_subscr
+ ADD CONSTRAINT idx_20672_primary PRIMARY KEY (user_id);
+
+
+--
+-- Name: idx_20694_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
+--
+
+ALTER TABLE ONLY wl_users
+ ADD CONSTRAINT idx_20694_primary PRIMARY KEY (user_id, wl_user_id);
+
+
+--
+-- Name: idx_29418_primary; Type: CONSTRAINT; Schema: public; Owner: juick; Tablespace:
+--
+
+ALTER TABLE ONLY bl_users
+ ADD CONSTRAINT idx_29418_primary PRIMARY KEY (user_id, bl_user_id);
+
+
+--
+-- Name: idx_20390_regid; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE UNIQUE INDEX idx_20390_regid ON android USING btree (regid);
+
+
+--
+-- Name: idx_20390_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20390_user_id ON android USING btree (user_id);
+
+
+--
+-- Name: idx_20404_tag_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20404_tag_id ON bl_tags USING btree (tag_id);
+
+
+--
+-- Name: idx_20404_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20404_user_id ON bl_tags USING btree (user_id);
+
+
+--
+-- Name: idx_20418_email; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20418_email ON emails USING btree (email);
+
+
+--
+-- Name: idx_20421_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20421_user_id ON facebook USING btree (user_id);
+
+
+--
+-- Name: idx_20432_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE UNIQUE INDEX idx_20432_user_id ON friends_facebook USING btree (user_id, friend_id);
+
+
+--
+-- Name: idx_20441_token; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE UNIQUE INDEX idx_20441_token ON ios USING btree (token);
+
+
+--
+-- Name: idx_20441_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20441_user_id ON ios USING btree (user_id);
+
+
+--
+-- Name: idx_20445_jid; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE UNIQUE INDEX idx_20445_jid ON jids USING btree (jid);
+
+
+--
+-- Name: idx_20445_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20445_user_id ON jids USING btree (user_id);
+
+
+--
+-- Name: idx_20450_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE UNIQUE INDEX idx_20450_user_id ON logins USING btree (user_id);
+
+
+--
+-- Name: idx_20483_attach; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20483_attach ON messages USING btree (attach);
+
+
+--
+-- Name: idx_20483_hidden; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20483_hidden ON messages USING btree (hidden);
+
+
+--
+-- Name: idx_20483_place_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20483_place_id ON messages USING btree (place_id);
+
+
+--
+-- Name: idx_20483_popular; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20483_popular ON messages USING btree (popular);
+
+
+--
+-- Name: idx_20483_ts; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20483_ts ON messages USING btree (ts);
+
+
+--
+-- Name: idx_20483_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20483_user_id ON messages USING btree (user_id);
+
+
+--
+-- Name: idx_20496_message_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20496_message_id ON messages_access USING btree (message_id);
+
+
+--
+-- Name: idx_20499_message_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20499_message_id ON messages_tags USING btree (message_id);
+
+
+--
+-- Name: idx_20499_message_id_2; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE UNIQUE INDEX idx_20499_message_id_2 ON messages_tags USING btree (message_id, tag_id);
+
+
+--
+-- Name: idx_20499_tag_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20499_tag_id ON messages_tags USING btree (tag_id);
+
+
+--
+-- Name: idx_20508_message_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE UNIQUE INDEX idx_20508_message_id ON messages_votes USING btree (message_id, user_id);
+
+
+--
+-- Name: idx_20529_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20529_user_id ON pm_inroster USING btree (user_id);
+
+
+--
+-- Name: idx_20529_user_id_2; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE UNIQUE INDEX idx_20529_user_id_2 ON pm_inroster USING btree (user_id, jid);
+
+
+--
+-- Name: idx_20532_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE UNIQUE INDEX idx_20532_user_id ON pm_streams USING btree (user_id, user_id_to);
+
+
+--
+-- Name: idx_20536_jid; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE UNIQUE INDEX idx_20536_jid ON presence USING btree (jid);
+
+
+--
+-- Name: idx_20563_message_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20563_message_id ON replies USING btree (message_id);
+
+
+--
+-- Name: idx_20563_ts; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20563_ts ON replies USING btree (ts);
+
+
+--
+-- Name: idx_20563_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20563_user_id ON replies USING btree (user_id);
+
+
+--
+-- Name: idx_20574_message_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE UNIQUE INDEX idx_20574_message_id ON subscr_messages USING btree (message_id, suser_id);
+
+
+--
+-- Name: idx_20577_tag_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE UNIQUE INDEX idx_20577_tag_id ON subscr_tags USING btree (tag_id, suser_id);
+
+
+--
+-- Name: idx_20580_suser_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20580_suser_id ON subscr_users USING btree (suser_id);
+
+
+--
+-- Name: idx_20580_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE UNIQUE INDEX idx_20580_user_id ON subscr_users USING btree (user_id, suser_id);
+
+
+--
+-- Name: idx_20586_synonym_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20586_synonym_id ON tags USING btree (synonym_id);
+
+
+--
+-- Name: idx_20607_chat_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE UNIQUE INDEX idx_20607_chat_id ON telegram_chats USING btree (chat_id);
+
+
+--
+-- Name: idx_20627_recommendations; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20627_recommendations ON useroptions USING btree (recommendations);
+
+
+--
+-- Name: idx_20653_nick; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE UNIQUE INDEX idx_20653_nick ON users USING btree (nick);
+
+
+--
+-- Name: idx_20669_ref; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20669_ref ON users_refs USING btree (ref);
+
+
+--
+-- Name: idx_20682_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20682_user_id ON vk USING btree (user_id);
+
+
+--
+-- Name: idx_20690_url; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE UNIQUE INDEX idx_20690_url ON winphone USING btree (url);
+
+
+--
+-- Name: idx_20690_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_20690_user_id ON winphone USING btree (user_id);
+
+
+--
+-- Name: idx_29422_message_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_29422_message_id ON favorites USING btree (message_id);
+
+
+--
+-- Name: idx_29422_user_id; Type: INDEX; Schema: public; Owner: juick; Tablespace:
+--
+
+CREATE INDEX idx_29422_user_id ON favorites USING btree (user_id);
+
+--
+-- Name: public; Type: ACL; Schema: -; Owner: postgres
+--
+
+REVOKE ALL ON SCHEMA public FROM PUBLIC;
+REVOKE ALL ON SCHEMA public FROM postgres;
+GRANT ALL ON SCHEMA public TO postgres;
+GRANT ALL ON SCHEMA public TO PUBLIC;
+
+
+--
+-- PostgreSQL database dump complete
+--
+
--
cgit v1.2.3