aboutsummaryrefslogtreecommitdiff
path: root/src/database_postgres.cc
diff options
context:
space:
mode:
authorfusion32 <marcopuzziello@gmail.com>2025-10-16 22:51:58 -0300
committerfusion32 <marcopuzziello@gmail.com>2025-10-16 23:04:00 -0300
commit63705942a366d39308251549a018451808c20ac8 (patch)
tree28f055e5e992e657279ceb57fa177d8dfcd55076 /src/database_postgres.cc
parent01a6e8dbe42fb6571ad846bee5e1d8cc7c9fba5e (diff)
downloadquerymanager-63705942a366d39308251549a018451808c20ac8.tar.gz
querymanager-63705942a366d39308251549a018451808c20ac8.zip
properly handle text encoding differences with QueryManager clients
Diffstat (limited to 'src/database_postgres.cc')
-rw-r--r--src/database_postgres.cc85
1 files changed, 44 insertions, 41 deletions
diff --git a/src/database_postgres.cc b/src/database_postgres.cc
index 7a676e2..80076c9 100644
--- a/src/database_postgres.cc
+++ b/src/database_postgres.cc
@@ -454,6 +454,9 @@ static int GetResultByteA(PGresult *Result, int Row, int Col, uint8 *Buffer, int
return Size;
}
+#if 0
+// NOTE(fusion): DO NOT REMOVE. It is currently not being used so it's switched
+// off to avoid compiler warnings.
static int GetResultIPAddress(PGresult *Result, int Row, int Col){
int IPAddress = 0;
int Format = PQfformat(Result, Col);
@@ -524,8 +527,8 @@ static int GetResultIPAddress(PGresult *Result, int Row, int Col){
}
}
return IPAddress;
-
}
+#endif
static bool ParseTimestamp(int *Dest, const char *String){
ASSERT(Dest != NULL && String != NULL);
@@ -633,46 +636,46 @@ static int GetResultTimestamp(PGresult *Result, int Row, int Col){
return Timestamp;
}
-static void SkipWhitespace(int *Cursor, const char *String){
- while(isspace(String[*Cursor])){
- *Cursor += 1;
+static void SkipWhitespace(int *Position, const char *String){
+ while(isspace(String[*Position])){
+ *Position += 1;
}
}
-static bool SkipNextChar(int Ch, int *Cursor, const char *String){
+static bool SkipNextChar(int Ch, int *Position, const char *String){
ASSERT(Ch != 0);
- if(String[*Cursor] != Ch){
+ if(String[*Position] != Ch){
return false;
}
- *Cursor += 1;
+ *Position += 1;
return true;
}
-static bool ReadNextNumber(int *Dest, int *Cursor, const char *String){
- SkipWhitespace(Cursor, String);
+static bool ReadNextNumber(int *Dest, int *Position, const char *String){
+ SkipWhitespace(Position, String);
bool Negative = false;
- if(!isdigit(String[*Cursor])){
- if(String[*Cursor] != '+' && String[*Cursor] != '-'){
+ if(!isdigit(String[*Position])){
+ if(String[*Position] != '+' && String[*Position] != '-'){
return false;
}
- if(!isdigit(String[*Cursor + 1])){
+ if(!isdigit(String[*Position + 1])){
return false;
}
- if(String[*Cursor] == '-'){
+ if(String[*Position] == '-'){
Negative = true;
}
- *Cursor += 1;
+ *Position += 1;
}
int Number = 0;
- while(isdigit(String[*Cursor])){
- Number = (Number * 10) + (String[*Cursor] - '0');
- *Cursor += 1;
+ while(isdigit(String[*Position])){
+ Number = (Number * 10) + (String[*Position] - '0');
+ *Position += 1;
}
if(Negative){
@@ -683,21 +686,21 @@ static bool ReadNextNumber(int *Dest, int *Cursor, const char *String){
return true;
}
-static bool ReadNextWord(char *Dest, int DestCapacity, int *Cursor, const char *String){
+static bool ReadNextWord(char *Dest, int DestCapacity, int *Position, const char *String){
ASSERT(DestCapacity > 0);
- SkipWhitespace(Cursor, String);
- if(!isalpha(String[*Cursor])){
+ SkipWhitespace(Position, String);
+ if(!isalpha(String[*Position])){
return false;
}
int WritePos = 0;
- while(isalpha(String[*Cursor])){
+ while(isalpha(String[*Position])){
if(WritePos < DestCapacity){
- Dest[WritePos] = String[*Cursor];
+ Dest[WritePos] = String[*Position];
WritePos += 1;
}
- *Cursor += 1;
+ *Position += 1;
}
bool Result = (WritePos < DestCapacity);
@@ -716,25 +719,25 @@ static bool ParseInterval(int *Dest, const char *String){
// is stable enough or it would break other client libraries as well.
ASSERT(Dest != NULL && String != NULL);
int Interval = 0;
- int Cursor = 0;
+ int Position = 0;
bool Negate = false;
while(true){
- SkipWhitespace(&Cursor, String);
- if(String[Cursor] == 0){
+ SkipWhitespace(&Position, String);
+ if(String[Position] == 0){
break;
}
int Number;
- if(!ReadNextNumber(&Number, &Cursor, String)){
+ if(!ReadNextNumber(&Number, &Position, String)){
// "Expected number"
return false;
}
- if(SkipNextChar(':', &Cursor, String)){
+ if(SkipNextChar(':', &Position, String)){
int Minutes, Seconds;
- if(!ReadNextNumber(&Minutes, &Cursor, String)
- || !SkipNextChar(':', &Cursor, String)
- || !ReadNextNumber(&Seconds, &Cursor, String)){
+ if(!ReadNextNumber(&Minutes, &Position, String)
+ || !SkipNextChar(':', &Position, String)
+ || !ReadNextNumber(&Seconds, &Position, String)){
// "Expected HH:MM:SS.FFFFFF"
return false;
}
@@ -750,15 +753,15 @@ static bool ParseInterval(int *Dest, const char *String){
}
// NOTE(fusion): Parse microseconds but ignore it.
- if(SkipNextChar('.', &Cursor, String)){
+ if(SkipNextChar('.', &Position, String)){
int Frac;
- int PrevCursor = Cursor;
- if(!ReadNextNumber(&Frac, &Cursor, String)){
+ int PrevPosition = Position;
+ if(!ReadNextNumber(&Frac, &Position, String)){
// "Expected fractional part"
return false;
}
- int FracDigits = Cursor - PrevCursor;
+ int FracDigits = Position - PrevPosition;
if(FracDigits > 6){
// "Too many fractional digits"
return false;
@@ -768,7 +771,7 @@ static bool ParseInterval(int *Dest, const char *String){
Interval += (Number * 3600 + Minutes * 60 + Seconds);
}else{
char Unit[16];
- if(!ReadNextWord(Unit, sizeof(Unit), &Cursor, String)){
+ if(!ReadNextWord(Unit, sizeof(Unit), &Position, String)){
// "Expected unit"
return false;
}
@@ -813,14 +816,14 @@ static bool ParseInterval(int *Dest, const char *String){
}
char Direction[8];
- if(ReadNextWord(Direction, sizeof(Direction), &Cursor, String)){
+ if(ReadNextWord(Direction, sizeof(Direction), &Position, String)){
if(!StringEqCI(Direction, "ago")){
// "Invalid interval direction"
return false;
}
- SkipWhitespace(&Cursor, String);
- if(String[Cursor] != 0){
+ SkipWhitespace(&Position, String);
+ if(String[Position] != 0){
// "Interval direction is expected only at the very end"
return false;
}
@@ -1184,10 +1187,10 @@ TDatabase *DatabaseOpen(void){
"user",
"password",
"connect_timeout",
- "client_encoding",
"application_name",
"sslmode",
"sslrootcert",
+ "client_encoding",
NULL, // sentinel
};
@@ -1198,10 +1201,10 @@ TDatabase *DatabaseOpen(void){
g_Config.PostgreSQL.User,
g_Config.PostgreSQL.Password,
g_Config.PostgreSQL.ConnectTimeout,
- g_Config.PostgreSQL.ClientEncoding,
g_Config.PostgreSQL.ApplicationName,
g_Config.PostgreSQL.SSLMode,
g_Config.PostgreSQL.SSLRootCert,
+ "UTF8",
NULL, // sentinel
};