일상에서 멍때리기

sqlite binding시 마지막 파라미터 차이(SQLITE_STATIC, SQLITE_TRANSIENT) 본문

프로그래밍/삽질로그

sqlite binding시 마지막 파라미터 차이(SQLITE_STATIC, SQLITE_TRANSIENT)

로 얄 2014. 4. 14. 23:27
반응형

sqlite3를 사용하면서 string을 binding할 때 sqlite3_bind_text, sqlite3_bind_text16을 사용한다.
이 때, 사용되는 마지막 파라미터의 차이에 대하여 알아본다.
binding을 할 때, 구글링한데로 복사 붙여넣기해서 쓰다보면 두 파라미터의 차이를 모르고 마구 쓰다가 알수없는 오류에 직면하게 될 수 도 있다.

  1. SQLITE_STATIC
    flag에서도 알 수 있듯이 static으로 잡혀 있는(free될 일이 없는) 변수를 사용할 때 사용된다.
  2. SQLITE_TRANSIENT
    위와 다르게 free되거나 변경될수 있는 변수를 이용할 때 사용된다.

 와 같이 조금 다르다. 
1. SQLITE_STATIC에서는 말그대로 free되지 않거나 변경되지 않는 static변수로 잡힌 것을 사용한다는 표시이기 때문에 해당 주소값을 가지고 간다. 변수가 free되거나 변경되면 binding값이 변경되거나 동작에 문제가 생길 수 도있다는 말이다. 
2. SQLITE_TRANSIENT의 경우는 변경되거나 free될 수도 있는 변수를 사용한다는 표시이기 때문에, 함수로 들어간 binding값을 복사하여 사용한다. 그래서 변경이나 문제가 발생할 원인이 제거 되지만, 복사가 일어나기 때문에 SQLITE_STATIC보다는 속도가 느릴 것이다.

위의 내용은 SQLite홈페이지에서 간략하게 설명이 되어있긴 하지만, 쉽게 무시하고 지나칠 수 있는 내용이다 .
아래는 홈페이지에 나온 원문이다. 참고 하시기를...

The destructor is called to dispose of the BLOB or string even if the call to sqlite3_bind_blob(), sqlite3_bind_text(), or sqlite3_bind_text16() fails. If the fifth argument is the special value SQLITE_STATIC, then SQLite assumes that the information is in static, unmanaged space and does not need to be freed. If the fifth argument has the value SQLITE_TRANSIENT, then SQLite makes its own private copy of the data immediately, before the sqlite3_bind_*() routine returns.

 

반응형
Comments