OSDN Git Service

たぶんこういうこと。
[newstable/newstable.git] / Unit1.pas
1 unit Unit1;
2
3 interface
4
5 uses
6   System.SysUtils, System.Classes, System.JSON, FireDAC.Comp.Client, Data.DB,
7   FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param,
8   FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf,
9   FireDAC.Stan.Async, FireDAC.DApt, FireDAC.UI.Intf, FireDAC.Stan.Def,
10   FireDAC.Stan.Pool, FireDAC.Phys, FireDAC.Phys.MySQL, FireDAC.Phys.MySQLDef,
11   FireDAC.Comp.DataSet, FireDAC.VCLUI.Wait, FireDAC.Comp.UI, FireDAC.Phys.FB,
12   FireDAC.Phys.FBDef;
13
14 type
15   TDataModule1 = class(TDataModule)
16     database: TFDTable;
17     indexTable: TFDTable;
18     reader: TFDTable;
19     magList: TFDTable;
20     MagazineConnection: TFDConnection;
21     FDQuery1: TFDQuery;
22     news: TFDTable;
23     FDGUIxWaitCursor1: TFDGUIxWaitCursor;
24     writer: TFDTable;
25     writerwriterId: TIntegerField;
26     writerwriter: TWideStringField;
27     writermail: TWideStringField;
28     writerpassword: TWideStringField;
29     magListwriterId: TIntegerField;
30     magListmagId: TIntegerField;
31     newsmagId: TIntegerField;
32     newsno: TIntegerField;
33     newsday: TDateField;
34     newschanged: TBooleanField;
35     newsenabled: TBooleanField;
36     readerreaderId: TIntegerField;
37     readerreader: TWideStringField;
38     readermail: TWideStringField;
39     readerpassword: TWideStringField;
40     indexTablereaderId: TIntegerField;
41     indexTablemagId: TIntegerField;
42     mag: TFDTable;
43     magmagId: TIntegerField;
44     magmagName: TWideStringField;
45     magcomment: TWideStringField;
46     magday: TDateField;
47     maglastDay: TDateField;
48     magenable: TBooleanField;
49     procedure DataModuleCreate(Sender: TObject);
50   private
51     { Private \90é\8c¾ }
52     function makeTable(Sender: TObject): TJSONObject;
53   public
54     { Public \90é\8c¾ }
55     procedure AddMagazine(id: integer; out Data: TJSONObject);
56     procedure backNumber(id: integer; out Data: TJSONObject);
57     function checkUserPassword(id: integer; password: string): Boolean;
58     procedure createReaderId(Data: TJSONObject);
59     procedure deleteReaderId(Data: TJSONObject);
60     procedure updateReaderId(Data: TJSONObject);
61     procedure custData(id: integer; Data: TJSONObject);
62     procedure custView(id: integer; out Data: TJSONObject);
63     procedure deleteMagazine(id: integer);
64     procedure deleteNumber(id, num: integer);
65     procedure deleteWriter(id: integer);
66     procedure getView(id, num: integer; out Data: TJSONObject); overload;
67     procedure getView(id: integer; out Data: TJSONObject); overload;
68     procedure magazines(id: integer; out Data: TJSONObject);
69     procedure magListAll(out Data: TJSONObject);
70     procedure magData(id: integer; out Data: TJSONObject);
71     function magid(name: string): integer;
72     procedure magIdOff(id, magid: integer);
73     procedure magIdOn(id, magid: integer);
74     procedure createMagId(id: integer; out Data: TJSONObject);
75     procedure postMessage(id: integer; Data: TJSONObject);
76     procedure createWriterId(Data: TJSONObject);
77     procedure readerData(id: integer; out Data: TJSONObject);
78     procedure titleView(id: integer; Data: TJSONObject);
79     procedure updateWriterId(id: integer; Data: TJSONObject);
80     procedure userView(id: integer; out Data: TJSONObject);
81   end;
82
83 var
84   DataModule1: TDataModule1;
85
86 implementation
87
88 uses System.Variants, System.Generics.Collections;
89
90 { %CLASSGROUP 'Vcl.Controls.TControl' }
91
92 {$R *.dfm}
93
94 procedure TDataModule1.AddMagazine(id: integer; out Data: TJSONObject);
95 var
96   i: integer;
97   na, com: string;
98 begin
99   FDQuery1.Open('select MAX(magId) as id from mag;');
100   i := FDQuery1.FieldByName('id').AsInteger + 1;
101   na := Data.Values['magName'].Value;
102   com := Data.Values['comment'].Value;
103   mag.AppendRecord([i, na, com, Date, Date, true]);
104   magList.AppendRecord([id, i]);
105 end;
106
107 procedure TDataModule1.backNumber(id: integer; out Data: TJSONObject);
108 const
109   con = '\82±\82Ì\8bL\8e\96\82Í\8cö\8aJ\90§\8cÀ\82ª\82 \82è\82Ü\82·.';
110 var
111   d: TJSONObject;
112   mem: TStringList;
113   blob: TStream;
114 begin
115   Data := TJSONObject.Create;
116   d := Data;
117   mem := TStringList.Create;
118   with FDQuery1 do
119   begin
120     SQL.Clear;
121     SQL.Add('select file,enabled from news where magId = :id order by lastDay;');
122     Params.ParamByName('id').AsInteger := id;
123     Open;
124     while Eof = false do
125     begin
126       blob := CreateBlobStream(FieldByName('text'), bmRead);
127       mem.LoadFromStream(blob);
128       if FieldByName('enabled').AsBoolean = true then
129         d.AddPair('text', mem.Text)
130       else
131         d.AddPair('text', con);
132       blob.Free;
133       Next;
134     end;
135   end;
136   mem.Free;
137 end;
138
139 function TDataModule1.checkUserPassword(id: integer; password: string): Boolean;
140 begin
141   result := writer.Lookup('id', id, 'password') = password;
142 end;
143
144 procedure TDataModule1.createMagId(id: integer; out Data: TJSONObject);
145 var
146   i: integer;
147 begin
148   FDQuery1.SQL.Clear;
149   FDQuery1.SQL.Add('select MAX(magId) as count from mag;');
150   FDQuery1.Open;
151   i := FDQuery1.FieldByName('count').AsInteger + 1;
152   mag.Append;
153   mag.FieldByName('magId').AsInteger := i;
154   mag.FieldByName('day').AsDateTime := Date;
155   mag.FieldByName('lastDay').AsDateTime := Date;
156   mag.FieldByName('magName').AsString := Data.Values['magName'].Value;
157   mag.FieldByName('comment').AsString := Data.Values['comment'].Value;
158   mag.FieldByName('enable').AsString := Data.Values['enable'].Value;
159   mag.Post;
160   magList.AppendRecord([id, i]);
161 end;
162
163 procedure TDataModule1.createReaderId(Data: TJSONObject);
164 var
165   i: integer;
166   na, ma, pa: string;
167 begin
168   FDQuery1.Open('select MAX(readerid) as id from reader;');
169   i := FDQuery1.FieldByName('id').AsInteger + 1;
170   na := Data.Values['name'].Value;
171   ma := Data.Values['mail'].Value;
172   pa := Data.Values['password'].Value;
173   reader.AppendRecord([i, na, ma, pa]);
174 end;
175
176 procedure TDataModule1.DataModuleCreate(Sender: TObject);
177 const
178   tmp = 'create table if not exists ';
179 begin
180 //  FDQuery1.ExecSQL(tmp+'database(number int primary key, magId int, readerId int, writeId int);');
181   FDQuery1.ExecSQL
182     (tmp + 'mag(magId int primary key, magName varchar(20), comment varchar(50), day date, lastDay date, enable bool);');
183   FDQuery1.ExecSQL
184     (tmp + 'writer(writerId int primary key, writer varchar(20), mail varchar(20), password varchar(20));');
185   FDQuery1.ExecSQL
186     (tmp + 'reader(readerId int primary key, reader varchar(20), mail varchar(20), password varchar(20));');
187   FDQuery1.ExecSQL
188     (tmp + 'news(magId int, no int, day date, changed bool, enabled bool, primary key (magId,no));');
189   FDQuery1.ExecSQL
190     (tmp + 'indexTable(readerId int, magId int, primary key (readerId,magId));');
191   FDQuery1.ExecSQL
192     (tmp + 'magList(writerId int, magId int, primary key (writerId,magId));');
193 //  database.Open;
194   mag.Open;
195   writer.Open;
196   reader.Open;
197   news.Open;
198   indexTable.Open;
199   magList.Open;
200 end;
201
202 procedure TDataModule1.deleteMagazine(id: integer);
203   procedure main(Sender: TObject);
204   begin
205     with Sender as TFDTable do
206       while Locate('magid',id) = true do
207         Delete;
208   end;
209
210 begin
211   main(mag);
212   main(news);
213 //    main('database');
214   main(indexTable);
215 end;
216
217 procedure TDataModule1.deleteNumber(id, num: integer);
218 begin
219   if news.Locate('magId;newsId', VarArrayOf([id, num])) = true then
220     news.Delete;
221 end;
222
223 procedure TDataModule1.deleteReaderId(Data: TJSONObject);
224 var
225   id: integer;
226   na, ma, pa: string;
227 begin
228   id := Data.Values['id'].Value.ToInteger;
229   na := Data.Values['reader'].Value;
230   ma := Data.Values['mail'].Value;
231   pa := Data.Values['password'].Value;
232   if reader.Locate('readerid;reader;mail;password', VarArrayOf([id, na, ma, pa])
233     ) = true then
234     reader.Delete;
235   while indexTable.Locate('readerid',id) = true do
236     indexTable.Delete;
237 end;
238
239 procedure TDataModule1.deleteWriter(id: integer);
240 begin
241   if writer.Locate('writerid',id) = true then
242     writer.Delete;
243   while maglist.Locate('writerid',id) = true do
244   begin
245     deleteMagazine(magList.FieldByName('magid').AsInteger);
246     magList.Delete;         ///////
247   end;
248 end;
249
250 procedure TDataModule1.readerData(id: integer; out Data: TJSONObject);
251 begin
252   if reader.Locate('readerid', id) = true then
253   begin
254     Data := TJSONObject.Create;
255     Data.AddPair('name', reader.FieldByName('reader').AsString);
256     Data.AddPair('mail', reader.FieldByName('mail').AsString);
257   end;
258 end;
259
260 procedure TDataModule1.userView(id: integer; out Data: TJSONObject);
261 var
262   i: integer;
263   list: TList<integer>;
264 begin
265   Data := TJSONObject.Create;
266   list := TList<integer>.Create;
267   FDQuery1.SQL.Clear;
268   FDQuery1.SQL.Add('select * from indexTable where readerid = :id;');
269   FDQuery1.Params.ParamByName('id').AsInteger := id;
270   FDQuery1.Open;
271   while FDQuery1.Eof = false do
272     list.Add(FDQuery1.FieldByName('magid').AsInteger);
273   for i in list do
274     titleView(i, Data);
275   list.Free;
276 end;
277
278 procedure TDataModule1.custData(id: integer; Data: TJSONObject);
279 begin
280   if writer.Locate('writerid', id) = true then
281   begin
282     Data.AddPair('name', writer.FieldByName('writer').AsString);
283     Data.AddPair('mail', writer.FieldByName('mail').AsString);
284   end;
285 end;
286
287 procedure TDataModule1.custView(id: integer; out Data: TJSONObject);
288 var
289   i: integer;
290   list: TList<integer>;
291 begin
292   Data := TJSONObject.Create;
293   list := TList<integer>.Create;
294   FDQuery1.SQL.Clear;
295   FDQuery1.SQL.Add('select * from maglist where readerid = :id;');
296   FDQuery1.Params.ParamByName('id').AsInteger := id;
297   FDQuery1.Open;
298   while FDQuery1.Eof = false do
299   begin
300     list.Add(FDQuery1.FieldByName('magid').AsInteger);
301     FDQuery1.Next;
302   end;
303   for i in list do
304     titleView(i, Data);
305   list.Free;
306 end;
307
308 procedure TDataModule1.getView(id, num: integer; out Data: TJSONObject);
309 begin
310   with FDQuery1.SQL do
311   begin
312     Clear;
313     Add('select updated,day,file from news');
314     Add(' where magId = :id and newsId = :num');
315     Add(' order by day;');
316   end;
317   with FDQuery1.Params do
318   begin
319     ParamByName('id').AsInteger := id;
320     ParamByName('num').AsInteger := num;
321   end;
322   FDQuery1.Open;
323   Data := makeTable(FDQuery1);
324 end;
325
326 procedure TDataModule1.getView(id: integer; out Data: TJSONObject);
327 begin
328   with FDQuery1.SQL do
329   begin
330     Clear;
331     Add('select updated,day,file from indexTable,news');
332     Add(' where readerId = :id and indexTable.magId = news.magId');
333     Add(' and enabled = true order by day;');
334   end;
335   FDQuery1.Params.ParamByName('id').AsInteger := id;
336   FDQuery1.Open;
337   Data := makeTable(FDQuery1);
338 end;
339
340 procedure TDataModule1.magData(id: integer; out Data: TJSONObject);
341 begin
342   FDQuery1.SQL.Clear;
343   FDQuery1.SQL.Add('select * from mag where magid = :id;');
344   FDQuery1.ParamByName('id').AsInteger := id;
345   FDQuery1.Open;
346   if FDQuery1.FieldByName('enable').AsBoolean = true then
347   begin
348     Data := TJSONObject.Create;
349     Data.AddPair('name', FDQuery1.FieldByName('magName').AsString);
350     Data.AddPair('comment', FDQuery1.FieldByName('comment').AsString);
351     Data.AddPair('day', FDQuery1.FieldByName('day').AsString);
352     Data.AddPair('last', FDQuery1.FieldByName('lastDay').AsString);
353     FDQuery1.SQL.Clear;
354     FDQuery1.SQL.Add('select COUNT(*) as count from indextable where magid = :id;');
355     FDQuery1.ParamByName('id').AsInteger:=id;
356     FDQuery1.Open;
357     Data.AddPair('count', FDQuery1.FieldByName('count').AsString);
358   end;
359 end;
360
361 function TDataModule1.magid(name: string): integer;
362 begin
363   result := mag.Lookup('magname', name, 'magid');
364 end;
365
366 procedure TDataModule1.magIdOff(id, magid: integer);
367 begin
368   if indexTable.Locate('readerId;magId', VarArrayOf([id, magid])) = true then
369     indexTable.Delete;
370 end;
371
372 procedure TDataModule1.magIdOn(id, magid: integer);
373 begin
374   if (writer.Locate('readerid', id) = true) and
375     (mag.Locate('magid', magid) = true) then
376     indexTable.AppendRecord([id, magid]);
377 end;
378
379 procedure TDataModule1.magListAll(out Data: TJSONObject);
380 var
381   js: TJSONObject;
382   ar: TJSONArray;
383   val: TJSONValue;
384   i: integer;
385   v: Variant;
386 begin
387   mag.First;
388   ar := TJSONArray.Create;
389   FDQuery1.Open('select magId,COUNT(*) as count from indexTable group by magId');
390   while mag.Eof = false do
391   begin
392     i:=mag.FieldByName('magId').AsInteger;
393     v:=FDQuery1.Lookup('magId',i,'count');
394     if VarIsNull(v) = true then
395       v:=0;
396     js := TJSONObject.Create;
397     js.AddPair('magName', mag.FieldByName('magName').AsString);
398     js.AddPair('comment', mag.FieldByName('comment').AsString);
399     js.AddPair('day', mag.FieldByName('day').AsString);
400     js.AddPair('lastDay', mag.FieldByName('lastDay').AsString);
401     js.AddPair('count',v);
402     ar.Add(js);
403     mag.Next;
404   end;
405   Data := TJSONObject.Create;
406   if ar.Count > 0 then
407     Data.AddPair('items', ar)
408   else
409     Data.AddPair('items', TJSONFalse.Create);
410   if mag.FieldByName('enable').AsBoolean = true then
411     val := TJSONTrue.Create
412   else
413     val := TJSONFalse.Create;
414   Data.AddPair('enable', val);
415 end;
416
417 procedure TDataModule1.magazines(id: integer; out Data: TJSONObject);
418 var
419   d: TJSONObject;
420   val: TJSONValue;
421   ar: TJSONArray;
422   list: TList<integer>;
423   i: integer;
424 begin
425   d:=data;
426   FDQuery1.SQL.Clear;
427   FDQuery1.SQL.Add('select * from maglist where writerid = :id;');
428   FDQuery1.Params.ParamByName('id').AsInteger := id;
429   FDQuery1.Open;
430   ar := TJSONArray.Create;
431   list:=TList<integer>.Create;
432   while FDQuery1.Eof = false do
433   begin
434     list.Add(FDQuery1.FieldByName('magId').AsInteger);
435     FDQuery1.Next;
436   end;
437   for i in list do
438   begin
439     magData(i,d);
440     ar.Add(d);
441   end;
442   list.Free;
443   if ar.Count = 0 then
444   begin
445     ar.Free;
446     val := TJSONFalse.Create;
447   end
448   else
449     val := ar;
450   Data := TJSONObject.Create;
451   Data.AddPair('mag', val);
452 end;
453
454 function TDataModule1.makeTable(Sender: TObject): TJSONObject;
455 var
456   blob: TStream;
457   mem: TStringList;
458 begin
459   result := TJSONObject.Create;
460   mem := TStringList.Create;
461   with Sender as TFDQuery do
462   begin
463     First;
464     while Eof = false do
465     begin
466       if FieldByName('updated').AsBoolean = true then
467         result.AddPair('hint', Format('\82±\82Ì\8bL\8e\96\82Í\8dX\90V\82³\82ê\82Ü\82µ\82½:(%s)\93ú.',
468           [FieldByName('day').AsString]));
469       blob := CreateBlobStream(FieldByName('file'), bmRead);
470       mem.LoadFromStream(blob);
471       blob.Free;
472       result.AddPair('text', mem.Text);
473       Next;
474     end;
475   end;
476   mem.Free;
477 end;
478
479 procedure TDataModule1.postMessage(id: integer; Data: TJSONObject);
480 var
481   i: integer;
482 begin
483   FDQuery1.SQL.Clear;
484   FDQuery1.SQL.Add('select MAX(newsId) as id from news where magId = :id;');
485   FDQuery1.Params.ParamByName('id').AsInteger := id;
486   FDQuery1.Open;
487   if FDQuery1.RecordCount > 0 then
488   begin
489     i := FDQuery1.FieldByName('id').AsInteger + 1;
490     news.AppendRecord([id, i, false, Date, Data.Values['file'], true]);
491   end;
492 end;
493
494 procedure TDataModule1.createWriterId(Data: TJSONObject);
495 var
496   i: integer;
497   na, ma, pa: string;
498 begin
499   ma := Data.Values['mail'].Value;
500   if writer.Locate('mail', ma) = false then
501   begin
502     FDQuery1.Open('select MAX(writerId) as id from writer;');
503     i := FDQuery1.FieldByName('id').AsInteger + 1;
504     na := Data.Values['name'].Value;
505     ma := Data.Values['mail'].Value;
506     pa := Data.Values['password'].Value;
507     writer.AppendRecord([i, na, ma, pa]);
508   end;
509 end;
510
511 procedure TDataModule1.titleView(id: integer; Data: TJSONObject);
512 var
513   d: TJSONObject;
514   i: integer;
515 begin
516   d := Data;
517   FDQuery1.SQL.Clear;
518   FDQuery1.SQL.Add('select * from mag where magid = :id;');
519   FDQuery1.Params.ParamByName('id').AsInteger := id;
520   FDQuery1.Open;
521   with FDQuery1 do
522     while Eof = false do
523     begin
524       for i := 0 to Fields.Count - 1 do
525         d.AddPair(Fields[i].FieldName, Fields[i].AsString);
526       Next;
527     end;
528 end;
529
530 procedure TDataModule1.updateReaderId(Data: TJSONObject);
531 var
532   na, ma, pa: string;
533 begin
534   na:=Data.Values['reader'].Value;
535   ma:=Data.Values['mail'].Value;
536   pa:=data.Values['password'].Value;
537   with reader do
538   begin
539     Edit;
540     FieldByName('reader').AsString:=na;
541     FieldByName('mail').AsString:=ma;
542     FieldByName('password').AsString:=pa;
543     Post;
544   end;
545 end;
546
547 procedure TDataModule1.updateWriterId(id: integer; Data: TJSONObject);
548 var
549   na, ma, pa: string;
550 begin
551   na := Data.Values['name'].Value;
552   ma := Data.Values['mail'].Value;
553   pa := Data.Values['password'].Value;
554   with writer do
555   begin
556     Edit;
557     FieldByName('writerId').AsInteger := id;
558     FieldByName('writer').AsString := na;
559     FieldByName('mail').AsString := ma;
560     FieldByName('password').AsString := pa;
561     Post;
562   end;
563 end;
564
565 end.