db.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. // db.go - Functions for database handling.
  2. //
  3. // Copyright (c) 2013 The go-alpm Authors
  4. //
  5. // MIT Licensed. See LICENSE for details.
  6. package alpm
  7. /*
  8. #include <alpm.h>
  9. #include <alpm_list.h>
  10. */
  11. import "C"
  12. import (
  13. "fmt"
  14. "io"
  15. "unsafe"
  16. )
  17. // DB structure representing a alpm database.
  18. type DB struct {
  19. ptr *C.alpm_db_t
  20. handle Handle
  21. }
  22. // DBList structure representing a alpm database list.
  23. type DBList struct {
  24. *list
  25. handle Handle
  26. }
  27. // ForEach executes an action on each DB.
  28. func (l DBList) ForEach(f func(DB) error) error {
  29. return l.forEach(func(p unsafe.Pointer) error {
  30. return f(DB{(*C.alpm_db_t)(p), l.handle})
  31. })
  32. }
  33. // Slice converst DB list to DB slice.
  34. func (l DBList) Slice() []DB {
  35. slice := []DB{}
  36. l.ForEach(func(db DB) error {
  37. slice = append(slice, db)
  38. return nil
  39. })
  40. return slice
  41. }
  42. // SyncDBByName finds a registered database by name.
  43. func (h *Handle) SyncDBByName(name string) (db *DB, err error) {
  44. dblist, err := h.SyncDBs()
  45. if err != nil {
  46. return nil, err
  47. }
  48. dblist.ForEach(func(b DB) error {
  49. if b.Name() == name {
  50. db = &b
  51. return io.EOF
  52. }
  53. return nil
  54. })
  55. if db != nil {
  56. return db, nil
  57. }
  58. return nil, fmt.Errorf("database %s not found", name)
  59. }
  60. // RegisterSyncDB Loads a sync database with given name and signature check level.
  61. func (h *Handle) RegisterSyncDB(dbname string, siglevel SigLevel) (*DB, error) {
  62. cName := C.CString(dbname)
  63. defer C.free(unsafe.Pointer(cName))
  64. db := C.alpm_register_syncdb(h.ptr, cName, C.int(siglevel))
  65. if db == nil {
  66. return nil, h.LastError()
  67. }
  68. return &DB{db, *h}, nil
  69. }
  70. func (db *DB) Unregister() error {
  71. ok := C.alpm_db_unregister(db.ptr)
  72. if ok != 0 {
  73. return db.handle.LastError()
  74. }
  75. return nil
  76. }
  77. func (h *Handle) UnregisterAllSyncDBs() error {
  78. ok := C.alpm_unregister_all_syncdbs(h.ptr)
  79. if ok != 0 {
  80. return h.LastError()
  81. }
  82. return nil
  83. }
  84. // Name returns name of the db
  85. func (db *DB) Name() string {
  86. return C.GoString(C.alpm_db_get_name(db.ptr))
  87. }
  88. // Servers returns host server URL.
  89. func (db *DB) Servers() []string {
  90. ptr := unsafe.Pointer(C.alpm_db_get_servers(db.ptr))
  91. return StringList{(*list)(ptr)}.Slice()
  92. }
  93. // SetServers sets server list to use.
  94. func (db *DB) SetServers(servers []string) {
  95. C.alpm_db_set_servers(db.ptr, nil)
  96. for _, srv := range servers {
  97. Csrv := C.CString(srv)
  98. defer C.free(unsafe.Pointer(Csrv))
  99. C.alpm_db_add_server(db.ptr, Csrv)
  100. }
  101. }
  102. // AddServers adds a string to the server list.
  103. func (db *DB) AddServer(server string) {
  104. Csrv := C.CString(server)
  105. defer C.free(unsafe.Pointer(Csrv))
  106. C.alpm_db_add_server(db.ptr, Csrv)
  107. }
  108. // SetUsage sets the Usage of the database
  109. func (db *DB) SetUsage(usage Usage) {
  110. C.alpm_db_set_usage(db.ptr, C.int(usage))
  111. }
  112. // Name searches a package in db.
  113. func (db *DB) Pkg(name string) *Package {
  114. cName := C.CString(name)
  115. defer C.free(unsafe.Pointer(cName))
  116. ptr := C.alpm_db_get_pkg(db.ptr, cName)
  117. return &Package{ptr, db.handle}
  118. }
  119. // PkgCachebyGroup returns a PackageList of packages belonging to a group
  120. func (l DBList) FindGroupPkgs(name string) PackageList {
  121. cName := C.CString(name)
  122. defer C.free(unsafe.Pointer(cName))
  123. pkglist := (*C.struct___alpm_list_t)(unsafe.Pointer(l.list))
  124. pkgcache := (*list)(unsafe.Pointer(C.alpm_find_group_pkgs(pkglist, cName)))
  125. return PackageList{pkgcache, l.handle}
  126. }
  127. // PkgCache returns the list of packages of the database
  128. func (db *DB) PkgCache() PackageList {
  129. pkgcache := (*list)(unsafe.Pointer(C.alpm_db_get_pkgcache(db.ptr)))
  130. return PackageList{pkgcache, db.handle}
  131. }
  132. func (db *DB) Search(targets []string) PackageList {
  133. var needles *C.alpm_list_t
  134. for _, str := range targets {
  135. needles = C.alpm_list_add(needles, unsafe.Pointer(C.CString(str)))
  136. }
  137. pkglist := (*list)(unsafe.Pointer(C.alpm_db_search(db.ptr, needles)))
  138. C.alpm_list_free(needles)
  139. return PackageList{pkglist, db.handle}
  140. }