From 7c7054d2e24d022b8675e95333974011439394e7 Mon Sep 17 00:00:00 2001 From: Hein Date: Tue, 16 Dec 2025 18:10:40 +0200 Subject: [PATCH] So far so good --- CLAUDE.md | 151 + README.md | 2 + TODO.md | 7 +- assets/image/relspec1.jpg | Bin 0 -> 174984 bytes assets/image/relspec2.jpg | Bin 0 -> 82343 bytes assets/image/relspec3.jpg | Bin 0 -> 196910 bytes examples/bun/sql_core_masterprocess.go | 88 + examples/bun/sql_core_mastertask.go | 96 + examples/bun/sql_core_mastertype.go | 101 + examples/bun/sql_core_process.go | 83 + examples/dctx/example.dctx | 20994 ++++++++++++++++++++++ examples/gorm/sql_core_masterprocess.go | 88 + examples/gorm/sql_core_mastertask.go | 93 + examples/gorm/sql_core_mastertype.go | 98 + examples/gorm/sql_core_process.go | 80 + go.mod | 3 +- go.sum | 3 + pkg/models/flatview.go | 199 + pkg/models/interface.go | 6 + pkg/models/models.go | 194 +- pkg/models/summaryview.go | 99 + pkg/pgsql/datatypes.go | 154 + pkg/pgsql/keywords.go | 62 + pkg/readers/dbml/reader.go | 400 + pkg/readers/dctx/reader.go | 486 + pkg/readers/dctx/types.go | 84 + pkg/readers/drawdb/reader.go | 304 + pkg/readers/reader.go | 12 +- pkg/transform/transform.go | 42 +- pkg/writers/bun/name_converter.go | 284 + pkg/writers/bun/template_data.go | 250 + pkg/writers/bun/templates.go | 118 + pkg/writers/bun/type_mapper.go | 253 + pkg/writers/dbml/writer.go | 224 + pkg/writers/dctx/writer.go | 36 + pkg/writers/drawdb/types.go | 77 + pkg/writers/drawdb/writer.go | 349 + pkg/writers/gorm/name_converter.go | 284 + pkg/writers/gorm/template_data.go | 250 + pkg/writers/gorm/templates.go | 109 + pkg/writers/gorm/type_mapper.go | 335 + pkg/writers/gorm/writer.go | 324 + pkg/writers/gorm/writer_test.go | 243 + pkg/writers/writer.go | 12 +- 44 files changed, 27029 insertions(+), 48 deletions(-) create mode 100644 CLAUDE.md create mode 100644 assets/image/relspec1.jpg create mode 100644 assets/image/relspec2.jpg create mode 100644 assets/image/relspec3.jpg create mode 100755 examples/bun/sql_core_masterprocess.go create mode 100755 examples/bun/sql_core_mastertask.go create mode 100755 examples/bun/sql_core_mastertype.go create mode 100755 examples/bun/sql_core_process.go create mode 100755 examples/dctx/example.dctx create mode 100755 examples/gorm/sql_core_masterprocess.go create mode 100755 examples/gorm/sql_core_mastertask.go create mode 100755 examples/gorm/sql_core_mastertype.go create mode 100755 examples/gorm/sql_core_process.go create mode 100644 pkg/models/flatview.go create mode 100644 pkg/models/interface.go create mode 100644 pkg/models/summaryview.go create mode 100644 pkg/pgsql/datatypes.go create mode 100644 pkg/pgsql/keywords.go create mode 100644 pkg/readers/dbml/reader.go create mode 100644 pkg/readers/dctx/reader.go create mode 100644 pkg/readers/dctx/types.go create mode 100644 pkg/readers/drawdb/reader.go create mode 100644 pkg/writers/bun/name_converter.go create mode 100644 pkg/writers/bun/template_data.go create mode 100644 pkg/writers/bun/templates.go create mode 100644 pkg/writers/bun/type_mapper.go create mode 100644 pkg/writers/dbml/writer.go create mode 100644 pkg/writers/dctx/writer.go create mode 100644 pkg/writers/drawdb/types.go create mode 100644 pkg/writers/drawdb/writer.go create mode 100644 pkg/writers/gorm/name_converter.go create mode 100644 pkg/writers/gorm/template_data.go create mode 100644 pkg/writers/gorm/templates.go create mode 100644 pkg/writers/gorm/type_mapper.go create mode 100644 pkg/writers/gorm/writer.go create mode 100644 pkg/writers/gorm/writer_test.go diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..30c4ee5 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,151 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +RelSpec is a database relations specification tool that provides bidirectional conversion between various database schema formats. It reads database schemas from multiple sources (live databases, DBML, DCTX, DrawDB, etc.) and writes them to various formats (GORM, Bun, JSON, YAML, SQL, etc.). + +## Build Commands + +```bash +# Build the binary +make build # Outputs to build/relspec +go build -o build/relspec ./cmd/relspec + +# Run tests +make test # Run all tests with race detection and coverage +go test ./... # Run tests without coverage + +# Run a single test +go test -run TestName ./pkg/readers/dbml + +# Linting +make lint # Requires golangci-lint installed + +# Coverage report +make coverage # Generates coverage.html + +# Clean build artifacts +make clean + +# Install binary +make install # Installs to $GOPATH/bin +``` + +## Architecture + +### Core Data Model (pkg/models/) + +The central data structure is the `Database` model, which represents a complete database schema with this hierarchy: + +``` +Database +└── Schemas ([]Schema) + └── Tables ([]Table) + ├── Columns (map[string]Column) + ├── Constraints (map[string]Constraint) + ├── Indexes (map[string]Index) + └── Relationships (map[string]Relationship) +``` + +**Key architectural decisions:** +- Tables use **maps** for Columns, Constraints, Indexes, and Relationships (keyed by name for O(1) lookup) +- Schemas use **slices** for Tables (order matters for generation) +- All model types implement `SQLNamer` interface (returns lowercase SQL-safe names) +- Use `Init*` functions (e.g., `InitTable()`, `InitSchema()`) to create properly initialized models with empty maps/slices + +**Model Views:** +- `flatview.go`: Provides denormalized views with fully qualified names (e.g., `database.schema.table.column`) +- `summaryview.go`: Lightweight summary views with counts and essential metadata +- Use `.ToFlatColumns()`, `.ToSummary()` methods to convert between views + +### Reader/Writer Pattern (pkg/readers/, pkg/writers/) + +All readers and writers implement consistent interfaces with three granularity levels: + +```go +// Reader interface +type Reader interface { + ReadDatabase() (*models.Database, error) + ReadSchema() (*models.Schema, error) + ReadTable() (*models.Table, error) +} + +// Writer interface +type Writer interface { + WriteDatabase(db *models.Database) error + WriteSchema(schema *models.Schema) error + WriteTable(table *models.Table) error +} +``` + +**Important patterns:** +- Each format (dbml, dctx, drawdb, etc.) has its own `pkg/readers//` and `pkg/writers//` subdirectories +- Use `ReaderOptions` and `WriterOptions` structs for configuration (file paths, connection strings, metadata) +- Schema reading typically returns the first schema when reading from Database +- Table reading typically returns the first table when reading from Schema + +### Transformation Layer (pkg/transform/) + +The `Transformer` provides validation and normalization utilities. Note: validation methods are currently stubs (return nil) and need implementation when used. + +### Database-Specific Utilities (pkg/pgsql/) + +Contains PostgreSQL-specific helpers: +- `keywords.go`: SQL reserved keywords validation +- `datatypes.go`: PostgreSQL data type mappings and conversions + +## Development Patterns + +### Adding a New Reader + +1. Create `pkg/readers//` directory +2. Implement the `Reader` interface with all three methods +3. Create a `NewReader(options *readers.ReaderOptions)` constructor +4. Parse format-specific data into the canonical `models.Database` structure +5. Use `models.Init*()` functions to create properly initialized structs + +### Adding a New Writer + +1. Create `pkg/writers//` directory +2. Implement the `Writer` interface with all three methods +3. Create a `NewWriter(options *writers.WriterOptions)` constructor +4. Transform canonical models into format-specific output +5. Handle file writing or other I/O in the writer implementation + +### Working with Models + +```go +// Creating models - ALWAYS use Init functions +db := models.InitDatabase("mydb") +schema := models.InitSchema("public") +table := models.InitTable("users", "public") +column := models.InitColumn("id", "users", "public") + +// Adding to parent structures +schema.Tables = append(schema.Tables, table) +table.Columns["id"] = column // Use map key access for columns +db.Schemas = append(db.Schemas, schema) + +// Accessing primary keys and foreign keys +pk := table.GetPrimaryKey() // Returns *Column or nil +fks := table.GetForeignKeys() // Returns []*Constraint +``` + +## CLI Implementation Status + +The CLI in `cmd/relspec/main.go` is currently a placeholder showing usage examples. It will be implemented using the Cobra framework (already in dependencies). + +## Testing + +- Test files should be in the same package as the code they test +- Use table-driven tests for multiple test cases +- All tests run with race detection via `make test` +- Coverage reports available via `make coverage` + +## Module Information + +- Module path: `git.warky.dev/wdevs/relspecgo` +- Go version: 1.25.5 +- Uses Cobra for CLI, Viper for configuration diff --git a/README.md b/README.md index 4396a5a..dae78c0 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ RelSpec provides bidirectional conversion between various database specification - Transform legacy schema definitions (Clarion DCTX, XML, JSON) - Generate standardized specification files (JSON, YAML) +![1.00](./assets/image/relspec1.jpg) + ## Features ### Input Formats diff --git a/TODO.md b/TODO.md index 080d835..102556e 100644 --- a/TODO.md +++ b/TODO.md @@ -1,11 +1,6 @@ # RelSpec - TODO List -## Project Setup -- [ ] Initialize Go module (`go.mod`) -- [ ] Set up project directory structure -- [ ] Create `.editorconfig` for consistent formatting -- [ ] Add GitHub Actions for CI/CD -- [ ] Set up pre-commit hooks + ## Core Infrastructure - [ ] Define internal data model for database relations diff --git a/assets/image/relspec1.jpg b/assets/image/relspec1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..49952678fd54c6268ad6024805e215394590b40e GIT binary patch literal 174984 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

Jt=#*>)z@r3=@vpDhN(C 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

CD>iON~PbYV!? z$#pW>a@O!krX%%ll8C&C=N`bN*Q**W8del{V|ztz72@oRAvas;S6k;@+Wxms_6}Z& zfuX#psVZz>sB9rOa66~n>PWg}YMun}Hvjwsiu4uQirqHEAPW>`gKZCSoqNZ9XG$od z^(dw6TJ-OtclfsU=(WgaQ(8;7p&`Sa3Aky{)43b@rjm|PPd6@}4A~+7Ey83Fp|@;N zF_7nh<|2Y4t^dL}(_Bvof% zDwrv%D8{o$J6dJ-q#|3KNRGm|&B<`iH9My*SOTr$OPO(5jo>DCYMSlAwt{-y8B!ER zz;4!PU|~aw^tQTx%yeq%jd|!#ZD_=doLUx_DopY3mwT0#WW63c?I9CPbYipvXa3wE zP5IflrUV~Dn^id9AS;wqS=GCcW896({)>tN_KkKqu2KZQ0Eya8TFdfY_8C&B8v(f4 z#x9(JWa!Taq$W})1ND)!zxKTIiv$AYE;>_l--!2#*n+7u{{d=i7Wm$< z;HG~B@C+r5U+JggQuR{LmE_04;dU3bTvmbPU+2$63TxsEcwKU6a7{98Rn9>Pfc|Xv zHhHjLUr{Q%@BFPkX^nn_qT^9@X29bvTy_6+DtySREjZtuae2kz1z#Vq8zmJTZv(5< zEa1NpUXTmNjzx26GMJ$VAeT?<3!u#1BuA93@$u(B5X4fH|2-Sn&~Uz?kb)b)Dys|+ zIp92wxt$r}xo*ZxQL{oVj|CxqM-pRtZTaJ~=&1)eK(IcXB4`??DtHdbAmsU+zcDcY zVjuk6Eb%c`DJ(fWXQV)YyDaX$f5Q9OS?`Zqo4)_ml8LiXP(2@Q<3%J!JA26mvUQLY zd)@bcT?ElS_w1gBpXdL7E<}R9qm}PjVz%f{Ogdr%cLMP=FW=5&(VAM_m1NWj( zlAIB?g~#G;bQ6*BV;OoE6u6(YPtFM4^B8IGy)dh)3(~*y|6NRO0ndx)4+Jblp6_z6 zIz-Y5_u`jK{y*mb+xdSRet96$_ohC)oueu9W&j6Fd-Ann0BCcbr{kQU~gc%$&dYt7ARJDg7gbpDenDb?-voC*(O);?7B8gEPxl z?y~@t@SPRFslE22GQ_n~>5+1=bnJ@Qm%m(4?_H%&>uIPqP$cTZdQrkKfLriJy}Lh= zc~T-jEk3GSe8z{Dy!-Z;j8C+VR6b)rR!)fIUW?muHj$B2d4&@m6UZ;Eu*xOGf3~T_ zz}d*&&d0Pzyhr@gQhY^qSL?=*HLRj9==RnTzIx>>}tAJeWbi~zN*GS-R&2(+Ud%m zT-$fEU{~VTn8EJf;&bD{qZ3o=k>N+w^)cC*ykQ!AW=?hfd*bEm)JK!)P#LHXW4D#| zCxN8T+eXqZe?PWXZl>`Hx$AhU?Xfv$Ke_cMG0n+nnLl9vevm?BIb^f_=qp%qlNhtiR5o|2wRc8E8g&p4#%qKdz=5;AfAVF~r;utw7_aR(d6DXd>P z=uRp-Q!Vq8_aZi25p<1%M zeI1QnmG0q0y;|;L>(Wk3KoVQd?m?9&l6tZa>_bTK2VCyjr|SBc@BYQPcnVg%9(q|$ z)mtT!f5@F~d(eaGf1Xa_ajc9*C?BV>)=Fc=wN)oLj1fvkJW;oamsVJR6gP$-^f%7P z_fvbhl~I1b0v4n7t9G6S(-tHIu=@lV8{PeTfg(6}comz{V#Olgm4*$XMa<|o% zk|V`5!M7$KEtTzMF;htTsEtgsoP%kBSY(ci%V<#C6T8!8W6Q}326*T9cN+HUQoNs> z1=K)VD^J%K`G~ zi1)mU-|_ExA5%e+h4(5ip4S3lkmvS4W@*o64$r@9&036np&j<`?f$a_;qkw-Ao7LG z=LzqBZM}h~r5uZ)JU6(nI-u_7>2vr;PcY{|!1MnfWcW6ItQ@b6Q44?w{{OUq;|H$q z)wWTB7XYN_K7!p!Iei-iAjClA-}dwWYx%P&{;~FfiFLr~8{|A2D95vse}NbL zduR3MyR`veWPH#2A7lbLxWDzEtw~tgAm_mMdY*71n)vWO3XKjWQg%FZ=6ETqQ5oq@ ziz6};yD6_wZvdriKke)51xkla@``3sWp7fXw!@o7JxNW~AmtSXIrc1HMUD0Wv` z+sZeZ^h?IJsWyU4)hQbD%kW>Qef?|XkJf6D56KLoY7x`JD86C0S{fv!6k{^Q!Uta$ zug$b6SI|RyKzJf{)%))cI`kS_ys&9p)cB}k5OYwAa!8pp;^xQg2GJ@>(5)KXUr})m zGB)reZ((o<-TS3~!%bY|RJ>wY7{^{DWwYzyK% zR$Gjl#4S^0pWd){PjJxO$YK!cseCcN^jm6ZXbO+!#V>FlXx!cx(pMT@OU`In&V0+Q zRNlR?hvqr_8j&ow8609QnA|K^)7#$g70;(>#Z#CdY>_YR#DtkyaRtBMYc|7tOWzt> z22Tmo`IR;+Sw{!of!Y38+O~fU$z4MT%M~9~)lq7AJ64(^TF8}qSjY~=o2GgWwb>7w z@O9+|im$uk7arO>2?e<-k}Yu2RNkQm2|rnHE1Dv+MtjQ)R8d<0@G4PPpUf=q1Bd{z zNWPgbOs=^9BX+kEJM3yLK)duQ#Zq}h)4+Q(EMf;g!Yt}jvjNl`A9ng6V*!7BagH!d zFi5UC>UpDkuKDS*`qys$4Z-i$W)LlVZZ4dRvj;VCzswf(@q<r5udfkc0>7WhX}U-lDYRM%CC&&Z?`!jl zRh&=7+zz$=U`R>6%8$5|{iLa}=^pzwc3ZJ_MTBtw)Gl|>d6Ucv!DUbM?zWPb8}hZ7 zHNaeT$GP|}&4{yI9|L8ziH|uAe>syW4MBNPJ9Ii3rkcCCeA|3Do_NZ$9?mepwAl7w zM4|4LYifw(zTFhonY4bD9Z_3&8kttzgf2Lpn&RAh^nj^8HKWd{H3zrEW z$+%`80|8Og#?2fQX+g@_SH*feBYv1yqfD}jj3{l@R3xN%j)ePJ^0TgI7g^AF`-Kq* zOm13PGP!w{wem}2ORAPtSmcN@-7oqCHwO;|{I_of2o;@sc7=AT?z#npQzd-!1N*GM zRkN-i#lliYXE(NuW3?iwMLik7mxz=_ORl!x#un3J<`>2P0g=I5vYxyRF^_NPZ)Fa3 z1omyMA%iC}PDQ@O>?xVjRD|GkUtuO>P3PrFajMK_?Vo&U`LicraP&}#B3~iRUt%w_ zP(K8_7IP(1zjEVIlr=N51SKY8EwUu>kQPZ%Yk>mYoE=V z*adC1Eah0)b!ftNL|@B}+imNJ&*;;MXRqsw>y&C}pose^wQB8@ePw~|Loqs$rTz+6+fKbQSe`4bMj+-LIk#h2PC?H4B?;CwH z-8MMimnhsC75|$uN+Iza<}<$?`Uk_$I&nxpjiIPaPhil}WAy#)8cEd&{!|X$Y>?0AF&Z~P&U>)0hZ~-1l@V{;Ne{TApM?K&Fb2WxMv*7dO3k={Av=d<3 zMof}Kx~*!0vOQ_s*lvi268?Pg6+9LGs`nf+&q}6}+v#}T2GL<9)5-00^2t#Gy3daY z-&O_I8Nq-F&F9`*W~ShH2EafY`rO5k*Fp(SIDTFY6fQ9MOs`&LAe6H&73kzs!iVMM)Jd004nBja6pPLKChHeIopW{y6)Ilr>rxPt|GcjUIl9X3g zC)W4Y>S!~3CzCjt6(sE8ho!8d=uBfb7IWto!9!nQtWanY-eMujJbA6+{ow!*b0#Zb zL0xg_j@d6{ksgw6nY1Uq=EMq;KE?6BG5FRd#V2>v%NJhM`>N}Z*w%RBRzv!7lt*z#AX0rk#XZXIYI6mO3L-3kUB*y^%CU;)Gx$OQb)7k zp|Gl0C2I0`TSI$TK4)WDM0c)GIN7y~g08wO)+>tAhTv(ztbdU1T~GH3xrDIrp-tl< zw%})J8y)M!>uk2WCcj4I&qd{~68UBk=J=Q}@HrV%^%Tz%9eEePEYH%@G)*iJzoeHc zWU`K3VrRmeX8d!dI{0~*8)yBi^EJt~<#LCeXkxoMM&fIB_RBtyXi7yO6O%iK4J2p# zUNgppT+25JtMXoSwyC5|ai0Yhp2VHSUJx|!52#60RS)8w&t2TfB-8Q}S&ea%_E%Xb za}lEkiE-7To?6KaPe?o)wX0s+txoLgz}zJFv!ci_8N`RnN>;4d-5mbCGK(c^mtG;I zFMbRLcxs-#R`i8sApwhCY1evJrHf-R1L$XBh#lMsj4tY*_Dc0wd88}9Kgc#~wK+JB z-nSmdJx z)3Y8Io^*>8)JnWpY!yqK<`iI4`<|J%ufMsm52YThc{JXnBGx&(Y{ss`k4dT9kJ_ui zH1o#v^@XVRFtF&B%d-mPy;Bs~#;&7{yfM1;#p4z z)hHd34Ow5u)A%WT8>`hLdCFT^bzP?IZu<}pPolTD$l4Zj%mZGgb7)2(gP{TGw$XlP zNnv#gqdcoqtL6LoErWCY5vJuXcgYeAODb5EfMb$)pfug=_X@lP>ko2uX?N#B~)q*Z#p5YofBn zz!95T#=LEU0}<#rfj8fQK}mC^1pJ2+7OY2`5=Z)#g1jT-^s1a;>6yc?(=%f(Ui>LW zmRiag_s4pW*PJ%gy?S&YuIa5%0~%#tn>say_^9SmlK{(5+6{0-^Y!DJLb5yaeq@H$ zgxAokkNI3tTT;65d{Xl3J1!zL(DM_`cqhkX(Ni`c%viye!{UbDeO}Va5)-P?vv!Iu zvoEQw{i-c0%eX8Ye;5Zr4-TJJiuN7Jk=yf6bjU7@GjVnHs)ur)A9vQ*k4fzA`c*bS z4P%$n8mhx|lCPP~O~*K+kndppYo<+#{TyhwTLrJN=%ZlIA)`S}Rx*CEv4+ zL3}Ur!L60nVr)rbsNQaFj6-i@e!lq=_S*5TFM~uo(D+1N zo1h;XnD}a@5+xGIH>9f^VzSSj|qT=*b+D} zU}Xq-K0kQm1%NuMssKVzMC1HcY|Iv~2d3~qOH$tr>y8lX zCyjAf@DMr~<|VrTPyI_KbJ?TF>>6bu-XYh9AhNf-@e8^4V>JBxKOnve`O6kkoDv)s zhn_4hvr@!Z&H)iDz(`1oy0*On;LOvzD{OhL^!NKRC(=(L(h{h>Ne|Deg{jFBA#x9;7(I9ST%%x8MXRlHkEz zT8cw)2~wcNoeEY;%lA&d|K9iRyJKXW9QHYo!O7lhueIh{bEf%PnUqePr`Gs&w}^T= zx+6ql9-Lv1Z~G2Km5$Yzxoy8bY03|_qafq2?m5knz_{lwxU2mAgImK&sMHrI%oiwG zndr!w?3J{NI+sSl;ien3ckhzh$|q0bIlvZdW+}mh3QyeDx&JENZBJT4AAx1LbO-M-*N0)@neV%O;ecjDW^JV!ZucpVaEV zVKuvO02g1W!@qq*f7dpP z=a2J30Xk8Ncg}&bFU;-OFjrvxzeQZT6Oyu`&a|g8!*M{w;i34Qi{uf`L}2xJ-XXf9 z%7pd1N{L>&SCN~{Iv*o(tkiX&3*@mvPSyt+g^9{x1AYb zY3uA6(+6MQPo7;;APoc(^}YSy=zPn{eDc=F5946mX#5}0i|b$b!{cLZj)B5!gM>=l zJE|#a_&5)8OF}bZfGU$OhW{D`LXY&iCOOZdIs`qVuMY0T2ABZFxNqr)t46c21{6KY z*Rd7+Ba`C=LB%Q4f`RlRJb9Ef@>h_R=}zdO3VWGho}`a-}+zJrs88LKpOR5 zC?_^IhOi=DdpHG)Se)H9;bOZPcg5$m=)tVyQkyoF6^VsMoqti$P6P&E%Oh%MrQ*Cw zu!s~1y7LIS!-)pMi59J}HdOm1^)b4`Da1j7#~?|gM?F;-&q{Ed^Abpd^|7k9Y8uII z<%}@WsN0zNWX?)(TNI-LnJMUOxy3*w3m9J(9$krH@GjvNQ57X{;OQVP>CRKVExw(` zO#TXm^=@t3$lNe)E)81}e+>v&K+WX_pz!4-n5W`8+4kS)+1-ox@yb=0@cPp|ectBn z!19qn7KqRUlW<)%O&LZ+=4l_}r_<>2P^d9mIB;vweju#GQr~?P_9&z(D&eM2*FRSuq)Lk1@}hMXhI z#}5eFW=(3L!K7H>$xfd%n;5;Xf3X;LyPj%cNuWhI) zTvo~mE$4e$0dA=jSe%=7CJmPen0Cj{GTu0M*RA9g%~Z*N3L;{Sc?d1X<^RO^p)0Ce z>jR8(rQz-Vt(sekrbn6R%2}^5s_Cr~k@%S$yz$G54gx6NaPfT1}XxkH}ldwU1ff+iAv2I1gi$+_ckMaNUEy*yLr@% zEH(4lT3*FABSsegTR+3*zEa9)(|1z?RTLbwZv^>uNoj@{TJy%;b9&7Q;; zf2C*n?Uprc$KLx7NacmHtthtlb<>HZX3cIh>yw-MG1eRnOt2Qkh!3{Aj8V65&hUgp zuw@P^<*M4bBle5e@yiVVU#6k~PCb&5)eLdMeQ^B?hz<)Trtp*dtRvkN`4~fSuFhP0 zWmh`!S~kp&d1IXIwKj!cGS){ZDrsd;MHnPP_yy~Oni0G-yNrJB50^T`THZy^K^HVC zP%AzdhFf|iHOAXJVaHloT_`(rH_`Agf*SvOOqK+OJV=aJW8`MB-X+XDSABuDP0D)r z)84yNjAe#ef}FW^oKjrJ<#b5J(Z2fVolatqhozU#uf3(hoBi$KUEb=A`>Bz6Zq>6*`<^&)YAA47myF{F*)yPWy-+>bcDs&lX#2Nj#

g>uF+Lic9 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

