MiniM. Saving time.


| About | Download | Tools | Knowledge Base | How to Buy |

MiniM Overview

Getting Started

Download

Documentation

Tools

Cache Tools

GT.M Tools

Knowledge Base

FAQ

Contacts

Copyrights

MiniM Additional Tools | Nov 27, 2011

MINIGLOBALS

(альтернативный интерфейс к МиниМоно)

Состав

  • c#.bat исполняемый файл, для вызова C# компилятора( укажите свои параметры)
  • cc9.bat исполняемый файл, для вызова VC9/Borland/etc
  • empty.dat тек. база данных, замените на свою, если требуется
  • mg-api.c исходный текст MiniGloals
  • mg-api.dll тек. длл
  • mg-api.h описание внешнего интерфейса
  • mg-api.c.make.bat исполняемый файл для построения длл файла
  • mg-api.class.cs class для внедрения в проекты C#
  • mg-api.sample.make.bat исполняемый файл, для построения примеров
  • mg-api.sample01.cs пример1, использования прямого доступа к функционалу mg-api
  • mg-api.sample02.cs пример2, с использованием class c#
  • minimono.dll
  • minimono.h
  • minimono.lic
  • zdevice.h
  • zdll.h

Общие сведения

Данный модуль предлагает простой c-api(и class c#) для доступа к VM MiniMono. Основная идея, в том, что все параметры сначала подготавливаются в специальных переменных (структуры типа MINIM_STR): name,argv,data затем вызывается необходимая команда. Результат исполнения читается из переменной result. В общем случае алгоритм использования:

public string 
Get (string name, params string[] index)
{
   int rc;
   byte[] ret = new byte[MINIM_STR_MAX+1];

//-- 1. начинаем с обнуления списка аргументов
   mg_ArgClear();

//-- 2. устанавливаем имя глобальки/локальки/рутины
   mg_NameSet(encode.GetBytes(name));

//-- 3. пробежимся по дополнительным параметрам
   foreach (string ix in index)
   {
     rc = mg_ArgAdd(encode.GetBytes(ix),-1);if (rc<0) return "";
   }

//-- 4. исполняем необходимую команду
   rc = mg_Get();

//-- 5. в данном случае, rc == фактический размер данных, которые прочитали
   rc = mg_ResultGet(ret, ret.Length); 

//-- 6. вернули результат и преобразовали в необходимый тип.
   return encode.GetString(ret, 0, rc);
}

Все параметры хранятся в выделенной статической структуре MINIGLOBALS_T. Доступ к ней, только через описанные ниже функции/команды. Описание структуры:

typedef struct _MINIGLOBALS_T
{
#define MG_INDEX_MAX 256

   MINIMONOVM vm;		//переменные из МиниМоно, в т.ч. интерфейс к функциям

   char      name[256];	//имя глобальной/локальной переменной, имя рутины
   int       argc;	//параметры в работу(кол-во индексов для переменной)
   MINIM_STR *argv[MG_INDEX_MAX];	//указатели на значения **argv
   MINIM_STR argdata[MG_INDEX_MAX];	//сами фактические значения параметров

   MINIM_STR data;		//данные к записи
   MINIM_STR result;  		//возвращаемое значение, после работы вызова функций
   MINIM_STR errstr;  	  	//расшифровка ошибка

//ошибки:
   int   error;

} MINIGLOBALS_T;

Описание MG C-API

MG_EXPORT int mg_ErrStrGet(char *buf, int szbuf);

Получает в буфер buf размером szbuf значение внутренней ошибки МиниМоно. Значение так же можно получить при использовании mg_Eval("$ZE") или Eval("$ZE") (class)

MG_EXPORT void mg_ArgClear(void);

Сбрасывает в 0 все аргументы, это первая команда при передаче параметров или индексов

MG_EXPORT int mg_ArgCount(void);

Возвращает тек. кол-во заданных параметров(для информации).

MG_EXPORT int mg_ArgSet(char *name, int sz, int num);

Заменить параметр с номером num на строку name длиной sz Пока не использовать. Для внутреннего применения.

MG_EXPORT int mg_ArgAdd(char *name, int sz);

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

MG_EXPORT int mg_ArgAddInt32(int var);

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

MG_EXPORT int mg_ArgAddInt64(__int64 var);

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

MG_EXPORT int mg_ArgAddDouble(double var);

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

MG_EXPORT int mg_ArgGet(char *buf, int szbuf, int num);

Прочитать аргумент в буфер buf размером szbuf с номером в списке аргуменов num Возвращает фактический размер буфера не более szbuf.

MG_EXPORT int mg_DataSet(char *data, int sz);

Добавить в поле data, параметр в виде строки размером sz Возвращает 0

MG_EXPORT int mg_DataSetInt32(int data);

Добавить в поле data, параметр в виде числа типа int32 Возвращает 0

MG_EXPORT int mg_DataSetInt64(__int64 data);

Добавить в поле data, параметр в виде числа типа int64 Возвращает 0

MG_EXPORT int mg_DataSetDouble(double data);

Добавить в поле data, параметр в виде числа типа double Возвращает 0

MG_EXPORT int mg_ResultGet(char *buf, int szbuf);

Прочитать результат в виде строку в буфер buf, размер буфера szbuf если буфера нехватает, значение урезается.
Возврат: фактическая длина записанных данных.

MG_EXPORT int mg_ResultGetInt32(void);

Прочитать результат в виде числа типа int32
Вертает: число

MG_EXPORT __int64 mg_ResultGetInt64(void);

Прочитать результат в виде числа типа int64
Вертает: число

MG_EXPORT double  mg_ResultGetDouble(void);

Прочитать результат в виде числа типа double
Вертает: число.число

MG_EXPORT char mg_ResultType(void);

Вертает фактический тип значения в полученном результате. Можно получить сл. значения:
'S' - string (если внутренняя длина >=0)
'I' - int32
'Q' - int64
'D' - double
'X' - unknown

MG_EXPORT void mg_NameSet(char *name);
MG_EXPORT void mg_NameGet(char *name);

Установить/прочитать имя глобали/локали/рутины длина: всегда 256 знаков, обычная строка заканчивается '\0'

void mg_Init(void);

Внутренняя инициализация указателей параметров. Отдельно не использовать, вызывается в момент вызова VMConnect.

MG_EXPORT void mg_Execute(void);

Выполнение команды EXECUTE, параметр предварительно готовися в поле data (mg_DataSet*)
Эквивалент: X data

MG_EXPORT int mg_Eval(void);

Выполнить выражение подготовленное в поле data (mg_DataSet*) Полученный результат забираем из поля result (mg_ResultGet)
Эквивалент: result=$$dataexpr

MG_EXPORT int mg_UserFunc(void);

Вызов пользовательской функции подготовленоем в поле name: "$$LABEL^ROUTINE" (mg_NameSet) доп.параметры или аргументы функции пишем в argv (mg_ArgSet*) Результат читаем из переменной result (mg_ResultGet*)
Эквивалент: result=$$label^routine(arg,...)

MG_EXPORT int mg_UserDo(void);

Вызов пользовательской командв подготовленоем в поле name: "LABEL^ROUTINE" (mg_NameSet). доп.параметры или аргументы функции пишем в argv (mg_ArgSet*). Результата нет
Эквивалент: DO label^routine(arg,...)

MG_EXPORT int mg_Kill(void);

Удаление глобальки/локальки, если заявлены доп. аргументы, то они считаюся как индексы Имя указываем в поле name (mg_NameSet) Результата нет
Эквивалент: KILL ^name(arg0,arg1,...,argN)

MG_EXPORT int mg_Increment(void);

+1 глобальки/локальки, если заявлены доп. аргументы, то они считаюся как индексы. Имя указываем в поле name (mg_NameSet). Результат читаем из переменной result (mg_ResultGet*)
Эквивалент: result=$Increment(^name(arg,...))

MG_EXPORT int mg_Data(void);

Проверяет наличие глобальки/локальки, если заявлены доп. аргументы, то они считаюся как индексы. Имя указываем в поле name (mg_NameSet). Результат читаем из переменной result (mg_ResultGet*).
Эквивалент: result=$DATA(^name(arg,...))

MG_EXPORT int mg_Order(int mode);

Получить следующий/предыдущий индекс, если заявлены доп. аргументы, то они считаюся как индексы. Имя указываем в поле name (mg_NameSet). Результат читаем из переменной result (mg_ResultGet*). mode - направление поиска, >=0 направление вперед-следующий, -1 предыдущий.
Эквивалент: result=$ORDER(^name(arg,...), mode)

MG_EXPORT int mg_Get(void);

Прочитать глобальку/локальку, если заявлены доп. аргументы, то они считаюся как индексы. Имя указываем в поле name (mg_NameSet). Результат читаем из переменной result (mg_ResultGet*)
Эквивалент: result=$GET(^name(arg,...),"")

MG_EXPORT int mg_Set(void);

Записать глобальку/локальку значение указанное в поле data, если заявлены доп. аргументы, то они считаюся как индексы. Имя указываем в поле name (mg_NameSet).
Эквивалент: SET ^name(arg,...)=data

MG_EXPORT int mg_VMConnect(char *DataFile, int DBCacheSize, int 
JournalingEnabled);

Подключение к базе MiniMono

MG_EXPORT void mg_VMClose(void);

Закрыть соеденение

MG_EXPORT int mg_Quote(void);

Окавычить(удвоить кавычки) поле data результат получаем в result Эквивалент: "result" = data

Пример

Sample01.cs - пример вызова прямого mg-c-api:
using System;
using System.Text;
using System.Runtime.InteropServices;

public class mg_sample01 : MiniGlobals
{

///////////////////////////////////////////////////////////////////
static void 
Main(string[] args)
{
   Encoding encode = Encoding.GetEncoding(1251);

   int rc = mg_VMConnect(encode.GetBytes("empty.dat"), 100, 0);

   if (rc <0) { Console.WriteLine("Ой! Проблема при старте"); return; }

//начинаем
   mg_ArgClear();

//активируем имя глобальки/локальки
   mg_NameSet(encode.GetBytes("^globals"));

//индекс 1 "Привет!"
   rc = mg_ArgAdd(encode.GetBytes("Привет index!"),-1);
   Console.WriteLine("mg_ArgAdd.rc="+rc);

   rc = mg_DataSet(encode.GetBytes("Это данные. Привет МИНИМОНО!"), -1);
   Console.WriteLine("mg_DataSet.rc="+rc);

//ПИШЕМ В ГДЛОБАЛЬ
   rc = mg_Set();
   Console.WriteLine("mg_Set.rc="+rc);

//читаем туже глобаль
   rc = mg_Get();
   Console.WriteLine("mg_Get.rc="+rc);

//результат чтения глобалдьки, пишем сюда
   byte[] res = new byte[1024];

   rc = mg_ResultGet(res, res.Length);
   Console.WriteLine("res='"+encode.GetString(res,0,rc)+"'");


   mg_VMClose();
}

}  //end class

 

sample02.cs - с использованием classовой технологии
using System;
using System.Text;
using System.Runtime.InteropServices;

public class mg_sample02
{
static void
Main(string[] args)
{
   MiniGlobals mg = new MiniGlobals();

   int rc = mg.Connect("empty.dat", 100, 0);

   if (rc <0) { Console.WriteLine("Ой! Проблема при старте"); return; }

   Console.WriteLine("ver="+mg.Eval("$zv"));
//set
   mg["^globals","ПРИМЕР-SAMPLE02"]="Данные!DATA-Sample";
//get
   Console.WriteLine("data="+mg["^globals","ПРИМЕР-SAMPLE02"]);
//order
   string ix ="";

   for(rc=0;; rc++)
   {
      ix = mg.Order(1,"^globals",ix);
      if (ix.Length ==0) break;
      Console.WriteLine("$order"+rc+"="+ix);
   }

   Console.WriteLine("err="+mg.Error());
   Console.WriteLine("$ze="+mg.Eval("$ze"));

   mg.Close();
}

}  //end class

Download mg.v2.zip (zip, 0.5Mb)
Download miniglobals.v1.0.zip (zip, 0.5Mb)

Александр Чудновский
azbuka@rbcmail.ru


Copyright (C) Eugene Karataev
Info Support