154 lines
5.1 KiB
C++
154 lines
5.1 KiB
C++
// Licensed to the Apache Software Foundation (ASF) under one
|
|
// or more contributor license agreements. See the NOTICE file
|
|
// distributed with this work for additional information
|
|
// regarding copyright ownership. The ASF licenses this file
|
|
// to you under the Apache License, Version 2.0 (the
|
|
// "License"); you may not use this file except in compliance
|
|
// with the License. You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing,
|
|
// software distributed under the License is distributed on an
|
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
// KIND, either express or implied. See the License for the
|
|
// specific language governing permissions and limitations
|
|
// under the License.
|
|
|
|
/*************************************************************************
|
|
> How to use:
|
|
1. g++ doris_client.cpp -o doris_client `mysql_config --cflags --libs`
|
|
2. ./doris_client
|
|
|
|
> What can this demo do:
|
|
This is a cpp demo for doris client, you can test basic function such as
|
|
connection, CRUD of your doris. You should install mysql prior to running
|
|
this demo.
|
|
|
|
> Supported mysql version: 5.6, 5.7, ..., 8.0
|
|
************************************************************************/
|
|
|
|
#include "doris_client.h"
|
|
|
|
#include <iostream>
|
|
#include <string>
|
|
|
|
using std::string;
|
|
|
|
DorisClient::DorisClient() {
|
|
//init connection
|
|
_client = mysql_init(NULL);
|
|
if (_client == NULL) {
|
|
std::cout << "Error:" << mysql_error(_client);
|
|
}
|
|
}
|
|
|
|
DorisClient::~DorisClient() {
|
|
//close connection
|
|
if (_client != NULL) {
|
|
mysql_close(_client);
|
|
}
|
|
}
|
|
|
|
bool DorisClient::init(const string& host, const string& user, const string& passwd,
|
|
const string& db_name, int port, const string& sock) {
|
|
// create connection
|
|
_client = mysql_real_connect(_client, host.c_str(), user.c_str(), passwd.c_str(),
|
|
db_name.c_str(), port, sock.c_str(), 0);
|
|
if (_client == NULL) {
|
|
std::cout << "Error: " << mysql_error(_client);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool DorisClient::exec(const string& sql) {
|
|
if (mysql_query(_client, sql.c_str())) {
|
|
std::cout << "Query Error: " << mysql_error(_client);
|
|
return false;
|
|
}
|
|
_result = mysql_store_result(_client);
|
|
if (_result) {
|
|
int num_fields = mysql_num_fields(_result);
|
|
int num_rows = mysql_num_rows(_result);
|
|
std::cout << "Query result:" << std::endl;
|
|
for (int i = 0; i < num_rows; i++) {
|
|
_row = mysql_fetch_row(_result);
|
|
if (_row < 0) {
|
|
break;
|
|
}
|
|
for (int j = 0; j < num_fields; j++) {
|
|
std::cout << _row[j] << "\t";
|
|
}
|
|
std::cout << std::endl;
|
|
}
|
|
} else {
|
|
if (mysql_field_count(_client) == 0) {
|
|
int num_rows = mysql_affected_rows(_client);
|
|
std::cout << "Affected rows: " << num_rows << std::endl;
|
|
} else {
|
|
std::cout << "Get result error: " << mysql_error(_client);
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
int main() {
|
|
// Doris connection host
|
|
string host = "127.0.0.1";
|
|
// Doris connection port
|
|
int port = 9030;
|
|
// Doris connection username
|
|
string user = "root";
|
|
// Doris connection password
|
|
string password = "";
|
|
// Local mysql sock address
|
|
string sock_add = "/var/lib/mysql/mysql.sock";
|
|
// database to create
|
|
string database = "cpp_doris_db";
|
|
|
|
// init connection
|
|
DorisClient client;
|
|
std::cout << "init DorisClient" << std::endl;
|
|
client.init(host, user, password, "", port, sock_add);
|
|
|
|
// drop database
|
|
string sql_drop_database_if_not_exist = "drop database if exists " + database;
|
|
std::cout << sql_drop_database_if_not_exist << std::endl;
|
|
client.exec(sql_drop_database_if_not_exist);
|
|
|
|
// create database
|
|
string sql_create_database = "create database " + database;
|
|
std::cout << sql_create_database << std::endl;
|
|
client.exec(sql_create_database);
|
|
|
|
DorisClient client_new;
|
|
// connect to doris
|
|
client_new.init(host, user, password, database, port, sock_add);
|
|
std::cout << "init new DorisClient" << std::endl;
|
|
|
|
// create doris table
|
|
string sql_create_table = "CREATE TABLE cpp_doris_table(siteid INT,citycode SMALLINT,pv BIGINT SUM) "\
|
|
"AGGREGATE KEY(siteid, citycode) DISTRIBUTED BY HASH(siteid) BUCKETS 10 "\
|
|
"PROPERTIES(\"replication_num\" = \"1\")";
|
|
std::cout << sql_create_table << std::endl;
|
|
client_new.exec(sql_create_table);
|
|
|
|
// insert into doris table
|
|
string sql_insert = "insert into cpp_doris_table values(1, 2, 3), (4,5,6), (1,2,4)";
|
|
std::cout << sql_insert << std::endl;
|
|
client_new.exec(sql_insert);
|
|
|
|
// select from doris table
|
|
string sql_select = "select * from cpp_doris_table";
|
|
std::cout << sql_select << std::endl;
|
|
client_new.exec(sql_select);
|
|
|
|
// drop database, clear env
|
|
string drop_database = "drop database " + database;
|
|
std::cout << drop_database << std::endl;
|
|
client_new.exec(drop_database);
|
|
return 0;
|
|
}
|