main.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "reflect"
  6. "sort"
  7. "time"
  8. "github.com/tux21b/gocql"
  9. "github.com/tux21b/gocql/uuid"
  10. )
  11. var session *gocql.Session
  12. func init() {
  13. cluster := gocql.NewCluster("127.0.0.1")
  14. cluster.ConnPerHost = 1
  15. session = cluster.CreateSession()
  16. }
  17. type Page struct {
  18. Title string
  19. RevId uuid.UUID
  20. Body string
  21. Views int64
  22. Protected bool
  23. Modified time.Time
  24. Tags []string
  25. Attachments map[string]Attachment
  26. }
  27. type Attachment []byte
  28. func initSchema() error {
  29. session.Query("DROP KEYSPACE gocql_test").Exec()
  30. if err := session.Query(`CREATE KEYSPACE gocql_test
  31. WITH replication = {
  32. 'class' : 'SimpleStrategy',
  33. 'replication_factor' : 1
  34. }`).Exec(); err != nil {
  35. return err
  36. }
  37. if err := session.Query("USE gocql_test").Exec(); err != nil {
  38. return err
  39. }
  40. if err := session.Query(`CREATE TABLE page (
  41. title varchar,
  42. revid timeuuid,
  43. body varchar,
  44. views bigint,
  45. protected boolean,
  46. modified timestamp,
  47. tags set<varchar>,
  48. attachments map<varchar, text>,
  49. PRIMARY KEY (title, revid)
  50. )`).Exec(); err != nil {
  51. fmt.Println("create err")
  52. return err
  53. }
  54. if err := session.Query(`CREATE TABLE page_stats (
  55. title varchar,
  56. views counter,
  57. PRIMARY KEY (title)
  58. )`).Exec(); err != nil {
  59. return err
  60. }
  61. return nil
  62. }
  63. var pageTestData = []*Page{
  64. &Page{
  65. Title: "Frontpage",
  66. RevId: uuid.TimeUUID(),
  67. Body: "Welcome to this wiki page!",
  68. Modified: time.Date(2013, time.August, 13, 9, 52, 3, 0, time.UTC),
  69. Tags: []string{"start", "important", "test"},
  70. Attachments: map[string]Attachment{
  71. "logo": Attachment("\x00company logo\x00"),
  72. "favicon": Attachment("favicon.ico"),
  73. },
  74. },
  75. }
  76. func insertTestData() error {
  77. for _, page := range pageTestData {
  78. if err := session.Query(`INSERT INTO page
  79. (title, revid, body, views, protected, modified, tags, attachments)
  80. VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
  81. page.Title, page.RevId, page.Body, page.Views, page.Protected,
  82. page.Modified, page.Tags, page.Attachments).Exec(); err != nil {
  83. return err
  84. }
  85. }
  86. return nil
  87. }
  88. func getPage(title string, revid uuid.UUID) (*Page, error) {
  89. p := new(Page)
  90. err := session.Query(`SELECT title, revid, body, views, protected, modified,
  91. tags, attachments
  92. FROM page WHERE title = ? AND revid = ?`, title, revid).Scan(
  93. &p.Title, &p.RevId, &p.Body, &p.Views, &p.Protected, &p.Modified,
  94. &p.Tags, &p.Attachments)
  95. return p, err
  96. }
  97. func main() {
  98. if err := initSchema(); err != nil {
  99. log.Fatal("initSchema: ", err)
  100. }
  101. if err := insertTestData(); err != nil {
  102. log.Fatal("insertTestData: ", err)
  103. }
  104. var count int
  105. if err := session.Query("SELECT COUNT(*) FROM page").Scan(&count); err != nil {
  106. log.Fatal("getCount: ", err)
  107. }
  108. if count != len(pageTestData) {
  109. log.Println("count: expected %d, got %d", len(pageTestData), count)
  110. }
  111. for _, original := range pageTestData {
  112. page, err := getPage(original.Title, original.RevId)
  113. if err != nil {
  114. log.Print("getPage: ", err)
  115. continue
  116. }
  117. sort.Sort(sort.StringSlice(page.Tags))
  118. sort.Sort(sort.StringSlice(original.Tags))
  119. if !reflect.DeepEqual(page, original) {
  120. log.Printf("page: expected %#v, got %#v\n", original, page)
  121. }
  122. }
  123. }