Skip to content

Commit

Permalink
1. 增加sqlite,mysql的数据库连接支持,不一定非要使用文件了(测试不完全)
Browse files Browse the repository at this point in the history
2. 增加网页采集器源代码的拷贝复制,提升了性能
3. 重要更新:当数据清洗发现有模块出问题无法返回数据时,提醒用户进入调试模式,弹窗可直接修改错误的参数
4. 修复数据清洗不显示最左边模块的问题(对应文档问题3)
5. 修复子流转换无法拖入的问题
6. 增加时间区间生成
7. 2,5,8,10 因为考虑到一些原因没有修复,也未增加多个关键字的xpath搜索,原因可以电话沟通
  • Loading branch information
ferventdesert committed Jan 7, 2018
1 parent c252964 commit 28486f6
Show file tree
Hide file tree
Showing 31 changed files with 972 additions and 190 deletions.
12 changes: 12 additions & 0 deletions Docs/update.md
Expand Up @@ -132,6 +132,7 @@
## 数据清洗
- 优化数据清洗调试ui,表格支持拖拽,拷贝内部文本,去掉调试详情,增加单步调试按钮,大大提升转换速度
- 优化支持上百万大小的excel写操作,之前会有内存问题

- 支持首字母搜索模块
- 优化任务终止逻辑
- 下载文件模块,若目标路径为文件夹,则自动判断超链接地址,获取文件名
Expand All @@ -154,7 +155,18 @@
- 增加白板式邀请法则,提升用户使用体验
- 欢迎用户去知乎上回答 如何评价 Hawk 这个项目?,说出你的真实开发感受即可。

## 2018年1月7日

1. 增加sqlite,mysql的数据库连接支持,不一定非要使用文件了(测试不完全)
2. 增加网页采集器源代码的拷贝复制,提升了性能
3. 重要更新:当数据清洗发现有模块出问题无法返回数据时,提醒用户进入调试模式,弹窗可直接修改错误的参数
4. 修复数据清洗不显示最左边模块的问题(对应文档问题3)
5. 修复子流转换无法拖入的问题
6. 增加时间区间生成
7. 2,5,8,10 因为考虑到一些原因没有修复,也未增加多个关键字的xpath搜索,原因可以电话沟通

关闭时,若程序中有任务没有保存,则提示用户对任务进行保存。
列名不能为数字



Expand Down
18 changes: 14 additions & 4 deletions Hawk.Core/Connectors/DBConnectorBase.cs
Expand Up @@ -231,8 +231,16 @@ protected virtual string Insert(IFreeDocument data, string dbTableName)
}
else
{
value = o.Value.ToString();
if (o.Value == null)
{
value = "null";
}
else
{
value = o.Value.ToString();
}
}
value = value.Replace("'", "''");
sb.Append($"'{value}',");
}
sb.Remove(sb.Length - 1, 1);
Expand Down Expand Up @@ -345,7 +353,7 @@ public virtual void CreateDataBase(string dbname)
[LocalizedCategory("1.连接管理")]
[LocalizedDisplayName("数据库名称")]
[PropertyOrder(2)]
public string DBName { get; set; }
public virtual string DBName { get; set; }


public virtual bool CreateTable(IFreeDocument example, string name)
Expand All @@ -355,7 +363,7 @@ public virtual bool CreateTable(IFreeDocument example, string name)
foreach (var o in txt)
{
sb.Append(o.Key);
sb.AppendFormat(" {0},", DataTypeConverter.ToType(o.Value));
sb.AppendFormat(" {0}, ", DataTypeConverter.ToType(o.Value));
}
sb.Remove(sb.Length - 1, 1);
string sql = $"CREATE TABLE {GetTableName(name)} ({sb})";
Expand Down Expand Up @@ -443,6 +451,7 @@ public virtual void DropTable(string tableName)
}
catch (Exception ex)
{
XLogSys.Print.Error($"数据库删除失败: {ex}" );
}
}

Expand Down Expand Up @@ -496,8 +505,9 @@ public virtual List<TableInfo> RefreshTableNames()
ExecuteNonQuery($"update {GetTableName(tableName)} set {sb} where {ToString()};");
}

catch
catch (Exception e)
{
XLogSys.Print.Debug($"insert database error {e.Message}");
}
}

Expand Down
198 changes: 198 additions & 0 deletions Hawk.Core/Connectors/MySQLConnector.cs
@@ -0,0 +1,198 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Hawk.Core.Connectors;
using Hawk.Core.Utils;
using Hawk.Core.Utils.Logs;
using Hawk.Core.Utils.Plugins;
using MySql.Data.MySqlClient;

