1.1 --- a/librazor/razor.c Tue Jul 01 09:44:46 2008 -0400
1.2 +++ b/librazor/razor.c Tue Jul 08 22:57:34 2008 -0400
1.3 @@ -739,60 +739,96 @@
1.4 razor_package_iterator_destroy(pi2);
1.5 }
1.6
1.7 +struct install_action {
1.8 + enum razor_install_action action;
1.9 + struct razor_package *package;
1.10 +};
1.11 +
1.12 +struct razor_install_iterator {
1.13 + struct razor_set *set;
1.14 + struct razor_set *next;
1.15 + struct array actions;
1.16 + struct install_action *a, *end;
1.17 +};
1.18 +
1.19 static void
1.20 -add_new_package(enum razor_diff_action action,
1.21 - struct razor_package *package,
1.22 - const char *name,
1.23 - const char *version,
1.24 - const char *arch,
1.25 - void *data)
1.26 +add_action(enum razor_diff_action action,
1.27 + struct razor_package *package,
1.28 + const char *name,
1.29 + const char *version,
1.30 + const char *arch,
1.31 + void *data)
1.32 {
1.33 - if (action == RAZOR_DIFF_ACTION_ADD)
1.34 - razor_package_query_add_package(data, package);
1.35 + struct razor_install_iterator *ii = data;
1.36 + struct install_action *a;
1.37 +
1.38 + a = array_add(&ii->actions, sizeof *a);
1.39 + a->package = package;
1.40 +
1.41 + switch (action) {
1.42 + case RAZOR_DIFF_ACTION_ADD:
1.43 + a->action = RAZOR_INSTALL_ACTION_ADD;
1.44 + break;
1.45 + case RAZOR_DIFF_ACTION_REMOVE:
1.46 + a->action = RAZOR_INSTALL_ACTION_REMOVE;
1.47 + break;
1.48 + }
1.49 }
1.50
1.51 -RAZOR_EXPORT struct razor_package_iterator *
1.52 -razor_set_create_remove_iterator(struct razor_set *set,
1.53 - struct razor_set *next)
1.54 +RAZOR_EXPORT struct razor_install_iterator *
1.55 +razor_set_create_install_iterator(struct razor_set *set,
1.56 + struct razor_set *next)
1.57 {
1.58 - struct razor_package_query *query;
1.59 - struct razor_package_iterator *pi;
1.60 + struct razor_install_iterator *ii;
1.61
1.62 assert (set != NULL);
1.63 assert (next != NULL);
1.64
1.65 - query = razor_package_query_create(set);
1.66 - razor_set_diff(next, set, add_new_package, query);
1.67 + ii = zalloc(sizeof *ii);
1.68 + ii->set = set;
1.69 + ii->next = next;
1.70 +
1.71 + razor_set_diff(set, next, add_action, ii);
1.72
1.73 - pi = razor_package_query_finish(query);
1.74 + ii->a = ii->actions.data;
1.75 + ii->end = ii->actions.data + ii->actions.size;
1.76
1.77 /* FIXME: We need to figure out the right install order here,
1.78 * so the post and pre scripts can run. */
1.79
1.80 - /* sort */
1.81 -
1.82 - return pi;
1.83 + return ii;
1.84 }
1.85
1.86 -RAZOR_EXPORT struct razor_package_iterator *
1.87 -razor_set_create_install_iterator(struct razor_set *set,
1.88 - struct razor_set *next)
1.89 +RAZOR_EXPORT int
1.90 +razor_install_iterator_next(struct razor_install_iterator *ii,
1.91 + struct razor_set **set,
1.92 + struct razor_package **package,
1.93 + enum razor_install_action *action,
1.94 + int *count)
1.95 {
1.96 - struct razor_package_query *query;
1.97 - struct razor_package_iterator *pi;
1.98 + if (ii->a == ii->end)
1.99 + return 0;
1.100
1.101 - assert (set != NULL);
1.102 - assert (next != NULL);
1.103 + switch (ii->a->action) {
1.104 + case RAZOR_INSTALL_ACTION_ADD:
1.105 + *set = ii->next;
1.106 + break;
1.107 + case RAZOR_INSTALL_ACTION_REMOVE:
1.108 + *set = ii->set;
1.109 + break;
1.110 + }
1.111
1.112 - query = razor_package_query_create(next);
1.113 - razor_set_diff(set, next, add_new_package, query);
1.114 + *package = ii->a->package;
1.115 + *action = ii->a->action;
1.116 + *count = 0;
1.117 + ii->a++;
1.118
1.119 - pi = razor_package_query_finish(query);
1.120 + return 1;
1.121 +}
1.122
1.123 - /* FIXME: We need to figure out the right install order here,
1.124 - * so the post and pre scripts can run. */
1.125 -
1.126 - /* sort */
1.127 -
1.128 - return pi;
1.129 +RAZOR_EXPORT void
1.130 +razor_install_iterator_destroy(struct razor_install_iterator *ii)
1.131 +{
1.132 + array_release(&ii->actions);
1.133 + free(ii);
1.134 }