예제 #1
0
 public static List<Guid> GetGuidListStatic(string sqlStatement) {
     DBConnect conn = new DBConnect();
     conn.Open();
     List<Guid> list = conn.GetGuidList(sqlStatement);
     conn.Close();
     return list;
 }
예제 #2
0
        protected void SaveTable(XmlWriter xmlWriter,DBConnect dbconnect,string table_name,Guid id,string path = "",int parent_key_number =0 )
        {
            if (path == "") path = table_name;
            if (PathList != null && !PathList.Contains(path)) PathList.Add(path);

            if (RefTreeContains(table_name, id)) return;

            Dictionary<string,Ref> ForwardRefList = new Dictionary<string,Ref>();

            // find forward references
            var foreign_keys = schema.ForeignKey.Where(x => x.Table_str == table_name && x.number != parent_key_number);
            if(foreign_keys.Count() > 0)
            {
                foreach (ForeignKey key in foreign_keys) {
                    if (key.field.DontProcessing) continue;
                    if (key.PrimaryTable.DontProcessing) continue;
                    Guid? id_ = dbconnect.GetGuid("SELECT [" + key.field_str + "] as id FROM [" + key.Table_str + "] where id='"+id.ToString()+"'");
                    if (id_ == null) continue;

                    // is it a forward reference
                    if (!RefTreeContains(key.PrimaryTable_str, (Guid)id_)){
                        ForwardRefList.Add(key.field_str,new Ref() {tablename = key.PrimaryTable_str,guid = (Guid)id_,number = key.number});
                    }
                }
            }

            // generate and execute the sql query
            Dictionary<int, Field> fields = new Dictionary<int, Field>();
            string sql = "SELECT ";
            int index = 0;
            foreach (var fld in schema.GetTableByName(table_name).Fields)
            {
                if (fld.Value.DontProcessing) continue;
                if (ForwardRefList.ContainsKey(fld.Value.Name)) continue;
                sql += (index == 0  ? "" : ",") + "[" + fld.Value.Name + "]";
                fields.Add(index, fld.Value);
                index++;
            }
            sql += " FROM ["+table_name+"] WHERE id='"+id.ToString()+"'";

            DBConnect.Element obj = dbconnect.GetObject(sql);
            xmlWriter.WriteStartElement(table_name);
            index = 0;
            foreach (var elm in obj.Attributes)
            {
                Field fld = fields[index];
                switch (fld.type)
                {
                    case DBTypes.Boolean:
                        xmlWriter.WriteAttributeString(elm.Key,elm.Value == "False" ? "0" : "1");
                        break;
                    case DBTypes.Double:
                        xmlWriter.WriteAttributeString(elm.Key,elm.Value.Replace(",","."));
                        break;
                    case DBTypes.Datetime:
                        xmlWriter.WriteAttributeString(elm.Key,elm.Value.Replace(".","-"));
                        break;
                    default:
                        xmlWriter.WriteAttributeString(elm.Key,elm.Value);
                        break;
                }
                
                index++;
            }
            xmlWriter.WriteEndElement();


            AddToRefList(table_name, id,path);

            // upload objects by forward references
            foreach (var elm in ForwardRefList)
            {
                SaveTable(xmlWriter,dbconnect,elm.Value.tablename, elm.Value.guid,path + "/" +elm.Value.tablename,elm.Value.number);
            }

            // write section of xml where contains forward references info
            if (ForwardRefList.Count > 0)
            {
                xmlWriter.WriteStartElement("Update");
                xmlWriter.WriteAttributeString("table_name", table_name);
                xmlWriter.WriteAttributeString("id", id.ToString());
                xmlWriter.WriteAttributeString("ref_count", ForwardRefList.Count.ToString());
                foreach (var dr in ForwardRefList)
                {
                    xmlWriter.WriteStartElement("Ref");
                    xmlWriter.WriteAttributeString("field", dr.Key);
                    xmlWriter.WriteAttributeString("value", dr.Value.guid.ToString());
                    xmlWriter.WriteEndElement();
                }
                xmlWriter.WriteEndElement();
            }

            // upload backward references
            if (!schema.GetTableByName(table_name).DontProcessingBackwardReferences)
            {
                foreign_keys = schema.ForeignKey.Where((x) => x.PrimaryTable_str == table_name && x.number != parent_key_number);
                if(foreign_keys.Count() > 0)
                {
                    foreach (ForeignKey key in foreign_keys) {
                        if (key.Table.DontProcessing) continue;
                        List<Guid> id_list = dbconnect.GetGuidList("SELECT id FROM [" + key.Table_str + "] where [" + key.field_str + "]='"+id.ToString()+"'");

                        string ids = "";
                        foreach (Guid id_ in id_list)
                        {
                            ids += (ids.Count() == 0 ? "":",")+id_.ToString();
                            if (!RefTreeContains(key.Table_str, id_))
                            {
                                SaveTable(xmlWriter,dbconnect, key.Table_str, id_, path + "/" + key.Table_str, key.number);
                            }
                        }
                    }
                }
            }

        }
