db.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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. */
  10. import "C"
  11. import (
  12. "fmt"
  13. "io"
  14. "unsafe"
  15. )
  16. // Db structure representing a alpm database.
  17. type Db struct {
  18. ptr *C.alpm_db_t
  19. handle Handle
  20. }
  21. // DbList structure representing a alpm database list.
  22. type DbList struct {
  23. *list
  24. handle Handle
  25. }
  26. // ForEach executes an action on each Db.
  27. func (l DbList) ForEach(f func(Db) error) error {
  28. return l.forEach(func(p unsafe.Pointer) error {
  29. return f(Db{(*C.alpm_db_t)(p), l.handle})
  30. })
  31. }
  32. // Slice converst Db list to Db slice.
  33. func (l DbList) Slice() []Db {
  34. slice := []Db{}
  35. l.ForEach(func(db Db) error {
  36. slice = append(slice, db)
  37. return nil
  38. })
  39. return slice
  40. }
  41. // LocalDb returns the local database relative to the given handle.
  42. func (h Handle) LocalDb() (*Db, error) {
  43. db := C.alpm_get_localdb(h.ptr)
  44. if db == nil {
  45. return nil, h.LastError()
  46. }
  47. return &Db{db, h}, nil
  48. }
  49. // SyncDbs returns list of Synced DBs.
  50. func (h Handle) SyncDbs() (DbList, error) {
  51. dblist := C.alpm_get_syncdbs(h.ptr)
  52. if dblist == nil {
  53. return DbList{nil, h}, h.LastError()
  54. }
  55. dblistPtr := unsafe.Pointer(dblist)
  56. return DbList{(*list)(dblistPtr), h}, nil
  57. }
  58. // SyncDbByName finds a registered database by name.
  59. func (h Handle) SyncDbByName(name string) (db *Db, err error) {
  60. dblist, err := h.SyncDbs()
  61. if err != nil {
  62. return nil, err
  63. }
  64. dblist.ForEach(func(b Db) error {
  65. if b.Name() == name {
  66. db = &b
  67. return io.EOF
  68. }
  69. return nil
  70. })
  71. if db != nil {
  72. return db, nil
  73. }
  74. return nil, fmt.Errorf("database %s not found", name)
  75. }
  76. // RegisterSyncDb Loads a sync database with given name and signature check level.
  77. func (h Handle) RegisterSyncDb(dbname string, siglevel SigLevel) (*Db, error) {
  78. cName := C.CString(dbname)
  79. defer C.free(unsafe.Pointer(cName))
  80. db := C.alpm_register_syncdb(h.ptr, cName, C.int(siglevel))
  81. if db == nil {
  82. return nil, h.LastError()
  83. }
  84. return &Db{db, h}, nil
  85. }
  86. // Name returns name of the db
  87. func (db Db) Name() string {
  88. return C.GoString(C.alpm_db_get_name(db.ptr))
  89. }
  90. // Servers returns host server URL.
  91. func (db Db) Servers() []string {
  92. ptr := unsafe.Pointer(C.alpm_db_get_servers(db.ptr))
  93. return StringList{(*list)(ptr)}.Slice()
  94. }
  95. // SetServers sets server list to use.
  96. func (db Db) SetServers(servers []string) {
  97. C.alpm_db_set_servers(db.ptr, nil)
  98. for _, srv := range servers {
  99. Csrv := C.CString(srv)
  100. defer C.free(unsafe.Pointer(Csrv))
  101. C.alpm_db_add_server(db.ptr, Csrv)
  102. }
  103. }
  104. // SetUsage sets the Usage of the database
  105. func (db Db) SetUsage(usage Usage) {
  106. C.alpm_db_set_usage(db.ptr, C.int(usage))
  107. }
  108. // PkgByName searches a package in db.
  109. func (db Db) PkgByName(name string) (*Package, error) {
  110. cName := C.CString(name)
  111. defer C.free(unsafe.Pointer(cName))
  112. ptr := C.alpm_db_get_pkg(db.ptr, cName)
  113. if ptr == nil {
  114. return nil,
  115. fmt.Errorf("Error when retrieving %s from database %s: %s",
  116. name, db.Name(), db.handle.LastError())
  117. }
  118. return &Package{ptr, db.handle}, nil
  119. }
  120. // PkgCachebyGroup returns a PackageList of packages belonging to a group
  121. func (l DbList) PkgCachebyGroup(name string) (PackageList, error) {
  122. cName := C.CString(name)
  123. defer C.free(unsafe.Pointer(cName))
  124. pkglist := (*C.struct___alpm_list_t)(unsafe.Pointer(l.list))
  125. pkgcache := (*list)(unsafe.Pointer(C.alpm_find_group_pkgs(pkglist, cName)))
  126. if pkgcache == nil {
  127. return PackageList{pkgcache, l.handle},
  128. fmt.Errorf("Error when retrieving group %s from database list: %s",
  129. name, l.handle.LastError())
  130. }
  131. return PackageList{pkgcache, l.handle}, nil
  132. }
  133. // PkgCache returns the list of packages of the database
  134. func (db Db) PkgCache() PackageList {
  135. pkgcache := (*list)(unsafe.Pointer(C.alpm_db_get_pkgcache(db.ptr)))
  136. return PackageList{pkgcache, db.handle}
  137. }
  138. func (db Db) Search(targets []string) PackageList {
  139. needles := &C.alpm_list_t{}
  140. head := needles
  141. needles.data = unsafe.Pointer(C.CString(targets[0]))
  142. for _, str := range targets[1:] {
  143. needles.next = &C.alpm_list_t{}
  144. needles = needles.next
  145. needles.data = unsafe.Pointer(C.CString(str))
  146. }
  147. pkglist := (*list)(unsafe.Pointer(C.alpm_db_search(db.ptr, needles)))
  148. for needles = head; needles != nil; needles = needles.next {
  149. C.free(needles.data)
  150. }
  151. return PackageList{pkglist, db.handle}
  152. }