X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fdataset.c;h=c426cddb3c5662846865828d41650665481f6647;hb=ad7ae8bb105c925b951e241fd6a3d1cb93d614a0;hp=26c3a49244783f4ff84a734d8c024d8470a2b6d0;hpb=fe8dc2171009e90d2335f159d05f7e6660e24780;p=pspp diff --git a/src/data/dataset.c b/src/data/dataset.c index 26c3a49244..c426cddb3c 100644 --- a/src/data/dataset.c +++ b/src/data/dataset.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010, 2011, 2013 Free Software Foundation, Inc. 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 @@ -199,7 +199,7 @@ dataset_destroy (struct dataset *ds) { dataset_set_session (ds, NULL); dataset_clear (ds); - dict_destroy (ds->dict); + dict_unref (ds->dict); caseinit_destroy (ds->caseinit); trns_chain_destroy (ds->permanent_trns_chain); dataset_transformations_changed__ (ds, false); @@ -292,7 +292,7 @@ dataset_set_dict (struct dataset *ds, struct dictionary *dict) dataset_clear (ds); - dict_destroy (ds->dict); + dict_unref (ds->dict); ds->dict = dict; dict_set_change_callback (ds->dict, dict_callback, ds); } @@ -746,9 +746,13 @@ proc_start_temporary_transformations (struct dataset *ds) } } -/* Converts all the temporary transformations, if any, to - permanent transformations. Further transformations will be - permanent. +/* Converts all the temporary transformations, if any, to permanent + transformations. Further transformations will be permanent. + + The FILTER command is implemented as a temporary transformation, so a + procedure that uses this function should usually use proc_open_filtering() + with FILTER false, instead of plain proc_open(). + Returns true if anything changed, false otherwise. */ bool proc_make_temporary_transformations_permanent (struct dataset *ds) @@ -759,7 +763,9 @@ proc_make_temporary_transformations_permanent (struct dataset *ds) trns_chain_splice (ds->permanent_trns_chain, ds->temporary_trns_chain); ds->temporary_trns_chain = NULL; - dict_destroy (ds->permanent_dict); + ds->cur_trns_chain = ds->permanent_trns_chain; + + dict_unref (ds->permanent_dict); ds->permanent_dict = NULL; return true; @@ -776,7 +782,7 @@ proc_cancel_temporary_transformations (struct dataset *ds) { if (proc_in_temporary_transformations (ds)) { - dict_destroy (ds->dict); + dict_unref (ds->dict); ds->dict = ds->permanent_dict; ds->permanent_dict = NULL; @@ -805,6 +811,39 @@ proc_cancel_all_transformations (struct dataset *ds) return ok; } + +static int +store_case_num (void *var_, struct ccase **cc, casenumber case_num) +{ + struct variable *var = var_; + + *cc = case_unshare (*cc); + case_data_rw (*cc, var)->f = case_num; + + return TRNS_CONTINUE; +} + +/* Add a variable which we can sort by to get back the original order. */ +struct variable * +add_permanent_ordering_transformation (struct dataset *ds) +{ + struct variable *temp_var; + + temp_var = dict_create_var_assert (ds->dict, "$ORDER", 0); + if (proc_in_temporary_transformations (ds)) + { + struct variable *perm_var; + + perm_var = dict_clone_var_in_place_assert (ds->permanent_dict, temp_var); + trns_chain_append (ds->permanent_trns_chain, NULL, store_case_num, + NULL, perm_var); + trns_chain_finalize (ds->permanent_trns_chain); + } + else + add_transformation (ds, store_case_num, NULL, temp_var); + + return temp_var; +} /* Causes output from the next procedure to be discarded, instead of being preserved for use as input for the next procedure. */