1
0
mirror of https://github.com/ManyakRus/crud_generator.git synced 2024-12-22 00:36:41 +02:00
crud_generator/pkg/dbmeta/db_utils.go
Nikitin Aleksandr a6ea64ee3e новый
2023-10-24 18:03:04 +03:00

190 lines
4.4 KiB
Go

package dbmeta
import (
"bytes"
"fmt"
)
// PrimaryKeyCount return the number of primary keys in table
func PrimaryKeyCount(dbTable DbTableMeta) int {
primaryKeys := 0
for _, col := range dbTable.Columns() {
if col.IsPrimaryKey() {
primaryKeys++
}
}
return primaryKeys
}
// PrimaryKeyNames return the list of primary key names
func PrimaryKeyNames(dbTable DbTableMeta) []string {
primaryKeyNames := make([]string, 0)
for _, col := range dbTable.Columns() {
if col.IsPrimaryKey() {
primaryKeyNames = append(primaryKeyNames, col.Name())
}
}
return primaryKeyNames
}
// NonPrimaryKeyNames return the list of primary key names
func NonPrimaryKeyNames(dbTable DbTableMeta) []string {
primaryKeyNames := make([]string, 0)
for _, col := range dbTable.Columns() {
if !col.IsPrimaryKey() {
primaryKeyNames = append(primaryKeyNames, col.Name())
}
}
return primaryKeyNames
}
// GenerateDeleteSQL generate sql for a delete
func GenerateDeleteSQL(dbTable DbTableMeta) (string, error) {
primaryCnt := PrimaryKeyCount(dbTable)
if primaryCnt == 0 {
return "", fmt.Errorf("table %s does not have a primary key, cannot generate sql", dbTable.TableName())
}
buf := bytes.Buffer{}
buf.WriteString(fmt.Sprintf("DELETE FROM `%s` where", dbTable.TableName()))
addedKey := 1
for _, col := range dbTable.Columns() {
if col.IsPrimaryKey() {
buf.WriteString(fmt.Sprintf(" %s = ?", col.Name()))
addedKey++
if addedKey < primaryCnt {
buf.WriteString(" AND")
}
}
}
return buf.String(), nil
}
// GenerateUpdateSQL generate sql for a update
func GenerateUpdateSQL(dbTable DbTableMeta) (string, error) {
primaryCnt := PrimaryKeyCount(dbTable)
// nonPrimaryCnt := len(dbTable.Columns()) - primaryCnt
if primaryCnt == 0 {
return "", fmt.Errorf("table %s does not have a primary key, cannot generate sql", dbTable.TableName())
}
buf := bytes.Buffer{}
buf.WriteString(fmt.Sprintf("UPDATE `%s` set", dbTable.TableName()))
setCol := 1
for _, col := range dbTable.Columns() {
if !col.IsPrimaryKey() {
if setCol != 1 {
buf.WriteString(",")
}
buf.WriteString(fmt.Sprintf(" %s = ?", col.Name()))
setCol++
}
}
buf.WriteString(" WHERE")
addedKey := 0
for _, col := range dbTable.Columns() {
if col.IsPrimaryKey() {
buf.WriteString(fmt.Sprintf(" %s = ?", col.Name()))
setCol++
addedKey++
if addedKey < primaryCnt {
buf.WriteString(" AND")
}
}
}
return buf.String(), nil
}
// GenerateInsertSQL generate sql for a insert
func GenerateInsertSQL(dbTable DbTableMeta) (string, error) {
primaryCnt := PrimaryKeyCount(dbTable)
if primaryCnt == 0 {
return "", fmt.Errorf("table %s does not have a primary key, cannot generate sql", dbTable.TableName())
}
buf := bytes.Buffer{}
buf.WriteString(fmt.Sprintf("INSERT INTO `%s` (", dbTable.TableName()))
pastFirst := false
for _, col := range dbTable.Columns() {
if !col.IsAutoIncrement() {
if pastFirst {
buf.WriteString(", ")
}
buf.WriteString(fmt.Sprintf(" %s", col.Name()))
pastFirst = true
}
}
buf.WriteString(") values ( ")
pastFirst = false
pos := 1
for _, col := range dbTable.Columns() {
if !col.IsAutoIncrement() {
if pastFirst {
buf.WriteString(", ")
}
buf.WriteString(fmt.Sprintf("?"))
pos++
pastFirst = true
}
}
buf.WriteString(" )")
return buf.String(), nil
}
// GenerateSelectOneSQL generate sql for selecting one record
func GenerateSelectOneSQL(dbTable DbTableMeta) (string, error) {
primaryCnt := PrimaryKeyCount(dbTable)
if primaryCnt == 0 {
return "", fmt.Errorf("table %s does not have a primary key, cannot generate sql", dbTable.TableName())
}
buf := bytes.Buffer{}
buf.WriteString(fmt.Sprintf("SELECT * FROM `%s` WHERE ", dbTable.TableName()))
pastFirst := false
pos := 1
for _, col := range dbTable.Columns() {
if col.IsPrimaryKey() {
if pastFirst {
buf.WriteString(" AND ")
}
buf.WriteString(fmt.Sprintf("%s = ?", col.Name()))
pos++
pastFirst = true
}
}
return buf.String(), nil
}
// GenerateSelectMultiSQL generate sql for selecting multiple records
func GenerateSelectMultiSQL(dbTable DbTableMeta) (string, error) {
primaryCnt := PrimaryKeyCount(dbTable)
if primaryCnt == 0 {
return "", fmt.Errorf("table %s does not have a primary key, cannot generate sql", dbTable.TableName())
}
buf := bytes.Buffer{}
buf.WriteString(fmt.Sprintf("SELECT * FROM `%s`", dbTable.TableName()))
return buf.String(), nil
}