db.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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. // LocalDb returns the local database relative to the given handle.
  43. func (h Handle) LocalDb() (*Db, error) {
  44. db := C.alpm_get_localdb(h.ptr)
  45. if db == nil {
  46. return nil, h.LastError()
  47. }
  48. return &Db{db, h}, nil
  49. }
  50. // SyncDbs returns list of Synced DBs.
  51. func (h Handle) SyncDbs() (DbList, error) {
  52. dblist := C.alpm_get_syncdbs(h.ptr)
  53. if dblist == nil {
  54. return DbList{nil, h}, h.LastError()
  55. }
  56. dblistPtr := unsafe.Pointer(dblist)
  57. return DbList{(*list)(dblistPtr), h}, nil
  58. }
  59. // SyncDbByName finds a registered database by name.
  60. func (h Handle) SyncDbByName(name string) (db *Db, err error) {
  61. dblist, err := h.SyncDbs()
  62. if err != nil {
  63. return nil, err
  64. }
  65. dblist.ForEach(func(b Db) error {
  66. if b.Name() == name {
  67. db = &b
  68. return io.EOF
  69. }
  70. return nil
  71. })
  72. if db != nil {
  73. return db, nil
  74. }
  75. return nil, fmt.Errorf("database %s not found", name)
  76. }
  77. // RegisterSyncDb Loads a sync database with given name and signature check level.
  78. func (h Handle) RegisterSyncDb(dbname string, siglevel SigLevel) (*Db, error) {
  79. cName := C.CString(dbname)
  80. defer C.free(unsafe.Pointer(cName))
  81. db := C.alpm_register_syncdb(h.ptr, cName, C.int(siglevel))
  82. if db == nil {
  83. return nil, h.LastError()
  84. }
  85. return &Db{db, h}, nil
  86. }
  87. // Name returns name of the db
  88. func (db Db) Name() string {
  89. return C.GoString(C.alpm_db_get_name(db.ptr))
  90. }
  91. // Servers returns host server URL.
  92. func (db Db) Servers() []string {
  93. ptr := unsafe.Pointer(C.alpm_db_get_servers(db.ptr))
  94. return StringList{(*list)(ptr)}.Slice()
  95. }
  96. // SetServers sets server list to use.
  97. func (db Db) SetServers(servers []string) {
  98. C.alpm_db_set_servers(db.ptr, nil)
  99. for _, srv := range servers {
  100. Csrv := C.CString(srv)
  101. defer C.free(unsafe.Pointer(Csrv))
  102. C.alpm_db_add_server(db.ptr, Csrv)
  103. }
  104. }
  105. // SetUsage sets the Usage of the database
  106. func (db Db) SetUsage(usage Usage) {
  107. C.alpm_db_set_usage(db.ptr, C.int(usage))
  108. }
  109. // PkgByName searches a package in db.
  110. func (db Db) PkgByName(name string) (*Package, error) {
  111. cName := C.CString(name)
  112. defer C.free(unsafe.Pointer(cName))
  113. ptr := C.alpm_db_get_pkg(db.ptr, cName)
  114. if ptr == nil {
  115. return nil,
  116. fmt.Errorf("Error when retrieving %s from database %s: %s",
  117. name, db.Name(), db.handle.LastError())
  118. }
  119. return &Package{ptr, db.handle}, nil
  120. }
  121. // PkgCachebyGroup returns a PackageList of packages belonging to a group
  122. func (l DbList) PkgCachebyGroup(name string) (PackageList, error) {
  123. cName := C.CString(name)
  124. defer C.free(unsafe.Pointer(cName))
  125. pkglist := (*C.struct___alpm_list_t)(unsafe.Pointer(l.list))
  126. pkgcache := (*list)(unsafe.Pointer(C.alpm_find_group_pkgs(pkglist, cName)))
  127. if pkgcache == nil {
  128. return PackageList{pkgcache, l.handle},
  129. fmt.Errorf("Error when retrieving group %s from database list: %s",
  130. name, l.handle.LastError())
  131. }
  132. return PackageList{pkgcache, l.handle}, nil
  133. }
  134. // PkgCache returns the list of packages of the database
  135. func (db Db) PkgCache() PackageList {
  136. pkgcache := (*list)(unsafe.Pointer(C.alpm_db_get_pkgcache(db.ptr)))
  137. return PackageList{pkgcache, db.handle}
  138. }
  139. func (db Db) Search(targets []string) PackageList {
  140. var needles *C.alpm_list_t
  141. for _, str := range targets {
  142. needles = C.alpm_list_add(needles, unsafe.Pointer(C.CString(str)))
  143. }
  144. pkglist := (*list)(unsafe.Pointer(C.alpm_db_search(db.ptr, needles)))
  145. C.alpm_list_free(needles)
  146. return PackageList{pkglist, db.handle}
  147. }