Queue to BLOB

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

Queue to BLOB

Сообщение Constantine »

Есть такая задачка.
Из множества текстовых файлов формируется Queue, которая никогда (очень редко) не меняется.
Нужно ее сформировать, а затем со всем содержимым поместить в BLOB, а затем, при необходимости, восстановить в памяти, чтобы не формировать ее каждый раз из файлов.
Кто-нибудь делал? Есть идеи?
Спасибо!
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Queue to BLOB

Сообщение Yufil »

Это называется "сериализация". XML, JSON, YAML ... в помощь.
Тем не менее, я делал https://mega.nz/#!pxY0VQwR!B2l1BEHvbfFT ... voxTx-XoSI

Хранились данные сессии, включающие очереди, группы и т д.

В тексте программы что-то типа

Код: Выделить всё

P   Class(DumpClass)
    End
....
!    Регистрация хранимых объектов (Очереди, группы, просто переменные 
     P.AddField('ZTstQ',TstQ)
     P.AddField('ResQ',ResQ)
     P.AddField('Qlist',QList)
     P.AddField('QGroup',QGroup)
.... 
!    Чтение блоба 
     P.LoadBlob(Ses:Info)

.... 
!     Запись блоба 
      P.SaveBlob(Ses:Info)
Вот наскрёб куски из реальных работающих программ
https://mega.nz/#!R4Rg1TAK!hyP2E8WsyeTh ... l8fPlta2lI
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

Queue to BLOB

Сообщение Constantine »

Спасибо, Юра!
Ты, как всегда, лучший!
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Queue to BLOB

Сообщение Дед Пахом »

Проще всего перегнать очередь в строку без всякой сериализации, байт в байт, и так же обратно.
С уважением, ДП
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

Queue to BLOB

Сообщение Constantine »

А примерчик можно, пожалуйста...
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Queue to BLOB

Сообщение Дед Пахом »

берётся строка длиной "размер одной записи очереди Х количество записей" и в цикле по очереди каждая запись пишется в эту строку на нужном месте. Обратно: размер строки из файла из файла делим на размер записи, получаем число записей в очереди, и каждый кусок строки добавляем в очередь.
С уважением, ДП
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

Queue to BLOB

Сообщение Constantine »

Спасибо!
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Queue to BLOB

Сообщение Дед Пахом »

Код: Выделить всё

  PROGRAM

SomeGrp                       GROUP, TYPE
s1                              STRING(20)
l1                              LONG
                              END

SomeQue                       QUEUE(SomeGrp), TYPE
                              END

  MAP
    Que2String(SomeQue q), *STRING
    String2Que(STRING  s, *SomeQue q)
  END


myQ                           QUEUE(SomeQue)
                              END

qBuf                          &STRING
ndx                           LONG, AUTO

  CODE
  !-- test data
  myQ.l1 = 1
  myQ.s1 = 'First'
  ADD(myQ)
  myQ.l1 = 2
  myQ.s1 = 'Second'
  ADD(myQ)

  !-- byte serialization
  qBuf &= Que2String(myQ)

  !-- delete all records
  FREE(myQ)
  CLEAR(myQ)

  !-- deserialize
  String2Que(qBuf, myQ)

  !-- Test
  LOOP ndx = 1 TO RECORDS(myQ)
    GET(myQ, ndx)
    MESSAGE(myQ.l1 &': '& myQ.s1)
  END

  !-- cleanup
  DISPOSE(qBuf)
  
Que2String                    PROCEDURE(SomeQue q)
sref                            &STRING
grp                             LIKE(SomeGrp)
nrecs                           LONG, AUTO
qIndex                          LONG, AUTO
slice1                          LONG, AUTO
slice2                          LONG, AUTO
  CODE
  nrecs = RECORDS(q)
  sref &= NEW STRING(nrecs * LEN(grp))
  
  slice1 = 1
  slice2 = LEN(grp)
  
  LOOP qIndex = 1 TO nrecs
    GET(q, qIndex)
    grp = q
    sref[slice1 : slice2] = grp
    slice1 += LEN(grp)
    slice2 += LEN(grp)
  END
  
  RETURN sref
  
String2Que                    PROCEDURE(STRING  s, *SomeQue q)
grp                             LIKE(SomeGrp)
nrecs                           LONG, AUTO
qIndex                          LONG, AUTO
slice1                          LONG, AUTO
slice2                          LONG, AUTO
  CODE
  nrecs = LEN(s) / LEN(grp)
  slice1 = 1
  slice2 = LEN(grp)
  LOOP qIndex = 1 TO nrecs
    grp = s[slice1 : slice2]
    q = grp
    ADD(q)
    slice1 += LEN(grp)
    slice2 += LEN(grp)
  END
  
С уважением, ДП
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

Queue to BLOB

Сообщение Constantine »

Спасибо БОЛЬШОЕ! :-)
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Queue to BLOB

Сообщение Yufil »

Так у меня класс именно это и делает, только там в блоб можно загнать не одну, а несколько очередей. Сначала выводится служебная запись с идентификатором, размером записи и количеством записей, потом записи очереди, потом таким же образом и другие очереди...
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

Queue to BLOB

Сообщение Constantine »

А вот интересно, с помощью PEEK/POKE такой номер можно проделать?
Т.е. сохранить/восстановить "дамп" очереди?
Мне кажется, что так будет побыстрее...
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Queue to BLOB

Сообщение Yufil »

Так она может быть раскидана по памяти, вряд ли удастся скопировать всю сразу. А вот буфер копируется через memcopy, с некоторой экономией времени...
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

Queue to BLOB

Сообщение Constantine »

А если STATIC?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Queue to BLOB

Сообщение Дед Пахом »

Constantine писал(а): 08 Декабрь 2017, 9:49А если STATIC?
А если всё-таки попробовать самому хоть что-то сделать? :facepalm:
С уважением, ДП
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Queue to BLOB

Сообщение Yufil »

Дык, я выложил готовый и реально работающий класс. Который выкладывает в Blob даже не одну, а несколько очередей.
Используется в разного рода обучающих программах для сохранения сессии (список пройденных разделов, результаты тестирований, значения переменных, текущая ситуация на экране, конфигурация параметров и т д) и, знамо дело, восстановлении при последующем пуске (для Интернет-версий между обращениями к серверу)
Создал объект класса, указал очереди, которые в нём лежат. После чего SaveBlob копирует очереди в Blob, а LoadBlob достаёт их оттуда.
Бери и пользуйся...
Ответить