CLI/ODBC 예제
Makefile 작성 가이드
mach@localhost:~/machbase_home$ cd sample/ mach@localhost:~/machbase_home/sample$ cd cli/ mach@localhost:~/machbase_home/sample/cli$ ls Makefile sample1_connect.c
마크베이스 패키지를 설치했다면, 다음 경로에 샘플 프로그램이 설치되어 있을 것이다.
include $(MACHBASE_HOME)/install/machbase_env.mk INCLUDES += $(LIBDIR_OPT)/$(MACHBASE_HOME)/include all : sample1_connect sample1_connect : sample1_connect.o $(LD_CC) $(LD_FLAGS) $(LD_OUT_OPT)$@ $< $(LIB_OPT)machbasecli$(LIB_AFT) $(LIBDIR_OPT)$(MACHBASE_HOME)/lib $(LD_LIBS) sample1_connect.o : sample1_connect.c $(COMPILE.cc) $(CC_FLAGS) $(INCLUDES) $(CC_OUT_OPT)$@ $< clean : rm -f sample1_connect
컴파일 및 링크
주어진 샘플에 대해 다음과 같이 수행하면 실행 파일이 만들어진다.
mach@localhost:~/machbase_home/sample/cli$ make gcc -c -g -W -Wall -rdynamic -O3 -finline-functions -fno-omit-frame-pointer -fno-strict-aliasing -m64 -mtune=k8 -g -W -Wall -rdynamic -O3 -finline-functions -fno-omit-frame-pointer -fno-strict-aliasing -m64 -mtune=k8 -I/home/machbase/machbase_home/include -I. -L//home/machbase/machbase_home/include -osample1_connect.o sample1_connect.c gcc -m64 -mtune=k8 -L/home/machbase/machbase_home/lib -osample1_connect sample1_connect.o -lmachbasecli -L/home/machbase/machbase_home/lib -lm -lpthread -ldl -lrt -rdynamic mach@localhost:~/machbase_home/sample/cli$ ls -al total 1196 drwxrwxr-x 2 mach mach 4096 Jun 18 20:15 . drwxrwxr-x 4 mach mach 4096 Jun 18 19:26 .. -rw-rw-r-- 1 mach mach 483 Jun 18 19:26 Makefile -rwxrwxr-x 1 mach mach 1196943 Jun 18 20:15 sample1_connect -rw-rw-r-- 1 mach mach 549 Jun 18 19:26 sample1_connect.c -rw-rw-r-- 1 mach mach 8168 Jun 18 20:15 sample1_connect.o
필요에 따라 얼마든지 위의 샘플 Makefile을 수정하여 응용 프로그램을 작성할 수 있을 것이다.
샘플 프로그램
접속 예제
CLI를 이용하여 접속하는 예제 프로그램을 작성해 보기로 한다.
샘플 파일명은 sample1_connect.c 로 한다.
MACHBASE_PORT_NO는 $MACHBASE_HOME/conf/machbase.conf 파일에 있는 PORT_NO 값과 같아야 한다.
Makefile에 sample1_connect.c를 등록하고 컴파일하여 실행하면 다음과 같이 나온다.
[mach@localhost cli]$ make [mach@localhost cli]$ ./sample1_connect connected ...
데이터 입력 및 출력 예제
아래의 예제 소스에서는 CREATE TABLE 구문을 이용하여 테이블을 생성하고, 간단한 데이터 값들을 임의로 생성해서 INSERT 구문을 사용해서 데이터를 입력하고, SELECT 구문을 이용하여 데이터를 출력한다. 이를 활용하여 직접 값을 입력하고 확인할 때 각 타입별로 어떻게 설정을 해야 하는지 알수 있을 것이다.
샘플 파일명은 sample2_insert.c 라고 한다.
Makefile에 sample2_insert.c를 등록하고 컴파일하여 실행하면 다음과 같이 나온다.
[mach@localhost cli]$ make [mach@localhost cli]$ ./sample2_insert connected ... 1 record inserted 2 record inserted 3 record inserted 4 record inserted 5 record inserted 6 record inserted 7 record inserted 8 record inserted 9 record inserted ===== 0 ======== seq = 9, score = 18, total = 270000, percentage = 0.00, ratio = 3.3e-05, id = id-9, srcip = 192.168.0.9, dstip = 2001:0DB8:0000:0000:0000:0000:1428:0009, regdate = 2015-03-31 15:26:09, log = text log-9, image = 62696E61727920696D6167652D39 ===== 1 ======== seq = 8, score = 16, total = 240000, percentage = 0.00, ratio = 3.3e-05, id = id-8, srcip = 192.168.0.8, dstip = 2001:0DB8:0000:0000:0000:0000:1428:0008, regdate = 2015-03-31 15:26:08, log = text log-8, image = 62696E61727920696D6167652D38 ===== 2 ======== seq = 7, score = 14, total = 210000, percentage = 0.00, ratio = 3.3e-05, id = id-7, srcip = 192.168.0.7, dstip = 2001:0DB8:0000:0000:0000:0000:1428:0007, regdate = 2015-03-31 15:26:07, log = text log-7, image = 62696E61727920696D6167652D37 ===== 3 ======== seq = 6, score = 12, total = 180000, percentage = 0.00, ratio = 3.3e-05, id = id-6, srcip = 192.168.0.6, dstip = 2001:0DB8:0000:0000:0000:0000:1428:0006, regdate = 2015-03-31 15:26:06, log = text log-6, image = 62696E61727920696D6167652D36 ===== 4 ======== seq = 5, score = 10, total = 150000, percentage = 0.00, ratio = 3.3e-05, id = id-5, srcip = 192.168.0.5, dstip = 2001:0DB8:0000:0000:0000:0000:1428:0005, regdate = 2015-03-31 15:26:05, log = text log-5, image = 62696E61727920696D6167652D35 ===== 5 ======== seq = 4, score = 8, total = 120000, percentage = 0.00, ratio = 3.3e-05, id = id-4, srcip = 192.168.0.4, dstip = 2001:0DB8:0000:0000:0000:0000:1428:0004, regdate = 2015-03-31 15:26:04, log = text log-4, image = 62696E61727920696D6167652D34 ===== 6 ======== seq = 3, score = 6, total = 90000, percentage = 0.00, ratio = 3.3e-05, id = id-3, srcip = 192.168.0.3, dstip = 2001:0DB8:0000:0000:0000:0000:1428:0003, regdate = 2015-03-31 15:26:03, log = text log-3, image = 62696E61727920696D6167652D33 ===== 7 ======== seq = 2, score = 4, total = 60000, percentage = 0.00, ratio = 3.3e-05, id = id-2, srcip = 192.168.0.2, dstip = 2001:0DB8:0000:0000:0000:0000:1428:0002, regdate = 2015-03-31 15:26:02, log = text log-2, image = 62696E61727920696D6167652D32 ===== 8 ======== seq = 1, score = 2, total = 30000, percentage = 0.00, ratio = 3.3e-05, id = id-1, srcip = 192.168.0.1, dstip = 2001:0DB8:0000:0000:0000:0000:1428:0001, regdate = 2015-03-31 15:26:01, log = text log-1, image = 62696E61727920696D6167652D31
Prepare Execute 예제
데이터를 binding하여 INSERT하는 예제 프로그램을 작성해 보자.
마크베이스에서 데이터를 binding 하는 방식으로 값을 입력할수 있는데 이를 이용할시에는 데이터의 값들의 타입들을 명확히 지정해주고, 긴 문자열 타입들의 경우에는 길이 값을 반드시 지정해줘야 한다.
아래의 예제를 통해서 각 타입별로 데이터를 binding하는 방법을 알수 있다.
파일명은 sample3_prepare.c 라고 한다.
Makefile에 sample3_prepare.c를 등록하고 컴파일하여 실행하면 다음과 같이 나온다.
[mach@localhost cli]$ make [mach@localhost cli]$ ./sample3_prepare connected ... 1 prepared record inserted 2 prepared record inserted 3 prepared record inserted 4 prepared record inserted 5 prepared record inserted 6 prepared record inserted 7 prepared record inserted 8 prepared record inserted 9 prepared record inserted ===== 0 ======== seq = 9, score = 18, total = 270000, percentage = 1.11, ratio = 3.7037e-05, id = id-9, srcip = 192.168.0.9, dstip = 2001:0DB8:0000:0000:0000:0000:1428:0009, regdate = 1970-01-01 09:00:00, log = log-9, image = 696D6167652D39 ===== 1 ======== seq = 8, score = 16, total = 240000, percentage = 1.12, ratio = 3.75e-05, id = id-8, srcip = 192.168.0.8, dstip = 2001:0DB8:0000:0000:0000:0000:1428:0008, regdate = 1970-01-01 09:00:00, log = log-8, image = 696D6167652D38 ===== 2 ======== seq = 7, score = 14, total = 210000, percentage = 1.14, ratio = 3.80952e-05, id = id-7, srcip = 192.168.0.7, dstip = 2001:0DB8:0000:0000:0000:0000:1428:0007, regdate = 1970-01-01 09:00:00, log = log-7, image = 696D6167652D37 ===== 3 ======== seq = 6, score = 12, total = 180000, percentage = 1.17, ratio = 3.88889e-05, id = id-6, srcip = 192.168.0.6, dstip = 2001:0DB8:0000:0000:0000:0000:1428:0006, regdate = 1970-01-01 09:00:00, log = log-6, image = 696D6167652D36 ===== 4 ======== seq = 5, score = 10, total = 150000, percentage = 1.20, ratio = 4e-05, id = id-5, srcip = 192.168.0.5, dstip = 2001:0DB8:0000:0000:0000:0000:1428:0005, regdate = 1970-01-01 09:00:00, log = log-5, image = 696D6167652D35 ===== 5 ======== seq = 4, score = 8, total = 120000, percentage = 1.25, ratio = 4.16667e-05, id = id-4, srcip = 192.168.0.4, dstip = 2001:0DB8:0000:0000:0000:0000:1428:0004, regdate = 1970-01-01 09:00:00, log = log-4, image = 696D6167652D34 ===== 6 ======== seq = 3, score = 6, total = 90000, percentage = 1.33, ratio = 4.44444e-05, id = id-3, srcip = 192.168.0.3, dstip = 2001:0DB8:0000:0000:0000:0000:1428:0003, regdate = 1970-01-01 09:00:00, log = log-3, image = 696D6167652D33 ===== 7 ======== seq = 2, score = 4, total = 60000, percentage = 1.50, ratio = 5e-05, id = id-2, srcip = 192.168.0.2, dstip = 2001:0DB8:0000:0000:0000:0000:1428:0002, regdate = 1970-01-01 09:00:00, log = log-2, image = 696D6167652D32 ===== 8 ======== seq = 1, score = 2, total = 30000, percentage = 2.00, ratio = 6.66667e-05, id = id-1, srcip = 192.168.0.1, dstip = 2001:0DB8:0000:0000:0000:0000:1428:0001, regdate = 1970-01-01 09:00:00, log = log-1, image = 696D6167652D31
확장 함수 Append 예제
마크베이스에서는 대량의 데이터를 파일로부터 읽어서 고속으로 입력하는 방법으로 Append 프로토콜을 제공하고 있다. 이 Append 프로토콜을 이용하는 예제 프로그램을 작성해 보자.
먼저 마크베이스에서 제공하는 다양한 타입별로 append 하는 방식의 예제를 살펴보자. Append 방식은 각 타입별로 편리하게 입력해 줄 수 있도록 각각의 설정값들이 정해져있다. 그러므로 모든 방법별로 사용하는 입력하는 방식에 대한 숙지를 한다면 더욱더 효율적으로 프로그램을 작성할 수 있을 것이다. 아래쪽에 있는 예제 코드에 그 방법들이 모두 나와있다.
파일명은 sample4_append1.c 라고 한다.
Makefile에 sample4_append1.c를 등록하고 컴파일하여 실행하면 다음과 같이 나온다.
[mach@localhost cli]$ make sample4_append1 gcc -c -g -W -Wall -rdynamic -fno-inline -m64 -mtune=k8 -g -W -Wall -rdynamic -fno-inline -m64 -mtune=k8 -I/home/mach/machbase_home/include -I. -L//home/mach/machbase_home/include -osample4_append1.o sample4_append1.c gcc -m64 -mtune=k8 -L/home/mach/machbase_home/lib -osample4_append1 sample4_append1.o -lmachcli -L/home/mach/machbase_home/lib -lm -lpthread -ldl -lrt -rdynamic [mach@localhost cli]$ ./sample4_append1 connected ... append open ok append close ok success : 13, failure : 0 timegap = 48 microseconds for 13 records 270833.33 records/second [mach@localhost cli]$ You can check what is inserted after MACH_SQL. Mach> select * from CLI_SAMPLE; SHORT1 INTEGER1 LONG1 FLOAT1 DOUBLE1 ----------------------------------------------------------------------------------------------------------- DATETIME1 VARCHAR1 IP IP2 ------------------------------------------------------------------------------------------------------------------------------ TEXT1 ------------------------------------------------------------------------------------ BIN1 ------------------------------------------------------------------------------------ 2 4 6 8.4 10.9 2000-12-31 00:00:00 000:000:000 MY VARCHAR 203.212.222.111 NULL XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA 2 4 6 8.4 10.9 2000-12-31 00:00:00 000:000:000 MY VARCHAR 203.212.222.111 NULL XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX NULL 2 4 6 8.4 10.9 2000-12-31 00:00:00 000:000:000 MY VARCHAR 203.212.222.111 7F7F:7F7F:7F7F:7F7F:7F7F:7F7F:7F7F:7F7F NULL NULL 2 4 6 8.4 10.9 2000-12-31 00:00:00 000:000:000 MY VARCHAR 203.212.222.111 NULL NULL NULL 2 4 6 8.4 10.9 2000-12-31 00:00:00 000:000:000 MY VARCHAR 192.168.0.1 NULL NULL NULL 2 4 6 8.4 10.9 2000-12-31 00:00:00 000:000:000 MY VARCHAR 127.0.0.1 NULL NULL NULL 2 4 6 8.4 10.9 2000-12-31 00:00:00 000:000:000 MY VARCHAR NULL NULL NULL NULL 2 4 6 8.4 10.9 2000-12-31 00:00:00 000:000:000 NULL NULL NULL NULL NULL 2 4 6 8.4 10.9 2014-05-23 17:41:28 000:000:000 NULL NULL NULL NULL NULL 2 4 6 8.4 10.9 2015-04-09 16:44:11 134:256:000 NULL NULL NULL NULL NULL 2 4 6 8.4 10.9 1970-01-01 09:00:01 000:000:000 NULL NULL NULL NULL NULL 2 4 6 8.4 10.9 1970-01-01 09:00:00 000:000:000 NULL NULL NULL NULL NULL [12] row(s) selected.
이제 파일을 이용해서 고속으로 append하는 방식을 사용해 보자. 실제로 업무에서 사용되는 많은 양의 로그, 패킷등의 값들을 고속으로 입력하는 데 유용한 예제이다. 파일명은 sample4_append2.c 라고 한다.
미리 입력할 데이터를 data.txt에 저장해 두어야 한다.
./make_data
미리 주어진 make_data.c 를 수정하면 상황에 맞게 data.txt 파일을 생성할 수 있다.
Makefile에 sample4_append2.c를 등록하고 컴파일하여 실행하면 다음과 같이 나온다.
[mach@localhost cli]$ make gcc -c -g -W -Wall -rdynamic -fno-inline -m64 -mtune=k8 -g -W -Wall -rdynamic -fno-inline -m64 -mtune=k8 -I/home/mach/machbase_home/include -I. -L//home/mach/machbase_home/include -osingle_append2.o single_append2.c gcc -m64 -mtune=k8 -L/home/mach/machbase_home/lib -osingle_append2 single_append2.o -lmachcli -L/home/mach/machbase_home/lib -lm -lpthread -ldl -lrt -rdynamic [mach@localhost cli]$ ./single_append2 connected ... table created append open ok append data start .................................................................................................... append data end append close ok success : 1000000, failure : 0 timegap = 1641503 microseconds for 1000000 records 609197.79 records/second
테이블 열 정보 획득 예제
테이블 열 정보를 획득하는 방법은 다양하지만 그중에 SQLDescribeCol과 SQLColumns를 이용한 방법을 살펴본다.
SQLDescribeCol
SQLDescribeCol은 테이블 열의 번호, 이름, 버퍼 크기, 길이, 타입 등을 가져오는 함수로 이를 이용해서 데이터베이스 내부에서 원하는 내용을 손쉽게 가져올수 있다.
예제 파일명은 sample5_describe.c 라고 한다.
위의 파일을 추가하고 make를 실행하면 아래와 같이 원하는 열의 내용들이 나타나는 것을 볼 수 있다.
[mach@localhost cli]$ make [mach@localhost cli]$ ./sample5_describe connected ... ---------------------------------------------------------------- Name Type Length ---------------------------------------------------------------- SEQ 5 5 SCORE 4 10 TOTAL -5 19 PERCENTAGE 6 27 RATIO 8 27 ID 12 10 SRCIP 2104 15 DSTIP 2106 60 REG_DATE 9 31 TLOG 2100 67108864 IMAGE -2 67108864 ---------------------------------------------------------------- [mach@localhost cli]$
SQLColumns
SQLColumns은 현재 테이블 내에 존재하는 컬럼들의 정보를 알아낼 수 있는 함수이다. 마크베이스에서도 위와 같은 함수를 지원하고 있으며 이를 이용하여 컬럼 각각의 정보들을 알아낼 수 있다.
파일이름은 sample6_columns.c라고 한다.
위의 파일을 추가하고 make를 실행한다. 결과는 다음과 같다.
[mach@localhost cli]$ make [mach@localhost cli]$ ./sample6_columns connected ... -------------------------------------------------------------------------------- Name Type TypeName Length -------------------------------------------------------------------------------- _ARRIVAL_TIME 93 DATE 31 SEQ 5 SMALLINT 5 SCORE 4 INTEGER 10 TOTAL -5 BIGINT 19 PERCENTAGE 6 FLOAT 27 RATIO 8 DOUBLE 27 ID 12 VARCHAR 10 SRCIP 2104 IPV4 15 DSTIP 2106 IPV6 60 REG_DATE 93 DATE 31 TLOG 2100 TEXT 67108864 IMAGE -2 BINARY 67108864 --------------------------------------------------------------------------------
멀티 쓰레드 append 예제
하나의 프로그램에서 여러 스레드를 이용해 여러 테이블에 append하는 예제이다.
파일 이름은 sample8_multi_session_multi_table.c로 한다.
make 코드를 추가하고 실행 파일을 실행해본다. 쓰레드를 이용하므로 출력 순서가 다를 수 있다. 실행 결과는 다음과 같다.
[mach@localhost cli]$ make sample8_multi_session_multi_table gcc -c -g -W -Wall -rdynamic -fno-inline -m64 -mtune=k8 -g -W -Wall -rdynamic -fno-inline -m64 -mtune=k8 -I/home/mach/machbase_home/include -I. -L//home/mach/machbase_home/include -osample8_multi_session_multi_table.o sample8_multi_session_multi_table.c gcc -m64 -mtune=k8 -L/home/mach/machbase_home/lib -osample8_multi_session_multi_table sample8_multi_session_multi_table.o -lmachcli -L/home/mach/machbase_home/lib -lm -lpthread -ldl -lrt -rdynamic [mach@localhost cli]$ ./sample8_multi_session_multi_table connectDB success. createTables success. [0]connectDB success. [1]connectDB success. [2]connectDB success. [1-0]appendOpen success. [0-0]appendOpen success. [2-0]appendOpen success. [1-1]appendOpen success. [2-1]appendOpen success. [0-1]appendOpen success. [1-2]appendOpen success. [2-2]appendOpen success. file open success - [1][suffle_data2.txt] file open success - [2][suffle_data3.txt] [0-2]appendOpen success. file open success - [0][suffle_data1.txt] ....................................................................................... [1-0]appendClose start... .. [0-0]appendClose start... append result success : 100000, failure : 0 [1-0]appendClose success [1-1]appendClose start... append result success : 100000, failure : 0 [1-1]appendClose success [1-2]appendClose start... append result success : 100000, failure : 0 [1-2]appendClose success append result success : 100000, failure : 0 [0-0]appendClose success [0-1]appendClose start... .append result success : 100000, failure : 0 [0-1]appendClose success [0-2]appendClose start... append result success : 100000, failure : 0 [0-2]appendClose success [2-0]appendClose start... append result success : 100000, failure : 0 [2-0]appendClose success [2-1]appendClose start... append result success : 100000, failure : 0 [2-1]appendClose success [2-2]appendClose start... append result success : 100000, failure : 0 [2-2]appendClose success [1]disconnected. [2]disconnected. [0]disconnected. 1 thread join 2 thread join 3 thread join
machsql을 통해 아래와 같이 결과를 확인할 수 있다.
[mach@localhost cli]$ machsql ================================================================= Machbase Client Query Utility Release Version 3.5.0 Copyright 2014, Machbase Inc. or its subsidiaries. All Rights Reserved. ================================================================= Machbase Server Addr (Default:127.0.0.1) : Machbase User ID (Default:SYS) Machbase User Password : manager MACH_CONNECT_MODE=INET, PORT=5656 Mach> select count(*) from table_f1; count(*) ----------------------- 300000 [1] Row Selected. Mach> select count(*) from table_f2; count(*) ----------------------- 300000 [1] row(s) selected. Mach> select count(*) from table_event; count(*) ----------------------- 300000 [1] row(s) selected.