main.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. // Copyright (c) 2012 The gocql Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package main
  5. import (
  6. "log"
  7. "reflect"
  8. "sort"
  9. "time"
  10. "github.com/tux21b/gocql"
  11. "github.com/tux21b/gocql/uuid"
  12. )
  13. var session *gocql.Session
  14. func init() {
  15. cluster := gocql.NewCluster("127.0.0.1")
  16. cluster.Compressor = gocql.SnappyCompressor{}
  17. session = cluster.CreateSession()
  18. }
  19. type Page struct {
  20. Title string
  21. RevId uuid.UUID
  22. Body string
  23. Views int64
  24. Protected bool
  25. Modified time.Time
  26. Tags []string
  27. Attachments map[string]Attachment
  28. }
  29. type Attachment []byte
  30. func initSchema() error {
  31. if err := session.Query("DROP KEYSPACE gocql_test").Exec(); err != nil {
  32. log.Println("drop keyspace", err)
  33. }
  34. if err := session.Query(`CREATE KEYSPACE gocql_test
  35. WITH replication = {
  36. 'class' : 'SimpleStrategy',
  37. 'replication_factor' : 1
  38. }`).Exec(); err != nil {
  39. return err
  40. }
  41. if err := session.Query("USE gocql_test").Exec(); err != nil {
  42. return err
  43. }
  44. if err := session.Query(`CREATE TABLE page (
  45. title varchar,
  46. revid timeuuid,
  47. body varchar,
  48. views bigint,
  49. protected boolean,
  50. modified timestamp,
  51. tags set<varchar>,
  52. attachments map<varchar, text>,
  53. PRIMARY KEY (title, revid)
  54. )`).Exec(); err != nil {
  55. return err
  56. }
  57. if err := session.Query(`CREATE TABLE page_stats (
  58. title varchar,
  59. views counter,
  60. PRIMARY KEY (title)
  61. )`).Exec(); err != nil {
  62. return err
  63. }
  64. return nil
  65. }
  66. var pageTestData = []*Page{
  67. &Page{
  68. Title: "Frontpage",
  69. RevId: uuid.TimeUUID(),
  70. Body: "Welcome to this wiki page!",
  71. Modified: time.Date(2013, time.August, 13, 9, 52, 3, 0, time.UTC),
  72. Tags: []string{"start", "important", "test"},
  73. Attachments: map[string]Attachment{
  74. "logo": Attachment("\x00company logo\x00"),
  75. "favicon": Attachment("favicon.ico"),
  76. },
  77. },
  78. &Page{
  79. Title: "Foobar",
  80. RevId: uuid.TimeUUID(),
  81. Body: "foo::Foo f = new foo::Foo(foo::Foo::INIT);",
  82. Modified: time.Date(2013, time.August, 13, 9, 52, 3, 0, time.UTC),
  83. },
  84. }
  85. func insertTestData() error {
  86. for _, page := range pageTestData {
  87. if err := session.Query(`INSERT INTO page
  88. (title, revid, body, views, protected, modified, tags, attachments)
  89. VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
  90. page.Title, page.RevId, page.Body, page.Views, page.Protected,
  91. page.Modified, page.Tags, page.Attachments).Exec(); err != nil {
  92. return err
  93. }
  94. }
  95. return nil
  96. }
  97. func insertBatch() error {
  98. batch := gocql.NewBatch(gocql.LoggedBatch)
  99. for _, page := range pageTestData {
  100. batch.Query(`INSERT INTO page
  101. (title, revid, body, views, protected, modified, tags, attachments)
  102. VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
  103. page.Title, page.RevId, page.Body, page.Views, page.Protected,
  104. page.Modified, page.Tags, page.Attachments)
  105. }
  106. if err := session.ExecuteBatch(batch); err != nil {
  107. return err
  108. }
  109. return nil
  110. }
  111. func getPage(title string, revid uuid.UUID) (*Page, error) {
  112. p := new(Page)
  113. err := session.Query(`SELECT title, revid, body, views, protected, modified,
  114. tags, attachments
  115. FROM page WHERE title = ? AND revid = ? LIMIT 1`, title, revid).Scan(
  116. &p.Title, &p.RevId, &p.Body, &p.Views, &p.Protected, &p.Modified,
  117. &p.Tags, &p.Attachments)
  118. return p, err
  119. }
  120. func main() {
  121. if err := initSchema(); err != nil {
  122. log.Fatal("initSchema: ", err)
  123. }
  124. if err := insertTestData(); err != nil {
  125. log.Fatal("insertTestData: ", err)
  126. }
  127. var count int
  128. if err := session.Query("SELECT COUNT(*) FROM page").Scan(&count); err != nil {
  129. log.Fatal("getCount: ", err)
  130. }
  131. if count != len(pageTestData) {
  132. log.Printf("count: expected %d, got %d", len(pageTestData), count)
  133. }
  134. for _, original := range pageTestData {
  135. page, err := getPage(original.Title, original.RevId)
  136. if err != nil {
  137. log.Print("getPage: ", err)
  138. continue
  139. }
  140. sort.Sort(sort.StringSlice(page.Tags))
  141. sort.Sort(sort.StringSlice(original.Tags))
  142. if !reflect.DeepEqual(page, original) {
  143. log.Printf("page: expected %#v, got %#v\n", original, page)
  144. }
  145. }
  146. for _, original := range pageTestData {
  147. if err := session.Query("DELETE FROM page WHERE title = ? AND revid = ?",
  148. original.Title, original.RevId).Exec(); err != nil {
  149. log.Println("delete:", err)
  150. }
  151. }
  152. if err := session.Query("SELECT COUNT(*) FROM page").Scan(&count); err != nil {
  153. log.Fatal("getCount: ", err)
  154. }
  155. if count != 0 {
  156. log.Printf("count: expected %d, got %d", len(pageTestData), count)
  157. }
  158. if err := insertBatch(); err != nil {
  159. log.Fatal("insertBatch: ", err)
  160. }
  161. }