public static async Task <Taxon[]> GetSubtaxaAsync(Taxon taxon) { List <Taxon> result = new List <Taxon>(); string table_name = Taxon.TypeToDatabaseTableName(taxon.GetChildRank()); string parent_column_name = Taxon.TypeToDatabaseColumnName(taxon.type); if (string.IsNullOrEmpty(table_name)) { return(result.ToArray()); } string query = "SELECT * FROM {0} WHERE {1} = $parent_id"; using (SQLiteCommand cmd = new SQLiteCommand(string.Format(query, table_name, parent_column_name))) { cmd.Parameters.AddWithValue("$parent_id", taxon.id); using (DataTable rows = await Database.GetRowsAsync(cmd)) foreach (DataRow row in rows.Rows) { result.Add(Taxon.FromDataRow(row, taxon.GetChildRank())); } } // Sort taxa alphabetically by name. result.Sort((lhs, rhs) => lhs.name.CompareTo(rhs.name)); return(result.ToArray()); }
public static async Task DeleteTaxonAsync(Taxon taxon) { string table_name = _getRankTableName(taxon.type); string subtaxa_table_name = _getRankTableName(taxon.GetChildRank()); string subtaxa_column_name = _getRankColumnName(taxon.type); // Set to NULL any references subtaxa have to this taxon. // Note that this can also happen automatically if the foreign key is set up correctly when creating the database. if (!string.IsNullOrEmpty(table_name) && !string.IsNullOrEmpty(subtaxa_column_name)) { using (SQLiteCommand cmd = new SQLiteCommand(string.Format("UPDATE {0} SET {1} = NULL WHERE {1} = $id", subtaxa_table_name, subtaxa_column_name))) { cmd.Parameters.AddWithValue("$id", taxon.id); await Database.ExecuteNonQuery(cmd); } } // Delete the taxon. if (!string.IsNullOrEmpty(table_name)) { using (SQLiteCommand cmd = new SQLiteCommand(string.Format("DELETE FROM {0} WHERE id = $id", table_name))) { cmd.Parameters.AddWithValue("$id", taxon.id); await Database.ExecuteNonQuery(cmd); } } }