블로그는 나의 힘!
[ Programing ]/Database2023. 11. 16. 12:32

# 생성
CREATE TABLE objectInfo ( 
     objectID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
     param VARCHAR(128),    
     param2 JSON
);



# 저장
INSERT INTO objectInfo
SET param = '{"keep":23,"storage":"1"}', param2 = '{"keep":23,"storage":"1"}';

  ( OR )
INSERT INTO objectInfo
SET param = '{"keep":23,"storage":"1"}', param2 = JSON_OBJECT("keep", 23, "storage", "1");




TABLE : objectInfo

objectID param param2
1 {"storage":"1"} {"storage":"1"}
2 {"keep":23,"storage":"1"} {"keep":23,"storage":"1"}




# 검색
SELECT objectID, param FROM objectInfo;

objectID param param2
1 {"storage":"1"} {"storage":"1"}
2 {"keep":23,"storage":"1"} {"keep":23,"storage":"1"}



/*
  화살표(->)로 필드와 경로식을 구분. 

  param 컬럼에 있는 JSON 데이터에서 key 이름이 keep, storage 요소를 가리킨다.
  param->'$.keep' 문은 json_extract(param, '$.keep') 과 동일.
*/

SELECT objectID,
         param->'$.keep' AS keep,

         param->'$.storage' AS storage ,
         CAST(param->'$.storage' AS SIGNED) AS castIntStorage 
FROM objectInfo;

objectID keep storage castIntStorage
1 (NULL) 1 1
2 23 1 1




# 수정
UPDATE는 JSON_SET(), JSON_REPLACE(), JSON_REMOVE() 함수 이용.

     JSON_SET(): 기존 값 수정하고 미존재 시 추가.
     JSON_REPLACE(): 기존 값 변경.
     JSON_REMOVE(): 기존 값 삭제. -> NULL.

문법 :

UPDATE table_name 
SET json_col = JSON_SET(json_col, '$.valueName1', UPPER(json_col->>'$.valueName1')),

      json_col = JSON_REPLACE(json_col, '$.valueName2', int_col),
      json_col = JSON_REMOVE(json_col, '$.valueName3'),
      int_col = int_col + 1;

UPDATE table_name
SET json_col = JSON_REPLACE(
                                    JSON_REMOVE(json_col, '$.valueName3'),

                                    '$.valueName1', UPPER(json_col->>'$.valueName1'),
                                    '$.valueName2', int_col), 
       int_col = int_col + 1;




UPDATE objectInfo
SET param2 = JSON_SET(info, "$.keep", 46) WHERE objectID = 1;


SELECT * from objectInfo where objectID = 1;

objectID param param2
1 {"keep":23,"storage":"1"} {"keep":46,"storage":"1"}




# JSON 함수
JSON_ARRAY : JSON 배열 반환.

  SELECT JSON_ARRAY("apple", "car", "tv", "ios");

JSON_ARRAY("apple", "car", "tv", "ios")
["apple", "car", "tv", "ios"]




JSON_EXTRACT : JSON 경로와 일치하는 데이터 반환.

  SET @j = '[10, 20, [30, 40]]';

  SELECT JSON_EXTRACT(@j, '$[0]');

JSON_EXTRACT(@j, '$[0]')
10




JSON_OBJECT : SELECT 결과를 JSON 형태로 변환해서 받아보고 싶을 때 사용.

  SELECT JSON_OBJECT("name","yundream", "age", 25, "address", "seoul");

JSON_OBJECT("name","yundream", "age", 25, "address", "seoul")
{"age": 25, "name": "yundream", "address": "seoul"}




JSON_SET : JSON 문서에 필드를 추가나 갱신 위해서 사용.

  SET @j = JSON_OBJECT("a", 1, "b", JSON_ARRAY(2,3));

  SELECT @j;

@j
{"a": 1, "b": [2, 3]}


  SELECT JSON_SET(@j, '$.a', 10, '$.c', '[true, false]');

JSON_SET(@j, '$.a', 10, '$.c', '[true, false]')
{"a": 10, "b": [2, 3], "c": "[true, false]"}




JSON_INSERT : 새로운 필드만 추가.

  SELECT @j;

@j
{"a": 1, "b": [2, 3]}


  SELECT JSON_INSERT(@j, '$.a', 10, '$.c', '[treu, false]');

JSON_INSERT(@j, '$.a', 10, '$.c', '[treu, false]')
{"a": 1, "b": [2, 3], "c": "[treu, false]"}




JSON_REPLACE : 같은 필드 존재할 경우 변경. 존재하지 않는 필드는 무시.

  SELECT @j;

@j
{"a": 1, "b": [2, 3]}


  SELECT JSON_REPLACE(@j, '$.a', 10, '$.c', '[treu, false]');

JSON_REPLACE(@j, '$.a', 10, '$.c', '[treu, false]')
{"a": 10, "b": [2, 3]}




JSON_VALID : JSON 문서 형식이 올바른지 검사.

  SELECT JSON_VALID('{"a": 1}');

JSON_VALID('{"a": 1}')
1


  SELECT JSON_VALID('hello');

JSON_VALID('hello')
0




JSON_STORAGE_SIZE & JSON_STORAGE_FREE : JSON 문서 저장하는데 사용된 바이트 수 반환.

  SELECT JSON_STORAGE_SIZE(param2) AS JsonSize FROM objectInfo;






출처 : Mysql JSON - SELECT, INSERT, UPDATE, 색인 (joinc.co.kr)

 

Mysql JSON - SELECT, INSERT, UPDATE, 색인

