business_database.go 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094
  1. package service
  2. import (
  3. "DataShare/dao"
  4. "DataShare/global"
  5. "DataShare/middleware"
  6. "DataShare/model"
  7. "bytes"
  8. "encoding/json"
  9. "errors"
  10. "fmt"
  11. "github.com/sirupsen/logrus"
  12. )
  13. func UserLogin(req *model.LoginRequest)(*model.ResponseToken,error){
  14. //1、先检查key是否存在
  15. //2、创建token
  16. ts, err := middleware.CreateToken(req.AppId,req.AppSecret)
  17. if err != nil {
  18. return nil, errors.New("创建token失败")
  19. }
  20. // save token to redis
  21. uidValue := model.UuidValue{
  22. AppId: req.AppId,
  23. AppSecret: req.AppSecret,
  24. }
  25. jsonUidValue,_ := json.Marshal(&uidValue)
  26. dao.DeleteTokenByUserNameAndType(req.AppId,req.AppSecret)
  27. err = dao.CreateAuth(string(jsonUidValue), ts)
  28. if err != nil {
  29. return nil, err
  30. }
  31. result := model.ResponseToken{
  32. AccessToken: ts.AccessToken,
  33. RefreshToken: ts.RefreshToken,
  34. ExpiresAt: ts.AtExpires,
  35. }
  36. return &result, nil
  37. }
  38. func UserLogout()error{
  39. return nil
  40. }
  41. func getDataBaseInfoById(id int)(*global.DbInfo){
  42. for i:=0;i<len(global.Databases);i++{
  43. if global.Databases[i].Id == id {
  44. return &global.Databases[i]
  45. }
  46. }
  47. return nil
  48. }
  49. //数据库连接
  50. func DatabaseConnect(req *model.DbConnInfo)(error){
  51. db, err := dao.DbConnect(req.Type,req.Connection)
  52. if err != nil {
  53. return err
  54. }
  55. if req.Mode == "test"{
  56. db.Close()
  57. }else if req.Mode == "add"{
  58. //添加到队列
  59. dbInfo := global.DbInfo{
  60. DbHandle: db,
  61. ConnInfo: req.Connection,
  62. Status: true,
  63. SqlType: req.Type,
  64. DbName: req.DbName,
  65. Id: req.Id,
  66. }
  67. for i:=0;i<len(global.Databases);i++{
  68. if global.Databases[i].Id == req.Id{
  69. //已经存在,则删除它,重新添加
  70. global.Databases = append(global.Databases[:i], global.Databases[i+1:]...)
  71. }
  72. }
  73. global.Databases = append(global.Databases, dbInfo)
  74. }
  75. return nil
  76. }
  77. //获取缓存中的数据库列表
  78. func DatabaseList(req *model.Page)(*model.CommonList,error){
  79. total := len(global.Databases)
  80. if (req.PageNo-1)*req.PageSize >= total {
  81. return &model.CommonList{total,nil},nil
  82. }
  83. //分页处理
  84. var result []global.DbInfo
  85. start := (req.PageNo-1) * req.PageSize
  86. end := start + req.PageSize
  87. if end < total {
  88. result = global.Databases[start:end]
  89. }else {
  90. result = global.Databases[start:]
  91. }
  92. tableData := make([]map[string]interface{}, 0)
  93. entry := make(map[string]interface{})
  94. for i:=0;i<len(result);i++{
  95. entry["id"] = result[i].Id
  96. entry["status"] = result[i].Status
  97. entry["connInfo"] = result[i].ConnInfo
  98. entry["sqlType"] = result[i].SqlType
  99. }
  100. tableData = append(tableData, entry)
  101. return &model.CommonList{total,tableData},nil
  102. }
  103. //更新
  104. func DatabaseUpdate()error{
  105. return nil
  106. }
  107. //查询
  108. func QueryTableList(dbId int)(*model.CommonList,error){
  109. dbInfo := getDataBaseInfoById(dbId)
  110. if dbInfo==nil{
  111. return nil,errors.New("数据库不存在!")
  112. }
  113. db := dbInfo.DbHandle
  114. dbName := dbInfo.DbName
  115. if dbInfo.SqlType == "mysql"{
  116. sql := "select SQL_CALC_FOUND_ROWS TABLE_NAME as name,TABLE_COMMENT as comments FROM information_schema.TABLES WHERE TABLE_SCHEMA=?"
  117. data,_,_,total,err := dao.GetData(db,sql,dbName)
  118. if err != nil {
  119. return nil,err
  120. }
  121. return &model.CommonList{
  122. Total: total,
  123. Items: data,
  124. },nil
  125. }else if dbInfo.SqlType == "dm8"{
  126. sql := fmt.Sprintf("select t.object_id, t.object_name as name, t.object_type as comments from dba_objects t where t.owner='%s' and t.object_type='TABLE'",dbName)
  127. data,_,_,_,err := dao.GetData(db,sql)
  128. if err != nil {
  129. return nil,err
  130. }
  131. return &model.CommonList{
  132. Total: len(data),
  133. Items: data,
  134. },nil
  135. }else if dbInfo.SqlType == "postgres"{
  136. sql := "select tablename as name,tableowner as comments from pg_tables where schemaname='public'"
  137. data,_,_,_,err := dao.GetData(db,sql)
  138. if err != nil {
  139. return nil,err
  140. }
  141. return &model.CommonList{
  142. Total: len(data),
  143. Items: data,
  144. },nil
  145. }else if dbInfo.SqlType == "kingbase"{
  146. //sql := "select SQL_CALC_FOUND_ROWS TABLE_NAME as name,TABLE_COMMENT as comments FROM information_schema.TABLES WHERE TABLE_SCHEMA=?"
  147. sql := "select tablename as name,tableowner as comments from pg_tables where schemaname='public'"
  148. data,_,_,_,err := dao.GetData(db,sql)
  149. if err != nil {
  150. return nil,err
  151. }
  152. return &model.CommonList{
  153. Total: len(data),
  154. Items: data,
  155. },nil
  156. }
  157. return nil,nil
  158. }
  159. func QueryTableColnList(dbId int, tbName string)(*model.CommonList,error){
  160. dbInfo := getDataBaseInfoById(dbId)
  161. if dbInfo==nil{
  162. return nil,errors.New("数据库不存在!")
  163. }
  164. db := dbInfo.DbHandle
  165. dbName := dbInfo.DbName
  166. if dbInfo.SqlType == "mysql"{
  167. sql := "select SQL_CALC_FOUND_ROWS COLUMN_NAME as name,COLUMN_COMMENT as comments,DATA_TYPE as type from information_schema.columns where table_schema=? and table_name=?"
  168. data,_,_,total,err := dao.GetData(db,sql,dbName,tbName)
  169. if err != nil {
  170. return nil,err
  171. }
  172. return &model.CommonList{
  173. Total: total,
  174. Items: data,
  175. },nil
  176. }else if dbInfo.SqlType == "dm8"{
  177. sql := fmt.Sprintf("select t.TABLE_NAME,t.COLUMN_NAME as name,t.COLUMN_ID,t.DATA_TYPE as type,t.DATA_LENGTH as dataLength,t.DATA_PRECISION as comments," +
  178. "t.DATA_SCALE,t.NULLABLE,t.DATA_DEFAULT from user_tab_columns t where t.TABLE_NAME = '%s' order by t.COLUMN_ID",tbName)
  179. data,_,_,_,err := dao.GetData(db,sql)
  180. if err != nil {
  181. return nil,err
  182. }
  183. return &model.CommonList{
  184. Total: len(data),
  185. Items: data,
  186. },nil
  187. }else if dbInfo.SqlType == "postgres"{
  188. sql := fmt.Sprintf("SELECT col_description(a.attrelid,a.attnum) as comments,pg_type.typname as type,a.attname as name, a.attnotnull as notnull" +
  189. " FROM pg_class as c,pg_attribute as a inner join pg_type on pg_type.oid = a.atttypid " +
  190. "where c.relname = '%s' and a.attrelid = c.oid and a.attnum>0",tbName)
  191. data,_,_,_,err := dao.GetData(db,sql)
  192. if err != nil {
  193. return nil,err
  194. }
  195. return &model.CommonList{
  196. Total: len(data),
  197. Items: data,
  198. },nil
  199. }else if dbInfo.SqlType == "kingbase" {
  200. sql := fmt.Sprintf("SELECT col_description(a.attrelid,a.attnum) as comments,pg_type.typname as type,a.attname as name, a.attnotnull as notnull" +
  201. " FROM pg_class as c,pg_attribute as a inner join pg_type on pg_type.oid = a.atttypid " +
  202. "where c.relname = '%s' and a.attrelid = c.oid and a.attnum>0",tbName)
  203. data,_,_,_,err := dao.GetData(db,sql)
  204. if err != nil {
  205. return nil,err
  206. }
  207. return &model.CommonList{
  208. Total: len(data),
  209. Items: data,
  210. },nil
  211. }
  212. return nil,nil
  213. }
  214. //删除数据库
  215. func DatabaseDel(id int) error{
  216. dbInfo := getDataBaseInfoById(id)
  217. if dbInfo==nil{
  218. return errors.New("数据库不存在!")
  219. }
  220. for i:=0;i<len(global.Databases);i++{
  221. if id == global.Databases[i].Id {
  222. if global.Databases[i].DbHandle != nil {
  223. global.Databases[i].DbHandle.Close()
  224. }
  225. //移除它
  226. global.Databases = append(global.Databases[:i], global.Databases[i+1:]...)
  227. break;
  228. }
  229. }
  230. return nil
  231. }
  232. //动态创建表
  233. func DatabaseCreate(req *model.DatabaseCreateRequest)error{
  234. dbInfo := getDataBaseInfoById(req.Id)
  235. if dbInfo==nil{
  236. return errors.New("数据库不存在!")
  237. }
  238. if dbInfo.Status == false {
  239. return errors.New(fmt.Sprintf("database:%s not connect",dbInfo.DbName))
  240. }
  241. findPK := false
  242. for n:=0;n<len(req.Columns);n++ {
  243. if req.Columns[n].IsPk == 1 {
  244. findPK = true
  245. break
  246. }
  247. }
  248. if req.DbType == "mysql"{
  249. args := make([]interface{},0)
  250. sql := "create table %s"
  251. args = append(args,req.TbName)
  252. sql +="(\n"
  253. for n:=0;n<len(req.Columns);n++{
  254. if req.Columns[n].DataLength > 0 {
  255. sql +="%s %s(%d)"
  256. args = append(args,req.Columns[n].ColName)
  257. args = append(args,req.Columns[n].DataType)
  258. args = append(args,req.Columns[n].DataLength)
  259. }else {
  260. sql +="%s %s"
  261. args = append(args,req.Columns[n].ColName)
  262. args = append(args,req.Columns[n].DataType)
  263. }
  264. if req.Columns[n].IsIncrement == 1 {
  265. sql += " AUTO_INCREMENT"
  266. }
  267. if req.Columns[n].IsRequired == 1 {
  268. sql += " not null"
  269. }
  270. if n == (len(req.Columns)-1){
  271. if findPK == false {
  272. sql += "\n"
  273. break
  274. }
  275. }
  276. sql += ",\n"
  277. }
  278. for n:=0;n<len(req.Columns);n++ {
  279. if req.Columns[n].IsPk == 1 {
  280. sql += "PRIMARY KEY (%s)"
  281. args = append(args,req.Columns[n].ColName)
  282. break
  283. }
  284. }
  285. sql += "\n)ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4;"
  286. sqlStr := fmt.Sprintf(sql,args...)
  287. fmt.Println("----------------")
  288. fmt.Println(sqlStr)
  289. fmt.Println("----------------")
  290. return dao.Exec(dbInfo.DbHandle,sqlStr)
  291. }else if req.DbType == "dm8"{
  292. args := make([]interface{},0)
  293. sql := "create table %s"
  294. args = append(args,req.TbName)
  295. sql +="(\n"
  296. for n:=0;n<len(req.Columns);n++{
  297. if req.Columns[n].DataLength > 0 {
  298. sql +="%s %s(%d)"
  299. args = append(args,req.Columns[n].ColName)
  300. args = append(args,req.Columns[n].DataType)
  301. args = append(args,req.Columns[n].DataLength)
  302. }else {
  303. sql +="%s %s"
  304. args = append(args,req.Columns[n].ColName)
  305. args = append(args,req.Columns[n].DataType)
  306. }
  307. if req.Columns[n].IsIncrement == 1 {
  308. sql += " IDENTITY(1,1)"
  309. }
  310. if req.Columns[n].IsRequired == 1 {
  311. sql += " not null"
  312. }
  313. if n == (len(req.Columns)-1){
  314. if findPK == false {
  315. sql += "\n"
  316. break
  317. }
  318. }
  319. sql += ",\n"
  320. }
  321. for n:=0;n<len(req.Columns);n++ {
  322. if req.Columns[n].IsPk == 1 {
  323. sql += "PRIMARY KEY (%s)"
  324. args = append(args,req.Columns[n].ColName)
  325. break
  326. }
  327. }
  328. sql += "\n)"
  329. sqlStr := fmt.Sprintf(sql,args...)
  330. fmt.Println("----------------")
  331. fmt.Println(sqlStr)
  332. fmt.Println("----------------")
  333. return dao.Exec(dbInfo.DbHandle,sqlStr)
  334. }else if req.DbType == "postgres" {
  335. args := make([]interface{},0)
  336. sql := "create table %s"
  337. args = append(args,req.TbName)
  338. sql +="(\n"
  339. for n:=0;n<len(req.Columns);n++{
  340. if req.Columns[n].DataLength > 0 {
  341. sql +="%s %s(%d)"
  342. args = append(args,req.Columns[n].ColName)
  343. args = append(args,req.Columns[n].DataType)
  344. args = append(args,req.Columns[n].DataLength)
  345. }else {
  346. sql +="%s %s"
  347. args = append(args,req.Columns[n].ColName)
  348. args = append(args,req.Columns[n].DataType)
  349. }
  350. if req.Columns[n].IsIncrement == 1 {
  351. //sql += " AUTO_INCREMENT"
  352. }
  353. if req.Columns[n].IsRequired == 1 {
  354. sql += " not null"
  355. }
  356. if n == (len(req.Columns)-1){
  357. if findPK == false {
  358. sql += "\n"
  359. break
  360. }
  361. }
  362. sql += ",\n"
  363. }
  364. for n:=0;n<len(req.Columns);n++ {
  365. if req.Columns[n].IsPk == 1 {
  366. sql += "PRIMARY KEY (%s)"
  367. args = append(args,req.Columns[n].ColName)
  368. break
  369. }
  370. }
  371. sql += "\n)"
  372. sqlStr := fmt.Sprintf(sql,args...)
  373. fmt.Println(sqlStr)
  374. return dao.Exec(dbInfo.DbHandle,sqlStr)
  375. }else if req.DbType == "kingbase" {
  376. args := make([]interface{},0)
  377. sql := "create table %s"
  378. args = append(args,req.TbName)
  379. sql +="(\n"
  380. for n:=0;n<len(req.Columns);n++{
  381. if req.Columns[n].DataLength > 0 {
  382. sql +="%s %s(%d)"
  383. args = append(args,req.Columns[n].ColName)
  384. args = append(args,req.Columns[n].DataType)
  385. args = append(args,req.Columns[n].DataLength)
  386. }else {
  387. sql +="%s %s"
  388. args = append(args,req.Columns[n].ColName)
  389. args = append(args,req.Columns[n].DataType)
  390. }
  391. if req.Columns[n].IsIncrement == 1 {
  392. //sql += " AUTO_INCREMENT"
  393. }
  394. if req.Columns[n].IsRequired == 1 {
  395. sql += " not null"
  396. }
  397. if n == (len(req.Columns)-1){
  398. if findPK == false {
  399. sql += "\n"
  400. break
  401. }
  402. }
  403. sql += ",\n"
  404. }
  405. for n:=0;n<len(req.Columns);n++ {
  406. if req.Columns[n].IsPk == 1 {
  407. sql += "PRIMARY KEY (%s)"
  408. args = append(args,req.Columns[n].ColName)
  409. break
  410. }
  411. }
  412. sql += "\n)"
  413. sqlStr := fmt.Sprintf(sql,args...)
  414. fmt.Println(sqlStr)
  415. return dao.Exec(dbInfo.DbHandle,sqlStr)
  416. }
  417. return errors.New("not support database type")
  418. }
  419. //动态添加索引
  420. func DatabaseAddIndex(req* model.TbIndex) error{
  421. dbInfo := getDataBaseInfoById(req.Id)
  422. if dbInfo==nil{
  423. return errors.New("数据库不存在!")
  424. }
  425. if dbInfo.Status == false {
  426. return errors.New(fmt.Sprintf("database:%s not connect",dbInfo.DbName))
  427. }
  428. if dbInfo.SqlType == "mysql"{
  429. //ALTER TABLE `taxi_dispatch`
  430. //ADD unique uix_taxi_dispatch_document_code(`document_code`);
  431. //
  432. args := make([]interface{},0)
  433. sql := "ALTER TABLE %s ADD UNIQUE KEY ("
  434. args = append(args,req.TbName)
  435. first := 1
  436. for i:=0;i<len(req.IndexArray);i++{
  437. if first == 0 {
  438. sql += ","
  439. }else{
  440. first = 0
  441. }
  442. sql += "%s"
  443. args = append(args,req.IndexArray[i])
  444. }
  445. sql += ")"
  446. sqlStr := fmt.Sprintf(sql,args...)
  447. return dao.Exec(dbInfo.DbHandle,sqlStr)
  448. }else if dbInfo.SqlType == "dm8"{
  449. index_name := fmt.Sprintf("%s_",req.TbName)
  450. for i:=0;i<len(req.IndexArray);i++ {
  451. index_name += fmt.Sprintf("%s_",req.IndexArray[i])
  452. }
  453. index_name += "idx"
  454. args := make([]interface{},0)
  455. sql := "create index %s on %s.%s("
  456. args = append(args,index_name)
  457. args = append(args,dbInfo.DbName)
  458. args = append(args,req.TbName)
  459. first := 1
  460. for i:=0;i<len(req.IndexArray);i++{
  461. if first == 0 {
  462. sql += ","
  463. }else{
  464. first = 0
  465. }
  466. sql += "%s"
  467. args = append(args,req.IndexArray[i])
  468. }
  469. sql += ")"
  470. sqlStr := fmt.Sprintf(sql,args...)
  471. return dao.Exec(dbInfo.DbHandle,sqlStr)
  472. }else if dbInfo.SqlType == "kingbase"{
  473. //create index username on tb_test(username)
  474. index_name := fmt.Sprintf("%s_",req.TbName)
  475. for i:=0;i<len(req.IndexArray);i++ {
  476. index_name += fmt.Sprintf("%s_",req.IndexArray[i])
  477. }
  478. index_name += "idx"
  479. args := make([]interface{},0)
  480. sql := "create index %s on %s("
  481. args = append(args,index_name)
  482. args = append(args,req.TbName)
  483. first := 1
  484. for i:=0;i<len(req.IndexArray);i++{
  485. if first == 0 {
  486. sql += ","
  487. }else{
  488. first = 0
  489. }
  490. sql += "%s"
  491. args = append(args,req.IndexArray[i])
  492. }
  493. sql += ")"
  494. sqlStr := fmt.Sprintf(sql,args...)
  495. return dao.Exec(dbInfo.DbHandle,sqlStr)
  496. }else if dbInfo.SqlType == "postgres" {
  497. index_name := fmt.Sprintf("%s_",req.TbName)
  498. for i:=0;i<len(req.IndexArray);i++ {
  499. index_name += fmt.Sprintf("%s_",req.IndexArray[i])
  500. }
  501. index_name += "idx"
  502. args := make([]interface{},0)
  503. sql := "create index %s on %s("
  504. args = append(args,index_name)
  505. args = append(args,req.TbName)
  506. first := 1
  507. for i:=0;i<len(req.IndexArray);i++{
  508. if first == 0 {
  509. sql += ","
  510. }else{
  511. first = 0
  512. }
  513. sql += "%s"
  514. args = append(args,req.IndexArray[i])
  515. }
  516. sql += ")"
  517. sqlStr := fmt.Sprintf(sql,args...)
  518. return dao.Exec(dbInfo.DbHandle,sqlStr)
  519. }
  520. return nil
  521. }
  522. //动态删除索引
  523. func DatabaseDeleteIndex(req* model.TbIndex)error{
  524. dbInfo := getDataBaseInfoById(req.Id)
  525. if dbInfo==nil{
  526. return errors.New("数据库不存在!")
  527. }
  528. if dbInfo.Status == false {
  529. return errors.New(fmt.Sprintf("database:%s not connect",dbInfo.DbName))
  530. }
  531. if dbInfo.SqlType == "mysql"{
  532. //ALTER TABLE `taxi_dispatch` DROP INDEX ix_document_code,
  533. //drop index idx_driver_id;
  534. args := make([]interface{},0)
  535. sql := "ALTER TABLE %s"
  536. args = append(args,req.TbName)
  537. first := 1
  538. for i:=0;i<len(req.IndexArray);i++{
  539. if first == 0 {
  540. sql += ","
  541. }else{
  542. first = 0
  543. }
  544. sql += " DROP INDEX %s"
  545. args = append(args,req.IndexArray[i])
  546. }
  547. sqlStr := fmt.Sprintf(sql,args...)
  548. return dao.Exec(dbInfo.DbHandle,sqlStr)
  549. }else if dbInfo.SqlType == "dm8"{
  550. index_name := fmt.Sprintf("%s_",req.TbName)
  551. for i:=0;i<len(req.IndexArray);i++ {
  552. index_name += fmt.Sprintf("%s_",req.IndexArray[i])
  553. }
  554. index_name += "idx"
  555. return dao.Exec(dbInfo.DbHandle,fmt.Sprintf("drop index %s",index_name))
  556. } else if dbInfo.SqlType == "kingbase" {
  557. index_name := fmt.Sprintf("%s_",req.TbName)
  558. for i:=0;i<len(req.IndexArray);i++ {
  559. index_name += fmt.Sprintf("%s_",req.IndexArray[i])
  560. }
  561. index_name += "idx"
  562. return dao.Exec(dbInfo.DbHandle,fmt.Sprintf("drop index %s",index_name))
  563. }else if dbInfo.SqlType == "postgres"{
  564. index_name := fmt.Sprintf("%s_",req.TbName)
  565. for i:=0;i<len(req.IndexArray);i++ {
  566. index_name += fmt.Sprintf("%s_",req.IndexArray[i])
  567. }
  568. index_name += "idx"
  569. return dao.Exec(dbInfo.DbHandle,fmt.Sprintf("drop index %s",index_name))
  570. }
  571. return nil
  572. }
  573. //动态插入数据
  574. func DatabaseInsert(req *model.ColnDataInsert)error{
  575. dbInfo := getDataBaseInfoById(req.Id)
  576. if dbInfo==nil{
  577. return errors.New("数据库不存在!")
  578. }
  579. if dbInfo.Status == false {
  580. return errors.New(fmt.Sprintf("database:%s not connect",dbInfo.DbName))
  581. }
  582. if len(req.ColNameArray) == 0 {
  583. return errors.New("请指定列名称.")
  584. }
  585. if len(req.TbName) == 0 {
  586. return errors.New("请指定数据表名称.")
  587. }
  588. if dbInfo.SqlType == "mysql" || dbInfo.SqlType=="kingbase" || dbInfo.SqlType == "postgres" || dbInfo.SqlType=="dm8" {
  589. fmtStr := ``
  590. sql := fmt.Sprintf("insert into `%s` (", req.TbName)
  591. var buffer bytes.Buffer
  592. for i := 0; i < len(req.ColNameArray); i++ {
  593. if i == len(req.ColNameArray)-1 {
  594. sql += fmt.Sprintf("`%s`) values ", req.ColNameArray[i])
  595. fmtStr += `"%s"`
  596. } else {
  597. sql += fmt.Sprintf("`%s`,", req.ColNameArray[i])
  598. fmtStr += `"%s",`
  599. }
  600. }
  601. if _, err := buffer.WriteString(sql); err != nil {
  602. return err
  603. }
  604. //rowWidth := len(req.ColNameArray)
  605. //n := len(req.Rows)/rowWidth
  606. //for i:=0;i<n;i++{
  607. // offset := i*rowWidth
  608. // if i == n-1 {
  609. // args := make([]interface{},0)
  610. // args = append(args,req.Rows[offset:])
  611. // buffer.WriteString(`(`)
  612. // buffer.WriteString(fmt.Sprintf(fmtStr, args...))
  613. // buffer.WriteString(`);`)
  614. // }else{
  615. // offset2 := (i+1)*rowWidth
  616. // args := make([]interface{},0)
  617. // args = append(args,req.Rows[offset:offset2])
  618. // buffer.WriteString(`(`)
  619. // buffer.WriteString(fmt.Sprintf(fmtStr, args...))
  620. // buffer.WriteString(`),`)
  621. // }
  622. //}
  623. for i := 0; i < len(req.Rows); i++ {
  624. if i == len(req.Rows)-1 {
  625. args := make([]interface{}, 0)
  626. for j := 0; j < len(req.Rows[i].List); j++ {
  627. args = append(args, req.Rows[i].List[j])
  628. }
  629. buffer.WriteString(`(`)
  630. buffer.WriteString(fmt.Sprintf(fmtStr, args...))
  631. buffer.WriteString(`);`)
  632. } else {
  633. args := make([]interface{}, 0)
  634. for j := 0; j < len(req.Rows[i].List); j++ {
  635. args = append(args, req.Rows[i].List[j])
  636. }
  637. buffer.WriteString(`(`)
  638. buffer.WriteString(fmt.Sprintf(fmtStr, args...))
  639. buffer.WriteString(`),`)
  640. }
  641. }
  642. //fmt.Println("insert data:",buffer.String())
  643. return dao.Exec(dbInfo.DbHandle,buffer.String())
  644. }
  645. return nil
  646. }
  647. //删除指定表的内容
  648. func DatabaseDeleteTable(id int, tbName string)error{
  649. dbInfo := getDataBaseInfoById(id)
  650. if dbInfo==nil{
  651. return errors.New("数据库不存在!")
  652. }
  653. if dbInfo.Status == false {
  654. return errors.New(fmt.Sprintf("database:%s not connect",dbInfo.DbName))
  655. }
  656. sql := fmt.Sprintf("delete from %s",tbName)
  657. return dao.Exec(dbInfo.DbHandle,sql)
  658. }
  659. //删除表
  660. func DatabaseDropTable(id int, tbName string)error{
  661. dbInfo := getDataBaseInfoById(id)
  662. if dbInfo==nil{
  663. return errors.New("数据库不存在!")
  664. }
  665. if dbInfo.Status == false {
  666. return errors.New(fmt.Sprintf("database:%s not connect",dbInfo.DbName))
  667. }
  668. sql := fmt.Sprintf("drop table %s",tbName)
  669. return dao.Exec(dbInfo.DbHandle,sql)
  670. }
  671. //查询数据库
  672. func DatabaseQuery(req *model.DbQuery)(*model.CommonList,error){
  673. dbInfo := getDataBaseInfoById(req.Id)
  674. if dbInfo==nil{
  675. return nil,errors.New("数据库不存在!")
  676. }
  677. if dbInfo.Status == false {
  678. return nil,errors.New(fmt.Sprintf("database:%s not connect",dbInfo.DbName))
  679. }
  680. if dbInfo.SqlType == "mysql" {
  681. sql := "select"
  682. if req.PageSize > 0 {
  683. sql += " SQL_CALC_FOUND_ROWS"
  684. }
  685. args := make([]interface{},0)
  686. first := 1
  687. if req.QueryColn == nil {
  688. sql += " *"
  689. }else{
  690. for i:=0;i<len(req.QueryColn);i++{
  691. if first == 0{
  692. sql += ","
  693. }else{
  694. first = 0
  695. }
  696. sql +=" %s"
  697. args = append(args,req.QueryColn[i])
  698. }
  699. if len(req.QueryColn) == 0 {
  700. sql += " *"
  701. }
  702. }
  703. sql += " from %s"
  704. args = append(args,req.TbName)
  705. where := 0
  706. for zz:=0;zz<len(req.Query);zz++{
  707. if len(req.Query[zz].ColName) > 0 {
  708. if where == 0 {
  709. sql += " where"
  710. where = 1
  711. }else{
  712. sql += " and"
  713. }
  714. if req.Query[zz].Cond == 0 {
  715. sql += " %s='%s'"
  716. }else if req.Query[zz].Cond == 1 {
  717. sql += " %s>'%s'"
  718. }else{
  719. sql += " %s<'%s'"
  720. }
  721. args = append(args,req.Query[zz].ColName)
  722. args = append(args,req.Query[zz].ColVal)
  723. }
  724. }
  725. if len(req.Sort.ColName) > 0 {
  726. if req.Sort.IsDesc == 1 {
  727. sql += " order by %s desc"
  728. }else {
  729. sql += " order by %s"
  730. }
  731. args = append(args,req.Sort.ColName)
  732. }
  733. if req.PageSize > 0 {
  734. sql += " limit %d,%d"
  735. args = append(args,(req.PageNo-1)*req.PageSize)
  736. args = append(args,req.PageSize)
  737. }
  738. sqlStr := fmt.Sprintf(sql,args...)
  739. fmt.Println("------------")
  740. fmt.Println(sqlStr)
  741. fmt.Println("------------")
  742. items,_,_,total,_ := dao.GetData(dbInfo.DbHandle,sqlStr)
  743. result := &model.CommonList{
  744. Total: total,
  745. Items: items,
  746. }
  747. return result,nil
  748. }else if dbInfo.SqlType == "dm8"{
  749. sql := "select"
  750. sqlCount := "select count(*)"
  751. args_count := make([]interface{},0)
  752. args := make([]interface{},0)
  753. first := 1
  754. if req.QueryColn == nil {
  755. sql += " *"
  756. }else{
  757. for i:=0;i<len(req.QueryColn);i++{
  758. if first == 0{
  759. sql += ","
  760. }else{
  761. first = 0
  762. }
  763. sql +=" %s"
  764. args = append(args,req.QueryColn[i])
  765. }
  766. if len(req.QueryColn) == 0 {
  767. sql += " *"
  768. }
  769. }
  770. sql += " from %s"
  771. sqlCount += " from %s"
  772. args = append(args,req.TbName)
  773. args_count = append(args_count,req.TbName)
  774. where := 0
  775. for zz:=0;zz<len(req.Query);zz++{
  776. if len(req.Query[zz].ColName) > 0 {
  777. if where == 0 {
  778. sql += " where"
  779. sqlCount += " where"
  780. where = 1
  781. }else{
  782. sql += " and"
  783. sqlCount += " and"
  784. }
  785. if req.Query[zz].Cond == 0 {
  786. sql += " %s='%s'"
  787. sqlCount += " %s='%s'"
  788. }else if req.Query[zz].Cond == 1 {
  789. sql += " %s>'%s'"
  790. sqlCount += " %s>'%s'"
  791. }else{
  792. sql += " %s<'%s'"
  793. sqlCount += " %s<'%s'"
  794. }
  795. args = append(args,req.Query[zz].ColName)
  796. args = append(args,req.Query[zz].ColVal)
  797. args_count = append(args_count,req.Query[zz].ColName)
  798. args_count = append(args_count,req.Query[zz].ColVal)
  799. }
  800. }
  801. sqlCntStr := fmt.Sprintf(sqlCount,args_count...)
  802. total,_:= dao.GetCount(dbInfo.DbHandle,sqlCntStr)
  803. if len(req.Sort.ColName) > 0 {
  804. if req.Sort.IsDesc == 1 {
  805. sql += " order by %s desc"
  806. }else {
  807. sql += " order by %s"
  808. }
  809. args = append(args,req.Sort.ColName)
  810. }
  811. if req.PageSize > 0 {
  812. sql += " limit %d,%d"
  813. args = append(args,req.PageSize)
  814. args = append(args,req.PageNo-1)
  815. }
  816. sqlStr := fmt.Sprintf(sql,args...)
  817. fmt.Println("------------")
  818. fmt.Println(sqlStr)
  819. fmt.Println("------------")
  820. items,_,_,_,_ := dao.GetData(dbInfo.DbHandle,sqlStr)
  821. result := &model.CommonList{
  822. Total: total,
  823. Items: items,
  824. }
  825. return result,nil
  826. }else if dbInfo.SqlType == "postgres" || dbInfo.SqlType == "kingbase"{
  827. sql := "select"
  828. sqlCount := "select count(*)"
  829. args_count := make([]interface{},0)
  830. args := make([]interface{},0)
  831. first := 1
  832. if req.QueryColn == nil {
  833. sql += " *"
  834. }else{
  835. for i:=0;i<len(req.QueryColn);i++{
  836. if first == 0{
  837. sql += ","
  838. }else{
  839. first = 0
  840. }
  841. sql +=" %s"
  842. args = append(args,req.QueryColn[i])
  843. }
  844. if len(req.QueryColn) == 0 {
  845. sql += " *"
  846. }
  847. }
  848. sql += " from %s"
  849. sqlCount += " from %s"
  850. args = append(args,req.TbName)
  851. args_count = append(args_count,req.TbName)
  852. where := 0
  853. for zz:=0;zz<len(req.Query);zz++{
  854. if len(req.Query[zz].ColName) > 0 {
  855. if where == 0 {
  856. sql += " where"
  857. sqlCount += " where"
  858. where = 1
  859. }else{
  860. sql += " and"
  861. sqlCount += " and"
  862. }
  863. if req.Query[zz].Cond == 0 {
  864. sql += " %s='%s'"
  865. sqlCount += " %s='%s'"
  866. }else if req.Query[zz].Cond == 1 {
  867. sql += " %s>'%s'"
  868. sqlCount += " %s>'%s'"
  869. }else{
  870. sql += " %s<'%s'"
  871. sqlCount += " %s<'%s'"
  872. }
  873. args = append(args,req.Query[zz].ColName)
  874. args = append(args,req.Query[zz].ColVal)
  875. args_count = append(args_count,req.Query[zz].ColName)
  876. args_count = append(args_count,req.Query[zz].ColVal)
  877. }
  878. }
  879. sqlCntStr := fmt.Sprintf(sqlCount,args_count...)
  880. total,_:= dao.GetCount(dbInfo.DbHandle,sqlCntStr)
  881. if len(req.Sort.ColName) > 0 {
  882. if req.Sort.IsDesc == 1 {
  883. sql += " order by %s desc"
  884. }else {
  885. sql += " order by %s"
  886. }
  887. args = append(args,req.Sort.ColName)
  888. }
  889. if req.PageSize > 0 {
  890. sql += " limit %d offset %d"
  891. args = append(args,req.PageSize)
  892. args = append(args,req.PageNo-1)
  893. }
  894. sqlStr := fmt.Sprintf(sql,args...)
  895. fmt.Println("------------")
  896. fmt.Println(sqlStr)
  897. fmt.Println("------------")
  898. items,_,_,_,_ := dao.GetData(dbInfo.DbHandle,sqlStr)
  899. result := &model.CommonList{
  900. Total: total,
  901. Items: items,
  902. }
  903. return result,nil
  904. }
  905. return nil,nil
  906. }
  907. //加载默认连接
  908. func LoadDefaultDbConnect(){
  909. if global.RedisClient == nil {
  910. global.SystemLogger.Log(logrus.ErrorLevel,"redis connect failed,load default db connect exit.")
  911. return
  912. }
  913. conn_list := dao.LoadConnectInfo()
  914. for i:=0;i<len(conn_list);i++{
  915. err := DatabaseConnect(&conn_list[i])
  916. if err != nil {
  917. global.SystemLogger.Log(logrus.ErrorLevel,fmt.Sprintf("connect db:%s failed,connect string:%s,error message:%s",
  918. conn_list[i].DbName,conn_list[i].Connection,err.Error()))
  919. }
  920. }
  921. }
  922. //查看数据库的连接状态
  923. func QueryDatabaseStatusByDbId(id int)(bool){
  924. for i:=0;i<len(global.Databases);i++{
  925. if id == global.Databases[i].Id {
  926. return global.Databases[i].Status
  927. }
  928. }
  929. return false
  930. }
  931. //更新连接
  932. func UpdateOfDbConnect(){
  933. if global.RedisClient == nil {
  934. global.SystemLogger.Log(logrus.ErrorLevel,"redis connect failed,load default db connect exit.")
  935. return
  936. }
  937. conn_list := dao.LoadConnectInfo()
  938. //移除数据
  939. for i:=0;i<len(global.Databases);i++{
  940. find := false
  941. for j:=0;j<len(conn_list);j++{
  942. if global.Databases[i].Id == conn_list[j].Id{
  943. find = true
  944. break
  945. }
  946. }
  947. if find == false {
  948. global.Databases = append(global.Databases[:i], global.Databases[i+1:]...)
  949. i = 0
  950. }
  951. }
  952. //追加数据
  953. for i:=0;i<len(conn_list);i++{
  954. if QueryDatabaseStatusByDbId(conn_list[i].Id) == true{
  955. continue
  956. }
  957. err := DatabaseConnect(&conn_list[i])
  958. if err != nil {
  959. global.SystemLogger.Log(logrus.ErrorLevel,fmt.Sprintf("connect db:%s failed,connect string:%s,error message:%s",
  960. conn_list[i].DbName,conn_list[i].Connection,err.Error()))
  961. }
  962. }
  963. }