1#include "sql_string_helpers.h"
2
3#include <base/system.h>
4
5#include <cmath>
6
7void sqlstr::FuzzyString(char *pString, int Size)
8{
9 char *pNewString = new char[Size * 4 - 1];
10 int OutPos = 0;
11
12 for(int i = 0; i < Size; i++)
13 {
14 if(!pString[i])
15 break;
16
17 pNewString[OutPos++] = pString[i];
18 if(pString[i] != '\\' && str_utf8_isstart(c: pString[i + 1]))
19 pNewString[OutPos++] = '%';
20 }
21
22 pNewString[OutPos] = '\0';
23 str_copy(dst: pString, src: pNewString, dst_size: Size);
24 delete[] pNewString;
25}
26
27int sqlstr::EscapeLike(char *pDst, const char *pSrc, int DstSize)
28{
29 int Pos = 0;
30 int DstPos = 0;
31 while(DstPos + 2 < DstSize)
32 {
33 if(pSrc[Pos] == '\0')
34 break;
35 if(pSrc[Pos] == '\\' || pSrc[Pos] == '%' || pSrc[Pos] == '_' || pSrc[Pos] == '[')
36 pDst[DstPos++] = '\\';
37 pDst[DstPos++] = pSrc[Pos++];
38 }
39 pDst[DstPos++] = '\0';
40 return DstPos;
41}
42
43void sqlstr::AgoTimeToString(int AgoTime, char *pAgoString, int Size)
44{
45 if(AgoTime <= 0)
46 {
47 str_copy(dst: pAgoString, src: "moments", dst_size: Size);
48 return;
49 }
50
51 char aBuf[20];
52 const int aTimes[7] =
53 {
54 60 * 60 * 24 * 365,
55 60 * 60 * 24 * 30,
56 60 * 60 * 24 * 7,
57 60 * 60 * 24,
58 60 * 60,
59 60,
60 1};
61 const char aaNames[7][6] =
62 {
63 "year",
64 "month",
65 "week",
66 "day",
67 "hour",
68 "min",
69 "sec"};
70
71 int Seconds = 0;
72 char aName[6];
73 int Count = 0;
74 int i = 0;
75
76 // finding biggest match
77 for(i = 0; i < 7; i++)
78 {
79 Seconds = aTimes[i];
80 str_copy(dst&: aName, src: aaNames[i]);
81
82 Count = std::floor(x: (float)AgoTime / (float)Seconds);
83 if(Count != 0)
84 {
85 break;
86 }
87 }
88
89 if(Count == 1)
90 {
91 str_format(buffer: aBuf, buffer_size: sizeof(aBuf), format: "%d %s", 1, aName);
92 }
93 else
94 {
95 str_format(buffer: aBuf, buffer_size: sizeof(aBuf), format: "%d %ss", Count, aName);
96 }
97 str_append(dst: pAgoString, src: aBuf, dst_size: Size);
98
99 if(i + 1 < 7)
100 {
101 // getting second piece now
102 int Seconds2 = aTimes[i + 1];
103 char aName2[6];
104 str_copy(dst&: aName2, src: aaNames[i + 1]);
105
106 // add second piece if it's greater than 0
107 int Count2 = std::floor(x: (float)(AgoTime - (Seconds * Count)) / (float)Seconds2);
108
109 if(Count2 != 0)
110 {
111 if(Count2 == 1)
112 {
113 str_format(buffer: aBuf, buffer_size: sizeof(aBuf), format: " and %d %s", 1, aName2);
114 }
115 else
116 {
117 str_format(buffer: aBuf, buffer_size: sizeof(aBuf), format: " and %d %ss", Count2, aName2);
118 }
119 str_append(dst: pAgoString, src: aBuf, dst_size: Size);
120 }
121 }
122}
123