Как получить размер BLOB без чтения содержимого BLOB - PullRequest
5 голосов
/ 01 августа 2011

У меня есть следующие вопросы относительно больших двоичных объектов в sqlite:

  • Отслеживает ли sqlite размеры BLOB-объектов?
  • Я предполагаю, что это так, но затем функция длины использует его или читает содержимое BLOB?
  • Если sqlite отслеживает размер большого двоичного объекта, а длина не использует его, доступен ли размер через некоторые другие функции?

Я спрашиваю об этом, потому что мне интересно, должен ли я реализовывать триггеры, которые устанавливают размеры BLOB в дополнительных столбцах, или если я могу получить размеры динамически без снижения производительности sqlite при чтении BLOB.

Ответы [ 3 ]

4 голосов
/ 10 августа 2011

Из источника:

** In an SQLite index record, the serial type is stored directly before
** the blob of data that it corresponds to. In a table record, all serial
** types are stored at the start of the record, and the blobs of data at
** the end. Hence these functions allow the caller to handle the
** serial-type and data blob seperately.
**
** The following table describes the various storage classes for data:
**
**   serial type        bytes of data      type
**   --------------     ---------------    ---------------
**      0                     0            NULL
**      1                     1            signed integer
**      2                     2            signed integer
**      3                     3            signed integer
**      4                     4            signed integer
**      5                     6            signed integer
**      6                     8            signed integer
**      7                     8            IEEE float
**      8                     0            Integer constant 0
**      9                     0            Integer constant 1
**     10,11                               reserved for expansion
**    N>=12 and even       (N-12)/2        BLOB
**    N>=13 and odd        (N-13)/2        text

Другими словами, размер капли указан в последовательном, а его длина просто "(serial_type-12) / 2".
Этот серийный номер хранится до самого BLOB-объекта, поэтому вам не нужно читать BLOB-объект, чтобы получить его размер.
Вызовите sqlite3_blob_open, а затем sqlite3_blob_bytes, чтобы получить это значение.

0 голосов
/ 08 августа 2011

Если у вас есть доступ к сырому приложению, sqlite3_blob_bytes выполнит эту работу за вас. Если нет, пожалуйста, предоставьте дополнительную информацию.

0 голосов
/ 08 августа 2011

Запись 1-байтового и 10-Гбайтного двоичного объекта в тестовую базу данных.Если length() занимает одно и то же время для обоих BLOB-объектов, возможно, доступна длина BLOB-объекта.В противном случае, возможно, читается большой двоичный объект.

ИЛИ: загрузите исходный код и отладьте его: http://www.sqlite.org/download.html. Вот некоторые важные биты:

/*
** Implementation of the length() function
*/
static void lengthFunc(
  sqlite3_context *context,
  int argc,
  sqlite3_value **argv
){
  int len;

  assert( argc==1 );
  UNUSED_PARAMETER(argc);
  switch( sqlite3_value_type(argv[0]) ){
    case SQLITE_BLOB:
    case SQLITE_INTEGER:
    case SQLITE_FLOAT: {
      sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
      break;
    }
    case SQLITE_TEXT: {
      const unsigned char *z = sqlite3_value_text(argv[0]);
      if( z==0 ) return;
      len = 0;
      while( *z ){
        len++;
        SQLITE_SKIP_UTF8(z);
      }
      sqlite3_result_int(context, len);
      break;
    }
    default: {
      sqlite3_result_null(context);
      break;
    }
  }
}

, а затем

/*
** Return the number of bytes in the sqlite3_value object assuming
** that it uses the encoding "enc"
*/
SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){
  Mem *p = (Mem*)pVal;
  if( (p->flags & MEM_Blob)!=0 || sqlite3ValueText(pVal, enc) ){
    if( p->flags & MEM_Zero ){
      return p->n + p->u.nZero;
    }else{
      return p->n;
    }
  }
  return 0;
}

Вы видите, что длина текстовых данных рассчитывается на лету.Это из сгустков ... ну, я не достаточно свободно говорю на C ...: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...