MiniM Overview |
MiniM
Additional Tools | Nov 27, 2011 MINIGLOBALS (альтернативный интерфейс к МиниМоно) Состав
Общие сведения Данный модуль предлагает простой 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);
Вертает фактический тип значения в полученном результате.
Можно получить сл. значения:
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*)
MG_EXPORT int mg_Eval(void);
Выполнить выражение подготовленное в поле data (mg_DataSet*)
Полученный результат забираем из поля result (mg_ResultGet)
MG_EXPORT int mg_UserFunc(void);
Вызов пользовательской функции подготовленоем в поле name: "$$LABEL^ROUTINE"
(mg_NameSet)
доп.параметры или аргументы функции пишем в argv (mg_ArgSet*)
Результат читаем из переменной result (mg_ResultGet*)
MG_EXPORT int mg_UserDo(void);
Вызов пользовательской командв подготовленоем в поле name: "LABEL^ROUTINE"
(mg_NameSet). доп.параметры или аргументы функции пишем в argv (mg_ArgSet*).
Результата нет
MG_EXPORT int mg_Kill(void);
Удаление глобальки/локальки, если заявлены доп. аргументы, то они считаюся как
индексы
Имя указываем в поле name (mg_NameSet)
Результата нет
MG_EXPORT int mg_Increment(void);
+1 глобальки/локальки, если заявлены доп. аргументы, то они считаюся как
индексы. Имя указываем в поле name (mg_NameSet). Результат читаем из переменной
result (mg_ResultGet*)
MG_EXPORT int mg_Data(void);
Проверяет наличие глобальки/локальки, если заявлены доп. аргументы, то они
считаюся как индексы. Имя указываем в поле name (mg_NameSet). Результат читаем
из переменной result (mg_ResultGet*).
MG_EXPORT int mg_Order(int mode);
Получить следующий/предыдущий индекс, если заявлены доп. аргументы, то они
считаюся как индексы. Имя указываем в поле name (mg_NameSet). Результат читаем
из переменной result (mg_ResultGet*).
mode - направление поиска, >=0 направление вперед-следующий, -1 предыдущий.
MG_EXPORT int mg_Get(void);
Прочитать глобальку/локальку, если заявлены доп. аргументы, то они считаюся как
индексы. Имя указываем в поле name (mg_NameSet). Результат читаем из переменной
result (mg_ResultGet*)
MG_EXPORT int mg_Set(void);
Записать глобальку/локальку значение указанное в поле data, если заявлены доп.
аргументы, то они считаюся как индексы. Имя указываем в поле name (mg_NameSet).
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)
azbuka@rbcmail.ru
|
|
Info Support |