namespace XFrmWork.DataBase
{
using System.Data;
using System.Data.Common;




[XFrmWork("MySQL数据库", "IDataBaseConnector", "提供MySQL交互的数据库服务", "")]
public class MySQLConnector : DBConnectorBase
{

public override bool CloseDB()
{
dbConn.Close();
return true;

}


public override void BatchInsert(IEnumerable<IFreeDocument> source, string dbTableName)
{

var sqlStringList = source.Select(d => this.Insert(d, dbTableName)).ToList();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = dbConn;
MySqlTransaction tx = dbConn.BeginTransaction();
cmd.Transaction = tx;
try
{
for (int n = 0; n < sqlStringList.Count; n++)
{
string strsql = sqlStringList[n];
if (strsql.Trim().Length > 1)
{
cmd.CommandText = strsql;
try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
XLogSys.Print.Debug($"batch insert database error {ex.Message}");
}

}
//后来加上的
if (n > 0 && (n % 500 == 0 || n == sqlStringList.Count - 1))
{
tx.Commit();
tx = dbConn.BeginTransaction();
}
}
//tx.Commit();//原来一次性提交
}
catch (System.Data.SqlClient.SqlException e)
{
XLogSys.Print.Debug($"insert mysql database error {e.Message}");
tx.Rollback();

}
}
public override bool CreateTable(IFreeDocument example, string name)
{
//
var txt = example.DictSerialize(Scenario.Database);
var sb = new StringBuilder();
foreach (var o in txt)
{

sb.Append(o.Key);
sb.AppendFormat(" {0},", DataTypeConverter.ToType(o.Value));

}
sb.Remove(sb.Length - 1, 1);
var sql = string.Format("CREATE TABLE {0} ({1}) default charset utf8 COLLATE utf8_general_ci", name, sb.ToString());
ExecuteNonQuery(sql);
this.RefreshTableNames();
return true;

}
private MySqlConnection dbConn;
public override bool ConnectDB()
{
if (this.dbConn != null && this.dbConn.State == ConnectionState.Open)
{
this.dbConn.Close();
}
var sql = GetConnectString();
this.dbConn = new MySqlConnection(sql);
try
{
this.dbConn.Open();

IsUseable = true;
}
catch (Exception ex)
{

IsUseable = false;

}
return IsUseable;
}
protected override int ExecuteNonQuery(string sql)
{
var dbComm = new MySqlCommand(sql, dbConn);

return dbComm.ExecuteNonQuery();






}

private void Execute(string sql, Action<DbDataRecord> recordAction)
{
var dbComm = new MySqlCommand("show tables", dbConn);


using (var sdr = dbComm.ExecuteReader())
{
foreach (var dr in sdr)
{
var item = dr as
DbDataRecord;
recordAction(item);
}
}
}

private void GetTableInfo(TableInfo table)
{
table.ColumnInfos.Clear();
Execute($"desc {table.Name}", d => table.ColumnInfos.Add(new ColumnInfo(d.GetString(0))
{
DataType = GetType(d.GetString(1)).ToString(),
CanNull= d.GetString(2)=="YES"?true:false,
IsKey = d.GetString(3).Contains("PRI"),
}));
}

private SimpleDataType GetType(string name)
{
if(name.Contains("int")||name.Contains("year"))
return SimpleDataType.INT;
if (name.Contains("float") ||name.Contains("double") )
return SimpleDataType.DOUBLE;
if (name.Contains("varchar") || name.Contains("nvarchar"))
return SimpleDataType.STRING;

if (name.Contains("enum") )
return SimpleDataType.ENUMS;
if (name.Contains("timestamp"))
return SimpleDataType.TIMESPAN;
return SimpleDataType.STRING;
}
public override List<TableInfo> RefreshTableNames()
{
if (IsUseable == false) return new List<TableInfo>();
var dbComm = new MySqlCommand("show tables", dbConn);

List<TableInfo> res = new List<TableInfo>();
Execute("show tables", d => res.Add(new TableInfo(d.GetValue(0).ToString(), this) ));
TableNames.SetSource(res);
// res.Execute(GetTableInfo);


return res;
}


protected override DataTable GetDataTable(string sql)
{
MySqlCommand dbComm = new MySqlCommand(sql, dbConn);

DataTable dt = new DataTable();
MySqlDataReader sdr = dbComm.ExecuteReader();
if (sdr.HasRows)
dt.Load(sdr);
sdr.Close();
return dt;
}
}
}

0 comments on commit 28486f6

Please sign in to comment.