@@ -7,6 +7,8 @@ import PormG: SQLConn, config, Configuration
77import PormG: CASCADE, RESTRICT, SET_NULL, SET_DEFAULT, SET, DO_NOTHING, PROTECT
88using Printf
99import Base. deepcopy
10+ using Decimals
11+
1012
1113import PormG. Infiltrator: @infiltrate
1214
@@ -331,35 +333,40 @@ end
331333#
332334
333335function format_text_sql (value:: Union{Int, Date, DateTime, ZonedDateTime} )
334- return string (" ' " , value, " ' " )
336+ return string (value)
335337end
336338function format_text_sql (value:: Union{Missing, Nothing} )
337- return " null "
339+ return missing
338340end
339341function format_text_sql (value:: Bool )
340- return value ? " 'true'" : " 'false'"
342+ return value
343+ # return value ? "'true'" : "'false'"
341344end
342345function format_text_sql (value:: AbstractString )
343- return string (" '" , replace (value, " '" => " `" ), " '" )
346+ return value
347+ # return string("'", replace(value, "'" => "`"), "'")
344348end
345349function format_text_sql (value:: AbstractArray )
346350 arrayref:: Vector{String} = []
347351 for v in value
348352 push! (arrayref, v |> format_text_sql)
349353 end
350354 @infiltrate false
351- return string (" (" , join (arrayref, " ," ), " )" )
355+ # return string("(", join(arrayref, ","), ")")
356+ return arrayref
352357end
353358
354359function format_number_sql (value:: Integer )
355- return string (value)
360+ return value
361+ # return string(value)
356362end
357363function format_number_sql (value:: Union{Missing, Nothing} )
358- return " null "
364+ return missing
359365end
360366function format_number_sql (value:: Union{Float16, Float32, Float64} )
361367 # Use @sprintf to avoid scientific notation and ensure full precision
362- return string (" '" , @sprintf (" %.17g" , value), " '" )
368+ # return string("'", @sprintf("%.17g", value), "'")
369+ return @sprintf (" %.17g" , value)
363370end
364371function format_number_sql (value:: AbstractString )
365372 # try integer first
@@ -376,58 +383,71 @@ function format_number_sql(value::AbstractString)
376383 end
377384end
378385function format_number_sql (value:: AbstractArray )
379- arrayref:: Vector{String} = []
386+ arrayref:: Vector{Union{ String, Integer, Missing} } = []
380387 for v in value
381388 push! (arrayref, v |> format_number_sql)
382389 end
383- return string (" (" , join (arrayref, " ," ), " )" )
390+ # return string("(", join(arrayref, ","), ")")
391+ return arrayref
392+ end
393+ function format_number_sql (value:: Decimals.Decimal )
394+ try
395+ return string (value)
396+ catch e
397+ @error (" Failed to format Decimals.Decimal value: $(e) " , value= value)
398+ throw (e)
399+ end
384400end
385401
386402function format_bool_sql (value:: Integer )
387403 if value in [0 , 1 ] == false
388404 throw (ArgumentError (" The value must be 0, 1, true or false" ))
389405 end
390- return value == 1 ? " true" : " false"
406+ return value == 1 ? true : false
391407end
392408function format_bool_sql (value:: Union{Missing, Nothing} )
393- return " null "
409+ return missing
394410end
395411function format_bool_sql (value:: Bool )
396- return value ? " true " : " false "
412+ return value
397413end
398414
399415function format_date_sql (value:: Date )
400- return string (" '" , value, " '" )
416+ # return string("'", value, "'")
417+ return value |> string
401418end
402419function format_date_sql (value:: Union{Missing, Nothing} )
403- return " null "
420+ return missing
404421end
405422function format_date_sql (value:: DateTime )
406- return string (" '" , value |> Dates. Date, " '" )
423+ # return string("'", value |> Dates.Date, "'")
424+ return value |> Dates. Date |> string
407425end
408426function format_date_sql (value:: ZonedDateTime )
409- return string (" '" , value |> Dates. Date, " '" )
427+ # return string("'", value |> Dates.Date, "'")
428+ return value |> Dates. Date |> string
410429end
411430function format_date_sql (value:: AbstractString )
412431 if occursin (r" ^\d {4}-\d {2}-\d {2}$" , value)
413- return string ( " ' " , value, " ' " )
432+ return value
414433 else
415434 throw (ArgumentError (" The date $value is invalid" ))
416435 end
417436end
418- function format_date_sql ()
437+ function format_date_sql (value )
419438 throw (ArgumentError (" The date must be a Date, DateTime, ZonedDateTime or a string in the format YYYY-MM-DD" ))
420439end
421440
422441
423442function format_timezone_sql (value:: String ; format:: String = DATETIME_FORMAT)
424- return validate_timezone (value, format) ? string (" ' " , value, " ' " ) : throw (ArgumentError (" The timezone $value is invalid" ))
443+ return validate_timezone (value, format) ? string (value) : throw (ArgumentError (" The timezone $value is invalid" ))
425444end
426445function format_timezone_sql (value:: Union{Missing, Nothing} )
427- return " null "
446+ return missing
428447end
429448function format_timezone_sql (value:: ZonedDateTime )
430- return string (" '" , value, " '" )
449+ # return string("'", value, "'")
450+ return value |> string
431451end
432452function format_timezone_sql (value:: DateTime , timezone:: String )
433453 # function used just in create
436456
437457function format_yyyy_mm (value:: String )
438458 if occursin (r" ^\d {4}-\d {2}$" , value)
439- return string ( " ' " , value, " ' " )
459+ return value
440460 else
441461 throw (ArgumentError (" The value $value is invalid, it must be in the format YYYY-MM" ))
442462 end
@@ -445,7 +465,7 @@ function format_yyyy_mm(value::Integer)
445465 value = string (value)
446466 if length (value) == 6
447467 # Format as YYYY-MM
448- return string (" ' " , value[1 : 4 ], " -" , value[5 : 6 ], " ' " )
468+ return string (value[1 : 4 ], " -" , value[5 : 6 ])
449469 else
450470 throw (ArgumentError (" The value $value must be a 6-digit integer in the format YYYYMM or a string in the format YYYY-MM" ))
451471 end
@@ -1026,7 +1046,28 @@ end
10261046 formater:: Function = format_date_sql
10271047end
10281048
1029- function DateField (; verbose_name= nothing , unique= false , blank= false , null= false , db_index= false , default= nothing , editable= false , auto_now= false , auto_now_add= false )
1049+ function DateField (; kwargs... )
1050+ # List of accepted parameters
1051+ accepted = Set ([
1052+ :verbose_name , :unique , :blank , :null , :db_index , :default , :editable , :auto_now , :auto_now_add
1053+ ])
1054+ # Check for unexpected parameters
1055+ for (k, v) in kwargs
1056+ if ! (k in accepted)
1057+ @warn " Unexpected parameter for DateField. It will be ignored." field= " DateField" param= k value= v
1058+ end
1059+ end
1060+ # Extract parameters with defaults
1061+ verbose_name = get (kwargs, :verbose_name , nothing )
1062+ unique = get (kwargs, :unique , false )
1063+ blank = get (kwargs, :blank , false )
1064+ null = get (kwargs, :null , false )
1065+ db_index = get (kwargs, :db_index , false )
1066+ default = get (kwargs, :default , nothing )
1067+ editable = get (kwargs, :editable , false )
1068+ auto_now = get (kwargs, :auto_now , false )
1069+ auto_now_add = get (kwargs, :auto_now_add , false )
1070+
10301071 # Validate verbose_name
10311072 ! (verbose_name isa Union{Nothing, String}) && throw (ArgumentError (" The verbose_name must be a String or nothing" ))
10321073 # Validate default
0 commit comments