Fork github.com/mattn/go-sqlite3 with adjustment for go1.16.2
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

128 lines
3.2 KiB

  1. // Copyright (C) 2019 G.J.R. Timmer <gjr.timmer@gmail.com>.
  2. // Copyright (C) 2018 segment.com <friends@segment.com>
  3. //
  4. // Use of this source code is governed by an MIT-style
  5. // license that can be found in the LICENSE file.
  6. // +build sqlite_preupdate_hook
  7. package sqlite3
  8. import (
  9. "database/sql"
  10. "testing"
  11. )
  12. type preUpdateHookDataForTest struct {
  13. databaseName string
  14. tableName string
  15. count int
  16. op int
  17. oldRow []interface{}
  18. newRow []interface{}
  19. }
  20. func TestPreUpdateHook(t *testing.T) {
  21. var events []preUpdateHookDataForTest
  22. sql.Register("sqlite3_PreUpdateHook", &SQLiteDriver{
  23. ConnectHook: func(conn *SQLiteConn) error {
  24. conn.RegisterPreUpdateHook(func(data SQLitePreUpdateData) {
  25. eval := -1
  26. oldRow := []interface{}{eval}
  27. if data.Op != SQLITE_INSERT {
  28. err := data.Old(oldRow...)
  29. if err != nil {
  30. t.Fatalf("Unexpected error calling SQLitePreUpdateData.Old: %v", err)
  31. }
  32. }
  33. eval2 := -1
  34. newRow := []interface{}{eval2}
  35. if data.Op != SQLITE_DELETE {
  36. err := data.New(newRow...)
  37. if err != nil {
  38. t.Fatalf("Unexpected error calling SQLitePreUpdateData.New: %v", err)
  39. }
  40. }
  41. // tests dest bound checks in loop
  42. var tooSmallRow []interface{}
  43. if data.Op != SQLITE_INSERT {
  44. err := data.Old(tooSmallRow...)
  45. if err != nil {
  46. t.Fatalf("Unexpected error calling SQLitePreUpdateData.Old: %v", err)
  47. }
  48. if len(tooSmallRow) != 0 {
  49. t.Errorf("Expected tooSmallRow to be empty, got: %v", tooSmallRow)
  50. }
  51. }
  52. events = append(events, preUpdateHookDataForTest{
  53. databaseName: data.DatabaseName,
  54. tableName: data.TableName,
  55. count: data.Count(),
  56. op: data.Op,
  57. oldRow: oldRow,
  58. newRow: newRow,
  59. })
  60. })
  61. return nil
  62. },
  63. })
  64. db, err := sql.Open("sqlite3_PreUpdateHook", ":memory:")
  65. if err != nil {
  66. t.Fatal("Failed to open database:", err)
  67. }
  68. defer db.Close()
  69. statements := []string{
  70. "create table foo (id integer primary key)",
  71. "insert into foo values (9)",
  72. "update foo set id = 99 where id = 9",
  73. "delete from foo where id = 99",
  74. }
  75. for _, statement := range statements {
  76. _, err = db.Exec(statement)
  77. if err != nil {
  78. t.Fatalf("Unable to prepare test data [%v]: %v", statement, err)
  79. }
  80. }
  81. if len(events) != 3 {
  82. t.Errorf("Events should be 3 entries, got: %d", len(events))
  83. }
  84. if events[0].op != SQLITE_INSERT {
  85. t.Errorf("Op isn't as expected: %v", events[0].op)
  86. }
  87. if events[1].op != SQLITE_UPDATE {
  88. t.Errorf("Op isn't as expected: %v", events[1].op)
  89. }
  90. if events[1].count != 1 {
  91. t.Errorf("Expected event row 1 to have 1 column, had: %v", events[1].count)
  92. }
  93. newRow_0_0 := events[0].newRow[0].(int64)
  94. if newRow_0_0 != 9 {
  95. t.Errorf("Expected event row 0 new column 0 to be == 9, got: %v", newRow_0_0)
  96. }
  97. oldRow_1_0 := events[1].oldRow[0].(int64)
  98. if oldRow_1_0 != 9 {
  99. t.Errorf("Expected event row 1 old column 0 to be == 9, got: %v", oldRow_1_0)
  100. }
  101. newRow_1_0 := events[1].newRow[0].(int64)
  102. if newRow_1_0 != 99 {
  103. t.Errorf("Expected event row 1 new column 0 to be == 99, got: %v", newRow_1_0)
  104. }
  105. oldRow_2_0 := events[2].oldRow[0].(int64)
  106. if oldRow_2_0 != 99 {
  107. t.Errorf("Expected event row 1 new column 0 to be == 99, got: %v", oldRow_2_0)
  108. }
  109. }