1 /* PSPPIRE - a graphical user interface for PSPP.
2 Copyright (C) 2007, 2009, 2010 Free Software Foundation
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 #include "ui/gui/executor.h"
21 #include "data/lazy-casereader.h"
22 #include "data/procedure.h"
23 #include "language/command.h"
24 #include "language/lexer/lexer.h"
25 #include "libpspp/cast.h"
26 #include "output/driver.h"
27 #include "ui/gui/psppire-data-store.h"
28 #include "ui/gui/psppire-output-window.h"
30 extern struct dataset *the_dataset;
31 extern PsppireDataStore *the_data_store;
33 /* Lazy casereader callback function used by execute_syntax. */
34 static struct casereader *
35 create_casereader_from_data_store (void *data_store_)
37 PsppireDataStore *data_store = data_store_;
38 return psppire_data_store_get_reader (data_store);
42 execute_syntax (struct lex_reader *lex_reader)
45 gboolean retval = TRUE;
47 struct casereader *reader;
48 const struct caseproto *proto;
50 unsigned long int lazy_serial;
52 /* When the user executes a number of snippets of syntax in a
53 row, none of which read from the active file, the GUI becomes
54 progressively less responsive. The reason is that each syntax
55 execution encapsulates the active file data in another
56 datasheet layer. The cumulative effect of having a number of
57 layers of datasheets wastes time and space.
59 To solve the problem, we use a "lazy casereader", a wrapper
60 around the casereader obtained from the data store, that
61 only actually instantiates that casereader when it is
62 needed. If the data store casereader is never needed, then
63 it is reused the next time syntax is run, without wrapping
64 it in another layer. */
65 proto = psppire_data_store_get_proto (the_data_store);
66 case_cnt = psppire_data_store_get_case_count (the_data_store);
67 reader = lazy_casereader_create (proto, case_cnt,
68 create_casereader_from_data_store,
69 the_data_store, &lazy_serial);
70 proc_set_active_file_data (the_dataset, reader);
72 g_return_val_if_fail (proc_has_active_file (the_dataset), FALSE);
74 lexer = lex_create ();
75 psppire_set_lexer (lexer);
76 lex_append (lexer, lex_reader);
80 enum cmd_result result = cmd_parse (lexer, the_dataset);
82 if ( cmd_result_is_failure (result))
85 if ( lex_get_error_mode (lexer) == LEX_ERROR_STOP )
89 if ( result == CMD_EOF || result == CMD_FINISH)
94 psppire_set_lexer (NULL);
96 proc_execute (the_dataset);
98 psppire_dict_replace_dictionary (the_data_store->dict,
99 dataset_dict (the_dataset));
101 reader = proc_extract_active_file_data (the_dataset);
102 if (!lazy_casereader_destroy (reader, lazy_serial))
103 psppire_data_store_set_reader (the_data_store, reader);
110 /* Executes null-terminated string SYNTAX as syntax.
113 execute_syntax_string (gchar *syntax)
115 execute_const_syntax_string (syntax);
119 /* Executes null-terminated string SYNTAX as syntax. */
121 execute_const_syntax_string (const gchar *syntax)
123 execute_syntax (lex_reader_for_string (syntax));