2006-03-02 14:06:52 -05:00
|
|
|
/*
|
2010-10-13 04:04:07 -04:00
|
|
|
* be_local.c
|
2007-11-16 21:18:45 -05:00
|
|
|
*
|
2011-01-05 23:45:15 -05:00
|
|
|
* Copyright (c) 2006-2011 Pacman Development Team <pacman-dev@archlinux.org>
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
2007-11-16 21:18:45 -05:00
|
|
|
*
|
2006-03-02 14:06:52 -05:00
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
2007-12-10 23:55:22 -05:00
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
2006-03-02 14:06:52 -05:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include "config.h"
|
2007-03-05 17:13:33 -05:00
|
|
|
|
2006-03-02 14:06:52 -05:00
|
|
|
#include <unistd.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <string.h>
|
2009-11-14 14:26:37 -05:00
|
|
|
#include <stdint.h> /* intmax_t */
|
2006-03-02 14:06:52 -05:00
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <dirent.h>
|
2007-09-19 01:21:56 -04:00
|
|
|
#include <time.h>
|
2006-03-02 14:06:52 -05:00
|
|
|
#include <limits.h> /* PATH_MAX */
|
2007-03-05 17:13:33 -05:00
|
|
|
|
|
|
|
/* libalpm */
|
|
|
|
#include "db.h"
|
|
|
|
#include "alpm_list.h"
|
2006-03-02 14:06:52 -05:00
|
|
|
#include "log.h"
|
|
|
|
#include "util.h"
|
|
|
|
#include "alpm.h"
|
2006-10-15 15:31:03 -04:00
|
|
|
#include "handle.h"
|
2006-11-20 04:10:23 -05:00
|
|
|
#include "package.h"
|
2007-11-13 00:01:14 -05:00
|
|
|
#include "deps.h"
|
2006-10-15 15:31:03 -04:00
|
|
|
|
2006-10-25 14:15:25 -04:00
|
|
|
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
#define LAZY_LOAD(info, errret) \
|
|
|
|
do { \
|
|
|
|
ALPM_LOG_FUNC; \
|
2011-03-20 20:45:57 -04:00
|
|
|
ASSERT(handle != NULL, return (errret)); \
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
if(pkg->origin != PKG_FROM_FILE && !(pkg->infolevel & info)) { \
|
2010-10-09 06:16:15 -04:00
|
|
|
_alpm_local_db_read(pkg->origin_data.db, pkg, info); \
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
} \
|
|
|
|
} while(0)
|
|
|
|
|
|
|
|
|
|
|
|
/* Cache-specific accessor functions. These implementations allow for lazy
|
|
|
|
* loading by the files backend when a data member is actually needed
|
|
|
|
* rather than loading all pieces of information when the package is first
|
|
|
|
* initialized.
|
|
|
|
*/
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
static const char *_cache_get_filename(pmpkg_t *pkg)
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
{
|
|
|
|
LAZY_LOAD(INFRQ_DESC, NULL);
|
|
|
|
return pkg->filename;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const char *_cache_get_desc(pmpkg_t *pkg)
|
|
|
|
{
|
|
|
|
LAZY_LOAD(INFRQ_DESC, NULL);
|
|
|
|
return pkg->desc;
|
|
|
|
}
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
static const char *_cache_get_url(pmpkg_t *pkg)
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
{
|
|
|
|
LAZY_LOAD(INFRQ_DESC, NULL);
|
|
|
|
return pkg->url;
|
|
|
|
}
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
static time_t _cache_get_builddate(pmpkg_t *pkg)
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
{
|
|
|
|
LAZY_LOAD(INFRQ_DESC, 0);
|
|
|
|
return pkg->builddate;
|
|
|
|
}
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
static time_t _cache_get_installdate(pmpkg_t *pkg)
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
{
|
|
|
|
LAZY_LOAD(INFRQ_DESC, 0);
|
|
|
|
return pkg->installdate;
|
|
|
|
}
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
static const char *_cache_get_packager(pmpkg_t *pkg)
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
{
|
|
|
|
LAZY_LOAD(INFRQ_DESC, NULL);
|
|
|
|
return pkg->packager;
|
|
|
|
}
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
static const char *_cache_get_md5sum(pmpkg_t *pkg)
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
{
|
|
|
|
LAZY_LOAD(INFRQ_DESC, NULL);
|
|
|
|
return pkg->md5sum;
|
|
|
|
}
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
static const char *_cache_get_arch(pmpkg_t *pkg)
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
{
|
|
|
|
LAZY_LOAD(INFRQ_DESC, NULL);
|
|
|
|
return pkg->arch;
|
|
|
|
}
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
static off_t _cache_get_size(pmpkg_t *pkg)
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
{
|
|
|
|
LAZY_LOAD(INFRQ_DESC, -1);
|
|
|
|
return pkg->size;
|
|
|
|
}
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
static off_t _cache_get_isize(pmpkg_t *pkg)
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
{
|
|
|
|
LAZY_LOAD(INFRQ_DESC, -1);
|
|
|
|
return pkg->isize;
|
|
|
|
}
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
static pmpkgreason_t _cache_get_reason(pmpkg_t *pkg)
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
{
|
|
|
|
LAZY_LOAD(INFRQ_DESC, -1);
|
|
|
|
return pkg->reason;
|
|
|
|
}
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
static alpm_list_t *_cache_get_licenses(pmpkg_t *pkg)
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
{
|
|
|
|
LAZY_LOAD(INFRQ_DESC, NULL);
|
|
|
|
return pkg->licenses;
|
|
|
|
}
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
static alpm_list_t *_cache_get_groups(pmpkg_t *pkg)
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
{
|
|
|
|
LAZY_LOAD(INFRQ_DESC, NULL);
|
|
|
|
return pkg->groups;
|
|
|
|
}
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
static int _cache_has_scriptlet(pmpkg_t *pkg)
|
2010-12-13 22:00:23 -05:00
|
|
|
{
|
|
|
|
ALPM_LOG_FUNC;
|
|
|
|
|
|
|
|
/* Sanity checks */
|
2011-03-20 20:45:57 -04:00
|
|
|
ASSERT(handle != NULL, return -1);
|
2010-12-13 22:00:23 -05:00
|
|
|
|
|
|
|
if(!(pkg->infolevel & INFRQ_SCRIPTLET)) {
|
|
|
|
_alpm_local_db_read(pkg->origin_data.db, pkg, INFRQ_SCRIPTLET);
|
|
|
|
}
|
|
|
|
return pkg->scriptlet;
|
|
|
|
}
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
static alpm_list_t *_cache_get_depends(pmpkg_t *pkg)
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
{
|
2010-10-30 01:35:43 -04:00
|
|
|
LAZY_LOAD(INFRQ_DESC, NULL);
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
return pkg->depends;
|
|
|
|
}
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
static alpm_list_t *_cache_get_optdepends(pmpkg_t *pkg)
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
{
|
2010-10-30 01:35:43 -04:00
|
|
|
LAZY_LOAD(INFRQ_DESC, NULL);
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
return pkg->optdepends;
|
|
|
|
}
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
static alpm_list_t *_cache_get_conflicts(pmpkg_t *pkg)
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
{
|
2010-10-30 01:35:43 -04:00
|
|
|
LAZY_LOAD(INFRQ_DESC, NULL);
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
return pkg->conflicts;
|
|
|
|
}
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
static alpm_list_t *_cache_get_provides(pmpkg_t *pkg)
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
{
|
2010-10-30 01:35:43 -04:00
|
|
|
LAZY_LOAD(INFRQ_DESC, NULL);
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
return pkg->provides;
|
|
|
|
}
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
static alpm_list_t *_cache_get_replaces(pmpkg_t *pkg)
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
{
|
|
|
|
LAZY_LOAD(INFRQ_DESC, NULL);
|
|
|
|
return pkg->replaces;
|
|
|
|
}
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
/* local packages can not have deltas */
|
2011-04-29 07:10:09 -04:00
|
|
|
static alpm_list_t *_cache_get_deltas(pmpkg_t UNUSED *pkg)
|
2010-12-18 09:15:05 -05:00
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static alpm_list_t *_cache_get_files(pmpkg_t *pkg)
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
{
|
|
|
|
ALPM_LOG_FUNC;
|
|
|
|
|
|
|
|
/* Sanity checks */
|
2011-03-20 20:45:57 -04:00
|
|
|
ASSERT(handle != NULL, return NULL);
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
|
|
|
|
if(pkg->origin == PKG_FROM_LOCALDB
|
|
|
|
&& !(pkg->infolevel & INFRQ_FILES)) {
|
2010-10-09 06:16:15 -04:00
|
|
|
_alpm_local_db_read(pkg->origin_data.db, pkg, INFRQ_FILES);
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
}
|
|
|
|
return pkg->files;
|
|
|
|
}
|
|
|
|
|
2010-12-18 09:15:05 -05:00
|
|
|
static alpm_list_t *_cache_get_backup(pmpkg_t *pkg)
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
{
|
|
|
|
ALPM_LOG_FUNC;
|
|
|
|
|
|
|
|
/* Sanity checks */
|
2011-03-20 20:45:57 -04:00
|
|
|
ASSERT(handle != NULL, return NULL);
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
|
|
|
|
if(pkg->origin == PKG_FROM_LOCALDB
|
|
|
|
&& !(pkg->infolevel & INFRQ_FILES)) {
|
2010-10-09 06:16:15 -04:00
|
|
|
_alpm_local_db_read(pkg->origin_data.db, pkg, INFRQ_FILES);
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
}
|
|
|
|
return pkg->backup;
|
|
|
|
}
|
|
|
|
|
2008-05-11 17:49:01 -04:00
|
|
|
/**
|
|
|
|
* Open a package changelog for reading. Similar to fopen in functionality,
|
|
|
|
* except that the returned 'file stream' is from the database.
|
|
|
|
* @param pkg the package (from db) to read the changelog
|
|
|
|
* @return a 'file stream' to the package changelog
|
|
|
|
*/
|
2010-12-18 09:15:05 -05:00
|
|
|
static void *_cache_changelog_open(pmpkg_t *pkg)
|
2008-05-11 17:49:01 -04:00
|
|
|
{
|
|
|
|
ALPM_LOG_FUNC;
|
|
|
|
|
|
|
|
/* Sanity checks */
|
2011-03-20 20:45:57 -04:00
|
|
|
ASSERT(handle != NULL, return NULL);
|
2008-05-11 17:49:01 -04:00
|
|
|
|
|
|
|
char clfile[PATH_MAX];
|
|
|
|
snprintf(clfile, PATH_MAX, "%s/%s/%s-%s/changelog",
|
|
|
|
alpm_option_get_dbpath(),
|
|
|
|
alpm_db_get_name(alpm_pkg_get_db(pkg)),
|
|
|
|
alpm_pkg_get_name(pkg),
|
|
|
|
alpm_pkg_get_version(pkg));
|
|
|
|
return fopen(clfile, "r");
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Read data from an open changelog 'file stream'. Similar to fread in
|
|
|
|
* functionality, this function takes a buffer and amount of data to read.
|
|
|
|
* @param ptr a buffer to fill with raw changelog data
|
|
|
|
* @param size the size of the buffer
|
|
|
|
* @param pkg the package that the changelog is being read from
|
|
|
|
* @param fp a 'file stream' to the package changelog
|
|
|
|
* @return the number of characters read, or 0 if there is no more data
|
|
|
|
*/
|
2010-12-18 09:15:05 -05:00
|
|
|
static size_t _cache_changelog_read(void *ptr, size_t size,
|
2011-04-29 07:10:09 -04:00
|
|
|
const pmpkg_t UNUSED *pkg, const void *fp)
|
2008-05-11 17:49:01 -04:00
|
|
|
{
|
2011-03-20 20:45:57 -04:00
|
|
|
return fread(ptr, 1, size, (FILE *)fp);
|
2008-05-11 17:49:01 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Close a package changelog for reading. Similar to fclose in functionality,
|
|
|
|
* except that the 'file stream' is from the database.
|
|
|
|
* @param pkg the package that the changelog was read from
|
|
|
|
* @param fp a 'file stream' to the package changelog
|
|
|
|
* @return whether closing the package changelog stream was successful
|
|
|
|
*/
|
2011-04-29 07:10:09 -04:00
|
|
|
static int _cache_changelog_close(const pmpkg_t UNUSED *pkg, void *fp)
|
2008-05-11 17:49:01 -04:00
|
|
|
{
|
2011-03-20 20:45:57 -04:00
|
|
|
return fclose((FILE *)fp);
|
2008-05-11 17:49:01 -04:00
|
|
|
}
|
|
|
|
|
2010-10-14 00:09:20 -04:00
|
|
|
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
/** The local database operations struct. Get package fields through
|
|
|
|
* lazy accessor methods that handle any backend loading and caching
|
|
|
|
* logic.
|
|
|
|
*/
|
|
|
|
static struct pkg_operations local_pkg_ops = {
|
|
|
|
.get_filename = _cache_get_filename,
|
|
|
|
.get_desc = _cache_get_desc,
|
|
|
|
.get_url = _cache_get_url,
|
|
|
|
.get_builddate = _cache_get_builddate,
|
|
|
|
.get_installdate = _cache_get_installdate,
|
|
|
|
.get_packager = _cache_get_packager,
|
|
|
|
.get_md5sum = _cache_get_md5sum,
|
|
|
|
.get_arch = _cache_get_arch,
|
|
|
|
.get_size = _cache_get_size,
|
|
|
|
.get_isize = _cache_get_isize,
|
|
|
|
.get_reason = _cache_get_reason,
|
2010-12-13 22:00:23 -05:00
|
|
|
.has_scriptlet = _cache_has_scriptlet,
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
.get_licenses = _cache_get_licenses,
|
|
|
|
.get_groups = _cache_get_groups,
|
|
|
|
.get_depends = _cache_get_depends,
|
|
|
|
.get_optdepends = _cache_get_optdepends,
|
|
|
|
.get_conflicts = _cache_get_conflicts,
|
|
|
|
.get_provides = _cache_get_provides,
|
|
|
|
.get_replaces = _cache_get_replaces,
|
2010-12-18 09:15:05 -05:00
|
|
|
.get_deltas = _cache_get_deltas,
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
.get_files = _cache_get_files,
|
|
|
|
.get_backup = _cache_get_backup,
|
2008-05-11 17:49:01 -04:00
|
|
|
|
|
|
|
.changelog_open = _cache_changelog_open,
|
|
|
|
.changelog_read = _cache_changelog_read,
|
|
|
|
.changelog_close = _cache_changelog_close,
|
Complete rework of package accessor logic
Hopefully we've finally arrived at package handling nirvana, or at least
this commit will get us a heck of a lot closer. The former method of getting
the depends list for a package was the following:
1. call alpm_pkg_get_depends()
2. this method would check if the package came from the cache
3. if so, ensure our cache level is correct, otherwise call db_load
4. finally return the depends list
Why did this suck? Because getting the depends list from the package
shouldn't care about whether the package was loaded from a file, from the
'package cache', or some other system which we can't even use because the
damn thing is so complicated. It should just return the depends list.
So what does this commit change? It adds a pointer to a struct of function
pointers to every package for all of these 'package operations' as I've
decided to call them (I know, sounds completely straightforward, right?). So
now when we call an alpm_pkg_get-* function, we don't do any of the cache
logic or anything else there- we let the actual backend handle it by
delegating all work to the method at pkg->ops->get_depends.
Now that be_package has achieved equal status with be_files, we can treat
packages from these completely different load points differently. We know a
package loaded from a zip file will have all of its fields populated, so
we can set up all its accessor functions to be direct accessors. On the
other hand, the packages loaded from the local and sync DBs are not always
fully-loaded, so their accessor functions are routed through the same logic
as before.
Net result? More code. However, this code now make it roughly 52 times
easier to open the door to something like a read-only tar.gz database
backend.
Are you still reading? I'm impressed. Looking at the patch will probably be
clearer than this long-winded explanation.
Signed-off-by: Dan McGee <dan@archlinux.org>
[Allan: rebase and adjust]
Signed-off-by: Allan McRae <allan@archlinux.org>
2008-05-11 17:00:33 -04:00
|
|
|
};
|
|
|
|
|
2010-10-10 23:47:18 -04:00
|
|
|
static int checkdbdir(pmdb_t *db)
|
|
|
|
{
|
|
|
|
struct stat buf;
|
|
|
|
const char *path = _alpm_db_path(db);
|
|
|
|
|
|
|
|
if(stat(path, &buf) != 0) {
|
|
|
|
_alpm_log(PM_LOG_DEBUG, "database dir '%s' does not exist, creating it\n",
|
|
|
|
path);
|
|
|
|
if(_alpm_makepath(path) != 0) {
|
|
|
|
RET_ERR(PM_ERR_SYSTEM, -1);
|
|
|
|
}
|
|
|
|
} else if(!S_ISDIR(buf.st_mode)) {
|
|
|
|
_alpm_log(PM_LOG_WARNING, _("removing invalid database: %s\n"), path);
|
|
|
|
if(unlink(path) != 0 || _alpm_makepath(path) != 0) {
|
|
|
|
RET_ERR(PM_ERR_SYSTEM, -1);
|
|
|
|
}
|
|
|
|
}
|
2011-03-20 20:45:57 -04:00
|
|
|
return 0;
|
2010-10-10 23:47:18 -04:00
|
|
|
}
|
2009-10-09 13:11:27 -04:00
|
|
|
|
2010-10-05 12:44:32 -04:00
|
|
|
static int is_dir(const char *path, struct dirent *entry)
|
|
|
|
{
|
2010-11-16 21:13:36 -05:00
|
|
|
#ifdef HAVE_STRUCT_DIRENT_D_TYPE
|
2011-03-01 14:39:43 -05:00
|
|
|
if(entry->d_type != DT_UNKNOWN) {
|
2011-03-20 20:45:57 -04:00
|
|
|
return (entry->d_type == DT_DIR);
|
2011-03-01 14:39:43 -05:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
char buffer[PATH_MAX];
|
|
|
|
struct stat sbuf;
|
|
|
|
|
|
|
|
snprintf(buffer, PATH_MAX, "%s/%s", path, entry->d_name);
|
|
|
|
|
2011-04-20 20:45:16 -04:00
|
|
|
if(!stat(buffer, &sbuf)) {
|
2011-03-20 20:45:57 -04:00
|
|
|
return S_ISDIR(sbuf.st_mode);
|
2011-03-01 14:39:43 -05:00
|
|
|
}
|
2010-10-05 12:44:32 -04:00
|
|
|
}
|
|
|
|
|
2011-03-20 20:45:57 -04:00
|
|
|
return 0;
|
2010-10-05 12:44:32 -04:00
|
|
|
}
|
|
|
|
|
2010-12-13 21:19:32 -05:00
|
|
|
static int local_db_populate(pmdb_t *db)
|
2006-03-02 14:06:52 -05:00
|
|
|
{
|
2011-02-15 17:56:44 -05:00
|
|
|
size_t est_count;
|
|
|
|
int count = 0;
|
2011-01-24 18:48:54 -05:00
|
|
|
struct stat buf;
|
2006-03-02 14:06:52 -05:00
|
|
|
struct dirent *ent = NULL;
|
2009-09-14 23:44:51 -04:00
|
|
|
const char *dbpath;
|
2009-01-19 14:45:12 -05:00
|
|
|
DIR *dbdir;
|
2006-03-02 14:06:52 -05:00
|
|
|
|
2007-01-30 03:14:10 -05:00
|
|
|
ALPM_LOG_FUNC;
|
|
|
|
|
2008-05-12 19:56:14 -04:00
|
|
|
ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, -1));
|
2006-03-02 14:06:52 -05:00
|
|
|
|
2009-09-14 23:44:51 -04:00
|
|
|
dbpath = _alpm_db_path(db);
|
2010-10-20 02:59:34 -04:00
|
|
|
if(dbpath == NULL) {
|
2011-02-15 17:56:44 -05:00
|
|
|
RET_ERR(PM_ERR_DB_OPEN, -1);
|
2010-10-20 02:59:34 -04:00
|
|
|
}
|
2009-09-14 23:44:51 -04:00
|
|
|
dbdir = opendir(dbpath);
|
2009-01-19 14:45:12 -05:00
|
|
|
if(dbdir == NULL) {
|
2011-02-15 17:56:44 -05:00
|
|
|
if(errno == ENOENT) {
|
|
|
|
/* no database existing yet is not an error */
|
2011-03-20 20:45:57 -04:00
|
|
|
return 0;
|
2011-02-15 17:56:44 -05:00
|
|
|
}
|
|
|
|
RET_ERR(PM_ERR_DB_OPEN, -1);
|
2009-01-19 14:45:12 -05:00
|
|
|
}
|
2011-01-24 18:48:54 -05:00
|
|
|
if(fstat(dirfd(dbdir), &buf) != 0) {
|
2011-02-15 17:56:44 -05:00
|
|
|
RET_ERR(PM_ERR_DB_OPEN, -1);
|
|
|
|
}
|
|
|
|
if(buf.st_nlink >= 2) {
|
|
|
|
est_count = buf.st_nlink;
|
|
|
|
} else {
|
|
|
|
/* Some filesystems don't subscribe to the two-implicit links school of
|
|
|
|
* thought, e.g. BTRFS, HFS+. See
|
|
|
|
* http://kerneltrap.org/mailarchive/linux-btrfs/2010/1/23/6723483/thread
|
|
|
|
*/
|
|
|
|
est_count = 0;
|
2011-04-02 14:26:27 -04:00
|
|
|
while(readdir(dbdir) != NULL) {
|
2011-02-15 17:56:44 -05:00
|
|
|
est_count++;
|
|
|
|
}
|
|
|
|
rewinddir(dbdir);
|
|
|
|
}
|
|
|
|
if(est_count >= 2) {
|
|
|
|
/* subtract the two extra pointers to get # of children */
|
|
|
|
est_count -= 2;
|
2011-01-24 18:48:54 -05:00
|
|
|
}
|
2011-01-24 20:49:34 -05:00
|
|
|
|
|
|
|
/* initialize hash at 50% full */
|
|
|
|
db->pkgcache = _alpm_pkghash_create(est_count * 2);
|
2011-02-07 17:59:04 -05:00
|
|
|
if(db->pkgcache == NULL){
|
|
|
|
closedir(dbdir);
|
|
|
|
RET_ERR(PM_ERR_MEMORY, -1);
|
|
|
|
}
|
2011-01-24 20:49:34 -05:00
|
|
|
|
2009-01-19 14:45:12 -05:00
|
|
|
while((ent = readdir(dbdir)) != NULL) {
|
2008-05-12 19:56:14 -04:00
|
|
|
const char *name = ent->d_name;
|
2010-10-09 09:31:29 -04:00
|
|
|
|
2008-05-12 19:56:14 -04:00
|
|
|
pmpkg_t *pkg;
|
2008-01-11 01:01:58 -05:00
|
|
|
|
2008-05-12 19:56:14 -04:00
|
|
|
if(strcmp(name, ".") == 0 || strcmp(name, "..") == 0) {
|
|
|
|
continue;
|
|
|
|
}
|
2010-10-05 12:44:32 -04:00
|
|
|
if(!is_dir(dbpath, ent)) {
|
2008-05-12 19:56:14 -04:00
|
|
|
continue;
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
2007-01-31 01:48:06 -05:00
|
|
|
|
2008-05-13 20:03:54 -04:00
|
|
|
pkg = _alpm_pkg_new();
|
2007-01-31 01:48:06 -05:00
|
|
|
if(pkg == NULL) {
|
2009-01-19 14:45:12 -05:00
|
|
|
closedir(dbdir);
|
2011-01-28 18:41:15 -05:00
|
|
|
RET_ERR(PM_ERR_MEMORY, -1);
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
2007-06-17 23:25:07 -04:00
|
|
|
/* split the db entry name */
|
2010-10-11 00:05:07 -04:00
|
|
|
if(_alpm_splitname(name, pkg) != 0) {
|
2007-06-17 23:25:07 -04:00
|
|
|
_alpm_log(PM_LOG_ERROR, _("invalid name for database entry '%s'\n"),
|
2008-05-12 19:56:14 -04:00
|
|
|
name);
|
|
|
|
_alpm_pkg_free(pkg);
|
2007-05-18 02:19:00 -04:00
|
|
|
continue;
|
2007-01-31 01:48:06 -05:00
|
|
|
}
|
2007-03-03 03:13:59 -05:00
|
|
|
|
2009-11-13 10:42:42 -05:00
|
|
|
/* duplicated database entries are not allowed */
|
2011-01-24 20:49:34 -05:00
|
|
|
if(_alpm_pkghash_find(db->pkgcache, pkg->name)) {
|
2009-11-13 10:42:42 -05:00
|
|
|
_alpm_log(PM_LOG_ERROR, _("duplicated database entry '%s'\n"), pkg->name);
|
|
|
|
_alpm_pkg_free(pkg);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
Fix double filelist issue when upgrading a package
Due to the way we funk around with package data loading, we had a condition
where the filelist got doubled up because it was loaded twice.
Packages are originally loaded with INFRQ_BASE. In an upgrade/sync, the
package is checked for file conflicts next, leaving us in an "INFRQ_BASE |
INFRQ_FILES" state. Later, when committing a single package, we have an
explicit call to _alpm_local_db_read() with INFRQ_ALL as the level. Because
the package's level did not match this, we skipped over our previous "does
the incoming level match where I'm at" shortcut, and continued to load
things again, because of a lack of fine-grained checking for each of DESC,
FILES, and INSTALL.
The end result is we loaded the filelist twice, causing our remove logic to
iterate twice over the installed files, spewing a bunch of "cannot find file
X" messages.
Fix the problem by doing a bit more bitmasking logic throughout the load
method, and also fix the sanity check at the beginning of the function- this
should *only* be used for local packages as opposed to the "not a package"
check that was there before.
A debug log message was added to upgraderemove as well to match the one
already in the normal remove codepath.
Signed-off-by: Dan McGee <dan@archlinux.org>
2011-01-11 19:46:10 -05:00
|
|
|
pkg->origin = PKG_FROM_LOCALDB;
|
|
|
|
pkg->origin_data.db = db;
|
|
|
|
pkg->ops = &local_pkg_ops;
|
|
|
|
|
2007-03-03 03:13:59 -05:00
|
|
|
/* explicitly read with only 'BASE' data, accessors will handle the rest */
|
2010-10-09 06:16:15 -04:00
|
|
|
if(_alpm_local_db_read(db, pkg, INFRQ_BASE) == -1) {
|
2008-05-12 19:56:14 -04:00
|
|
|
_alpm_log(PM_LOG_ERROR, _("corrupted database entry '%s'\n"), name);
|
2007-04-26 21:08:34 -04:00
|
|
|
_alpm_pkg_free(pkg);
|
2008-05-12 19:56:14 -04:00
|
|
|
continue;
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
2010-10-13 04:04:07 -04:00
|
|
|
|
2008-05-12 19:56:14 -04:00
|
|
|
/* add to the collection */
|
2011-03-01 14:39:43 -05:00
|
|
|
_alpm_log(PM_LOG_DEBUG, "adding '%s' to package cache for db '%s'\n",
|
2008-05-12 19:56:14 -04:00
|
|
|
pkg->name, db->treename);
|
2011-01-24 20:49:34 -05:00
|
|
|
db->pkgcache = _alpm_pkghash_add(db->pkgcache, pkg);
|
2008-05-12 19:56:14 -04:00
|
|
|
count++;
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
|
|
|
|
2009-01-19 14:45:12 -05:00
|
|
|
closedir(dbdir);
|
2011-01-24 20:49:34 -05:00
|
|
|
if(count > 0) {
|
|
|
|
db->pkgcache->list = alpm_list_msort(db->pkgcache->list, (size_t)count, _alpm_pkg_cmp);
|
|
|
|
}
|
2011-03-20 20:45:57 -04:00
|
|
|
return count;
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
|
|
|
|
2010-10-10 23:47:18 -04:00
|
|
|
/* Note: the return value must be freed by the caller */
|
|
|
|
static char *get_pkgpath(pmdb_t *db, pmpkg_t *info)
|
|
|
|
{
|
|
|
|
size_t len;
|
|
|
|
char *pkgpath;
|
|
|
|
const char *dbpath;
|
|
|
|
|
|
|
|
dbpath = _alpm_db_path(db);
|
|
|
|
len = strlen(dbpath) + strlen(info->name) + strlen(info->version) + 3;
|
|
|
|
MALLOC(pkgpath, len, RET_ERR(PM_ERR_MEMORY, NULL));
|
|
|
|
sprintf(pkgpath, "%s%s-%s/", dbpath, info->name, info->version);
|
2011-03-20 20:45:57 -04:00
|
|
|
return pkgpath;
|
2010-10-10 23:47:18 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-10-09 06:16:15 -04:00
|
|
|
int _alpm_local_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
|
2006-03-02 14:06:52 -05:00
|
|
|
{
|
|
|
|
FILE *fp = NULL;
|
2008-05-04 20:34:03 -04:00
|
|
|
char path[PATH_MAX];
|
2010-07-07 18:12:42 -04:00
|
|
|
char line[1024];
|
2008-05-30 02:52:27 -04:00
|
|
|
char *pkgpath = NULL;
|
2006-03-02 14:06:52 -05:00
|
|
|
|
2007-01-30 03:14:10 -05:00
|
|
|
ALPM_LOG_FUNC;
|
|
|
|
|
2006-10-25 14:15:25 -04:00
|
|
|
if(db == NULL) {
|
|
|
|
RET_ERR(PM_ERR_DB_NULL, -1);
|
|
|
|
}
|
|
|
|
|
2008-01-11 01:01:58 -05:00
|
|
|
if(info == NULL || info->name == NULL || info->version == NULL) {
|
2010-10-09 06:16:15 -04:00
|
|
|
_alpm_log(PM_LOG_DEBUG, "invalid package entry provided to _alpm_local_db_read, skipping\n");
|
2011-03-20 20:45:57 -04:00
|
|
|
return -1;
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
|
|
|
|
Fix double filelist issue when upgrading a package
Due to the way we funk around with package data loading, we had a condition
where the filelist got doubled up because it was loaded twice.
Packages are originally loaded with INFRQ_BASE. In an upgrade/sync, the
package is checked for file conflicts next, leaving us in an "INFRQ_BASE |
INFRQ_FILES" state. Later, when committing a single package, we have an
explicit call to _alpm_local_db_read() with INFRQ_ALL as the level. Because
the package's level did not match this, we skipped over our previous "does
the incoming level match where I'm at" shortcut, and continued to load
things again, because of a lack of fine-grained checking for each of DESC,
FILES, and INSTALL.
The end result is we loaded the filelist twice, causing our remove logic to
iterate twice over the installed files, spewing a bunch of "cannot find file
X" messages.
Fix the problem by doing a bit more bitmasking logic throughout the load
method, and also fix the sanity check at the beginning of the function- this
should *only* be used for local packages as opposed to the "not a package"
check that was there before.
A debug log message was added to upgraderemove as well to match the one
already in the normal remove codepath.
Signed-off-by: Dan McGee <dan@archlinux.org>
2011-01-11 19:46:10 -05:00
|
|
|
if(info->origin != PKG_FROM_LOCALDB) {
|
|
|
|
_alpm_log(PM_LOG_DEBUG,
|
|
|
|
"request to read info for a non-local package '%s', skipping...\n",
|
|
|
|
info->name);
|
2011-03-20 20:45:57 -04:00
|
|
|
return -1;
|
2006-11-01 01:30:47 -05:00
|
|
|
}
|
|
|
|
|
2007-03-11 23:02:57 -04:00
|
|
|
/* bitmask logic here:
|
|
|
|
* infolevel: 00001111
|
|
|
|
* inforeq: 00010100
|
|
|
|
* & result: 00000100
|
|
|
|
* == to inforeq? nope, we need to load more info. */
|
|
|
|
if((info->infolevel & inforeq) == inforeq) {
|
Fix double filelist issue when upgrading a package
Due to the way we funk around with package data loading, we had a condition
where the filelist got doubled up because it was loaded twice.
Packages are originally loaded with INFRQ_BASE. In an upgrade/sync, the
package is checked for file conflicts next, leaving us in an "INFRQ_BASE |
INFRQ_FILES" state. Later, when committing a single package, we have an
explicit call to _alpm_local_db_read() with INFRQ_ALL as the level. Because
the package's level did not match this, we skipped over our previous "does
the incoming level match where I'm at" shortcut, and continued to load
things again, because of a lack of fine-grained checking for each of DESC,
FILES, and INSTALL.
The end result is we loaded the filelist twice, causing our remove logic to
iterate twice over the installed files, spewing a bunch of "cannot find file
X" messages.
Fix the problem by doing a bit more bitmasking logic throughout the load
method, and also fix the sanity check at the beginning of the function- this
should *only* be used for local packages as opposed to the "not a package"
check that was there before.
A debug log message was added to upgraderemove as well to match the one
already in the normal remove codepath.
Signed-off-by: Dan McGee <dan@archlinux.org>
2011-01-11 19:46:10 -05:00
|
|
|
/* already loaded all of this info, do nothing */
|
2011-03-20 20:45:57 -04:00
|
|
|
return 0;
|
2006-11-22 04:03:41 -05:00
|
|
|
}
|
2008-01-01 20:57:02 -05:00
|
|
|
_alpm_log(PM_LOG_FUNCTION, "loading package data for %s : level=0x%x\n",
|
|
|
|
info->name, inforeq);
|
2006-11-01 01:30:47 -05:00
|
|
|
|
2006-11-20 04:10:23 -05:00
|
|
|
/* clear out 'line', to be certain - and to make valgrind happy */
|
2010-07-07 18:12:42 -04:00
|
|
|
memset(line, 0, sizeof(line));
|
2006-11-20 04:10:23 -05:00
|
|
|
|
2008-05-30 02:52:27 -04:00
|
|
|
pkgpath = get_pkgpath(db, info);
|
|
|
|
|
2008-06-15 20:15:36 -04:00
|
|
|
if(access(pkgpath, F_OK)) {
|
2006-03-02 14:06:52 -05:00
|
|
|
/* directory doesn't exist or can't be opened */
|
2007-08-23 22:26:55 -04:00
|
|
|
_alpm_log(PM_LOG_DEBUG, "cannot find '%s-%s' in db '%s'\n",
|
2007-07-10 14:24:58 -04:00
|
|
|
info->name, info->version, db->treename);
|
2008-05-30 02:52:27 -04:00
|
|
|
goto error;
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/* DESC */
|
Fix double filelist issue when upgrading a package
Due to the way we funk around with package data loading, we had a condition
where the filelist got doubled up because it was loaded twice.
Packages are originally loaded with INFRQ_BASE. In an upgrade/sync, the
package is checked for file conflicts next, leaving us in an "INFRQ_BASE |
INFRQ_FILES" state. Later, when committing a single package, we have an
explicit call to _alpm_local_db_read() with INFRQ_ALL as the level. Because
the package's level did not match this, we skipped over our previous "does
the incoming level match where I'm at" shortcut, and continued to load
things again, because of a lack of fine-grained checking for each of DESC,
FILES, and INSTALL.
The end result is we loaded the filelist twice, causing our remove logic to
iterate twice over the installed files, spewing a bunch of "cannot find file
X" messages.
Fix the problem by doing a bit more bitmasking logic throughout the load
method, and also fix the sanity check at the beginning of the function- this
should *only* be used for local packages as opposed to the "not a package"
check that was there before.
A debug log message was added to upgraderemove as well to match the one
already in the normal remove codepath.
Signed-off-by: Dan McGee <dan@archlinux.org>
2011-01-11 19:46:10 -05:00
|
|
|
if(inforeq & INFRQ_DESC && !(info->infolevel & INFRQ_DESC)) {
|
2008-05-30 02:52:27 -04:00
|
|
|
snprintf(path, PATH_MAX, "%sdesc", pkgpath);
|
2007-01-24 03:51:50 -05:00
|
|
|
if((fp = fopen(path, "r")) == NULL) {
|
2007-08-23 22:26:55 -04:00
|
|
|
_alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno));
|
2006-03-02 14:06:52 -05:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
while(!feof(fp)) {
|
2010-07-07 18:12:42 -04:00
|
|
|
if(fgets(line, sizeof(line), fp) == NULL) {
|
2006-03-02 14:06:52 -05:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
_alpm_strtrim(line);
|
2008-05-03 13:59:11 -04:00
|
|
|
if(strcmp(line, "%NAME%") == 0) {
|
2010-07-07 18:12:42 -04:00
|
|
|
if(fgets(line, sizeof(line), fp) == NULL) {
|
2008-05-03 13:59:11 -04:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
if(strcmp(_alpm_strtrim(line), info->name) != 0) {
|
|
|
|
_alpm_log(PM_LOG_ERROR, _("%s database is inconsistent: name "
|
|
|
|
"mismatch on package %s\n"), db->treename, info->name);
|
|
|
|
}
|
|
|
|
} else if(strcmp(line, "%VERSION%") == 0) {
|
2010-07-07 18:12:42 -04:00
|
|
|
if(fgets(line, sizeof(line), fp) == NULL) {
|
2008-05-03 13:59:11 -04:00
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
if(strcmp(_alpm_strtrim(line), info->version) != 0) {
|
|
|
|
_alpm_log(PM_LOG_ERROR, _("%s database is inconsistent: version "
|
|
|
|
"mismatch on package %s\n"), db->treename, info->name);
|
|
|
|
}
|
|
|
|
} else if(strcmp(line, "%DESC%") == 0) {
|
2010-07-07 18:12:42 -04:00
|
|
|
if(fgets(line, sizeof(line), fp) == NULL) {
|
2007-02-12 20:46:33 -05:00
|
|
|
goto error;
|
|
|
|
}
|
2008-01-11 01:01:58 -05:00
|
|
|
STRDUP(info->desc, _alpm_strtrim(line), goto error);
|
|
|
|
} else if(strcmp(line, "%GROUPS%") == 0) {
|
2010-07-07 18:12:42 -04:00
|
|
|
while(fgets(line, sizeof(line), fp) && strlen(_alpm_strtrim(line))) {
|
2008-01-11 01:01:58 -05:00
|
|
|
char *linedup;
|
2011-02-04 22:48:54 -05:00
|
|
|
STRDUP(linedup, line, goto error);
|
2008-01-11 01:01:58 -05:00
|
|
|
info->groups = alpm_list_add(info->groups, linedup);
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
2008-01-11 01:01:58 -05:00
|
|
|
} else if(strcmp(line, "%URL%") == 0) {
|
2010-07-07 18:12:42 -04:00
|
|
|
if(fgets(line, sizeof(line), fp) == NULL) {
|
2006-03-02 14:06:52 -05:00
|
|
|
goto error;
|
|
|
|
}
|
2008-01-11 01:01:58 -05:00
|
|
|
STRDUP(info->url, _alpm_strtrim(line), goto error);
|
|
|
|
} else if(strcmp(line, "%LICENSE%") == 0) {
|
2010-07-07 18:12:42 -04:00
|
|
|
while(fgets(line, sizeof(line), fp) && strlen(_alpm_strtrim(line))) {
|
2008-01-11 01:01:58 -05:00
|
|
|
char *linedup;
|
2011-02-04 22:48:54 -05:00
|
|
|
STRDUP(linedup, line, goto error);
|
2008-01-11 01:01:58 -05:00
|
|
|
info->licenses = alpm_list_add(info->licenses, linedup);
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
2008-01-11 01:01:58 -05:00
|
|
|
} else if(strcmp(line, "%ARCH%") == 0) {
|
2010-07-07 18:12:42 -04:00
|
|
|
if(fgets(line, sizeof(line), fp) == NULL) {
|
2006-03-02 14:06:52 -05:00
|
|
|
goto error;
|
|
|
|
}
|
2008-01-11 01:01:58 -05:00
|
|
|
STRDUP(info->arch, _alpm_strtrim(line), goto error);
|
|
|
|
} else if(strcmp(line, "%BUILDDATE%") == 0) {
|
2010-07-07 18:12:42 -04:00
|
|
|
if(fgets(line, sizeof(line), fp) == NULL) {
|
2006-03-02 14:06:52 -05:00
|
|
|
goto error;
|
|
|
|
}
|
2008-01-11 01:01:58 -05:00
|
|
|
_alpm_strtrim(line);
|
2011-01-07 21:35:43 -05:00
|
|
|
info->builddate = _alpm_parsedate(line);
|
2008-01-11 01:01:58 -05:00
|
|
|
} else if(strcmp(line, "%INSTALLDATE%") == 0) {
|
2010-07-07 18:12:42 -04:00
|
|
|
if(fgets(line, sizeof(line), fp) == NULL) {
|
2006-03-02 14:06:52 -05:00
|
|
|
goto error;
|
|
|
|
}
|
2008-01-11 01:01:58 -05:00
|
|
|
_alpm_strtrim(line);
|
2011-01-07 21:35:43 -05:00
|
|
|
info->installdate = _alpm_parsedate(line);
|
2008-01-11 01:01:58 -05:00
|
|
|
} else if(strcmp(line, "%PACKAGER%") == 0) {
|
2010-07-07 18:12:42 -04:00
|
|
|
if(fgets(line, sizeof(line), fp) == NULL) {
|
2006-03-02 14:06:52 -05:00
|
|
|
goto error;
|
|
|
|
}
|
2008-01-11 01:01:58 -05:00
|
|
|
STRDUP(info->packager, _alpm_strtrim(line), goto error);
|
|
|
|
} else if(strcmp(line, "%REASON%") == 0) {
|
2010-07-07 18:12:42 -04:00
|
|
|
if(fgets(line, sizeof(line), fp) == NULL) {
|
2006-03-02 14:06:52 -05:00
|
|
|
goto error;
|
|
|
|
}
|
2008-11-17 22:47:55 -05:00
|
|
|
info->reason = (pmpkgreason_t)atol(_alpm_strtrim(line));
|
2010-10-11 01:06:10 -04:00
|
|
|
} else if(strcmp(line, "%SIZE%") == 0) {
|
2006-03-02 14:06:52 -05:00
|
|
|
/* NOTE: the CSIZE and SIZE fields both share the "size" field
|
|
|
|
* in the pkginfo_t struct. This can be done b/c CSIZE
|
|
|
|
* is currently only used in sync databases, and SIZE is
|
|
|
|
* only used in local databases.
|
|
|
|
*/
|
2010-07-07 18:12:42 -04:00
|
|
|
if(fgets(line, sizeof(line), fp) == NULL) {
|
2006-03-02 14:06:52 -05:00
|
|
|
goto error;
|
|
|
|
}
|
2008-01-11 01:01:58 -05:00
|
|
|
info->size = atol(_alpm_strtrim(line));
|
2010-10-11 01:06:10 -04:00
|
|
|
/* also store this value to isize */
|
|
|
|
info->isize = info->size;
|
2008-01-11 01:01:58 -05:00
|
|
|
} else if(strcmp(line, "%REPLACES%") == 0) {
|
2010-07-07 18:12:42 -04:00
|
|
|
while(fgets(line, sizeof(line), fp) && strlen(_alpm_strtrim(line))) {
|
2008-01-11 01:01:58 -05:00
|
|
|
char *linedup;
|
2011-02-04 22:48:54 -05:00
|
|
|
STRDUP(linedup, line, goto error);
|
2008-01-11 01:01:58 -05:00
|
|
|
info->replaces = alpm_list_add(info->replaces, linedup);
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
2010-10-30 01:35:43 -04:00
|
|
|
} else if(strcmp(line, "%DEPENDS%") == 0) {
|
|
|
|
while(fgets(line, sizeof(line), fp) && strlen(_alpm_strtrim(line))) {
|
2011-02-04 22:48:54 -05:00
|
|
|
pmdepend_t *dep = _alpm_splitdep(line);
|
2010-10-30 01:35:43 -04:00
|
|
|
info->depends = alpm_list_add(info->depends, dep);
|
|
|
|
}
|
|
|
|
} else if(strcmp(line, "%OPTDEPENDS%") == 0) {
|
2010-07-07 18:12:42 -04:00
|
|
|
while(fgets(line, sizeof(line), fp) && strlen(_alpm_strtrim(line))) {
|
2008-01-11 01:01:58 -05:00
|
|
|
char *linedup;
|
2011-02-04 22:48:54 -05:00
|
|
|
STRDUP(linedup, line, goto error);
|
2010-10-30 01:35:43 -04:00
|
|
|
info->optdepends = alpm_list_add(info->optdepends, linedup);
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
2010-10-30 01:35:43 -04:00
|
|
|
} else if(strcmp(line, "%CONFLICTS%") == 0) {
|
2010-07-07 18:12:42 -04:00
|
|
|
while(fgets(line, sizeof(line), fp) && strlen(_alpm_strtrim(line))) {
|
2008-01-11 01:01:58 -05:00
|
|
|
char *linedup;
|
2011-02-04 22:48:54 -05:00
|
|
|
STRDUP(linedup, line, goto error);
|
2010-10-30 01:35:43 -04:00
|
|
|
info->conflicts = alpm_list_add(info->conflicts, linedup);
|
|
|
|
}
|
|
|
|
} else if(strcmp(line, "%PROVIDES%") == 0) {
|
|
|
|
while(fgets(line, sizeof(line), fp) && strlen(_alpm_strtrim(line))) {
|
|
|
|
char *linedup;
|
2011-02-04 22:48:54 -05:00
|
|
|
STRDUP(linedup, line, goto error);
|
2010-10-30 01:35:43 -04:00
|
|
|
info->provides = alpm_list_add(info->provides, linedup);
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fclose(fp);
|
|
|
|
fp = NULL;
|
|
|
|
}
|
|
|
|
|
2010-10-30 01:35:43 -04:00
|
|
|
/* FILES */
|
Fix double filelist issue when upgrading a package
Due to the way we funk around with package data loading, we had a condition
where the filelist got doubled up because it was loaded twice.
Packages are originally loaded with INFRQ_BASE. In an upgrade/sync, the
package is checked for file conflicts next, leaving us in an "INFRQ_BASE |
INFRQ_FILES" state. Later, when committing a single package, we have an
explicit call to _alpm_local_db_read() with INFRQ_ALL as the level. Because
the package's level did not match this, we skipped over our previous "does
the incoming level match where I'm at" shortcut, and continued to load
things again, because of a lack of fine-grained checking for each of DESC,
FILES, and INSTALL.
The end result is we loaded the filelist twice, causing our remove logic to
iterate twice over the installed files, spewing a bunch of "cannot find file
X" messages.
Fix the problem by doing a bit more bitmasking logic throughout the load
method, and also fix the sanity check at the beginning of the function- this
should *only* be used for local packages as opposed to the "not a package"
check that was there before.
A debug log message was added to upgraderemove as well to match the one
already in the normal remove codepath.
Signed-off-by: Dan McGee <dan@archlinux.org>
2011-01-11 19:46:10 -05:00
|
|
|
if(inforeq & INFRQ_FILES && !(info->infolevel & INFRQ_FILES)) {
|
2010-10-30 01:35:43 -04:00
|
|
|
snprintf(path, PATH_MAX, "%sfiles", pkgpath);
|
2007-01-24 03:51:50 -05:00
|
|
|
if((fp = fopen(path, "r")) == NULL) {
|
2007-08-23 22:26:55 -04:00
|
|
|
_alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno));
|
2006-03-02 14:06:52 -05:00
|
|
|
goto error;
|
|
|
|
}
|
2010-10-30 01:35:43 -04:00
|
|
|
while(fgets(line, sizeof(line), fp)) {
|
2006-03-02 14:06:52 -05:00
|
|
|
_alpm_strtrim(line);
|
2010-10-30 01:35:43 -04:00
|
|
|
if(strcmp(line, "%FILES%") == 0) {
|
2010-07-07 18:12:42 -04:00
|
|
|
while(fgets(line, sizeof(line), fp) && strlen(_alpm_strtrim(line))) {
|
2008-01-11 01:01:58 -05:00
|
|
|
char *linedup;
|
2011-02-04 22:48:54 -05:00
|
|
|
STRDUP(linedup, line, goto error);
|
2010-10-30 01:35:43 -04:00
|
|
|
info->files = alpm_list_add(info->files, linedup);
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
2010-10-30 01:35:43 -04:00
|
|
|
} else if(strcmp(line, "%BACKUP%") == 0) {
|
2010-07-07 18:12:42 -04:00
|
|
|
while(fgets(line, sizeof(line), fp) && strlen(_alpm_strtrim(line))) {
|
2008-01-11 01:01:58 -05:00
|
|
|
char *linedup;
|
2011-02-04 22:48:54 -05:00
|
|
|
STRDUP(linedup, line, goto error);
|
2010-10-30 01:35:43 -04:00
|
|
|
info->backup = alpm_list_add(info->backup, linedup);
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
2007-02-28 11:37:24 -05:00
|
|
|
}
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
|
|
|
fclose(fp);
|
|
|
|
fp = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* INSTALL */
|
Fix double filelist issue when upgrading a package
Due to the way we funk around with package data loading, we had a condition
where the filelist got doubled up because it was loaded twice.
Packages are originally loaded with INFRQ_BASE. In an upgrade/sync, the
package is checked for file conflicts next, leaving us in an "INFRQ_BASE |
INFRQ_FILES" state. Later, when committing a single package, we have an
explicit call to _alpm_local_db_read() with INFRQ_ALL as the level. Because
the package's level did not match this, we skipped over our previous "does
the incoming level match where I'm at" shortcut, and continued to load
things again, because of a lack of fine-grained checking for each of DESC,
FILES, and INSTALL.
The end result is we loaded the filelist twice, causing our remove logic to
iterate twice over the installed files, spewing a bunch of "cannot find file
X" messages.
Fix the problem by doing a bit more bitmasking logic throughout the load
method, and also fix the sanity check at the beginning of the function- this
should *only* be used for local packages as opposed to the "not a package"
check that was there before.
A debug log message was added to upgraderemove as well to match the one
already in the normal remove codepath.
Signed-off-by: Dan McGee <dan@archlinux.org>
2011-01-11 19:46:10 -05:00
|
|
|
if(inforeq & INFRQ_SCRIPTLET && !(info->infolevel & INFRQ_SCRIPTLET)) {
|
2008-05-30 02:52:27 -04:00
|
|
|
snprintf(path, PATH_MAX, "%sinstall", pkgpath);
|
2008-06-15 20:15:36 -04:00
|
|
|
if(access(path, F_OK) == 0) {
|
2006-03-02 14:06:52 -05:00
|
|
|
info->scriptlet = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* internal */
|
|
|
|
info->infolevel |= inforeq;
|
|
|
|
|
2008-05-30 02:52:27 -04:00
|
|
|
free(pkgpath);
|
2011-03-20 20:45:57 -04:00
|
|
|
return 0;
|
2006-03-02 14:06:52 -05:00
|
|
|
|
|
|
|
error:
|
2008-05-30 02:52:27 -04:00
|
|
|
free(pkgpath);
|
2006-03-02 14:06:52 -05:00
|
|
|
if(fp) {
|
|
|
|
fclose(fp);
|
|
|
|
}
|
2011-03-20 20:45:57 -04:00
|
|
|
return -1;
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
|
|
|
|
2010-10-13 04:04:07 -04:00
|
|
|
int _alpm_local_db_prepare(pmdb_t *db, pmpkg_t *info)
|
2009-01-02 04:12:22 -05:00
|
|
|
{
|
|
|
|
mode_t oldmask;
|
|
|
|
int retval = 0;
|
|
|
|
char *pkgpath = NULL;
|
|
|
|
|
2009-01-19 16:54:00 -05:00
|
|
|
if(checkdbdir(db) != 0) {
|
2011-03-20 20:45:57 -04:00
|
|
|
return -1;
|
2009-01-19 16:54:00 -05:00
|
|
|
}
|
2009-01-02 04:12:22 -05:00
|
|
|
|
2009-01-19 16:54:00 -05:00
|
|
|
oldmask = umask(0000);
|
2009-01-02 04:12:22 -05:00
|
|
|
pkgpath = get_pkgpath(db, info);
|
|
|
|
|
|
|
|
if((retval = mkdir(pkgpath, 0755)) != 0) {
|
2009-01-19 16:54:00 -05:00
|
|
|
_alpm_log(PM_LOG_ERROR, _("could not create directory %s: %s\n"),
|
|
|
|
pkgpath, strerror(errno));
|
2009-01-02 04:12:22 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
free(pkgpath);
|
|
|
|
umask(oldmask);
|
|
|
|
|
2011-03-20 20:45:57 -04:00
|
|
|
return retval;
|
2009-01-02 04:12:22 -05:00
|
|
|
}
|
|
|
|
|
2010-10-13 04:04:07 -04:00
|
|
|
int _alpm_local_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
|
2006-03-02 14:06:52 -05:00
|
|
|
{
|
|
|
|
FILE *fp = NULL;
|
|
|
|
char path[PATH_MAX];
|
|
|
|
mode_t oldmask;
|
2007-01-19 04:28:44 -05:00
|
|
|
alpm_list_t *lp = NULL;
|
2006-03-02 14:06:52 -05:00
|
|
|
int retval = 0;
|
2008-05-30 02:52:27 -04:00
|
|
|
char *pkgpath = NULL;
|
2006-03-02 14:06:52 -05:00
|
|
|
|
2007-01-30 03:14:10 -05:00
|
|
|
ALPM_LOG_FUNC;
|
|
|
|
|
2006-03-02 14:06:52 -05:00
|
|
|
if(db == NULL || info == NULL) {
|
2011-03-20 20:45:57 -04:00
|
|
|
return -1;
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
|
|
|
|
2008-05-30 02:52:27 -04:00
|
|
|
pkgpath = get_pkgpath(db, info);
|
|
|
|
|
2006-03-02 14:06:52 -05:00
|
|
|
/* make sure we have a sane umask */
|
2009-01-02 04:12:22 -05:00
|
|
|
oldmask = umask(0022);
|
2006-03-02 14:06:52 -05:00
|
|
|
|
2010-10-13 07:18:03 -04:00
|
|
|
if(strcmp(db->treename, "local") != 0) {
|
2011-03-20 20:45:57 -04:00
|
|
|
return -1;
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
2007-02-12 20:46:33 -05:00
|
|
|
|
2006-03-02 14:06:52 -05:00
|
|
|
/* DESC */
|
|
|
|
if(inforeq & INFRQ_DESC) {
|
2007-08-23 22:26:55 -04:00
|
|
|
_alpm_log(PM_LOG_DEBUG, "writing %s-%s DESC information back to db\n",
|
2007-07-10 14:24:58 -04:00
|
|
|
info->name, info->version);
|
2008-05-30 02:52:27 -04:00
|
|
|
snprintf(path, PATH_MAX, "%sdesc", pkgpath);
|
2006-03-02 14:06:52 -05:00
|
|
|
if((fp = fopen(path, "w")) == NULL) {
|
2007-08-23 22:26:55 -04:00
|
|
|
_alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno));
|
2007-01-24 03:51:50 -05:00
|
|
|
retval = -1;
|
2006-03-02 14:06:52 -05:00
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
fprintf(fp, "%%NAME%%\n%s\n\n"
|
2007-02-12 20:46:33 -05:00
|
|
|
"%%VERSION%%\n%s\n\n", info->name, info->version);
|
2008-01-11 01:01:58 -05:00
|
|
|
if(info->desc) {
|
2007-02-12 20:46:33 -05:00
|
|
|
fprintf(fp, "%%DESC%%\n"
|
|
|
|
"%s\n\n", info->desc);
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
|
|
|
if(info->groups) {
|
|
|
|
fputs("%GROUPS%\n", fp);
|
|
|
|
for(lp = info->groups; lp; lp = lp->next) {
|
|
|
|
fprintf(fp, "%s\n", (char *)lp->data);
|
|
|
|
}
|
|
|
|
fprintf(fp, "\n");
|
|
|
|
}
|
2008-05-22 17:59:10 -04:00
|
|
|
if(info->replaces) {
|
|
|
|
fputs("%REPLACES%\n", fp);
|
|
|
|
for(lp = info->replaces; lp; lp = lp->next) {
|
|
|
|
fprintf(fp, "%s\n", (char *)lp->data);
|
|
|
|
}
|
|
|
|
fprintf(fp, "\n");
|
|
|
|
}
|
2010-10-13 07:18:03 -04:00
|
|
|
if(info->url) {
|
|
|
|
fprintf(fp, "%%URL%%\n"
|
|
|
|
"%s\n\n", info->url);
|
|
|
|
}
|
|
|
|
if(info->licenses) {
|
|
|
|
fputs("%LICENSE%\n", fp);
|
|
|
|
for(lp = info->licenses; lp; lp = lp->next) {
|
|
|
|
fprintf(fp, "%s\n", (char *)lp->data);
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
2010-10-13 07:18:03 -04:00
|
|
|
fprintf(fp, "\n");
|
|
|
|
}
|
|
|
|
if(info->arch) {
|
|
|
|
fprintf(fp, "%%ARCH%%\n"
|
|
|
|
"%s\n\n", info->arch);
|
|
|
|
}
|
|
|
|
if(info->builddate) {
|
|
|
|
fprintf(fp, "%%BUILDDATE%%\n"
|
|
|
|
"%ld\n\n", info->builddate);
|
|
|
|
}
|
|
|
|
if(info->installdate) {
|
|
|
|
fprintf(fp, "%%INSTALLDATE%%\n"
|
|
|
|
"%ld\n\n", info->installdate);
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
2010-10-13 07:18:03 -04:00
|
|
|
if(info->packager) {
|
|
|
|
fprintf(fp, "%%PACKAGER%%\n"
|
|
|
|
"%s\n\n", info->packager);
|
|
|
|
}
|
|
|
|
if(info->isize) {
|
|
|
|
/* only write installed size, csize is irrelevant once installed */
|
|
|
|
fprintf(fp, "%%SIZE%%\n"
|
|
|
|
"%jd\n\n", (intmax_t)info->isize);
|
|
|
|
}
|
|
|
|
if(info->reason) {
|
|
|
|
fprintf(fp, "%%REASON%%\n"
|
|
|
|
"%u\n\n", info->reason);
|
|
|
|
}
|
2006-03-02 14:06:52 -05:00
|
|
|
if(info->depends) {
|
|
|
|
fputs("%DEPENDS%\n", fp);
|
|
|
|
for(lp = info->depends; lp; lp = lp->next) {
|
2008-08-26 06:57:08 -04:00
|
|
|
char *depstring = alpm_dep_compute_string(lp->data);
|
2007-11-13 00:01:14 -05:00
|
|
|
fprintf(fp, "%s\n", depstring);
|
|
|
|
free(depstring);
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
|
|
|
fprintf(fp, "\n");
|
|
|
|
}
|
2007-09-26 00:02:30 -04:00
|
|
|
if(info->optdepends) {
|
|
|
|
fputs("%OPTDEPENDS%\n", fp);
|
|
|
|
for(lp = info->optdepends; lp; lp = lp->next) {
|
|
|
|
fprintf(fp, "%s\n", (char *)lp->data);
|
|
|
|
}
|
|
|
|
fprintf(fp, "\n");
|
|
|
|
}
|
2006-03-02 14:06:52 -05:00
|
|
|
if(info->conflicts) {
|
|
|
|
fputs("%CONFLICTS%\n", fp);
|
|
|
|
for(lp = info->conflicts; lp; lp = lp->next) {
|
|
|
|
fprintf(fp, "%s\n", (char *)lp->data);
|
|
|
|
}
|
|
|
|
fprintf(fp, "\n");
|
|
|
|
}
|
|
|
|
if(info->provides) {
|
|
|
|
fputs("%PROVIDES%\n", fp);
|
|
|
|
for(lp = info->provides; lp; lp = lp->next) {
|
|
|
|
fprintf(fp, "%s\n", (char *)lp->data);
|
|
|
|
}
|
|
|
|
fprintf(fp, "\n");
|
|
|
|
}
|
2010-10-30 01:35:43 -04:00
|
|
|
|
|
|
|
fclose(fp);
|
|
|
|
fp = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* FILES */
|
|
|
|
if(inforeq & INFRQ_FILES) {
|
|
|
|
_alpm_log(PM_LOG_DEBUG, "writing %s-%s FILES information back to db\n",
|
|
|
|
info->name, info->version);
|
|
|
|
snprintf(path, PATH_MAX, "%sfiles", pkgpath);
|
|
|
|
if((fp = fopen(path, "w")) == NULL) {
|
|
|
|
_alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno));
|
|
|
|
retval = -1;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
if(info->files) {
|
|
|
|
fprintf(fp, "%%FILES%%\n");
|
|
|
|
for(lp = info->files; lp; lp = lp->next) {
|
|
|
|
fprintf(fp, "%s\n", (char *)lp->data);
|
|
|
|
}
|
|
|
|
fprintf(fp, "\n");
|
|
|
|
}
|
|
|
|
if(info->backup) {
|
|
|
|
fprintf(fp, "%%BACKUP%%\n");
|
|
|
|
for(lp = info->backup; lp; lp = lp->next) {
|
|
|
|
fprintf(fp, "%s\n", (char *)lp->data);
|
|
|
|
}
|
|
|
|
fprintf(fp, "\n");
|
|
|
|
}
|
2006-03-02 14:06:52 -05:00
|
|
|
fclose(fp);
|
|
|
|
fp = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* INSTALL */
|
2006-10-15 15:31:03 -04:00
|
|
|
/* nothing needed here (script is automatically extracted) */
|
2006-03-02 14:06:52 -05:00
|
|
|
|
|
|
|
cleanup:
|
|
|
|
umask(oldmask);
|
2008-05-30 02:52:27 -04:00
|
|
|
free(pkgpath);
|
2006-03-02 14:06:52 -05:00
|
|
|
|
|
|
|
if(fp) {
|
|
|
|
fclose(fp);
|
|
|
|
}
|
|
|
|
|
2011-03-20 20:45:57 -04:00
|
|
|
return retval;
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
|
|
|
|
2010-10-13 04:04:07 -04:00
|
|
|
int _alpm_local_db_remove(pmdb_t *db, pmpkg_t *info)
|
2006-03-02 14:06:52 -05:00
|
|
|
{
|
2008-05-30 02:52:27 -04:00
|
|
|
int ret = 0;
|
|
|
|
char *pkgpath = NULL;
|
2006-03-02 14:06:52 -05:00
|
|
|
|
2007-01-30 03:14:10 -05:00
|
|
|
ALPM_LOG_FUNC;
|
|
|
|
|
2006-03-02 14:06:52 -05:00
|
|
|
if(db == NULL || info == NULL) {
|
2006-10-25 14:15:25 -04:00
|
|
|
RET_ERR(PM_ERR_DB_NULL, -1);
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
|
|
|
|
2008-05-30 02:52:27 -04:00
|
|
|
pkgpath = get_pkgpath(db, info);
|
2006-03-02 14:06:52 -05:00
|
|
|
|
2008-05-30 02:52:27 -04:00
|
|
|
ret = _alpm_rmrf(pkgpath);
|
|
|
|
free(pkgpath);
|
|
|
|
if(ret != 0) {
|
|
|
|
ret = -1;
|
|
|
|
}
|
2011-03-20 20:45:57 -04:00
|
|
|
return ret;
|
2006-03-02 14:06:52 -05:00
|
|
|
}
|
|
|
|
|
2011-02-28 11:46:00 -05:00
|
|
|
static int local_db_version(pmdb_t *db)
|
|
|
|
{
|
|
|
|
struct dirent *ent = NULL;
|
|
|
|
const char *dbpath;
|
|
|
|
DIR *dbdir;
|
|
|
|
int version;
|
|
|
|
|
|
|
|
dbpath = _alpm_db_path(db);
|
|
|
|
if(dbpath == NULL) {
|
|
|
|
RET_ERR(PM_ERR_DB_OPEN, -1);
|
|
|
|
}
|
|
|
|
dbdir = opendir(dbpath);
|
|
|
|
if(dbdir == NULL) {
|
|
|
|
if(errno == ENOENT) {
|
|
|
|
/* database dir doesn't exist yet */
|
|
|
|
version = 2;
|
|
|
|
goto done;
|
|
|
|
} else {
|
|
|
|
RET_ERR(PM_ERR_DB_OPEN, -1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
while((ent = readdir(dbdir)) != NULL) {
|
|
|
|
const char *name = ent->d_name;
|
|
|
|
char path[PATH_MAX];
|
|
|
|
|
|
|
|
if(strcmp(name, ".") == 0 || strcmp(name, "..") == 0) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if(!is_dir(dbpath, ent)) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
snprintf(path, PATH_MAX, "%s%s/depends", dbpath, name);
|
|
|
|
if(access(path, F_OK) == 0) {
|
|
|
|
/* we found a depends file- bail */
|
|
|
|
version = 1;
|
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* we found no depends file after full scan */
|
|
|
|
version = 2;
|
|
|
|
|
|
|
|
done:
|
|
|
|
if(dbdir) {
|
|
|
|
closedir(dbdir);
|
|
|
|
}
|
|
|
|
|
|
|
|
_alpm_log(PM_LOG_DEBUG, "local database version %d\n", version);
|
2011-03-20 20:45:57 -04:00
|
|
|
return version;
|
2011-02-28 11:46:00 -05:00
|
|
|
}
|
|
|
|
|
2010-10-09 06:16:15 -04:00
|
|
|
struct db_operations local_db_ops = {
|
2010-12-13 21:19:32 -05:00
|
|
|
.populate = local_db_populate,
|
2010-10-09 06:16:15 -04:00
|
|
|
.unregister = _alpm_db_unregister,
|
2011-02-28 11:46:00 -05:00
|
|
|
.version = local_db_version,
|
2010-10-09 06:16:15 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
pmdb_t *_alpm_db_register_local(void)
|
|
|
|
{
|
|
|
|
pmdb_t *db;
|
|
|
|
|
|
|
|
ALPM_LOG_FUNC;
|
|
|
|
|
|
|
|
_alpm_log(PM_LOG_DEBUG, "registering local database\n");
|
|
|
|
|
|
|
|
db = _alpm_db_new("local", 1);
|
|
|
|
if(db == NULL) {
|
|
|
|
RET_ERR(PM_ERR_DB_CREATE, NULL);
|
|
|
|
}
|
2011-03-20 20:56:55 -04:00
|
|
|
db->ops = &local_db_ops;
|
2010-10-09 06:16:15 -04:00
|
|
|
|
|
|
|
handle->db_local = db;
|
2011-03-20 20:45:57 -04:00
|
|
|
return db;
|
2010-10-09 06:16:15 -04:00
|
|
|
}
|
|
|
|
|
2006-03-02 14:06:52 -05:00
|
|
|
/* vim: set ts=2 sw=2 noet: */
|