예제 #3
0
        private void LoadElements(DBConnect dbconnect,List<XML_Element> xml_elements,short version_of_data)
        {
            if (xml_elements.Count == 0) return;

            // aggregates set of xml_elements, groups it by tables
            Dictionary<string, List<string>> table_aggregator = new Dictionary<string, List<string>>();
            foreach(XML_Element elm in xml_elements) {
                if (elm.Name == "Update") continue;
                List<string> cur_table;
                if(!table_aggregator.TryGetValue(elm.Name, out cur_table))
                {
                    cur_table = new List<string>();
                    table_aggregator.Add(elm.Name, cur_table);
                }
                if (elm.guid == "") throw new NotImplementedException();
                cur_table.Add(elm.guid);
            }

            // build the query to the id's for testing is elements in the database
            StringBuilder sql = new StringBuilder();
            sql.Append("Select tmp_tbl.id from (" + Environment.NewLine);

            List<Guid> ids = new List<Guid>();
            if(table_aggregator.Count > 0)
            {
                bool firsttable = true;
                foreach (var tbl in table_aggregator)
                {
                    sql.Append((firsttable ? "" : " UNION ALL "+Environment.NewLine) + "select id from [" + tbl.Key + "] where id in (");
                    bool firstelm = true;
                    foreach (var elm in tbl.Value)
                    {
                        sql.Append((firstelm ? "":",") +"'"+elm+"'");
                        firstelm = false;
                    }
                    sql.Append(")" + Environment.NewLine );
                    firsttable = false;
                }
                sql.Append(") as tmp_tbl");
                ids = dbconnect.GetGuidList(sql.ToString());
            }

            // build the main query insert/update
            sql.Clear();

            foreach(XML_Element elm in xml_elements)
            {
                bool isInsert = !ids.Contains(new Guid(elm.guid));

                if (!isInsert && elm.Attributes.Count == 1) continue; // no need to update because element haven't any attributes

                string names = "", values = "",names_values = "",name,value,table_name;

                Table tbl = schema.GetTableByName(elm.Name);

                bool FirstElement = true;
                if (!elm.IsForwardRef) // if it isn't forward references update
                {
                    table_name = elm.Name;
                    List<string> ListOfProcessedFields = new List<string>();
                    foreach (var attr in elm.Attributes)
                    {
                        Field fld = tbl.GetFieldByName(attr.Key);
                        if (fld == null) continue;
                        name = attr.Key;
                        ListOfProcessedFields.Add(name);
                        //value = fld.FormatValueForInsert(attr.Value);
                        value = FormatValueForSQL(fld,attr.Value,version_of_data);
                        if (value == null) continue;

                        if (isInsert)
                        {
                            names += (FirstElement ? "" : ",") + "[" + name + "]" + Environment.NewLine;
                            values += (FirstElement ? "" : ",") + value + Environment.NewLine;
                        }
                        else // update
                        {
                            if (name == "id") continue;
                            names_values += (FirstElement ? "" : ",") + "[" + name + "]=" + value + Environment.NewLine;
                        }
                        FirstElement = false;
                    }

                    // testing is there empty non-nullable field
                    foreach (var fld in tbl.Fields)
                    {
                        if (!fld.Value.IsNullable && !ListOfProcessedFields.Contains(fld.Key))
                        {
                            string fakevalue = GetFakeValue(dbconnect,tbl,fld.Value,version_of_data);
                             names += (FirstElement ? "" : ",") + "[" + fld.Key + "]" + Environment.NewLine;
                            values += (FirstElement ? "" : ",") + FormatValueForSQL(fld.Value,fakevalue,version_of_data) + Environment.NewLine;
                        }
                    }
                } else
                {
                    table_name = elm.GetAttibute("table_name");
                    foreach (var fld in elm.fields)
                    {
                        names_values += (FirstElement ? "" : ",") + "[" + fld.Field + "]='" + fld.Value + "'"+ Environment.NewLine;
                        FirstElement = false;
                    }
                }

                if (isInsert && !elm.IsForwardRef) {
                    string insert =
                        "INSERT INTO [" + table_name + "] (" + Environment.NewLine +
                        names + ") VALUES (" + Environment.NewLine +
                        values + ") "+Environment.NewLine+Environment.NewLine;
                    sql.Append(insert);
                    UpdateOnLoad.UpdateAfterLoading(elm, version_of_data, false);
                } else
                {
                    if(names_values != "")
                    {
                        string update =
                            "UPDATE [" + table_name + "] SET" + Environment.NewLine +
                            names_values + "WHERE id='" + elm.guid+"'"+Environment.NewLine+Environment.NewLine;
                        sql.Append(update);
                        UpdateOnLoad.UpdateAfterLoading(elm, version_of_data, true);
                    }
                }
            }

            string sql_string = sql.ToString();
            if(sql_string.Length != 0)
            {
                dbconnect.ExecuteSQL(sql);
            }
        }