MySQL도 JSON을 지원합니다. SELECT, INSERT, 색인하는 법, JSON PATH 표현식을 살펴봅니다. 그리고 JSON_ARRAY, JSON_EXTRACT, JSON_OBJECT, JSON_SET, JSON_INSERT, JSON_REPLACE, JSON_VALID 등의 주요 함수 사용법도 확인합니다.

www.joinc.co.kr



 
 

Posted by Mister_Q
[ Programing ]/C++2023. 10. 17. 12:05


     time_t tTargetTime = time(NULL);     //!< 현재 시간.
     int32 nIntervalMonth = 0;     //!< 이전 설정 달 (기간).

     struct tm tmNow;
     localtime_s(&tmNow, &tTargetTime);
     if (before_interval_month != 0)
     {
          //!< 12월 변환 후 계산.
          int32 nConvertMonth = tmNow.tm_mon + 1;

          //!< 이전 설정 달이 1년 전이라면 날짜 계산.
          if (nConvertMonth - nIntervalMonth <= 0)
          {
               int32 nRemainMonth = nIntervalMonth - nConvertMonth;
               tmNow.tm_year -= 1;     //!< 1년 전으로 설정
               nRemainMonth = 12 - nRemainMonth;     //!< 설정 달로 설정
               tmNow.tm_mon = nRemainMonth - 1;
          }
          else
          {
               //!< 설정 달로 변경
               tmNow.tm_mon -= nIntervalMonth;
          }
     }
     int nReturnTime = ((tmNow.tm_year + 1900) * 100) + ( tmNow .tm_mon + 1);

 

'[ Programing ] > C++' 카테고리의 다른 글

C++ 콘솔 창.  (0) 2022.04.07
C++ MiniDump Review  (0) 2022.01.21
Memory Access Violation - 메모리 접근 위반.  (0) 2022.01.19
C++ malloc, new 메모리 할당의 차이점.  (0) 2021.11.25
MySQL C++ API / ODBC  (0) 2021.11.09
Posted by Mister_Q

#define g_UserManager Singleton<UserManager>
#define g_MemDBManager Singleton<MemDBManager>::GetSingleton()
#define g_ProxyManager Singleton<ProxyManager>::GetSingleton()

#define CONV_MSEC2USEC(x)     ( (x) * 1000 )
#define CONV_SEC2MSEC(x)     ( (x) * 1000 )
#define CONV_SEC2USEC(x)     ( CONV_SEC2MSEC(x) * 1000 )

class UserManager
{
public:
     UserManager() {}
     virtual ~UserManager() {}
     void Run() { while (m_runFlag){ sleep(CONV_MSEC2USEC(1)); } }
     void SetRunFlag(bool flag) { m_runFlag = flag; }

private:
     bool m_runFlag = true;
}
class MemDBManager
{
public:
    MemDBManager() {}
     virtual ~MemDBManager() {}
     void run_service_reconnect(int index, int intervalSec) { while (m_runFlag){ sleep(intervalSec); } }
     void SetRunFlag(bool flag) { m_runFlag = flag; }

private:
     bool m_runFlag = true;
}
class ProxyManager
{
public:
     ProxyManager() {}
     virtual ~ProxyManager() {}
     void run(int index) { ... }
}

void ServiceMain::Run()
{
     //logInfo("===========================================");
     //logInfo("= Service Running");
     //logInfo("===========================================");

     boost::thread_group t_group;
     std::list<boost::thread*> threadList;

     //!<  create_thread 함수 호출 시 스레드가 생성되어 thread_group에 귀속.
     //!< 스레드 생성할 때마다 io_service 변수를 넘겨준 후 io_service의 post() 통해 bind 함수 넘겨주면, 
     //!< 해당 함수가 스레드 풀 중에서 남는 스레드를 선택하여 작업을 수행.
     //!< bind : 특정 함수를 호출할 때 그 매개변수 값을 함께 넘겨주기 위해 사용.

     threadList.push_back(t_group.create_thread(boost::bind(&UserManager::Run, &g_UserManager)));
     threadList.push_back(t_group.create_thread(boost::bind(&MemDBManager::run_service_reconnect,
                                                                         &g_MemDBManager, 0, CONV_SEC2USEC(10))));


     threadList.push_back(t_group.create_thread(boost::bind(&ProxyManager::run, &g_ProxyManager, index++)));
     threadList.push_back(t_group.create_thread(boost::bind(&ProxyManager::run, &g_ProxyManager, index++)));

     //!< 스레드 종료시 까지 대기
     t_group.join_all();

     //!< Remove
     for(std::list<boost::thread*>::iterator itor = threadList.begin(); itor != threadList.end(); ++itor)
     {
          t_group.remove_thread(*itor);
     }

     //logInfo("===========================================");
     //logInfo("= Service is stopped");
     //logInfo("===========================================");
}




출처 : [C/C++] Boost 주요 기능 정리 : 네이버 블로그 (naver.com)

 

[C/C++] Boost 주요 기능 정리

[개요]Boost의 주요 기능들에 대해 설명합니다. [목차]Boost::threadBoost::bindBoost::functionboost:...

blog.naver.com


 

'[ Programing ] > STL & Booster' 카테고리의 다른 글

C++ STL mutex  (0) 2022.01.21
C++ STL fill_n / fill  (0) 2021.01.22
C++ STL Function  (0) 2020.09.14
C++ stl numeric_limits  (0) 2020.06.10
C++17. STL variant  (0) 2020.06.08
Posted by Mister_Q