diff --git a/Dockerfile b/Dockerfile index 5d07a4f..dabcfa9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -46,9 +46,9 @@ RUN go build ENV PGDATABASE dbproj ENV PGUSER hasep ENV PGPASSWORD 126126 -EXPOSE 5000 -RUN /etc/init.d/postgresql start && cd $WORKP/ && psql -h localhost -f db.sql -RUN /etc/init.d/postgresql stop +#RUN /etc/init.d/postgresql start && cd $WORKP/ && psql -h localhost -f db.sql +#RUN /etc/init.d/postgresql stop +EXPOSE 5000 CMD /etc/init.d/postgresql start && ./technoparkdb diff --git a/database/database.go b/database/database.go index d8485dd..fac3db4 100644 --- a/database/database.go +++ b/database/database.go @@ -25,17 +25,7 @@ func Connect() { panic(err) } - - rows, qerr := DB.Query("select indexname from pg_indexes") - if qerr != nil { - panic(qerr) - } - for rows.Next() { - var idx string - err = rows.Scan(&idx) - fmt.Println(idx) - } - //err = createShema() + err = createShema() if err != nil { panic(err) } diff --git a/db.sql b/db.sql index 930037b..0ebaac9 100644 --- a/db.sql +++ b/db.sql @@ -66,15 +66,15 @@ CREATE TABLE IF NOT EXISTS posts ( rootidx INTEGER ); -CREATE INDEX IF NOT EXISTS posts_forum_slug_index ON posts (id, forum_slug); -CREATE INDEX IF NOT EXISTS posts_forum_id_index ON posts (id, forum_id); -CREATE INDEX IF NOT EXISTS posts_parent_id_index ON posts (parent_id); +--CREATE INDEX IF NOT EXISTS posts_forum_slug_index ON posts (id, forum_slug); +--CREATE INDEX IF NOT EXISTS posts_forum_id_index ON posts (id, forum_id); +--CREATE INDEX IF NOT EXISTS posts_parent_id_index ON posts (parent_id); CREATE INDEX IF NOT EXISTS posts_thread_id_index ON posts (thread_id); -CREATE INDEX IF NOT EXISTS posts_thread_id_id_index ON posts (thread_id, id); +CREATE INDEX IF NOT EXISTS posts_thread_id_path_index ON posts (thread_id, id DESC); CREATE INDEX IF NOT EXISTS posts_root_index ON posts (rootidx); -CREATE INDEX IF NOT EXISTS posts_thread_id_path_index ON posts (thread_id, path_to_post); +CREATE INDEX IF NOT EXISTS posts_thread_id_path_index ON posts (thread_id, path_to_post DESC); CREATE INDEX IF NOT EXISTS posts_thread_id_parent_id_index ON posts (thread_id, parent_id); -CREATE INDEX IF NOT EXISTS posts_thread_id_parent_id_path_index ON posts (thread_id, parent_id, path_to_post); +--CREATE INDEX IF NOT EXISTS posts_thread_id_parent_id_path_index ON posts (thread_id, parent_id, path_to_post DESC); CREATE TABLE IF NOT EXISTS forum_users ( user_id INTEGER NOT NULL, diff --git a/forum/forum.go b/forum/forum.go index ee0d38e..6e0114c 100644 --- a/forum/forum.go +++ b/forum/forum.go @@ -20,8 +20,8 @@ type ForumStruct struct { } const insertStatement = "INSERT INTO forums (owner_id, owner_nickname, title, slug) VALUES ($1,$2,$3,$4)" -const selectStatementSlug = "SELECT slug, title FROM forums WHERE slug=$1" -const selectStatementSlugAll = "SELECT slug, title, owner_nickname, posts_count, threads_count FROM forums WHERE slug=$1" +const selectStatementSlug = "SELECT slug::text, title::text FROM forums WHERE slug=$1" +const selectStatementSlugAll = "SELECT slug::text, title::text, owner_nickname::text, posts_count, threads_count FROM forums WHERE slug=$1" func getPost(c *routing.Context) ForumStruct { var POST ForumStruct @@ -114,7 +114,7 @@ func GetUsers(c *routing.Context) (string, int) { forumId, forumSlug := thread.GetForumSlugId(forumSlug) if forumId >= 0 { //selectStatement := "SELECT about, email, fullname, nickname FROM users u JOIN forum_users fu ON (u.id = fu.user_id) WHERE fu.forum_id=$1" - selectStatement := "SELECT about, email, fullname, nickname FROM users u WHERE u.id IN (SELECT user_id FROM forum_users WHERE forum_id=$1)" + selectStatement := "SELECT about::text, email::text, fullname::text, nickname::text FROM users u WHERE u.id IN (SELECT user_id FROM forum_users WHERE forum_id=$1)" desc := c.Query("desc") since := c.Query("since") diff --git a/post/post.go b/post/post.go index 4156afc..eec243a 100644 --- a/post/post.go +++ b/post/post.go @@ -78,7 +78,7 @@ func Create(c *routing.Context) (string, int) { threadSlugId := c.Param("slugid") _, err := strconv.Atoi(threadSlugId) - selectThreadStatement := "SELECT id, forum_id, forum_slug, slug from threads WHERE" + selectThreadStatement := "SELECT id, forum_id, forum_slug::text, slug::text from threads WHERE" if err == nil { selectThreadStatement += " id=" + threadSlugId } else { @@ -103,7 +103,7 @@ func Create(c *routing.Context) (string, int) { } var CheckPostArr []CheckPost - transaction.Prepare("select_user", "SELECT id, nickname FROM users WHERE nickname=$1") + transaction.Prepare("select_user", "SELECT id, nickname::text FROM users WHERE nickname=$1") transaction.Prepare("get_parent","SELECT thread_id FROM posts WHERE id=$1") //batch := db.BeginBatch() @@ -182,7 +182,7 @@ func Update(c *routing.Context) (string, int) { var res PostStruct var statement string var err error - statement = "SELECT message, author_name, created, forum_slug, id, thread_id FROM posts WHERE id=$1" + statement = "SELECT message::text, author_name::text, created, forum_slug::text, id, thread_id FROM posts WHERE id=$1" row := db.QueryRow(statement, postID) err = row.Scan(&res.Message, &res.AuthorName, &res.Created, &res.ForumSlug, &res.Id, &res.ThreadId) switch err { @@ -243,7 +243,7 @@ func Details(c *routing.Context) (string, int) { Thread *ThreadStruct `json:"thread,omitempty"` } - selectStatement := `SELECT author_id, author_name, created, forum_slug, thread_id, is_edited, message, id, parent_id FROM posts WHERE id=$1` + selectStatement := `SELECT author_id, author_name::text, created, forum_slug::text, thread_id, is_edited, message::text, id, parent_id FROM posts WHERE id=$1` row := db.QueryRow(selectStatement, postID) err := row.Scan(&result.Post.AuthorId, &result.Post.AuthorName, &result.Post.Created, &result.Post.ForumSlug, &result.Post.ThreadId, &result.Post.Edited, &result.Post.Message, &result.Post.Id, &result.Post.ParentId) @@ -257,7 +257,7 @@ func Details(c *routing.Context) (string, int) { return string(content), 404 case nil: if _, ok := related["user"]; ok { - selectStatement = `SELECT about, email, fullname, nickname FROM users WHERE id=$1` + selectStatement = `SELECT about::text, email::text, fullname::text, nickname::text FROM users WHERE id=$1` row := db.QueryRow(selectStatement, result.Post.AuthorId) var tAuthor user.UserStruct err := row.Scan(&tAuthor.About, &tAuthor.Email, &tAuthor.Fullname, &tAuthor.Nickname) @@ -276,7 +276,7 @@ func Details(c *routing.Context) (string, int) { } } if _, ok := related["forum"]; ok { - selectStatement = `SELECT owner_nickname, title, slug, posts_count, threads_count FROM forums WHERE slug=$1` + selectStatement = `SELECT owner_nickname::text, title::text, slug::text, posts_count, threads_count FROM forums WHERE slug=$1` row := db.QueryRow(selectStatement, result.Post.ForumSlug) var tForum ForumStruct err := row.Scan(&tForum.User, &tForum.Title, &tForum.Slug, &tForum.Posts, &tForum.Threads) @@ -295,7 +295,7 @@ func Details(c *routing.Context) (string, int) { } } if _, ok := related["thread"]; ok { - selectStatement = `SELECT author_name, forum_slug, title, created, message, id, slug, votes FROM threads WHERE id=$1` + selectStatement = `SELECT author_name::text, forum_slug::text, title::text, created, message::text, id, slug::text, votes FROM threads WHERE id=$1` row := db.QueryRow(selectStatement, result.Post.ThreadId) var tThread ThreadStruct err := row.Scan(&tThread.Author, &tThread.ForumSlug, &tThread.Title, &tThread.Created, &tThread.Message, &tThread.Id, &tThread.Slug, &tThread.Votes) @@ -325,7 +325,7 @@ func GetPosts(c *routing.Context) (string, int) { threadSlugId := c.Param("slugid") _, err := strconv.Atoi(threadSlugId) - selectThreadStatement := "SELECT id, slug FROM threads WHERE" + selectThreadStatement := "SELECT id, slug::text FROM threads WHERE" if err == nil { selectThreadStatement += " id=" + threadSlugId } else { @@ -349,7 +349,7 @@ func GetPosts(c *routing.Context) (string, int) { sort := c.Query("sort") desc := c.Query("desc") - selectStatement := "SELECT created, id, is_edited, message, parent_id, author_id, thread_id, forum_slug, forum_id, author_name FROM posts WHERE" + selectStatement := "SELECT created, id, is_edited, message::text, parent_id, author_id, thread_id, forum_slug::text, forum_id, author_name::text FROM posts WHERE" switch sort { case "tree": diff --git a/thread/thread.go b/thread/thread.go index d30baf0..a4b2fdf 100644 --- a/thread/thread.go +++ b/thread/thread.go @@ -28,9 +28,9 @@ type VoteStruct struct { } const insertStatement = "INSERT INTO threads (author_id, author_name, forum_id, forum_slug, title, created, message, slug) VALUES ($1,$2,$3,$4,$5,$6,$7,$8) RETURNING id" -const selectStatementSlug = "SELECT id, slug, created, message, title, author_name, forum_slug, votes FROM threads WHERE slug=$1" -const selectStatementID = "SELECT id, slug, created, message, title, author_name, forum_slug, votes FROM threads WHERE id=$1" -const selectStatementForumSlugId = "SELECT id, slug FROM forums WHERE slug=$1" +const selectStatementSlug = "SELECT id, slug::text, created, message::text, title::text, author_name::text, forum_slug::text, votes FROM threads WHERE slug=$1" +const selectStatementID = "SELECT id, slug::text, created, message::text, title::text, author_name::text, forum_slug::text, votes FROM threads WHERE id=$1" +const selectStatementForumSlugId = "SELECT id, slug::text FROM forums WHERE slug=$1" func getPost(c *routing.Context) ThreadStruct { var POST ThreadStruct @@ -52,7 +52,7 @@ func getVotePost(c *routing.Context) VoteStruct { func GetForumSlugId(slug string) (int, string){ db := database.DB - row := db.QueryRow("SELECT id, slug FROM forums WHERE slug=$1", slug) + row := db.QueryRow("SELECT id, slug::text FROM forums WHERE slug=$1", slug) var id int err := row.Scan(&id, &slug) switch err { @@ -67,7 +67,7 @@ func GetForumSlugId(slug string) (int, string){ func getForumAuthorsInfo(author, slug string) (int, string, int, string){ db := database.DB - selectStatement :="SELECT forum.*, author.* FROM (SELECT id, slug FROM forums WHERE slug=$1) as forum, (SELECT id, nickname FROM users WHERE nickname=$2) as author" + selectStatement :="SELECT forum.*, author.* FROM (SELECT id, slug::text FROM forums WHERE slug=$1) as forum, (SELECT id, nickname::text FROM users WHERE nickname=$2) as author" row := db.QueryRow(selectStatement, slug, author) var forumID int var authorID int @@ -206,7 +206,7 @@ func Update(c *routing.Context) (string, int) { orstate = " slug='" + slug + "'" } if UPD { - updateStatement += "' WHERE" + orstate + " RETURNING author_name, created, forum_slug, id, message, title, slug" + updateStatement += "' WHERE" + orstate + " RETURNING author_name::text, created, forum_slug::text, id, message::text, title::text, slug::text" var resOk ThreadStruct err := db.QueryRow(updateStatement).Scan(&resOk.Author, &resOk.Created, &resOk.ForumSlug, &resOk.Id, &resOk.Message, &resOk.Title, &resOk.Slug) switch err { @@ -249,7 +249,7 @@ func GetThreads(c *routing.Context) (string, int) { forumSlug := c.Param("slug") forumId, forumSlug := GetForumSlugId(forumSlug) if forumId >= 0 { - selectStatementThreads := "SELECT id, author_name, title, created, message, votes, slug FROM threads WHERE forum_slug='" + forumSlug + "'" + selectStatementThreads := "SELECT id, author_name::text, title::text, created, message::text, votes, slug::text FROM threads WHERE forum_slug='" + forumSlug + "'" desc := c.Query("desc") since := c.Query("since") diff --git a/user/user.go b/user/user.go index bc27425..1fdbb40 100644 --- a/user/user.go +++ b/user/user.go @@ -16,9 +16,9 @@ type UserStruct struct { } const insertStatement = "INSERT INTO users (about, email, fullname, nickname) VALUES ($1,$2,$3,$4)" -const selectStatement = "SELECT about, email, fullname, nickname FROM users WHERE email=$1 OR nickname=$2" -const selectStatementNickname = "SELECT about, email, fullname, nickname FROM users WHERE nickname=$1" -const selectStatementNicknameId = "SELECT id, nickname FROM users WHERE nickname=$1" +const selectStatement = "SELECT about::text, email::text, fullname::text, nickname::text FROM users WHERE email=$1 OR nickname=$2" +const selectStatementNickname = "SELECT about::text, email::text, fullname::text, nickname::text FROM users WHERE nickname=$1" +const selectStatementNicknameId = "SELECT id, nickname::text FROM users WHERE nickname=$1" func getPost(c *routing.Context) UserStruct { var POST UserStruct @@ -57,7 +57,7 @@ func Create(c *routing.Context) (string, int) { row := db.QueryRow(insertStatement, about, email, fullname, nickname) err := row.Scan() if err != nil && err != pgx.ErrNoRows { - rows, selerr := db.Query("SELECT about, email, fullname, nickname FROM users WHERE email='" + email + "' OR nickname='" + nickname + "'") + rows, selerr := db.Query("SELECT about::text, email::text, fullname::text, nickname::text FROM users WHERE email='" + email + "' OR nickname='" + nickname + "'") common.Check(selerr) var res []UserStruct @@ -141,7 +141,7 @@ func Update(c *routing.Context) (string, int) { nickname := c.Param("nickname") if UPD { - updateStatement += "' WHERE nickname='" + nickname + "' RETURNING about, email, fullname, nickname" + updateStatement += "' WHERE nickname='" + nickname + "' RETURNING about::text, email::text, fullname::text, nickname::text" var resOk UserStruct err := db.QueryRow(updateStatement).Scan(&resOk.About, &resOk.Email, &resOk.Fullname, &resOk.Nickname) switch err {