public EntityInfo[] GetEntityDefinitions() { ValidateConnection(); var entities = new List <EntityInfo>(); // PRAGMA table_info(Clienti) // PRAGMA index_list(Clienti) using (var connection = new SQLiteConnection(m_connectionString)) using (var cmd = new SQLiteCommand(GetTablesSQL, connection)) { connection.Open(); using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { var info = new EntityInfo(); info.Entity = new EntityAttribute(); info.Entity.NameInStore = reader.GetString(0); if (string.Compare(info.Entity.NameInStore, "sqlite_sequence", true) == 0) { // this is the auto-increment meta table, skip it continue; } using (var ticmd = new SQLiteCommand(string.Format("PRAGMA table_info({0})", info.Entity.NameInStore), connection)) using (var tireader = ticmd.ExecuteReader()) { while (tireader.Read()) { var cid = tireader["cid"]; var name = tireader["name"]; var type = tireader["type"]; var notnull = tireader["notnull"]; var dflt_value = tireader["dflt_value"]; var pk = tireader["pk"]; var field = new FieldAttribute(); field.FieldName = (string)name; field.AllowsNulls = !Convert.ToBoolean(notnull); field.IsPrimaryKey = Convert.ToBoolean(pk); field.DataType = ((string)type).ParseToDbType(true); // TODO: handle default values // TODO: determine if we have auto-increment info.Fields.Add(field); } } // check for indexes (for sort order) using (var idxcmd = new SQLiteCommand(string.Format("SELECT sql FROM sqlite_master WHERE type = 'index' AND tbl_name = '{0}'", info.Entity.NameInStore), connection)) using (var idxreader = idxcmd.ExecuteReader()) { while (idxreader.Read()) { if (idxreader[0] == DBNull.Value) { // PK or UNIQUE index continue; } var sql = idxreader.GetString(0); var indexInfo = sql.ParseToIndexInfo(); if (indexInfo.IsComposite) { Debug.WriteLine("Composite indexes not currently supported!"); continue; } var indexedField = (from f in info.Fields where string.Compare(f.FieldName, indexInfo.Fields[0], true) == 0 select f).FirstOrDefault(); if (indexedField != null) { indexedField.SearchOrder = indexInfo.SearchOrder; } } } // check for references using (var fkcmd = new SQLiteCommand(String.Format("PRAGMA foreign_key_list({0})", info.Entity.NameInStore), connection)) using (var fkreader = fkcmd.ExecuteReader()) { while (fkreader.Read()) { var reference = new ReferenceInfo(); reference.ReferenceTable = (string)fkreader["table"]; reference.LocalFieldName = (string)fkreader["from"]; reference.RemoteFieldName = (string)fkreader["to"]; info.References.Add(reference); } } entities.Add(info); } } } return(entities.ToArray()); }