Пример #1
0
        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());
        }