glom r1791 - in trunk: . glom



Author: murrayc
Date: Tue Dec  9 18:15:23 2008
New Revision: 1791
URL: http://svn.gnome.org/viewvc/glom?rev=1791&view=rev

Log:
2008-12-09  Murray Cumming  <murrayc murrayc com>

* glom/dialog_import_csv.[h|cc]:
validate_primary_key(): Avoid a null pointer dereference (crash) if 
there is no primary key, though that should never happen now.
handle_line(), import(): Use a sorted tree model so the fields list is 
alphabetically sorted.
Ubuntu bug #https://bugs.launchpad.net/ubuntu/+source/glom/+bug/306593
(elmergato)

Modified:
   trunk/ChangeLog
   trunk/glom/dialog_import_csv.cc
   trunk/glom/dialog_import_csv.h

Modified: trunk/glom/dialog_import_csv.cc
==============================================================================
--- trunk/glom/dialog_import_csv.cc	(original)
+++ trunk/glom/dialog_import_csv.cc	Tue Dec  9 18:15:23 2008
@@ -321,7 +321,7 @@
     Gtk::TreeModel::iterator tree_iter = m_field_model->append();
     (*tree_iter)[m_field_columns.m_col_field_name] = _("<None>");
 
-    Document_Glom::type_vecFields fields(document->get_table_fields(into_table));
+    const Document_Glom::type_vecFields fields(document->get_table_fields(into_table));
     for(Document_Glom::type_vecFields::const_iterator iter = fields.begin(); iter != fields.end(); ++ iter)
     {
       sharedptr<Field> field = *iter;
@@ -339,6 +339,12 @@
       }
     }
 
+    // Create the sorted version of this model, 
+    // so the user sees the fields in alphabetical order:
+    m_field_model_sorted = Gtk::TreeModelSort::create(m_field_model);
+    m_field_model_sorted->set_sort_column(m_field_columns.m_col_field_name, Gtk::SORT_ASCENDING);
+
+
     m_file = Gio::File::create_for_uri(uri);
     m_file->read_async(sigc::mem_fun(*this, &Dialog_Import_CSV::on_file_read));
 
@@ -383,6 +389,7 @@
   m_sample_view->remove_all_columns();
   m_sample_view->set_model(m_sample_model);
   m_field_model.reset();
+  m_field_model_sorted.reset();
   m_rows.clear();
   m_fields.clear();
   m_file.reset();
@@ -831,7 +838,7 @@
       col->pack_start(*cell, true);
       col->set_cell_data_func(*cell, sigc::bind(sigc::mem_fun(*this, &Dialog_Import_CSV::field_data_func), i));
       col->set_sizing(Gtk::TREE_VIEW_COLUMN_AUTOSIZE);
-      cell->property_model() = m_field_model;
+      cell->property_model() = m_field_model_sorted;
       cell->property_text_column() = 0;
       cell->property_has_entry() = false;
       cell->signal_edited().connect(sigc::bind(sigc::mem_fun(*this, &Dialog_Import_CSV::on_field_edited), i));
@@ -874,7 +881,7 @@
 
 void Dialog_Import_CSV::field_data_func(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter, guint column_number)
 {
-  int row = (*iter)[m_sample_columns.m_col_row];
+  const int row = (*iter)[m_sample_columns.m_col_row];
   Gtk::CellRendererCombo* renderer_combo = dynamic_cast<Gtk::CellRendererCombo*>(renderer);
   if(!renderer_combo) throw std::logic_error("CellRenderer is not a CellRendererCombo in field_data_func");
 
@@ -905,8 +912,10 @@
         /* Exported data is always stored in postgres format */
         Gnome::Gda::Value value = field->from_sql(orig_text, Field::SQL_FORMAT_POSTGRES, success);
         
-        if(!success) text = _("<Import Failure>");
-        else text = Glom::Conversions::get_text_for_gda_value(field->get_glom_type(), value);
+        if(!success)
+          text = _("<Import Failure>");
+        else
+          text = Glom::Conversions::get_text_for_gda_value(field->get_glom_type(), value);
       }
       else
       {
@@ -947,7 +956,7 @@
     {
       sharedptr<Field> field = (*field_iter)[m_field_columns.m_col_field];
       // Check whether another column is already using that field
-      std::vector<sharedptr<Field> >::iterator vec_field_iter = std::find(m_fields.begin(), m_fields.end(), field);
+      type_vec_fields::iterator vec_field_iter = std::find(m_fields.begin(), m_fields.end(), field);
       // Reset the old column since two different columns cannot be imported into the same field
       if(vec_field_iter != m_fields.end()) *vec_field_iter = sharedptr<Field>();
 
@@ -995,7 +1004,7 @@
     sharedptr<Field> primary_key = get_field_primary_key_for_table(get_target_table_name());
     bool primary_key_selected = false;
 
-    if(!primary_key->get_auto_increment())
+    if(primary_key && !primary_key->get_auto_increment())
     {
       // If m_rows is empty, then no single line was read from the file yet,
       // and the m_fields array is not up to date. It is set in handle_line()
@@ -1003,7 +1012,7 @@
       primary_key_selected = false;
       if(!m_rows.empty())
       {
-        for(std::vector<sharedptr<Field> >::iterator iter = m_fields.begin(); iter != m_fields.end(); ++ iter)
+        for(type_vec_fields::iterator iter = m_fields.begin(); iter != m_fields.end(); ++ iter)
         {
           if(*iter == primary_key)
           {

Modified: trunk/glom/dialog_import_csv.h
==============================================================================
--- trunk/glom/dialog_import_csv.h	(original)
+++ trunk/glom/dialog_import_csv.h	Tue Dec  9 18:15:23 2008
@@ -127,6 +127,7 @@
 
   FieldColumns m_field_columns;
   Glib::RefPtr<Gtk::ListStore> m_field_model;
+  Glib::RefPtr<Gtk::TreeModelSort> m_field_model_sorted;
 
   SampleColumns m_sample_columns;
   Glib::RefPtr<Gtk::ListStore> m_sample_model;
@@ -176,8 +177,10 @@
 
   // Parsed data:
   std::vector<std::vector<Glib::ustring> > m_rows;
+
   // The fields into which to import the data:
-  std::vector<sharedptr<Field> > m_fields;
+  typedef std::vector< sharedptr<Field> > type_vec_fields;
+  type_vec_fields m_fields;
 
   SignalStateChanged m_signal_state_changed;
 };



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]