database.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. package main
  2. import (
  3. "log"
  4. "encoding/json"
  5. "github.com/boltdb/bolt"
  6. "errors"
  7. //database "imuslab.com/aroz_online/mod/database"
  8. )
  9. /*
  10. Database for ArOZ Online make use of the keydb by robaho
  11. See more details of this database in https://github.com/boltdb/bolt
  12. Why the developer choose this DB you might ask?
  13. Beacuse it is simple and simple is beautiful :)
  14. */
  15. //Initiate the database object
  16. func system_db_service_init(dbfile string) *bolt.DB{
  17. db, err := bolt.Open(dbfile, 0600, nil)
  18. if err != nil {
  19. log.Fatal(err)
  20. }
  21. //Create the central system db for all system services
  22. err = db.Update(func(tx *bolt.Tx) error {
  23. _, err = tx.CreateBucketIfNotExists([]byte("SYSTEM"))
  24. if err != nil {
  25. return err
  26. }
  27. return nil
  28. })
  29. if (err != nil){
  30. log.Fatal(err)
  31. }
  32. //Create a testing db object
  33. //dbObject, _ := database.NewDatabase(dbfile, false)
  34. //log.Println(dbObject);
  35. log.Println("ArOZ Online Key-value Database Service Loaded");
  36. return db;
  37. }
  38. /*
  39. Create / Drop a table
  40. Usage:
  41. err := system_db_newTable(sysdb, "MyTable")
  42. err := system_db_dropTable(sysdb, "MyTable")
  43. */
  44. func system_db_newTable(dbObject *bolt.DB, tableName string) error{
  45. if (*demo_mode && !startingUp){
  46. return errors.New("Operation rejected in demo mode")
  47. }
  48. err := dbObject.Update(func(tx *bolt.Tx) error {
  49. _, err := tx.CreateBucketIfNotExists([]byte(tableName))
  50. if err != nil {
  51. return err
  52. }
  53. return nil
  54. })
  55. return err
  56. }
  57. func system_db_dropTable(dbObject *bolt.DB, tableName string) error{
  58. if (*demo_mode && !startingUp){
  59. return errors.New("Operation rejected in demo mode")
  60. }
  61. err := dbObject.Update(func(tx *bolt.Tx) error {
  62. err := tx.DeleteBucket([]byte(tableName))
  63. if err != nil {
  64. return err
  65. }
  66. return nil
  67. })
  68. return err
  69. }
  70. /*
  71. Write to database with given tablename and key. Example Usage:
  72. type demo struct{
  73. content string
  74. }
  75. thisDemo := demo{
  76. content: "Hello World",
  77. }
  78. err := system_db_write(sysdb, "MyTable", "username/message",thisDemo);
  79. */
  80. func system_db_write(dbObject *bolt.DB, tableName string, key string, value interface{}) error{
  81. if (*demo_mode && !startingUp){
  82. return errors.New("Operation rejected in demo mode")
  83. }
  84. jsonString, err := json.Marshal(value);
  85. if (err != nil){
  86. return err
  87. }
  88. err = dbObject.Update(func(tx *bolt.Tx) error {
  89. _, err := tx.CreateBucketIfNotExists([]byte(tableName))
  90. b := tx.Bucket([]byte(tableName))
  91. err = b.Put([]byte(key), jsonString)
  92. return err
  93. })
  94. return err
  95. }
  96. /*
  97. Read from database and assign the content to a given datatype. Example Usage:
  98. type demo struct{
  99. content string
  100. }
  101. thisDemo := new(demo)
  102. err := system_db_write(sysdb, "MyTable", "username/message",&thisDemo);
  103. */
  104. func system_db_read(dbObject *bolt.DB, tableName string, key string, assignee interface{}) error{
  105. err := dbObject.View(func(tx *bolt.Tx) error {
  106. b := tx.Bucket([]byte(tableName))
  107. v := b.Get([]byte(key))
  108. json.Unmarshal(v, &assignee)
  109. return nil
  110. })
  111. return err
  112. }
  113. /*
  114. Delete a value from the database table given tablename and key
  115. err := system_db_delete(sysdb, "MyTable", "username/message");
  116. */
  117. func system_db_delete(dbObject *bolt.DB, tableName string, key string) error{
  118. if (*demo_mode && !startingUp){
  119. return errors.New("Operation rejected in demo mode")
  120. }
  121. err := dbObject.Update(func(tx *bolt.Tx) error {
  122. tx.Bucket([]byte(tableName)).Delete([]byte(key))
  123. return nil;
  124. })
  125. if (err != nil){
  126. return err
  127. }
  128. return nil
  129. }
  130. // ===================== SYSTEM ONLY KEY VALUE STORAGE ======================
  131. /*
  132. //Deprecated on 26-5-2020
  133. func system_db_getValue(dbObject *bolt.DB, key string, assignObject interface{}) error{
  134. var jsonString []byte
  135. err := dbObject.View(func(tx *bolt.Tx) error {
  136. jsonString = tx.Bucket([]byte("SYSTEM")).Get([]byte(key))
  137. return nil
  138. })
  139. err = json.Unmarshal(jsonString, &assignObject)
  140. return err
  141. }
  142. func system_db_setValue(dbObject *bolt.DB, key string, value interface{}) bool{
  143. if (*demo_mode){
  144. return false
  145. }
  146. valueInBytes, err := json.Marshal(value)
  147. if (err != nil){
  148. log.Println("[Database] Cannot parse value for key: " + key)
  149. return false
  150. }
  151. err = dbObject.Update(func(tx *bolt.Tx) error {
  152. err = tx.Bucket([]byte("SYSTEM")).Put([]byte(key), valueInBytes)
  153. if err != nil {
  154. return err
  155. }
  156. return nil
  157. })
  158. if (err != nil){
  159. log.Println("[Database] Set content FAILED for key: " + key, err)
  160. return false
  161. }
  162. return true;
  163. }
  164. */
  165. /*
  166. //List table example usage
  167. //Assume the value is stored as a struct named "groupstruct"
  168. entries := system_db_listTable(sysdb, "test")
  169. for _, keypairs := range entries{
  170. log.Println(string(keypairs[0]))
  171. group := new(groupstruct)
  172. json.Unmarshal(keypairs[1], &group)
  173. log.Println(group);
  174. }
  175. */
  176. func system_db_listTable(dbObject *bolt.DB, table string) [][][]byte{
  177. var results [][][]byte
  178. dbObject.View(func(tx *bolt.Tx) error {
  179. b := tx.Bucket([]byte(table))
  180. c := b.Cursor()
  181. for k, v := c.First(); k != nil; k, v = c.Next() {
  182. results = append(results, [][]byte{k, v})
  183. }
  184. return nil
  185. })
  186. return results;
  187. }
  188. func system_db_removeValue(dbObject *bolt.DB, key string) bool{
  189. if (*demo_mode){
  190. return false
  191. }
  192. err := dbObject.Update(func(tx *bolt.Tx) error {
  193. tx.Bucket([]byte("SYSTEM")).Delete([]byte(key))
  194. return nil;
  195. })
  196. if (err != nil){
  197. return false
  198. }
  199. return true
  200. }
  201. func system_db_closeDatabase(dbObject *bolt.DB){
  202. dbObject.Close()
  203. return;
  204. }