1- using Implem . DefinitionAccessor ;
1+ using Implem . CodeDefiner . Functions . Rds . Parts ;
2+ using Implem . DefinitionAccessor ;
23using Implem . IRds ;
34using Implem . Libraries . Utilities ;
5+ using System ;
46using System . Collections . Generic ;
57using System . Data ;
68using System . Linq ;
9+ using System . Text . RegularExpressions ;
710namespace Implem . CodeDefiner . Functions . Rds
811{
912 public static class TimeConverter
1013 {
14+ private static int ParseTimeOffset ( string timeOffset )
15+ {
16+ if ( string . IsNullOrWhiteSpace ( timeOffset ) )
17+ {
18+ throw new ArgumentException ( "TimeOffset cannot be null or empty" , nameof ( timeOffset ) ) ;
19+ }
20+
21+ timeOffset = timeOffset . Trim ( ) ;
22+
23+ var pattern = @"^([+-]?)([01]?\d|2[0-3])(?::([0-5]\d))?$" ;
24+ var match = Regex . Match ( timeOffset , pattern ) ;
25+
26+ if ( ! match . Success )
27+ {
28+ throw new FormatException ( $ "Invalid time format: { timeOffset } . Expected format: H:mm or H (e.g., '9:00', '-5:30', '9'). Minutes are optional and must be two digits (00-59) when specified.") ;
29+ }
30+
31+ var isNegative = match . Groups [ 1 ] . Value == "-" ;
32+ var hours = int . Parse ( match . Groups [ 2 ] . Value ) ;
33+ var minutes = match . Groups [ 3 ] . Success ? int . Parse ( match . Groups [ 3 ] . Value ) : 0 ;
34+
35+ var totalMinutes = hours * 60 + minutes ;
36+ return isNegative ? - totalMinutes : totalMinutes ;
37+ }
38+
39+ public static void Convert (
40+ ISqlObjectFactory factory ,
41+ string timeOffset )
42+ {
43+ var minuteOffset = ParseTimeOffset ( timeOffset ) ;
44+ Convert ( factory : factory , minuteOffset : minuteOffset ) ;
45+ }
46+
1147 public static void Convert (
1248 ISqlObjectFactory factory ,
13- int hourOffset )
49+ int minuteOffset )
1450 {
1551 Def . ColumnDefinitionCollection
1652 . Where ( columnDefinition => columnDefinition . TableName != "_Bases" )
1753 . Where ( columnDefinition => columnDefinition . TableName != "_BaseItems" )
1854 . Select ( columnDefinition => columnDefinition . TableName )
1955 . Distinct ( )
56+ . Where ( tableName => ! Tables . IsQuartzTable ( tableName ) )
2057 . ForEach ( tableName =>
2158 {
2259 Convert (
2360 factory : factory ,
2461 tableName : tableName ,
2562 suffix : string . Empty ,
26- hourOffset : hourOffset ) ;
63+ minuteOffset : minuteOffset ) ;
2764 Convert (
2865 factory : factory ,
2966 tableName : tableName ,
3067 suffix : "_deleted" ,
31- hourOffset : hourOffset ) ;
68+ minuteOffset : minuteOffset ) ;
3269 Convert (
3370 factory : factory ,
3471 tableName : tableName ,
3572 suffix : "_history" ,
36- hourOffset : hourOffset ) ;
73+ minuteOffset : minuteOffset ) ;
3774 } ) ;
3875 }
3976
4077 private static void Convert (
4178 ISqlObjectFactory factory ,
4279 string tableName ,
4380 string suffix ,
44- int hourOffset )
81+ int minuteOffset )
4582 {
4683 Consoles . Write ( tableName + suffix , Consoles . Types . Info ) ;
4784 ConvertDateTimeColumns (
4885 factory : factory ,
4986 tableName : tableName ,
5087 suffix : suffix ,
51- hourOffset : hourOffset ) ;
88+ minuteOffset : minuteOffset ) ;
5289 ConvertComments (
5390 factory : factory ,
5491 tableName : tableName ,
55- suffix : suffix ) ;
92+ suffix : suffix ,
93+ minuteOffset : minuteOffset ) ;
5694 }
5795
5896 private static void ConvertDateTimeColumns (
5997 ISqlObjectFactory factory ,
6098 string tableName ,
6199 string suffix ,
62- int hourOffset )
100+ int minuteOffset )
63101 {
64102 var commandText = $ "update \" { tableName } { suffix } \" set\n "
65103 + Def . ColumnDefinitionCollection
66104 . Where ( columnDefinition => columnDefinition . TableName == tableName )
67105 . Where ( columnDefinition => columnDefinition . TypeName == "datetime" )
68106 . Where ( columnDefinition => ! columnDefinition . NotUpdate )
69107 . Select ( columnDefinition => columnDefinition . ColumnName )
70- . Select ( columnName => $ "\" { columnName } \" =dateadd(hour, { hourOffset } , \" { columnName } \" ) ")
108+ . Select ( columnName => $ "\" { columnName } \" ={ factory . Sqls . DateAddMinute ( minuteOffset , $ " \" { columnName } \" " ) } ")
71109 . Join ( "\n ," ) ;
72- Def . SqlIoBySa (
73- factory : factory ,
74- initialCatalog : Environments . ServiceName )
110+ Def . SqlIoByAdmin (
111+ factory : factory )
75112 . ExecuteNonQuery (
76113 factory : factory ,
77114 dbTransaction : null ,
@@ -83,7 +120,8 @@ private static void ConvertDateTimeColumns(
83120 private static void ConvertComments (
84121 ISqlObjectFactory factory ,
85122 string tableName ,
86- string suffix )
123+ string suffix ,
124+ int minuteOffset )
87125 {
88126 var idColumn = Def . ColumnDefinitionCollection
89127 . Where ( columnDefinition => columnDefinition . TableName == tableName )
@@ -97,9 +135,8 @@ private static void ConvertComments(
97135 from ""{ idColumn . TableName } { suffix } ""
98136 where ""{ idColumn . TableName } { suffix } "".""Comments"" is not null
99137 and ""{ idColumn . TableName } { suffix } "".""Comments""<>'[]';" ;
100- var dataTable = Def . SqlIoBySa (
101- factory : factory ,
102- initialCatalog : Environments . ServiceName )
138+ var dataTable = Def . SqlIoByAdmin (
139+ factory : factory )
103140 . ExecuteTable (
104141 factory : factory ,
105142 commandText : commandText ) ;
@@ -108,33 +145,34 @@ private static void ConvertComments(
108145 factory : factory ,
109146 idColumn : idColumn ,
110147 dataRow : dataRow ,
111- suffix : suffix ) ) ;
148+ suffix : suffix ,
149+ minuteOffset : minuteOffset ) ) ;
112150 }
113151 }
114152
115153 private static void UpdateComments (
116154 ISqlObjectFactory factory ,
117155 ColumnDefinition idColumn ,
118156 DataRow dataRow ,
119- string suffix )
157+ string suffix ,
158+ int minuteOffset )
120159 {
121160 var comments = dataRow . String ( "Comments" ) . Deserialize < List < Comment > > ( ) ;
122161 if ( comments ? . Any ( ) == true )
123162 {
124163 comments . ForEach ( comment =>
125164 {
126- comment . CreatedTime = comment . CreatedTime . AddHours ( - 9 ) ;
165+ comment . CreatedTime = comment . CreatedTime . AddMinutes ( minuteOffset ) ;
127166 if ( comment . UpdatedTime != null )
128167 {
129- comment . UpdatedTime = comment . UpdatedTime . ToDateTime ( ) . AddHours ( - 9 ) ;
168+ comment . UpdatedTime = comment . UpdatedTime . ToDateTime ( ) . AddMinutes ( minuteOffset ) ;
130169 }
131170 var commandText = $@ "
132171 update ""{ idColumn . TableName } { suffix } ""
133172 set ""Comments""=@Comments
134173 where ""{ idColumn . TableName } { suffix } "".""{ idColumn . ColumnName } ""=@Id" ;
135- var io = Def . SqlIoBySa (
136- factory : factory ,
137- initialCatalog : Environments . ServiceName ) ;
174+ var io = Def . SqlIoByAdmin (
175+ factory : factory ) ;
138176 io . SqlCommand . Parameters_AddWithValue ( "Id" , dataRow [ idColumn . ColumnName ] ) ;
139177 io . SqlCommand . Parameters_AddWithValue ( "Comments" , comments . ToJson ( ) ) ;
140178 io . ExecuteTable (
0 commit comments