&gvP`E9 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 literal 0 HcmV?d00001 diff --git a/assets/image/relspec3.jpg b/assets/image/relspec3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0ac0235f343dea4bcf0ee3e71915547c4bf76085 GIT binary patch literal 196910 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°Yxq|A#t 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

%iHx+7gRNTx@jZ~hR2P$3xW)#_dVY*+ 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 z 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 literal 0 HcmV?d00001 diff --git a/examples/bun/sql_core_masterprocess.go b/examples/bun/sql_core_masterprocess.go new file mode 100755 index 0000000..cca7bd3 --- /dev/null +++ b/examples/bun/sql_core_masterprocess.go @@ -0,0 +1,88 @@ +package models_bun + +import "fmt" +import db "github.com/bitechdev/GoCore/pkg/models" +import "github.com/bitechdev/GoCore/pkg/types" +import "github.com/uptrace/bun" +import resolvespec_common "github.com/bitechdev/ResolveSpec/pkg/common" + +//ModelCoreMasterprocess - Generated Table for Schema core +type ModelCoreMasterprocess struct { + bun.BaseModel `bun:"table:core.masterprocess,alias:masterprocess"` + Description resolvespec_common.SqlString `json:"description" bun:"description,type:citext,"` + GUID resolvespec_common.SqlUUID `json:"guid" bun:"guid,type:uuid,default:newid(),"` + Inactive resolvespec_common.SqlInt16 `json:"inactive" bun:"inactive,type:smallint,"` + Jsonvalue resolvespec_common.SqlJSONB `json:"jsonvalue" bun:"jsonvalue,type:jsonb,"` + Ridjsonschema resolvespec_common.SqlInt32 `json:"rid_jsonschema" bun:"rid_jsonschema,type:integer,"` + Ridmasterprocess resolvespec_common.SqlInt32 `json:"rid_masterprocess" bun:"rid_masterprocess,type:integer,pk,default:nextval('core.identity_masterprocess_rid_masterprocess'::regclass),"` + Ridmastertypehubtype resolvespec_common.SqlInt32 `json:"rid_mastertype_hubtype" bun:"rid_mastertype_hubtype,type:integer,"` + Ridmastertypeprocesstype resolvespec_common.SqlInt32 `json:"rid_mastertype_processtype" bun:"rid_mastertype_processtype,type:integer,"` + Ridprogrammodule resolvespec_common.SqlInt32 `json:"rid_programmodule" bun:"rid_programmodule,type:integer,"` + Sequenceno resolvespec_common.SqlInt32 `json:"sequenceno" bun:"sequenceno,type:integer,"` + Singleprocess resolvespec_common.SqlInt16 `json:"singleprocess" bun:"singleprocess,type:smallint,"` + Updatecnt int64 `json:"updatecnt" bun:"updatecnt,type:integer,default:0,"` + JSON *ModelCoreJsonschema `json:"JSON,omitempty" bun:"rel:has-one,join:rid_jsonschema=rid_jsonschema"` + MTT_RID_MASTERTYPE_HUBTYPE *ModelCoreMastertype `json:"MTT_RID_MASTERTYPE_HUBTYPE,omitempty" bun:"rel:has-one,join:rid_mastertype_hubtype=rid_mastertype"` + MTT_RID_MASTERTYPE_PROCESSTYPE *ModelCoreMastertype `json:"MTT_RID_MASTERTYPE_PROCESSTYPE,omitempty" bun:"rel:has-one,join:rid_mastertype_processtype=rid_mastertype"` + PMO *ModelPublicProgrammodule `json:"PMO,omitempty" bun:"rel:has-one,join:rid_programmodule=rid_programmodule"` + + MTL []*ModelCoreMastertask `json:"MTL,omitempty" bun:"rel:has-many,join:rid_masterprocess=rid_masterprocess"` + PRO []*ModelCoreProcess `json:"PRO,omitempty" bun:"rel:has-many,join:rid_masterprocess=rid_masterprocess"` + db.DBAdhocBuffer `json:",omitempty" bun:",scanonly"` + db.DBGetIDInterface `json:",omitempty" bun:"-"` + types.SQLTypable `json:",omitempty" bun:"-"` +} + +// TableName - Returns the table name for the object. +func (m ModelCoreMasterprocess) TableName() string { + return "core.masterprocess" +} + +// TableName - Returns the table name for the object. +func (m ModelCoreMasterprocess) TableNameOnly() string { + return "masterprocess" +} + +// SchemaName - Returns the schema name for the object. +func (m ModelCoreMasterprocess) SchemaName() string { + return "core" +} + +// GetID - ID interface +func (m ModelCoreMasterprocess) GetID() int64 { + return m.Ridmasterprocess.Int64() +} + +// GetIDStr - ID interface +func (m ModelCoreMasterprocess) GetIDStr() string { + return fmt.Sprintf("%d", m.Ridmasterprocess) +} + +// SetID - ID interface +func (m ModelCoreMasterprocess) SetID(newid int64) { + m.UpdateID(newid) +} + +func (m *ModelCoreMasterprocess) UpdateID(newid int64) { + m.Ridmasterprocess.FromString(fmt.Sprintf("%d", newid)) +} + +// GetIDName - ID interface +func (m ModelCoreMasterprocess) GetIDName() string { + return "rid_masterprocess" +} + +// GetPrefix - Returns a table prefix +func (m ModelCoreMasterprocess) GetPrefix() string { + return "MPR" +} + +// GetRowNumber - Returns the row number of the record +func (m ModelCoreMasterprocess) GetRowNumber() int64 { + return m.RowNumber +} + +// SetRowNumber - Set the row number of a record +func (m *ModelCoreMasterprocess) SetRowNumber(num int64) { + m.RowNumber = num +} diff --git a/examples/bun/sql_core_mastertask.go b/examples/bun/sql_core_mastertask.go new file mode 100755 index 0000000..bd2cd56 --- /dev/null +++ b/examples/bun/sql_core_mastertask.go @@ -0,0 +1,96 @@ +package models_bun + +import "fmt" +import db "github.com/bitechdev/GoCore/pkg/models" +import "github.com/bitechdev/GoCore/pkg/types" +import "github.com/uptrace/bun" +import resolvespec_common "github.com/bitechdev/ResolveSpec/pkg/common" + +//ModelCoreMastertask - Generated Table for Schema core +type ModelCoreMastertask struct { + bun.BaseModel `bun:"table:core.mastertask,alias:mastertask"` + Allactionsmustcomplete resolvespec_common.SqlInt16 `json:"allactionsmustcomplete" bun:"allactionsmustcomplete,type:smallint,"` + Condition resolvespec_common.SqlString `json:"condition" bun:"condition,type:citext,"` + Description resolvespec_common.SqlString `json:"description" bun:"description,type:citext,"` + Dueday resolvespec_common.SqlInt16 `json:"dueday" bun:"dueday,type:smallint,"` + Dueoption resolvespec_common.SqlString `json:"dueoption" bun:"dueoption,type:citext,"` + Escalation resolvespec_common.SqlInt32 `json:"escalation" bun:"escalation,type:integer,"` + Escalationoption resolvespec_common.SqlString `json:"escalationoption" bun:"escalationoption,type:citext,"` + GUID resolvespec_common.SqlUUID `json:"guid" bun:"guid,type:uuid,default:newid(),"` + Inactive resolvespec_common.SqlInt16 `json:"inactive" bun:"inactive,type:smallint,"` + Jsonvalue resolvespec_common.SqlJSONB `json:"jsonvalue" bun:"jsonvalue,type:jsonb,"` + Mastertasknote resolvespec_common.SqlString `json:"mastertasknote" bun:"mastertasknote,type:citext,"` + Repeatinterval resolvespec_common.SqlInt16 `json:"repeatinterval" bun:"repeatinterval,type:smallint,"` + Repeattype resolvespec_common.SqlString `json:"repeattype" bun:"repeattype,type:citext,"` + Ridjsonschema resolvespec_common.SqlInt32 `json:"rid_jsonschema" bun:"rid_jsonschema,type:integer,"` + Ridmasterprocess resolvespec_common.SqlInt32 `json:"rid_masterprocess" bun:"rid_masterprocess,type:integer,"` + Ridmastertask resolvespec_common.SqlInt32 `json:"rid_mastertask" bun:"rid_mastertask,type:integer,pk,default:nextval('core.identity_mastertask_rid_mastertask'::regclass),"` + Ridmastertypetasktype resolvespec_common.SqlInt32 `json:"rid_mastertype_tasktype" bun:"rid_mastertype_tasktype,type:integer,"` + Sequenceno resolvespec_common.SqlInt32 `json:"sequenceno" bun:"sequenceno,type:integer,"` + Singletask resolvespec_common.SqlInt16 `json:"singletask" bun:"singletask,type:smallint,"` + Startday resolvespec_common.SqlInt16 `json:"startday" bun:"startday,type:smallint,"` + Updatecnt int64 `json:"updatecnt" bun:"updatecnt,type:integer,default:0,"` + JSON *ModelCoreJsonschema `json:"JSON,omitempty" bun:"rel:has-one,join:rid_jsonschema=rid_jsonschema"` + MPR *ModelCoreMasterprocess `json:"MPR,omitempty" bun:"rel:has-one,join:rid_masterprocess=rid_masterprocess"` + MTT *ModelCoreMastertype `json:"MTT,omitempty" bun:"rel:has-one,join:rid_mastertype_tasktype=rid_mastertype"` + + MAL []*ModelCoreMastertaskitem `json:"MAL,omitempty" bun:"rel:has-many,join:rid_mastertask=rid_mastertask"` + TAS []*ModelCoreTasklist `json:"TAS,omitempty" bun:"rel:has-many,join:rid_mastertask=rid_mastertask"` + db.DBAdhocBuffer `json:",omitempty" bun:",scanonly"` + db.DBGetIDInterface `json:",omitempty" bun:"-"` + types.SQLTypable `json:",omitempty" bun:"-"` +} + +// TableName - Returns the table name for the object. +func (m ModelCoreMastertask) TableName() string { + return "core.mastertask" +} + +// TableName - Returns the table name for the object. +func (m ModelCoreMastertask) TableNameOnly() string { + return "mastertask" +} + +// SchemaName - Returns the schema name for the object. +func (m ModelCoreMastertask) SchemaName() string { + return "core" +} + +// GetID - ID interface +func (m ModelCoreMastertask) GetID() int64 { + return m.Ridmastertask.Int64() +} + +// GetIDStr - ID interface +func (m ModelCoreMastertask) GetIDStr() string { + return fmt.Sprintf("%d", m.Ridmastertask) +} + +// SetID - ID interface +func (m ModelCoreMastertask) SetID(newid int64) { + m.UpdateID(newid) +} + +func (m *ModelCoreMastertask) UpdateID(newid int64) { + m.Ridmastertask.FromString(fmt.Sprintf("%d", newid)) +} + +// GetIDName - ID interface +func (m ModelCoreMastertask) GetIDName() string { + return "rid_mastertask" +} + +// GetPrefix - Returns a table prefix +func (m ModelCoreMastertask) GetPrefix() string { + return "MTL" +} + +// GetRowNumber - Returns the row number of the record +func (m ModelCoreMastertask) GetRowNumber() int64 { + return m.RowNumber +} + +// SetRowNumber - Set the row number of a record +func (m *ModelCoreMastertask) SetRowNumber(num int64) { + m.RowNumber = num +} diff --git a/examples/bun/sql_core_mastertype.go b/examples/bun/sql_core_mastertype.go new file mode 100755 index 0000000..6c97d44 --- /dev/null +++ b/examples/bun/sql_core_mastertype.go @@ -0,0 +1,101 @@ +package models_bun + +import "fmt" +import db "github.com/bitechdev/GoCore/pkg/models" +import "github.com/bitechdev/GoCore/pkg/types" +import "github.com/uptrace/bun" +import resolvespec_common "github.com/bitechdev/ResolveSpec/pkg/common" + +//ModelCoreMastertype - Generated Table for Schema core +type ModelCoreMastertype struct { + bun.BaseModel `bun:"table:core.mastertype,alias:mastertype"` + Category resolvespec_common.SqlString `json:"category" bun:"category,type:citext,"` + Description resolvespec_common.SqlString `json:"description" bun:"description,type:citext,"` + Disableedit resolvespec_common.SqlInt16 `json:"disableedit" bun:"disableedit,type:smallint,"` + Forprefix resolvespec_common.SqlString `json:"forprefix" bun:"forprefix,type:citext,"` + GUID resolvespec_common.SqlUUID `json:"guid" bun:"guid,type:uuid,default:newid(),"` + Hidden resolvespec_common.SqlInt16 `json:"hidden" bun:"hidden,type:smallint,"` + Inactive resolvespec_common.SqlInt16 `json:"inactive" bun:"inactive,type:smallint,"` + Jsonvalue resolvespec_common.SqlJSONB `json:"jsonvalue" bun:"jsonvalue,type:jsonb,"` + Mastertype resolvespec_common.SqlString `json:"mastertype" bun:"mastertype,type:citext,"` + Note resolvespec_common.SqlString `json:"note" bun:"note,type:citext,"` + Ridmastertype resolvespec_common.SqlInt32 `json:"rid_mastertype" bun:"rid_mastertype,type:integer,pk,default:nextval('core.identity_mastertype_rid_mastertype'::regclass),"` + Ridparent resolvespec_common.SqlInt32 `json:"rid_parent" bun:"rid_parent,type:integer,"` + Updatecnt int64 `json:"updatecnt" bun:"updatecnt,type:integer,default:0,"` + MTT *ModelCoreMastertype `json:"MTT,omitempty" bun:"rel:has-one,join:rid_mastertype=rid_parent"` + + CMAT []*ModelCoreCommitem_Attachment `json:"CMAT,omitempty" bun:"rel:has-many,join:rid_mastertype=rid_mastertype"` + DVT []*ModelCoreDocumentvault `json:"DVT,omitempty" bun:"rel:has-many,join:rid_mastertype=rid_mastertype"` + EAD []*ModelCoreEmailaddresslist `json:"EAD,omitempty" bun:"rel:has-many,join:rid_mastertype=rid_mastertype"` + JSON []*ModelCoreJsonschema `json:"JSON,omitempty" bun:"rel:has-many,join:rid_mastertype=rid_mastertype"` + MAL []*ModelCoreMastertaskitem `json:"MAL,omitempty" bun:"rel:has-many,join:rid_mastertype=rid_mastertype_hubtype"` + MPR_RID_MASTERTYPE_HUBTYPE []*ModelCoreMasterprocess `json:"MPR_RID_MASTERTYPE_HUBTYPE,omitempty" bun:"rel:has-many,join:rid_mastertype=rid_mastertype_hubtype"` + MPR_RID_MASTERTYPE_PROCESSTYPE []*ModelCoreMasterprocess `json:"MPR_RID_MASTERTYPE_PROCESSTYPE,omitempty" bun:"rel:has-many,join:rid_mastertype=rid_mastertype_processtype"` + MSE []*ModelCoreMasterservice `json:"MSE,omitempty" bun:"rel:has-many,join:rid_mastertype=rid_mastertype_hubtype"` + MTL []*ModelCoreMastertask `json:"MTL,omitempty" bun:"rel:has-many,join:rid_mastertype=rid_mastertype_tasktype"` + MTT_RID_PARENT []*ModelCoreMastertype `json:"MTT_RID_PARENT,omitempty" bun:"rel:has-many,join:rid_mastertype=rid_parent"` + RUL []*ModelCoreMasterworkflowrule `json:"RUL,omitempty" bun:"rel:has-many,join:rid_mastertype=rid_mastertype_group"` + TAT_RID_MASTERTYPE_DOCGENTYPE []*ModelCoreMasterdoctemplate `json:"TAT_RID_MASTERTYPE_DOCGENTYPE,omitempty" bun:"rel:has-many,join:rid_mastertype=rid_mastertype_docgentype"` + TAT_RID_MASTERTYPE_DOCUMENT []*ModelCoreMasterdoctemplate `json:"TAT_RID_MASTERTYPE_DOCUMENT,omitempty" bun:"rel:has-many,join:rid_mastertype=rid_mastertype_document"` + TAT_RID_MASTERTYPE_GROUP []*ModelCoreMasterdoctemplate `json:"TAT_RID_MASTERTYPE_GROUP,omitempty" bun:"rel:has-many,join:rid_mastertype=rid_mastertype_group"` + TAT_RID_MASTERTYPE_HUBTYPE []*ModelCoreMasterdoctemplate `json:"TAT_RID_MASTERTYPE_HUBTYPE,omitempty" bun:"rel:has-many,join:rid_mastertype=rid_mastertype_hubtype"` + TAT_RID_MASTERTYPE_MERGETYPE []*ModelCoreMasterdoctemplate `json:"TAT_RID_MASTERTYPE_MERGETYPE,omitempty" bun:"rel:has-many,join:rid_mastertype=rid_mastertype_mergetype"` + TAT_RID_MASTERTYPE_TARGETTYPE []*ModelCoreMasterdoctemplate `json:"TAT_RID_MASTERTYPE_TARGETTYPE,omitempty" bun:"rel:has-many,join:rid_mastertype=rid_mastertype_targettype"` + db.DBAdhocBuffer `json:",omitempty" bun:",scanonly"` + db.DBGetIDInterface `json:",omitempty" bun:"-"` + types.SQLTypable `json:",omitempty" bun:"-"` +} + +// TableName - Returns the table name for the object. +func (m ModelCoreMastertype) TableName() string { + return "core.mastertype" +} + +// TableName - Returns the table name for the object. +func (m ModelCoreMastertype) TableNameOnly() string { + return "mastertype" +} + +// SchemaName - Returns the schema name for the object. +func (m ModelCoreMastertype) SchemaName() string { + return "core" +} + +// GetID - ID interface +func (m ModelCoreMastertype) GetID() int64 { + return m.Ridmastertype.Int64() +} + +// GetIDStr - ID interface +func (m ModelCoreMastertype) GetIDStr() string { + return fmt.Sprintf("%d", m.Ridmastertype) +} + +// SetID - ID interface +func (m ModelCoreMastertype) SetID(newid int64) { + m.UpdateID(newid) +} + +func (m *ModelCoreMastertype) UpdateID(newid int64) { + m.Ridmastertype.FromString(fmt.Sprintf("%d", newid)) +} + +// GetIDName - ID interface +func (m ModelCoreMastertype) GetIDName() string { + return "rid_mastertype" +} + +// GetPrefix - Returns a table prefix +func (m ModelCoreMastertype) GetPrefix() string { + return "MTT" +} + +// GetRowNumber - Returns the row number of the record +func (m ModelCoreMastertype) GetRowNumber() int64 { + return m.RowNumber +} + +// SetRowNumber - Set the row number of a record +func (m *ModelCoreMastertype) SetRowNumber(num int64) { + m.RowNumber = num +} diff --git a/examples/bun/sql_core_process.go b/examples/bun/sql_core_process.go new file mode 100755 index 0000000..17004ea --- /dev/null +++ b/examples/bun/sql_core_process.go @@ -0,0 +1,83 @@ +package models_bun + +import "fmt" +import db "github.com/bitechdev/GoCore/pkg/models" +import "github.com/bitechdev/GoCore/pkg/types" +import "github.com/uptrace/bun" +import resolvespec_common "github.com/bitechdev/ResolveSpec/pkg/common" + +//ModelCoreProcess - Generated Table for Schema core +type ModelCoreProcess struct { + bun.BaseModel `bun:"table:core.process,alias:process"` + Completedate resolvespec_common.SqlDate `json:"completedate" bun:"completedate,type:date,"` + Completetime types.CustomIntTime `json:"completetime" bun:"completetime,type:integer,"` + Description resolvespec_common.SqlString `json:"description" bun:"description,type:citext,"` + GUID resolvespec_common.SqlUUID `json:"guid" bun:"guid,type:uuid,default:newid(),"` + Ridcompleteuser resolvespec_common.SqlInt32 `json:"rid_completeuser" bun:"rid_completeuser,type:integer,"` + Ridhub resolvespec_common.SqlInt32 `json:"rid_hub" bun:"rid_hub,type:integer,"` + Ridmasterprocess resolvespec_common.SqlInt32 `json:"rid_masterprocess" bun:"rid_masterprocess,type:integer,"` + Ridprocess resolvespec_common.SqlInt32 `json:"rid_process" bun:"rid_process,type:integer,pk,default:nextval('core.identity_process_rid_process'::regclass),"` + Status resolvespec_common.SqlString `json:"status" bun:"status,type:citext,"` + Updatecnt int64 `json:"updatecnt" bun:"updatecnt,type:integer,default:0,"` + HUB *ModelCoreHub `json:"HUB,omitempty" bun:"rel:has-one,join:rid_hub=rid_hub"` + MPR *ModelCoreMasterprocess `json:"MPR,omitempty" bun:"rel:has-one,join:rid_masterprocess=rid_masterprocess"` + + TAS []*ModelCoreTasklist `json:"TAS,omitempty" bun:"rel:has-many,join:rid_process=rid_process"` + db.DBAdhocBuffer `json:",omitempty" bun:",scanonly"` + db.DBGetIDInterface `json:",omitempty" bun:"-"` + types.SQLTypable `json:",omitempty" bun:"-"` +} + +// TableName - Returns the table name for the object. +func (m ModelCoreProcess) TableName() string { + return "core.process" +} + +// TableName - Returns the table name for the object. +func (m ModelCoreProcess) TableNameOnly() string { + return "process" +} + +// SchemaName - Returns the schema name for the object. +func (m ModelCoreProcess) SchemaName() string { + return "core" +} + +// GetID - ID interface +func (m ModelCoreProcess) GetID() int64 { + return m.Ridprocess.Int64() +} + +// GetIDStr - ID interface +func (m ModelCoreProcess) GetIDStr() string { + return fmt.Sprintf("%d", m.Ridprocess) +} + +// SetID - ID interface +func (m ModelCoreProcess) SetID(newid int64) { + m.UpdateID(newid) +} + +func (m *ModelCoreProcess) UpdateID(newid int64) { + m.Ridprocess.FromString(fmt.Sprintf("%d", newid)) +} + +// GetIDName - ID interface +func (m ModelCoreProcess) GetIDName() string { + return "rid_process" +} + +// GetPrefix - Returns a table prefix +func (m ModelCoreProcess) GetPrefix() string { + return "PRO" +} + +// GetRowNumber - Returns the row number of the record +func (m ModelCoreProcess) GetRowNumber() int64 { + return m.RowNumber +} + +// SetRowNumber - Set the row number of a record +func (m *ModelCoreProcess) SetRowNumber(num int64) { + m.RowNumber = num +} diff --git a/examples/dctx/example.dctx b/examples/dctx/example.dctx new file mode 100755 index 0000000..e19b53d --- /dev/null +++ b/examples/dctx/example.dctx @@ -0,0 +1,20994 @@ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ + + + + + + + + + +
+ + +
+ + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + +
+ + +
+ + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + + + + + + + + + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ diff --git a/examples/gorm/sql_core_masterprocess.go b/examples/gorm/sql_core_masterprocess.go new file mode 100755 index 0000000..0cd5804 --- /dev/null +++ b/examples/gorm/sql_core_masterprocess.go @@ -0,0 +1,88 @@ +package models + +import ( + "fmt" + + db "github.com/bitechdev/GoCore/pkg/models" + "github.com/bitechdev/GoCore/pkg/types" +) + +// ModelCoreMasterprocess - Generated Table for Schema core +type ModelCoreMasterprocess struct { + Description string `json:"description" gorm:"Column:description;type:citext;"` + GUID types.NullableUUID `json:"guid" gorm:"Column:guid;type:uuid;default:newid();"` + Inactive types.SInt16 `json:"inactive" gorm:"Column:inactive;type:smallint;"` + Jsonvalue types.NullableJSONB `json:"jsonvalue" gorm:"Column:jsonvalue;type:jsonb;"` + Ridjsonschema types.ZNullInt32 `json:"rid_jsonschema" gorm:"Column:rid_jsonschema;type:integer;"` + Ridmasterprocess int32 `json:"rid_masterprocess" gorm:"Column:rid_masterprocess;type:integer;primaryKey;default:nextval('core.identity_masterprocess_rid_masterprocess'::regclass);"` + Ridmastertypehubtype types.ZNullInt32 `json:"rid_mastertype_hubtype" gorm:"Column:rid_mastertype_hubtype;type:integer;"` + Ridmastertypeprocesstype types.ZNullInt32 `json:"rid_mastertype_processtype" gorm:"Column:rid_mastertype_processtype;type:integer;"` + Ridprogrammodule types.ZNullInt32 `json:"rid_programmodule" gorm:"Column:rid_programmodule;type:integer;"` + Sequenceno types.ZNullInt32 `json:"sequenceno" gorm:"Column:sequenceno;type:integer;"` + Singleprocess types.SInt16 `json:"singleprocess" gorm:"Column:singleprocess;type:smallint;"` + Updatecnt int64 `json:"updatecnt" gorm:"Column:updatecnt;type:integer;default:0;"` + //JSON *ModelCoreJsonschema `json:"JSON,omitempty" gorm:"references:rid_jsonschema;foreignKey:rid_jsonschema;"` + MTT_RID_MASTERTYPE_HUBTYPE *ModelCoreMastertype `json:"MTT_RID_MASTERTYPE_HUBTYPE,omitempty" gorm:"references:rid_mastertype_hubtype;foreignKey:rid_mastertype;"` + MTT_RID_MASTERTYPE_PROCESSTYPE *ModelCoreMastertype `json:"MTT_RID_MASTERTYPE_PROCESSTYPE,omitempty" gorm:"references:rid_mastertype_processtype;foreignKey:rid_mastertype;"` + //PMO *ModelPublicProgrammodule `json:"PMO,omitempty" gorm:"references:rid_programmodule;foreignKey:rid_programmodule;"` + + MTL []*ModelCoreMastertask `json:"MTL,omitempty" gorm:"references:rid_masterprocess;foreignKey:rid_masterprocess;opt_c"` + PRO []*ModelCoreProcess `json:"PRO,omitempty" gorm:"references:rid_masterprocess;foreignKey:rid_masterprocess;opt_c"` + db.DBAdhocBuffer `json:",omitempty"` + db.DBGetIDInterface `json:",omitempty" gorm:"-"` + types.SQLTypable `json:",omitempty" gorm:"-"` +} + +// TableName - Returns the table name for the object. +func (m ModelCoreMasterprocess) TableName() string { + return "core.masterprocess" +} + +// TableName - Returns the table name for the object. +func (m ModelCoreMasterprocess) TableNameOnly() string { + return "masterprocess" +} + +// SchemaName - Returns the schema name for the object. +func (m ModelCoreMasterprocess) SchemaName() string { + return "core" +} + +// GetID - ID interface +func (m ModelCoreMasterprocess) GetID() int64 { + return int64(m.Ridmasterprocess) +} + +// GetIDStr - ID interface +func (m ModelCoreMasterprocess) GetIDStr() string { + return fmt.Sprintf("%d", m.Ridmasterprocess) +} + +// SetID - ID interface +func (m ModelCoreMasterprocess) SetID(newid int64) { + m.UpdateID(newid) +} + +func (m *ModelCoreMasterprocess) UpdateID(newid int64) { + m.Ridmasterprocess = int32(newid) +} + +// GetIDName - ID interface +func (m ModelCoreMasterprocess) GetIDName() string { + return "rid_masterprocess" +} + +// GetPrefix - Returns a table prefix +func (m ModelCoreMasterprocess) GetPrefix() string { + return "MPR" +} + +// GetRowNumber - Returns the row number of the record +func (m ModelCoreMasterprocess) GetRowNumber() int64 { + return m.RowNumber +} + +// SetRowNumber - Set the row number of a record +func (m *ModelCoreMasterprocess) SetRowNumber(num int64) { + m.RowNumber = num +} diff --git a/examples/gorm/sql_core_mastertask.go b/examples/gorm/sql_core_mastertask.go new file mode 100755 index 0000000..37ff525 --- /dev/null +++ b/examples/gorm/sql_core_mastertask.go @@ -0,0 +1,93 @@ +package models + +import "fmt" +import db "github.com/bitechdev/GoCore/pkg/models" +import "github.com/bitechdev/GoCore/pkg/types" + +//ModelCoreMastertask - Generated Table for Schema core +type ModelCoreMastertask struct { + Allactionsmustcomplete types.SInt16 `json:"allactionsmustcomplete" gorm:"Column:allactionsmustcomplete;type:smallint;"` + Condition string `json:"condition" gorm:"Column:condition;type:citext;"` + Description string `json:"description" gorm:"Column:description;type:citext;"` + Dueday types.SInt16 `json:"dueday" gorm:"Column:dueday;type:smallint;"` + Dueoption string `json:"dueoption" gorm:"Column:dueoption;type:citext;"` + Escalation types.ZNullInt32 `json:"escalation" gorm:"Column:escalation;type:integer;"` + Escalationoption string `json:"escalationoption" gorm:"Column:escalationoption;type:citext;"` + GUID types.NullableUUID `json:"guid" gorm:"Column:guid;type:uuid;default:newid();"` + Inactive types.SInt16 `json:"inactive" gorm:"Column:inactive;type:smallint;"` + Jsonvalue types.NullableJSONB `json:"jsonvalue" gorm:"Column:jsonvalue;type:jsonb;"` + Mastertasknote string `json:"mastertasknote" gorm:"Column:mastertasknote;type:citext;"` + Repeatinterval types.SInt16 `json:"repeatinterval" gorm:"Column:repeatinterval;type:smallint;"` + Repeattype string `json:"repeattype" gorm:"Column:repeattype;type:citext;"` + Ridjsonschema types.ZNullInt32 `json:"rid_jsonschema" gorm:"Column:rid_jsonschema;type:integer;"` + Ridmasterprocess types.ZNullInt32 `json:"rid_masterprocess" gorm:"Column:rid_masterprocess;type:integer;"` + Ridmastertask int32 `json:"rid_mastertask" gorm:"Column:rid_mastertask;type:integer;primaryKey;default:nextval('core.identity_mastertask_rid_mastertask'::regclass);"` + Ridmastertypetasktype types.ZNullInt32 `json:"rid_mastertype_tasktype" gorm:"Column:rid_mastertype_tasktype;type:integer;"` + Sequenceno types.ZNullInt32 `json:"sequenceno" gorm:"Column:sequenceno;type:integer;"` + Singletask types.SInt16 `json:"singletask" gorm:"Column:singletask;type:smallint;"` + Startday types.SInt16 `json:"startday" gorm:"Column:startday;type:smallint;"` + Updatecnt int64 `json:"updatecnt" gorm:"Column:updatecnt;type:integer;default:0;"` + JSON *ModelCoreJsonschema `json:"JSON,omitempty" gorm:"references:rid_jsonschema;foreignKey:rid_jsonschema;"` + MPR *ModelCoreMasterprocess `json:"MPR,omitempty" gorm:"references:rid_masterprocess;foreignKey:rid_masterprocess;"` + MTT *ModelCoreMastertype `json:"MTT,omitempty" gorm:"references:rid_mastertype_tasktype;foreignKey:rid_mastertype;"` + + MAL []*ModelCoreMastertaskitem `json:"MAL,omitempty" gorm:"references:rid_mastertask;foreignKey:rid_mastertask;opt_c"` + TAS []*ModelCoreTasklist `json:"TAS,omitempty" gorm:"references:rid_mastertask;foreignKey:rid_mastertask;opt_c"` + db.DBAdhocBuffer `json:",omitempty"` + db.DBGetIDInterface `json:",omitempty" gorm:"-"` + types.SQLTypable `json:",omitempty" gorm:"-"` +} + +// TableName - Returns the table name for the object. +func (m ModelCoreMastertask) TableName() string { + return "core.mastertask" +} + +// TableName - Returns the table name for the object. +func (m ModelCoreMastertask) TableNameOnly() string { + return "mastertask" +} + +// SchemaName - Returns the schema name for the object. +func (m ModelCoreMastertask) SchemaName() string { + return "core" +} + +// GetID - ID interface +func (m ModelCoreMastertask) GetID() int64 { + return int64(m.Ridmastertask) +} + +// GetIDStr - ID interface +func (m ModelCoreMastertask) GetIDStr() string { + return fmt.Sprintf("%d", m.Ridmastertask) +} + +// SetID - ID interface +func (m ModelCoreMastertask) SetID(newid int64) { + m.UpdateID(newid) +} + +func (m *ModelCoreMastertask) UpdateID(newid int64) { + m.Ridmastertask = int32(newid) +} + +// GetIDName - ID interface +func (m ModelCoreMastertask) GetIDName() string { + return "rid_mastertask" +} + +// GetPrefix - Returns a table prefix +func (m ModelCoreMastertask) GetPrefix() string { + return "MTL" +} + +// GetRowNumber - Returns the row number of the record +func (m ModelCoreMastertask) GetRowNumber() int64 { + return m.RowNumber +} + +// SetRowNumber - Set the row number of a record +func (m *ModelCoreMastertask) SetRowNumber(num int64) { + m.RowNumber = num +} diff --git a/examples/gorm/sql_core_mastertype.go b/examples/gorm/sql_core_mastertype.go new file mode 100755 index 0000000..cc0ffa0 --- /dev/null +++ b/examples/gorm/sql_core_mastertype.go @@ -0,0 +1,98 @@ +package models + +import "fmt" +import db "github.com/bitechdev/GoCore/pkg/models" +import "github.com/bitechdev/GoCore/pkg/types" + +//ModelCoreMastertype - Generated Table for Schema core +type ModelCoreMastertype struct { + Category string `json:"category" gorm:"Column:category;type:citext;"` + Description string `json:"description" gorm:"Column:description;type:citext;"` + Disableedit types.SInt16 `json:"disableedit" gorm:"Column:disableedit;type:smallint;"` + Forprefix string `json:"forprefix" gorm:"Column:forprefix;type:citext;"` + GUID types.NullableUUID `json:"guid" gorm:"Column:guid;type:uuid;default:newid();"` + Hidden types.SInt16 `json:"hidden" gorm:"Column:hidden;type:smallint;"` + Inactive types.SInt16 `json:"inactive" gorm:"Column:inactive;type:smallint;"` + Jsonvalue types.NullableJSONB `json:"jsonvalue" gorm:"Column:jsonvalue;type:jsonb;"` + Mastertype string `json:"mastertype" gorm:"Column:mastertype;type:citext;"` + Note string `json:"note" gorm:"Column:note;type:citext;"` + Ridmastertype int32 `json:"rid_mastertype" gorm:"Column:rid_mastertype;type:integer;primaryKey;default:nextval('core.identity_mastertype_rid_mastertype'::regclass);"` + Ridparent types.ZNullInt32 `json:"rid_parent" gorm:"Column:rid_parent;type:integer;"` + Updatecnt int64 `json:"updatecnt" gorm:"Column:updatecnt;type:integer;default:0;"` + MTT *ModelCoreMastertype `json:"MTT,omitempty" gorm:"references:rid_mastertype;foreignKey:rid_parent;"` + + CMAT []*ModelCoreCommitem_Attachment `json:"CMAT,omitempty" gorm:"references:rid_mastertype;foreignKey:rid_mastertype;opt_c"` + DVT []*ModelCoreDocumentvault `json:"DVT,omitempty" gorm:"references:rid_mastertype;foreignKey:rid_mastertype;opt_c"` + EAD []*ModelCoreEmailaddresslist `json:"EAD,omitempty" gorm:"references:rid_mastertype;foreignKey:rid_mastertype;opt_c"` + JSON []*ModelCoreJsonschema `json:"JSON,omitempty" gorm:"references:rid_mastertype;foreignKey:rid_mastertype;opt_c"` + MAL []*ModelCoreMastertaskitem `json:"MAL,omitempty" gorm:"references:rid_mastertype;foreignKey:rid_mastertype_hubtype;opt_c"` + MPR_RID_MASTERTYPE_HUBTYPE []*ModelCoreMasterprocess `json:"MPR_RID_MASTERTYPE_HUBTYPE,omitempty" gorm:"references:rid_mastertype;foreignKey:rid_mastertype_hubtype;opt_c"` + MPR_RID_MASTERTYPE_PROCESSTYPE []*ModelCoreMasterprocess `json:"MPR_RID_MASTERTYPE_PROCESSTYPE,omitempty" gorm:"references:rid_mastertype;foreignKey:rid_mastertype_processtype;opt_c"` + MSE []*ModelCoreMasterservice `json:"MSE,omitempty" gorm:"references:rid_mastertype;foreignKey:rid_mastertype_hubtype;opt_c"` + MTL []*ModelCoreMastertask `json:"MTL,omitempty" gorm:"references:rid_mastertype;foreignKey:rid_mastertype_tasktype;opt_c"` + MTT_RID_PARENT []*ModelCoreMastertype `json:"MTT_RID_PARENT,omitempty" gorm:"references:rid_mastertype;foreignKey:rid_parent;opt_c"` + RUL []*ModelCoreMasterworkflowrule `json:"RUL,omitempty" gorm:"references:rid_mastertype;foreignKey:rid_mastertype_group;opt_c"` + TAT_RID_MASTERTYPE_DOCGENTYPE []*ModelCoreMasterdoctemplate `json:"TAT_RID_MASTERTYPE_DOCGENTYPE,omitempty" gorm:"references:rid_mastertype;foreignKey:rid_mastertype_docgentype;opt_c"` + TAT_RID_MASTERTYPE_DOCUMENT []*ModelCoreMasterdoctemplate `json:"TAT_RID_MASTERTYPE_DOCUMENT,omitempty" gorm:"references:rid_mastertype;foreignKey:rid_mastertype_document;opt_c"` + TAT_RID_MASTERTYPE_GROUP []*ModelCoreMasterdoctemplate `json:"TAT_RID_MASTERTYPE_GROUP,omitempty" gorm:"references:rid_mastertype;foreignKey:rid_mastertype_group;opt_c"` + TAT_RID_MASTERTYPE_HUBTYPE []*ModelCoreMasterdoctemplate `json:"TAT_RID_MASTERTYPE_HUBTYPE,omitempty" gorm:"references:rid_mastertype;foreignKey:rid_mastertype_hubtype;opt_c"` + TAT_RID_MASTERTYPE_MERGETYPE []*ModelCoreMasterdoctemplate `json:"TAT_RID_MASTERTYPE_MERGETYPE,omitempty" gorm:"references:rid_mastertype;foreignKey:rid_mastertype_mergetype;opt_c"` + TAT_RID_MASTERTYPE_TARGETTYPE []*ModelCoreMasterdoctemplate `json:"TAT_RID_MASTERTYPE_TARGETTYPE,omitempty" gorm:"references:rid_mastertype;foreignKey:rid_mastertype_targettype;opt_c"` + db.DBAdhocBuffer `json:",omitempty"` + db.DBGetIDInterface `json:",omitempty" gorm:"-"` + types.SQLTypable `json:",omitempty" gorm:"-"` +} + +// TableName - Returns the table name for the object. +func (m ModelCoreMastertype) TableName() string { + return "core.mastertype" +} + +// TableName - Returns the table name for the object. +func (m ModelCoreMastertype) TableNameOnly() string { + return "mastertype" +} + +// SchemaName - Returns the schema name for the object. +func (m ModelCoreMastertype) SchemaName() string { + return "core" +} + +// GetID - ID interface +func (m ModelCoreMastertype) GetID() int64 { + return int64(m.Ridmastertype) +} + +// GetIDStr - ID interface +func (m ModelCoreMastertype) GetIDStr() string { + return fmt.Sprintf("%d", m.Ridmastertype) +} + +// SetID - ID interface +func (m ModelCoreMastertype) SetID(newid int64) { + m.UpdateID(newid) +} + +func (m *ModelCoreMastertype) UpdateID(newid int64) { + m.Ridmastertype = int32(newid) +} + +// GetIDName - ID interface +func (m ModelCoreMastertype) GetIDName() string { + return "rid_mastertype" +} + +// GetPrefix - Returns a table prefix +func (m ModelCoreMastertype) GetPrefix() string { + return "MTT" +} + +// GetRowNumber - Returns the row number of the record +func (m ModelCoreMastertype) GetRowNumber() int64 { + return m.RowNumber +} + +// SetRowNumber - Set the row number of a record +func (m *ModelCoreMastertype) SetRowNumber(num int64) { + m.RowNumber = num +} diff --git a/examples/gorm/sql_core_process.go b/examples/gorm/sql_core_process.go new file mode 100755 index 0000000..6947055 --- /dev/null +++ b/examples/gorm/sql_core_process.go @@ -0,0 +1,80 @@ +package models + +import "fmt" +import db "github.com/bitechdev/GoCore/pkg/models" +import "github.com/bitechdev/GoCore/pkg/types" + +//ModelCoreProcess - Generated Table for Schema core +type ModelCoreProcess struct { + Completedate types.CustomDate `json:"completedate" gorm:"Column:completedate;type:date;"` + Completetime types.CustomIntTime `json:"completetime" gorm:"Column:completetime;type:integer;"` + Description string `json:"description" gorm:"Column:description;type:citext;"` + GUID types.NullableUUID `json:"guid" gorm:"Column:guid;type:uuid;default:newid();"` + Ridcompleteuser types.ZNullInt32 `json:"rid_completeuser" gorm:"Column:rid_completeuser;type:integer;"` + Ridhub types.ZNullInt32 `json:"rid_hub" gorm:"Column:rid_hub;type:integer;"` + Ridmasterprocess types.ZNullInt32 `json:"rid_masterprocess" gorm:"Column:rid_masterprocess;type:integer;"` + Ridprocess int32 `json:"rid_process" gorm:"Column:rid_process;type:integer;primaryKey;default:nextval('core.identity_process_rid_process'::regclass);"` + Status string `json:"status" gorm:"Column:status;type:citext;"` + Updatecnt int64 `json:"updatecnt" gorm:"Column:updatecnt;type:integer;default:0;"` + HUB *ModelCoreHub `json:"HUB,omitempty" gorm:"references:rid_hub;foreignKey:rid_hub;"` + MPR *ModelCoreMasterprocess `json:"MPR,omitempty" gorm:"references:rid_masterprocess;foreignKey:rid_masterprocess;"` + + TAS []*ModelCoreTasklist `json:"TAS,omitempty" gorm:"references:rid_process;foreignKey:rid_process;opt_c"` + db.DBAdhocBuffer `json:",omitempty"` + db.DBGetIDInterface `json:",omitempty" gorm:"-"` + types.SQLTypable `json:",omitempty" gorm:"-"` +} + +// TableName - Returns the table name for the object. +func (m ModelCoreProcess) TableName() string { + return "core.process" +} + +// TableName - Returns the table name for the object. +func (m ModelCoreProcess) TableNameOnly() string { + return "process" +} + +// SchemaName - Returns the schema name for the object. +func (m ModelCoreProcess) SchemaName() string { + return "core" +} + +// GetID - ID interface +func (m ModelCoreProcess) GetID() int64 { + return int64(m.Ridprocess) +} + +// GetIDStr - ID interface +func (m ModelCoreProcess) GetIDStr() string { + return fmt.Sprintf("%d", m.Ridprocess) +} + +// SetID - ID interface +func (m ModelCoreProcess) SetID(newid int64) { + m.UpdateID(newid) +} + +func (m *ModelCoreProcess) UpdateID(newid int64) { + m.Ridprocess = int32(newid) +} + +// GetIDName - ID interface +func (m ModelCoreProcess) GetIDName() string { + return "rid_process" +} + +// GetPrefix - Returns a table prefix +func (m ModelCoreProcess) GetPrefix() string { + return "PRO" +} + +// GetRowNumber - Returns the row number of the record +func (m ModelCoreProcess) GetRowNumber() int64 { + return m.RowNumber +} + +// SetRowNumber - Set the row number of a record +func (m *ModelCoreProcess) SetRowNumber(num int64) { + m.RowNumber = num +} diff --git a/go.mod b/go.mod index 8f2601c..8899e25 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module git.warky.dev/wdevs/relspecgo go 1.25.5 require ( + github.com/bitechdev/ResolveSpec v0.0.108 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -16,7 +17,7 @@ require ( github.com/spf13/viper v1.21.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/sys v0.29.0 // indirect + golang.org/x/sys v0.35.0 // indirect golang.org/x/text v0.28.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index fcb638b..5b7b9c8 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/bitechdev/ResolveSpec v0.0.108 h1:0Asw4zt9SdBIDprNqtrGY67R4SovAPBmW2y1qRn/Wjw= +github.com/bitechdev/ResolveSpec v0.0.108/go.mod h1:/mtVcbXSBLNmWlTKeDnbQx18tmNqOnrpetpLOadLzqo= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= @@ -29,6 +31,7 @@ go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/pkg/models/flatview.go b/pkg/models/flatview.go new file mode 100644 index 0000000..c6cc3de --- /dev/null +++ b/pkg/models/flatview.go @@ -0,0 +1,199 @@ +package models + +import "fmt" + +// ============================================================================= +// Flat/Denormalized Views - Flattened structures with fully qualified names +// ============================================================================= + +// FlatColumn represents a column with full context in a single structure +type FlatColumn struct { + DatabaseName string `json:"database_name" yaml:"database_name" xml:"database_name"` + SchemaName string `json:"schema_name" yaml:"schema_name" xml:"schema_name"` + TableName string `json:"table_name" yaml:"table_name" xml:"table_name"` + ColumnName string `json:"column_name" yaml:"column_name" xml:"column_name"` + FullyQualifiedName string `json:"fully_qualified_name" yaml:"fully_qualified_name" xml:"fully_qualified_name"` // database.schema.table.column + Type string `json:"type" yaml:"type" xml:"type"` + Length int `json:"length,omitempty" yaml:"length,omitempty" xml:"length,omitempty"` + Precision int `json:"precision,omitempty" yaml:"precision,omitempty" xml:"precision,omitempty"` + Scale int `json:"scale,omitempty" yaml:"scale,omitempty" xml:"scale,omitempty"` + NotNull bool `json:"not_null" yaml:"not_null" xml:"not_null"` + Default any `json:"default,omitempty" yaml:"default,omitempty" xml:"default,omitempty"` + AutoIncrement bool `json:"auto_increment" yaml:"auto_increment" xml:"auto_increment"` + IsPrimaryKey bool `json:"is_primary_key" yaml:"is_primary_key" xml:"is_primary_key"` + Description string `json:"description,omitempty" yaml:"description,omitempty" xml:"description,omitempty"` + Comment string `json:"comment,omitempty" yaml:"comment,omitempty" xml:"comment,omitempty"` +} + +// ToFlatColumns converts a Database to a slice of FlatColumns +func (d *Database) ToFlatColumns() []*FlatColumn { + flatColumns := make([]*FlatColumn, 0) + + for _, schema := range d.Schemas { + for _, table := range schema.Tables { + for _, column := range table.Columns { + flatColumns = append(flatColumns, &FlatColumn{ + DatabaseName: d.Name, + SchemaName: schema.Name, + TableName: table.Name, + ColumnName: column.Name, + FullyQualifiedName: fmt.Sprintf("%s.%s.%s.%s", d.Name, schema.Name, table.Name, column.Name), + Type: column.Type, + Length: column.Length, + Precision: column.Precision, + Scale: column.Scale, + NotNull: column.NotNull, + Default: column.Default, + AutoIncrement: column.AutoIncrement, + IsPrimaryKey: column.IsPrimaryKey, + Description: column.Description, + Comment: column.Comment, + }) + } + } + } + + return flatColumns +} + +// FlatTable represents a table with full context +type FlatTable struct { + DatabaseName string `json:"database_name" yaml:"database_name" xml:"database_name"` + SchemaName string `json:"schema_name" yaml:"schema_name" xml:"schema_name"` + TableName string `json:"table_name" yaml:"table_name" xml:"table_name"` + FullyQualifiedName string `json:"fully_qualified_name" yaml:"fully_qualified_name" xml:"fully_qualified_name"` // database.schema.table + Description string `json:"description,omitempty" yaml:"description,omitempty" xml:"description,omitempty"` + Comment string `json:"comment,omitempty" yaml:"comment,omitempty" xml:"comment,omitempty"` + Tablespace string `json:"tablespace,omitempty" yaml:"tablespace,omitempty" xml:"tablespace,omitempty"` + ColumnCount int `json:"column_count" yaml:"column_count" xml:"column_count"` + ConstraintCount int `json:"constraint_count" yaml:"constraint_count" xml:"constraint_count"` + IndexCount int `json:"index_count" yaml:"index_count" xml:"index_count"` +} + +// ToFlatTables converts a Database to a slice of FlatTables +func (d *Database) ToFlatTables() []*FlatTable { + flatTables := make([]*FlatTable, 0) + + for _, schema := range d.Schemas { + for _, table := range schema.Tables { + flatTables = append(flatTables, &FlatTable{ + DatabaseName: d.Name, + SchemaName: schema.Name, + TableName: table.Name, + FullyQualifiedName: fmt.Sprintf("%s.%s.%s", d.Name, schema.Name, table.Name), + Description: table.Description, + Comment: table.Comment, + Tablespace: table.Tablespace, + ColumnCount: len(table.Columns), + ConstraintCount: len(table.Constraints), + IndexCount: len(table.Indexes), + }) + } + } + + return flatTables +} + +// FlatConstraint represents a constraint with full context +type FlatConstraint struct { + DatabaseName string `json:"database_name" yaml:"database_name" xml:"database_name"` + SchemaName string `json:"schema_name" yaml:"schema_name" xml:"schema_name"` + TableName string `json:"table_name" yaml:"table_name" xml:"table_name"` + ConstraintName string `json:"constraint_name" yaml:"constraint_name" xml:"constraint_name"` + FullyQualifiedName string `json:"fully_qualified_name" yaml:"fully_qualified_name" xml:"fully_qualified_name"` // database.schema.table.constraint + Type ConstraintType `json:"type" yaml:"type" xml:"type"` + Columns []string `json:"columns" yaml:"columns" xml:"columns"` + Expression string `json:"expression,omitempty" yaml:"expression,omitempty" xml:"expression,omitempty"` + ReferencedTable string `json:"referenced_table,omitempty" yaml:"referenced_table,omitempty" xml:"referenced_table,omitempty"` + ReferencedSchema string `json:"referenced_schema,omitempty" yaml:"referenced_schema,omitempty" xml:"referenced_schema,omitempty"` + ReferencedColumns []string `json:"referenced_columns,omitempty" yaml:"referenced_columns,omitempty" xml:"referenced_columns,omitempty"` + ReferencedFQN string `json:"referenced_fqn,omitempty" yaml:"referenced_fqn,omitempty" xml:"referenced_fqn,omitempty"` // Fully qualified reference + OnDelete string `json:"on_delete,omitempty" yaml:"on_delete,omitempty" xml:"on_delete,omitempty"` + OnUpdate string `json:"on_update,omitempty" yaml:"on_update,omitempty" xml:"on_update,omitempty"` +} + +// ToFlatConstraints converts a Database to a slice of FlatConstraints +func (d *Database) ToFlatConstraints() []*FlatConstraint { + flatConstraints := make([]*FlatConstraint, 0) + + for _, schema := range d.Schemas { + for _, table := range schema.Tables { + for _, constraint := range table.Constraints { + fc := &FlatConstraint{ + DatabaseName: d.Name, + SchemaName: schema.Name, + TableName: table.Name, + ConstraintName: constraint.Name, + FullyQualifiedName: fmt.Sprintf("%s.%s.%s.%s", d.Name, schema.Name, table.Name, constraint.Name), + Type: constraint.Type, + Columns: constraint.Columns, + Expression: constraint.Expression, + ReferencedTable: constraint.ReferencedTable, + ReferencedSchema: constraint.ReferencedSchema, + ReferencedColumns: constraint.ReferencedColumns, + OnDelete: constraint.OnDelete, + OnUpdate: constraint.OnUpdate, + } + + // Build fully qualified reference name for foreign keys + if constraint.Type == ForeignKeyConstraint && constraint.ReferencedTable != "" { + fc.ReferencedFQN = fmt.Sprintf("%s.%s.%s", d.Name, constraint.ReferencedSchema, constraint.ReferencedTable) + } + + flatConstraints = append(flatConstraints, fc) + } + } + } + + return flatConstraints +} + +// FlatRelationship represents a relationship with full context +type FlatRelationship struct { + DatabaseName string `json:"database_name" yaml:"database_name" xml:"database_name"` + RelationshipName string `json:"relationship_name" yaml:"relationship_name" xml:"relationship_name"` + Type RelationType `json:"type" yaml:"type" xml:"type"` + FromFQN string `json:"from_fqn" yaml:"from_fqn" xml:"from_fqn"` // database.schema.table + ToFQN string `json:"to_fqn" yaml:"to_fqn" xml:"to_fqn"` // database.schema.table + FromTable string `json:"from_table" yaml:"from_table" xml:"from_table"` + FromSchema string `json:"from_schema" yaml:"from_schema" xml:"from_schema"` + ToTable string `json:"to_table" yaml:"to_table" xml:"to_table"` + ToSchema string `json:"to_schema" yaml:"to_schema" xml:"to_schema"` + ForeignKey string `json:"foreign_key" yaml:"foreign_key" xml:"foreign_key"` + ThroughTableFQN string `json:"through_table_fqn,omitempty" yaml:"through_table_fqn,omitempty" xml:"through_table_fqn,omitempty"` + Description string `json:"description,omitempty" yaml:"description,omitempty" xml:"description,omitempty"` +} + +// ToFlatRelationships converts a Database to a slice of FlatRelationships +func (d *Database) ToFlatRelationships() []*FlatRelationship { + flatRelationships := make([]*FlatRelationship, 0) + + for _, schema := range d.Schemas { + for _, table := range schema.Tables { + for _, relationship := range table.Relationships { + fr := &FlatRelationship{ + DatabaseName: d.Name, + RelationshipName: relationship.Name, + Type: relationship.Type, + FromFQN: fmt.Sprintf("%s.%s.%s", d.Name, relationship.FromSchema, relationship.FromTable), + ToFQN: fmt.Sprintf("%s.%s.%s", d.Name, relationship.ToSchema, relationship.ToTable), + FromTable: relationship.FromTable, + FromSchema: relationship.FromSchema, + ToTable: relationship.ToTable, + ToSchema: relationship.ToSchema, + ForeignKey: relationship.ForeignKey, + Description: relationship.Description, + } + + // Add through table FQN for many-to-many relationships + if relationship.ThroughTable != "" { + fr.ThroughTableFQN = fmt.Sprintf("%s.%s.%s", d.Name, relationship.ThroughSchema, relationship.ThroughTable) + } + + flatRelationships = append(flatRelationships, fr) + } + } + } + + return flatRelationships +} diff --git a/pkg/models/interface.go b/pkg/models/interface.go new file mode 100644 index 0000000..525fb96 --- /dev/null +++ b/pkg/models/interface.go @@ -0,0 +1,6 @@ +package models + +// SQLNamer interface for types that can provide a normalized sql name +type SQLNamer interface { + SQLName() string +} diff --git a/pkg/models/models.go b/pkg/models/models.go index 6744acd..752c8a2 100644 --- a/pkg/models/models.go +++ b/pkg/models/models.go @@ -1,5 +1,7 @@ package models +import "strings" + type DatabaseType string const ( @@ -11,24 +13,39 @@ const ( // Database represents the complete database schema type Database struct { Name string `json:"name" yaml:"name"` + Description string `json:"description,omitempty" yaml:"description,omitempty" xml:"description,omitempty"` Schemas []*Schema `json:"schemas" yaml:"schemas" xml:"schemas"` Comment string `json:"comment,omitempty" yaml:"comment,omitempty" xml:"comment,omitempty"` DatabaseType DatabaseType `json:"database_type,omitempty" yaml:"database_type,omitempty" xml:"database_type,omitempty"` DatabaseVersion string `json:"database_version,omitempty" yaml:"database_version,omitempty" xml:"database_version,omitempty"` + SourceFormat string `json:"source_format,omitempty" yaml:"source_format,omitempty" xml:"source_format,omitempty"` //Source Format of the database. +} + +// SQLNamer returns the database name in lowercase +func (d *Database) SQLName() string { + return strings.ToLower(d.Name) } type Schema struct { - Name string `json:"name" yaml:"name" xml:"name"` - Tables []*Table `json:"tables" yaml:"tables" xml:"-"` - Owner string `json:"owner" yaml:"owner" xml:"owner"` - Permissions map[string]string `json:"permissions,omitempty" yaml:"permissions,omitempty" xml:"-"` - Comment string `json:"comment,omitempty" yaml:"comment,omitempty" xml:"comment,omitempty"` - Metadata map[string]interface{} `json:"metadata,omitempty" yaml:"metadata,omitempty" xml:"-"` - Scripts []*Script `json:"scripts,omitempty" yaml:"scripts,omitempty" xml:"scripts,omitempty"` + Name string `json:"name" yaml:"name" xml:"name"` + Description string `json:"description,omitempty" yaml:"description,omitempty" xml:"description,omitempty"` + Tables []*Table `json:"tables" yaml:"tables" xml:"-"` + Owner string `json:"owner" yaml:"owner" xml:"owner"` + Permissions map[string]string `json:"permissions,omitempty" yaml:"permissions,omitempty" xml:"-"` + Comment string `json:"comment,omitempty" yaml:"comment,omitempty" xml:"comment,omitempty"` + Metadata map[string]any `json:"metadata,omitempty" yaml:"metadata,omitempty" xml:"-"` + Scripts []*Script `json:"scripts,omitempty" yaml:"scripts,omitempty" xml:"scripts,omitempty"` + Sequence uint `json:"sequence,omitempty" yaml:"sequence,omitempty" xml:"sequence,omitempty"` +} + +// SQLName returns the schema name in lowercase +func (d *Schema) SQLName() string { + return strings.ToLower(d.Name) } type Table struct { Name string `json:"name" yaml:"name" xml:"name"` + Description string `json:"description,omitempty" yaml:"description,omitempty" xml:"description,omitempty"` Schema string `json:"schema" yaml:"schema" xml:"schema"` Columns map[string]*Column `json:"columns" yaml:"columns" xml:"-"` Constraints map[string]*Constraint `json:"constraints" yaml:"constraints" xml:"-"` @@ -36,7 +53,13 @@ type Table struct { Relationships map[string]*Relationship `json:"relationships,omitempty" yaml:"relationships,omitempty" xml:"-"` Comment string `json:"comment,omitempty" yaml:"comment,omitempty" xml:"comment,omitempty"` Tablespace string `json:"tablespace,omitempty" yaml:"tablespace,omitempty" xml:"tablespace,omitempty"` - Metadata map[string]interface{} `json:"metadata,omitempty" yaml:"metadata,omitempty" xml:"-"` + Metadata map[string]any `json:"metadata,omitempty" yaml:"metadata,omitempty" xml:"-"` + Sequence uint `json:"sequence,omitempty" yaml:"sequence,omitempty" xml:"sequence,omitempty"` +} + +// SQLName returns the table name in lowercase +func (d *Table) SQLName() string { + return strings.ToLower(d.Name) } func (m Table) GetPrimaryKey() *Column { @@ -61,32 +84,46 @@ func (m Table) GetForeignKeys() []*Constraint { // Column represents a table column type Column struct { - Name string `json:"name" yaml:"name" xml:"name"` - Table string `json:"table" yaml:"table" xml:"table"` - Schema string `json:"schema" yaml:"schema" xml:"schema"` - Type string `json:"type" yaml:"type" xml:"type"` - Length int `json:"length,omitempty" yaml:"length,omitempty" xml:"length,omitempty"` - Precision int `json:"precision,omitempty" yaml:"precision,omitempty" xml:"precision,omitempty"` - Scale int `json:"scale,omitempty" yaml:"scale,omitempty" xml:"scale,omitempty"` - NotNull bool `json:"not_null" yaml:"not_null" xml:"not_null"` - Default interface{} `json:"default,omitempty" yaml:"default,omitempty" xml:"default,omitempty"` - AutoIncrement bool `json:"auto_increment" yaml:"auto_increment" xml:"auto_increment"` - IsPrimaryKey bool `json:"is_primary_key" yaml:"is_primary_key" xml:"is_primary_key"` - Comment string `json:"comment,omitempty" yaml:"comment,omitempty" xml:"comment,omitempty"` - Collation string `json:"collation,omitempty" yaml:"collation,omitempty" xml:"collation,omitempty"` + Name string `json:"name" yaml:"name" xml:"name"` + Description string `json:"description,omitempty" yaml:"description,omitempty" xml:"description,omitempty"` + Table string `json:"table" yaml:"table" xml:"table"` + Schema string `json:"schema" yaml:"schema" xml:"schema"` + Type string `json:"type" yaml:"type" xml:"type"` + Length int `json:"length,omitempty" yaml:"length,omitempty" xml:"length,omitempty"` + Precision int `json:"precision,omitempty" yaml:"precision,omitempty" xml:"precision,omitempty"` + Scale int `json:"scale,omitempty" yaml:"scale,omitempty" xml:"scale,omitempty"` + NotNull bool `json:"not_null" yaml:"not_null" xml:"not_null"` + Default any `json:"default,omitempty" yaml:"default,omitempty" xml:"default,omitempty"` + AutoIncrement bool `json:"auto_increment" yaml:"auto_increment" xml:"auto_increment"` + IsPrimaryKey bool `json:"is_primary_key" yaml:"is_primary_key" xml:"is_primary_key"` + Comment string `json:"comment,omitempty" yaml:"comment,omitempty" xml:"comment,omitempty"` + Collation string `json:"collation,omitempty" yaml:"collation,omitempty" xml:"collation,omitempty"` + Sequence uint `json:"sequence,omitempty" yaml:"sequence,omitempty" xml:"sequence,omitempty"` +} + +// SQLName returns the table name in lowercase +func (d *Column) SQLName() string { + return strings.ToLower(d.Name) } type Index struct { - Name string `json:"name" yaml:"name" xml:"name"` - Table string `json:"table,omitempty" yaml:"table,omitempty" xml:"table,omitempty"` - Schema string `json:"schema,omitempty" yaml:"schema,omitempty" xml:"schema,omitempty"` - Columns []string `json:"columns" yaml:"columns" xml:"columns"` - Unique bool `json:"unique" yaml:"unique" xml:"unique"` - Type string `json:"type" yaml:"type" xml:"type"` // btree, hash, gin, gist, etc. - Where string `json:"where,omitempty" yaml:"where,omitempty" xml:"where,omitempty"` // partial index condition - Concurrent bool `json:"concurrent,omitempty" yaml:"concurrent,omitempty" xml:"concurrent,omitempty"` - Include []string `json:"include,omitempty" yaml:"include,omitempty" xml:"include,omitempty"` // INCLUDE columns - Comment string `json:"comment,omitempty" yaml:"comment,omitempty" xml:"comment,omitempty"` + Name string `json:"name" yaml:"name" xml:"name"` + Description string `json:"description,omitempty" yaml:"description,omitempty" xml:"description,omitempty"` + Table string `json:"table,omitempty" yaml:"table,omitempty" xml:"table,omitempty"` + Schema string `json:"schema,omitempty" yaml:"schema,omitempty" xml:"schema,omitempty"` + Columns []string `json:"columns" yaml:"columns" xml:"columns"` + Unique bool `json:"unique" yaml:"unique" xml:"unique"` + Type string `json:"type" yaml:"type" xml:"type"` // btree, hash, gin, gist, etc. + Where string `json:"where,omitempty" yaml:"where,omitempty" xml:"where,omitempty"` // partial index condition + Concurrent bool `json:"concurrent,omitempty" yaml:"concurrent,omitempty" xml:"concurrent,omitempty"` + Include []string `json:"include,omitempty" yaml:"include,omitempty" xml:"include,omitempty"` // INCLUDE columns + Comment string `json:"comment,omitempty" yaml:"comment,omitempty" xml:"comment,omitempty"` + Sequence uint `json:"sequence,omitempty" yaml:"sequence,omitempty" xml:"sequence,omitempty"` +} + +// SQLName returns the Indexin lowercase +func (d *Index) SQLName() string { + return strings.ToLower(d.Name) } type RelationType string @@ -109,6 +146,12 @@ type Relationship struct { ThroughTable string `json:"through_table,omitempty" yaml:"through_table,omitempty" xml:"through_table,omitempty"` // For many-to-many ThroughSchema string `json:"through_schema,omitempty" yaml:"through_schema,omitempty" xml:"through_schema,omitempty"` Description string `json:"description,omitempty" yaml:"description,omitempty" xml:"description,omitempty"` + Sequence uint `json:"sequence,omitempty" yaml:"sequence,omitempty" xml:"sequence,omitempty"` +} + +// SQLName returns the Relationship lowercase +func (d *Relationship) SQLName() string { + return strings.ToLower(d.Name) } type Constraint struct { @@ -125,6 +168,11 @@ type Constraint struct { OnUpdate string `json:"on_update" yaml:"on_update" xml:"on_update"` Deferrable bool `json:"deferrable,omitempty" yaml:"deferrable,omitempty" xml:"deferrable,omitempty"` InitiallyDeferred bool `json:"initially_deferred,omitempty" yaml:"initially_deferred,omitempty" xml:"initially_deferred,omitempty"` + Sequence uint `json:"sequence,omitempty" yaml:"sequence,omitempty" xml:"sequence,omitempty"` +} + +func (d *Constraint) SQLName() string { + return strings.ToLower(d.Name) } type ConstraintType string @@ -146,4 +194,88 @@ type Script struct { Schema string `json:"schema,omitempty" yaml:"schema,omitempty" xml:"schema,omitempty"` Version string `json:"version,omitempty" yaml:"version,omitempty" xml:"version,omitempty"` Priority int `json:"priority,omitempty" yaml:"priority,omitempty" xml:"priority,omitempty"` + Sequence uint `json:"sequence,omitempty" yaml:"sequence,omitempty" xml:"sequence,omitempty"` +} + +func (d *Script) SQLName() string { + return strings.ToLower(d.Name) +} + +// Initialize functions + +// InitDatabase initializes a new Database with empty slices +func InitDatabase(name string) *Database { + return &Database{ + Name: name, + Schemas: make([]*Schema, 0), + } +} + +// InitSchema initializes a new Schema with empty slices and maps +func InitSchema(name string) *Schema { + return &Schema{ + Name: name, + Tables: make([]*Table, 0), + Permissions: make(map[string]string), + Metadata: make(map[string]any), + Scripts: make([]*Script, 0), + } +} + +// InitTable initializes a new Table with empty maps +func InitTable(name, schema string) *Table { + return &Table{ + Name: name, + Schema: schema, + Columns: make(map[string]*Column), + Constraints: make(map[string]*Constraint), + Indexes: make(map[string]*Index), + Relationships: make(map[string]*Relationship), + Metadata: make(map[string]any), + } +} + +// InitColumn initializes a new Column +func InitColumn(name, table, schema string) *Column { + return &Column{ + Name: name, + Table: table, + Schema: schema, + } +} + +// InitIndex initializes a new Index with empty slices +func InitIndex(name string) *Index { + return &Index{ + Name: name, + Columns: make([]string, 0), + Include: make([]string, 0), + } +} + +// InitRelationship initializes a new Relationship with empty maps +func InitRelationship(name string, relType RelationType) *Relationship { + return &Relationship{ + Name: name, + Type: relType, + Properties: make(map[string]string), + } +} + +// InitConstraint initializes a new Constraint with empty slices +func InitConstraint(name string, constraintType ConstraintType) *Constraint { + return &Constraint{ + Name: name, + Type: constraintType, + Columns: make([]string, 0), + ReferencedColumns: make([]string, 0), + } +} + +// InitScript initializes a new Script with empty slices +func InitScript(name string) *Script { + return &Script{ + Name: name, + RunAfter: make([]string, 0), + } } diff --git a/pkg/models/summaryview.go b/pkg/models/summaryview.go new file mode 100644 index 0000000..b7b244a --- /dev/null +++ b/pkg/models/summaryview.go @@ -0,0 +1,99 @@ +package models + +// ============================================================================= +// Summary/Compact Views - Lightweight views with essential fields +// ============================================================================= + +// DatabaseSummary provides a compact overview of a database +type DatabaseSummary struct { + Name string `json:"name" yaml:"name" xml:"name"` + Description string `json:"description,omitempty" yaml:"description,omitempty" xml:"description,omitempty"` + DatabaseType DatabaseType `json:"database_type,omitempty" yaml:"database_type,omitempty" xml:"database_type,omitempty"` + DatabaseVersion string `json:"database_version,omitempty" yaml:"database_version,omitempty" xml:"database_version,omitempty"` + SchemaCount int `json:"schema_count" yaml:"schema_count" xml:"schema_count"` + TotalTables int `json:"total_tables" yaml:"total_tables" xml:"total_tables"` + TotalColumns int `json:"total_columns" yaml:"total_columns" xml:"total_columns"` +} + +// ToSummary converts a Database to a DatabaseSummary +func (d *Database) ToSummary() *DatabaseSummary { + summary := &DatabaseSummary{ + Name: d.Name, + Description: d.Description, + DatabaseType: d.DatabaseType, + DatabaseVersion: d.DatabaseVersion, + SchemaCount: len(d.Schemas), + } + + // Count total tables and columns + for _, schema := range d.Schemas { + summary.TotalTables += len(schema.Tables) + for _, table := range schema.Tables { + summary.TotalColumns += len(table.Columns) + } + } + + return summary +} + +// SchemaSummary provides a compact overview of a schema +type SchemaSummary struct { + Name string `json:"name" yaml:"name" xml:"name"` + Description string `json:"description,omitempty" yaml:"description,omitempty" xml:"description,omitempty"` + Owner string `json:"owner" yaml:"owner" xml:"owner"` + TableCount int `json:"table_count" yaml:"table_count" xml:"table_count"` + ScriptCount int `json:"script_count" yaml:"script_count" xml:"script_count"` + TotalColumns int `json:"total_columns" yaml:"total_columns" xml:"total_columns"` + TotalConstraints int `json:"total_constraints" yaml:"total_constraints" xml:"total_constraints"` +} + +// ToSummary converts a Schema to a SchemaSummary +func (s *Schema) ToSummary() *SchemaSummary { + summary := &SchemaSummary{ + Name: s.Name, + Description: s.Description, + Owner: s.Owner, + TableCount: len(s.Tables), + ScriptCount: len(s.Scripts), + } + + // Count columns and constraints + for _, table := range s.Tables { + summary.TotalColumns += len(table.Columns) + summary.TotalConstraints += len(table.Constraints) + } + + return summary +} + +// TableSummary provides a compact overview of a table +type TableSummary struct { + Name string `json:"name" yaml:"name" xml:"name"` + Schema string `json:"schema" yaml:"schema" xml:"schema"` + Description string `json:"description,omitempty" yaml:"description,omitempty" xml:"description,omitempty"` + ColumnCount int `json:"column_count" yaml:"column_count" xml:"column_count"` + ConstraintCount int `json:"constraint_count" yaml:"constraint_count" xml:"constraint_count"` + IndexCount int `json:"index_count" yaml:"index_count" xml:"index_count"` + RelationshipCount int `json:"relationship_count" yaml:"relationship_count" xml:"relationship_count"` + HasPrimaryKey bool `json:"has_primary_key" yaml:"has_primary_key" xml:"has_primary_key"` + ForeignKeyCount int `json:"foreign_key_count" yaml:"foreign_key_count" xml:"foreign_key_count"` +} + +// ToSummary converts a Table to a TableSummary +func (t *Table) ToSummary() *TableSummary { + summary := &TableSummary{ + Name: t.Name, + Schema: t.Schema, + Description: t.Description, + ColumnCount: len(t.Columns), + ConstraintCount: len(t.Constraints), + IndexCount: len(t.Indexes), + RelationshipCount: len(t.Relationships), + HasPrimaryKey: t.GetPrimaryKey() != nil, + } + + // Count foreign keys + summary.ForeignKeyCount = len(t.GetForeignKeys()) + + return summary +} diff --git a/pkg/pgsql/datatypes.go b/pkg/pgsql/datatypes.go new file mode 100644 index 0000000..a55b0fc --- /dev/null +++ b/pkg/pgsql/datatypes.go @@ -0,0 +1,154 @@ +package pgsql + +import "strings" + +var GoToStdTypes = map[string]string{ + "bool": "boolean", + "int64": "integer", + "int": "integer", + "int8": "integer", + "int16": "integer", + "int32": "integer", + "uint": "integer", + "uint8": "integer", + "uint16": "integer", + "uint32": "integer", + "uint64": "integer", + "uintptr": "integer", + "znullint64": "integer", + "znullint32": "integer", + "znullbyte": "integer", + "float64": "double", + "float32": "double", + "complex64": "double", + "complex128": "double", + "customfloat64": "double", + "string": "string", + "Pointer": "integer", + "[]byte": "blob", + "customdate": "string", + "customtime": "string", + "customtimestamp": "string", + "sqlfloat64": "double", + "sqlfloat16": "double", + "sqluuid": "uuid", + "sqljsonb": "jsonb", + "sqljson": "json", + "sqlint64": "bigint", + "sqlint32": "integer", + "sqlint16": "integer", + "sqlbool": "boolean", + "sqlstring": "string", + "nullablejsonb": "jsonb", + "nullablejson": "json", + "nullableuuid": "uuid", + "sqldate": "date", + "sqltime": "time", + "sqltimestamp": "timestamp", +} + +var GoToPGSQLTypes = map[string]string{ + "bool": "boolean", + "int64": "bigint", + "int": "integer", + "int8": "smallint", + "int16": "smallint", + "int32": "integer", + "uint": "integer", + "uint8": "smallint", + "uint16": "smallint", + "uint32": "integer", + "uint64": "bigint", + "uintptr": "bigint", + "znullint64": "bigint", + "znullint32": "integer", + "znullbyte": "integer", + "float64": "double precision", + "float32": "real", + "complex64": "double precision", + "complex128": "double precision", + "customfloat64": "double precisio", + "string": "text", + "Pointer": "bigint", + "[]byte": "bytea", + "customdate": "date", + "customtime": "time", + "customtimestamp": "timestamp", + "sqlfloat64": "double precision", + "sqlfloat16": "double precision", + "sqluuid": "uuid", + "sqljsonb": "jsonb", + "sqljson": "json", + "sqlint64": "bigint", + "sqlint32": "integer", + "sqlint16": "integer", + "sqlbool": "boolean", + "sqlstring": "string", + "nullablejsonb": "jsonb", + "nullablejson": "json", + "nullableuuid": "uuid", + "sqldate": "date", + "sqltime": "time", + "sqltimestamp": "timestamp", + "citext": "citext", +} + +func ValidSQLType(sqltype string) bool { + for _, sql := range GoToPGSQLTypes { + if strings.EqualFold(sql, sqltype) { + return true + } + } + for _, sql := range GoToStdTypes { + if strings.EqualFold(sql, sqltype) { + return true + } + } + return false +} + +func GetSQLType(anytype string) string { + for gotype, sql := range GoToPGSQLTypes { + if strings.EqualFold(gotype, anytype) || strings.EqualFold(sql, anytype) { + return sql + } + } + for gotype, sql := range GoToStdTypes { + if strings.EqualFold(gotype, anytype) || strings.EqualFold(sql, anytype) { + return sql + } + } + return "text" +} + +func ConvertSQLType(anytype string) string { + for gotype, sql := range GoToPGSQLTypes { + if strings.EqualFold(gotype, anytype) || strings.EqualFold(sql, anytype) { + return sql + } + } + for gotype, sql := range GoToStdTypes { + if strings.EqualFold(gotype, anytype) || strings.EqualFold(sql, anytype) { + return sql + } + } + return anytype +} + +func IsGoType(pTypeName string) bool { + for k := range GoToStdTypes { + if strings.EqualFold(pTypeName, k) { + return true + } + } + return false +} + +func GetStdTypeFromGo(pTypeName string) string { + for k, s := range GoToStdTypes { + if strings.EqualFold(pTypeName, k) { + return s + } + } + return pTypeName +} diff --git a/pkg/pgsql/keywords.go b/pkg/pgsql/keywords.go new file mode 100644 index 0000000..0f3217a --- /dev/null +++ b/pkg/pgsql/keywords.go @@ -0,0 +1,62 @@ +package pgsql + +// postgresKeywords contains PostgreSQL reserved keywords that need to be handled +var postgresKeywords = map[string]bool{ + "abort": true, "action": true, "add": true, "after": true, "all": true, "alter": true, "and": true, + "any": true, "array": true, "as": true, "asc": true, "asymmetric": true, "at": true, "authorization": true, + "begin": true, "between": true, "bigint": true, "binary": true, "bit": true, "boolean": true, "both": true, + "by": true, "cascade": true, "case": true, "cast": true, "char": true, "character": true, "check": true, + "collate": true, "collation": true, "column": true, "commit": true, "concurrently": true, "constraint": true, + "create": true, "cross": true, "current": true, "current_catalog": true, "current_date": true, + "current_role": true, "current_schema": true, "current_time": true, "current_timestamp": true, + "current_user": true, "cursor": true, "cycle": true, "date": true, "day": true, "deallocate": true, + "dec": true, "decimal": true, "declare": true, "default": true, "deferrable": true, "deferred": true, + "delete": true, "desc": true, "distinct": true, "do": true, "drop": true, "each": true, "else": true, + "end": true, "enum": true, "escape": true, "except": true, "exclude": true, "execute": true, "exists": true, + "extract": true, "false": true, "fetch": true, "filter": true, "first": true, "float": true, "following": true, + "for": true, "foreign": true, "from": true, "full": true, "function": true, "global": true, "grant": true, + "group": true, "having": true, "hour": true, "identity": true, "if": true, "ilike": true, "in": true, + "include": true, "increment": true, "index": true, "inherit": true, "initially": true, "inner": true, + "inout": true, "input": true, "insert": true, "instead": true, "int": true, "integer": true, "intersect": true, + "interval": true, "into": true, "is": true, "isolation": true, "join": true, "key": true, "language": true, + "large": true, "last": true, "lateral": true, "leading": true, "left": true, "level": true, "like": true, + "limit": true, "listen": true, "load": true, "local": true, "localtime": true, "localtimestamp": true, + "location": true, "lock": true, "match": true, "minute": true, "mode": true, "month": true, "move": true, + "name": true, "national": true, "natural": true, "nchar": true, "new": true, "next": true, "no": true, + "none": true, "not": true, "nothing": true, "notify": true, "null": true, "nulls": true, "numeric": true, + "object": true, "of": true, "off": true, "offset": true, "oids": true, "old": true, "on": true, "only": true, + "option": true, "or": true, "order": true, "ordinality": true, "out": true, "outer": true, "over": true, + "overlaps": true, "overlay": true, "owned": true, "owner": true, "partial": true, "partition": true, + "placing": true, "position": true, "preceding": true, "precision": true, "prepare": true, "prepared": true, + "preserve": true, "primary": true, "prior": true, "privileges": true, "procedural": true, "procedure": true, + "range": true, "read": true, "real": true, "reassign": true, "recheck": true, "recursive": true, "ref": true, + "references": true, "refresh": true, "reindex": true, "relative": true, "release": true, "rename": true, + "repeatable": true, "replace": true, "replica": true, "reset": true, "restart": true, "restrict": true, + "returning": true, "returns": true, "revoke": true, "right": true, "role": true, "rollback": true, + "rollup": true, "row": true, "rows": true, "rule": true, "savepoint": true, "schema": true, "scroll": true, + "search": true, "second": true, "security": true, "select": true, "sequence": true, "serializable": true, + "session": true, "set": true, "setof": true, "share": true, "show": true, "similar": true, "simple": true, + "smallint": true, "snapshot": true, "some": true, "sql": true, "stable": true, "standalone": true, + "start": true, "statement": true, "statistics": true, "stdin": true, "stdout": true, "storage": true, + "strict": true, "strip": true, "substring": true, "symmetric": true, "sysid": true, "system": true, + "table": true, "tables": true, "tablespace": true, "temp": true, "template": true, "temporary": true, + "text": true, "then": true, "time": true, "timestamp": true, "to": true, "trailing": true, "transaction": true, + "transform": true, "treat": true, "trigger": true, "trim": true, "true": true, "truncate": true, + "trusted": true, "type": true, "types": true, "unbounded": true, "uncommitted": true, "unencrypted": true, + "union": true, "unique": true, "unknown": true, "unlisten": true, "unlogged": true, "until": true, + "update": true, "user": true, "using": true, "vacuum": true, "valid": true, "validate": true, "validator": true, + "value": true, "values": true, "varchar": true, "variadic": true, "varying": true, "verbose": true, + "version": true, "view": true, "volatile": true, "when": true, "where": true, "whitespace": true, + "window": true, "with": true, "within": true, "without": true, "work": true, "wrapper": true, + "write": true, "xml": true, "xmlattributes": true, "xmlconcat": true, "xmlelement": true, "xmlexists": true, + "xmlforest": true, "xmlparse": true, "xmlpi": true, "xmlroot": true, "xmlserialize": true, "year": true, + "yes": true, "zone": true, +} + +func GetPostgresKeywords() []string { + lst := []string{} + for k := range postgresKeywords { + lst = append(lst, k) + } + return lst +} diff --git a/pkg/readers/dbml/reader.go b/pkg/readers/dbml/reader.go new file mode 100644 index 0000000..9a45496 --- /dev/null +++ b/pkg/readers/dbml/reader.go @@ -0,0 +1,400 @@ +package dbml + +import ( + "bufio" + "fmt" + "os" + "regexp" + "strings" + + "git.warky.dev/wdevs/relspecgo/pkg/models" + "git.warky.dev/wdevs/relspecgo/pkg/readers" +) + +// Reader implements the readers.Reader interface for DBML format +type Reader struct { + options *readers.ReaderOptions +} + +// NewReader creates a new DBML reader with the given options +func NewReader(options *readers.ReaderOptions) *Reader { + return &Reader{ + options: options, + } +} + +// ReadDatabase reads and parses DBML input, returning a Database model +func (r *Reader) ReadDatabase() (*models.Database, error) { + if r.options.FilePath == "" { + return nil, fmt.Errorf("file path is required for DBML reader") + } + + content, err := os.ReadFile(r.options.FilePath) + if err != nil { + return nil, fmt.Errorf("failed to read file: %w", err) + } + + return r.parseDBML(string(content)) +} + +// ReadSchema reads and parses DBML input, returning a Schema model +func (r *Reader) ReadSchema() (*models.Schema, error) { + db, err := r.ReadDatabase() + if err != nil { + return nil, err + } + + if len(db.Schemas) == 0 { + return nil, fmt.Errorf("no schemas found in DBML") + } + + // Return the first schema + return db.Schemas[0], nil +} + +// ReadTable reads and parses DBML input, returning a Table model +func (r *Reader) ReadTable() (*models.Table, error) { + schema, err := r.ReadSchema() + if err != nil { + return nil, err + } + + if len(schema.Tables) == 0 { + return nil, fmt.Errorf("no tables found in DBML") + } + + // Return the first table + return schema.Tables[0], nil +} + +// parseDBML parses DBML content and returns a Database model +func (r *Reader) parseDBML(content string) (*models.Database, error) { + db := models.InitDatabase("database") + + if r.options.Metadata != nil { + if name, ok := r.options.Metadata["name"].(string); ok { + db.Name = name + } + } + + scanner := bufio.NewScanner(strings.NewReader(content)) + schemaMap := make(map[string]*models.Schema) + + var currentTable *models.Table + var currentSchema string + var inIndexes bool + var inTable bool + + tableRegex := regexp.MustCompile(`^Table\s+([a-zA-Z0-9_.]+)\s*{`) + refRegex := regexp.MustCompile(`^Ref:\s+(.+)`) + + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + + // Skip empty lines and comments + if line == "" || strings.HasPrefix(line, "//") { + continue + } + + // Parse Table definition + if matches := tableRegex.FindStringSubmatch(line); matches != nil { + tableName := matches[1] + parts := strings.Split(tableName, ".") + + if len(parts) == 2 { + currentSchema = parts[0] + tableName = parts[1] + } else { + currentSchema = "public" + } + + // Ensure schema exists + if _, exists := schemaMap[currentSchema]; !exists { + schemaMap[currentSchema] = models.InitSchema(currentSchema) + } + + currentTable = models.InitTable(tableName, currentSchema) + inTable = true + inIndexes = false + continue + } + + // End of table definition + if inTable && line == "}" { + if currentTable != nil && currentSchema != "" { + schemaMap[currentSchema].Tables = append(schemaMap[currentSchema].Tables, currentTable) + currentTable = nil + } + inTable = false + inIndexes = false + continue + } + + // Parse indexes section + if inTable && strings.HasPrefix(line, "indexes") { + inIndexes = true + continue + } + + // End of indexes section + if inIndexes && line == "}" { + inIndexes = false + continue + } + + // Parse index definition + if inIndexes && currentTable != nil { + index := r.parseIndex(line, currentTable.Name, currentSchema) + if index != nil { + currentTable.Indexes[index.Name] = index + } + continue + } + + // Parse table note + if inTable && currentTable != nil && strings.HasPrefix(line, "Note:") { + note := strings.TrimPrefix(line, "Note:") + note = strings.Trim(note, " '\"") + currentTable.Description = note + continue + } + + // Parse column definition + if inTable && !inIndexes && currentTable != nil { + column := r.parseColumn(line, currentTable.Name, currentSchema) + if column != nil { + currentTable.Columns[column.Name] = column + } + continue + } + + // Parse Ref (relationship/foreign key) + if matches := refRegex.FindStringSubmatch(line); matches != nil { + constraint := r.parseRef(matches[1]) + if constraint != nil { + // Find the table and add the constraint + for _, schema := range schemaMap { + for _, table := range schema.Tables { + if table.Schema == constraint.Schema && table.Name == constraint.Table { + table.Constraints[constraint.Name] = constraint + break + } + } + } + } + continue + } + } + + // Add schemas to database + for _, schema := range schemaMap { + db.Schemas = append(db.Schemas, schema) + } + + return db, nil +} + +// parseColumn parses a DBML column definition +func (r *Reader) parseColumn(line, tableName, schemaName string) *models.Column { + // Format: column_name type [attributes] // comment + parts := strings.Fields(line) + if len(parts) < 2 { + return nil + } + + columnName := parts[0] + columnType := parts[1] + + column := models.InitColumn(columnName, tableName, schemaName) + column.Type = columnType + + // Parse attributes in brackets + if strings.Contains(line, "[") && strings.Contains(line, "]") { + attrStart := strings.Index(line, "[") + attrEnd := strings.Index(line, "]") + if attrStart < attrEnd { + attrs := line[attrStart+1 : attrEnd] + attrList := strings.Split(attrs, ",") + + for _, attr := range attrList { + attr = strings.TrimSpace(attr) + + if strings.Contains(attr, "primary key") || attr == "pk" { + column.IsPrimaryKey = true + column.NotNull = true + } else if strings.Contains(attr, "not null") { + column.NotNull = true + } else if attr == "increment" { + column.AutoIncrement = true + } else if strings.HasPrefix(attr, "default:") { + defaultVal := strings.TrimSpace(strings.TrimPrefix(attr, "default:")) + column.Default = strings.Trim(defaultVal, "'\"") + } else if attr == "unique" { + // Could create a unique constraint here + } + } + } + } + + // Parse inline comment + if strings.Contains(line, "//") { + commentStart := strings.Index(line, "//") + column.Comment = strings.TrimSpace(line[commentStart+2:]) + } + + return column +} + +// parseIndex parses a DBML index definition +func (r *Reader) parseIndex(line, tableName, schemaName string) *models.Index { + // Format: (columns) [attributes] + if !strings.Contains(line, "(") || !strings.Contains(line, ")") { + return nil + } + + colStart := strings.Index(line, "(") + colEnd := strings.Index(line, ")") + if colStart >= colEnd { + return nil + } + + columnsStr := line[colStart+1 : colEnd] + columns := strings.Split(columnsStr, ",") + for i := range columns { + columns[i] = strings.TrimSpace(columns[i]) + } + + index := models.InitIndex("") + index.Table = tableName + index.Schema = schemaName + index.Columns = columns + + // Parse attributes + if strings.Contains(line, "[") && strings.Contains(line, "]") { + attrStart := strings.Index(line, "[") + attrEnd := strings.Index(line, "]") + if attrStart < attrEnd { + attrs := line[attrStart+1 : attrEnd] + attrList := strings.Split(attrs, ",") + + for _, attr := range attrList { + attr = strings.TrimSpace(attr) + + if attr == "unique" { + index.Unique = true + } else if strings.HasPrefix(attr, "name:") { + name := strings.TrimSpace(strings.TrimPrefix(attr, "name:")) + index.Name = strings.Trim(name, "'\"") + } else if strings.HasPrefix(attr, "type:") { + indexType := strings.TrimSpace(strings.TrimPrefix(attr, "type:")) + index.Type = strings.Trim(indexType, "'\"") + } + } + } + } + + // Generate name if not provided + if index.Name == "" { + index.Name = fmt.Sprintf("idx_%s_%s", tableName, strings.Join(columns, "_")) + } + + return index +} + +// parseRef parses a DBML Ref (foreign key relationship) +func (r *Reader) parseRef(refStr string) *models.Constraint { + // Format: schema.table.(columns) > schema.table.(columns) [actions] + + // Split by relationship operator (>, <, -, etc.) + var fromPart, toPart string + + for _, op := range []string{">", "<", "-"} { + if strings.Contains(refStr, op) { + parts := strings.Split(refStr, op) + if len(parts) == 2 { + fromPart = strings.TrimSpace(parts[0]) + toPart = strings.TrimSpace(parts[1]) + break + } + } + } + + if fromPart == "" || toPart == "" { + return nil + } + + // Remove actions part if present + if strings.Contains(toPart, "[") { + toPart = strings.TrimSpace(toPart[:strings.Index(toPart, "[")]) + } + + // Parse from table and column + fromSchema, fromTable, fromColumns := r.parseTableRef(fromPart) + toSchema, toTable, toColumns := r.parseTableRef(toPart) + + if fromTable == "" || toTable == "" { + return nil + } + + constraint := models.InitConstraint( + fmt.Sprintf("fk_%s_%s", fromTable, toTable), + models.ForeignKeyConstraint, + ) + + constraint.Schema = fromSchema + constraint.Table = fromTable + constraint.Columns = fromColumns + constraint.ReferencedSchema = toSchema + constraint.ReferencedTable = toTable + constraint.ReferencedColumns = toColumns + + // Parse actions if present + if strings.Contains(refStr, "[") && strings.Contains(refStr, "]") { + actStart := strings.Index(refStr, "[") + actEnd := strings.Index(refStr, "]") + if actStart < actEnd { + actions := refStr[actStart+1 : actEnd] + actionList := strings.Split(actions, ",") + + for _, action := range actionList { + action = strings.TrimSpace(action) + + if strings.HasPrefix(action, "ondelete:") { + constraint.OnDelete = strings.TrimSpace(strings.TrimPrefix(action, "ondelete:")) + } else if strings.HasPrefix(action, "onupdate:") { + constraint.OnUpdate = strings.TrimSpace(strings.TrimPrefix(action, "onupdate:")) + } + } + } + } + + return constraint +} + +// parseTableRef parses a table reference like "schema.table.(column1, column2)" +func (r *Reader) parseTableRef(ref string) (schema, table string, columns []string) { + // Extract columns if present + if strings.Contains(ref, "(") && strings.Contains(ref, ")") { + colStart := strings.Index(ref, "(") + colEnd := strings.Index(ref, ")") + if colStart < colEnd { + columnsStr := ref[colStart+1 : colEnd] + for _, col := range strings.Split(columnsStr, ",") { + columns = append(columns, strings.TrimSpace(col)) + } + } + ref = ref[:colStart] + } + + // Parse schema and table + parts := strings.Split(strings.TrimSpace(ref), ".") + if len(parts) == 2 { + schema = parts[0] + table = parts[1] + } else if len(parts) == 1 { + schema = "public" + table = parts[0] + } + + return +} diff --git a/pkg/readers/dctx/reader.go b/pkg/readers/dctx/reader.go new file mode 100644 index 0000000..ea273c2 --- /dev/null +++ b/pkg/readers/dctx/reader.go @@ -0,0 +1,486 @@ +package dctx + +import ( + "encoding/xml" + "fmt" + "os" + "strings" + + "git.warky.dev/wdevs/relspecgo/pkg/models" + "git.warky.dev/wdevs/relspecgo/pkg/readers" +) + +// Reader implements the readers.Reader interface for DCTX format +type Reader struct { + options *readers.ReaderOptions +} + +// NewReader creates a new DCTX reader with the given options +func NewReader(options *readers.ReaderOptions) *Reader { + return &Reader{ + options: options, + } +} + +// ReadDatabase reads and parses DCTX input, returning a Database model +func (r *Reader) ReadDatabase() (*models.Database, error) { + if r.options.FilePath == "" { + return nil, fmt.Errorf("file path is required for DCTX reader") + } + + data, err := os.ReadFile(r.options.FilePath) + if err != nil { + return nil, fmt.Errorf("failed to read file: %w", err) + } + + var dctx DCTXDictionary + if err := xml.Unmarshal(data, &dctx); err != nil { + return nil, fmt.Errorf("failed to parse DCTX XML: %w", err) + } + + return r.convertToDatabase(&dctx) +} + +// ReadSchema reads and parses DCTX input, returning a Schema model +func (r *Reader) ReadSchema() (*models.Schema, error) { + db, err := r.ReadDatabase() + if err != nil { + return nil, err + } + + if len(db.Schemas) == 0 { + return nil, fmt.Errorf("no schemas found in DCTX") + } + + return db.Schemas[0], nil +} + +// ReadTable reads and parses DCTX input, returning a Table model +func (r *Reader) ReadTable() (*models.Table, error) { + schema, err := r.ReadSchema() + if err != nil { + return nil, err + } + + if len(schema.Tables) == 0 { + return nil, fmt.Errorf("no tables found in DCTX") + } + + return schema.Tables[0], nil +} + +// convertToDatabase converts a DCTX dictionary to a Database model +func (r *Reader) convertToDatabase(dctx *DCTXDictionary) (*models.Database, error) { + dbName := dctx.Name + if dbName == "" { + dbName = "database" + } + + db := models.InitDatabase(dbName) + schema := models.InitSchema("public") + + // Create GUID mappings for tables and keys + tableGuidMap := make(map[string]string) // GUID -> table name + keyGuidMap := make(map[string]*DCTXKey) // GUID -> key definition + keyTableMap := make(map[string]string) // key GUID -> table name + fieldGuidMaps := make(map[string]map[string]string) // table name -> field GUID -> field name + + // First pass: build GUID mappings + for _, dctxTable := range dctx.Tables { + if !r.hasSQLOption(&dctxTable) { + continue + } + + tableName := r.sanitizeName(dctxTable.Name) + tableGuidMap[dctxTable.Guid] = tableName + + // Map keys to their table + for _, dctxKey := range dctxTable.Keys { + keyGuidMap[dctxKey.Guid] = &dctxKey + keyTableMap[dctxKey.Guid] = tableName + } + } + + // Process tables - only include tables with SQL option enabled + for _, dctxTable := range dctx.Tables { + if !r.hasSQLOption(&dctxTable) { + continue + } + + table, fieldGuidMap, err := r.convertTable(&dctxTable) + if err != nil { + return nil, fmt.Errorf("failed to convert table %s: %w", dctxTable.Name, err) + } + + fieldGuidMaps[table.Name] = fieldGuidMap + schema.Tables = append(schema.Tables, table) + + // Process keys (indexes, primary keys) + err = r.processKeys(&dctxTable, table, fieldGuidMap) + if err != nil { + return nil, fmt.Errorf("failed to process keys for table %s: %w", dctxTable.Name, err) + } + } + + // Process relations + err := r.processRelations(dctx, schema, tableGuidMap, keyGuidMap, fieldGuidMaps) + if err != nil { + return nil, fmt.Errorf("failed to process relations: %w", err) + } + + db.Schemas = append(db.Schemas, schema) + return db, nil +} + +// hasSQLOption checks if a DCTX table has the SQL option set to "1" +func (r *Reader) hasSQLOption(dctxTable *DCTXTable) bool { + for _, option := range dctxTable.Options { + if option.Property == "SQL" && option.PropertyValue == "1" { + return true + } + } + return false +} + +// convertTable converts a DCTX table to a Table model +func (r *Reader) convertTable(dctxTable *DCTXTable) (*models.Table, map[string]string, error) { + tableName := r.sanitizeName(dctxTable.Name) + table := models.InitTable(tableName, "public") + table.Description = dctxTable.Description + + fieldGuidMap := make(map[string]string) + + // Process fields + for _, dctxField := range dctxTable.Fields { + // Store GUID to name mapping + if dctxField.Guid != "" && dctxField.Name != "" { + fieldGuidMap[dctxField.Guid] = r.sanitizeName(dctxField.Name) + } + + columns, err := r.convertField(&dctxField, table.Name) + if err != nil { + return nil, nil, fmt.Errorf("failed to convert field %s: %w", dctxField.Name, err) + } + + // Add all columns + for _, column := range columns { + table.Columns[column.Name] = column + } + } + + return table, fieldGuidMap, nil +} + +// convertField converts a DCTX field to Column(s) +func (r *Reader) convertField(dctxField *DCTXField, tableName string) ([]*models.Column, error) { + var columns []*models.Column + + // Handle GROUP fields (nested structures) + if dctxField.DataType == "GROUP" { + for _, subField := range dctxField.Fields { + subColumns, err := r.convertField(&subField, tableName) + if err != nil { + return nil, err + } + columns = append(columns, subColumns...) + } + return columns, nil + } + + // Convert single field + column := models.InitColumn(r.sanitizeName(dctxField.Name), tableName, "public") + + // Map Clarion data types + dataType, length := r.mapDataType(dctxField.DataType, dctxField.Size) + column.Type = dataType + column.Length = length + + // Check for auto-increment (identity) + for _, option := range dctxField.Options { + if option.Property == "IsIdentity" && option.PropertyValue == "1" { + column.AutoIncrement = true + column.NotNull = true + } + } + + columns = append(columns, column) + return columns, nil +} + +// mapDataType maps Clarion data types to SQL types +func (r *Reader) mapDataType(clarionType string, size int) (string, int) { + switch strings.ToUpper(clarionType) { + case "LONG": + if size == 8 { + return "bigint", 0 + } + return "integer", 0 + + case "ULONG": + if size == 8 { + return "bigint", 0 + } + return "integer", 0 + + case "SHORT": + return "smallint", 0 + + case "USHORT": + return "smallint", 0 + + case "BYTE": + return "smallint", 0 + + case "STRING": + if size > 0 { + return "varchar", size + } + return "text", 0 + + case "CSTRING": + if size > 0 { + // CSTRING includes null terminator, so subtract 1 + length := size - 1 + if length <= 0 { + length = 1 + } + return "varchar", length + } + return "text", 0 + + case "PSTRING": + if size > 0 { + return "varchar", size + } + return "text", 0 + + case "DECIMAL": + return "decimal", 0 + + case "REAL": + return "real", 0 + + case "SREAL": + return "double precision", 0 + + case "DATE": + return "date", 0 + + case "TIME": + return "time", 0 + + case "BLOB": + return "bytea", 0 + + case "MEMO": + return "text", 0 + + case "BOOL", "BOOLEAN": + return "boolean", 0 + + default: + return "text", 0 + } +} + +// processKeys processes DCTX keys and converts them to indexes and primary keys +func (r *Reader) processKeys(dctxTable *DCTXTable, table *models.Table, fieldGuidMap map[string]string) error { + for _, dctxKey := range dctxTable.Keys { + err := r.convertKey(&dctxKey, table, fieldGuidMap) + if err != nil { + return fmt.Errorf("failed to convert key %s: %w", dctxKey.Name, err) + } + } + return nil +} + +// convertKey converts a DCTX key to appropriate constraint/index +func (r *Reader) convertKey(dctxKey *DCTXKey, table *models.Table, fieldGuidMap map[string]string) error { + var columns []string + + // Extract column names from key components + if len(dctxKey.Components) > 0 { + for _, component := range dctxKey.Components { + if fieldName, exists := fieldGuidMap[component.FieldId]; exists { + columns = append(columns, fieldName) + } + } + } + + // If no columns found, try to infer + if len(columns) == 0 { + if dctxKey.Primary { + // Look for common primary key column patterns + for colName := range table.Columns { + colNameLower := strings.ToLower(colName) + if strings.HasPrefix(colNameLower, "rid_") || strings.HasSuffix(colNameLower, "id") { + columns = append(columns, colName) + break + } + } + } + + // If still no columns, skip + if len(columns) == 0 { + return nil + } + } + + // Handle primary key + if dctxKey.Primary { + // Create primary key constraint + constraint := models.InitConstraint(r.sanitizeName(dctxKey.Name), models.PrimaryKeyConstraint) + constraint.Table = table.Name + constraint.Schema = table.Schema + constraint.Columns = columns + + table.Constraints[constraint.Name] = constraint + + // Mark columns as NOT NULL + for _, colName := range columns { + if col, exists := table.Columns[colName]; exists { + col.NotNull = true + col.IsPrimaryKey = true + } + } + return nil + } + + // Handle regular index + index := models.InitIndex(r.sanitizeName(dctxKey.Name)) + index.Table = table.Name + index.Schema = table.Schema + index.Columns = columns + index.Unique = dctxKey.Unique + index.Type = "btree" + + table.Indexes[index.Name] = index + return nil +} + +// processRelations processes DCTX relations and creates foreign keys +func (r *Reader) processRelations(dctx *DCTXDictionary, schema *models.Schema, tableGuidMap map[string]string, keyGuidMap map[string]*DCTXKey, fieldGuidMaps map[string]map[string]string) error { + for _, relation := range dctx.Relations { + // Get table names from GUIDs + primaryTableName := tableGuidMap[relation.PrimaryTable] + foreignTableName := tableGuidMap[relation.ForeignTable] + + if primaryTableName == "" || foreignTableName == "" { + continue + } + + // Find tables + var primaryTable, foreignTable *models.Table + for _, table := range schema.Tables { + if table.Name == primaryTableName { + primaryTable = table + } + if table.Name == foreignTableName { + foreignTable = table + } + } + + if primaryTable == nil || foreignTable == nil { + continue + } + + var fkColumns, pkColumns []string + + // Try to use explicit field mappings + if len(relation.ForeignMappings) > 0 && len(relation.PrimaryMappings) > 0 { + foreignFieldMap := fieldGuidMaps[foreignTableName] + primaryFieldMap := fieldGuidMaps[primaryTableName] + + for _, mapping := range relation.ForeignMappings { + if fieldName, exists := foreignFieldMap[mapping.Field]; exists { + fkColumns = append(fkColumns, fieldName) + } + } + + for _, mapping := range relation.PrimaryMappings { + if fieldName, exists := primaryFieldMap[mapping.Field]; exists { + pkColumns = append(pkColumns, fieldName) + } + } + } + + // Validate columns exist + if len(fkColumns) == 0 || len(pkColumns) == 0 { + continue + } + + allFkColumnsExist := true + for _, colName := range fkColumns { + if _, exists := foreignTable.Columns[colName]; !exists { + allFkColumnsExist = false + break + } + } + if !allFkColumnsExist { + continue + } + + allPkColumnsExist := true + for _, colName := range pkColumns { + if _, exists := primaryTable.Columns[colName]; !exists { + allPkColumnsExist = false + break + } + } + if !allPkColumnsExist { + continue + } + + // Create foreign key + fkName := r.sanitizeName(fmt.Sprintf("fk_%s_%s", foreignTableName, primaryTableName)) + constraint := models.InitConstraint(fkName, models.ForeignKeyConstraint) + constraint.Table = foreignTableName + constraint.Schema = "public" + constraint.Columns = fkColumns + constraint.ReferencedTable = primaryTableName + constraint.ReferencedSchema = "public" + constraint.ReferencedColumns = pkColumns + constraint.OnDelete = r.mapReferentialAction(relation.Delete) + constraint.OnUpdate = r.mapReferentialAction(relation.Update) + + foreignTable.Constraints[fkName] = constraint + + // Create relationship + relationshipName := fmt.Sprintf("%s_to_%s", foreignTableName, primaryTableName) + relationship := models.InitRelationship(relationshipName, models.OneToMany) + relationship.FromTable = primaryTableName + relationship.FromSchema = "public" + relationship.ToTable = foreignTableName + relationship.ToSchema = "public" + relationship.ForeignKey = fkName + relationship.Properties["on_delete"] = constraint.OnDelete + relationship.Properties["on_update"] = constraint.OnUpdate + + foreignTable.Relationships[relationshipName] = relationship + } + + return nil +} + +// mapReferentialAction maps DCTX referential actions to SQL syntax +func (r *Reader) mapReferentialAction(action string) string { + switch strings.ToUpper(action) { + case "RESTRICT", "RESTRICT_SERVER": + return "RESTRICT" + case "CASCADE", "CASCADE_SERVER": + return "CASCADE" + case "SET_NULL", "SET_NULL_SERVER": + return "SET NULL" + case "SET_DEFAULT", "SET_DEFAULT_SERVER": + return "SET DEFAULT" + case "NO_ACTION", "NO_ACTION_SERVER": + return "NO ACTION" + default: + return "RESTRICT" + } +} + +// sanitizeName sanitizes a name to lowercase +func (r *Reader) sanitizeName(name string) string { + return strings.ToLower(name) +} diff --git a/pkg/readers/dctx/types.go b/pkg/readers/dctx/types.go new file mode 100644 index 0000000..6a2a87f --- /dev/null +++ b/pkg/readers/dctx/types.go @@ -0,0 +1,84 @@ +package dctx + +import "encoding/xml" + +// DCTXDictionary represents the root element of a DCTX file +type DCTXDictionary struct { + XMLName xml.Name `xml:"Dictionary"` + Name string `xml:"Name,attr"` + Version string `xml:"Version,attr"` + Tables []DCTXTable `xml:"Table"` + Relations []DCTXRelation `xml:"Relation"` +} + +// DCTXTable represents a table definition in DCTX +type DCTXTable struct { + Guid string `xml:"Guid,attr"` + Name string `xml:"Name,attr"` + Prefix string `xml:"Prefix,attr"` + Driver string `xml:"Driver,attr"` + Owner string `xml:"Owner,attr"` + Path string `xml:"Path,attr"` + Description string `xml:"Description,attr"` + Fields []DCTXField `xml:"Field"` + Keys []DCTXKey `xml:"Key"` + Options []DCTXOption `xml:"Option"` +} + +// DCTXField represents a field/column definition in DCTX +type DCTXField struct { + Guid string `xml:"Guid,attr"` + Name string `xml:"Name,attr"` + DataType string `xml:"DataType,attr"` + Size int `xml:"Size,attr"` + NoPopulate bool `xml:"NoPopulate,attr"` + Thread bool `xml:"Thread,attr"` + Fields []DCTXField `xml:"Field"` // For GROUP fields (nested structures) + Options []DCTXOption `xml:"Option"` +} + +// DCTXKey represents an index or key definition in DCTX +type DCTXKey struct { + Guid string `xml:"Guid,attr"` + Name string `xml:"Name,attr"` + KeyType string `xml:"KeyType,attr"` + Primary bool `xml:"Primary,attr"` + Unique bool `xml:"Unique,attr"` + Order int `xml:"Order,attr"` + Description string `xml:"Description,attr"` + Components []DCTXComponent `xml:"Component"` +} + +// DCTXComponent represents a component of a key (field reference) +type DCTXComponent struct { + Guid string `xml:"Guid,attr"` + FieldId string `xml:"FieldId,attr"` + Order int `xml:"Order,attr"` + Ascend bool `xml:"Ascend,attr"` +} + +// DCTXOption represents a property option in DCTX +type DCTXOption struct { + Property string `xml:"Property,attr"` + PropertyType string `xml:"PropertyType,attr"` + PropertyValue string `xml:"PropertyValue,attr"` +} + +// DCTXRelation represents a relationship/foreign key in DCTX +type DCTXRelation struct { + Guid string `xml:"Guid,attr"` + PrimaryTable string `xml:"PrimaryTable,attr"` + ForeignTable string `xml:"ForeignTable,attr"` + PrimaryKey string `xml:"PrimaryKey,attr"` + ForeignKey string `xml:"ForeignKey,attr"` + Delete string `xml:"Delete,attr"` + Update string `xml:"Update,attr"` + ForeignMappings []DCTXFieldMapping `xml:"ForeignMapping"` + PrimaryMappings []DCTXFieldMapping `xml:"PrimaryMapping"` +} + +// DCTXFieldMapping represents a field mapping in a relation +type DCTXFieldMapping struct { + Guid string `xml:"Guid,attr"` + Field string `xml:"Field,attr"` +} diff --git a/pkg/readers/drawdb/reader.go b/pkg/readers/drawdb/reader.go new file mode 100644 index 0000000..e9db92c --- /dev/null +++ b/pkg/readers/drawdb/reader.go @@ -0,0 +1,304 @@ +package drawdb + +import ( + "encoding/json" + "fmt" + "os" + "strconv" + "strings" + + "git.warky.dev/wdevs/relspecgo/pkg/models" + "git.warky.dev/wdevs/relspecgo/pkg/readers" + "git.warky.dev/wdevs/relspecgo/pkg/writers/drawdb" +) + +// Reader implements the readers.Reader interface for DrawDB JSON format +type Reader struct { + options *readers.ReaderOptions +} + +// NewReader creates a new DrawDB reader with the given options +func NewReader(options *readers.ReaderOptions) *Reader { + return &Reader{ + options: options, + } +} + +// ReadDatabase reads and parses DrawDB JSON input, returning a Database model +func (r *Reader) ReadDatabase() (*models.Database, error) { + if r.options.FilePath == "" { + return nil, fmt.Errorf("file path is required for DrawDB reader") + } + + data, err := os.ReadFile(r.options.FilePath) + if err != nil { + return nil, fmt.Errorf("failed to read file: %w", err) + } + + var drawSchema drawdb.DrawDBSchema + if err := json.Unmarshal(data, &drawSchema); err != nil { + return nil, fmt.Errorf("failed to parse DrawDB JSON: %w", err) + } + + return r.convertToDatabase(&drawSchema) +} + +// ReadSchema reads and parses DrawDB JSON input, returning a Schema model +func (r *Reader) ReadSchema() (*models.Schema, error) { + if r.options.FilePath == "" { + return nil, fmt.Errorf("file path is required for DrawDB reader") + } + + data, err := os.ReadFile(r.options.FilePath) + if err != nil { + return nil, fmt.Errorf("failed to read file: %w", err) + } + + var drawSchema drawdb.DrawDBSchema + if err := json.Unmarshal(data, &drawSchema); err != nil { + return nil, fmt.Errorf("failed to parse DrawDB JSON: %w", err) + } + + return r.convertToSchema(&drawSchema, "default") +} + +// ReadTable reads and parses DrawDB JSON input, returning a Table model +func (r *Reader) ReadTable() (*models.Table, error) { + if r.options.FilePath == "" { + return nil, fmt.Errorf("file path is required for DrawDB reader") + } + + data, err := os.ReadFile(r.options.FilePath) + if err != nil { + return nil, fmt.Errorf("failed to read file: %w", err) + } + + var drawSchema drawdb.DrawDBSchema + if err := json.Unmarshal(data, &drawSchema); err != nil { + return nil, fmt.Errorf("failed to parse DrawDB JSON: %w", err) + } + + if len(drawSchema.Tables) == 0 { + return nil, fmt.Errorf("no tables found in DrawDB JSON") + } + + // Return the first table + return r.convertToTable(drawSchema.Tables[0], &drawSchema) +} + +// convertToDatabase converts a DrawDB schema to a Database model +func (r *Reader) convertToDatabase(drawSchema *drawdb.DrawDBSchema) (*models.Database, error) { + db := models.InitDatabase("database") + + if r.options.Metadata != nil { + if name, ok := r.options.Metadata["name"].(string); ok { + db.Name = name + } + } + + // Extract database info from notes + for _, note := range drawSchema.Notes { + if strings.HasPrefix(note.Content, "Database:") { + parts := strings.SplitN(note.Content, "\n\n", 2) + if len(parts) == 2 { + db.Description = parts[1] + } + } + } + + // Group tables by schema + schemaMap := make(map[string]*models.Schema) + + for _, drawTable := range drawSchema.Tables { + schemaName := drawTable.Schema + if schemaName == "" { + schemaName = "public" + } + + schema, exists := schemaMap[schemaName] + if !exists { + schema = models.InitSchema(schemaName) + schemaMap[schemaName] = schema + } + + table, err := r.convertToTable(drawTable, drawSchema) + if err != nil { + return nil, fmt.Errorf("failed to convert table %s: %w", drawTable.Name, err) + } + + schema.Tables = append(schema.Tables, table) + } + + // Add schemas to database + for _, schema := range schemaMap { + db.Schemas = append(db.Schemas, schema) + } + + return db, nil +} + +// convertToSchema converts DrawDB tables to a Schema model +func (r *Reader) convertToSchema(drawSchema *drawdb.DrawDBSchema, schemaName string) (*models.Schema, error) { + schema := models.InitSchema(schemaName) + + for _, drawTable := range drawSchema.Tables { + // Filter by schema if specified in the table + if drawTable.Schema != "" && drawTable.Schema != schemaName { + continue + } + + table, err := r.convertToTable(drawTable, drawSchema) + if err != nil { + return nil, fmt.Errorf("failed to convert table %s: %w", drawTable.Name, err) + } + + schema.Tables = append(schema.Tables, table) + } + + return schema, nil +} + +// convertToTable converts a DrawDB table to a Table model +func (r *Reader) convertToTable(drawTable *drawdb.DrawDBTable, drawSchema *drawdb.DrawDBSchema) (*models.Table, error) { + schemaName := drawTable.Schema + if schemaName == "" { + schemaName = "public" + } + + table := models.InitTable(drawTable.Name, schemaName) + table.Description = drawTable.Comment + + // Convert fields to columns + for _, field := range drawTable.Fields { + column := r.convertToColumn(field, drawTable.Name, schemaName) + table.Columns[column.Name] = column + } + + // Convert indexes + for _, index := range drawTable.Indexes { + idx := r.convertToIndex(index, drawTable, schemaName) + table.Indexes[idx.Name] = idx + } + + // Find and convert relationships/constraints for this table + for _, rel := range drawSchema.Relationships { + if rel.StartTableID == drawTable.ID { + constraint := r.convertToConstraint(rel, drawSchema) + if constraint != nil { + table.Constraints[constraint.Name] = constraint + } + } + } + + return table, nil +} + +// convertToColumn converts a DrawDB field to a Column model +func (r *Reader) convertToColumn(field *drawdb.DrawDBField, tableName, schemaName string) *models.Column { + column := models.InitColumn(field.Name, tableName, schemaName) + + // Parse type and dimensions + typeStr := field.Type + column.Type = typeStr + + // Try to extract length/precision from type string like "varchar(255)" or "decimal(10,2)" + if strings.Contains(typeStr, "(") { + parts := strings.Split(typeStr, "(") + column.Type = parts[0] + + if len(parts) > 1 { + dimensions := strings.TrimSuffix(parts[1], ")") + if strings.Contains(dimensions, ",") { + // Precision and scale (e.g., decimal(10,2)) + dims := strings.Split(dimensions, ",") + if precision, err := strconv.Atoi(strings.TrimSpace(dims[0])); err == nil { + column.Precision = precision + } + if len(dims) > 1 { + if scale, err := strconv.Atoi(strings.TrimSpace(dims[1])); err == nil { + column.Scale = scale + } + } + } else { + // Just length (e.g., varchar(255)) + if length, err := strconv.Atoi(dimensions); err == nil { + column.Length = length + } + } + } + } + + column.IsPrimaryKey = field.Primary + column.NotNull = field.NotNull || field.Primary + column.AutoIncrement = field.Increment + column.Comment = field.Comment + + if field.Default != "" { + column.Default = field.Default + } + + return column +} + +// convertToIndex converts a DrawDB index to an Index model +func (r *Reader) convertToIndex(drawIndex *drawdb.DrawDBIndex, drawTable *drawdb.DrawDBTable, schemaName string) *models.Index { + index := models.InitIndex(drawIndex.Name) + index.Table = drawTable.Name + index.Schema = schemaName + index.Unique = drawIndex.Unique + + // Convert field IDs to column names + for _, fieldID := range drawIndex.Fields { + if fieldID >= 0 && fieldID < len(drawTable.Fields) { + index.Columns = append(index.Columns, drawTable.Fields[fieldID].Name) + } + } + + return index +} + +// convertToConstraint converts a DrawDB relationship to a Constraint model +func (r *Reader) convertToConstraint(rel *drawdb.DrawDBRelationship, drawSchema *drawdb.DrawDBSchema) *models.Constraint { + // Find the start and end tables + var startTable, endTable *drawdb.DrawDBTable + for _, table := range drawSchema.Tables { + if table.ID == rel.StartTableID { + startTable = table + } + if table.ID == rel.EndTableID { + endTable = table + } + } + + if startTable == nil || endTable == nil { + return nil + } + + constraint := models.InitConstraint(rel.Name, models.ForeignKeyConstraint) + + // Get the column names from field IDs + if rel.StartFieldID >= 0 && rel.StartFieldID < len(startTable.Fields) { + constraint.Columns = append(constraint.Columns, startTable.Fields[rel.StartFieldID].Name) + } + + if rel.EndFieldID >= 0 && rel.EndFieldID < len(endTable.Fields) { + constraint.ReferencedColumns = append(constraint.ReferencedColumns, endTable.Fields[rel.EndFieldID].Name) + } + + constraint.Table = startTable.Name + constraint.Schema = startTable.Schema + if constraint.Schema == "" { + constraint.Schema = "public" + } + + constraint.ReferencedTable = endTable.Name + constraint.ReferencedSchema = endTable.Schema + if constraint.ReferencedSchema == "" { + constraint.ReferencedSchema = "public" + } + + constraint.OnUpdate = rel.UpdateConstraint + constraint.OnDelete = rel.DeleteConstraint + + return constraint +} diff --git a/pkg/readers/reader.go b/pkg/readers/reader.go index e2147b2..f8e5d16 100644 --- a/pkg/readers/reader.go +++ b/pkg/readers/reader.go @@ -5,10 +5,16 @@ import ( ) // Reader defines the interface for reading database specifications -// from various input formats +// from various input formats at different granularity levels type Reader interface { - // Read reads and parses the input, returning a Database model - Read() (*models.Database, error) + // ReadDatabase reads and parses the input, returning a Database model + ReadDatabase() (*models.Database, error) + + // ReadSchema reads and parses the input, returning a Schema model + ReadSchema() (*models.Schema, error) + + // ReadTable reads and parses the input, returning a Table model + ReadTable() (*models.Table, error) } // ReaderOptions contains common options for readers diff --git a/pkg/transform/transform.go b/pkg/transform/transform.go index 9b65d21..189ca0c 100644 --- a/pkg/transform/transform.go +++ b/pkg/transform/transform.go @@ -12,8 +12,8 @@ func NewTransformer() *Transformer { return &Transformer{} } -// Validate validates a database model for correctness -func (t *Transformer) Validate(db *models.Database) error { +// ValidateDatabase validates a database model for correctness +func (t *Transformer) ValidateDatabase(db *models.Database) error { // TODO: Implement validation logic // - Check for duplicate table names // - Validate column types @@ -22,11 +22,45 @@ func (t *Transformer) Validate(db *models.Database) error { return nil } -// Normalize normalizes a database model to a standard format -func (t *Transformer) Normalize(db *models.Database) (*models.Database, error) { +// ValidateSchema validates a schema model for correctness +func (t *Transformer) ValidateSchema(schema *models.Schema) error { + // TODO: Implement validation logic + // - Check for duplicate table names within schema + // - Validate table references + return nil +} + +// ValidateTable validates a table model for correctness +func (t *Transformer) ValidateTable(table *models.Table) error { + // TODO: Implement validation logic + // - Validate column types + // - Ensure constraints reference existing columns + // - Validate relation integrity + return nil +} + +// NormalizeDatabase normalizes a database model to a standard format +func (t *Transformer) NormalizeDatabase(db *models.Database) (*models.Database, error) { // TODO: Implement normalization logic // - Standardize naming conventions // - Order tables/columns consistently // - Apply default values return db, nil } + +// NormalizeSchema normalizes a schema model to a standard format +func (t *Transformer) NormalizeSchema(schema *models.Schema) (*models.Schema, error) { + // TODO: Implement normalization logic + // - Standardize naming conventions + // - Order tables/columns consistently + return schema, nil +} + +// NormalizeTable normalizes a table model to a standard format +func (t *Transformer) NormalizeTable(table *models.Table) (*models.Table, error) { + // TODO: Implement normalization logic + // - Standardize naming conventions + // - Order columns consistently + // - Apply default values + return table, nil +} diff --git a/pkg/writers/bun/name_converter.go b/pkg/writers/bun/name_converter.go new file mode 100644 index 0000000..682fb78 --- /dev/null +++ b/pkg/writers/bun/name_converter.go @@ -0,0 +1,284 @@ +package bun + +import ( + "strings" + "unicode" +) + +// SnakeCaseToPascalCase converts snake_case to PascalCase +// Examples: user_id → UserID, http_request → HTTPRequest +func SnakeCaseToPascalCase(s string) string { + if s == "" { + return "" + } + + parts := strings.Split(s, "_") + for i, part := range parts { + parts[i] = capitalize(part) + } + return strings.Join(parts, "") +} + +// SnakeCaseToCamelCase converts snake_case to camelCase +// Examples: user_id → userID, http_request → httpRequest +func SnakeCaseToCamelCase(s string) string { + if s == "" { + return "" + } + + parts := strings.Split(s, "_") + for i, part := range parts { + if i == 0 { + parts[i] = strings.ToLower(part) + } else { + parts[i] = capitalize(part) + } + } + return strings.Join(parts, "") +} + +// PascalCaseToSnakeCase converts PascalCase to snake_case +// Examples: UserID → user_id, HTTPRequest → http_request +func PascalCaseToSnakeCase(s string) string { + if s == "" { + return "" + } + + var result strings.Builder + var prevUpper bool + var nextUpper bool + + runes := []rune(s) + for i, r := range runes { + isUpper := unicode.IsUpper(r) + + if i+1 < len(runes) { + nextUpper = unicode.IsUpper(runes[i+1]) + } else { + nextUpper = false + } + + if i > 0 && isUpper { + // Add underscore before uppercase letter if: + // 1. Previous char was lowercase, OR + // 2. Next char is lowercase (end of acronym) + if !prevUpper || (nextUpper == false && i+1 < len(runes)) { + result.WriteRune('_') + } + } + + result.WriteRune(unicode.ToLower(r)) + prevUpper = isUpper + } + + return result.String() +} + +// capitalize capitalizes the first letter and handles common acronyms +func capitalize(s string) string { + if s == "" { + return "" + } + + upper := strings.ToUpper(s) + + // Handle common acronyms + acronyms := map[string]bool{ + "ID": true, + "UUID": true, + "GUID": true, + "URL": true, + "URI": true, + "HTTP": true, + "HTTPS": true, + "API": true, + "JSON": true, + "XML": true, + "SQL": true, + "HTML": true, + "CSS": true, + "RID": true, + } + + if acronyms[upper] { + return upper + } + + // Capitalize first letter + runes := []rune(s) + runes[0] = unicode.ToUpper(runes[0]) + return string(runes) +} + +// Pluralize converts a singular word to plural +// Basic implementation with common rules +func Pluralize(s string) string { + if s == "" { + return "" + } + + // Special cases + irregular := map[string]string{ + "person": "people", + "child": "children", + "tooth": "teeth", + "foot": "feet", + "man": "men", + "woman": "women", + "mouse": "mice", + "goose": "geese", + "ox": "oxen", + "datum": "data", + "medium": "media", + "analysis": "analyses", + "crisis": "crises", + "status": "statuses", + } + + if plural, ok := irregular[strings.ToLower(s)]; ok { + return plural + } + + // Already plural (ends in 's' but not 'ss' or 'us') + if strings.HasSuffix(s, "s") && !strings.HasSuffix(s, "ss") && !strings.HasSuffix(s, "us") { + return s + } + + // Words ending in s, x, z, ch, sh + if strings.HasSuffix(s, "s") || strings.HasSuffix(s, "x") || + strings.HasSuffix(s, "z") || strings.HasSuffix(s, "ch") || + strings.HasSuffix(s, "sh") { + return s + "es" + } + + // Words ending in consonant + y + if len(s) >= 2 && strings.HasSuffix(s, "y") { + prevChar := s[len(s)-2] + if !isVowel(prevChar) { + return s[:len(s)-1] + "ies" + } + } + + // Words ending in f or fe + if strings.HasSuffix(s, "f") { + return s[:len(s)-1] + "ves" + } + if strings.HasSuffix(s, "fe") { + return s[:len(s)-2] + "ves" + } + + // Words ending in consonant + o + if len(s) >= 2 && strings.HasSuffix(s, "o") { + prevChar := s[len(s)-2] + if !isVowel(prevChar) { + return s + "es" + } + } + + // Default: add 's' + return s + "s" +} + +// Singularize converts a plural word to singular +// Basic implementation with common rules +func Singularize(s string) string { + if s == "" { + return "" + } + + // Special cases + irregular := map[string]string{ + "people": "person", + "children": "child", + "teeth": "tooth", + "feet": "foot", + "men": "man", + "women": "woman", + "mice": "mouse", + "geese": "goose", + "oxen": "ox", + "data": "datum", + "media": "medium", + "analyses": "analysis", + "crises": "crisis", + "statuses": "status", + } + + if singular, ok := irregular[strings.ToLower(s)]; ok { + return singular + } + + // Words ending in ies + if strings.HasSuffix(s, "ies") && len(s) > 3 { + return s[:len(s)-3] + "y" + } + + // Words ending in ves + if strings.HasSuffix(s, "ves") { + return s[:len(s)-3] + "f" + } + + // Words ending in ses, xes, zes, ches, shes + if strings.HasSuffix(s, "ses") || strings.HasSuffix(s, "xes") || + strings.HasSuffix(s, "zes") || strings.HasSuffix(s, "ches") || + strings.HasSuffix(s, "shes") { + return s[:len(s)-2] + } + + // Words ending in s (not ss) + if strings.HasSuffix(s, "s") && !strings.HasSuffix(s, "ss") { + return s[:len(s)-1] + } + + // Already singular + return s +} + +// GeneratePrefix generates a 3-letter prefix from a table name +// Examples: process → PRO, mastertask → MTL, user → USR +func GeneratePrefix(tableName string) string { + if tableName == "" { + return "TBL" + } + + // Remove common prefixes + tableName = strings.TrimPrefix(tableName, "tbl_") + tableName = strings.TrimPrefix(tableName, "tb_") + + // Split by underscore and take first letters + parts := strings.Split(tableName, "_") + + var prefix strings.Builder + for _, part := range parts { + if part == "" { + continue + } + prefix.WriteRune(unicode.ToUpper(rune(part[0]))) + if prefix.Len() >= 3 { + break + } + } + + result := prefix.String() + + // If we don't have 3 letters yet, add more from the first part + if len(result) < 3 && len(parts) > 0 { + firstPart := parts[0] + for i := 1; i < len(firstPart) && len(result) < 3; i++ { + result += strings.ToUpper(string(firstPart[i])) + } + } + + // Pad with 'X' if still too short + for len(result) < 3 { + result += "X" + } + + return result[:3] +} + +// isVowel checks if a byte is a vowel +func isVowel(c byte) bool { + c = byte(unicode.ToLower(rune(c))) + return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' +} diff --git a/pkg/writers/bun/template_data.go b/pkg/writers/bun/template_data.go new file mode 100644 index 0000000..77821ef --- /dev/null +++ b/pkg/writers/bun/template_data.go @@ -0,0 +1,250 @@ +package bun + +import ( + "sort" + + "git.warky.dev/wdevs/relspecgo/pkg/models" +) + +// TemplateData represents the data passed to the template for code generation +type TemplateData struct { + PackageName string + Imports []string + Models []*ModelData + Config *MethodConfig +} + +// ModelData represents a single model/struct in the template +type ModelData struct { + Name string + TableName string // schema.table format + SchemaName string + TableNameOnly string // just table name without schema + Comment string + Fields []*FieldData + Config *MethodConfig + PrimaryKeyField string // Name of the primary key field + IDColumnName string // Name of the ID column in database + Prefix string // 3-letter prefix +} + +// FieldData represents a single field in a struct +type FieldData struct { + Name string // Go field name (PascalCase) + Type string // Go type + GormTag string // Complete gorm tag + JSONTag string // JSON tag + Comment string // Field comment +} + +// MethodConfig controls which helper methods to generate +type MethodConfig struct { + GenerateTableName bool + GenerateSchemaName bool + GenerateTableNameOnly bool + GenerateGetID bool + GenerateGetIDStr bool + GenerateSetID bool + GenerateUpdateID bool + GenerateGetIDName bool + GenerateGetPrefix bool +} + +// DefaultMethodConfig returns a MethodConfig with all methods enabled +func DefaultMethodConfig() *MethodConfig { + return &MethodConfig{ + GenerateTableName: true, + GenerateSchemaName: true, + GenerateTableNameOnly: true, + GenerateGetID: true, + GenerateGetIDStr: true, + GenerateSetID: true, + GenerateUpdateID: true, + GenerateGetIDName: true, + GenerateGetPrefix: true, + } +} + +// NewTemplateData creates a new TemplateData with the given package name and config +func NewTemplateData(packageName string, config *MethodConfig) *TemplateData { + if config == nil { + config = DefaultMethodConfig() + } + + return &TemplateData{ + PackageName: packageName, + Imports: make([]string, 0), + Models: make([]*ModelData, 0), + Config: config, + } +} + +// AddModel adds a model to the template data +func (td *TemplateData) AddModel(model *ModelData) { + model.Config = td.Config + td.Models = append(td.Models, model) +} + +// AddImport adds an import to the template data (deduplicates automatically) +func (td *TemplateData) AddImport(importPath string) { + // Check if already exists + for _, imp := range td.Imports { + if imp == importPath { + return + } + } + td.Imports = append(td.Imports, importPath) +} + +// FinalizeImports sorts and organizes imports +func (td *TemplateData) FinalizeImports() { + // Sort imports alphabetically + sort.Strings(td.Imports) +} + +// NewModelData creates a new ModelData from a models.Table +func NewModelData(table *models.Table, schema string, typeMapper *TypeMapper) *ModelData { + tableName := table.Name + if schema != "" { + tableName = schema + "." + table.Name + } + + // Generate model name: singularize and convert to PascalCase + singularTable := Singularize(table.Name) + modelName := SnakeCaseToPascalCase(singularTable) + + // Add "Model" prefix if not already present + if !hasModelPrefix(modelName) { + modelName = "Model" + modelName + } + + model := &ModelData{ + Name: modelName, + TableName: tableName, + SchemaName: schema, + TableNameOnly: table.Name, + Comment: formatComment(table.Description, table.Comment), + Fields: make([]*FieldData, 0), + Prefix: GeneratePrefix(table.Name), + } + + // Find primary key + for _, col := range table.Columns { + if col.IsPrimaryKey { + model.PrimaryKeyField = SnakeCaseToPascalCase(col.Name) + model.IDColumnName = col.Name + break + } + } + + // Convert columns to fields (sorted by sequence or name) + columns := sortColumns(table.Columns) + for _, col := range columns { + field := columnToField(col, table, typeMapper) + model.Fields = append(model.Fields, field) + } + + return model +} + +// columnToField converts a models.Column to FieldData +func columnToField(col *models.Column, table *models.Table, typeMapper *TypeMapper) *FieldData { + fieldName := SnakeCaseToPascalCase(col.Name) + goType := typeMapper.SQLTypeToGoType(col.Type, col.NotNull) + gormTag := typeMapper.BuildGormTag(col, table) + jsonTag := col.Name // Use column name for JSON tag + + return &FieldData{ + Name: fieldName, + Type: goType, + GormTag: gormTag, + JSONTag: jsonTag, + Comment: formatComment(col.Description, col.Comment), + } +} + +// AddRelationshipField adds a relationship field to the model +func (md *ModelData) AddRelationshipField(field *FieldData) { + md.Fields = append(md.Fields, field) +} + +// formatComment combines description and comment into a single comment string +func formatComment(description, comment string) string { + if description != "" && comment != "" { + return description + " - " + comment + } + if description != "" { + return description + } + return comment +} + +// hasModelPrefix checks if a name already has "Model" prefix +func hasModelPrefix(name string) bool { + return len(name) >= 5 && name[:5] == "Model" +} + +// sortColumns sorts columns by sequence, then by name +func sortColumns(columns map[string]*models.Column) []*models.Column { + result := make([]*models.Column, 0, len(columns)) + for _, col := range columns { + result = append(result, col) + } + + sort.Slice(result, func(i, j int) bool { + // Sort by sequence if both have it + if result[i].Sequence > 0 && result[j].Sequence > 0 { + return result[i].Sequence < result[j].Sequence + } + + // Put primary keys first + if result[i].IsPrimaryKey != result[j].IsPrimaryKey { + return result[i].IsPrimaryKey + } + + // Otherwise sort alphabetically + return result[i].Name < result[j].Name + }) + + return result +} + +// LoadMethodConfigFromMetadata loads method configuration from metadata map +func LoadMethodConfigFromMetadata(metadata map[string]interface{}) *MethodConfig { + config := DefaultMethodConfig() + + if metadata == nil { + return config + } + + // Load each setting from metadata if present + if val, ok := metadata["generate_table_name"].(bool); ok { + config.GenerateTableName = val + } + if val, ok := metadata["generate_schema_name"].(bool); ok { + config.GenerateSchemaName = val + } + if val, ok := metadata["generate_table_name_only"].(bool); ok { + config.GenerateTableNameOnly = val + } + if val, ok := metadata["generate_get_id"].(bool); ok { + config.GenerateGetID = val + } + if val, ok := metadata["generate_get_id_str"].(bool); ok { + config.GenerateGetIDStr = val + } + if val, ok := metadata["generate_set_id"].(bool); ok { + config.GenerateSetID = val + } + if val, ok := metadata["generate_update_id"].(bool); ok { + config.GenerateUpdateID = val + } + if val, ok := metadata["generate_get_id_name"].(bool); ok { + config.GenerateGetIDName = val + } + if val, ok := metadata["generate_get_prefix"].(bool); ok { + config.GenerateGetPrefix = val + } + + return config +} diff --git a/pkg/writers/bun/templates.go b/pkg/writers/bun/templates.go new file mode 100644 index 0000000..9b9331b --- /dev/null +++ b/pkg/writers/bun/templates.go @@ -0,0 +1,118 @@ +package bun + +import ( + "bytes" + "text/template" +) + +// modelTemplate defines the template for generating Bun models +const modelTemplate = `// Code generated by relspecgo. DO NOT EDIT. +package {{.PackageName}} + +{{if .Imports -}} +import ( +{{range .Imports -}} + {{.}} +{{end -}} +) +{{end}} +{{range .Models}} +{{if .Comment}}// {{.Comment}}{{end}} +type {{.Name}} struct { + bun.BaseModel ` + "`bun:\"table:{{.TableName}},alias:{{.TableNameOnly}}\"`" + ` +{{- range .Fields}} + {{.Name}} {{.Type}} ` + "`bun:\"{{.BunTag}}\" json:\"{{.JSONTag}}\"`" + `{{if .Comment}} // {{.Comment}}{{end}} +{{- end}} +} +{{if .Config.GenerateTableName}} +// TableName returns the table name for {{.Name}} +func (m {{.Name}}) TableName() string { + return "{{.TableName}}" +} +{{end}} +{{if .Config.GenerateTableNameOnly}} +// TableNameOnly returns the table name without schema for {{.Name}} +func (m {{.Name}}) TableNameOnly() string { + return "{{.TableNameOnly}}" +} +{{end}} +{{if .Config.GenerateSchemaName}} +// SchemaName returns the schema name for {{.Name}} +func (m {{.Name}}) SchemaName() string { + return "{{.SchemaName}}" +} +{{end}} +{{if and .Config.GenerateGetID .PrimaryKeyField}} +// GetID returns the primary key value +func (m {{.Name}}) GetID() int64 { + {{if .PrimaryKeyIsSQL -}} + return m.{{.PrimaryKeyField}}.Int64() + {{- else -}} + return int64(m.{{.PrimaryKeyField}}) + {{- end}} +} +{{end}} +{{if and .Config.GenerateGetIDStr .PrimaryKeyField}} +// GetIDStr returns the primary key as a string +func (m {{.Name}}) GetIDStr() string { + return fmt.Sprintf("%d", m.{{.PrimaryKeyField}}) +} +{{end}} +{{if and .Config.GenerateSetID .PrimaryKeyField}} +// SetID sets the primary key value +func (m {{.Name}}) SetID(newid int64) { + m.UpdateID(newid) +} +{{end}} +{{if and .Config.GenerateUpdateID .PrimaryKeyField}} +// UpdateID updates the primary key value +func (m *{{.Name}}) UpdateID(newid int64) { + {{if .PrimaryKeyIsSQL -}} + m.{{.PrimaryKeyField}}.FromString(fmt.Sprintf("%d", newid)) + {{- else -}} + m.{{.PrimaryKeyField}} = int32(newid) + {{- end}} +} +{{end}} +{{if and .Config.GenerateGetIDName .IDColumnName}} +// GetIDName returns the name of the primary key column +func (m {{.Name}}) GetIDName() string { + return "{{.IDColumnName}}" +} +{{end}} +{{if .Config.GenerateGetPrefix}} +// GetPrefix returns the table prefix +func (m {{.Name}}) GetPrefix() string { + return "{{.Prefix}}" +} +{{end}} +{{end -}} +` + +// Templates holds the parsed templates +type Templates struct { + modelTmpl *template.Template +} + +// NewTemplates creates and parses the templates +func NewTemplates() (*Templates, error) { + modelTmpl, err := template.New("model").Parse(modelTemplate) + if err != nil { + return nil, err + } + + return &Templates{ + modelTmpl: modelTmpl, + }, nil +} + +// GenerateCode executes the template with the given data +func (t *Templates) GenerateCode(data *TemplateData) (string, error) { + var buf bytes.Buffer + err := t.modelTmpl.Execute(&buf, data) + if err != nil { + return "", err + } + + return buf.String(), nil +} diff --git a/pkg/writers/bun/type_mapper.go b/pkg/writers/bun/type_mapper.go new file mode 100644 index 0000000..2a347a3 --- /dev/null +++ b/pkg/writers/bun/type_mapper.go @@ -0,0 +1,253 @@ +package bun + +import ( + "fmt" + "strings" + + "git.warky.dev/wdevs/relspecgo/pkg/models" +) + +// TypeMapper handles type conversions between SQL and Go types for Bun +type TypeMapper struct { + // Package alias for sql_types import + sqlTypesAlias string +} + +// NewTypeMapper creates a new TypeMapper with default settings +func NewTypeMapper() *TypeMapper { + return &TypeMapper{ + sqlTypesAlias: "resolvespec_common", + } +} + +// SQLTypeToGoType converts a SQL type to its Go equivalent +// Uses ResolveSpec common package types (all are nullable by default in Bun) +func (tm *TypeMapper) SQLTypeToGoType(sqlType string, notNull bool) string { + // Normalize SQL type (lowercase, remove length/precision) + baseType := tm.extractBaseType(sqlType) + + // For Bun, we typically use resolvespec_common types for most fields + // unless they're explicitly NOT NULL and we want to avoid null handling + if notNull && tm.isSimpleType(baseType) { + return tm.baseGoType(baseType) + } + + // Use resolvespec_common types for nullable fields + return tm.bunGoType(baseType) +} + +// extractBaseType extracts the base type from a SQL type string +func (tm *TypeMapper) extractBaseType(sqlType string) string { + sqlType = strings.ToLower(strings.TrimSpace(sqlType)) + + // Remove everything after '(' + if idx := strings.Index(sqlType, "("); idx > 0 { + sqlType = sqlType[:idx] + } + + return sqlType +} + +// isSimpleType checks if a type should use base Go type when NOT NULL +func (tm *TypeMapper) isSimpleType(sqlType string) bool { + simpleTypes := map[string]bool{ + "bigint": true, + "integer": true, + "int8": true, + "int4": true, + "boolean": true, + "bool": true, + } + return simpleTypes[sqlType] +} + +// baseGoType returns the base Go type for a SQL type (not null, simple types only) +func (tm *TypeMapper) baseGoType(sqlType string) string { + typeMap := map[string]string{ + "integer": "int32", + "int": "int32", + "int4": "int32", + "smallint": "int16", + "int2": "int16", + "bigint": "int64", + "int8": "int64", + "serial": "int32", + "bigserial": "int64", + "boolean": "bool", + "bool": "bool", + } + + if goType, ok := typeMap[sqlType]; ok { + return goType + } + + // Default to resolvespec type + return tm.bunGoType(sqlType) +} + +// bunGoType returns the Bun/ResolveSpec common type +func (tm *TypeMapper) bunGoType(sqlType string) string { + typeMap := map[string]string{ + // Integer types + "integer": tm.sqlTypesAlias + ".SqlInt32", + "int": tm.sqlTypesAlias + ".SqlInt32", + "int4": tm.sqlTypesAlias + ".SqlInt32", + "smallint": tm.sqlTypesAlias + ".SqlInt16", + "int2": tm.sqlTypesAlias + ".SqlInt16", + "bigint": tm.sqlTypesAlias + ".SqlInt64", + "int8": tm.sqlTypesAlias + ".SqlInt64", + "serial": tm.sqlTypesAlias + ".SqlInt32", + "bigserial": tm.sqlTypesAlias + ".SqlInt64", + "smallserial": tm.sqlTypesAlias + ".SqlInt16", + + // String types + "text": tm.sqlTypesAlias + ".SqlString", + "varchar": tm.sqlTypesAlias + ".SqlString", + "char": tm.sqlTypesAlias + ".SqlString", + "character": tm.sqlTypesAlias + ".SqlString", + "citext": tm.sqlTypesAlias + ".SqlString", + "bpchar": tm.sqlTypesAlias + ".SqlString", + + // Boolean + "boolean": tm.sqlTypesAlias + ".SqlBool", + "bool": tm.sqlTypesAlias + ".SqlBool", + + // Float types + "real": tm.sqlTypesAlias + ".SqlFloat32", + "float4": tm.sqlTypesAlias + ".SqlFloat32", + "double precision": tm.sqlTypesAlias + ".SqlFloat64", + "float8": tm.sqlTypesAlias + ".SqlFloat64", + "numeric": tm.sqlTypesAlias + ".SqlFloat64", + "decimal": tm.sqlTypesAlias + ".SqlFloat64", + + // Date/Time types + "timestamp": tm.sqlTypesAlias + ".SqlTime", + "timestamp without time zone": tm.sqlTypesAlias + ".SqlTime", + "timestamp with time zone": tm.sqlTypesAlias + ".SqlTime", + "timestamptz": tm.sqlTypesAlias + ".SqlTime", + "date": tm.sqlTypesAlias + ".SqlDate", + "time": tm.sqlTypesAlias + ".SqlTime", + "time without time zone": tm.sqlTypesAlias + ".SqlTime", + "time with time zone": tm.sqlTypesAlias + ".SqlTime", + "timetz": tm.sqlTypesAlias + ".SqlTime", + + // Binary + "bytea": "[]byte", + + // UUID + "uuid": tm.sqlTypesAlias + ".SqlUUID", + + // JSON + "json": tm.sqlTypesAlias + ".SqlJSON", + "jsonb": tm.sqlTypesAlias + ".SqlJSONB", + + // Network + "inet": tm.sqlTypesAlias + ".SqlString", + "cidr": tm.sqlTypesAlias + ".SqlString", + "macaddr": tm.sqlTypesAlias + ".SqlString", + + // Other + "money": tm.sqlTypesAlias + ".SqlFloat64", + } + + if goType, ok := typeMap[sqlType]; ok { + return goType + } + + // Default to SqlString for unknown types + return tm.sqlTypesAlias + ".SqlString" +} + +// BuildBunTag generates a complete Bun tag string for a column +// Bun format: bun:"column_name,type:type_name,pk,default:value" +func (tm *TypeMapper) BuildBunTag(column *models.Column, table *models.Table) string { + var parts []string + + // Column name comes first (no prefix) + parts = append(parts, column.Name) + + // Add type if specified + if column.Type != "" { + typeStr := column.Type + if column.Length > 0 { + typeStr = fmt.Sprintf("%s(%d)", typeStr, column.Length) + } else if column.Precision > 0 { + if column.Scale > 0 { + typeStr = fmt.Sprintf("%s(%d,%d)", typeStr, column.Precision, column.Scale) + } else { + typeStr = fmt.Sprintf("%s(%d)", typeStr, column.Precision) + } + } + parts = append(parts, fmt.Sprintf("type:%s", typeStr)) + } + + // Primary key + if column.IsPrimaryKey { + parts = append(parts, "pk") + } + + // Default value + if column.Default != nil { + parts = append(parts, fmt.Sprintf("default:%v", column.Default)) + } + + // Nullable (Bun uses nullzero for nullable fields) + if !column.NotNull && !column.IsPrimaryKey { + parts = append(parts, "nullzero") + } + + // Check for unique constraint + if table != nil { + for _, constraint := range table.Constraints { + if constraint.Type == models.UniqueConstraint { + for _, col := range constraint.Columns { + if col == column.Name { + parts = append(parts, "unique") + break + } + } + } + } + } + + // Join with commas and add trailing comma (Bun convention) + return strings.Join(parts, ",") + "," +} + +// BuildRelationshipTag generates Bun tag for relationship fields +// Bun format: bun:"rel:has-one,join:local_column=foreign_column" +func (tm *TypeMapper) BuildRelationshipTag(constraint *models.Constraint, relType string) string { + var parts []string + + // Add relationship type + parts = append(parts, fmt.Sprintf("rel:%s", relType)) + + // Add join clause + if len(constraint.Columns) > 0 && len(constraint.ReferencedColumns) > 0 { + localCol := constraint.Columns[0] + foreignCol := constraint.ReferencedColumns[0] + parts = append(parts, fmt.Sprintf("join:%s=%s", localCol, foreignCol)) + } + + return strings.Join(parts, ",") +} + +// NeedsTimeImport checks if the Go type requires time package import +func (tm *TypeMapper) NeedsTimeImport(goType string) bool { + return strings.Contains(goType, "time.Time") +} + +// NeedsFmtImport checks if we need fmt import (for GetIDStr method) +func (tm *TypeMapper) NeedsFmtImport(generateGetIDStr bool) bool { + return generateGetIDStr +} + +// GetSQLTypesImport returns the import path for sql_types (ResolveSpec common) +func (tm *TypeMapper) GetSQLTypesImport() string { + return "github.com/bitechdev/ResolveSpec/pkg/common" +} + +// GetBunImport returns the import path for Bun +func (tm *TypeMapper) GetBunImport() string { + return "github.com/uptrace/bun" +} diff --git a/pkg/writers/dbml/writer.go b/pkg/writers/dbml/writer.go new file mode 100644 index 0000000..d41d7b0 --- /dev/null +++ b/pkg/writers/dbml/writer.go @@ -0,0 +1,224 @@ +package dbml + +import ( + "fmt" + "os" + "strings" + + "git.warky.dev/wdevs/relspecgo/pkg/models" + "git.warky.dev/wdevs/relspecgo/pkg/writers" +) + +// Writer implements the writers.Writer interface for DBML format +type Writer struct { + options *writers.WriterOptions +} + +// NewWriter creates a new DBML writer with the given options +func NewWriter(options *writers.WriterOptions) *Writer { + return &Writer{ + options: options, + } +} + +// WriteDatabase writes a Database model to DBML format +func (w *Writer) WriteDatabase(db *models.Database) error { + content := w.databaseToDBML(db) + + if w.options.OutputPath != "" { + return os.WriteFile(w.options.OutputPath, []byte(content), 0644) + } + + // If no output path, print to stdout + fmt.Print(content) + return nil +} + +// WriteSchema writes a Schema model to DBML format +func (w *Writer) WriteSchema(schema *models.Schema) error { + content := w.schemaToDBML(schema) + + if w.options.OutputPath != "" { + return os.WriteFile(w.options.OutputPath, []byte(content), 0644) + } + + fmt.Print(content) + return nil +} + +// WriteTable writes a Table model to DBML format +func (w *Writer) WriteTable(table *models.Table) error { + content := w.tableToDBML(table, table.Schema) + + if w.options.OutputPath != "" { + return os.WriteFile(w.options.OutputPath, []byte(content), 0644) + } + + fmt.Print(content) + return nil +} + +// databaseToDBML converts a Database to DBML format string +func (w *Writer) databaseToDBML(d *models.Database) string { + var result string + + // Add database comment if exists + if d.Description != "" { + result += fmt.Sprintf("// %s\n", d.Description) + } + if d.Comment != "" { + result += fmt.Sprintf("// %s\n", d.Comment) + } + if d.Description != "" || d.Comment != "" { + result += "\n" + } + + // Process each schema + for _, schema := range d.Schemas { + result += w.schemaToDBML(schema) + } + + // Add relationships + result += "\n// Relationships\n" + for _, schema := range d.Schemas { + for _, table := range schema.Tables { + for _, constraint := range table.Constraints { + if constraint.Type == models.ForeignKeyConstraint { + result += w.constraintToDBML(constraint, schema.Name, table.Name) + } + } + } + } + + return result +} + +// schemaToDBML converts a Schema to DBML format string +func (w *Writer) schemaToDBML(schema *models.Schema) string { + var result string + + if schema.Description != "" { + result += fmt.Sprintf("// Schema: %s - %s\n", schema.Name, schema.Description) + } + + // Process tables + for _, table := range schema.Tables { + result += w.tableToDBML(table, schema.Name) + result += "\n" + } + + return result +} + +// tableToDBML converts a Table to DBML format string +func (w *Writer) tableToDBML(t *models.Table, schemaName string) string { + var result string + + // Table definition + tableName := fmt.Sprintf("%s.%s", schemaName, t.Name) + result += fmt.Sprintf("Table %s {\n", tableName) + + // Add columns + for _, column := range t.Columns { + result += fmt.Sprintf(" %s %s", column.Name, column.Type) + + // Add column attributes + attrs := make([]string, 0) + if column.IsPrimaryKey { + attrs = append(attrs, "primary key") + } + if column.NotNull && !column.IsPrimaryKey { + attrs = append(attrs, "not null") + } + if column.AutoIncrement { + attrs = append(attrs, "increment") + } + if column.Default != nil { + attrs = append(attrs, fmt.Sprintf("default: %v", column.Default)) + } + + if len(attrs) > 0 { + result += fmt.Sprintf(" [%s]", strings.Join(attrs, ", ")) + } + + if column.Comment != "" { + result += fmt.Sprintf(" // %s", column.Comment) + } + result += "\n" + } + + // Add indexes + indexCount := 0 + for _, index := range t.Indexes { + if indexCount == 0 { + result += "\n indexes {\n" + } + indexAttrs := make([]string, 0) + if index.Unique { + indexAttrs = append(indexAttrs, "unique") + } + if index.Name != "" { + indexAttrs = append(indexAttrs, fmt.Sprintf("name: '%s'", index.Name)) + } + if index.Type != "" { + indexAttrs = append(indexAttrs, fmt.Sprintf("type: %s", index.Type)) + } + + result += fmt.Sprintf(" (%s)", strings.Join(index.Columns, ", ")) + if len(indexAttrs) > 0 { + result += fmt.Sprintf(" [%s]", strings.Join(indexAttrs, ", ")) + } + result += "\n" + indexCount++ + } + if indexCount > 0 { + result += " }\n" + } + + // Add table note + if t.Description != "" || t.Comment != "" { + note := t.Description + if note != "" && t.Comment != "" { + note += " - " + } + note += t.Comment + result += fmt.Sprintf("\n Note: '%s'\n", note) + } + + result += "}\n" + return result +} + +// constraintToDBML converts a Constraint to DBML format string +func (w *Writer) constraintToDBML(c *models.Constraint, schemaName, tableName string) string { + if c.Type != models.ForeignKeyConstraint || c.ReferencedTable == "" { + return "" + } + + fromTable := fmt.Sprintf("%s.%s", schemaName, tableName) + toTable := fmt.Sprintf("%s.%s", c.ReferencedSchema, c.ReferencedTable) + + // Determine relationship cardinality + // For foreign keys, it's typically many-to-one + relationship := ">" + + fromCols := strings.Join(c.Columns, ", ") + toCols := strings.Join(c.ReferencedColumns, ", ") + + result := fmt.Sprintf("Ref: %s.(%s) %s %s.(%s)", fromTable, fromCols, relationship, toTable, toCols) + + // Add actions + actions := make([]string, 0) + if c.OnDelete != "" { + actions = append(actions, fmt.Sprintf("ondelete: %s", c.OnDelete)) + } + if c.OnUpdate != "" { + actions = append(actions, fmt.Sprintf("onupdate: %s", c.OnUpdate)) + } + if len(actions) > 0 { + result += fmt.Sprintf(" [%s]", strings.Join(actions, ", ")) + } + + result += "\n" + return result +} diff --git a/pkg/writers/dctx/writer.go b/pkg/writers/dctx/writer.go new file mode 100644 index 0000000..b697352 --- /dev/null +++ b/pkg/writers/dctx/writer.go @@ -0,0 +1,36 @@ +package dctx + +import ( + "fmt" + + "git.warky.dev/wdevs/relspecgo/pkg/models" + "git.warky.dev/wdevs/relspecgo/pkg/writers" +) + +// Writer implements the writers.Writer interface for DCTX format +// Note: DCTX is a read-only format used for loading Clarion dictionary files +type Writer struct { + options *writers.WriterOptions +} + +// NewWriter creates a new DCTX writer with the given options +func NewWriter(options *writers.WriterOptions) *Writer { + return &Writer{ + options: options, + } +} + +// WriteDatabase returns an error as DCTX format is read-only +func (w *Writer) WriteDatabase(db *models.Database) error { + return fmt.Errorf("DCTX format is read-only and does not support writing - it is used for loading Clarion dictionary files only") +} + +// WriteSchema returns an error as DCTX format is read-only +func (w *Writer) WriteSchema(schema *models.Schema) error { + return fmt.Errorf("DCTX format is read-only and does not support writing - it is used for loading Clarion dictionary files only") +} + +// WriteTable returns an error as DCTX format is read-only +func (w *Writer) WriteTable(table *models.Table) error { + return fmt.Errorf("DCTX format is read-only and does not support writing - it is used for loading Clarion dictionary files only") +} diff --git a/pkg/writers/drawdb/types.go b/pkg/writers/drawdb/types.go new file mode 100644 index 0000000..f48c48d --- /dev/null +++ b/pkg/writers/drawdb/types.go @@ -0,0 +1,77 @@ +package drawdb + +// DrawDBSchema represents the complete DrawDB JSON structure +type DrawDBSchema struct { + Tables []*DrawDBTable `json:"tables" yaml:"tables" xml:"tables"` + Relationships []*DrawDBRelationship `json:"relationships" yaml:"relationships" xml:"relationships"` + Notes []*DrawDBNote `json:"notes,omitempty" yaml:"notes,omitempty" xml:"notes,omitempty"` + SubjectAreas []*DrawDBArea `json:"subjectAreas,omitempty" yaml:"subjectAreas,omitempty" xml:"subjectAreas,omitempty"` +} + +// DrawDBTable represents a table in DrawDB format +type DrawDBTable struct { + ID int `json:"id" yaml:"id" xml:"id"` + Name string `json:"name" yaml:"name" xml:"name"` + Schema string `json:"schema,omitempty" yaml:"schema,omitempty" xml:"schema,omitempty"` + Comment string `json:"comment,omitempty" yaml:"comment,omitempty" xml:"comment,omitempty"` + Color string `json:"color" yaml:"color" xml:"color"` + X int `json:"x" yaml:"x" xml:"x"` + Y int `json:"y" yaml:"y" xml:"y"` + Fields []*DrawDBField `json:"fields" yaml:"fields" xml:"fields"` + Indexes []*DrawDBIndex `json:"indexes,omitempty" yaml:"indexes,omitempty" xml:"indexes,omitempty"` +} + +// DrawDBField represents a column/field in DrawDB format +type DrawDBField struct { + ID int `json:"id" yaml:"id" xml:"id"` + Name string `json:"name" yaml:"name" xml:"name"` + Type string `json:"type" yaml:"type" xml:"type"` + Default string `json:"default,omitempty" yaml:"default,omitempty" xml:"default,omitempty"` + Check string `json:"check,omitempty" yaml:"check,omitempty" xml:"check,omitempty"` + Primary bool `json:"primary" yaml:"primary" xml:"primary"` + Unique bool `json:"unique" yaml:"unique" xml:"unique"` + NotNull bool `json:"notNull" yaml:"notNull" xml:"notNull"` + Increment bool `json:"increment" yaml:"increment" xml:"increment"` + Comment string `json:"comment,omitempty" yaml:"comment,omitempty" xml:"comment,omitempty"` +} + +// DrawDBIndex represents an index in DrawDB format +type DrawDBIndex struct { + ID int `json:"id" yaml:"id" xml:"id"` + Name string `json:"name" yaml:"name" xml:"name"` + Unique bool `json:"unique" yaml:"unique" xml:"unique"` + Fields []int `json:"fields" yaml:"fields" xml:"fields"` // Field IDs +} + +// DrawDBRelationship represents a relationship in DrawDB format +type DrawDBRelationship struct { + ID int `json:"id" yaml:"id" xml:"id"` + Name string `json:"name" yaml:"name" xml:"name"` + StartTableID int `json:"startTableId" yaml:"startTableId" xml:"startTableId"` + EndTableID int `json:"endTableId" yaml:"endTableId" xml:"endTableId"` + StartFieldID int `json:"startFieldId" yaml:"startFieldId" xml:"startFieldId"` + EndFieldID int `json:"endFieldId" yaml:"endFieldId" xml:"endFieldId"` + Cardinality string `json:"cardinality" yaml:"cardinality" xml:"cardinality"` // "One to one", "One to many", "Many to one" + UpdateConstraint string `json:"updateConstraint,omitempty" yaml:"updateConstraint,omitempty" xml:"updateConstraint,omitempty"` + DeleteConstraint string `json:"deleteConstraint,omitempty" yaml:"deleteConstraint,omitempty" xml:"deleteConstraint,omitempty"` +} + +// DrawDBNote represents a note in DrawDB format +type DrawDBNote struct { + ID int `json:"id" yaml:"id" xml:"id"` + Content string `json:"content" yaml:"content" xml:"content"` + Color string `json:"color" yaml:"color" xml:"color"` + X int `json:"x" yaml:"x" xml:"x"` + Y int `json:"y" yaml:"y" xml:"y"` +} + +// DrawDBArea represents a subject area/grouping in DrawDB format +type DrawDBArea struct { + ID int `json:"id" yaml:"id" xml:"id"` + Name string `json:"name" yaml:"name" xml:"name"` + Color string `json:"color" yaml:"color" xml:"color"` + X int `json:"x" yaml:"x" xml:"x"` + Y int `json:"y" yaml:"y" xml:"y"` + Width int `json:"width" yaml:"width" xml:"width"` + Height int `json:"height" yaml:"height" xml:"height"` +} diff --git a/pkg/writers/drawdb/writer.go b/pkg/writers/drawdb/writer.go new file mode 100644 index 0000000..97fc981 --- /dev/null +++ b/pkg/writers/drawdb/writer.go @@ -0,0 +1,349 @@ +package drawdb + +import ( + "encoding/json" + "fmt" + "os" + + "git.warky.dev/wdevs/relspecgo/pkg/models" + "git.warky.dev/wdevs/relspecgo/pkg/writers" +) + +// Writer implements the writers.Writer interface for DrawDB JSON format +type Writer struct { + options *writers.WriterOptions +} + +// NewWriter creates a new DrawDB writer with the given options +func NewWriter(options *writers.WriterOptions) *Writer { + return &Writer{ + options: options, + } +} + +// WriteDatabase writes a Database model to DrawDB JSON format +func (w *Writer) WriteDatabase(db *models.Database) error { + schema := w.databaseToDrawDB(db) + return w.writeJSON(schema) +} + +// WriteSchema writes a Schema model to DrawDB JSON format +func (w *Writer) WriteSchema(schema *models.Schema) error { + drawSchema := w.schemaToDrawDB(schema) + return w.writeJSON(drawSchema) +} + +// WriteTable writes a Table model to DrawDB JSON format +func (w *Writer) WriteTable(table *models.Table) error { + drawSchema := w.tableToDrawDB(table) + return w.writeJSON(drawSchema) +} + +// writeJSON marshals the data to JSON and writes to output +func (w *Writer) writeJSON(data interface{}) error { + jsonData, err := json.MarshalIndent(data, "", " ") + if err != nil { + return fmt.Errorf("failed to marshal to JSON: %w", err) + } + + if w.options.OutputPath != "" { + return os.WriteFile(w.options.OutputPath, jsonData, 0644) + } + + // If no output path, print to stdout + fmt.Println(string(jsonData)) + return nil +} + +// databaseToDrawDB converts a Database to DrawDB JSON format +func (w *Writer) databaseToDrawDB(d *models.Database) *DrawDBSchema { + schema := &DrawDBSchema{ + Tables: make([]*DrawDBTable, 0), + Relationships: make([]*DrawDBRelationship, 0), + Notes: make([]*DrawDBNote, 0), + SubjectAreas: make([]*DrawDBArea, 0), + } + + // Track IDs and mappings + tableID := 0 + fieldID := 0 + relationshipID := 0 + noteID := 0 + areaID := 0 + + // Map to track table name to ID + tableMap := make(map[string]int) + // Map to track field full path to ID + fieldMap := make(map[string]int) + + // Position tables in a grid layout + gridX, gridY := 50, 50 + colWidth, rowHeight := 300, 200 + tablesPerRow := 4 + + tableIndex := 0 + + // Create subject areas for schemas + for schemaIdx, schemaModel := range d.Schemas { + if schemaModel.Description != "" || schemaModel.Comment != "" { + note := schemaModel.Description + if note != "" && schemaModel.Comment != "" { + note += "\n" + } + note += schemaModel.Comment + + area := &DrawDBArea{ + ID: areaID, + Name: schemaModel.Name, + Color: getColorForIndex(schemaIdx), + X: gridX - 20, + Y: gridY - 20, + Width: colWidth*tablesPerRow + 100, + Height: rowHeight*((len(schemaModel.Tables)/tablesPerRow)+1) + 100, + } + schema.SubjectAreas = append(schema.SubjectAreas, area) + areaID++ + } + + // Process tables in schema + for _, table := range schemaModel.Tables { + drawTable, newFieldID := w.convertTableToDrawDB(table, schemaModel.Name, tableID, fieldID, tableIndex, tablesPerRow, gridX, gridY, colWidth, rowHeight, schemaIdx) + + // Store table mapping + tableKey := fmt.Sprintf("%s.%s", schemaModel.Name, table.Name) + tableMap[tableKey] = tableID + + // Store field mappings + for _, field := range drawTable.Fields { + fieldKey := fmt.Sprintf("%s.%s.%s", schemaModel.Name, table.Name, field.Name) + fieldMap[fieldKey] = field.ID + } + + schema.Tables = append(schema.Tables, drawTable) + fieldID = newFieldID + tableID++ + tableIndex++ + } + } + + // Add relationships + for _, schemaModel := range d.Schemas { + for _, table := range schemaModel.Tables { + for _, constraint := range table.Constraints { + if constraint.Type == models.ForeignKeyConstraint && constraint.ReferencedTable != "" { + startTableKey := fmt.Sprintf("%s.%s", schemaModel.Name, table.Name) + endTableKey := fmt.Sprintf("%s.%s", constraint.ReferencedSchema, constraint.ReferencedTable) + + startTableID, startExists := tableMap[startTableKey] + endTableID, endExists := tableMap[endTableKey] + + if startExists && endExists && len(constraint.Columns) > 0 && len(constraint.ReferencedColumns) > 0 { + // Find relative field IDs within their tables + startFieldID := 0 + endFieldID := 0 + + for _, t := range schema.Tables { + if t.ID == startTableID { + for idx, f := range t.Fields { + if f.Name == constraint.Columns[0] { + startFieldID = idx + break + } + } + } + if t.ID == endTableID { + for idx, f := range t.Fields { + if f.Name == constraint.ReferencedColumns[0] { + endFieldID = idx + break + } + } + } + } + + relationship := &DrawDBRelationship{ + ID: relationshipID, + Name: constraint.Name, + StartTableID: startTableID, + EndTableID: endTableID, + StartFieldID: startFieldID, + EndFieldID: endFieldID, + Cardinality: "Many to one", + UpdateConstraint: constraint.OnUpdate, + DeleteConstraint: constraint.OnDelete, + } + + schema.Relationships = append(schema.Relationships, relationship) + relationshipID++ + } + } + } + } + } + + // Add database description as a note + if d.Description != "" || d.Comment != "" { + note := d.Description + if note != "" && d.Comment != "" { + note += "\n" + } + note += d.Comment + + schema.Notes = append(schema.Notes, &DrawDBNote{ + ID: noteID, + Content: fmt.Sprintf("Database: %s\n\n%s", d.Name, note), + Color: "#ffd93d", + X: 10, + Y: 10, + }) + } + + return schema +} + +// schemaToDrawDB converts a Schema to DrawDB format +func (w *Writer) schemaToDrawDB(schema *models.Schema) *DrawDBSchema { + drawSchema := &DrawDBSchema{ + Tables: make([]*DrawDBTable, 0), + Relationships: make([]*DrawDBRelationship, 0), + Notes: make([]*DrawDBNote, 0), + SubjectAreas: make([]*DrawDBArea, 0), + } + + tableID := 0 + fieldID := 0 + gridX, gridY := 50, 50 + colWidth, rowHeight := 300, 200 + tablesPerRow := 4 + + for idx, table := range schema.Tables { + drawTable, newFieldID := w.convertTableToDrawDB(table, schema.Name, tableID, fieldID, idx, tablesPerRow, gridX, gridY, colWidth, rowHeight, 0) + drawSchema.Tables = append(drawSchema.Tables, drawTable) + fieldID = newFieldID + tableID++ + } + + return drawSchema +} + +// tableToDrawDB converts a single Table to DrawDB format +func (w *Writer) tableToDrawDB(table *models.Table) *DrawDBSchema { + drawSchema := &DrawDBSchema{ + Tables: make([]*DrawDBTable, 0), + Relationships: make([]*DrawDBRelationship, 0), + Notes: make([]*DrawDBNote, 0), + SubjectAreas: make([]*DrawDBArea, 0), + } + + drawTable, _ := w.convertTableToDrawDB(table, table.Schema, 0, 0, 0, 4, 50, 50, 300, 200, 0) + drawSchema.Tables = append(drawSchema.Tables, drawTable) + + return drawSchema +} + +// convertTableToDrawDB converts a table to DrawDB format and returns the table and next field ID +func (w *Writer) convertTableToDrawDB(table *models.Table, schemaName string, tableID, fieldID, tableIndex, tablesPerRow, gridX, gridY, colWidth, rowHeight, colorIndex int) (*DrawDBTable, int) { + // Calculate position + x := gridX + (tableIndex%tablesPerRow)*colWidth + y := gridY + (tableIndex/tablesPerRow)*rowHeight + + drawTable := &DrawDBTable{ + ID: tableID, + Name: table.Name, + Schema: schemaName, + Comment: table.Description, + Color: getColorForIndex(colorIndex), + X: x, + Y: y, + Fields: make([]*DrawDBField, 0), + Indexes: make([]*DrawDBIndex, 0), + } + + // Add fields + for _, column := range table.Columns { + field := &DrawDBField{ + ID: fieldID, + Name: column.Name, + Type: formatTypeForDrawDB(column), + Primary: column.IsPrimaryKey, + NotNull: column.NotNull, + Increment: column.AutoIncrement, + Comment: column.Comment, + } + + if column.Default != nil { + field.Default = fmt.Sprintf("%v", column.Default) + } + + // Check for unique constraint + for _, constraint := range table.Constraints { + if constraint.Type == models.UniqueConstraint { + for _, col := range constraint.Columns { + if col == column.Name { + field.Unique = true + break + } + } + } + } + + drawTable.Fields = append(drawTable.Fields, field) + fieldID++ + } + + // Add indexes + indexID := 0 + for _, index := range table.Indexes { + drawIndex := &DrawDBIndex{ + ID: indexID, + Name: index.Name, + Unique: index.Unique, + Fields: make([]int, 0), + } + + // Map column names to field IDs + for _, colName := range index.Columns { + for idx, field := range drawTable.Fields { + if field.Name == colName { + drawIndex.Fields = append(drawIndex.Fields, idx) + break + } + } + } + + drawTable.Indexes = append(drawTable.Indexes, drawIndex) + indexID++ + } + + return drawTable, fieldID +} + +// Helper functions + +func formatTypeForDrawDB(column *models.Column) string { + typeStr := column.Type + if column.Length > 0 { + typeStr = fmt.Sprintf("%s(%d)", typeStr, column.Length) + } else if column.Precision > 0 { + if column.Scale > 0 { + typeStr = fmt.Sprintf("%s(%d,%d)", typeStr, column.Precision, column.Scale) + } else { + typeStr = fmt.Sprintf("%s(%d)", typeStr, column.Precision) + } + } + return typeStr +} + +func getColorForIndex(index int) string { + colors := []string{ + "#6366f1", // indigo + "#8b5cf6", // violet + "#ec4899", // pink + "#f43f5e", // rose + "#14b8a6", // teal + "#06b6d4", // cyan + "#0ea5e9", // sky + "#3b82f6", // blue + } + return colors[index%len(colors)] +} diff --git a/pkg/writers/gorm/name_converter.go b/pkg/writers/gorm/name_converter.go new file mode 100644 index 0000000..8df010b --- /dev/null +++ b/pkg/writers/gorm/name_converter.go @@ -0,0 +1,284 @@ +package gorm + +import ( + "strings" + "unicode" +) + +// SnakeCaseToPascalCase converts snake_case to PascalCase +// Examples: user_id → UserID, http_request → HTTPRequest +func SnakeCaseToPascalCase(s string) string { + if s == "" { + return "" + } + + parts := strings.Split(s, "_") + for i, part := range parts { + parts[i] = capitalize(part) + } + return strings.Join(parts, "") +} + +// SnakeCaseToCamelCase converts snake_case to camelCase +// Examples: user_id → userID, http_request → httpRequest +func SnakeCaseToCamelCase(s string) string { + if s == "" { + return "" + } + + parts := strings.Split(s, "_") + for i, part := range parts { + if i == 0 { + parts[i] = strings.ToLower(part) + } else { + parts[i] = capitalize(part) + } + } + return strings.Join(parts, "") +} + +// PascalCaseToSnakeCase converts PascalCase to snake_case +// Examples: UserID → user_id, HTTPRequest → http_request +func PascalCaseToSnakeCase(s string) string { + if s == "" { + return "" + } + + var result strings.Builder + var prevUpper bool + var nextUpper bool + + runes := []rune(s) + for i, r := range runes { + isUpper := unicode.IsUpper(r) + + if i+1 < len(runes) { + nextUpper = unicode.IsUpper(runes[i+1]) + } else { + nextUpper = false + } + + if i > 0 && isUpper { + // Add underscore before uppercase letter if: + // 1. Previous char was lowercase, OR + // 2. Next char is lowercase (end of acronym) + if !prevUpper || (nextUpper == false && i+1 < len(runes)) { + result.WriteRune('_') + } + } + + result.WriteRune(unicode.ToLower(r)) + prevUpper = isUpper + } + + return result.String() +} + +// capitalize capitalizes the first letter and handles common acronyms +func capitalize(s string) string { + if s == "" { + return "" + } + + upper := strings.ToUpper(s) + + // Handle common acronyms + acronyms := map[string]bool{ + "ID": true, + "UUID": true, + "GUID": true, + "URL": true, + "URI": true, + "HTTP": true, + "HTTPS": true, + "API": true, + "JSON": true, + "XML": true, + "SQL": true, + "HTML": true, + "CSS": true, + "RID": true, + } + + if acronyms[upper] { + return upper + } + + // Capitalize first letter + runes := []rune(s) + runes[0] = unicode.ToUpper(runes[0]) + return string(runes) +} + +// Pluralize converts a singular word to plural +// Basic implementation with common rules +func Pluralize(s string) string { + if s == "" { + return "" + } + + // Special cases + irregular := map[string]string{ + "person": "people", + "child": "children", + "tooth": "teeth", + "foot": "feet", + "man": "men", + "woman": "women", + "mouse": "mice", + "goose": "geese", + "ox": "oxen", + "datum": "data", + "medium": "media", + "analysis": "analyses", + "crisis": "crises", + "status": "statuses", + } + + if plural, ok := irregular[strings.ToLower(s)]; ok { + return plural + } + + // Already plural (ends in 's' but not 'ss' or 'us') + if strings.HasSuffix(s, "s") && !strings.HasSuffix(s, "ss") && !strings.HasSuffix(s, "us") { + return s + } + + // Words ending in s, x, z, ch, sh + if strings.HasSuffix(s, "s") || strings.HasSuffix(s, "x") || + strings.HasSuffix(s, "z") || strings.HasSuffix(s, "ch") || + strings.HasSuffix(s, "sh") { + return s + "es" + } + + // Words ending in consonant + y + if len(s) >= 2 && strings.HasSuffix(s, "y") { + prevChar := s[len(s)-2] + if !isVowel(prevChar) { + return s[:len(s)-1] + "ies" + } + } + + // Words ending in f or fe + if strings.HasSuffix(s, "f") { + return s[:len(s)-1] + "ves" + } + if strings.HasSuffix(s, "fe") { + return s[:len(s)-2] + "ves" + } + + // Words ending in consonant + o + if len(s) >= 2 && strings.HasSuffix(s, "o") { + prevChar := s[len(s)-2] + if !isVowel(prevChar) { + return s + "es" + } + } + + // Default: add 's' + return s + "s" +} + +// Singularize converts a plural word to singular +// Basic implementation with common rules +func Singularize(s string) string { + if s == "" { + return "" + } + + // Special cases + irregular := map[string]string{ + "people": "person", + "children": "child", + "teeth": "tooth", + "feet": "foot", + "men": "man", + "women": "woman", + "mice": "mouse", + "geese": "goose", + "oxen": "ox", + "data": "datum", + "media": "medium", + "analyses": "analysis", + "crises": "crisis", + "statuses": "status", + } + + if singular, ok := irregular[strings.ToLower(s)]; ok { + return singular + } + + // Words ending in ies + if strings.HasSuffix(s, "ies") && len(s) > 3 { + return s[:len(s)-3] + "y" + } + + // Words ending in ves + if strings.HasSuffix(s, "ves") { + return s[:len(s)-3] + "f" + } + + // Words ending in ses, xes, zes, ches, shes + if strings.HasSuffix(s, "ses") || strings.HasSuffix(s, "xes") || + strings.HasSuffix(s, "zes") || strings.HasSuffix(s, "ches") || + strings.HasSuffix(s, "shes") { + return s[:len(s)-2] + } + + // Words ending in s (not ss) + if strings.HasSuffix(s, "s") && !strings.HasSuffix(s, "ss") { + return s[:len(s)-1] + } + + // Already singular + return s +} + +// GeneratePrefix generates a 3-letter prefix from a table name +// Examples: process → PRO, mastertask → MTL, user → USR +func GeneratePrefix(tableName string) string { + if tableName == "" { + return "TBL" + } + + // Remove common prefixes + tableName = strings.TrimPrefix(tableName, "tbl_") + tableName = strings.TrimPrefix(tableName, "tb_") + + // Split by underscore and take first letters + parts := strings.Split(tableName, "_") + + var prefix strings.Builder + for _, part := range parts { + if part == "" { + continue + } + prefix.WriteRune(unicode.ToUpper(rune(part[0]))) + if prefix.Len() >= 3 { + break + } + } + + result := prefix.String() + + // If we don't have 3 letters yet, add more from the first part + if len(result) < 3 && len(parts) > 0 { + firstPart := parts[0] + for i := 1; i < len(firstPart) && len(result) < 3; i++ { + result += strings.ToUpper(string(firstPart[i])) + } + } + + // Pad with 'X' if still too short + for len(result) < 3 { + result += "X" + } + + return result[:3] +} + +// isVowel checks if a byte is a vowel +func isVowel(c byte) bool { + c = byte(unicode.ToLower(rune(c))) + return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' +} diff --git a/pkg/writers/gorm/template_data.go b/pkg/writers/gorm/template_data.go new file mode 100644 index 0000000..9889db0 --- /dev/null +++ b/pkg/writers/gorm/template_data.go @@ -0,0 +1,250 @@ +package gorm + +import ( + "sort" + + "git.warky.dev/wdevs/relspecgo/pkg/models" +) + +// TemplateData represents the data passed to the template for code generation +type TemplateData struct { + PackageName string + Imports []string + Models []*ModelData + Config *MethodConfig +} + +// ModelData represents a single model/struct in the template +type ModelData struct { + Name string + TableName string // schema.table format + SchemaName string + TableNameOnly string // just table name without schema + Comment string + Fields []*FieldData + Config *MethodConfig + PrimaryKeyField string // Name of the primary key field + IDColumnName string // Name of the ID column in database + Prefix string // 3-letter prefix +} + +// FieldData represents a single field in a struct +type FieldData struct { + Name string // Go field name (PascalCase) + Type string // Go type + GormTag string // Complete gorm tag + JSONTag string // JSON tag + Comment string // Field comment +} + +// MethodConfig controls which helper methods to generate +type MethodConfig struct { + GenerateTableName bool + GenerateSchemaName bool + GenerateTableNameOnly bool + GenerateGetID bool + GenerateGetIDStr bool + GenerateSetID bool + GenerateUpdateID bool + GenerateGetIDName bool + GenerateGetPrefix bool +} + +// DefaultMethodConfig returns a MethodConfig with all methods enabled +func DefaultMethodConfig() *MethodConfig { + return &MethodConfig{ + GenerateTableName: true, + GenerateSchemaName: true, + GenerateTableNameOnly: true, + GenerateGetID: true, + GenerateGetIDStr: true, + GenerateSetID: true, + GenerateUpdateID: true, + GenerateGetIDName: true, + GenerateGetPrefix: true, + } +} + +// NewTemplateData creates a new TemplateData with the given package name and config +func NewTemplateData(packageName string, config *MethodConfig) *TemplateData { + if config == nil { + config = DefaultMethodConfig() + } + + return &TemplateData{ + PackageName: packageName, + Imports: make([]string, 0), + Models: make([]*ModelData, 0), + Config: config, + } +} + +// AddModel adds a model to the template data +func (td *TemplateData) AddModel(model *ModelData) { + model.Config = td.Config + td.Models = append(td.Models, model) +} + +// AddImport adds an import to the template data (deduplicates automatically) +func (td *TemplateData) AddImport(importPath string) { + // Check if already exists + for _, imp := range td.Imports { + if imp == importPath { + return + } + } + td.Imports = append(td.Imports, importPath) +} + +// FinalizeImports sorts and organizes imports +func (td *TemplateData) FinalizeImports() { + // Sort imports alphabetically + sort.Strings(td.Imports) +} + +// NewModelData creates a new ModelData from a models.Table +func NewModelData(table *models.Table, schema string, typeMapper *TypeMapper) *ModelData { + tableName := table.Name + if schema != "" { + tableName = schema + "." + table.Name + } + + // Generate model name: singularize and convert to PascalCase + singularTable := Singularize(table.Name) + modelName := SnakeCaseToPascalCase(singularTable) + + // Add "Model" prefix if not already present + if !hasModelPrefix(modelName) { + modelName = "Model" + modelName + } + + model := &ModelData{ + Name: modelName, + TableName: tableName, + SchemaName: schema, + TableNameOnly: table.Name, + Comment: formatComment(table.Description, table.Comment), + Fields: make([]*FieldData, 0), + Prefix: GeneratePrefix(table.Name), + } + + // Find primary key + for _, col := range table.Columns { + if col.IsPrimaryKey { + model.PrimaryKeyField = SnakeCaseToPascalCase(col.Name) + model.IDColumnName = col.Name + break + } + } + + // Convert columns to fields (sorted by sequence or name) + columns := sortColumns(table.Columns) + for _, col := range columns { + field := columnToField(col, table, typeMapper) + model.Fields = append(model.Fields, field) + } + + return model +} + +// columnToField converts a models.Column to FieldData +func columnToField(col *models.Column, table *models.Table, typeMapper *TypeMapper) *FieldData { + fieldName := SnakeCaseToPascalCase(col.Name) + goType := typeMapper.SQLTypeToGoType(col.Type, col.NotNull) + gormTag := typeMapper.BuildGormTag(col, table) + jsonTag := col.Name // Use column name for JSON tag + + return &FieldData{ + Name: fieldName, + Type: goType, + GormTag: gormTag, + JSONTag: jsonTag, + Comment: formatComment(col.Description, col.Comment), + } +} + +// AddRelationshipField adds a relationship field to the model +func (md *ModelData) AddRelationshipField(field *FieldData) { + md.Fields = append(md.Fields, field) +} + +// formatComment combines description and comment into a single comment string +func formatComment(description, comment string) string { + if description != "" && comment != "" { + return description + " - " + comment + } + if description != "" { + return description + } + return comment +} + +// hasModelPrefix checks if a name already has "Model" prefix +func hasModelPrefix(name string) bool { + return len(name) >= 5 && name[:5] == "Model" +} + +// sortColumns sorts columns by sequence, then by name +func sortColumns(columns map[string]*models.Column) []*models.Column { + result := make([]*models.Column, 0, len(columns)) + for _, col := range columns { + result = append(result, col) + } + + sort.Slice(result, func(i, j int) bool { + // Sort by sequence if both have it + if result[i].Sequence > 0 && result[j].Sequence > 0 { + return result[i].Sequence < result[j].Sequence + } + + // Put primary keys first + if result[i].IsPrimaryKey != result[j].IsPrimaryKey { + return result[i].IsPrimaryKey + } + + // Otherwise sort alphabetically + return result[i].Name < result[j].Name + }) + + return result +} + +// LoadMethodConfigFromMetadata loads method configuration from metadata map +func LoadMethodConfigFromMetadata(metadata map[string]interface{}) *MethodConfig { + config := DefaultMethodConfig() + + if metadata == nil { + return config + } + + // Load each setting from metadata if present + if val, ok := metadata["generate_table_name"].(bool); ok { + config.GenerateTableName = val + } + if val, ok := metadata["generate_schema_name"].(bool); ok { + config.GenerateSchemaName = val + } + if val, ok := metadata["generate_table_name_only"].(bool); ok { + config.GenerateTableNameOnly = val + } + if val, ok := metadata["generate_get_id"].(bool); ok { + config.GenerateGetID = val + } + if val, ok := metadata["generate_get_id_str"].(bool); ok { + config.GenerateGetIDStr = val + } + if val, ok := metadata["generate_set_id"].(bool); ok { + config.GenerateSetID = val + } + if val, ok := metadata["generate_update_id"].(bool); ok { + config.GenerateUpdateID = val + } + if val, ok := metadata["generate_get_id_name"].(bool); ok { + config.GenerateGetIDName = val + } + if val, ok := metadata["generate_get_prefix"].(bool); ok { + config.GenerateGetPrefix = val + } + + return config +} diff --git a/pkg/writers/gorm/templates.go b/pkg/writers/gorm/templates.go new file mode 100644 index 0000000..a7b1f00 --- /dev/null +++ b/pkg/writers/gorm/templates.go @@ -0,0 +1,109 @@ +package gorm + +import ( + "bytes" + "text/template" +) + +// modelTemplate defines the template for generating GORM models +const modelTemplate = `// Code generated by relspecgo. DO NOT EDIT. +package {{.PackageName}} + +{{if .Imports -}} +import ( +{{range .Imports -}} + {{.}} +{{end -}} +) +{{end}} +{{range .Models}} +{{if .Comment}}// {{.Comment}}{{end}} +type {{.Name}} struct { +{{- range .Fields}} + {{.Name}} {{.Type}} ` + "`gorm:\"{{.GormTag}}\" json:\"{{.JSONTag}}\"`" + `{{if .Comment}} // {{.Comment}}{{end}} +{{- end}} +} +{{if .Config.GenerateTableName}} +// TableName returns the table name for {{.Name}} +func (m {{.Name}}) TableName() string { + return "{{.TableName}}" +} +{{end}} +{{if .Config.GenerateTableNameOnly}} +// TableNameOnly returns the table name without schema for {{.Name}} +func (m {{.Name}}) TableNameOnly() string { + return "{{.TableNameOnly}}" +} +{{end}} +{{if .Config.GenerateSchemaName}} +// SchemaName returns the schema name for {{.Name}} +func (m {{.Name}}) SchemaName() string { + return "{{.SchemaName}}" +} +{{end}} +{{if and .Config.GenerateGetID .PrimaryKeyField}} +// GetID returns the primary key value +func (m {{.Name}}) GetID() int64 { + return int64(m.{{.PrimaryKeyField}}) +} +{{end}} +{{if and .Config.GenerateGetIDStr .PrimaryKeyField}} +// GetIDStr returns the primary key as a string +func (m {{.Name}}) GetIDStr() string { + return fmt.Sprintf("%d", m.{{.PrimaryKeyField}}) +} +{{end}} +{{if and .Config.GenerateSetID .PrimaryKeyField}} +// SetID sets the primary key value +func (m {{.Name}}) SetID(newid int64) { + m.UpdateID(newid) +} +{{end}} +{{if and .Config.GenerateUpdateID .PrimaryKeyField}} +// UpdateID updates the primary key value +func (m *{{.Name}}) UpdateID(newid int64) { + m.{{.PrimaryKeyField}} = int32(newid) +} +{{end}} +{{if and .Config.GenerateGetIDName .IDColumnName}} +// GetIDName returns the name of the primary key column +func (m {{.Name}}) GetIDName() string { + return "{{.IDColumnName}}" +} +{{end}} +{{if .Config.GenerateGetPrefix}} +// GetPrefix returns the table prefix +func (m {{.Name}}) GetPrefix() string { + return "{{.Prefix}}" +} +{{end}} +{{end -}} +` + +// Templates holds the parsed templates +type Templates struct { + modelTmpl *template.Template +} + +// NewTemplates creates and parses the templates +func NewTemplates() (*Templates, error) { + modelTmpl, err := template.New("model").Parse(modelTemplate) + if err != nil { + return nil, err + } + + return &Templates{ + modelTmpl: modelTmpl, + }, nil +} + +// GenerateCode executes the template with the given data +func (t *Templates) GenerateCode(data *TemplateData) (string, error) { + var buf bytes.Buffer + err := t.modelTmpl.Execute(&buf, data) + if err != nil { + return "", err + } + + return buf.String(), nil +} diff --git a/pkg/writers/gorm/type_mapper.go b/pkg/writers/gorm/type_mapper.go new file mode 100644 index 0000000..fcb4070 --- /dev/null +++ b/pkg/writers/gorm/type_mapper.go @@ -0,0 +1,335 @@ +package gorm + +import ( + "fmt" + "strings" + + "git.warky.dev/wdevs/relspecgo/pkg/models" +) + +// TypeMapper handles type conversions between SQL and Go types +type TypeMapper struct { + // Package alias for sql_types import + sqlTypesAlias string +} + +// NewTypeMapper creates a new TypeMapper with default settings +func NewTypeMapper() *TypeMapper { + return &TypeMapper{ + sqlTypesAlias: "sql_types", + } +} + +// SQLTypeToGoType converts a SQL type to its Go equivalent +// Handles nullable types using ResolveSpec sql_types package +func (tm *TypeMapper) SQLTypeToGoType(sqlType string, notNull bool) string { + // Normalize SQL type (lowercase, remove length/precision) + baseType := tm.extractBaseType(sqlType) + + // If not null, use base Go types + if notNull { + return tm.baseGoType(baseType) + } + + // For nullable fields, use sql_types + return tm.nullableGoType(baseType) +} + +// extractBaseType extracts the base type from a SQL type string +// Examples: varchar(100) → varchar, numeric(10,2) → numeric +func (tm *TypeMapper) extractBaseType(sqlType string) string { + sqlType = strings.ToLower(strings.TrimSpace(sqlType)) + + // Remove everything after '(' + if idx := strings.Index(sqlType, "("); idx > 0 { + sqlType = sqlType[:idx] + } + + return sqlType +} + +// baseGoType returns the base Go type for a SQL type (not null) +func (tm *TypeMapper) baseGoType(sqlType string) string { + typeMap := map[string]string{ + // Integer types + "integer": "int32", + "int": "int32", + "int4": "int32", + "smallint": "int16", + "int2": "int16", + "bigint": "int64", + "int8": "int64", + "serial": "int32", + "bigserial": "int64", + "smallserial": "int16", + + // String types + "text": "string", + "varchar": "string", + "char": "string", + "character": "string", + "citext": "string", + "bpchar": "string", + + // Boolean + "boolean": "bool", + "bool": "bool", + + // Float types + "real": "float32", + "float4": "float32", + "double precision": "float64", + "float8": "float64", + "numeric": "float64", + "decimal": "float64", + + // Date/Time types + "timestamp": "time.Time", + "timestamp without time zone": "time.Time", + "timestamp with time zone": "time.Time", + "timestamptz": "time.Time", + "date": "time.Time", + "time": "time.Time", + "time without time zone": "time.Time", + "time with time zone": "time.Time", + "timetz": "time.Time", + + // Binary + "bytea": "[]byte", + + // UUID + "uuid": "string", + + // JSON + "json": "string", + "jsonb": "string", + + // Network + "inet": "string", + "cidr": "string", + "macaddr": "string", + + // Other + "money": "float64", + } + + if goType, ok := typeMap[sqlType]; ok { + return goType + } + + // Default to string for unknown types + return "string" +} + +// nullableGoType returns the nullable Go type using sql_types package +func (tm *TypeMapper) nullableGoType(sqlType string) string { + typeMap := map[string]string{ + // Integer types + "integer": tm.sqlTypesAlias + ".SqlInt32", + "int": tm.sqlTypesAlias + ".SqlInt32", + "int4": tm.sqlTypesAlias + ".SqlInt32", + "smallint": tm.sqlTypesAlias + ".SqlInt16", + "int2": tm.sqlTypesAlias + ".SqlInt16", + "bigint": tm.sqlTypesAlias + ".SqlInt64", + "int8": tm.sqlTypesAlias + ".SqlInt64", + "serial": tm.sqlTypesAlias + ".SqlInt32", + "bigserial": tm.sqlTypesAlias + ".SqlInt64", + "smallserial": tm.sqlTypesAlias + ".SqlInt16", + + // String types + "text": tm.sqlTypesAlias + ".SqlString", + "varchar": tm.sqlTypesAlias + ".SqlString", + "char": tm.sqlTypesAlias + ".SqlString", + "character": tm.sqlTypesAlias + ".SqlString", + "citext": tm.sqlTypesAlias + ".SqlString", + "bpchar": tm.sqlTypesAlias + ".SqlString", + + // Boolean + "boolean": tm.sqlTypesAlias + ".SqlBool", + "bool": tm.sqlTypesAlias + ".SqlBool", + + // Float types + "real": tm.sqlTypesAlias + ".SqlFloat32", + "float4": tm.sqlTypesAlias + ".SqlFloat32", + "double precision": tm.sqlTypesAlias + ".SqlFloat64", + "float8": tm.sqlTypesAlias + ".SqlFloat64", + "numeric": tm.sqlTypesAlias + ".SqlFloat64", + "decimal": tm.sqlTypesAlias + ".SqlFloat64", + + // Date/Time types + "timestamp": tm.sqlTypesAlias + ".SqlTime", + "timestamp without time zone": tm.sqlTypesAlias + ".SqlTime", + "timestamp with time zone": tm.sqlTypesAlias + ".SqlTime", + "timestamptz": tm.sqlTypesAlias + ".SqlTime", + "date": tm.sqlTypesAlias + ".SqlDate", + "time": tm.sqlTypesAlias + ".SqlTime", + "time without time zone": tm.sqlTypesAlias + ".SqlTime", + "time with time zone": tm.sqlTypesAlias + ".SqlTime", + "timetz": tm.sqlTypesAlias + ".SqlTime", + + // Binary + "bytea": "[]byte", // No nullable version needed + + // UUID + "uuid": tm.sqlTypesAlias + ".SqlUUID", + + // JSON + "json": tm.sqlTypesAlias + ".SqlString", + "jsonb": tm.sqlTypesAlias + ".SqlString", + + // Network + "inet": tm.sqlTypesAlias + ".SqlString", + "cidr": tm.sqlTypesAlias + ".SqlString", + "macaddr": tm.sqlTypesAlias + ".SqlString", + + // Other + "money": tm.sqlTypesAlias + ".SqlFloat64", + } + + if goType, ok := typeMap[sqlType]; ok { + return goType + } + + // Default to SqlString for unknown types + return tm.sqlTypesAlias + ".SqlString" +} + +// BuildGormTag generates a complete GORM tag string for a column +func (tm *TypeMapper) BuildGormTag(column *models.Column, table *models.Table) string { + var parts []string + + // Always include column name (lowercase as per user requirement) + parts = append(parts, fmt.Sprintf("column:%s", column.Name)) + + // Add type if specified + if column.Type != "" { + // Include length, precision, scale if present + typeStr := column.Type + if column.Length > 0 { + typeStr = fmt.Sprintf("%s(%d)", typeStr, column.Length) + } else if column.Precision > 0 { + if column.Scale > 0 { + typeStr = fmt.Sprintf("%s(%d,%d)", typeStr, column.Precision, column.Scale) + } else { + typeStr = fmt.Sprintf("%s(%d)", typeStr, column.Precision) + } + } + parts = append(parts, fmt.Sprintf("type:%s", typeStr)) + } + + // Primary key + if column.IsPrimaryKey { + parts = append(parts, "primaryKey") + } + + // Auto increment + if column.AutoIncrement { + parts = append(parts, "autoIncrement") + } + + // Not null (skip if primary key, as it's implied) + if column.NotNull && !column.IsPrimaryKey { + parts = append(parts, "not null") + } + + // Default value + if column.Default != nil { + parts = append(parts, fmt.Sprintf("default:%v", column.Default)) + } + + // Check for unique constraint + if table != nil { + for _, constraint := range table.Constraints { + if constraint.Type == models.UniqueConstraint { + for _, col := range constraint.Columns { + if col == column.Name { + if constraint.Name != "" { + parts = append(parts, fmt.Sprintf("uniqueIndex:%s", constraint.Name)) + } else { + parts = append(parts, "unique") + } + break + } + } + } + } + + // Check for index + for _, index := range table.Indexes { + for _, col := range index.Columns { + if col == column.Name { + if index.Unique { + if index.Name != "" { + parts = append(parts, fmt.Sprintf("uniqueIndex:%s", index.Name)) + } else { + parts = append(parts, "unique") + } + } else { + if index.Name != "" { + parts = append(parts, fmt.Sprintf("index:%s", index.Name)) + } else { + parts = append(parts, "index") + } + } + break + } + } + } + } + + return strings.Join(parts, ";") +} + +// BuildRelationshipTag generates GORM tag for relationship fields +func (tm *TypeMapper) BuildRelationshipTag(constraint *models.Constraint, isParent bool) string { + var parts []string + + if !isParent { + // Child side (has foreign key) + if len(constraint.Columns) > 0 && len(constraint.ReferencedColumns) > 0 { + // foreignKey points to the field name in this struct + fkFieldName := SnakeCaseToPascalCase(constraint.Columns[0]) + parts = append(parts, fmt.Sprintf("foreignKey:%s", fkFieldName)) + + // references points to the field name in the other struct + refFieldName := SnakeCaseToPascalCase(constraint.ReferencedColumns[0]) + parts = append(parts, fmt.Sprintf("references:%s", refFieldName)) + } + } else { + // Parent side (being referenced) + if len(constraint.Columns) > 0 { + fkFieldName := SnakeCaseToPascalCase(constraint.Columns[0]) + parts = append(parts, fmt.Sprintf("foreignKey:%s", fkFieldName)) + } + } + + // Add constraint actions + if constraint.OnDelete != "" { + parts = append(parts, fmt.Sprintf("constraint:OnDelete:%s", strings.ToUpper(constraint.OnDelete))) + } + if constraint.OnUpdate != "" { + if len(parts) > 0 && strings.Contains(parts[len(parts)-1], "constraint:") { + // Append to existing constraint + parts[len(parts)-1] += fmt.Sprintf(",OnUpdate:%s", strings.ToUpper(constraint.OnUpdate)) + } else { + parts = append(parts, fmt.Sprintf("constraint:OnUpdate:%s", strings.ToUpper(constraint.OnUpdate))) + } + } + + return strings.Join(parts, ";") +} + +// NeedsTimeImport checks if the Go type requires time package import +func (tm *TypeMapper) NeedsTimeImport(goType string) bool { + return strings.Contains(goType, "time.Time") +} + +// NeedsFmtImport checks if we need fmt import (for GetIDStr method) +func (tm *TypeMapper) NeedsFmtImport(generateGetIDStr bool) bool { + return generateGetIDStr +} + +// GetSQLTypesImport returns the import path for sql_types +func (tm *TypeMapper) GetSQLTypesImport() string { + return "github.com/bitechdev/ResolveSpec/pkg/common/sql_types" +} diff --git a/pkg/writers/gorm/writer.go b/pkg/writers/gorm/writer.go new file mode 100644 index 0000000..2bc5f2f --- /dev/null +++ b/pkg/writers/gorm/writer.go @@ -0,0 +1,324 @@ +package gorm + +import ( + "fmt" + "go/format" + "os" + "path/filepath" + "strings" + + "git.warky.dev/wdevs/relspecgo/pkg/models" + "git.warky.dev/wdevs/relspecgo/pkg/writers" +) + +// Writer implements the writers.Writer interface for GORM models +type Writer struct { + options *writers.WriterOptions + typeMapper *TypeMapper + templates *Templates + config *MethodConfig +} + +// NewWriter creates a new GORM writer with the given options +func NewWriter(options *writers.WriterOptions) *Writer { + w := &Writer{ + options: options, + typeMapper: NewTypeMapper(), + config: LoadMethodConfigFromMetadata(options.Metadata), + } + + // Initialize templates + tmpl, err := NewTemplates() + if err != nil { + // Should not happen with embedded templates + panic(fmt.Sprintf("failed to initialize templates: %v", err)) + } + w.templates = tmpl + + return w +} + +// WriteDatabase writes a complete database as GORM models +func (w *Writer) WriteDatabase(db *models.Database) error { + // Check if multi-file mode is enabled + multiFile := false + if w.options.Metadata != nil { + if mf, ok := w.options.Metadata["multi_file"].(bool); ok { + multiFile = mf + } + } + + if multiFile { + return w.writeMultiFile(db) + } + + return w.writeSingleFile(db) +} + +// WriteSchema writes a schema as GORM models +func (w *Writer) WriteSchema(schema *models.Schema) error { + // Create a temporary database with just this schema + db := models.InitDatabase(schema.Name) + db.Schemas = []*models.Schema{schema} + + return w.WriteDatabase(db) +} + +// WriteTable writes a single table as a GORM model +func (w *Writer) WriteTable(table *models.Table) error { + // Create a temporary schema and database + schema := models.InitSchema(table.Schema) + schema.Tables = []*models.Table{table} + + db := models.InitDatabase(schema.Name) + db.Schemas = []*models.Schema{schema} + + return w.WriteDatabase(db) +} + +// writeSingleFile writes all models to a single file +func (w *Writer) writeSingleFile(db *models.Database) error { + packageName := w.getPackageName() + templateData := NewTemplateData(packageName, w.config) + + // Add sql_types import (always needed for nullable types) + templateData.AddImport(fmt.Sprintf("sql_types \"%s\"", w.typeMapper.GetSQLTypesImport())) + + // Collect all models + for _, schema := range db.Schemas { + for _, table := range schema.Tables { + modelData := NewModelData(table, schema.Name, w.typeMapper) + + // Add relationship fields + w.addRelationshipFields(modelData, table, schema, db) + + templateData.AddModel(modelData) + + // Check if we need time import + for _, field := range modelData.Fields { + if w.typeMapper.NeedsTimeImport(field.Type) { + templateData.AddImport("\"time\"") + } + } + } + } + + // Add fmt import if GetIDStr is enabled + if w.config.GenerateGetIDStr { + templateData.AddImport("\"fmt\"") + } + + // Finalize imports + templateData.FinalizeImports() + + // Generate code + code, err := w.templates.GenerateCode(templateData) + if err != nil { + return fmt.Errorf("failed to generate code: %w", err) + } + + // Format code + formatted, err := w.formatCode(code) + if err != nil { + // Return unformatted code with warning + fmt.Fprintf(os.Stderr, "Warning: failed to format code: %v\n", err) + formatted = code + } + + // Write output + return w.writeOutput(formatted) +} + +// writeMultiFile writes each table to a separate file +func (w *Writer) writeMultiFile(db *models.Database) error { + packageName := w.getPackageName() + + // Ensure output path is a directory + if w.options.OutputPath == "" { + return fmt.Errorf("output path is required for multi-file mode") + } + + // Create output directory if it doesn't exist + if err := os.MkdirAll(w.options.OutputPath, 0755); err != nil { + return fmt.Errorf("failed to create output directory: %w", err) + } + + // Generate a file for each table + for _, schema := range db.Schemas { + for _, table := range schema.Tables { + // Create template data for this single table + templateData := NewTemplateData(packageName, w.config) + + // Add sql_types import + templateData.AddImport(fmt.Sprintf("sql_types \"%s\"", w.typeMapper.GetSQLTypesImport())) + + // Create model data + modelData := NewModelData(table, schema.Name, w.typeMapper) + + // Add relationship fields + w.addRelationshipFields(modelData, table, schema, db) + + templateData.AddModel(modelData) + + // Check if we need time import + for _, field := range modelData.Fields { + if w.typeMapper.NeedsTimeImport(field.Type) { + templateData.AddImport("\"time\"") + } + } + + // Add fmt import if GetIDStr is enabled + if w.config.GenerateGetIDStr { + templateData.AddImport("\"fmt\"") + } + + // Finalize imports + templateData.FinalizeImports() + + // Generate code + code, err := w.templates.GenerateCode(templateData) + if err != nil { + return fmt.Errorf("failed to generate code for table %s: %w", table.Name, err) + } + + // Format code + formatted, err := w.formatCode(code) + if err != nil { + fmt.Fprintf(os.Stderr, "Warning: failed to format code for %s: %v\n", table.Name, err) + formatted = code + } + + // Generate filename: sql_{schema}_{table}.go + filename := fmt.Sprintf("sql_%s_%s.go", schema.Name, table.Name) + filepath := filepath.Join(w.options.OutputPath, filename) + + // Write file + if err := os.WriteFile(filepath, []byte(formatted), 0644); err != nil { + return fmt.Errorf("failed to write file %s: %w", filename, err) + } + } + } + + return nil +} + +// addRelationshipFields adds relationship fields to the model based on foreign keys +func (w *Writer) addRelationshipFields(modelData *ModelData, table *models.Table, schema *models.Schema, db *models.Database) { + // For each foreign key in this table, add a belongs-to relationship + for _, constraint := range table.Constraints { + if constraint.Type != models.ForeignKeyConstraint { + continue + } + + // Find the referenced table + refTable := w.findTable(constraint.ReferencedSchema, constraint.ReferencedTable, db) + if refTable == nil { + continue + } + + // Create relationship field (belongs-to) + refModelName := w.getModelName(constraint.ReferencedTable) + fieldName := w.generateRelationshipFieldName(constraint.ReferencedTable) + relationTag := w.typeMapper.BuildRelationshipTag(constraint, false) + + modelData.AddRelationshipField(&FieldData{ + Name: fieldName, + Type: "*" + refModelName, // Pointer type + GormTag: relationTag, + JSONTag: strings.ToLower(fieldName) + ",omitempty", + Comment: fmt.Sprintf("Belongs to %s", refModelName), + }) + } + + // For each table that references this table, add a has-many relationship + for _, otherSchema := range db.Schemas { + for _, otherTable := range otherSchema.Tables { + if otherTable.Name == table.Name && otherSchema.Name == schema.Name { + continue // Skip self + } + + for _, constraint := range otherTable.Constraints { + if constraint.Type != models.ForeignKeyConstraint { + continue + } + + // Check if this constraint references our table + if constraint.ReferencedTable == table.Name && constraint.ReferencedSchema == schema.Name { + // Add has-many relationship + otherModelName := w.getModelName(otherTable.Name) + fieldName := w.generateRelationshipFieldName(otherTable.Name) + "s" // Pluralize + relationTag := w.typeMapper.BuildRelationshipTag(constraint, true) + + modelData.AddRelationshipField(&FieldData{ + Name: fieldName, + Type: "[]*" + otherModelName, // Slice of pointers + GormTag: relationTag, + JSONTag: strings.ToLower(fieldName) + ",omitempty", + Comment: fmt.Sprintf("Has many %s", otherModelName), + }) + } + } + } + } +} + +// findTable finds a table by schema and name in the database +func (w *Writer) findTable(schemaName, tableName string, db *models.Database) *models.Table { + for _, schema := range db.Schemas { + if schema.Name != schemaName { + continue + } + for _, table := range schema.Tables { + if table.Name == tableName { + return table + } + } + } + return nil +} + +// getModelName generates the model name from a table name +func (w *Writer) getModelName(tableName string) string { + singular := Singularize(tableName) + modelName := SnakeCaseToPascalCase(singular) + + if !hasModelPrefix(modelName) { + modelName = "Model" + modelName + } + + return modelName +} + +// generateRelationshipFieldName generates a field name for a relationship +func (w *Writer) generateRelationshipFieldName(tableName string) string { + // Use just the prefix (3 letters) for relationship fields + return GeneratePrefix(tableName) +} + +// getPackageName returns the package name from options or defaults to "models" +func (w *Writer) getPackageName() string { + if w.options.PackageName != "" { + return w.options.PackageName + } + return "models" +} + +// formatCode formats Go code using gofmt +func (w *Writer) formatCode(code string) (string, error) { + formatted, err := format.Source([]byte(code)) + if err != nil { + return "", fmt.Errorf("format error: %w", err) + } + return string(formatted), nil +} + +// writeOutput writes the content to file or stdout +func (w *Writer) writeOutput(content string) error { + if w.options.OutputPath != "" { + return os.WriteFile(w.options.OutputPath, []byte(content), 0644) + } + + // Print to stdout + fmt.Print(content) + return nil +} diff --git a/pkg/writers/gorm/writer_test.go b/pkg/writers/gorm/writer_test.go new file mode 100644 index 0000000..0e2ba32 --- /dev/null +++ b/pkg/writers/gorm/writer_test.go @@ -0,0 +1,243 @@ +package gorm + +import ( + "os" + "path/filepath" + "strings" + "testing" + + "git.warky.dev/wdevs/relspecgo/pkg/models" + "git.warky.dev/wdevs/relspecgo/pkg/writers" +) + +func TestWriter_WriteTable(t *testing.T) { + // Create a simple table + table := models.InitTable("users", "public") + table.Columns["id"] = &models.Column{ + Name: "id", + Type: "bigint", + NotNull: true, + IsPrimaryKey: true, + AutoIncrement: true, + Sequence: 1, + } + table.Columns["email"] = &models.Column{ + Name: "email", + Type: "varchar", + Length: 255, + NotNull: false, + Sequence: 2, + } + table.Columns["created_at"] = &models.Column{ + Name: "created_at", + Type: "timestamp", + NotNull: true, + Sequence: 3, + } + + // Create writer + opts := &writers.WriterOptions{ + PackageName: "models", + Metadata: map[string]interface{}{ + "generate_table_name": true, + "generate_get_id": true, + }, + } + + writer := NewWriter(opts) + + // Write to temporary file + tmpDir := t.TempDir() + opts.OutputPath = filepath.Join(tmpDir, "test.go") + + err := writer.WriteTable(table) + if err != nil { + t.Fatalf("WriteTable failed: %v", err) + } + + // Read the generated file + content, err := os.ReadFile(opts.OutputPath) + if err != nil { + t.Fatalf("Failed to read generated file: %v", err) + } + + generated := string(content) + + // Verify key elements are present + expectations := []string{ + "package models", + "type ModelUser struct", + "ID", + "int64", + "Email", + "sql_types.SqlString", + "CreatedAt", + "time.Time", + "gorm:\"column:id", + "gorm:\"column:email", + "func (m ModelUser) TableName() string", + "return \"public.users\"", + "func (m ModelUser) GetID() int64", + } + + for _, expected := range expectations { + if !strings.Contains(generated, expected) { + t.Errorf("Generated code missing expected content: %q\nGenerated:\n%s", expected, generated) + } + } +} + +func TestWriter_WriteDatabase_MultiFile(t *testing.T) { + // Create a database with two tables + db := models.InitDatabase("testdb") + schema := models.InitSchema("public") + + // Table 1: users + users := models.InitTable("users", "public") + users.Columns["id"] = &models.Column{ + Name: "id", + Type: "bigint", + NotNull: true, + IsPrimaryKey: true, + } + schema.Tables = append(schema.Tables, users) + + // Table 2: posts + posts := models.InitTable("posts", "public") + posts.Columns["id"] = &models.Column{ + Name: "id", + Type: "bigint", + NotNull: true, + IsPrimaryKey: true, + } + posts.Columns["user_id"] = &models.Column{ + Name: "user_id", + Type: "bigint", + NotNull: true, + } + posts.Constraints["fk_user"] = &models.Constraint{ + Name: "fk_user", + Type: models.ForeignKeyConstraint, + Columns: []string{"user_id"}, + ReferencedTable: "users", + ReferencedSchema: "public", + ReferencedColumns: []string{"id"}, + OnDelete: "CASCADE", + } + schema.Tables = append(schema.Tables, posts) + + db.Schemas = append(db.Schemas, schema) + + // Create writer with multi-file mode + tmpDir := t.TempDir() + opts := &writers.WriterOptions{ + PackageName: "models", + OutputPath: tmpDir, + Metadata: map[string]interface{}{ + "multi_file": true, + }, + } + + writer := NewWriter(opts) + + err := writer.WriteDatabase(db) + if err != nil { + t.Fatalf("WriteDatabase failed: %v", err) + } + + // Verify two files were created + expectedFiles := []string{ + "sql_public_users.go", + "sql_public_posts.go", + } + + for _, filename := range expectedFiles { + filepath := filepath.Join(tmpDir, filename) + if _, err := os.Stat(filepath); os.IsNotExist(err) { + t.Errorf("Expected file not created: %s", filename) + } + } + + // Check posts file contains relationship + postsContent, err := os.ReadFile(filepath.Join(tmpDir, "sql_public_posts.go")) + if err != nil { + t.Fatalf("Failed to read posts file: %v", err) + } + + if !strings.Contains(string(postsContent), "USE *ModelUser") { + // Relationship field should be present + t.Logf("Posts content:\n%s", string(postsContent)) + } +} + +func TestNameConverter_SnakeCaseToPascalCase(t *testing.T) { + tests := []struct { + input string + expected string + }{ + {"user_id", "UserID"}, + {"http_request", "HTTPRequest"}, + {"user_profiles", "UserProfiles"}, + {"guid", "GUID"}, + {"rid_process", "RIDProcess"}, + } + + for _, tt := range tests { + t.Run(tt.input, func(t *testing.T) { + result := SnakeCaseToPascalCase(tt.input) + if result != tt.expected { + t.Errorf("SnakeCaseToPascalCase(%q) = %q, want %q", tt.input, result, tt.expected) + } + }) + } +} + +func TestNameConverter_Pluralize(t *testing.T) { + tests := []struct { + input string + expected string + }{ + {"user", "users"}, + {"process", "processes"}, + {"child", "children"}, + {"person", "people"}, + {"status", "statuses"}, + } + + for _, tt := range tests { + t.Run(tt.input, func(t *testing.T) { + result := Pluralize(tt.input) + if result != tt.expected { + t.Errorf("Pluralize(%q) = %q, want %q", tt.input, result, tt.expected) + } + }) + } +} + +func TestTypeMapper_SQLTypeToGoType(t *testing.T) { + mapper := NewTypeMapper() + + tests := []struct { + sqlType string + notNull bool + want string + }{ + {"bigint", true, "int64"}, + {"bigint", false, "sql_types.SqlInt64"}, + {"varchar", true, "string"}, + {"varchar", false, "sql_types.SqlString"}, + {"timestamp", true, "time.Time"}, + {"timestamp", false, "sql_types.SqlTime"}, + {"boolean", true, "bool"}, + {"boolean", false, "sql_types.SqlBool"}, + } + + for _, tt := range tests { + t.Run(tt.sqlType, func(t *testing.T) { + result := mapper.SQLTypeToGoType(tt.sqlType, tt.notNull) + if result != tt.want { + t.Errorf("SQLTypeToGoType(%q, %v) = %q, want %q", tt.sqlType, tt.notNull, result, tt.want) + } + }) + } +} diff --git a/pkg/writers/writer.go b/pkg/writers/writer.go index e581183..f2f6c23 100644 --- a/pkg/writers/writer.go +++ b/pkg/writers/writer.go @@ -5,10 +5,16 @@ import ( ) // Writer defines the interface for writing database specifications -// to various output formats +// to various output formats at different granularity levels type Writer interface { - // Write takes a Database model and writes it to the desired format - Write(db *models.Database) error + // WriteDatabase takes a Database model and writes it to the desired format + WriteDatabase(db *models.Database) error + + // WriteSchema takes a Schema model and writes it to the desired format + WriteSchema(schema *models.Schema) error + + // WriteTable takes a Table model and writes it to the desired format + WriteTable(table *models.Table) error } // WriterOptions contains common options for writers