예제 #4
0
        public void DeleteTable(DBConnect dbconnect,string table_name,Guid id,bool remove,string path = "",int parent_key_number =0)
        {
            string sql;
            if (path == "") path = table_name;
            if (!PathList.Contains(path)) PathList.Add(path);

            if (RefTreeContains(table_name, id)) return;
            AddToRefList(table_name, id,path);

            Dictionary<string,Ref> ForwardRefList = new Dictionary<string,Ref>();


            // find forward references
            var foreign_keys = schema.ForeignKey.Where((x) => x.Table_str == table_name && x.number != parent_key_number);
            if(foreign_keys.Count() > 0)
            {
                foreach (ForeignKey key in foreign_keys) {
                    if (key.field.DontProcessing) continue;
                    if (key.PrimaryTable.DontProcessing) continue;

                    DBConnect.Query query = new DBConnect.Query();
                    query.sql = "SELECT [" + key.field_str + "] as id FROM [" + key.Table_str + "] where id=@id";
                    query.AddParameter("id", id);
                    Guid? res = dbconnect.GetGuid("SELECT [" + key.field_str + "] as id FROM [" + key.Table_str + "] where id='"+id.ToString()+"'");

                    if (res == null) continue;
                    Guid id_ = (Guid)res;

                    // is it a forward reference
                    if (!RefTreeContains(key.PrimaryTable_str, id_)){
                        ForwardRefList.Add(key.field_str,new Ref {tablename = key.PrimaryTable_str,guid = id_,number = key.number});
                    }
                }
            }

            // Clearing the reference fields
            if(ForwardRefList.Count > 0 && remove)
            {
                sql = "UPDATE ["+table_name+"] SET"+Environment.NewLine;
                bool FirstElement = true;
                foreach(var elm in ForwardRefList)
                {
                    sql += (FirstElement ? "" : ",") + "[" +  elm.Key + "]=null"+Environment.NewLine;
                    FirstElement = false;
                }
                sql += "WHERE id='"+id+"'";
                dbconnect.ExecuteSQL(sql);
            }

            // delete objects by forward references
            foreach(var elm in ForwardRefList)
            {
                DeleteTable(dbconnect,elm.Value.tablename, elm.Value.guid,remove,path + "->" +elm.Value.tablename,elm.Value.number);
            }

            // delete objects by backward references
            foreign_keys = schema.ForeignKey.Where((x) => x.PrimaryTable_str == table_name && x.number != parent_key_number);
            if(foreign_keys.Count() > 0)
            {
                foreach (ForeignKey key in foreign_keys) {
                    if (key.Table.DontProcessing) continue;
                    List<Guid> id_list = dbconnect.GetGuidList("SELECT id FROM [" + key.Table_str + "] where [" + key.field_str + "]='"+id.ToString()+"'");

                    string ids = "";
                    foreach (Guid id_ in id_list)
                    {
                        ids += (ids.Count() == 0 ? "":",")+id_;
                        if (!RefTreeContains(key.Table_str, id_))
                        {
                            DeleteTable(dbconnect,key.Table_str, id_,remove, path + "->" + key.Table_str, key.number);
                        }
                    }
                }
            }

            if (remove)
            {
                dbconnect.ExecuteSQL("DELETE FROM ["+table_name+"] WHERE id='"+id.ToString()+"'");
            }
            

        }