audio_trans/orm_lib/inc/drogon/orm/ArrayParser.h

88 lines
2.3 KiB
C++

/** Handling of SQL arrays.
*
* DO NOT INCLUDE THIS FILE DIRECTLY; include drogon/orm/Field.h instead.
*
* Copyright (c) 2018, Jeroen T. Vermeulen.
*
* See COPYING for copyright license. If you did not receive a file called
* COPYING with this source code, please notify the distributor of this mistake,
* or contact the author.
*/
// Taken from libpqxx and modified
/**
*
* @file ArrayParser.h
* @author An Tao
*
* Copyright 2018, An Tao. All rights reserved.
* https://github.com/an-tao/drogon
* Use of this source code is governed by a MIT license
* that can be found in the License file.
*
* Drogon
*
*/
#pragma once
#include <drogon/exports.h>
#include <stdexcept>
#include <string>
#include <utility>
namespace drogon
{
namespace orm
{
/// Low-level array parser.
/** Use this to read an array field retrieved from the database.
*
* Use this only if your client encoding is UTF-8, ASCII, or a single-byte
* encoding which is a superset of ASCII.
*
* The input is a C-style string containing the textual representation of an
* array, as returned by the database. The parser reads this representation
* on the fly. The string must remain in memory until parsing is done.
*
* Parse the array by making calls to @c get_next until it returns a
* @c juncture of "done". The @c juncture tells you what the parser found in
* that step: did the array "nest" to a deeper level, or "un-nest" back up?
*/
class DROGON_EXPORT ArrayParser
{
public:
/// What's the latest thing found in the array?
enum juncture
{
/// Starting a new row.
row_start,
/// Ending the current row.
row_end,
/// Found a NULL value.
null_value,
/// Found a string value.
string_value,
/// Parsing has completed.
done,
};
/// Constructor. You don't need this; use @c field::as_array instead.
explicit ArrayParser(const char input[]);
/// Parse the next step in the array.
/** Returns what it found. If the juncture is @c string_value, the string
* will contain the value. Otherwise, it will be empty.
*
* Call this until the @c juncture it returns is @c done.
*/
std::pair<juncture, std::string> getNext();
private:
/// Current parsing position in the input.
const char *pos_;
};
} // namespace orm
} // namespace drogon