database.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package database
  2. /*
  3. ArOZ Online Database Access Module
  4. author: tobychui
  5. This is an improved Object oriented base solution to the original
  6. aroz online database script.
  7. */
  8. import (
  9. "sync"
  10. )
  11. type Database struct {
  12. Db interface{} //This will be nil on openwrt and *bolt.DB in the rest of the systems
  13. Tables sync.Map
  14. ReadOnly bool
  15. }
  16. func NewDatabase(dbfile string, readOnlyMode bool) (*Database, error) {
  17. return newDatabase(dbfile, readOnlyMode)
  18. }
  19. /*
  20. Create / Drop a table
  21. Usage:
  22. err := sysdb.NewTable("MyTable")
  23. err := sysdb.DropTable("MyTable")
  24. */
  25. func (d *Database) UpdateReadWriteMode(readOnly bool) {
  26. d.ReadOnly = readOnly
  27. }
  28. //Dump the whole db into a log file
  29. func (d *Database) Dump(filename string) ([]string, error) {
  30. return d.dump(filename)
  31. }
  32. //Create a new table
  33. func (d *Database) NewTable(tableName string) error {
  34. return d.newTable(tableName)
  35. }
  36. //Check is table exists
  37. func (d *Database) TableExists(tableName string) bool {
  38. return d.tableExists(tableName)
  39. }
  40. //Drop the given table
  41. func (d *Database) DropTable(tableName string) error {
  42. return d.dropTable(tableName)
  43. }
  44. /*
  45. Write to database with given tablename and key. Example Usage:
  46. type demo struct{
  47. content string
  48. }
  49. thisDemo := demo{
  50. content: "Hello World",
  51. }
  52. err := sysdb.Write("MyTable", "username/message",thisDemo);
  53. */
  54. func (d *Database) Write(tableName string, key string, value interface{}) error {
  55. return d.write(tableName, key, value)
  56. }
  57. /*
  58. Read from database and assign the content to a given datatype. Example Usage:
  59. type demo struct{
  60. content string
  61. }
  62. thisDemo := new(demo)
  63. err := sysdb.Read("MyTable", "username/message",&thisDemo);
  64. */
  65. func (d *Database) Read(tableName string, key string, assignee interface{}) error {
  66. return d.read(tableName, key, assignee)
  67. }
  68. func (d *Database) KeyExists(tableName string, key string) bool {
  69. return d.keyExists(tableName, key)
  70. }
  71. /*
  72. Delete a value from the database table given tablename and key
  73. err := sysdb.Delete("MyTable", "username/message");
  74. */
  75. func (d *Database) Delete(tableName string, key string) error {
  76. return d.delete(tableName, key)
  77. }
  78. /*
  79. //List table example usage
  80. //Assume the value is stored as a struct named "groupstruct"
  81. entries, err := sysdb.ListTable("test")
  82. if err != nil {
  83. panic(err)
  84. }
  85. for _, keypairs := range entries{
  86. log.Println(string(keypairs[0]))
  87. group := new(groupstruct)
  88. json.Unmarshal(keypairs[1], &group)
  89. log.Println(group);
  90. }
  91. */
  92. func (d *Database) ListTable(tableName string) ([][][]byte, error) {
  93. return d.listTable(tableName)
  94. }
  95. func (d *Database) Close() {
  96. d.close()
  97. }