using ExportMap.cs; using ExportMap.Models; using Npgsql; using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Reflection; using System.Web; namespace ExportMap.db { public class PubDBHelper { private static List imgList = new List() { "tif", "tiff", "img", "mpt" }; private static string insertPublishSql = "insert into lf.sys_publish(name, url, path, type, status, dirid, depid, min, max, json, create_user, geom, bak) values (@name, @url, @path, @type, @status, @dirid, @depid, @min, @max, @json, @create_user, {0}, @bak) returning id"; private static string insertMetaPubSql = "insert into lf.sys_meta_pub (metaid, pubid, create_user) select {0}, {1}, {2} from (select 1) temp where not exists (select 1 from lf.sys_meta_pub where metaid = {0} and pubid = {1})"; // 模型-@cnName,model-@enName,自动发布模型-@name,http:// - @url,Tileset-@serve,1-@user,7-@pubid private static string insertLayerSql = "insert into lf.sys_layer (pid, cn_name, en_name, url, type, level, order_num, is_show, create_user, data_type, serve_type, pubid, elev) values ((select coalesce(id, 0) from lf.sys_layer where cn_name = @name limit 1), @cnName, @enName, @url, 2, (select coalesce(level, 0) + 1 from lf.sys_layer where cn_name = @name limit 1), (select coalesce(max(order_num), 0) + 1 from lf.sys_layer where pid = (select id from lf.sys_layer where cn_name = @name limit 1)), 0, @user, @name, @serve, @pubid, @elev);"; private static string updateMetaSql = "update lf.sys_meta set path = @path where id = @id"; /// /// 是/否发布过 /// public static bool IsPublish(int metaid) { string sql = "select count(*) from lf.sys_meta_pub a inner join lf.sys_publish b on a.pubid = b.id where a.metaid = " + metaid; object obj = Tools.DBHelper.GetScalar(sql); int count = obj == null ? 0 : Convert.ToInt32(obj); return count > 0; } /// /// 是/否发布过 /// public static bool IsPublish(string dirid) { string sql = "select count(*) from lf.sys_meta_pub a inner join lf.sys_publish b on a.pubid = b.id where b.type = 'DOM' and b.dirid = @dirid"; DbParameter dp = new NpgsqlParameter("@dirid", dirid); object obj = Tools.DBHelper.GetScalar(sql, dp); int count = obj == null ? 0 : Convert.ToInt32(obj); return count > 0; } /// /// 插入元数据-数据发布表记录 /// public static int InsertMetaPub(int metaid, int pubid, int userId) { string sql = string.Format(insertMetaPubSql, metaid, pubid, userId); return Tools.DBHelper.ExecuteNonQuery(sql); } /// /// 插入数据发布表记录 /// public static int InsertPublish(SysPublish sys) { List list = Tools.GetParams(insertPublishSql, sys); string sql = string.Format(insertPublishSql, sys.geom == null ? "null" : sys.geom); object obj = Tools.DBHelper.GetScalar(sql, list.ToArray()); return obj == null ? 0 : Convert.ToInt32(obj); } /// /// 插入图层表记录 /// public static int InsertLayer(SysPublish sys, SysMeta meta, double elev = 0) { bool isImg = imgList.Contains(meta.type); string cnName = meta.name.Split(new char[] { '.' })[0]; string name = isImg ? "影像" : "自动发布模型"; string serve = isImg ? (meta.type.Equals("mpt") ? "Mpt" : "TMS") : "Tileset"; List list = new List(); list.Add(new NpgsqlParameter("@cnName", cnName)); list.Add(new NpgsqlParameter("@enName", meta.name)); list.Add(new NpgsqlParameter("@name", name)); list.Add(new NpgsqlParameter("@url", sys.url)); list.Add(new NpgsqlParameter("@serve", serve)); list.Add(new NpgsqlParameter("@pubid", sys.id)); list.Add(new NpgsqlParameter("@user", sys.create_user)); list.Add(new NpgsqlParameter("@elev", elev)); int rows = Tools.DBHelper.ExecuteNonQuery(insertLayerSql, list.ToArray()); return rows; } /// /// 更新元数据文件路径 /// public static int UpdateMetaPath(SysMeta meta) { List list = new List(); list.Add(new NpgsqlParameter("@id", meta.id)); list.Add(new NpgsqlParameter("@path", meta.path)); int rows = Tools.DBHelper.ExecuteNonQuery(updateMetaSql, list.ToArray()); return rows; } /// /// 获取参数列表 /// public static List GetParams(string sql, T t) { List list = new List(); Type tType = typeof(T); BindingFlags flags = BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance; int start = sql.IndexOf("@"); while (start != -1) { int end = sql.IndexOf(",", start); if (end == -1) end = sql.IndexOf(")", start); if (end == -1) end = sql.IndexOf(" ", start); if (end == -1) end = sql.Length; string name = sql.Substring(start + 1, end - start - 1); PropertyInfo pi = tType.GetProperty(name, flags); if (pi != null) { object value = pi.GetValue(t, null); DbParameter dp = new NpgsqlParameter("@" + name, value); list.Add(dp); } start = sql.IndexOf("@", end); } return list; } } }