main.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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. "os"
  8. "reflect"
  9. "sort"
  10. "time"
  11. "tux21b.org/v1/gocql"
  12. "tux21b.org/v1/gocql/uuid"
  13. )
  14. var session *gocql.Session
  15. func init() {
  16. cluster := gocql.NewCluster("127.0.0.1")
  17. cluster.Compressor = gocql.SnappyCompressor{}
  18. session = cluster.CreateSession()
  19. }
  20. type Page struct {
  21. Title string
  22. RevId uuid.UUID
  23. Body string
  24. Views int64
  25. Protected bool
  26. Modified time.Time
  27. Tags []string
  28. Attachments map[string]Attachment
  29. }
  30. type Attachment []byte
  31. func initSchema() error {
  32. if err := session.Query("DROP KEYSPACE gocql_test").Exec(); err != nil {
  33. log.Println("drop keyspace", err)
  34. }
  35. if err := session.Query(`CREATE KEYSPACE gocql_test
  36. WITH replication = {
  37. 'class' : 'SimpleStrategy',
  38. 'replication_factor' : 1
  39. }`).Exec(); err != nil {
  40. return err
  41. }
  42. if err := session.Query("USE gocql_test").Exec(); err != nil {
  43. return err
  44. }
  45. if err := session.Query(`CREATE TABLE page (
  46. title varchar,
  47. revid timeuuid,
  48. body varchar,
  49. views bigint,
  50. protected boolean,
  51. modified timestamp,
  52. tags set<varchar>,
  53. attachments map<varchar, text>,
  54. PRIMARY KEY (title, revid)
  55. )`).Exec(); err != nil {
  56. return err
  57. }
  58. if err := session.Query(`CREATE TABLE page_stats (
  59. title varchar,
  60. views counter,
  61. PRIMARY KEY (title)
  62. )`).Exec(); err != nil {
  63. return err
  64. }
  65. return nil
  66. }
  67. var pageTestData = []*Page{
  68. &Page{
  69. Title: "Frontpage",
  70. RevId: uuid.TimeUUID(),
  71. Body: "Welcome to this wiki page!",
  72. Modified: time.Date(2013, time.August, 13, 9, 52, 3, 0, time.UTC),
  73. Tags: []string{"start", "important", "test"},
  74. Attachments: map[string]Attachment{
  75. "logo": Attachment("\x00company logo\x00"),
  76. "favicon": Attachment("favicon.ico"),
  77. },
  78. },
  79. &Page{
  80. Title: "Foobar",
  81. RevId: uuid.TimeUUID(),
  82. Body: "foo::Foo f = new foo::Foo(foo::Foo::INIT);",
  83. Modified: time.Date(2013, time.August, 13, 9, 52, 3, 0, time.UTC),
  84. },
  85. }
  86. func insertTestData() error {
  87. for _, page := range pageTestData {
  88. if err := session.Query(`INSERT INTO page
  89. (title, revid, body, views, protected, modified, tags, attachments)
  90. VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
  91. page.Title, page.RevId, page.Body, page.Views, page.Protected,
  92. page.Modified, page.Tags, page.Attachments).Exec(); err != nil {
  93. return err
  94. }
  95. }
  96. return nil
  97. }
  98. func insertBatch() error {
  99. batch := gocql.NewBatch(gocql.LoggedBatch)
  100. for _, page := range pageTestData {
  101. batch.Query(`INSERT INTO page
  102. (title, revid, body, views, protected, modified, tags, attachments)
  103. VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
  104. page.Title, page.RevId, page.Body, page.Views, page.Protected,
  105. page.Modified, page.Tags, page.Attachments)
  106. }
  107. if err := session.ExecuteBatch(batch); err != nil {
  108. return err
  109. }
  110. return nil
  111. }
  112. func getPage(title string, revid uuid.UUID) (*Page, error) {
  113. p := new(Page)
  114. err := session.Query(`SELECT title, revid, body, views, protected, modified,
  115. tags, attachments
  116. FROM page WHERE title = ? AND revid = ? LIMIT 1`, title, revid).Scan(
  117. &p.Title, &p.RevId, &p.Body, &p.Views, &p.Protected, &p.Modified,
  118. &p.Tags, &p.Attachments)
  119. return p, err
  120. }
  121. func main() {
  122. if err := initSchema(); err != nil {
  123. log.Fatal("initSchema: ", err)
  124. }
  125. if err := insertTestData(); err != nil {
  126. log.Fatal("insertTestData: ", err)
  127. }
  128. var count int
  129. if err := session.Query("SELECT COUNT(*) FROM page").Scan(&count); err != nil {
  130. log.Fatal("getCount: ", err)
  131. }
  132. if count != len(pageTestData) {
  133. log.Printf("count: expected %d, got %d", len(pageTestData), count)
  134. }
  135. for _, original := range pageTestData {
  136. page, err := getPage(original.Title, original.RevId)
  137. if err != nil {
  138. log.Print("getPage: ", err)
  139. continue
  140. }
  141. sort.Sort(sort.StringSlice(page.Tags))
  142. sort.Sort(sort.StringSlice(original.Tags))
  143. if !reflect.DeepEqual(page, original) {
  144. log.Printf("page: expected %#v, got %#v\n", original, page)
  145. }
  146. }
  147. trace := gocql.NewTraceWriter(session, os.Stdout)
  148. if err := session.Query("SELECT COUNT(*) FROM page").Trace(trace).Scan(&count); err != nil {
  149. log.Fatal("trace: ", err)
  150. }
  151. if err := session.Query("CREATE TABLE large (id int primary key)").Exec(); err != nil {
  152. log.Fatal("create table: ", err)
  153. }
  154. for i := 0; i < 100; i++ {
  155. if err := session.Query("INSERT INTO large (id) VALUES (?)", i).Exec(); err != nil {
  156. log.Fatal("insert: ", err)
  157. }
  158. }
  159. iter := session.Query("SELECT id FROM large").PageSize(10).Iter()
  160. var id int
  161. count = 0
  162. for iter.Scan(&id) {
  163. count++
  164. }
  165. if err := iter.Close(); err != nil {
  166. log.Fatal("large iter:", err)
  167. }
  168. if count != 100 {
  169. log.Fatalf("expected %d, got %d", 100, count)
  170. }
  171. for _, original := range pageTestData {
  172. if err := session.Query("DELETE FROM page WHERE title = ? AND revid = ?",
  173. original.Title, original.RevId).Exec(); err != nil {
  174. log.Println("delete:", err)
  175. }
  176. }
  177. if err := session.Query("SELECT COUNT(*) FROM page").Scan(&count); err != nil {
  178. log.Fatal("getCount: ", err)
  179. }
  180. if count != 0 {
  181. log.Printf("count: expected %d, got %d", len(pageTestData), count)
  182. }
  183. if err := insertBatch(); err != nil {
  184. log.Fatal("insertBatch: ", err)
  185. }
  186. }