#define _POSIX_C_SOURCE 200809L #include #include #include #include #include "zpm.h" #include "sqlite3.h" #define DMARK fprintf(stderr, "mark %s %s:%d\n", __FILE__, __func__, __LINE__) /* * flags 0 = find installed * flags 1 = skip installed * flags 2 = skip not installed */ struct zpm_package *zpm_package_alloc(struct zpm *zpm) { struct zpm_package *pkg; pkg = malloc(sizeof *pkg); if (pkg) { pkg->zpm = zpm; pkg->release = 0; } return pkg; } void zpm_sqlite_error(struct zpm *zpm) { zpm->error = 1; if (zpm->errmsg) free(zpm->errmsg); zpm->errmsg = strdup((const char *)sqlite3_errmsg(zpm->db)); } char *zpm_findpkg(struct zpm *zpm, char *pkgstr, char *where) { char *select = "select pkgid, package, version, release from packages_pkgid"; char *group = "group by package having max( version||'-'||release collate vercmp) order by length(package), package, version||'-'||release collate vercmp"; // char *order = "order by package, version collate vercmp, cast(release as integer)"; sqlite3_str *sql; char *query, *pkgid = 0; /* null pkgstr find "best" package * best is shortest complete package if any are complete * shortest incomplete if any are incomplete * where more than one version is in those sets, best is * latest as determined by vercmp */ sql = sqlite3_str_new(zpm->db); sqlite3_str_appendall(sql, select); sqlite3_str_appendall(sql, " where true"); if (pkgstr) { int release; char version[32]; char package[32]; zpm_parse_package(pkgstr, package, version, &release); if (*package != 0) { sqlite3_str_appendf(sql, " and package = %Q", package); } if (*version != 0) { sqlite3_str_appendf(sql, " and version = %Q", version); } if (release != 0) { sqlite3_str_appendf(sql, " and release = %d", release); } } if (where) { sqlite3_str_appendall(sql, " and "); sqlite3_str_appendall(sql, where); } sqlite3_str_appendall(sql, " "); sqlite3_str_appendall(sql, group); sqlite3_str_appendall(sql, " limit 1;"); if (sqlite3_str_errcode(sql)) { zpm->error = 1; sqlite3_free(sqlite3_str_finish(sql)); return 0; } query = sqlite3_str_finish(sql); pkgid = zpm_db_string(zpm, query);; sqlite3_free(query); return pkgid; }