SqlManger.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. using MongoDB.Bson;
  2. using MongoDB.Bson.Serialization.Conventions;
  3. using MongoDB.Driver;
  4. using Newtonsoft.Json;
  5. using Shaker.Model;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Configuration;
  9. using System.Linq;
  10. using System.Linq.Expressions;
  11. using System.Reflection;
  12. using System.Security.Cryptography;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. namespace ShakerManger
  16. {
  17. public class Sql
  18. {
  19. private Shaker.Model.SqlModel _SqlModel = new SqlModel();
  20. private static string PATH = System.AppDomain.CurrentDomain.BaseDirectory + "SqlConfig.json";
  21. private Sql()
  22. {
  23. if (System.IO.File.Exists(PATH))
  24. {
  25. var config = System.IO.File.ReadAllText(PATH);
  26. try
  27. {
  28. _SqlModel = JsonConvert.DeserializeObject<SqlModel>(config) ?? new SqlModel();
  29. }
  30. catch
  31. {
  32. _SqlModel = new SqlModel();
  33. }
  34. }
  35. _SqlModel ??= new SqlModel();
  36. System.IO.File.WriteAllText(PATH, JsonConvert.SerializeObject(_SqlModel, Formatting.Indented));
  37. }
  38. static Sql()
  39. {
  40. }
  41. public void Save(SqlModel model)
  42. {
  43. _SqlModel.IP = model.IP;
  44. _SqlModel.Port = model.Port;
  45. _SqlModel.UserName = model.UserName;
  46. _SqlModel.Password = model.Password;
  47. _SqlModel.Anonymous = model.Anonymous;
  48. _SqlModel.DBName = model.DBName;
  49. System.IO.File.WriteAllText(PATH, JsonConvert.SerializeObject(_SqlModel, Formatting.Indented));
  50. }
  51. public static Sql Default { get; } = new Sql();
  52. public bool IsConnected { get; set; } = false;
  53. public string IP { get=>_SqlModel.IP; set=>_SqlModel.IP = value; }
  54. public string UserName { get=>_SqlModel.UserName; set=>_SqlModel.UserName = value; }
  55. public string Password { get=>_SqlModel.Password; set=>_SqlModel.Password = value; }
  56. public int Port { get=>_SqlModel.Port; set=>_SqlModel.Port =value; }
  57. public string DBName { get=>_SqlModel.DBName; set=>_SqlModel.DBName =value; }
  58. public string Connectstring => Anonymous ? $"mongodb://{IP}:{Port}" : $"mongodb://{UserName}:{Password}@{IP}:{Port}";
  59. public bool Anonymous { get=>_SqlModel.Anonymous; set=>_SqlModel.Anonymous =value; }
  60. #region
  61. public bool TestConnection(string connectstring)
  62. {
  63. try
  64. {
  65. var client = new MongoClient(connectstring);
  66. client = null;
  67. return true;
  68. }catch
  69. {
  70. return false;
  71. }
  72. }
  73. public IMongoDatabase? Database => database;
  74. private MongoClient? client;
  75. private IMongoDatabase? database;
  76. public bool Connect()
  77. {
  78. if (IsConnected) return true;
  79. try
  80. {
  81. client = new MongoClient(Connectstring);
  82. database = client.GetDatabase(DBName);
  83. IsConnected = true;
  84. InitDataBase();
  85. }
  86. catch
  87. {
  88. IsConnected = false;
  89. }
  90. return IsConnected;
  91. }
  92. public void Disconnect()
  93. {
  94. Close();
  95. }
  96. private void Close()
  97. {
  98. database = null;
  99. client = null;
  100. IsConnected = false;
  101. }
  102. private void InitDataBase()
  103. {
  104. InitCollection(new Shaker.Model.UserModel()
  105. {
  106. UserName = "admin",
  107. PassWord = Shaker.Model.GlobalVariable.MD5Encrypt32("123456"),
  108. UserType = UserType.SystemAdministrator,
  109. });
  110. typeof(Shaker.Model.LogModel).Assembly.GetTypes().Where(x => x.BaseType == typeof(Shaker.Model.TableBase) && !x.IsAbstract).Select(x => x.Name).ToList().ForEach(x => InitCollection(x));
  111. }
  112. private void InitCollection<T>(T value,string name = "") where T : Shaker.Model.TableBase
  113. {
  114. if (database == null) return;
  115. name = string.IsNullOrEmpty(name) ? typeof(T).Name : name;
  116. if (!database.ListCollectionNames().ToList().Any(x => x == name))
  117. {
  118. database.CreateCollection(name);
  119. database.GetCollection<T>(name).InsertOne(value);
  120. }
  121. }
  122. private void InitCollection<T>(string name="") where T : Shaker.Model.TableBase
  123. {
  124. if (database == null) return;
  125. name = string.IsNullOrEmpty(name) ? typeof(T).Name : name;
  126. if (!database.ListCollectionNames().ToList().Any(x => x == name))
  127. {
  128. database.CreateCollection(name);
  129. }
  130. }
  131. private void InitCollection(string name)
  132. {
  133. if (database == null || string.IsNullOrEmpty(name)) return;
  134. if (!database.ListCollectionNames().ToList().Any(x => x == name))
  135. {
  136. database.CreateCollection(name);
  137. }
  138. }
  139. public bool Insert<T>(T enrity,string name="") where T : Shaker.Model.TableBase
  140. {
  141. if (enrity == null || database == null) return false;
  142. name = string.IsNullOrEmpty(name) ? typeof(T).Name : name;
  143. try
  144. {
  145. database.GetCollection<T>(name).InsertOne(enrity);
  146. return true;
  147. }
  148. catch
  149. {
  150. return false;
  151. }
  152. }
  153. public int Insert<T>(ICollection<T> enrities,string name="") where T : Shaker.Model.TableBase
  154. {
  155. if (enrities == null || enrities.Count == 0 || database == null) return 0;
  156. name = string.IsNullOrEmpty(name) ? typeof(T).Name : name;
  157. try
  158. {
  159. database.GetCollection<T>(name).InsertMany(enrities);
  160. return enrities.Count;
  161. }
  162. catch
  163. {
  164. return 0;
  165. }
  166. }
  167. private static string GetPropertyName<T, TValue>(Expression<Func<T, TValue>> expr) where T : Shaker.Model.TableBase
  168. {
  169. var rtn = "";
  170. if (expr.Body is UnaryExpression)
  171. {
  172. MemberInfo memberInfo = ((MemberExpression)((UnaryExpression)expr.Body).Operand).Member;
  173. switch (memberInfo.MemberType)
  174. {
  175. case MemberTypes.Field:
  176. case MemberTypes.Property:
  177. rtn = memberInfo.Name;
  178. break;
  179. default:
  180. rtn = "";
  181. break;
  182. }
  183. }
  184. else if (expr.Body is MemberExpression)
  185. {
  186. MemberInfo memberInfo = ((MemberExpression)expr.Body).Member;
  187. switch (memberInfo.MemberType)
  188. {
  189. case MemberTypes.Field:
  190. case MemberTypes.Property:
  191. rtn = memberInfo.Name;
  192. break;
  193. default:
  194. rtn = "";
  195. break;
  196. }
  197. }
  198. return rtn;
  199. }
  200. public T? FindFirst<T>(IEnumerable<Expression<Func<T, object>>>? fields = null,string name="") where T : Shaker.Model.TableBase
  201. {
  202. T? result = default;
  203. if (database == null) return result;
  204. name = string.IsNullOrEmpty(name) ? typeof(T).Name : name;
  205. try
  206. {
  207. if (fields == null || fields.Count() == 0)
  208. {
  209. result = database.GetCollection<T>(name).AsQueryable().First();
  210. }
  211. else
  212. {
  213. ProjectionDefinition<T>? proj = null;
  214. foreach (var item in fields)
  215. {
  216. if (proj == null)
  217. {
  218. proj = Builders<T>.Projection.Include(GetPropertyName(item));
  219. }
  220. else
  221. {
  222. proj = proj.Include(GetPropertyName(item));
  223. }
  224. }
  225. if (proj == null)
  226. {
  227. result = database.GetCollection<T>(name).AsQueryable().First();
  228. }
  229. else
  230. {
  231. result = database.GetCollection<T>(name).Find(x => true).Project<T>(proj).First();
  232. }
  233. }
  234. }
  235. catch
  236. {
  237. }
  238. return result;
  239. }
  240. public T? FindFirst<T>(Expression<Func<T, bool>> expr, IEnumerable<Expression<Func<T, object>>>? fields = null,string name="") where T : Shaker.Model.TableBase
  241. {
  242. T? result = default;
  243. if (database == null) return result;
  244. name = string.IsNullOrEmpty(name) ? typeof(T).Name : name;
  245. try
  246. {
  247. if (fields == null || fields.Count() == 0)
  248. {
  249. result = database.GetCollection<T>(name).AsQueryable().First(expr);
  250. }
  251. else
  252. {
  253. ProjectionDefinition<T>? proj = null;
  254. foreach (var item in fields)
  255. {
  256. if (proj == null)
  257. {
  258. proj = Builders<T>.Projection.Include(GetPropertyName(item));
  259. }
  260. else
  261. {
  262. proj = proj.Include(GetPropertyName(item));
  263. }
  264. }
  265. if (proj == null)
  266. {
  267. result = database.GetCollection<T>(name).AsQueryable().First(expr);
  268. }
  269. else
  270. {
  271. result = database.GetCollection<T>(name).Find(expr).Project<T>(proj).First();
  272. }
  273. }
  274. }
  275. catch
  276. {
  277. }
  278. return result;
  279. }
  280. public IEnumerable<T> Find<T>(Expression<Func<T, bool>> expr, IEnumerable<Expression<Func<T, object>>>? fields = null,string name = "") where T : Shaker.Model.TableBase
  281. {
  282. IEnumerable<T> result = new List<T>();
  283. if (database == null) return result;
  284. try
  285. {
  286. name = string.IsNullOrEmpty(name) ? typeof(T).Name:name;
  287. if (fields == null || fields.Count() == 0)
  288. {
  289. result = database.GetCollection<T>(name).AsQueryable().Where(expr).ToList();
  290. }
  291. else
  292. {
  293. ProjectionDefinition<T>? proj = null;
  294. foreach (var item in fields)
  295. {
  296. if (proj == null)
  297. {
  298. proj = Builders<T>.Projection.Include(GetPropertyName(item));
  299. }
  300. else
  301. {
  302. proj = proj.Include(GetPropertyName(item));
  303. }
  304. }
  305. if (proj == null)
  306. {
  307. result = database.GetCollection<T>(name).AsQueryable().Where(expr).ToList();
  308. }
  309. else
  310. {
  311. result = database.GetCollection<T>(name).Find(expr).Project<T>(proj).ToList();
  312. }
  313. }
  314. }
  315. catch
  316. {
  317. }
  318. return result;
  319. }
  320. public IMongoCollection<T> GetCollection<T>(string name="") where T : Shaker.Model.TableBase
  321. {
  322. name = string.IsNullOrEmpty(name) ? typeof(T).Name : name;
  323. if (database == null) return null;
  324. try
  325. {
  326. return database.GetCollection<T>(name);
  327. }
  328. catch
  329. { }
  330. return null;
  331. }
  332. public bool PushEach<T, TValue, TValue1>(Expression<Func<T, TValue>> expr, TValue oldvalue, Expression<Func<T, IEnumerable<TValue1>>> expr1, IEnumerable<TValue1> newvalue,string name="") where T : Shaker.Model.TableBase
  333. {
  334. if (database == null) return false;
  335. string fieldname = GetPropertyName(expr);
  336. if (string.IsNullOrEmpty(fieldname)) return false;
  337. name = string.IsNullOrEmpty(name) ? typeof(T).Name : name;
  338. try
  339. {
  340. var filter = Builders<T>.Filter.Eq(expr, oldvalue);
  341. var update = Builders<T>.Update.PushEach(expr1, newvalue);
  342. var result = database.GetCollection<T>(name).UpdateOne(filter, update);
  343. return true;
  344. }
  345. catch { }
  346. return false;
  347. }
  348. public bool Push<T, TValue, TValue1>(Expression<Func<T, TValue>> expr, TValue oldvalue, Expression<Func<T, IEnumerable<TValue1>>> expr1, TValue1 newvalue,string name="") where T : Shaker.Model.TableBase
  349. {
  350. if (database == null) return false;
  351. string fieldname = GetPropertyName(expr);
  352. if (string.IsNullOrEmpty(fieldname)) return false;
  353. name = string.IsNullOrEmpty(name) ? typeof(T).Name : name;
  354. try
  355. {
  356. var filter = Builders<T>.Filter.Eq(expr, oldvalue);
  357. var update = Builders<T>.Update.Push(expr1, newvalue);
  358. var result = database.GetCollection<T>(name).UpdateOne(filter, update);
  359. return true;
  360. }
  361. catch { }
  362. return false;
  363. }
  364. public bool UpDate<T, TValue, TValue1>(Expression<Func<T, TValue>> expr, TValue oldvalue, Expression<Func<T, TValue1>> expr1, TValue1 newvalue,string name="") where T : Shaker.Model.TableBase
  365. {
  366. if (database == null) return false;
  367. string fieldname = GetPropertyName(expr);
  368. if (string.IsNullOrEmpty(fieldname)) return false;
  369. name = string.IsNullOrEmpty(name) ? typeof(T).Name : name;
  370. try
  371. {
  372. var filter = Builders<T>.Filter.Eq(expr, oldvalue);
  373. var update = Builders<T>.Update.Set(expr1, newvalue);
  374. var result = database.GetCollection<T>(name).UpdateOne(filter, update);
  375. return true;
  376. }
  377. catch { }
  378. return false;
  379. }
  380. public bool Replace<T, TValue>(Expression<Func<T, TValue>> expr, TValue field, T newvalue,string name="") where T : TableBase
  381. {
  382. if (database == null) return false;
  383. string fieldname = GetPropertyName(expr);
  384. if (string.IsNullOrEmpty(fieldname)) return false;
  385. name = string.IsNullOrEmpty(name) ? typeof(T).Name : name;
  386. try
  387. {
  388. var filter = Builders<T>.Filter.Eq(expr, field);
  389. var result = database.GetCollection<T>(newvalue == null ? name : newvalue.GetType().Name).ReplaceOne(filter, newvalue);
  390. return true;
  391. }
  392. catch { }
  393. return false;
  394. }
  395. public bool UpDate<T, TValue>(Expression<Func<T, TValue>> expr, TValue oldvalue, TValue newvalue,string name="") where T : TableBase
  396. {
  397. if (database == null) return false;
  398. string fieldname = GetPropertyName(expr);
  399. if (string.IsNullOrEmpty(fieldname)) return false;
  400. name = string.IsNullOrEmpty(name) ? typeof(T).Name : name;
  401. try
  402. {
  403. var filter = Builders<T>.Filter.Eq(expr, oldvalue);
  404. var update = Builders<T>.Update.Set(expr, newvalue);
  405. database.GetCollection<T>(name).UpdateOne(filter, update);
  406. return true;
  407. }
  408. catch { }
  409. return false;
  410. }
  411. public bool UpDateMany<T, TValue, TValue1>(Expression<Func<T, TValue>> expr, TValue oldvalue, Expression<Func<T, TValue1>> expr1, TValue1 newvalue,string name="") where T : TableBase
  412. {
  413. if (database == null) return false;
  414. string fieldname = GetPropertyName(expr);
  415. if (string.IsNullOrEmpty(fieldname)) return false;
  416. name = string.IsNullOrEmpty(name) ? typeof(T).Name : name;
  417. try
  418. {
  419. var filter = Builders<T>.Filter.Eq(expr, oldvalue);
  420. var update = Builders<T>.Update.Set(expr1, newvalue);
  421. database.GetCollection<T>(name).UpdateMany(filter, update);
  422. return true;
  423. }
  424. catch { }
  425. return false;
  426. }
  427. public bool UpDateMany<T, TValue>(Expression<Func<T, TValue>> expr, TValue oldvalue, TValue newvalue,string name="") where T : TableBase
  428. {
  429. if (database == null) return false;
  430. string fieldname = GetPropertyName(expr);
  431. if (string.IsNullOrEmpty(fieldname)) return false;
  432. name = string.IsNullOrEmpty(name) ? typeof(T).Name : name;
  433. try
  434. {
  435. var filter = Builders<T>.Filter.Eq(expr, oldvalue);
  436. var update = Builders<T>.Update.Set(expr, newvalue);
  437. database.GetCollection<T>(name).UpdateMany(filter, update);
  438. return true;
  439. }
  440. catch { }
  441. return false;
  442. }
  443. public bool Delete<T, TValue>(Expression<Func<T, TValue>> expr, TValue value,string name="") where T : TableBase
  444. {
  445. if (database == null) return false;
  446. name = string.IsNullOrEmpty(name) ? typeof(T).Name : name;
  447. try
  448. {
  449. var filter = Builders<T>.Filter.Eq(expr, value);
  450. database.GetCollection<T>(name).DeleteMany(filter);
  451. }
  452. catch { }
  453. return false;
  454. }
  455. #endregion
  456. }
  457. }